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 ASCII shift cipher alphabet",
              req=False,
              default="""\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f""",
          ),
          "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/ascii_shift.py
imports: from typing import Dict, List, Optional
  import cipheycore
  import logging
  from rich.logging import RichHandler
  from ciphey.iface import Config, Cracker, CrackInfo, CrackResult, ParamSpec, registry
label_desc: Use image node_id 4 for calling the Ascii_shift obj's underlying member method code with example usage: obj.getParams() and returns: dict