{$APPTYPE CONSOLE}
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
procedure FileCopy(sFrom, sTo: String);
const
iRecSize = 16384;
var
fFrom, fTo: file;
pBlock: Pointer;
iToRead, iActualSize: Integer;
begin
Assign(fFrom, sFrom);
Assign(fTo, sTo);
try
Reset(fFrom, 1);
Rewrite(fTo, 1);
GetMem(pBlock, iRecSize);
iToRead := FileSize(fFrom);
Repeat
BlockRead(fFrom, pBlock^, iRecSize, iActualSize);
if iActualSize > 0 then BlockWrite(fTo, pBlock^, iActualSize);
Dec(iToRead, iActualSize)
Until (iToRead <= 0) or (iActualSize = 0)
finally
FreeMem(pBlock, iRecSize);
Close(fTo);
Close(fFrom)
end
end;
function IntToWct(iValue: LongInt): string;
var
bTmp: Byte;
begin
Result := '';
Repeat
bTmp := iValue and 7;
Result := Chr($41 + bTmp + 8*Ord(bTmp > 6)) + Result;
iValue := iValue shr 3
Until iValue = 0
end;
function WctToInt(sValue: string): LongInt;
var
bTmp: Byte;
begin
Result := 0;
Repeat
bTmp := ord(sValue[1]) - $41;
Result := (Result shl 3) + bTmp - 8*Ord(bTmp > 6);
sValue := Copy(sValue, 2, Length(sValue) - 1)
Until sValue = ''
end;
function GetRandomName: string;
begin
Result := IntToWct(Random(MaxLongInt))
end;
procedure PokeLabel(sName, sLabel: string);
var fFile: file;
begin
try
Assign(fFile, sName);
Reset(fFile, 1);
BlockWrite(fFile, sLabel[1], Length(sLabel));
Truncate(fFile)
finally
Close(fFile)
end
end;
function PeekLabel(sName: string): string;
var tFile: text;
begin
try
Assign(tFile, sName);
Reset(tFile);
Read(tFile, Result)
finally
Close(tFile)
end
end;
procedure VanTooz(sName: string);
var fFile: file;
begin
try
Assign(fFile, sName);
Rewrite(fFile, 1);
finally
Close(fFile);
Erase(fFile)
end
end;
var
sFName, sSName: string;
begin
Randomize;
if (not (ParamCount in [1..2]) or (ParamStr(1) = '-h') or (ParamCount = 2) and (ParamStr(1) <> '-d')) then
begin
Writeln('Usage: ');
Writeln(ParamStr(0) + ' file_name_to_pack');
Writeln(ParamStr(0) + ' -d file_name_to_unpack');
Halt(1)
end;
case ParamCount of
1: begin
sFName := ParamStr(1);
sSName := GetRandomName;
FileCopy(sFName, sFName + ':' + sSName);
PokeLabel(sFName, sSName)
end;
2: begin
sFName := ParamStr(2);
sSName := PeekLabel(sFName);
FileCopy(sFName + ':' + sSName, sFName);
VanTooz(sFName + ':' + sSName)
end;
end
end.
eyRBUFBUWVBFIENPTlNPTEV9CnskSUZERUYgRlBDfQp7JE1PREUgREVMUEhJfQp7JEVORElGfQpwcm9jZWR1cmUgRmlsZUNvcHkoc0Zyb20sIHNUbzogU3RyaW5nKTsKICBjb25zdCAKICAgIGlSZWNTaXplID0gMTYzODQ7CiAgdmFyCiAgICBmRnJvbSwgZlRvOiBmaWxlOwogICAgcEJsb2NrOiBQb2ludGVyOwogICAgaVRvUmVhZCwgaUFjdHVhbFNpemU6IEludGVnZXI7CiAgYmVnaW4KICAgIEFzc2lnbihmRnJvbSwgc0Zyb20pOwogICAgQXNzaWduKGZUbywgc1RvKTsKICAgIHRyeQogICAgICBSZXNldChmRnJvbSwgMSk7IAogICAgICBSZXdyaXRlKGZUbywgMSk7CiAgICAgIEdldE1lbShwQmxvY2ssIGlSZWNTaXplKTsKICAgICAgaVRvUmVhZCA6PSBGaWxlU2l6ZShmRnJvbSk7CiAgICAgIFJlcGVhdAogICAgICAgIEJsb2NrUmVhZChmRnJvbSwgcEJsb2NrXiwgaVJlY1NpemUsIGlBY3R1YWxTaXplKTsKICAgICAgICBpZiBpQWN0dWFsU2l6ZSA+IDAgdGhlbiBCbG9ja1dyaXRlKGZUbywgcEJsb2NrXiwgaUFjdHVhbFNpemUpOwogICAgICAgIERlYyhpVG9SZWFkLCBpQWN0dWFsU2l6ZSkKICAgICAgVW50aWwgKGlUb1JlYWQgPD0gMCkgb3IgKGlBY3R1YWxTaXplID0gMCkKICAgIGZpbmFsbHkKICAgICAgRnJlZU1lbShwQmxvY2ssIGlSZWNTaXplKTsKICAgICAgQ2xvc2UoZlRvKTsKICAgICAgQ2xvc2UoZkZyb20pCiAgICBlbmQKICBlbmQ7CgpmdW5jdGlvbiBJbnRUb1djdChpVmFsdWU6IExvbmdJbnQpOiBzdHJpbmc7CiAgdmFyCiAgICBiVG1wOiBCeXRlOwogIGJlZ2luCiAgICBSZXN1bHQgOj0gJyc7CiAgICBSZXBlYXQKICAgICAgYlRtcCA6PSBpVmFsdWUgYW5kIDc7CiAgICAgIFJlc3VsdCA6PSBDaHIoJDQxICsgYlRtcCArIDgqT3JkKGJUbXAgPiA2KSkgKyBSZXN1bHQ7CiAgICAgIGlWYWx1ZSA6PSBpVmFsdWUgc2hyIDMKICAgIFVudGlsIGlWYWx1ZSA9IDAKICBlbmQ7CgpmdW5jdGlvbiBXY3RUb0ludChzVmFsdWU6IHN0cmluZyk6IExvbmdJbnQ7CiAgdmFyCiAgICBiVG1wOiBCeXRlOwogIGJlZ2luCiAgICBSZXN1bHQgOj0gMDsKICAgIFJlcGVhdAogICAgICBiVG1wIDo9IG9yZChzVmFsdWVbMV0pIC0gJDQxOwogICAgICBSZXN1bHQgOj0gKFJlc3VsdCBzaGwgMykgKyBiVG1wIC0gOCpPcmQoYlRtcCA+IDYpOwogICAgICBzVmFsdWUgOj0gQ29weShzVmFsdWUsIDIsIExlbmd0aChzVmFsdWUpIC0gMSkKICAgIFVudGlsIHNWYWx1ZSA9ICcnCiAgZW5kOwoKZnVuY3Rpb24gR2V0UmFuZG9tTmFtZTogc3RyaW5nOwogIGJlZ2luCiAgICBSZXN1bHQgOj0gSW50VG9XY3QoUmFuZG9tKE1heExvbmdJbnQpKQogIGVuZDsKCnByb2NlZHVyZSBQb2tlTGFiZWwoc05hbWUsIHNMYWJlbDogc3RyaW5nKTsKICB2YXIgZkZpbGU6IGZpbGU7CiAgYmVnaW4KICAgIHRyeQogICAgICBBc3NpZ24oZkZpbGUsIHNOYW1lKTsKICAgICAgUmVzZXQoZkZpbGUsIDEpOwogICAgICBCbG9ja1dyaXRlKGZGaWxlLCBzTGFiZWxbMV0sIExlbmd0aChzTGFiZWwpKTsKICAgICAgVHJ1bmNhdGUoZkZpbGUpCiAgICBmaW5hbGx5CiAgICAgIENsb3NlKGZGaWxlKQogICAgZW5kCiAgZW5kOwoKZnVuY3Rpb24gUGVla0xhYmVsKHNOYW1lOiBzdHJpbmcpOiBzdHJpbmc7CiAgdmFyIHRGaWxlOiB0ZXh0OwogIGJlZ2luCiAgICB0cnkKICAgICAgQXNzaWduKHRGaWxlLCBzTmFtZSk7CiAgICAgIFJlc2V0KHRGaWxlKTsKICAgICAgUmVhZCh0RmlsZSwgUmVzdWx0KQogICAgZmluYWxseQogICAgICBDbG9zZSh0RmlsZSkKICAgIGVuZAogIGVuZDsKCnByb2NlZHVyZSBWYW5Ub296KHNOYW1lOiBzdHJpbmcpOwogIHZhciBmRmlsZTogZmlsZTsKICBiZWdpbgogICAgdHJ5CiAgICAgIEFzc2lnbihmRmlsZSwgc05hbWUpOwogICAgICBSZXdyaXRlKGZGaWxlLCAxKTsKICAgIGZpbmFsbHkKICAgICAgQ2xvc2UoZkZpbGUpOwogICAgICBFcmFzZShmRmlsZSkKICAgIGVuZAogIGVuZDsKCgp2YXIKICBzRk5hbWUsIHNTTmFtZTogc3RyaW5nOwpiZWdpbgogIFJhbmRvbWl6ZTsKICBpZiAobm90IChQYXJhbUNvdW50IGluIFsxLi4yXSkgb3IgKFBhcmFtU3RyKDEpID0gJy1oJykgb3IgKFBhcmFtQ291bnQgPSAyKSBhbmQgKFBhcmFtU3RyKDEpIDw+ICctZCcpKSB0aGVuCiAgICBiZWdpbgogICAgICBXcml0ZWxuKCdVc2FnZTogJyk7CiAgICAgIFdyaXRlbG4oUGFyYW1TdHIoMCkgKyAnIGZpbGVfbmFtZV90b19wYWNrJyk7CiAgICAgIFdyaXRlbG4oUGFyYW1TdHIoMCkgKyAnIC1kIGZpbGVfbmFtZV90b191bnBhY2snKTsKICAgICAgSGFsdCgxKQogICAgZW5kOwogIGNhc2UgUGFyYW1Db3VudCBvZgogICAgMTogYmVnaW4KICAgICAgICAgc0ZOYW1lIDo9IFBhcmFtU3RyKDEpOwogICAgICAgICBzU05hbWUgOj0gR2V0UmFuZG9tTmFtZTsKICAgICAgICAgRmlsZUNvcHkoc0ZOYW1lLCBzRk5hbWUgKyAnOicgKyBzU05hbWUpOwogICAgICAgICBQb2tlTGFiZWwoc0ZOYW1lLCBzU05hbWUpCiAgICAgICBlbmQ7CiAgICAyOiBiZWdpbgogICAgICAgICBzRk5hbWUgOj0gUGFyYW1TdHIoMik7CiAgICAgICAgIHNTTmFtZSA6PSBQZWVrTGFiZWwoc0ZOYW1lKTsKICAgICAgICAgRmlsZUNvcHkoc0ZOYW1lICsgJzonICsgc1NOYW1lLCBzRk5hbWUpOwogICAgICAgICBWYW5Ub296KHNGTmFtZSArICc6JyArIHNTTmFtZSkKICAgICAgIGVuZDsKICBlbmQKZW5kLgo=