#include #include #include #include #include typedef unsigned int O; typedef unsigned char o; const O swap_byte_order = 1, R = 64, B = 0x4000; o m[B + 16], s[16][256], S[16][256]; O n[B / 4], *f, x[R * 4], X[R * 4], g[4], A[256], L, U, N, i, u, k, h, a, z; int w, v, V; tm *W, C; FILE *P, *Q; const char *t[4] = { "h\32:,<$4~$HhVF+\16tz;Z}8^\1Mt|:0t;^OC|1h|||L|Av>jLt{H*J" "H*\nb9]zIcx3hp9n`Nm*?$F-\rzWdN{\4nC&^KEf\33;z0h\0~z25K25" "\13Tb{R7\2P8\t04KDNBZo|Lt427J27\n42KT\27\37n'Kb9\rb;\14*" "I~PzGPZ!PX\"jg\4.W\16XP;PV\r(ZeRU\16~/.(Xft\22\3h\2=$>BV" "aD&%9@.eD,e~u3&[6\10z\rr\32k(X6\n{\rzbmX\"e$J\16|t3&U1 o" "JR/9n\t\33,7\13PJ{^\21[Z\23[@\36[p^yB\37[D\32\\P$fj\rzx" "\\,\6Dj[if[;D~BjYj&?B`\16\rR1\5" "&1Af[j:_4FiDDhDF9DP>\6@\2aP\6\n4Zv@\0b^}7j\7Mh\4NTrhld", "[yyyy-mm-dd] [input] [output]", "read error", "write error" }; O r(O p, int q) { return (p >> q) | (p << (32 - q)); } O l(O p, int q) { return (p << q) | (p >> (32 - q)); } void c(O p, O *q) { if( swap_byte_order ) for(i = 0; i < p; i++) q[i] = (l(q[i], 8) & 0x00ff00ff) | (r(q[i], 8) & 0xff00ff00); } void I() { h = A[U]; L = (L << 19) ^ (L >> 13); A[U] = a = A[h & 0xff] + L + N; N = A[(a >> 8) & 0xff] + h; U = (U + 1) & 0xff; } void e(O &p, O &b, O &q, O &d) { p = l(p, 13); q = l(q, 3); d ^= q ^ (p << 3); b ^= p ^ q; d = l(d, 7); b = l(b, 1); p ^= b ^ d; q ^= d ^ (b << 7); p = l(p, 5); q = l(q, 22); } void E(O &p, O &b, O &q, O &d) { q = r(q, 22); p = r(p, 5); q ^= d ^ (b << 7); p ^= b ^ d; d = r(d, 7); b = r(b, 1); d ^= q ^ (p << 3); b ^= p ^ q; q = r(q, 3); p = r(p, 13); } void F(int d) { for(h = 0; h < 16; h++) { w = t[0][(d * 16 + h) * 3] ^ 81; v = t[0][(d * 16 + h) * 3 + 1] ^ 25; V = t[0][(d * 16 + h) * 3 + 2] ^ 16; for(i = 0; i < 256; i++) { u = ((i + w) & 0x7f) | (i & 0x80); u = (((u >> 1) + v) & 0x7f) | ((u << 7) & 0x80); s[h][i] = (((u >> 1) + V) & 0x7f) | ((u << 7) & 0x80); } for(a = 0; a < 2; a++) for(z = 0; z < 8; z++) for(i = 0; i < 256; i++) { k = s[h][i] ^ s[h][i ^ (1 << z)]; if( !(k & (k - 1)) ) { u = i ^ (1 << ((z + 1) % 8)); V = s[h][i]; s[h][i] = s[h][u]; s[h][u] = V; } } } } void D(O *q) { for(h = 0; h < R; h++) { E(q[0], q[1], q[2], q[3]); for(a = 0; a < 4; a++) { k = q[a]; for(z = 0; z < 4; z++) { k = l(k, 8); k = (k & ~0xff) | S[h & 15][k & 0xff]; } q[a] = k ^ X[h * 4 + a]; } } for(h = 0; h < 4; h++) q[h] ^= f[h]; } int y(int p, void *q) { return fread(q, 1, p, P); } void Y(int p) { fwrite(m, p, 1, Q); } void T(int p) { puts(t[p]); } void Z() { fclose(P); } int main(int p, char **q) { if( p < 2 ) T(1); else { int b; memset(&C, 0, sizeof(C)); if( sscanf(q[1], "%d-%d-%d", &C.tm_year, &C.tm_mon, &C.tm_mday) - 3 ) { b = 1; time_t d = time(NULL); W = localtime(&d); C.tm_year = W->tm_year; C.tm_mon = W->tm_mon; C.tm_mday = W->tm_mday; } else { b = 2; C.tm_year -= 1900; C.tm_mon--; } if( !(P = fopen(q[b], "rb")) ) { T(2); return 1; } memset(A, 10, 1024); y(1024, A); Z(); c(256, A); L = 1; for(i = U = N = 0; i < 4; x[i++] = N) for(u = 0; u < 8192; u++) I(); F(8); for(i = 1; i < R; i++) { for(u = 0; u < 4; u++) { h = x[(i - 1) * 4 + u]; for(k = 0; k < 4; k++) { h = (h & ~0xff) | s[i & 15][h & 0xff]; h = r(h, 8); } x[i * 4 + u] = h; } e(x[i * 4], x[i * 4 + 1], x[i * 4 + 2], x[i * 4 + 3]); } b++; if( p > b && (q[b][0] - '-' || q[b][1]) ) { if( !(P = fopen(q[b], "rb")) ) { T(2); return 1; } } else { P = stdin; } b++; if( p > b && (q[b][0] - '-' && q[b][1]) ) { if( !(Q = fopen(q[b], "wb+")) ) { Z(); T(3); return 1; } } else { Q = stdout; } z = 2551443; F((((mktime(&C) - 434928) % z) * 8) / z); if( b - 4 ) { for(i = 0; i < R; i++) for(u = 0; u < 4; u++) X[(R - 1 - i) * 4 + u] = x[i * 4 + u]; for(u = 0; u < 16; u++) for(i = 0; i < 256; i++) S[15 - u][s[u][i]] = (o)i; if( y(16, g) == 16 ) { c(4, g); f = g; w = 16; for(u = 0; w == 16 && (w = y(B - u, m + u)) > 0; u = 16) { w += u; v = (w & ~15) - 16; if( v > 0 ) { c(v / 4, (O*)m); memcpy(n, m, v); for(i = 0; i < (O)v; i += 16) { D((O*)(m + i)); f = (O*)(((o*)n) + i); } c(v / 4, (O*)m); f = (O*)memcpy(g, f, 16); Y(v); w -= v; memmove(m, m + v, w); } } if( w == 17 && m[16] < 16 ) { if( !(u = (O)m[16]) ) u = 16; c(4, (O*)m); D((O*)m); c(4, (O*)m); Y(u); } } } else { timeval d; gettimeofday(&d, NULL); memcpy(A, &d, sizeof(d)); A[99] = getpid(); for(i = 0; i < 8192; i++) I(); for(i = 0; i < 4; g[i++] = N) I(); f = (O*)memcpy(n, g, 16); c(4, g); memcpy(m, g, 16); Y(16); for(w = 0; (w & 15) == 0 && (w = y(B, m)) > 0;) { for(i = 0; i < 16; m[w + i++] = N & 0xff) I(); v = (w + 15) / 16; c(v * 4, (O*)m); for(i = 0; i < (O)w; i += 16) { O *q = (O*)(m + i); for(u = 0; u < 4; u++) q[u] ^= f[u]; for(u = 0; u < R; u++) { for(k = 0; k < 4; k++) { h = q[k] ^ x[u * 4 + k]; for(z = 0; z < 4; z++) { h = (h & ~0xff) | s[u & 15][h & 0xff]; h = r(h, 8); } q[k] = h; } e(q[0], q[1], q[2], q[3]); } f = (O*)(m + i); } f = (O*)memcpy(n, f, 16); c(v * 4, (O*)m); Y(v * 16); } m[0] = w & 15; Y(1); } Z(); P = Q; Z(); } return 0; }