code: function Dict_getAll() {
        var all = Object.create(null);
        var queue = null;
        var key, obj;
        for (key in this.map) {
          obj = this.get(key);
          if (obj instanceof Dict) {
            if (isRecursionAllowedFor(obj)) {
              (queue || (queue = [])).push({target: all, key: key, obj: obj});
            } else {
              all[key] = this.getRaw(key);
            }
          } else {
            all[key] = obj;
          }
        }
        if (!queue) {
          return all;
        }
  
        // trying to take cyclic references into the account
        var processed = Object.create(null);
        while (queue.length > 0) {
          var item = queue.shift();
          var itemObj = item.obj;
          var objId = itemObj.objId;
          if (objId && objId in processed) {
            item.target[item.key] = processed[objId];
            continue;
          }
          var dereferenced = Object.create(null);
          for (key in itemObj.map) {
            obj = itemObj.get(key);
            if (obj instanceof Dict) {
              if (isRecursionAllowedFor(obj)) {
                queue.push({target: dereferenced, key: key, obj: obj});
              } else {
                dereferenced[key] = itemObj.getRaw(key);
              }
            } else {
              dereferenced[key] = obj;
            }
          }
          if (objId) {
            processed[objId] = dereferenced;
          }
          item.target[item.key] = dereferenced;
        }
        return all;
      }
docs: creates new map and dereferences all Refs