          logger.debug("flow: %s", retval)
          return retval
  
      @staticmethod
      def _get_plugin_type_and_index(flow_phase):
          """ Obtain the plugin type and index for the plugin for the given flow phase.
  
          When multiple plugins for the same phase are allowed (e.g. Mask) this will return
          the plugin type and the index of the plugin required. If only one plugin is allowed
          then the plugin type will be returned and the index will be ``None``.
 
</s> remove         idx = flow_phase.split("_")[-1]
        if idx.isdigit():
            idx = int(idx)
 </s> add         sidx = flow_phase.split("_")[-1]
        if sidx.isdigit():
            idx: Optional[int] = int(sidx) </s> remove     def get_converter(category, name, disable_logging=False):
 </s> add     def get_converter(category: str, name: str, disable_logging: bool = False) -> Callable: </s> remove     def launch(self):
 </s> add     def launch(self) -> None: </s> remove         extractor_type: {'aligner', 'detector', 'masker'}
 </s> add         extractor_type: {'align', 'detect', 'mask'} </s> remove     def passes(self):
 </s> add     def passes(self) -> int:
    def _get_plugin_type_and_index(flow_phase: str) -> Tuple[str, Optional[int]]:
          logger.debug("flow: %s", retval)
          return retval
  
      @staticmethod
    def _get_plugin_type_and_index(flow_phase: str) -> Tuple[str, Optional[int]]:
          """ Obtain the plugin type and index for the plugin for the given flow phase.
  
          When multiple plugins for the same phase are allowed (e.g. Mask) this will return
          the plugin type and the index of the plugin required. If only one plugin is allowed
          then the plugin type will be returned and the index will be ``None``.
keep keep keep keep replace keep keep keep keep keep
 extract: Add batch processing mode 
plugins/extract/pipeline.py