function fbtCallsite(
  inputTable: FbtRuntimeInput,
  inputArgs: ?FbtTableArgs,
  options: ?FbtInputOpts,
): Fbt {
  // TODO T61652022: Remove this when no longer used in fbsource
  // $FlowFixMe[sketchy-null-string]
  if ((options?.hk || options?.ehk) && jsonExportMode) {
    /* $FlowFixMe[incompatible-return] : breaking typing because this should
     * never happen */
    return {
      text: inputTable,
      fbt: true,
      hashKey: options.hk,
    };
  }

  // Adapt the input payload to the translated table and arguments we expect
  //
  // WWW: The payload is ready, as-is, and is pre-translated.
  //
  // RN: we look up our translated table via the hash key (options.hk) and
  //     flattened enum hash key (options.ehk), which partially resolves the
  //     translation for the enums (should they exist).
  //
  // OSS: The table is the English payload, and, by default, we lookup the
  //      translated payload via FbtTranslations
  let {args, table: pattern} = FbtHooks.getTranslatedInput({
    table: inputTable,
    args: inputArgs,
    options,
  });

  // [fbt_impressions]
  // If this is a string literal (no tokens to substitute) then 'args' is empty
  // and the logic will skip the table traversal.

  // [table traversal]
  // At this point we assume that table is a hash (possibly nested) that we
  // need to traverse in order to pick the correct string, based on the
  // args that follow.
  let allSubstitutions: {[string]: mixed} = {};

  if (pattern.__vcg != null) {
    args = args || [];
    const {GENDER} = FbtHooks.getViewerContext();
    const variation = getGenderVariations(GENDER);
    args.unshift(FbtTableAccessor.getGenderResult(variation, null, GENDER));
  }

  const tokens: Array<FbtTableKey> = [];
  if (args) {
    if (typeof pattern !== 'string') {
      // On mobile, table can be accessed at the native layer when fetching
      // translations. If pattern is not a string here, table has not been accessed
      // $FlowFixMe[incompatible-type]
      pattern = FbtTable.access(pattern, args, 0, tokens);
    }

    allSubstitutions = getAllSubstitutions(args);
    invariant(pattern !== null, 'Table access failed');
  }
fbt._() iterates through all indices provided in `args` and accesses
the relevant entry in the `table` resulting in the appropriate
pattern string.  It then substitutes all relevant substitutions.

@param inputTable - Example: {
  "singular": "You have a cat in a photo album named {title}",
  "plural": "You have cats in a photo album named {title}"
}
-or-
{
  "singular": ["You have a cat in a photo album named {title}", <hash>],
  "plural": ["You have cats in a photo album named {title}", <hash>]
}

or table can simply be a pattern string:
  "You have a cat in a photo album named {title}"
-or-
   ["You have a cat in a photo album named {title}", <hash>]

@param inputArgs - arguments from which to pull substitutions
   Example: [["singular", null], [null, {title: "felines!"}]]

@param options - options for runtime
translation dictionary access. hk stands for hash key which is used to look
up translated payload in React Native. ehk stands for enum hash key which
contains a structured enums to hash keys map which will later be traversed
to look up enum-less translated payload.