anchor.diff:      procedure Build(const ASecret: string);
       procedure Load(const AToken, ASecret: string);
       procedure Clear;
  +    function Clone(const AIgnoreRequestResponse: Boolean = True): TMARSToken; virtual;
   
       function HasRole(const ARole: string): Boolean; overload; virtual;
       function HasRole(const ARoles: TArray<string>): Boolean; overload; virtual;
  
positive.code:   FCookiePath := AParameters.ByName(JWT_COOKIEPATH_PARAM, AURL.BasePath).AsString;
    FCookieSecure := AParameters.ByName(JWT_COOKIESECURE_PARAM, JWT_COOKIESECURE_PARAM_DEFAULT).AsBoolean;
    Create(GetToken(ARequest), AParameters);
  end;
  
  destructor TMARSToken.Destroy;
  
negative.code:     function GetToken(const ARequest: TWebRequest): string; virtual;
      function GetIsExpired: Boolean; virtual;
  
      function BuildJWTToken(const ASecret: string; const AClaims: TMARSParameters): string; virtual;
      function LoadJWTToken(const AToken: string; const ASecret: string; var AClaims: TMARSParameters): Boolean; virtual;
  
      property Request: TWebRequest read FRequest;
      property Response: TWebResponse read FResponse;
    public
      constructor Create(); reintroduce; overload; virtual;
      constructor Create(const AToken: string; const AParameters: TMARSParameters); overload; virtual;
      constructor Create(const AToken: string; const ASecret: string;
        const AIssuer: string; const ADuration: TDateTime); overload; virtual;
      constructor Create(const ARequest: TWebRequest; const AResponse: TWebResponse;
        const AParameters: TMARSParameters; const AURL: TMARSURL); overload; virtual;
      destructor Destroy; override;
  