'Opens a bunch of urns efficiently.'

def MultiOpen(self, urns, mode='rw', token=None, aff4_type=None, age=NEWEST_TIME, follow_symlinks=True):

    if (token is None):
        token = data_store.default_token
    if (mode not in ['w', 'r', 'rw']):
        raise RuntimeError(('Invalid    mode    %s' % mode))
    symlinks = {}
    aff4_type = _ValidateAFF4Type(aff4_type)
    for (urn, values) in self.GetAttributes(urns, token=token, age=age):
        try:
            obj = self.Open(urn, mode=mode, token=token, local_cache={urn: values}, age=age, follow_symlinks=False)
            if aff4_type:
                obj.aff4_type = aff4_type
            if (follow_symlinks and isinstance(obj, AFF4Symlink)):
                target = obj.Get(obj.Schema.SYMLINK_TARGET)
                if (target is not None):
                    symlinks.setdefault(target, []).append(obj.urn)
            elif aff4_type:
                if isinstance(obj, aff4_type):
                    (yield obj)
            else:
                (yield obj)
        except IOError:
            pass
    if symlinks:
        for obj in self.MultiOpen(symlinks, mode=mode, token=token, aff4_type=aff4_type, age=age):
            to_link = symlinks[obj.urn]
            for additional_symlink in to_link[1:]:
                clone = obj.__class__(obj.urn, clone=obj)
                clone.symlink_urn = additional_symlink
                (yield clone)
            obj.symlink_urn = symlinks[obj.urn][0]
            (yield obj)
