anchor.diff:  
   add_topic(MP, Topic, Node) ->
       MPTopic = {MP, Topic},
  -    ets:insert(vmq_trie_topic, {MPTopic, Node}),
  +    case ets:lookup(vmq_trie_topic, MPTopic) of
  +        [] ->
  +            ets:insert(vmq_trie_topic, {MPTopic, 1, maps:put(Node, 1, maps:new()), [Node]});
  +        [{_, TotalCnt, NodeMap, _}] ->
  +            NewNodeMap =
  +            case maps:find(Node, NodeMap) of
  +                error ->
  +                    maps:put(Node, 1, NodeMap);
  +                {ok, Cnt} ->
  +                    maps:put(Node, Cnt + 1, NodeMap)
  +            end,
  +            ets:insert(vmq_trie_topic, {MPTopic, TotalCnt + 1, NewNodeMap,
  +                                        [N || {N, _} <- maps:to_list(NewNodeMap)]})
  +    end,
  +
       case ets:lookup(vmq_trie_node, MPTopic) of
           [#trie_node{topic=Topic}] ->
               ignore;
  
positive.code: 
  del_topic(MP, Topic, Node) ->
      MPTopic = {MP, Topic},
      ets:delete_object(vmq_trie_topic, {MPTopic, Node}),
      case ets:lookup(vmq_trie_topic, MPTopic) of
          [] ->
              trie_delete(MP, Topic);
          _ ->
              ignore
      end.
  
negative.code:     match(MP, Topic, Rest, Acc);
  
  match(MP, Topic, [#trie_node{topic=Name}|Rest], Acc) when Name =/= undefined ->
      case ets:lookup(vmq_trie_topic, {MP, Name}) of
          [] ->
              match(MP, Topic, Rest, Acc);
          [{_, _, _, Nodes}] ->
              match(MP, Topic, Rest, match_(Name, Nodes, Acc))
      end;
  match(MP, Topic, [_|Rest], Acc) ->
      match(MP, Topic, Rest, Acc);
  match(_, _, [], Acc) -> Acc.
  
  match_(Topic, [Node|Rest], Acc) ->
      match_(Topic, Rest, [{Topic, Node}|Acc]);
  match_(_, [], Acc) -> Acc.
  
  