              new_list.append([current_img, new_vals_list[new_val_index][1]])
  
          return new_list
  
      @staticmethod
      def find_images(input_dir):
          """ Return list of images at specified location """
          result = []
          extensions = [".jpg", ".png", ".jpeg"]
          for root, _, files in os.walk(input_dir):
              for file in files:
                  if os.path.splitext(file)[1].lower() in extensions:
                      result.append(os.path.join(root, file))
              break
          return result
  
      @classmethod
      def estimate_blur(cls, image, metadata=None):
          """ Estimate the amount of blur an image has with the variance of the Laplacian.
          Normalize by pixel number to offset the effect of image size on pixel gradients & variance.
 
</s> remove     @classmethod
    def estimate_blur(cls, image, metadata=None):
        """ Estimate the amount of blur an image has with the variance of the Laplacian.
        Normalize by pixel number to offset the effect of image size on pixel gradients & variance.
 </s> add     def _sort_file(self, source: str, destination: str) -> None:
        """ Copy or move a file based on whether 'keep original' has been selected and log changes
        if required. </s> remove         :param sorted_list: list that has been sorted by one of the sort
        methods.
        :param new_vals_list: list that has been loaded by a different method
        than the sorted_list.
        :return: list that is sorted in the same way as the input sorted list
        but the values corresponding to each image are from new_vals_list.
        """
        new_list = []
        # Make new list of just image paths to serve as an index
        val_index_list = [i[0] for i in new_vals_list]
        for i in tqdm(range(len(sorted_list)), desc="Splicing", file=sys.stdout):
            current_img = sorted_list[i] if isinstance(sorted_list[i], str) else sorted_list[i][0]
            new_val_index = val_index_list.index(current_img)
            new_list.append([current_img, new_vals_list[new_val_index][1]])

        return new_list
 </s> add         if self._args.log_changes:
            self._write_to_log(self._changes) </s> remove         image: :class:`numpy.ndarray`
            The face image to calculate blur for
        metadata: dict, optional
            The metadata for the face image or ``None`` if no metadata is available. If metadata is
            provided the face will be masked by the "components" mask prior to calculating blur.
            Default:``None``

        Returns
        -------
        float
            The estimated blur score for the face
 </s> add         source: str
            The full path to the source file that is being sorted
        destination: str
            The full path to where the source file should be moved/renamed </s> remove     @classmethod
    def estimate_blur_fft(cls, image, metadata=None):
        """ Estimate the amount of blur a fft filtered image has.
 </s> add         if self._args.log_changes:
            self._changes[source] = destination </s> remove         Parameters
        ----------
        image: :class:`numpy.ndarray`
            Use Fourier Transform to analyze the frequency characteristics of the masked
            face using 2D Discrete Fourier Transform (DFT) filter to find the frequency domain.
            A mean value is assigned to the magnitude spectrum and returns a blur score.
            Adapted from https://www.pyimagesearch.com/2020/06/15/
            opencv-fast-fourier-transform-fft-for-blur-detection-in-images-and-video-streams/
        metadata: dict, optional
            The metadata for the face image or ``None`` if no metadata is available. If metadata is
            provided the face will be masked by the "components" mask prior to calculating blur.
            Default:``None``
 </s> add     def _output_groups(self) -> None:
        """ Move the files to folders.
        logger.info("Done.")
              new_list.append([current_img, new_vals_list[new_val_index][1]])
  
          return new_list
  
        logger.info("Done.")
        logger.info("Done.")
        logger.info("Done.")
        logger.info("Done.")
        logger.info("Done.")
        logger.info("Done.")
        logger.info("Done.")
        logger.info("Done.")
        logger.info("Done.")
        logger.info("Done.")
        logger.info("Done.")
  
      @classmethod
      def estimate_blur(cls, image, metadata=None):
          """ Estimate the amount of blur an image has with the variance of the Laplacian.
          Normalize by pixel number to offset the effect of image size on pixel gradients & variance.
keep keep keep keep replace replace replace replace replace replace replace replace replace replace replace keep keep keep keep keep
 Overhaul sort:
  - Standardize image data reading and writing
  - Optimize loading (just one pass required)
  - Make all sort groups binnable (to greater or lesser results)
  - Add sort by pitch
  - Deprecate multiple options
  - linting, docs + locales 
tools/sort/sort.py