U0 SaveAnim()
{
I64 i,j,d;
I64 MaxData=AnimationLength*
             AnimationSize*
             AnimationSize*2;
U8 *AnimData= ACAlloc(MaxData);

CatPrint(AnimData,"%u %u ",
                AnimationLength,
                AnimationSize);
I64 DocPos=StrLen(AnimData);
for(i=0;i<AnimationLength;i++){
  for(j=0;j<AnimationSize;j++){
  for(d=0;d<AnimationSize;d++){
  AnimData[DocPos++] =
  MStrPrint("%X",Frames[i][j][d])[0];
  
  }
  }
  }
 AnimData[DocPos]=0;
 U8 *FileName;

 DirMk("~/TOSAnimations");
 if(FileName=PopUpFileName("~/TOSAnimations/Anim1.VID.Z"));
 {
 FileWrite(FileName,AnimData,StrLen(AnimData));
 }
 Free(AnimData);
}

I64 StrHex2I64(U8* str)
{
  I64 sum = 0;

  Iterate:
  while('0'<= *str <='9')
  {
    sum = sum*10+ (*str-'0');
    str++;
  }
//Sometimes the parser randomly returns 5.
  if(*str==5)
  {
    str++;
    goto Iterate;
  }
  return sum;
}


U8 StrHex2U8(U8* str)
{
  U8 sum = 0;
  U8 i;

  for(i=0; i<2; i++)
  { 
    sum*=16;
    if(*str >= 'A')
    {
      sum+= (10 + *str - 'A');
    }
    else
    {
      sum+= (*str - '0');
    }
    str++;
  }
  return sum;
}


U0 LoadAnim()
{

U8 *FileName=PopUpPickFile("~/TOSAnimations");
U8 *LoadedData=FileRead(FileName);

if(!LoadedData) return;

U8 *progress=LoadedData;

I64 AnimLen=
StrHex2I64(progress);
progress=StrFirstOcc(progress, " ")+1;
I64 AnimSize=
StrHex2I64(progress);
progress=StrFirstOcc(progress, " ");

if(AnimSize>200||
    AnimLen>200||
   AnimSize<2||
    AnimLen<2)
{
Free(LoadedData);
return;
}
AnimationSize=AnimSize;
AnimationLength=AnimLen;

I64 i,j,d;

for(i=0;i<AnimationLength;i++){
  for(j=0;j<AnimationSize;j++){
  for(d=0;d<AnimationSize;d++){
        Frames[i][j][d]=StrHex2U8(progress);
        progress++;
        }
        }
        } 
Frame=AnimationLength-1;
Free(LoadedData);
}