              # Set the initial batch so we always rotate from zero
              batch["initial_feed"] = batch["feed"].copy()
              return
  
          retval = dict()
          for img, faces, rotmat in zip(batch["initial_feed"], batch["prediction"], batch["rotmat"]):
              if faces.any():
                  image = np.zeros_like(img)
                  matrix = rotmat
              else:
 
</s> remove         self._faces_per_filename = dict()  # Tracking for recompiling face batches
 </s> add         self._faces_per_filename = {}  # Tracking for recompiling face batches </s> remove     orig_filename = "{}_{}.png".format(os.path.splitext(src_fname)[0], face_idx)
    meta = dict(alignments=detected_face.to_png_meta(),
                source=dict(alignments_version=alignments.version,
 </s> add     orig_filename = f"{os.path.splitext(src_fname)[0]}_{face_idx}.png"
    meta = PNGHeaderDict(alignments=detected_face.to_png_meta(),
                         source=PNGHeaderSourceDict(
                            alignments_version=alignments.version, </s> remove         retval = dict()
        for key in ("mask", "affine_matrix", "interpolator", "stored_size", "stored_centering"):
            val = getattr(self, self._attr_name(key))
            if isinstance(val, np.ndarray):
                retval[key] = val.tolist()
            else:
                retval[key] = val
        logger.trace({k: v if k != "mask" else type(v) for k, v in retval.items()})
        return retval
 </s> add         return self.to_dict(is_png=True) </s> remove         batch = dict()
 </s> add         batch = {} </s> remove             retval = bool(len(self._data.get(frame_name, dict()).get("faces", [])) > 1)
 </s> add             retval = bool(len(self._data.get(frame_name, {}).get("faces", [])) > 1)
        retval = {}
              # Set the initial batch so we always rotate from zero
              batch["initial_feed"] = batch["feed"].copy()
              return
  
        retval = {}
          for img, faces, rotmat in zip(batch["initial_feed"], batch["prediction"], batch["rotmat"]):
              if faces.any():
                  image = np.zeros_like(img)
                  matrix = rotmat
              else:
keep keep keep keep replace keep keep keep keep keep
 lib.align updates:
  - alignments.py
    - Add typed dicts for imported alignments
    - Explicitly check for presence of thumb value in alignments dict
    - linting
  - detected_face.py
    - Typing
    - Linting
    - Legacy support for pre-aligned face
    - Update dependencies to new property names 
plugins/extract/detect/_base.py