[{"data":1,"prerenderedAt":3434},["ShallowReactive",2],{"/blog/steganography-bee-movie":3},{"id":4,"title":5,"body":6,"canonical_url":3417,"categories":3418,"cover_image":3417,"date":3420,"description":12,"draft":3421,"extension":3422,"external_site":3417,"external_url":3417,"img":3417,"meta":3423,"navigation":122,"path":3428,"seo":3429,"stem":3430,"tags":3431,"__hash__":3433},"content/blog/steganography-bee-movie.md","The entire Bee Movie script is hidden somewhere on this website",{"type":7,"value":8,"toc":3411},"minimark",[9,13,16,23,42,45,50,57,60,68,72,75,104,1410,1424,1428,1431,1449,3112,3116,3119,3140,3147,3384,3391,3407],[10,11,12],"p",{},"You probably didn't realize it, but the static noise visible on the home page of this website is not just noise. It's actually the entire script of the bee movie encoded with a technique called steganography.",[10,14,15],{},"The image is a lossless PNG with the RGB pixels encoding the bytes of a small payload:",[10,17,18],{},[19,20],"img",{"alt":21,"src":22},"Noise image containing the encoded Bee Movie script","/images/noise.png",[24,25,26,30,33,36,39],"ul",{},[27,28,29],"li",{},"a magic header",[27,31,32],{},"the original text size",[27,34,35],{},"the compressed text size",[27,37,38],{},"the zlib-compressed script",[27,40,41],{},"padding to fill a square image",[10,43,44],{},"Additionally, before writing the bytes to pixels, the payload is XORed against a deterministic SHA-256 byte stream to ensure we have an evenly distributed pattern of noise.",[46,47,49],"h2",{"id":48},"steganography","Steganography",[10,51,52,53,56],{},"The term for this kind of idea is ",[54,55,48],"strong",{},", and is defined as the practice of hiding information inside another medium so that the carrier looks ordinary. In other words, cryptography tries to make a message unreadable, while steganography tries to make the message easy to miss.",[10,58,59],{},"Classic examples include hiding text in the least significant bits of an image, placing data in audio noise, or using metadata fields.",[10,61,62,63,67],{},"This version is especially uninteresting as the entire image is generated from the payload, but you could imagine the Bee Movie being hidden in other images with very little detection. Now ",[64,65,66],"em",{},"that's"," interesting.",[46,69,71],{"id":70},"encoder","Encoder",[10,73,74],{},"Here's the encoder:",[76,77,82],"pre",{"className":78,"code":79,"language":80,"meta":81,"style":81},"language-shell shiki shiki-themes github-dark","python3 encode.py script.txt noise.png\n","shell","",[83,84,85],"code",{"__ignoreMap":81},[86,87,90,94,98,101],"span",{"class":88,"line":89},"line",1,[86,91,93],{"class":92},"svObZ","python3",[86,95,97],{"class":96},"sU2Wk"," encode.py",[86,99,100],{"class":96}," script.txt",[86,102,103],{"class":96}," noise.png\n",[76,105,109],{"className":106,"code":107,"language":108,"meta":81,"style":81},"language-python shiki shiki-themes github-dark","# encode.py\n\nimport argparse\nimport binascii\nimport hashlib\nimport math\nimport struct\nimport zlib\nfrom pathlib import Path\n\n\nMAGIC = b\"TXTIMG1\\0\"\nPNG_SIGNATURE = b\"\\x89PNG\\r\\n\\x1a\\n\"\nXOR_SEED = b\"txtimg1-static-noise-v1\"\n\n\ndef xor_stream(data: bytes) -> bytes:\n    masked = bytearray(len(data))\n    cursor = 0\n    counter = 0\n\n    while cursor \u003C len(data):\n        block = hashlib.sha256(XOR_SEED + struct.pack(\">Q\", counter)).digest()\n        take = min(len(block), len(data) - cursor)\n        for index in range(take):\n            masked[cursor + index] = data[cursor + index] ^ block[index]\n        cursor += take\n        counter += 1\n\n    return bytes(masked)\n\n\ndef png_chunk(chunk_type: bytes, data: bytes) -> bytes:\n    crc = binascii.crc32(chunk_type)\n    crc = binascii.crc32(data, crc) & 0xFFFFFFFF\n    return struct.pack(\">I\", len(data)) + chunk_type + data + struct.pack(\">I\", crc)\n\n\ndef write_rgb_png(path: Path, width: int, height: int, rgb: bytes) -> None:\n    row_size = width * 3\n    rows = [\n        b\"\\x00\" + rgb[row_start : row_start + row_size]\n        for row_start in range(0, len(rgb), row_size)\n    ]\n    ihdr = struct.pack(\">IIBBBBB\", width, height, 8, 2, 0, 0, 0)\n    png = (\n        PNG_SIGNATURE\n        + png_chunk(b\"IHDR\", ihdr)\n        + png_chunk(b\"IDAT\", zlib.compress(b\"\".join(rows), level=9))\n        + png_chunk(b\"IEND\", b\"\")\n    )\n    path.write_bytes(png)\n\n\ndef next_power_of_two(value: int) -> int:\n    return 1 \u003C\u003C (value - 1).bit_length()\n\n\ndef encode_text_to_png(input_txt: Path, output_png: Path) -> None:\n    raw = input_txt.read_bytes()\n    compressed = zlib.compress(raw, level=9)\n\n    payload = MAGIC + struct.pack(\">QQ\", len(raw), len(compressed)) + compressed\n    pixel_count = math.ceil(len(payload) / 3)\n    side = next_power_of_two(math.ceil(math.sqrt(pixel_count)))\n    capacity = side * side * 3\n    padded = payload + bytes(capacity - len(payload))\n    static = xor_stream(padded)\n\n    output_png.parent.mkdir(parents=True, exist_ok=True)\n    write_rgb_png(output_png, side, side, static)\n\n    print(f\"Original:   {len(raw):,} bytes\")\n    print(f\"Compressed: {len(compressed):,} bytes\")\n    print(f\"PNG size:   {output_png.stat().st_size:,} bytes\")\n    print(f\"Image:      {side}x{side}\")\n\n\ndef main() -> None:\n    parser = argparse.ArgumentParser(\n        description=\"Encode a text file into a lossless static PNG image.\"\n    )\n    parser.add_argument(\"input_txt\", type=Path, help=\"Path to the source text file.\")\n    parser.add_argument(\"output_png\", type=Path, help=\"Path for the generated PNG.\")\n    args = parser.parse_args()\n\n    encode_text_to_png(args.input_txt, args.output_png)\n\n\nif __name__ == \"__main__\":\n    main()\n","python",[83,110,111,117,124,135,143,151,159,167,175,189,194,199,221,245,258,263,268,291,312,323,333,338,356,381,410,428,455,467,478,483,495,500,505,529,540,559,596,601,606,637,654,665,688,712,718,757,768,774,792,827,847,853,859,864,869,888,909,914,919,934,945,964,969,1004,1028,1039,1058,1083,1094,1099,1124,1130,1135,1166,1191,1217,1249,1254,1259,1274,1285,1296,1301,1330,1355,1366,1371,1377,1382,1387,1404],{"__ignoreMap":81},[86,112,113],{"class":88,"line":89},[86,114,116],{"class":115},"sAwPA","# encode.py\n",[86,118,120],{"class":88,"line":119},2,[86,121,123],{"emptyLinePlaceholder":122},true,"\n",[86,125,127,131],{"class":88,"line":126},3,[86,128,130],{"class":129},"snl16","import",[86,132,134],{"class":133},"s95oV"," argparse\n",[86,136,138,140],{"class":88,"line":137},4,[86,139,130],{"class":129},[86,141,142],{"class":133}," binascii\n",[86,144,146,148],{"class":88,"line":145},5,[86,147,130],{"class":129},[86,149,150],{"class":133}," hashlib\n",[86,152,154,156],{"class":88,"line":153},6,[86,155,130],{"class":129},[86,157,158],{"class":133}," math\n",[86,160,162,164],{"class":88,"line":161},7,[86,163,130],{"class":129},[86,165,166],{"class":133}," struct\n",[86,168,170,172],{"class":88,"line":169},8,[86,171,130],{"class":129},[86,173,174],{"class":133}," zlib\n",[86,176,178,181,184,186],{"class":88,"line":177},9,[86,179,180],{"class":129},"from",[86,182,183],{"class":133}," pathlib ",[86,185,130],{"class":129},[86,187,188],{"class":133}," Path\n",[86,190,192],{"class":88,"line":191},10,[86,193,123],{"emptyLinePlaceholder":122},[86,195,197],{"class":88,"line":196},11,[86,198,123],{"emptyLinePlaceholder":122},[86,200,202,206,209,212,215,218],{"class":88,"line":201},12,[86,203,205],{"class":204},"sDLfK","MAGIC",[86,207,208],{"class":129}," =",[86,210,211],{"class":129}," b",[86,213,214],{"class":96},"\"TXTIMG1",[86,216,217],{"class":204},"\\0",[86,219,220],{"class":96},"\"\n",[86,222,224,227,229,231,234,237,240,243],{"class":88,"line":223},13,[86,225,226],{"class":204},"PNG_SIGNATURE",[86,228,208],{"class":129},[86,230,211],{"class":129},[86,232,233],{"class":96},"\"",[86,235,236],{"class":204},"\\x89",[86,238,239],{"class":96},"PNG",[86,241,242],{"class":204},"\\r\\n\\x1a\\n",[86,244,220],{"class":96},[86,246,248,251,253,255],{"class":88,"line":247},14,[86,249,250],{"class":204},"XOR_SEED",[86,252,208],{"class":129},[86,254,211],{"class":129},[86,256,257],{"class":96},"\"txtimg1-static-noise-v1\"\n",[86,259,261],{"class":88,"line":260},15,[86,262,123],{"emptyLinePlaceholder":122},[86,264,266],{"class":88,"line":265},16,[86,267,123],{"emptyLinePlaceholder":122},[86,269,271,274,277,280,283,286,288],{"class":88,"line":270},17,[86,272,273],{"class":129},"def",[86,275,276],{"class":92}," xor_stream",[86,278,279],{"class":133},"(data: ",[86,281,282],{"class":204},"bytes",[86,284,285],{"class":133},") -> ",[86,287,282],{"class":204},[86,289,290],{"class":133},":\n",[86,292,294,297,300,303,306,309],{"class":88,"line":293},18,[86,295,296],{"class":133},"    masked ",[86,298,299],{"class":129},"=",[86,301,302],{"class":204}," bytearray",[86,304,305],{"class":133},"(",[86,307,308],{"class":204},"len",[86,310,311],{"class":133},"(data))\n",[86,313,315,318,320],{"class":88,"line":314},19,[86,316,317],{"class":133},"    cursor ",[86,319,299],{"class":129},[86,321,322],{"class":204}," 0\n",[86,324,326,329,331],{"class":88,"line":325},20,[86,327,328],{"class":133},"    counter ",[86,330,299],{"class":129},[86,332,322],{"class":204},[86,334,336],{"class":88,"line":335},21,[86,337,123],{"emptyLinePlaceholder":122},[86,339,341,344,347,350,353],{"class":88,"line":340},22,[86,342,343],{"class":129},"    while",[86,345,346],{"class":133}," cursor ",[86,348,349],{"class":129},"\u003C",[86,351,352],{"class":204}," len",[86,354,355],{"class":133},"(data):\n",[86,357,359,362,364,367,369,372,375,378],{"class":88,"line":358},23,[86,360,361],{"class":133},"        block ",[86,363,299],{"class":129},[86,365,366],{"class":133}," hashlib.sha256(",[86,368,250],{"class":204},[86,370,371],{"class":129}," +",[86,373,374],{"class":133}," struct.pack(",[86,376,377],{"class":96},"\">Q\"",[86,379,380],{"class":133},", counter)).digest()\n",[86,382,384,387,389,392,394,396,399,401,404,407],{"class":88,"line":383},24,[86,385,386],{"class":133},"        take ",[86,388,299],{"class":129},[86,390,391],{"class":204}," min",[86,393,305],{"class":133},[86,395,308],{"class":204},[86,397,398],{"class":133},"(block), ",[86,400,308],{"class":204},[86,402,403],{"class":133},"(data) ",[86,405,406],{"class":129},"-",[86,408,409],{"class":133}," cursor)\n",[86,411,413,416,419,422,425],{"class":88,"line":412},25,[86,414,415],{"class":129},"        for",[86,417,418],{"class":133}," index ",[86,420,421],{"class":129},"in",[86,423,424],{"class":204}," range",[86,426,427],{"class":133},"(take):\n",[86,429,431,434,437,440,442,445,447,449,452],{"class":88,"line":430},26,[86,432,433],{"class":133},"            masked[cursor ",[86,435,436],{"class":129},"+",[86,438,439],{"class":133}," index] ",[86,441,299],{"class":129},[86,443,444],{"class":133}," data[cursor ",[86,446,436],{"class":129},[86,448,439],{"class":133},[86,450,451],{"class":129},"^",[86,453,454],{"class":133}," block[index]\n",[86,456,458,461,464],{"class":88,"line":457},27,[86,459,460],{"class":133},"        cursor ",[86,462,463],{"class":129},"+=",[86,465,466],{"class":133}," take\n",[86,468,470,473,475],{"class":88,"line":469},28,[86,471,472],{"class":133},"        counter ",[86,474,463],{"class":129},[86,476,477],{"class":204}," 1\n",[86,479,481],{"class":88,"line":480},29,[86,482,123],{"emptyLinePlaceholder":122},[86,484,486,489,492],{"class":88,"line":485},30,[86,487,488],{"class":129},"    return",[86,490,491],{"class":204}," bytes",[86,493,494],{"class":133},"(masked)\n",[86,496,498],{"class":88,"line":497},31,[86,499,123],{"emptyLinePlaceholder":122},[86,501,503],{"class":88,"line":502},32,[86,504,123],{"emptyLinePlaceholder":122},[86,506,508,510,513,516,518,521,523,525,527],{"class":88,"line":507},33,[86,509,273],{"class":129},[86,511,512],{"class":92}," png_chunk",[86,514,515],{"class":133},"(chunk_type: ",[86,517,282],{"class":204},[86,519,520],{"class":133},", data: ",[86,522,282],{"class":204},[86,524,285],{"class":133},[86,526,282],{"class":204},[86,528,290],{"class":133},[86,530,532,535,537],{"class":88,"line":531},34,[86,533,534],{"class":133},"    crc ",[86,536,299],{"class":129},[86,538,539],{"class":133}," binascii.crc32(chunk_type)\n",[86,541,543,545,547,550,553,556],{"class":88,"line":542},35,[86,544,534],{"class":133},[86,546,299],{"class":129},[86,548,549],{"class":133}," binascii.crc32(data, crc) ",[86,551,552],{"class":129},"&",[86,554,555],{"class":129}," 0x",[86,557,558],{"class":204},"FFFFFFFF\n",[86,560,562,564,566,569,572,574,577,579,582,584,587,589,591,593],{"class":88,"line":561},36,[86,563,488],{"class":129},[86,565,374],{"class":133},[86,567,568],{"class":96},"\">I\"",[86,570,571],{"class":133},", ",[86,573,308],{"class":204},[86,575,576],{"class":133},"(data)) ",[86,578,436],{"class":129},[86,580,581],{"class":133}," chunk_type ",[86,583,436],{"class":129},[86,585,586],{"class":133}," data ",[86,588,436],{"class":129},[86,590,374],{"class":133},[86,592,568],{"class":96},[86,594,595],{"class":133},", crc)\n",[86,597,599],{"class":88,"line":598},37,[86,600,123],{"emptyLinePlaceholder":122},[86,602,604],{"class":88,"line":603},38,[86,605,123],{"emptyLinePlaceholder":122},[86,607,609,611,614,617,620,623,625,628,630,632,635],{"class":88,"line":608},39,[86,610,273],{"class":129},[86,612,613],{"class":92}," write_rgb_png",[86,615,616],{"class":133},"(path: Path, width: ",[86,618,619],{"class":204},"int",[86,621,622],{"class":133},", height: ",[86,624,619],{"class":204},[86,626,627],{"class":133},", rgb: ",[86,629,282],{"class":204},[86,631,285],{"class":133},[86,633,634],{"class":204},"None",[86,636,290],{"class":133},[86,638,640,643,645,648,651],{"class":88,"line":639},40,[86,641,642],{"class":133},"    row_size ",[86,644,299],{"class":129},[86,646,647],{"class":133}," width ",[86,649,650],{"class":129},"*",[86,652,653],{"class":204}," 3\n",[86,655,657,660,662],{"class":88,"line":656},41,[86,658,659],{"class":133},"    rows ",[86,661,299],{"class":129},[86,663,664],{"class":133}," [\n",[86,666,668,671,673,676,678,680,683,685],{"class":88,"line":667},42,[86,669,670],{"class":129},"        b",[86,672,233],{"class":96},[86,674,675],{"class":204},"\\x00",[86,677,233],{"class":96},[86,679,371],{"class":129},[86,681,682],{"class":133}," rgb[row_start : row_start ",[86,684,436],{"class":129},[86,686,687],{"class":133}," row_size]\n",[86,689,691,693,696,698,700,702,705,707,709],{"class":88,"line":690},43,[86,692,415],{"class":129},[86,694,695],{"class":133}," row_start ",[86,697,421],{"class":129},[86,699,424],{"class":204},[86,701,305],{"class":133},[86,703,704],{"class":204},"0",[86,706,571],{"class":133},[86,708,308],{"class":204},[86,710,711],{"class":133},"(rgb), row_size)\n",[86,713,715],{"class":88,"line":714},44,[86,716,717],{"class":133},"    ]\n",[86,719,721,724,726,728,731,734,737,739,742,744,746,748,750,752,754],{"class":88,"line":720},45,[86,722,723],{"class":133},"    ihdr ",[86,725,299],{"class":129},[86,727,374],{"class":133},[86,729,730],{"class":96},"\">IIBBBBB\"",[86,732,733],{"class":133},", width, height, ",[86,735,736],{"class":204},"8",[86,738,571],{"class":133},[86,740,741],{"class":204},"2",[86,743,571],{"class":133},[86,745,704],{"class":204},[86,747,571],{"class":133},[86,749,704],{"class":204},[86,751,571],{"class":133},[86,753,704],{"class":204},[86,755,756],{"class":133},")\n",[86,758,760,763,765],{"class":88,"line":759},46,[86,761,762],{"class":133},"    png ",[86,764,299],{"class":129},[86,766,767],{"class":133}," (\n",[86,769,771],{"class":88,"line":770},47,[86,772,773],{"class":204},"        PNG_SIGNATURE\n",[86,775,777,780,783,786,789],{"class":88,"line":776},48,[86,778,779],{"class":129},"        +",[86,781,782],{"class":133}," png_chunk(",[86,784,785],{"class":129},"b",[86,787,788],{"class":96},"\"IHDR\"",[86,790,791],{"class":133},", ihdr)\n",[86,793,795,797,799,801,804,807,809,812,815,819,821,824],{"class":88,"line":794},49,[86,796,779],{"class":129},[86,798,782],{"class":133},[86,800,785],{"class":129},[86,802,803],{"class":96},"\"IDAT\"",[86,805,806],{"class":133},", zlib.compress(",[86,808,785],{"class":129},[86,810,811],{"class":96},"\"\"",[86,813,814],{"class":133},".join(rows), ",[86,816,818],{"class":817},"s9osk","level",[86,820,299],{"class":129},[86,822,823],{"class":204},"9",[86,825,826],{"class":133},"))\n",[86,828,830,832,834,836,839,841,843,845],{"class":88,"line":829},50,[86,831,779],{"class":129},[86,833,782],{"class":133},[86,835,785],{"class":129},[86,837,838],{"class":96},"\"IEND\"",[86,840,571],{"class":133},[86,842,785],{"class":129},[86,844,811],{"class":96},[86,846,756],{"class":133},[86,848,850],{"class":88,"line":849},51,[86,851,852],{"class":133},"    )\n",[86,854,856],{"class":88,"line":855},52,[86,857,858],{"class":133},"    path.write_bytes(png)\n",[86,860,862],{"class":88,"line":861},53,[86,863,123],{"emptyLinePlaceholder":122},[86,865,867],{"class":88,"line":866},54,[86,868,123],{"emptyLinePlaceholder":122},[86,870,872,874,877,880,882,884,886],{"class":88,"line":871},55,[86,873,273],{"class":129},[86,875,876],{"class":92}," next_power_of_two",[86,878,879],{"class":133},"(value: ",[86,881,619],{"class":204},[86,883,285],{"class":133},[86,885,619],{"class":204},[86,887,290],{"class":133},[86,889,891,893,896,899,902,904,906],{"class":88,"line":890},56,[86,892,488],{"class":129},[86,894,895],{"class":204}," 1",[86,897,898],{"class":129}," \u003C\u003C",[86,900,901],{"class":133}," (value ",[86,903,406],{"class":129},[86,905,895],{"class":204},[86,907,908],{"class":133},").bit_length()\n",[86,910,912],{"class":88,"line":911},57,[86,913,123],{"emptyLinePlaceholder":122},[86,915,917],{"class":88,"line":916},58,[86,918,123],{"emptyLinePlaceholder":122},[86,920,922,924,927,930,932],{"class":88,"line":921},59,[86,923,273],{"class":129},[86,925,926],{"class":92}," encode_text_to_png",[86,928,929],{"class":133},"(input_txt: Path, output_png: Path) -> ",[86,931,634],{"class":204},[86,933,290],{"class":133},[86,935,937,940,942],{"class":88,"line":936},60,[86,938,939],{"class":133},"    raw ",[86,941,299],{"class":129},[86,943,944],{"class":133}," input_txt.read_bytes()\n",[86,946,948,951,953,956,958,960,962],{"class":88,"line":947},61,[86,949,950],{"class":133},"    compressed ",[86,952,299],{"class":129},[86,954,955],{"class":133}," zlib.compress(raw, ",[86,957,818],{"class":817},[86,959,299],{"class":129},[86,961,823],{"class":204},[86,963,756],{"class":133},[86,965,967],{"class":88,"line":966},62,[86,968,123],{"emptyLinePlaceholder":122},[86,970,972,975,977,980,982,984,987,989,991,994,996,999,1001],{"class":88,"line":971},63,[86,973,974],{"class":133},"    payload ",[86,976,299],{"class":129},[86,978,979],{"class":204}," MAGIC",[86,981,371],{"class":129},[86,983,374],{"class":133},[86,985,986],{"class":96},"\">QQ\"",[86,988,571],{"class":133},[86,990,308],{"class":204},[86,992,993],{"class":133},"(raw), ",[86,995,308],{"class":204},[86,997,998],{"class":133},"(compressed)) ",[86,1000,436],{"class":129},[86,1002,1003],{"class":133}," compressed\n",[86,1005,1007,1010,1012,1015,1017,1020,1023,1026],{"class":88,"line":1006},64,[86,1008,1009],{"class":133},"    pixel_count ",[86,1011,299],{"class":129},[86,1013,1014],{"class":133}," math.ceil(",[86,1016,308],{"class":204},[86,1018,1019],{"class":133},"(payload) ",[86,1021,1022],{"class":129},"/",[86,1024,1025],{"class":204}," 3",[86,1027,756],{"class":133},[86,1029,1031,1034,1036],{"class":88,"line":1030},65,[86,1032,1033],{"class":133},"    side ",[86,1035,299],{"class":129},[86,1037,1038],{"class":133}," next_power_of_two(math.ceil(math.sqrt(pixel_count)))\n",[86,1040,1042,1045,1047,1050,1052,1054,1056],{"class":88,"line":1041},66,[86,1043,1044],{"class":133},"    capacity ",[86,1046,299],{"class":129},[86,1048,1049],{"class":133}," side ",[86,1051,650],{"class":129},[86,1053,1049],{"class":133},[86,1055,650],{"class":129},[86,1057,653],{"class":204},[86,1059,1061,1064,1066,1069,1071,1073,1076,1078,1080],{"class":88,"line":1060},67,[86,1062,1063],{"class":133},"    padded ",[86,1065,299],{"class":129},[86,1067,1068],{"class":133}," payload ",[86,1070,436],{"class":129},[86,1072,491],{"class":204},[86,1074,1075],{"class":133},"(capacity ",[86,1077,406],{"class":129},[86,1079,352],{"class":204},[86,1081,1082],{"class":133},"(payload))\n",[86,1084,1086,1089,1091],{"class":88,"line":1085},68,[86,1087,1088],{"class":133},"    static ",[86,1090,299],{"class":129},[86,1092,1093],{"class":133}," xor_stream(padded)\n",[86,1095,1097],{"class":88,"line":1096},69,[86,1098,123],{"emptyLinePlaceholder":122},[86,1100,1102,1105,1108,1110,1113,1115,1118,1120,1122],{"class":88,"line":1101},70,[86,1103,1104],{"class":133},"    output_png.parent.mkdir(",[86,1106,1107],{"class":817},"parents",[86,1109,299],{"class":129},[86,1111,1112],{"class":204},"True",[86,1114,571],{"class":133},[86,1116,1117],{"class":817},"exist_ok",[86,1119,299],{"class":129},[86,1121,1112],{"class":204},[86,1123,756],{"class":133},[86,1125,1127],{"class":88,"line":1126},71,[86,1128,1129],{"class":133},"    write_rgb_png(output_png, side, side, static)\n",[86,1131,1133],{"class":88,"line":1132},72,[86,1134,123],{"emptyLinePlaceholder":122},[86,1136,1138,1141,1143,1146,1149,1152,1155,1158,1161,1164],{"class":88,"line":1137},73,[86,1139,1140],{"class":204},"    print",[86,1142,305],{"class":133},[86,1144,1145],{"class":129},"f",[86,1147,1148],{"class":96},"\"Original:   ",[86,1150,1151],{"class":204},"{len",[86,1153,1154],{"class":133},"(raw)",[86,1156,1157],{"class":129},":,",[86,1159,1160],{"class":204},"}",[86,1162,1163],{"class":96}," bytes\"",[86,1165,756],{"class":133},[86,1167,1169,1171,1173,1175,1178,1180,1183,1185,1187,1189],{"class":88,"line":1168},74,[86,1170,1140],{"class":204},[86,1172,305],{"class":133},[86,1174,1145],{"class":129},[86,1176,1177],{"class":96},"\"Compressed: ",[86,1179,1151],{"class":204},[86,1181,1182],{"class":133},"(compressed)",[86,1184,1157],{"class":129},[86,1186,1160],{"class":204},[86,1188,1163],{"class":96},[86,1190,756],{"class":133},[86,1192,1194,1196,1198,1200,1203,1206,1209,1211,1213,1215],{"class":88,"line":1193},75,[86,1195,1140],{"class":204},[86,1197,305],{"class":133},[86,1199,1145],{"class":129},[86,1201,1202],{"class":96},"\"PNG size:   ",[86,1204,1205],{"class":204},"{",[86,1207,1208],{"class":133},"output_png.stat().st_size",[86,1210,1157],{"class":129},[86,1212,1160],{"class":204},[86,1214,1163],{"class":96},[86,1216,756],{"class":133},[86,1218,1220,1222,1224,1226,1229,1231,1234,1236,1239,1241,1243,1245,1247],{"class":88,"line":1219},76,[86,1221,1140],{"class":204},[86,1223,305],{"class":133},[86,1225,1145],{"class":129},[86,1227,1228],{"class":96},"\"Image:      ",[86,1230,1205],{"class":204},[86,1232,1233],{"class":133},"side",[86,1235,1160],{"class":204},[86,1237,1238],{"class":96},"x",[86,1240,1205],{"class":204},[86,1242,1233],{"class":133},[86,1244,1160],{"class":204},[86,1246,233],{"class":96},[86,1248,756],{"class":133},[86,1250,1252],{"class":88,"line":1251},77,[86,1253,123],{"emptyLinePlaceholder":122},[86,1255,1257],{"class":88,"line":1256},78,[86,1258,123],{"emptyLinePlaceholder":122},[86,1260,1262,1264,1267,1270,1272],{"class":88,"line":1261},79,[86,1263,273],{"class":129},[86,1265,1266],{"class":92}," main",[86,1268,1269],{"class":133},"() -> ",[86,1271,634],{"class":204},[86,1273,290],{"class":133},[86,1275,1277,1280,1282],{"class":88,"line":1276},80,[86,1278,1279],{"class":133},"    parser ",[86,1281,299],{"class":129},[86,1283,1284],{"class":133}," argparse.ArgumentParser(\n",[86,1286,1288,1291,1293],{"class":88,"line":1287},81,[86,1289,1290],{"class":817},"        description",[86,1292,299],{"class":129},[86,1294,1295],{"class":96},"\"Encode a text file into a lossless static PNG image.\"\n",[86,1297,1299],{"class":88,"line":1298},82,[86,1300,852],{"class":133},[86,1302,1304,1307,1310,1312,1315,1317,1320,1323,1325,1328],{"class":88,"line":1303},83,[86,1305,1306],{"class":133},"    parser.add_argument(",[86,1308,1309],{"class":96},"\"input_txt\"",[86,1311,571],{"class":133},[86,1313,1314],{"class":817},"type",[86,1316,299],{"class":129},[86,1318,1319],{"class":133},"Path, ",[86,1321,1322],{"class":817},"help",[86,1324,299],{"class":129},[86,1326,1327],{"class":96},"\"Path to the source text file.\"",[86,1329,756],{"class":133},[86,1331,1333,1335,1338,1340,1342,1344,1346,1348,1350,1353],{"class":88,"line":1332},84,[86,1334,1306],{"class":133},[86,1336,1337],{"class":96},"\"output_png\"",[86,1339,571],{"class":133},[86,1341,1314],{"class":817},[86,1343,299],{"class":129},[86,1345,1319],{"class":133},[86,1347,1322],{"class":817},[86,1349,299],{"class":129},[86,1351,1352],{"class":96},"\"Path for the generated PNG.\"",[86,1354,756],{"class":133},[86,1356,1358,1361,1363],{"class":88,"line":1357},85,[86,1359,1360],{"class":133},"    args ",[86,1362,299],{"class":129},[86,1364,1365],{"class":133}," parser.parse_args()\n",[86,1367,1369],{"class":88,"line":1368},86,[86,1370,123],{"emptyLinePlaceholder":122},[86,1372,1374],{"class":88,"line":1373},87,[86,1375,1376],{"class":133},"    encode_text_to_png(args.input_txt, args.output_png)\n",[86,1378,1380],{"class":88,"line":1379},88,[86,1381,123],{"emptyLinePlaceholder":122},[86,1383,1385],{"class":88,"line":1384},89,[86,1386,123],{"emptyLinePlaceholder":122},[86,1388,1390,1393,1396,1399,1402],{"class":88,"line":1389},90,[86,1391,1392],{"class":129},"if",[86,1394,1395],{"class":204}," __name__",[86,1397,1398],{"class":129}," ==",[86,1400,1401],{"class":96}," \"__main__\"",[86,1403,290],{"class":133},[86,1405,1407],{"class":88,"line":1406},91,[86,1408,1409],{"class":133},"    main()\n",[10,1411,1412,1413,571,1416,1419,1420,1423],{},"The script writes a minimal RGB PNG directly with the PNG signature, ",[83,1414,1415],{},"IHDR",[83,1417,1418],{},"IDAT",", and ",[83,1421,1422],{},"IEND"," chunks.",[46,1425,1427],{"id":1426},"decoder","Decoder",[10,1429,1430],{},"And here's the decoder:",[76,1432,1434],{"className":78,"code":1433,"language":80,"meta":81,"style":81},"python3 decode.py noise.png decoded.txt\n",[83,1435,1436],{"__ignoreMap":81},[86,1437,1438,1440,1443,1446],{"class":88,"line":89},[86,1439,93],{"class":92},[86,1441,1442],{"class":96}," decode.py",[86,1444,1445],{"class":96}," noise.png",[86,1447,1448],{"class":96}," decoded.txt\n",[76,1450,1452],{"className":106,"code":1451,"language":108,"meta":81,"style":81},"# decode.py\n\nimport argparse\nimport hashlib\nimport struct\nimport zlib\nfrom pathlib import Path\n\n\nMAGIC = b\"TXTIMG1\\0\"\nPNG_SIGNATURE = b\"\\x89PNG\\r\\n\\x1a\\n\"\nXOR_SEED = b\"txtimg1-static-noise-v1\"\n\n\ndef xor_stream(data: bytes) -> bytes:\n    masked = bytearray(len(data))\n    cursor = 0\n    counter = 0\n\n    while cursor \u003C len(data):\n        block = hashlib.sha256(XOR_SEED + struct.pack(\">Q\", counter)).digest()\n        take = min(len(block), len(data) - cursor)\n        for index in range(take):\n            masked[cursor + index] = data[cursor + index] ^ block[index]\n        cursor += take\n        counter += 1\n\n    return bytes(masked)\n\n\ndef paeth_predictor(left: int, above: int, upper_left: int) -> int:\n    predictor = left + above - upper_left\n    pa = abs(predictor - left)\n    pb = abs(predictor - above)\n    pc = abs(predictor - upper_left)\n    if pa \u003C= pb and pa \u003C= pc:\n        return left\n    if pb \u003C= pc:\n        return above\n    return upper_left\n\n\ndef read_rgb_png(path: Path) -> bytes:\n    blob = path.read_bytes()\n    if not blob.startswith(PNG_SIGNATURE):\n        raise ValueError(\"Not a PNG file.\")\n\n    offset = len(PNG_SIGNATURE)\n    width = height = bit_depth = color_type = interlace = None\n    idat_parts = []\n\n    while offset \u003C len(blob):\n        length = struct.unpack(\">I\", blob[offset : offset + 4])[0]\n        chunk_type = blob[offset + 4 : offset + 8]\n        data_start = offset + 8\n        data_end = data_start + length\n        chunk_data = blob[data_start:data_end]\n        offset = data_end + 4\n\n        if chunk_type == b\"IHDR\":\n            width, height, bit_depth, color_type, _, _, interlace = struct.unpack(\n                \">IIBBBBB\", chunk_data\n            )\n        elif chunk_type == b\"IDAT\":\n            idat_parts.append(chunk_data)\n        elif chunk_type == b\"IEND\":\n            break\n\n    if (bit_depth, color_type, interlace) != (8, 2, 0):\n        raise ValueError(\"Only non-interlaced 8-bit RGB PNG files are supported.\")\n\n    raw = zlib.decompress(b\"\".join(idat_parts))\n    bytes_per_pixel = 3\n    row_size = width * bytes_per_pixel\n    result = bytearray()\n    previous = bytearray(row_size)\n    cursor = 0\n\n    for _ in range(height):\n        filter_type = raw[cursor]\n        cursor += 1\n        row = bytearray(raw[cursor : cursor + row_size])\n        cursor += row_size\n\n        for index, value in enumerate(row):\n            left = row[index - bytes_per_pixel] if index >= bytes_per_pixel else 0\n            above = previous[index]\n            upper_left = previous[index - bytes_per_pixel] if index >= bytes_per_pixel else 0\n\n            if filter_type == 1:\n                row[index] = (value + left) & 0xFF\n            elif filter_type == 2:\n                row[index] = (value + above) & 0xFF\n            elif filter_type == 3:\n                row[index] = (value + ((left + above) // 2)) & 0xFF\n            elif filter_type == 4:\n                row[index] = (value + paeth_predictor(left, above, upper_left)) & 0xFF\n            elif filter_type != 0:\n                raise ValueError(f\"Unsupported PNG filter type: {filter_type}.\")\n\n        result.extend(row)\n        previous = row\n\n    return bytes(result)\n\n\ndef decode_png_to_text(input_png: Path, output_txt: Path) -> None:\n    data = xor_stream(read_rgb_png(input_png))\n\n    if data[:8] != MAGIC:\n        raise ValueError(\"Not a TXTIMG1 payload image.\")\n\n    original_size, compressed_size = struct.unpack(\">QQ\", data[8:24])\n    compressed = data[24 : 24 + compressed_size]\n    raw = zlib.decompress(compressed)\n\n    if len(raw) != original_size:\n        raise ValueError(\n            f\"Decoded size mismatch: expected {original_size}, got {len(raw)}.\"\n        )\n\n    output_txt.parent.mkdir(parents=True, exist_ok=True)\n    output_txt.write_bytes(raw)\n    print(f\"Decoded {len(raw):,} bytes to {output_txt}\")\n\n\ndef main() -> None:\n    parser = argparse.ArgumentParser(\n        description=\"Decode a TXTIMG1 PNG image back into a text file.\"\n    )\n    parser.add_argument(\"input_png\", type=Path, help=\"Path to the encoded PNG.\")\n    parser.add_argument(\"output_txt\", type=Path, help=\"Path for the decoded text file.\")\n    args = parser.parse_args()\n\n    decode_png_to_text(args.input_png, args.output_txt)\n\n\nif __name__ == \"__main__\":\n    main()\n",[83,1453,1454,1459,1463,1469,1475,1481,1487,1497,1501,1505,1519,1537,1547,1551,1555,1571,1585,1593,1601,1605,1617,1635,1657,1669,1689,1697,1705,1709,1717,1721,1725,1753,1773,1791,1807,1823,1847,1855,1865,1872,1878,1882,1886,1900,1910,1925,1940,1944,1959,1989,1999,2003,2017,2045,2069,2083,2098,2108,2123,2127,2143,2153,2161,2166,2181,2186,2200,2205,2209,2234,2247,2251,2267,2276,2289,2301,2313,2321,2325,2340,2350,2358,2375,2384,2388,2403,2433,2443,2469,2473,2487,2508,2523,2543,2556,2588,2601,2621,2635,2662,2667,2673,2684,2689,2699,2704,2709,2724,2735,2740,2759,2773,2778,2804,2826,2836,2841,2856,2866,2894,2900,2905,2927,2933,2967,2972,2977,2990,2999,3009,3014,3039,3064,3073,3078,3084,3089,3094,3107],{"__ignoreMap":81},[86,1455,1456],{"class":88,"line":89},[86,1457,1458],{"class":115},"# decode.py\n",[86,1460,1461],{"class":88,"line":119},[86,1462,123],{"emptyLinePlaceholder":122},[86,1464,1465,1467],{"class":88,"line":126},[86,1466,130],{"class":129},[86,1468,134],{"class":133},[86,1470,1471,1473],{"class":88,"line":137},[86,1472,130],{"class":129},[86,1474,150],{"class":133},[86,1476,1477,1479],{"class":88,"line":145},[86,1478,130],{"class":129},[86,1480,166],{"class":133},[86,1482,1483,1485],{"class":88,"line":153},[86,1484,130],{"class":129},[86,1486,174],{"class":133},[86,1488,1489,1491,1493,1495],{"class":88,"line":161},[86,1490,180],{"class":129},[86,1492,183],{"class":133},[86,1494,130],{"class":129},[86,1496,188],{"class":133},[86,1498,1499],{"class":88,"line":169},[86,1500,123],{"emptyLinePlaceholder":122},[86,1502,1503],{"class":88,"line":177},[86,1504,123],{"emptyLinePlaceholder":122},[86,1506,1507,1509,1511,1513,1515,1517],{"class":88,"line":191},[86,1508,205],{"class":204},[86,1510,208],{"class":129},[86,1512,211],{"class":129},[86,1514,214],{"class":96},[86,1516,217],{"class":204},[86,1518,220],{"class":96},[86,1520,1521,1523,1525,1527,1529,1531,1533,1535],{"class":88,"line":196},[86,1522,226],{"class":204},[86,1524,208],{"class":129},[86,1526,211],{"class":129},[86,1528,233],{"class":96},[86,1530,236],{"class":204},[86,1532,239],{"class":96},[86,1534,242],{"class":204},[86,1536,220],{"class":96},[86,1538,1539,1541,1543,1545],{"class":88,"line":201},[86,1540,250],{"class":204},[86,1542,208],{"class":129},[86,1544,211],{"class":129},[86,1546,257],{"class":96},[86,1548,1549],{"class":88,"line":223},[86,1550,123],{"emptyLinePlaceholder":122},[86,1552,1553],{"class":88,"line":247},[86,1554,123],{"emptyLinePlaceholder":122},[86,1556,1557,1559,1561,1563,1565,1567,1569],{"class":88,"line":260},[86,1558,273],{"class":129},[86,1560,276],{"class":92},[86,1562,279],{"class":133},[86,1564,282],{"class":204},[86,1566,285],{"class":133},[86,1568,282],{"class":204},[86,1570,290],{"class":133},[86,1572,1573,1575,1577,1579,1581,1583],{"class":88,"line":265},[86,1574,296],{"class":133},[86,1576,299],{"class":129},[86,1578,302],{"class":204},[86,1580,305],{"class":133},[86,1582,308],{"class":204},[86,1584,311],{"class":133},[86,1586,1587,1589,1591],{"class":88,"line":270},[86,1588,317],{"class":133},[86,1590,299],{"class":129},[86,1592,322],{"class":204},[86,1594,1595,1597,1599],{"class":88,"line":293},[86,1596,328],{"class":133},[86,1598,299],{"class":129},[86,1600,322],{"class":204},[86,1602,1603],{"class":88,"line":314},[86,1604,123],{"emptyLinePlaceholder":122},[86,1606,1607,1609,1611,1613,1615],{"class":88,"line":325},[86,1608,343],{"class":129},[86,1610,346],{"class":133},[86,1612,349],{"class":129},[86,1614,352],{"class":204},[86,1616,355],{"class":133},[86,1618,1619,1621,1623,1625,1627,1629,1631,1633],{"class":88,"line":335},[86,1620,361],{"class":133},[86,1622,299],{"class":129},[86,1624,366],{"class":133},[86,1626,250],{"class":204},[86,1628,371],{"class":129},[86,1630,374],{"class":133},[86,1632,377],{"class":96},[86,1634,380],{"class":133},[86,1636,1637,1639,1641,1643,1645,1647,1649,1651,1653,1655],{"class":88,"line":340},[86,1638,386],{"class":133},[86,1640,299],{"class":129},[86,1642,391],{"class":204},[86,1644,305],{"class":133},[86,1646,308],{"class":204},[86,1648,398],{"class":133},[86,1650,308],{"class":204},[86,1652,403],{"class":133},[86,1654,406],{"class":129},[86,1656,409],{"class":133},[86,1658,1659,1661,1663,1665,1667],{"class":88,"line":358},[86,1660,415],{"class":129},[86,1662,418],{"class":133},[86,1664,421],{"class":129},[86,1666,424],{"class":204},[86,1668,427],{"class":133},[86,1670,1671,1673,1675,1677,1679,1681,1683,1685,1687],{"class":88,"line":383},[86,1672,433],{"class":133},[86,1674,436],{"class":129},[86,1676,439],{"class":133},[86,1678,299],{"class":129},[86,1680,444],{"class":133},[86,1682,436],{"class":129},[86,1684,439],{"class":133},[86,1686,451],{"class":129},[86,1688,454],{"class":133},[86,1690,1691,1693,1695],{"class":88,"line":412},[86,1692,460],{"class":133},[86,1694,463],{"class":129},[86,1696,466],{"class":133},[86,1698,1699,1701,1703],{"class":88,"line":430},[86,1700,472],{"class":133},[86,1702,463],{"class":129},[86,1704,477],{"class":204},[86,1706,1707],{"class":88,"line":457},[86,1708,123],{"emptyLinePlaceholder":122},[86,1710,1711,1713,1715],{"class":88,"line":469},[86,1712,488],{"class":129},[86,1714,491],{"class":204},[86,1716,494],{"class":133},[86,1718,1719],{"class":88,"line":480},[86,1720,123],{"emptyLinePlaceholder":122},[86,1722,1723],{"class":88,"line":485},[86,1724,123],{"emptyLinePlaceholder":122},[86,1726,1727,1729,1732,1735,1737,1740,1742,1745,1747,1749,1751],{"class":88,"line":497},[86,1728,273],{"class":129},[86,1730,1731],{"class":92}," paeth_predictor",[86,1733,1734],{"class":133},"(left: ",[86,1736,619],{"class":204},[86,1738,1739],{"class":133},", above: ",[86,1741,619],{"class":204},[86,1743,1744],{"class":133},", upper_left: ",[86,1746,619],{"class":204},[86,1748,285],{"class":133},[86,1750,619],{"class":204},[86,1752,290],{"class":133},[86,1754,1755,1758,1760,1763,1765,1768,1770],{"class":88,"line":502},[86,1756,1757],{"class":133},"    predictor ",[86,1759,299],{"class":129},[86,1761,1762],{"class":133}," left ",[86,1764,436],{"class":129},[86,1766,1767],{"class":133}," above ",[86,1769,406],{"class":129},[86,1771,1772],{"class":133}," upper_left\n",[86,1774,1775,1778,1780,1783,1786,1788],{"class":88,"line":507},[86,1776,1777],{"class":133},"    pa ",[86,1779,299],{"class":129},[86,1781,1782],{"class":204}," abs",[86,1784,1785],{"class":133},"(predictor ",[86,1787,406],{"class":129},[86,1789,1790],{"class":133}," left)\n",[86,1792,1793,1796,1798,1800,1802,1804],{"class":88,"line":531},[86,1794,1795],{"class":133},"    pb ",[86,1797,299],{"class":129},[86,1799,1782],{"class":204},[86,1801,1785],{"class":133},[86,1803,406],{"class":129},[86,1805,1806],{"class":133}," above)\n",[86,1808,1809,1812,1814,1816,1818,1820],{"class":88,"line":542},[86,1810,1811],{"class":133},"    pc ",[86,1813,299],{"class":129},[86,1815,1782],{"class":204},[86,1817,1785],{"class":133},[86,1819,406],{"class":129},[86,1821,1822],{"class":133}," upper_left)\n",[86,1824,1825,1828,1831,1834,1837,1840,1842,1844],{"class":88,"line":561},[86,1826,1827],{"class":129},"    if",[86,1829,1830],{"class":133}," pa ",[86,1832,1833],{"class":129},"\u003C=",[86,1835,1836],{"class":133}," pb ",[86,1838,1839],{"class":129},"and",[86,1841,1830],{"class":133},[86,1843,1833],{"class":129},[86,1845,1846],{"class":133}," pc:\n",[86,1848,1849,1852],{"class":88,"line":598},[86,1850,1851],{"class":129},"        return",[86,1853,1854],{"class":133}," left\n",[86,1856,1857,1859,1861,1863],{"class":88,"line":603},[86,1858,1827],{"class":129},[86,1860,1836],{"class":133},[86,1862,1833],{"class":129},[86,1864,1846],{"class":133},[86,1866,1867,1869],{"class":88,"line":608},[86,1868,1851],{"class":129},[86,1870,1871],{"class":133}," above\n",[86,1873,1874,1876],{"class":88,"line":639},[86,1875,488],{"class":129},[86,1877,1772],{"class":133},[86,1879,1880],{"class":88,"line":656},[86,1881,123],{"emptyLinePlaceholder":122},[86,1883,1884],{"class":88,"line":667},[86,1885,123],{"emptyLinePlaceholder":122},[86,1887,1888,1890,1893,1896,1898],{"class":88,"line":690},[86,1889,273],{"class":129},[86,1891,1892],{"class":92}," read_rgb_png",[86,1894,1895],{"class":133},"(path: Path) -> ",[86,1897,282],{"class":204},[86,1899,290],{"class":133},[86,1901,1902,1905,1907],{"class":88,"line":714},[86,1903,1904],{"class":133},"    blob ",[86,1906,299],{"class":129},[86,1908,1909],{"class":133}," path.read_bytes()\n",[86,1911,1912,1914,1917,1920,1922],{"class":88,"line":720},[86,1913,1827],{"class":129},[86,1915,1916],{"class":129}," not",[86,1918,1919],{"class":133}," blob.startswith(",[86,1921,226],{"class":204},[86,1923,1924],{"class":133},"):\n",[86,1926,1927,1930,1933,1935,1938],{"class":88,"line":759},[86,1928,1929],{"class":129},"        raise",[86,1931,1932],{"class":204}," ValueError",[86,1934,305],{"class":133},[86,1936,1937],{"class":96},"\"Not a PNG file.\"",[86,1939,756],{"class":133},[86,1941,1942],{"class":88,"line":770},[86,1943,123],{"emptyLinePlaceholder":122},[86,1945,1946,1949,1951,1953,1955,1957],{"class":88,"line":776},[86,1947,1948],{"class":133},"    offset ",[86,1950,299],{"class":129},[86,1952,352],{"class":204},[86,1954,305],{"class":133},[86,1956,226],{"class":204},[86,1958,756],{"class":133},[86,1960,1961,1964,1966,1969,1971,1974,1976,1979,1981,1984,1986],{"class":88,"line":794},[86,1962,1963],{"class":133},"    width ",[86,1965,299],{"class":129},[86,1967,1968],{"class":133}," height ",[86,1970,299],{"class":129},[86,1972,1973],{"class":133}," bit_depth ",[86,1975,299],{"class":129},[86,1977,1978],{"class":133}," color_type ",[86,1980,299],{"class":129},[86,1982,1983],{"class":133}," interlace ",[86,1985,299],{"class":129},[86,1987,1988],{"class":204}," None\n",[86,1990,1991,1994,1996],{"class":88,"line":829},[86,1992,1993],{"class":133},"    idat_parts ",[86,1995,299],{"class":129},[86,1997,1998],{"class":133}," []\n",[86,2000,2001],{"class":88,"line":849},[86,2002,123],{"emptyLinePlaceholder":122},[86,2004,2005,2007,2010,2012,2014],{"class":88,"line":855},[86,2006,343],{"class":129},[86,2008,2009],{"class":133}," offset ",[86,2011,349],{"class":129},[86,2013,352],{"class":204},[86,2015,2016],{"class":133},"(blob):\n",[86,2018,2019,2022,2024,2027,2029,2032,2034,2037,2040,2042],{"class":88,"line":861},[86,2020,2021],{"class":133},"        length ",[86,2023,299],{"class":129},[86,2025,2026],{"class":133}," struct.unpack(",[86,2028,568],{"class":96},[86,2030,2031],{"class":133},", blob[offset : offset ",[86,2033,436],{"class":129},[86,2035,2036],{"class":204}," 4",[86,2038,2039],{"class":133},"])[",[86,2041,704],{"class":204},[86,2043,2044],{"class":133},"]\n",[86,2046,2047,2050,2052,2055,2057,2059,2062,2064,2067],{"class":88,"line":866},[86,2048,2049],{"class":133},"        chunk_type ",[86,2051,299],{"class":129},[86,2053,2054],{"class":133}," blob[offset ",[86,2056,436],{"class":129},[86,2058,2036],{"class":204},[86,2060,2061],{"class":133}," : offset ",[86,2063,436],{"class":129},[86,2065,2066],{"class":204}," 8",[86,2068,2044],{"class":133},[86,2070,2071,2074,2076,2078,2080],{"class":88,"line":871},[86,2072,2073],{"class":133},"        data_start ",[86,2075,299],{"class":129},[86,2077,2009],{"class":133},[86,2079,436],{"class":129},[86,2081,2082],{"class":204}," 8\n",[86,2084,2085,2088,2090,2093,2095],{"class":88,"line":890},[86,2086,2087],{"class":133},"        data_end ",[86,2089,299],{"class":129},[86,2091,2092],{"class":133}," data_start ",[86,2094,436],{"class":129},[86,2096,2097],{"class":133}," length\n",[86,2099,2100,2103,2105],{"class":88,"line":911},[86,2101,2102],{"class":133},"        chunk_data ",[86,2104,299],{"class":129},[86,2106,2107],{"class":133}," blob[data_start:data_end]\n",[86,2109,2110,2113,2115,2118,2120],{"class":88,"line":916},[86,2111,2112],{"class":133},"        offset ",[86,2114,299],{"class":129},[86,2116,2117],{"class":133}," data_end ",[86,2119,436],{"class":129},[86,2121,2122],{"class":204}," 4\n",[86,2124,2125],{"class":88,"line":921},[86,2126,123],{"emptyLinePlaceholder":122},[86,2128,2129,2132,2134,2137,2139,2141],{"class":88,"line":936},[86,2130,2131],{"class":129},"        if",[86,2133,581],{"class":133},[86,2135,2136],{"class":129},"==",[86,2138,211],{"class":129},[86,2140,788],{"class":96},[86,2142,290],{"class":133},[86,2144,2145,2148,2150],{"class":88,"line":947},[86,2146,2147],{"class":133},"            width, height, bit_depth, color_type, _, _, interlace ",[86,2149,299],{"class":129},[86,2151,2152],{"class":133}," struct.unpack(\n",[86,2154,2155,2158],{"class":88,"line":966},[86,2156,2157],{"class":96},"                \">IIBBBBB\"",[86,2159,2160],{"class":133},", chunk_data\n",[86,2162,2163],{"class":88,"line":971},[86,2164,2165],{"class":133},"            )\n",[86,2167,2168,2171,2173,2175,2177,2179],{"class":88,"line":1006},[86,2169,2170],{"class":129},"        elif",[86,2172,581],{"class":133},[86,2174,2136],{"class":129},[86,2176,211],{"class":129},[86,2178,803],{"class":96},[86,2180,290],{"class":133},[86,2182,2183],{"class":88,"line":1030},[86,2184,2185],{"class":133},"            idat_parts.append(chunk_data)\n",[86,2187,2188,2190,2192,2194,2196,2198],{"class":88,"line":1041},[86,2189,2170],{"class":129},[86,2191,581],{"class":133},[86,2193,2136],{"class":129},[86,2195,211],{"class":129},[86,2197,838],{"class":96},[86,2199,290],{"class":133},[86,2201,2202],{"class":88,"line":1060},[86,2203,2204],{"class":129},"            break\n",[86,2206,2207],{"class":88,"line":1085},[86,2208,123],{"emptyLinePlaceholder":122},[86,2210,2211,2213,2216,2219,2222,2224,2226,2228,2230,2232],{"class":88,"line":1096},[86,2212,1827],{"class":129},[86,2214,2215],{"class":133}," (bit_depth, color_type, interlace) ",[86,2217,2218],{"class":129},"!=",[86,2220,2221],{"class":133}," (",[86,2223,736],{"class":204},[86,2225,571],{"class":133},[86,2227,741],{"class":204},[86,2229,571],{"class":133},[86,2231,704],{"class":204},[86,2233,1924],{"class":133},[86,2235,2236,2238,2240,2242,2245],{"class":88,"line":1101},[86,2237,1929],{"class":129},[86,2239,1932],{"class":204},[86,2241,305],{"class":133},[86,2243,2244],{"class":96},"\"Only non-interlaced 8-bit RGB PNG files are supported.\"",[86,2246,756],{"class":133},[86,2248,2249],{"class":88,"line":1126},[86,2250,123],{"emptyLinePlaceholder":122},[86,2252,2253,2255,2257,2260,2262,2264],{"class":88,"line":1132},[86,2254,939],{"class":133},[86,2256,299],{"class":129},[86,2258,2259],{"class":133}," zlib.decompress(",[86,2261,785],{"class":129},[86,2263,811],{"class":96},[86,2265,2266],{"class":133},".join(idat_parts))\n",[86,2268,2269,2272,2274],{"class":88,"line":1137},[86,2270,2271],{"class":133},"    bytes_per_pixel ",[86,2273,299],{"class":129},[86,2275,653],{"class":204},[86,2277,2278,2280,2282,2284,2286],{"class":88,"line":1168},[86,2279,642],{"class":133},[86,2281,299],{"class":129},[86,2283,647],{"class":133},[86,2285,650],{"class":129},[86,2287,2288],{"class":133}," bytes_per_pixel\n",[86,2290,2291,2294,2296,2298],{"class":88,"line":1193},[86,2292,2293],{"class":133},"    result ",[86,2295,299],{"class":129},[86,2297,302],{"class":204},[86,2299,2300],{"class":133},"()\n",[86,2302,2303,2306,2308,2310],{"class":88,"line":1219},[86,2304,2305],{"class":133},"    previous ",[86,2307,299],{"class":129},[86,2309,302],{"class":204},[86,2311,2312],{"class":133},"(row_size)\n",[86,2314,2315,2317,2319],{"class":88,"line":1251},[86,2316,317],{"class":133},[86,2318,299],{"class":129},[86,2320,322],{"class":204},[86,2322,2323],{"class":88,"line":1256},[86,2324,123],{"emptyLinePlaceholder":122},[86,2326,2327,2330,2333,2335,2337],{"class":88,"line":1261},[86,2328,2329],{"class":129},"    for",[86,2331,2332],{"class":133}," _ ",[86,2334,421],{"class":129},[86,2336,424],{"class":204},[86,2338,2339],{"class":133},"(height):\n",[86,2341,2342,2345,2347],{"class":88,"line":1276},[86,2343,2344],{"class":133},"        filter_type ",[86,2346,299],{"class":129},[86,2348,2349],{"class":133}," raw[cursor]\n",[86,2351,2352,2354,2356],{"class":88,"line":1287},[86,2353,460],{"class":133},[86,2355,463],{"class":129},[86,2357,477],{"class":204},[86,2359,2360,2363,2365,2367,2370,2372],{"class":88,"line":1298},[86,2361,2362],{"class":133},"        row ",[86,2364,299],{"class":129},[86,2366,302],{"class":204},[86,2368,2369],{"class":133},"(raw[cursor : cursor ",[86,2371,436],{"class":129},[86,2373,2374],{"class":133}," row_size])\n",[86,2376,2377,2379,2381],{"class":88,"line":1303},[86,2378,460],{"class":133},[86,2380,463],{"class":129},[86,2382,2383],{"class":133}," row_size\n",[86,2385,2386],{"class":88,"line":1332},[86,2387,123],{"emptyLinePlaceholder":122},[86,2389,2390,2392,2395,2397,2400],{"class":88,"line":1357},[86,2391,415],{"class":129},[86,2393,2394],{"class":133}," index, value ",[86,2396,421],{"class":129},[86,2398,2399],{"class":204}," enumerate",[86,2401,2402],{"class":133},"(row):\n",[86,2404,2405,2408,2410,2413,2415,2418,2420,2422,2425,2428,2431],{"class":88,"line":1368},[86,2406,2407],{"class":133},"            left ",[86,2409,299],{"class":129},[86,2411,2412],{"class":133}," row[index ",[86,2414,406],{"class":129},[86,2416,2417],{"class":133}," bytes_per_pixel] ",[86,2419,1392],{"class":129},[86,2421,418],{"class":133},[86,2423,2424],{"class":129},">=",[86,2426,2427],{"class":133}," bytes_per_pixel ",[86,2429,2430],{"class":129},"else",[86,2432,322],{"class":204},[86,2434,2435,2438,2440],{"class":88,"line":1373},[86,2436,2437],{"class":133},"            above ",[86,2439,299],{"class":129},[86,2441,2442],{"class":133}," previous[index]\n",[86,2444,2445,2448,2450,2453,2455,2457,2459,2461,2463,2465,2467],{"class":88,"line":1379},[86,2446,2447],{"class":133},"            upper_left ",[86,2449,299],{"class":129},[86,2451,2452],{"class":133}," previous[index ",[86,2454,406],{"class":129},[86,2456,2417],{"class":133},[86,2458,1392],{"class":129},[86,2460,418],{"class":133},[86,2462,2424],{"class":129},[86,2464,2427],{"class":133},[86,2466,2430],{"class":129},[86,2468,322],{"class":204},[86,2470,2471],{"class":88,"line":1384},[86,2472,123],{"emptyLinePlaceholder":122},[86,2474,2475,2478,2481,2483,2485],{"class":88,"line":1389},[86,2476,2477],{"class":129},"            if",[86,2479,2480],{"class":133}," filter_type ",[86,2482,2136],{"class":129},[86,2484,895],{"class":204},[86,2486,290],{"class":133},[86,2488,2489,2492,2494,2496,2498,2501,2503,2505],{"class":88,"line":1406},[86,2490,2491],{"class":133},"                row[index] ",[86,2493,299],{"class":129},[86,2495,901],{"class":133},[86,2497,436],{"class":129},[86,2499,2500],{"class":133}," left) ",[86,2502,552],{"class":129},[86,2504,555],{"class":129},[86,2506,2507],{"class":204},"FF\n",[86,2509,2511,2514,2516,2518,2521],{"class":88,"line":2510},92,[86,2512,2513],{"class":129},"            elif",[86,2515,2480],{"class":133},[86,2517,2136],{"class":129},[86,2519,2520],{"class":204}," 2",[86,2522,290],{"class":133},[86,2524,2526,2528,2530,2532,2534,2537,2539,2541],{"class":88,"line":2525},93,[86,2527,2491],{"class":133},[86,2529,299],{"class":129},[86,2531,901],{"class":133},[86,2533,436],{"class":129},[86,2535,2536],{"class":133}," above) ",[86,2538,552],{"class":129},[86,2540,555],{"class":129},[86,2542,2507],{"class":204},[86,2544,2546,2548,2550,2552,2554],{"class":88,"line":2545},94,[86,2547,2513],{"class":129},[86,2549,2480],{"class":133},[86,2551,2136],{"class":129},[86,2553,1025],{"class":204},[86,2555,290],{"class":133},[86,2557,2559,2561,2563,2565,2567,2570,2572,2574,2577,2579,2582,2584,2586],{"class":88,"line":2558},95,[86,2560,2491],{"class":133},[86,2562,299],{"class":129},[86,2564,901],{"class":133},[86,2566,436],{"class":129},[86,2568,2569],{"class":133}," ((left ",[86,2571,436],{"class":129},[86,2573,2536],{"class":133},[86,2575,2576],{"class":129},"//",[86,2578,2520],{"class":204},[86,2580,2581],{"class":133},")) ",[86,2583,552],{"class":129},[86,2585,555],{"class":129},[86,2587,2507],{"class":204},[86,2589,2591,2593,2595,2597,2599],{"class":88,"line":2590},96,[86,2592,2513],{"class":129},[86,2594,2480],{"class":133},[86,2596,2136],{"class":129},[86,2598,2036],{"class":204},[86,2600,290],{"class":133},[86,2602,2604,2606,2608,2610,2612,2615,2617,2619],{"class":88,"line":2603},97,[86,2605,2491],{"class":133},[86,2607,299],{"class":129},[86,2609,901],{"class":133},[86,2611,436],{"class":129},[86,2613,2614],{"class":133}," paeth_predictor(left, above, upper_left)) ",[86,2616,552],{"class":129},[86,2618,555],{"class":129},[86,2620,2507],{"class":204},[86,2622,2624,2626,2628,2630,2633],{"class":88,"line":2623},98,[86,2625,2513],{"class":129},[86,2627,2480],{"class":133},[86,2629,2218],{"class":129},[86,2631,2632],{"class":204}," 0",[86,2634,290],{"class":133},[86,2636,2638,2641,2643,2645,2647,2650,2652,2655,2657,2660],{"class":88,"line":2637},99,[86,2639,2640],{"class":129},"                raise",[86,2642,1932],{"class":204},[86,2644,305],{"class":133},[86,2646,1145],{"class":129},[86,2648,2649],{"class":96},"\"Unsupported PNG filter type: ",[86,2651,1205],{"class":204},[86,2653,2654],{"class":133},"filter_type",[86,2656,1160],{"class":204},[86,2658,2659],{"class":96},".\"",[86,2661,756],{"class":133},[86,2663,2665],{"class":88,"line":2664},100,[86,2666,123],{"emptyLinePlaceholder":122},[86,2668,2670],{"class":88,"line":2669},101,[86,2671,2672],{"class":133},"        result.extend(row)\n",[86,2674,2676,2679,2681],{"class":88,"line":2675},102,[86,2677,2678],{"class":133},"        previous ",[86,2680,299],{"class":129},[86,2682,2683],{"class":133}," row\n",[86,2685,2687],{"class":88,"line":2686},103,[86,2688,123],{"emptyLinePlaceholder":122},[86,2690,2692,2694,2696],{"class":88,"line":2691},104,[86,2693,488],{"class":129},[86,2695,491],{"class":204},[86,2697,2698],{"class":133},"(result)\n",[86,2700,2702],{"class":88,"line":2701},105,[86,2703,123],{"emptyLinePlaceholder":122},[86,2705,2707],{"class":88,"line":2706},106,[86,2708,123],{"emptyLinePlaceholder":122},[86,2710,2712,2714,2717,2720,2722],{"class":88,"line":2711},107,[86,2713,273],{"class":129},[86,2715,2716],{"class":92}," decode_png_to_text",[86,2718,2719],{"class":133},"(input_png: Path, output_txt: Path) -> ",[86,2721,634],{"class":204},[86,2723,290],{"class":133},[86,2725,2727,2730,2732],{"class":88,"line":2726},108,[86,2728,2729],{"class":133},"    data ",[86,2731,299],{"class":129},[86,2733,2734],{"class":133}," xor_stream(read_rgb_png(input_png))\n",[86,2736,2738],{"class":88,"line":2737},109,[86,2739,123],{"emptyLinePlaceholder":122},[86,2741,2743,2745,2748,2750,2753,2755,2757],{"class":88,"line":2742},110,[86,2744,1827],{"class":129},[86,2746,2747],{"class":133}," data[:",[86,2749,736],{"class":204},[86,2751,2752],{"class":133},"] ",[86,2754,2218],{"class":129},[86,2756,979],{"class":204},[86,2758,290],{"class":133},[86,2760,2762,2764,2766,2768,2771],{"class":88,"line":2761},111,[86,2763,1929],{"class":129},[86,2765,1932],{"class":204},[86,2767,305],{"class":133},[86,2769,2770],{"class":96},"\"Not a TXTIMG1 payload image.\"",[86,2772,756],{"class":133},[86,2774,2776],{"class":88,"line":2775},112,[86,2777,123],{"emptyLinePlaceholder":122},[86,2779,2781,2784,2786,2788,2790,2793,2795,2798,2801],{"class":88,"line":2780},113,[86,2782,2783],{"class":133},"    original_size, compressed_size ",[86,2785,299],{"class":129},[86,2787,2026],{"class":133},[86,2789,986],{"class":96},[86,2791,2792],{"class":133},", data[",[86,2794,736],{"class":204},[86,2796,2797],{"class":133},":",[86,2799,2800],{"class":204},"24",[86,2802,2803],{"class":133},"])\n",[86,2805,2807,2809,2811,2814,2816,2819,2821,2823],{"class":88,"line":2806},114,[86,2808,950],{"class":133},[86,2810,299],{"class":129},[86,2812,2813],{"class":133}," data[",[86,2815,2800],{"class":204},[86,2817,2818],{"class":133}," : ",[86,2820,2800],{"class":204},[86,2822,371],{"class":129},[86,2824,2825],{"class":133}," compressed_size]\n",[86,2827,2829,2831,2833],{"class":88,"line":2828},115,[86,2830,939],{"class":133},[86,2832,299],{"class":129},[86,2834,2835],{"class":133}," zlib.decompress(compressed)\n",[86,2837,2839],{"class":88,"line":2838},116,[86,2840,123],{"emptyLinePlaceholder":122},[86,2842,2844,2846,2848,2851,2853],{"class":88,"line":2843},117,[86,2845,1827],{"class":129},[86,2847,352],{"class":204},[86,2849,2850],{"class":133},"(raw) ",[86,2852,2218],{"class":129},[86,2854,2855],{"class":133}," original_size:\n",[86,2857,2859,2861,2863],{"class":88,"line":2858},118,[86,2860,1929],{"class":129},[86,2862,1932],{"class":204},[86,2864,2865],{"class":133},"(\n",[86,2867,2869,2872,2875,2877,2880,2882,2885,2887,2889,2891],{"class":88,"line":2868},119,[86,2870,2871],{"class":129},"            f",[86,2873,2874],{"class":96},"\"Decoded size mismatch: expected ",[86,2876,1205],{"class":204},[86,2878,2879],{"class":133},"original_size",[86,2881,1160],{"class":204},[86,2883,2884],{"class":96},", got ",[86,2886,1151],{"class":204},[86,2888,1154],{"class":133},[86,2890,1160],{"class":204},[86,2892,2893],{"class":96},".\"\n",[86,2895,2897],{"class":88,"line":2896},120,[86,2898,2899],{"class":133},"        )\n",[86,2901,2903],{"class":88,"line":2902},121,[86,2904,123],{"emptyLinePlaceholder":122},[86,2906,2908,2911,2913,2915,2917,2919,2921,2923,2925],{"class":88,"line":2907},122,[86,2909,2910],{"class":133},"    output_txt.parent.mkdir(",[86,2912,1107],{"class":817},[86,2914,299],{"class":129},[86,2916,1112],{"class":204},[86,2918,571],{"class":133},[86,2920,1117],{"class":817},[86,2922,299],{"class":129},[86,2924,1112],{"class":204},[86,2926,756],{"class":133},[86,2928,2930],{"class":88,"line":2929},123,[86,2931,2932],{"class":133},"    output_txt.write_bytes(raw)\n",[86,2934,2936,2938,2940,2942,2945,2947,2949,2951,2953,2956,2958,2961,2963,2965],{"class":88,"line":2935},124,[86,2937,1140],{"class":204},[86,2939,305],{"class":133},[86,2941,1145],{"class":129},[86,2943,2944],{"class":96},"\"Decoded ",[86,2946,1151],{"class":204},[86,2948,1154],{"class":133},[86,2950,1157],{"class":129},[86,2952,1160],{"class":204},[86,2954,2955],{"class":96}," bytes to ",[86,2957,1205],{"class":204},[86,2959,2960],{"class":133},"output_txt",[86,2962,1160],{"class":204},[86,2964,233],{"class":96},[86,2966,756],{"class":133},[86,2968,2970],{"class":88,"line":2969},125,[86,2971,123],{"emptyLinePlaceholder":122},[86,2973,2975],{"class":88,"line":2974},126,[86,2976,123],{"emptyLinePlaceholder":122},[86,2978,2980,2982,2984,2986,2988],{"class":88,"line":2979},127,[86,2981,273],{"class":129},[86,2983,1266],{"class":92},[86,2985,1269],{"class":133},[86,2987,634],{"class":204},[86,2989,290],{"class":133},[86,2991,2993,2995,2997],{"class":88,"line":2992},128,[86,2994,1279],{"class":133},[86,2996,299],{"class":129},[86,2998,1284],{"class":133},[86,3000,3002,3004,3006],{"class":88,"line":3001},129,[86,3003,1290],{"class":817},[86,3005,299],{"class":129},[86,3007,3008],{"class":96},"\"Decode a TXTIMG1 PNG image back into a text file.\"\n",[86,3010,3012],{"class":88,"line":3011},130,[86,3013,852],{"class":133},[86,3015,3017,3019,3022,3024,3026,3028,3030,3032,3034,3037],{"class":88,"line":3016},131,[86,3018,1306],{"class":133},[86,3020,3021],{"class":96},"\"input_png\"",[86,3023,571],{"class":133},[86,3025,1314],{"class":817},[86,3027,299],{"class":129},[86,3029,1319],{"class":133},[86,3031,1322],{"class":817},[86,3033,299],{"class":129},[86,3035,3036],{"class":96},"\"Path to the encoded PNG.\"",[86,3038,756],{"class":133},[86,3040,3042,3044,3047,3049,3051,3053,3055,3057,3059,3062],{"class":88,"line":3041},132,[86,3043,1306],{"class":133},[86,3045,3046],{"class":96},"\"output_txt\"",[86,3048,571],{"class":133},[86,3050,1314],{"class":817},[86,3052,299],{"class":129},[86,3054,1319],{"class":133},[86,3056,1322],{"class":817},[86,3058,299],{"class":129},[86,3060,3061],{"class":96},"\"Path for the decoded text file.\"",[86,3063,756],{"class":133},[86,3065,3067,3069,3071],{"class":88,"line":3066},133,[86,3068,1360],{"class":133},[86,3070,299],{"class":129},[86,3072,1365],{"class":133},[86,3074,3076],{"class":88,"line":3075},134,[86,3077,123],{"emptyLinePlaceholder":122},[86,3079,3081],{"class":88,"line":3080},135,[86,3082,3083],{"class":133},"    decode_png_to_text(args.input_png, args.output_txt)\n",[86,3085,3087],{"class":88,"line":3086},136,[86,3088,123],{"emptyLinePlaceholder":122},[86,3090,3092],{"class":88,"line":3091},137,[86,3093,123],{"emptyLinePlaceholder":122},[86,3095,3097,3099,3101,3103,3105],{"class":88,"line":3096},138,[86,3098,1392],{"class":129},[86,3100,1395],{"class":204},[86,3102,1398],{"class":129},[86,3104,1401],{"class":96},[86,3106,290],{"class":133},[86,3108,3110],{"class":88,"line":3109},139,[86,3111,1409],{"class":133},[46,3113,3115],{"id":3114},"dont-believe-me","Don't believe me?",[10,3117,3118],{},"First, download the image:",[76,3120,3122],{"className":78,"code":3121,"language":80,"meta":81,"style":81},"curl -fsSL https://cmpadden.github.io/images/noise.png -o noise.png\n",[83,3123,3124],{"__ignoreMap":81},[86,3125,3126,3129,3132,3135,3138],{"class":88,"line":89},[86,3127,3128],{"class":92},"curl",[86,3130,3131],{"class":204}," -fsSL",[86,3133,3134],{"class":96}," https://cmpadden.github.io/images/noise.png",[86,3136,3137],{"class":204}," -o",[86,3139,103],{"class":96},[10,3141,3142,3143,3146],{},"Save the ",[83,3144,3145],{},"decode.py"," snippet, and then run the following:",[76,3148,3150],{"className":78,"code":3149,"language":80,"meta":81,"style":81},"$ python decode.py noise.png out.txt && head -n10 out.txt\nDecoded 49,474 bytes to out.txt\nAccording to all known laws of aviation, there is no way a bee should be able to fly.\nIts wings are too small to get its fat little body off the ground.\nThe bee, of course, flies anyway because bees don't care what humans think is impossible.\nYellow, black. Yellow, black. Yellow, black. Yellow, black.\nOoh, black and yellow!\nLet's shake it up a little.\nBarry! Breakfast is ready!\nComing!\nHang on a second.\nHello?\n",[83,3151,3152,3179,3194,3248,3291,3319,3324,3329,3348,3361,3366,3379],{"__ignoreMap":81},[86,3153,3154,3157,3160,3162,3164,3167,3170,3173,3176],{"class":88,"line":89},[86,3155,3156],{"class":92},"$",[86,3158,3159],{"class":96}," python",[86,3161,1442],{"class":96},[86,3163,1445],{"class":96},[86,3165,3166],{"class":96}," out.txt",[86,3168,3169],{"class":133}," && ",[86,3171,3172],{"class":92},"head",[86,3174,3175],{"class":204}," -n10",[86,3177,3178],{"class":96}," out.txt\n",[86,3180,3181,3184,3187,3189,3192],{"class":88,"line":119},[86,3182,3183],{"class":92},"Decoded",[86,3185,3186],{"class":96}," 49,474",[86,3188,491],{"class":96},[86,3190,3191],{"class":96}," to",[86,3193,3178],{"class":96},[86,3195,3196,3199,3201,3204,3207,3210,3213,3216,3219,3222,3225,3228,3231,3234,3237,3240,3243,3245],{"class":88,"line":126},[86,3197,3198],{"class":92},"According",[86,3200,3191],{"class":96},[86,3202,3203],{"class":96}," all",[86,3205,3206],{"class":96}," known",[86,3208,3209],{"class":96}," laws",[86,3211,3212],{"class":96}," of",[86,3214,3215],{"class":96}," aviation,",[86,3217,3218],{"class":96}," there",[86,3220,3221],{"class":96}," is",[86,3223,3224],{"class":96}," no",[86,3226,3227],{"class":96}," way",[86,3229,3230],{"class":96}," a",[86,3232,3233],{"class":96}," bee",[86,3235,3236],{"class":96}," should",[86,3238,3239],{"class":96}," be",[86,3241,3242],{"class":96}," able",[86,3244,3191],{"class":96},[86,3246,3247],{"class":96}," fly.\n",[86,3249,3250,3253,3256,3259,3262,3265,3267,3270,3273,3276,3279,3282,3285,3288],{"class":88,"line":137},[86,3251,3252],{"class":92},"Its",[86,3254,3255],{"class":96}," wings",[86,3257,3258],{"class":96}," are",[86,3260,3261],{"class":96}," too",[86,3263,3264],{"class":96}," small",[86,3266,3191],{"class":96},[86,3268,3269],{"class":96}," get",[86,3271,3272],{"class":96}," its",[86,3274,3275],{"class":96}," fat",[86,3277,3278],{"class":96}," little",[86,3280,3281],{"class":96}," body",[86,3283,3284],{"class":96}," off",[86,3286,3287],{"class":96}," the",[86,3289,3290],{"class":96}," ground.\n",[86,3292,3293,3296,3299,3301,3304,3307,3310,3313,3316],{"class":88,"line":145},[86,3294,3295],{"class":92},"The",[86,3297,3298],{"class":96}," bee,",[86,3300,3212],{"class":96},[86,3302,3303],{"class":96}," course,",[86,3305,3306],{"class":96}," flies",[86,3308,3309],{"class":96}," anyway",[86,3311,3312],{"class":96}," because",[86,3314,3315],{"class":96}," bees",[86,3317,3318],{"class":96}," don't care what humans think is impossible.\n",[86,3320,3321],{"class":88,"line":153},[86,3322,3323],{"class":96},"Yellow, black. Yellow, black. Yellow, black. Yellow, black.\n",[86,3325,3326],{"class":88,"line":161},[86,3327,3328],{"class":96},"Ooh, black and yellow!\n",[86,3330,3331,3334,3337,3340,3343,3345],{"class":88,"line":169},[86,3332,3333],{"class":96},"Let's",[86,3335,3336],{"class":96}," shake",[86,3338,3339],{"class":96}," it",[86,3341,3342],{"class":96}," up",[86,3344,3230],{"class":96},[86,3346,3347],{"class":96}," little.\n",[86,3349,3350,3353,3356,3358],{"class":88,"line":177},[86,3351,3352],{"class":92},"Barry!",[86,3354,3355],{"class":96}," Breakfast",[86,3357,3221],{"class":96},[86,3359,3360],{"class":96}," ready!\n",[86,3362,3363],{"class":88,"line":191},[86,3364,3365],{"class":92},"Coming!\n",[86,3367,3368,3371,3374,3376],{"class":88,"line":196},[86,3369,3370],{"class":92},"Hang",[86,3372,3373],{"class":96}," on",[86,3375,3230],{"class":96},[86,3377,3378],{"class":96}," second.\n",[86,3380,3381],{"class":88,"line":201},[86,3382,3383],{"class":92},"Hello?\n",[10,3385,3386,3387,3390],{},"To hide your own text file inside of a noisy image, save ",[83,3388,3389],{},"encode.py"," and then run:",[76,3392,3394],{"className":78,"code":3393,"language":80,"meta":81,"style":81},"python encode.py my-super-secret-text.txt noise.png\n",[83,3395,3396],{"__ignoreMap":81},[86,3397,3398,3400,3402,3405],{"class":88,"line":89},[86,3399,108],{"class":92},[86,3401,97],{"class":96},[86,3403,3404],{"class":96}," my-super-secret-text.txt",[86,3406,103],{"class":96},[3408,3409,3410],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":81,"searchDepth":119,"depth":119,"links":3412},[3413,3414,3415,3416],{"id":48,"depth":119,"text":49},{"id":70,"depth":119,"text":71},{"id":1426,"depth":119,"text":1427},{"id":3114,"depth":119,"text":3115},null,[3419],"programming","2026-05-26T00:00:00.000Z",false,"md",{"excerpt":3424},{"type":7,"value":3425},[3426],[10,3427,12],{},"/blog/steganography-bee-movie",{"title":5,"description":12},"blog/steganography-bee-movie",[108,48,3432],"web","Mi-n1QEXsHJbLXMomt6-BAUVZhmaEj3e5865HcIbxLo",1779765232430]