  
          logger.info("Batch mode selected. Processing frames: %s",
                      [os.path.basename(frame) for frame in frames])
  
          return dict(alignments_file=cast(List[Optional[str]], alignments),
                      frames_dir=cast(List[Optional[str]], frames),
                      faces_dir=faces)
  
      def _get_locations(self) -> Dict[str, List[Optional[str]]]:
          """ Obtain the full path to any frame, face and alignments input locations for the
          selected job when running in batch mode. If not running in batch mode, then the original
          passed in values are returned in lists
 
</s> remove     def _get_locations(self) -> Dict[str, List[Optional[str]]]:
 </s> add     def _get_locations(self) -> dict[str, list[str | None]]: </s> remove         retval = dict(alignments_file=alignments,
                      faces_dir=[None for _ in range(len(alignments))],
                      frames_dir=[None for _ in range(len(alignments))])
 </s> add         retval = {"alignments_file": alignments,
                  "faces_dir": [None for _ in range(len(alignments))],
                  "frames_dir": [None for _ in range(len(alignments))]} </s> remove     def _get_alignments_locations(self) -> Dict[str, List[Optional[str]]]:
 </s> add     def _get_alignments_locations(self) -> dict[str, list[str | None]]: </s> remove     def _get_input_locations(self) -> List[str]:
 </s> add     def _get_input_locations(self) -> list[str]: </s> remove     def _get_input_locations(self) -> List[str]:
 </s> add     def _get_input_locations(self) -> list[str]:
        return {"alignments_file": T.cast(list[str | None], alignments),
                "frames_dir": T.cast(list[str | None], frames),
                "faces_dir": faces}
  
          logger.info("Batch mode selected. Processing frames: %s",
                      [os.path.basename(frame) for frame in frames])
  
        return {"alignments_file": T.cast(list[str | None], alignments),
                "frames_dir": T.cast(list[str | None], frames),
                "faces_dir": faces}
        return {"alignments_file": T.cast(list[str | None], alignments),
                "frames_dir": T.cast(list[str | None], frames),
                "faces_dir": faces}
        return {"alignments_file": T.cast(list[str | None], alignments),
                "frames_dir": T.cast(list[str | None], frames),
                "faces_dir": faces}
  
      def _get_locations(self) -> Dict[str, List[Optional[str]]]:
          """ Obtain the full path to any frame, face and alignments input locations for the
          selected job when running in batch mode. If not running in batch mode, then the original
          passed in values are returned in lists
keep keep keep keep replace replace replace keep keep keep keep keep
 Rebase code (#1326)

* Remove tensorflow_probability requirement

* setup.py - fix progress bars

* requirements.txt: Remove pre python 3.9 packages

* update apple requirements.txt

* update INSTALL.md

* Remove python<3.9 code

* setup.py - fix Windows Installer

* typing: python3.9 compliant

* Update pytest and readthedocs python versions

* typing fixes

* Python Version updates
  - Reduce max version to 3.10
  - Default to 3.10 in installers
  - Remove incompatible 3.11 tests

* Update dependencies

* Downgrade imageio dep for Windows

* typing: merge optional unions and fixes

* Updates
  - min python version 3.10
  - typing to python 3.10 spec
  - remove pre-tf2.10 code
  - Add conda tests

* train: re-enable optimizer saving

* Update dockerfiles

* Update setup.py
  - Apple Conda deps to setup.py
  - Better Cuda + dependency handling

* bugfix: Patch logging to prevent Autograph errors

* Update dockerfiles

* Setup.py - Setup.py - stdout to utf-8

* Add more OSes to github Actions

* suppress mac-os end to end test 
tools/alignments/alignments.py