Const DefUrlBase ='https://downloadqdc.garmin.com/GCSProxyServlet/MarineImages/';
      NameInCache='C:cache\GarminQD'; //       
      DLoaderMode  =true;
      SaveScriptBuf=false;
//---------------------------------------------------------
//    

Function GetGrmnCoord:string;
var G,mask:integer;
    i:byte;
    GRMN:string;
Begin
  GRMN:='';
  for i:=1 to GetZ-1 do
  begin
    G:=0;
    mask:=1 shl (i-1);
    if ((GetX and mask)<>0) then G:=G+1;
    if ((GetY and mask)<>0) then G:=G+2;
    GRMN:=intToStr(G)+GRMN;
  end;
  Result:=GRMN;
//ResultURL:=DefUrlBase+GRMN+'.png?units=m';
End;

//---------------------------------------------------------
//    ;
//    1- ,       

Function FindUpperEmptyTile(Coord:string):string;
Var   VResponseCode                 : Cardinal  ;
      VResponseHeader, VResponseData: AnsiString;
      VRequestUrl, VRequestHeader   : AnsiString;
      NewCoord,LastEmpty:string;
      i:byte;
Begin
  Result   :=Coord;
  NewCoord :=Coord;
  LastEmpty:='';

  if Coord<>'' then
  if Assigned(Downloader) then
  begin
    for i:=length(Coord) downto 3 do
    begin
       LastEmpty:=NewCoord;
       delete(NewCoord,length(NewCoord),1);

       VRequestUrl     := DefUrlBase+NewCoord+'.png?units=m';
       VRequestHeader  := '';
       VResponseHeader := '';
       VResponseData   := '';
       VResponseCode   := Downloader.DoHttpRequest(VRequestUrl, VRequestHeader, '', VResponseHeader, VResponseData);

       if VResponseCode = 200 then
       begin
         VResponseHeader:=LowerCase(VResponseHeader);
         if ((Pos('content-length: 749'+#13,VResponseHeader)=0)
         and (Pos('content-length: 355'+#13,VResponseHeader)=0))  then //    =749  =355 
         begin
           Result:=LastEmpty;
           break;
         end;
       end
       else
       begin
         Result:=LastEmpty;
         break;
       end;
    end;
  end;
End;
//---------------------------------------------------------
VAR
  VResponseCode                 : Cardinal  ;
  VResponseHeader, VResponseData: AnsiString;
  VRequestUrl, VRequestHeader   : AnsiString;

  i           :byte;
  isEmpty     :boolean;
  GrmnCoord,
  tmpGrmnCoord:string;
  GrmnFullFName:string;
//---------------------------------------------------------

BEGIN
  ResultURL:='';
  if ScriptBuffer='' then ScriptBuffer:=';';
  if ScriptBuffer[length(ScriptBuffer)]<>';' then ScriptBuffer:=ScriptBuffer+';';

  GrmnCoord:=GetGrmnCoord;

  isEmpty:=false;
  tmpGrmnCoord:=GrmnCoord;
  for i:=length(GrmnCoord) downto 3 do
  begin
    if Pos(';'+tmpGrmnCoord+';',ScriptBuffer)<>0 then
    begin
      isEmpty:=true;
      break;
    end;
    delete(tmpGrmnCoord,length(tmpGrmnCoord),1);
  end;

  if not isEmpty then
  if Assigned(Downloader) then
  begin
     VRequestUrl     := DefUrlBase+GrmnCoord+'.png?units=m';
     VRequestHeader  := '';
     VResponseHeader := '';
     VResponseData   := '';
     VResponseCode   := Downloader.DoHttpRequest(VRequestUrl, VRequestHeader, '', VResponseHeader, VResponseData);

     if VResponseCode = 200 then
     begin
      VResponseHeader:=LowerCase(VResponseHeader);
      if ((Pos('content-length: 749'+#13,VResponseHeader)<>0)
       or (Pos('content-length: 355'+#13,VResponseHeader)<>0)) then
      begin
        ScriptBuffer:=ScriptBuffer+FindUpperEmptyTile(GrmnCoord)+';'; //     ScriptBuffer
//      ScriptBuffer:=ScriptBuffer+                  (GrmnCoord)+';';                     //DEBUG
        if SaveScriptBuf then SaveToLocalFile(NameInCache+'\ScriptBuffer', ScriptBuffer); //DEBUG
        ResultURL:='';
      end
      else
      begin
//      SaveToLocalFile(NameInCache+'\GRMN\'+GrmnCoord+'.png', VResponseData);

        if DLoaderMode then //     ?
        begin               //       2  ,    
          GrmnFullFName:='\z'+IntToStr(GetZ)+'\'+IntToStr(GetX div 1024)+'\x'+IntToStr(GetX)+'\'+IntToStr(GetY div 1024)+'\y'+IntToStr(GetY)+'.png';
          SaveToLocalFile(NameInCache+GrmnFullFName, VResponseData);
          ResultURL:=''; //  ,     ;         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        end
        else ResultURL:=DefUrlBase+GrmnCoord+'.png?units=m'; //viewer mode with double tile download
      end;
     end;
  end;
END.
