anchor.diff:      in(write, User, Topic),
       parse_acl_line(F(F,read), User);
   parse_acl_line({F, <<"user ", User/binary>>}, _) ->
  -    SUser = string:substr(binary_to_list(User), 1, byte_size(User) -1),
  +    UserLen = byte_size(User) -1,
  +    <<SUser:UserLen/binary, _/binary>> = User,
       parse_acl_line(F(F,read), SUser);
   parse_acl_line({F, <<"pattern read ", Topic/binary>>}, User) ->
       in(read, pattern, Topic),
  
positive.code:                             end).
  
  topic(User, ClientId, Topic) ->
      subst("%u", User, subst("%c", ClientId, Topic)).
  
  subst(Pat, Subs, Topic) ->
      subst(string:str(Topic, Pat) > 0, Pat, Subs, Topic).
  
  subst(true, Pat, Subs, Topic) ->
      re:replace(Topic, Pat, Subs, [{return, list}]);
  subst(false, _, _, Topic) -> Topic.
  
  in(Type, User, Topic) when is_binary(Topic) ->
      STopic = string:substr(binary_to_list(Topic), 1, byte_size(Topic) -1),
      in(Type, User, STopic);
  in(Type, User, Topic) ->
      {Tbl, Obj} = t(Type, User, words(Topic)),
      ets:insert(Tbl, Obj).
  
  t(read, all, Topic) -> {vmq_acl_read_all, {Topic, 1}};
  t(write, all, Topic) ->  {vmq_acl_write_all, {Topic, 1}};
  
negative.code:     F(F,close),
      ok.
  
  check(Type, [Word|_] = Topic, User, ClientId) when is_binary(Word) ->
      case check_all_acl(Type, Topic) of
          true -> true;
          false when User == all -> false;
  