anchor.diff:  -export([start_link/0]).
   -export([stop/0]).
   -export([get_user_info/2]).
  --export([get_user_info/3]).
   -export([verify_cache/0]).
   -export([clear_cache/0]).
   
  
positive.code: -spec get_user_info(Issuer :: binary(), Subject :: binary() ) ->
      {ok, UserInfo::tts:user_info()} | {error, term()}.
  get_user_info(Issuer, Subject) ->
      get_user_info(Issuer, Subject, undefined).
  
  -spec get_user_info(Issuer :: binary(), Subject :: binary() ,
                      AccessToken::binary() | undefined ) ->
      {ok, UserInfo::tts:user_info()} | {error, term()}.
  get_user_info(Issuer, Subject, AccessToken) ->
      retrieve_userinfo_if_exists(Issuer, Subject, AccessToken).
  
  -spec verify_cache() -> ok.
  verify_cache() ->
  
negative.code: 
  
  
  retrieve_userinfo_if_exists(Issuer, Subject) ->
      load_user_if_needed(lookup_user(Issuer, Subject), Issuer, Subject).
  
  load_user_if_needed({ok, UserInfo}, _, _) ->
      {ok, UserInfo};
  load_user_if_needed({error, not_found}, Issuer, Subject) ->
      UserMap = #{type => openidconnect, subject => Subject, issuer => Issuer},
      IdhInfo = tts_idh:lookup_user(UserMap),
      Info = #{sub => Subject, iss => Issuer},
      insert_user(IdhInfo, Info).
  
  insert_user({ok, IdhInfo}, OidcInfo) ->
      Info = #{site => IdhInfo, oidc => OidcInfo},
      gen_server:call(?MODULE, {insert, Info});
  insert_user({error, Reason}, _) ->
      {error, Reason};
  insert_user(_, {error, Reason}) ->
      {error, Reason};
  insert_user(_, _) ->
      {error, unsupported_values}.
  
  sync_insert_new_user(UserInfo) ->
  