anchor.diff:    indexesSet: set of Byte;
   begin
     gLog.AddTime('Creating crash report...');
  -  attachedFilesStr := '';
   
     // Attempt to save the game, but if the state is too messed up it might fail
     gGame.SaveWorkerThreadHolder.Worker.fSynchronousExceptionMode := True; //Do saving synchronously in main thread
  
positive.code: end;
  
  
  procedure TKMCrashReport.AttachEverything;
  var
    attachedFilesStr: UnicodeString;
  
    procedure AttachFile(const aFile: UnicodeString);
    begin
      if (aFile <> '') and FileExists(aFile) then
      begin
        if Pos(aFile, attachedFilesStr) = 0 then
        begin
          attachedFilesStr := attachedFilesStr + aFile + '; ';
          fExceptIntf.AdditionalAttachments.Add(aFile, '', fZipFile);
          gLog.AddTime('Attached file: ' + aFile);
        end
        else
          gLog.AddTime('File already attached: ' + aFile);
      end;
    end;
  
    procedure AttachSaveFiles(const aFile: UnicodeString; aAttachRNG: Boolean = True);
    begin
      AttachFile(ChangeFileExt(aFile, EXT_SAVE_MAIN_DOT));
  
negative.code:   // which are not quite related to the Game's SRP
    TKMCrashReport = class
    private
      fExceptIntf: IMEException;
      fZipFile: UnicodeString;
  
      fAttachedFilesStr: UnicodeString;
      procedure AttachFile(const aFile: UnicodeString);
      procedure AttachEverything;
    public
      constructor Create(const aExceptIntf: IMEException; const aZipFile: UnicodeString);
      class procedure Generate(const aExceptIntf: IMEException; const aZipFile: UnicodeString); static;
    end;
  
  