anchor.diff:      ;
   
   // We want to avoid matching against normal names and uuids so a BASE64 needs to be pretty long
  -BASE64: B64FirstChunk B64Chunk B64Chunk B64Chunk B64Chunk B64Chunk B64Chunk B64Chunk+ B64LastChunk;
  +BASE64
  +    : B64FirstChunk B64Chunk B64Chunk B64Chunk B64Chunk B64Chunk B64Chunk B64Chunk+ B64LastChunk
  +    ;
   
   // =========================================================================================
   // Parser
   
   userAgent
  -    : (SEMICOLON|COMMA|MINUS|'\''|'"'|'\\'|';'|'='|BRACEOPEN|BLOCKOPEN)*                // Leading garbage
  +    : (SEMICOLON|COMMA|MINUS|PLUS|'\''|'"'|'\\'|';'|'='|BRACEOPEN|BLOCKOPEN)*    // Leading garbage
         ( (SEMICOLON|COMMA|MINUS)? ( product | rootElements ) )*
  -      (SEMICOLON|COMMA|MINUS|PLUS|'\''|'"'|'\\'|';'|'='|BRACECLOSE|BLOCKCLOSE)*       // Trailing garbage
  +      (SEMICOLON|COMMA|MINUS|PLUS|'\''|'"'|'\\'|';'|'='|BRACECLOSE|BLOCKCLOSE)*  // Trailing garbage
       ;
   
   rootElements
  
positive.code: 
  rootText
      : VERSION
      | (MINUS* WORD)+ MINUS*
      | GIBBERISH
      | MINUS
      ;
  
negative.code:     : (~[0-9+;,{}()\\/ \t:=[\]"-])             // Normal letters
      | '\\x'[0-9a-f][0-9a-f]                    // Hex encoded letters \xab\x12
      ;
  
  WORD
      : MINUS* WORDLetter+ (MINUS+ WORDLetter+ )* MINUS*
      | SPACE MINUS SPACE
      ;
  
  