anchor.diff:                  field12_b => integer
               },
           field13 => {list, atom},
  +        field14 => {update, map, map1, m_field14, integer},
  +        field15 => {update, map, map1, m_field15, atom},
           fieldXX => invalid
       },
   
  
positive.code:             ok | {ok, term()} | {opts, [{atom(), term()}]} | error).
  
  -type parse_opt() ::
      opt() | {list, opt()}.
  
  -type parse_spec() :: #{ atom() => parse_opt()}.
  
  
negative.code:                 false ->
                      throw({invalid_key, Index})
              end;
          {update, UpdType, Index2, Key2, SubSpec} ->
              case do_parse_config(SubSpec, Val) of
                  {ok, Val2} ->
                      NewOpts1 = case lists:keytake(Index2, 1, Opts1) of
                          false when UpdType==map -> 
                              [{Index2, maps:put(Key2, Val2, #{})}|Opts1];
                          false when UpdType==list -> 
                              [{Index2, [{Key2, Val2}]}|Opts1];
                          {value, {Index2, Base}, Opts1A} when UpdType==map ->
                              [{Index2, maps:put(Key2, Val2, Base)}|Opts1A];
                          {value, {Index2, Base}, Opts1A} when UpdType==list ->
                              [{Index2, [{Key2, Val2}|Base]}|Opts1A]
                      end,
                      parse_config(Rest, NewOpts1, Opts2, Spec, Type);
                  error ->
                      throw({invalid_key, Index})
              end;
          KeySpec ->
              case do_parse_config(KeySpec, Val) of
                  {ok, Val1} ->
  