          """
          logger.trace("blur_kernel: %s, threshold: %s", blur_kernel, threshold)
          if blur_type is not None:
              blur_kernel += 0 if blur_kernel == 0 or blur_kernel % 2 == 1 else 1
              self._blur["kernel"] = blur_kernel
              self._blur["type"] = blur_type
              self._blur["passes"] = blur_passes
          self._threshold = (threshold / 100.0) * 255.0
  
      def set_sub_crop(self,
                       source_offset: np.ndarray,
                       target_offset: np.ndarray,
 
</s> remove         logger.trace("blur_kernel: %s, threshold: %s", blur_kernel, threshold)
 </s> add         logger.trace("blur_kernel: %s, blur_type: %s, blur_passes: %s, ",  # type: ignore
                     "threshold: %s", blur_kernel, blur_type, blur_passes, threshold) </s> remove         logger.trace(retval)
 </s> add         logger.trace(retval)  # type: ignore </s> remove         if self._blur["kernel"] != 0:
            mask = BlurMask(self._blur["type"],
 </s> add         if self._blur_kernel != 0 and self._blur_type is not None:
            mask = BlurMask(self._blur_type, </s> remove         if self._threshold != 0.0 or self._blur["kernel"] != 0:
 </s> add         if self._threshold != 0.0 or self._blur_kernel != 0: </s> remove     def __init__(self, blur_type, mask, kernel, is_ratio=False, passes=1):
        logger.trace("Initializing %s: (blur_type: '%s', mask_shape: %s, kernel: %s, "
                     "is_ratio: %s, passes: %s)", self.__class__.__name__, blur_type, mask.shape,
                     kernel, is_ratio, passes)
        self._blur_type = blur_type.lower()
 </s> add     def __init__(self,
                 blur_type: Literal["gaussian", "normalized"],
                 mask: np.ndarray,
                 kernel: Union[int, float],
                 is_ratio: bool = False,
                 passes: int = 1) -> None:
        logger.trace("Initializing %s: (blur_type: '%s', mask_shape: %s, "  # type: ignore
                     "kernel: %s, is_ratio: %s, passes: %s)", self.__class__.__name__, blur_type,
                     mask.shape, kernel, is_ratio, passes)
        self._blur_type = blur_type
            self._blur_kernel = blur_kernel
            self._blur_type = blur_type
            self._blur_passes = blur_passes
          """
          logger.trace("blur_kernel: %s, threshold: %s", blur_kernel, threshold)
          if blur_type is not None:
              blur_kernel += 0 if blur_kernel == 0 or blur_kernel % 2 == 1 else 1
            self._blur_kernel = blur_kernel
            self._blur_type = blur_type
            self._blur_passes = blur_passes
            self._blur_kernel = blur_kernel
            self._blur_type = blur_type
            self._blur_passes = blur_passes
            self._blur_kernel = blur_kernel
            self._blur_type = blur_type
            self._blur_passes = blur_passes
          self._threshold = (threshold / 100.0) * 255.0
  
      def set_sub_crop(self,
                       source_offset: np.ndarray,
                       target_offset: np.ndarray,
keep keep keep keep replace replace 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 
lib/align/detected_face.py