code: def getParams() -> Optional[Dict[str, ParamSpec]]:
      return {
          "expected": ParamSpec(
              desc="The expected distribution of the plaintext",
              req=False,
              config_ref=["default_dist"],
          ),
          "group": ParamSpec(
              desc="An ordered sequence of chars that make up the caesar cipher alphabet",
              req=False,
              default="abcdefghijklmnopqrstuvwxyz",
          ),
          "lower": ParamSpec(
              desc="Whether or not the ciphertext should be converted to lowercase first",
              req=False,
              default=True,
          ),
          "p_value": ParamSpec(
              desc="The p-value to use for standard frequency analysis",
              req=False,
              default=0.01,
          )
          # TODO: add "filter" param
      }
  
file_path: Ciphey/ciphey/basemods/Crackers/caesar.py
imports: from distutils import util
  from typing import Dict, List, Optional, Union
  import cipheycore
  import logging
  from rich.logging import RichHandler
  from ciphey.common import fix_case
  from ciphey.iface import Config, Cracker, CrackInfo, CrackResult, ParamSpec, registry
label_desc: Use image node_id 4 for calling the Caesar obj's underlying member method code with example usage: obj.getParams() and returns: dict