code: def process_records(records):
      
      changes = defaultdict(int)
      cascaded_update_records = set()
      cascaded_delete_records = set()
  
      for record in records:
          if record.change != ChangeType.deleted and record.object is None:
              # Skip entries which are not deletions but have no corresponding objects.
              # Probably they are updates for objects that got deleted afterwards.
              continue
          if record.change == ChangeType.created:
              assert record.type != EntryType.category
              changes[record.object] |= SimpleChange.created
          elif record.change == ChangeType.deleted:
              assert record.type != EntryType.category
              cascaded_delete_records.add(record)
          elif record.change in {ChangeType.moved, ChangeType.protection_changed}:
              cascaded_update_records.add(record)
          elif record.change == ChangeType.data_changed:
              assert record.type != EntryType.category
              changes[record.object] |= SimpleChange.updated
  
      for obj in _process_cascaded_category_contents(cascaded_update_records):
          changes[obj] |= SimpleChange.updated
  
      for obj in _process_cascaded_event_contents(cascaded_delete_records):
          changes[obj] |= SimpleChange.deleted
  
      return changes
docs: Converts queue entries into object changes.
  
      :param records: an iterable containing `LiveSyncQueueEntry` objects
      :return: a dict mapping object references to `SimpleChange` bitsets