{"version":3,"file":"index.cjs","sources":["../package.json","../src/ExtensionManager.ts","../src/modules/utils.ts","../src/modules/data/DataColumn.ts","../src/modules/data/utils.ts","../src/modules/data/DataCollection.ts","../src/modules/data/index.ts","../src/modules/plugin-api/KeyboardListenerAPI.ts","../src/modules/plugins.ts","../src/modules/plugin-api/AudioPlayer.ts","../src/modules/plugin-api/MediaAPI.ts","../src/modules/plugin-api/SimulationAPI.ts","../src/modules/plugin-api/TimeoutAPI.ts","../src/modules/plugin-api/index.ts","../src/modules/randomization.ts","../src/modules/turk.ts","../src/ProgressBar.ts","../src/timeline/index.ts","../src/timeline/util.ts","../src/timeline/TimelineNode.ts","../src/timeline/Trial.ts","../src/timeline/Timeline.ts","../src/JsPsych.ts","../src/migration.ts","../src/index.ts"],"sourcesContent":["{\n  \"name\": \"jspsych\",\n  \"version\": \"8.3.0\",\n  \"description\": \"Behavioral experiments in a browser\",\n  \"type\": \"module\",\n  \"main\": \"dist/index.cjs\",\n  \"exports\": {\n    \".\": {\n      \"import\": \"./dist/index.js\",\n      \"require\": \"./dist/index.cjs\"\n    },\n    \"./css/*\": \"./css/*\"\n  },\n  \"typings\": \"dist/index.d.ts\",\n  \"unpkg\": \"dist/index.browser.min.js\",\n  \"files\": [\n    \"src\",\n    \"dist\",\n    \"css\"\n  ],\n  \"source\": \"src/index.ts\",\n  \"scripts\": {\n    \"test\": \"jest\",\n    \"test:watch\": \"npm test -- --watch\",\n    \"tsc\": \"tsc\",\n    \"build:js\": \"rollup --config\",\n    \"build:styles\": \"webpack-cli\",\n    \"build\": \"run-p build:js build:styles\",\n    \"build:watch\": \"run-p \\\"build:js -- --watch\\\" \\\"build:styles watch\\\"\",\n    \"prepack\": \"cp ../../README.md .\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/jspsych/jsPsych.git\",\n    \"directory\": \"packages/jspsych\"\n  },\n  \"author\": \"Josh de Leeuw\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/jspsych/jsPsych/issues\"\n  },\n  \"homepage\": \"https://www.jspsych.org\",\n  \"dependencies\": {\n    \"auto-bind\": \"^4.0.0\",\n    \"random-words\": \"^1.1.1\",\n    \"seedrandom\": \"^3.0.5\",\n    \"type-fest\": \"^2.9.0\"\n  },\n  \"devDependencies\": {\n    \"@fontsource/open-sans\": \"4.5.3\",\n    \"@jspsych/config\": \"^3.3.4\",\n    \"@types/dom-mediacapture-record\": \"^1.0.11\",\n    \"base64-inline-loader\": \"^2.0.1\",\n    \"css-loader\": \"^6.6.0\",\n    \"mini-css-extract-plugin\": \"^2.5.3\",\n    \"npm-run-all\": \"^4.1.5\",\n    \"replace-in-file-webpack-plugin\": \"^1.0.6\",\n    \"sass\": \"^1.43.5\",\n    \"sass-loader\": \"^12.4.0\",\n    \"webpack\": \"^5.76.0\",\n    \"webpack-cli\": \"^4.9.2\",\n    \"webpack-remove-empty-scripts\": \"^0.7.2\"\n  }\n}\n","import { Class } from \"type-fest\";\n\nimport { JsPsychExtension, JsPsychExtensionInfo } from \"./modules/extensions\";\nimport { TrialExtensionsConfiguration } from \"./timeline\";\n\nexport type GlobalExtensionsConfiguration = Array<{\n  type: Class<JsPsychExtension>;\n  params?: Record<string, any>;\n}>;\n\nexport interface ExtensionManagerDependencies {\n  /**\n   * Given an extension class, create a new instance of it and return it.\n   */\n  instantiateExtension(extensionClass: Class<JsPsychExtension>): JsPsychExtension;\n}\n\nexport class ExtensionManager {\n  private static getExtensionNameByClass(extensionClass: Class<JsPsychExtension>) {\n    return (extensionClass[\"info\"] as JsPsychExtensionInfo).name;\n  }\n\n  public readonly extensions: Record<string, JsPsychExtension>;\n\n  constructor(\n    private dependencies: ExtensionManagerDependencies,\n    private extensionsConfiguration: GlobalExtensionsConfiguration\n  ) {\n    this.extensions = Object.fromEntries(\n      extensionsConfiguration.map((extension) => [\n        ExtensionManager.getExtensionNameByClass(extension.type),\n        this.dependencies.instantiateExtension(extension.type),\n      ])\n    );\n  }\n\n  private getExtensionInstanceByClass(extensionClass: Class<JsPsychExtension>) {\n    return this.extensions[ExtensionManager.getExtensionNameByClass(extensionClass)];\n  }\n\n  public async initializeExtensions() {\n    await Promise.all(\n      this.extensionsConfiguration.map(({ type, params = {} }) => {\n        this.getExtensionInstanceByClass(type).initialize(params);\n\n        const extensionInfo = type[\"info\"] as JsPsychExtensionInfo;\n\n        if (!(\"version\" in extensionInfo) && !(\"data\" in extensionInfo)) {\n          console.warn(\n            extensionInfo[\"name\"],\n            \"is missing the 'version' and 'data' fields. Please update extension as 'version' and 'data' will be required in v9. See https://www.jspsych.org/latest/developers/extension-development/ for more details.\"\n          );\n        } else if (!(\"version\" in extensionInfo)) {\n          console.warn(\n            extensionInfo[\"name\"],\n            \"is missing the 'version' field. Please update extension as 'version' will be required in v9. See https://www.jspsych.org/latest/developers/extension-development/ for more details.\"\n          );\n        } else if (!(\"data\" in extensionInfo)) {\n          console.warn(\n            extensionInfo[\"name\"],\n            \"is missing the 'data' field. Please update extension as 'data' will be required in v9. See https://www.jspsych.org/latest/developers/extension-development/ for more details.\"\n          );\n        }\n      })\n    );\n  }\n\n  public onStart(trialExtensionsConfiguration: TrialExtensionsConfiguration = []) {\n    for (const { type, params } of trialExtensionsConfiguration) {\n      this.getExtensionInstanceByClass(type)?.on_start(params);\n    }\n  }\n\n  public onLoad(trialExtensionsConfiguration: TrialExtensionsConfiguration = []) {\n    for (const { type, params } of trialExtensionsConfiguration) {\n      this.getExtensionInstanceByClass(type)?.on_load(params);\n    }\n  }\n\n  public async onFinish(\n    trialExtensionsConfiguration: TrialExtensionsConfiguration = []\n  ): Promise<Record<string, any>> {\n    const results = await Promise.all(\n      trialExtensionsConfiguration.map(({ type, params }) =>\n        Promise.resolve(this.getExtensionInstanceByClass(type)?.on_finish(params))\n      )\n    );\n\n    const extensionInfos = trialExtensionsConfiguration.length\n      ? {\n          extension_type: trialExtensionsConfiguration.map(({ type }) => type[\"info\"].name),\n          extension_version: trialExtensionsConfiguration.map(({ type }) => type[\"info\"].version),\n        }\n      : {};\n\n    results.unshift(extensionInfos);\n\n    return Object.assign({}, ...results);\n  }\n}\n","/**\n * Finds all of the unique items in an array.\n * @param arr The array to extract unique values from\n * @returns An array with one copy of each unique item in `arr`\n */\nexport function unique(arr: Array<any>) {\n  return [...new Set(arr)];\n}\n\nexport function deepCopy(obj) {\n  if (!obj) return obj;\n  let out;\n  if (Array.isArray(obj)) {\n    out = [];\n    for (const x of obj) {\n      out.push(deepCopy(x));\n    }\n    return out;\n  } else if (typeof obj === \"object\" && obj !== null) {\n    out = {};\n    for (const key in obj) {\n      if (obj.hasOwnProperty(key)) {\n        out[key] = deepCopy(obj[key]);\n      }\n    }\n    return out;\n  } else {\n    return obj;\n  }\n}\n\n/**\n * Merges two objects, recursively.\n * @param obj1 Object to merge\n * @param obj2 Object to merge\n */\nexport function deepMerge(obj1: any, obj2: any): any {\n  let merged = {};\n  for (const key in obj1) {\n    if (obj1.hasOwnProperty(key)) {\n      if (typeof obj1[key] === \"object\" && obj2.hasOwnProperty(key)) {\n        merged[key] = deepMerge(obj1[key], obj2[key]);\n      } else {\n        merged[key] = obj1[key];\n      }\n    }\n  }\n  for (const key in obj2) {\n    if (obj2.hasOwnProperty(key)) {\n      if (!merged.hasOwnProperty(key)) {\n        merged[key] = obj2[key];\n      } else if (typeof obj2[key] === \"object\") {\n        merged[key] = deepMerge(merged[key], obj2[key]);\n      } else {\n        merged[key] = obj2[key];\n      }\n    }\n  }\n\n  return merged;\n}\n","export class DataColumn {\n  constructor(public values = []) {}\n\n  sum() {\n    let s = 0;\n    for (const v of this.values) {\n      s += v;\n    }\n    return s;\n  }\n\n  mean() {\n    let sum = 0;\n    let count = 0;\n    for (const value of this.values) {\n      if (typeof value !== \"undefined\" && value !== null) {\n        sum += value;\n        count++;\n      }\n    }\n    if (count === 0) {\n      return undefined;\n    }\n    return sum / count;\n  }\n\n  median() {\n    if (this.values.length === 0) {\n      return undefined;\n    }\n    const numbers = this.values.slice(0).sort(function (a, b) {\n      return a - b;\n    });\n    const middle = Math.floor(numbers.length / 2);\n    const isEven = numbers.length % 2 === 0;\n    return isEven ? (numbers[middle] + numbers[middle - 1]) / 2 : numbers[middle];\n  }\n\n  min() {\n    return Math.min.apply(null, this.values);\n  }\n\n  max() {\n    return Math.max.apply(null, this.values);\n  }\n\n  count() {\n    return this.values.length;\n  }\n\n  variance() {\n    const mean = this.mean();\n    let sum_square_error = 0;\n    for (const x of this.values) {\n      sum_square_error += Math.pow(x - mean, 2);\n    }\n    const mse = sum_square_error / (this.values.length - 1);\n    return mse;\n  }\n\n  sd() {\n    const mse = this.variance();\n    const rmse = Math.sqrt(mse);\n    return rmse;\n  }\n\n  frequencies() {\n    const unique = {};\n    for (const x of this.values) {\n      if (typeof unique[x] === \"undefined\") {\n        unique[x] = 1;\n      } else {\n        unique[x]++;\n      }\n    }\n    return unique;\n  }\n\n  all(eval_fn) {\n    for (const x of this.values) {\n      if (!eval_fn(x)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  subset(eval_fn) {\n    const out = [];\n    for (const x of this.values) {\n      if (eval_fn(x)) {\n        out.push(x);\n      }\n    }\n    return new DataColumn(out);\n  }\n}\n","// private function to save text file on local drive\nexport function saveTextToFile(textstr: string, filename: string) {\n  const blobToSave = new Blob([textstr], {\n    type: \"text/plain\",\n  });\n  let blobURL = \"\";\n  if (typeof window.webkitURL !== \"undefined\") {\n    blobURL = window.webkitURL.createObjectURL(blobToSave);\n  } else {\n    blobURL = window.URL.createObjectURL(blobToSave);\n  }\n\n  const link = document.createElement(\"a\");\n  link.id = \"jspsych-download-as-text-link\";\n  link.style.display = \"none\";\n  link.download = filename;\n  link.href = blobURL;\n  link.click();\n}\n\n// this function based on code suggested by StackOverflow users:\n// http://stackoverflow.com/users/64741/zachary\n// http://stackoverflow.com/users/317/joseph-sturtevant\n\nexport function JSON2CSV(objArray) {\n  const array = typeof objArray != \"object\" ? JSON.parse(objArray) : objArray;\n  let line = \"\";\n  let result = \"\";\n  const columns = [];\n\n  for (const row of array) {\n    for (const key in row) {\n      let keyString = key + \"\";\n      keyString = '\"' + keyString.replace(/\"/g, '\"\"') + '\",';\n      if (!columns.includes(key)) {\n        columns.push(key);\n        line += keyString;\n      }\n    }\n  }\n\n  line = line.slice(0, -1); // removes last comma\n  result += line + \"\\r\\n\";\n\n  for (const row of array) {\n    line = \"\";\n    for (const col of columns) {\n      let value = typeof row[col] === \"undefined\" ? \"\" : row[col];\n      if (typeof value == \"object\") {\n        value = JSON.stringify(value);\n      }\n      const valueString = value + \"\";\n      line += '\"' + valueString.replace(/\"/g, '\"\"') + '\",';\n    }\n\n    line = line.slice(0, -1);\n    result += line + \"\\r\\n\";\n  }\n\n  return result;\n}\n\n// this function is modified from StackOverflow:\n// http://stackoverflow.com/posts/3855394\n\nexport function getQueryString() {\n  const a = window.location.search.substr(1).split(\"&\");\n  const b = {};\n  for (let i = 0; i < a.length; ++i) {\n    const p = a[i].split(\"=\", 2);\n    if (p.length == 1) b[p[0]] = \"\";\n    else b[p[0]] = decodeURIComponent(p[1].replace(/\\+/g, \" \"));\n  }\n  return b;\n}\n","import { deepCopy } from \"../utils\";\nimport { DataColumn } from \"./DataColumn\";\nimport { JSON2CSV, saveTextToFile } from \"./utils\";\n\nexport class DataCollection {\n  private trials: any[];\n\n  constructor(data = []) {\n    this.trials = data;\n  }\n\n  push(new_data) {\n    this.trials.push(new_data);\n    return this;\n  }\n\n  join(other_data_collection: DataCollection) {\n    this.trials = this.trials.concat(other_data_collection.values());\n    return this;\n  }\n\n  top() {\n    if (this.trials.length <= 1) {\n      return this;\n    } else {\n      return new DataCollection([this.trials[this.trials.length - 1]]);\n    }\n  }\n\n  /**\n   * Queries the first n elements in a collection of trials.\n   *\n   * @param n A positive integer of elements to return. A value of\n   *          n that is less than 1 will throw an error.\n   *\n   * @return First n objects of a collection of trials. If fewer than\n   *         n trials are available, the trials.length elements will\n   *         be returned.\n   *\n   */\n  first(n = 1) {\n    if (n < 1) {\n      throw `You must query with a positive nonzero integer. Please use a\n               different value for n.`;\n    }\n    if (this.trials.length === 0) return new DataCollection();\n    if (n > this.trials.length) n = this.trials.length;\n    return new DataCollection(this.trials.slice(0, n));\n  }\n\n  /**\n   * Queries the last n elements in a collection of trials.\n   *\n   * @param n A positive integer of elements to return. A value of\n   *          n that is less than 1 will throw an error.\n   *\n   * @return Last n objects of a collection of trials. If fewer than\n   *         n trials are available, the trials.length elements will\n   *         be returned.\n   *\n   */\n  last(n = 1) {\n    if (n < 1) {\n      throw `You must query with a positive nonzero integer. Please use a\n               different value for n.`;\n    }\n    if (this.trials.length === 0) return new DataCollection();\n    if (n > this.trials.length) n = this.trials.length;\n    return new DataCollection(this.trials.slice(this.trials.length - n, this.trials.length));\n  }\n\n  values() {\n    return this.trials;\n  }\n\n  count() {\n    return this.trials.length;\n  }\n\n  readOnly() {\n    return new DataCollection(deepCopy(this.trials));\n  }\n\n  addToAll(properties) {\n    for (const trial of this.trials) {\n      Object.assign(trial, properties);\n    }\n    return this;\n  }\n\n  addToLast(properties) {\n    if (this.trials.length > 0) {\n      Object.assign(this.trials[this.trials.length - 1], properties);\n    }\n    return this;\n  }\n\n  filter(filters) {\n    // [{p1: v1, p2:v2}, {p1:v2}]\n    // {p1: v1}\n    let f;\n    if (!Array.isArray(filters)) {\n      f = deepCopy([filters]);\n    } else {\n      f = deepCopy(filters);\n    }\n\n    const filtered_data = [];\n    for (const trial of this.trials) {\n      let keep = false;\n      for (const filter of f) {\n        let match = true;\n        for (const key of Object.keys(filter)) {\n          if (typeof trial[key] !== \"undefined\" && trial[key] === filter[key]) {\n            // matches on this key!\n          } else {\n            match = false;\n          }\n        }\n        if (match) {\n          keep = true;\n          break;\n        } // can break because each filter is OR.\n      }\n      if (keep) {\n        filtered_data.push(trial);\n      }\n    }\n\n    return new DataCollection(filtered_data);\n  }\n\n  filterCustom(fn) {\n    return new DataCollection(this.trials.filter(fn));\n  }\n\n  filterColumns(columns: Array<string>) {\n    return new DataCollection(\n      this.trials.map((trial) =>\n        Object.fromEntries(columns.filter((key) => key in trial).map((key) => [key, trial[key]]))\n      )\n    );\n  }\n\n  select(column) {\n    const values = [];\n    for (const trial of this.trials) {\n      if (typeof trial[column] !== \"undefined\") {\n        values.push(trial[column]);\n      }\n    }\n    return new DataColumn(values);\n  }\n\n  ignore(columns) {\n    if (!Array.isArray(columns)) {\n      columns = [columns];\n    }\n    const o = deepCopy(this.trials);\n    for (const trial of o) {\n      for (const delete_key of columns) {\n        delete trial[delete_key];\n      }\n    }\n    return new DataCollection(o);\n  }\n\n  uniqueNames() {\n    const names = [];\n\n    for (const trial of this.trials) {\n      for (const key of Object.keys(trial)) {\n        if (!names.includes(key)) {\n          names.push(key);\n        }\n      }\n    }\n\n    return names;\n  }\n\n  csv() {\n    return JSON2CSV(this.trials);\n  }\n\n  json(pretty = false) {\n    if (pretty) {\n      return JSON.stringify(this.trials, null, \"\\t\");\n    }\n    return JSON.stringify(this.trials);\n  }\n\n  localSave(format, filename) {\n    format = format.toLowerCase();\n    let data_string;\n    if (format === \"json\") {\n      data_string = this.json();\n    } else if (format === \"csv\") {\n      data_string = this.csv();\n    } else {\n      throw new Error('Invalid format specified for localSave. Must be \"json\" or \"csv\".');\n    }\n\n    saveTextToFile(data_string, filename);\n  }\n}\n","import { TrialResult } from \"../../timeline\";\nimport { Trial } from \"../../timeline/Trial\";\nimport { DataCollection } from \"./DataCollection\";\nimport { getQueryString } from \"./utils\";\n\nexport type InteractionEvent = \"blur\" | \"focus\" | \"fullscreenenter\" | \"fullscreenexit\";\n\nexport interface InteractionRecord {\n  event: InteractionEvent;\n  trial: number;\n  time: number;\n}\n\n/**\n * Functions and options needed by the `JsPsychData` module\n */\nexport interface JsPsychDataDependencies {\n  /**\n   * Returns progress information for interaction records.\n   */\n  getProgress: () => { trial: number; time: number };\n\n  onInteractionRecordAdded: (record: InteractionRecord) => void;\n\n  getDisplayElement: () => HTMLElement;\n}\n\nexport class JsPsychData {\n  private results: DataCollection;\n  private resultToTrialMap: WeakMap<TrialResult, Trial>;\n\n  /** Browser interaction event data */\n  private interactionRecords: DataCollection;\n\n  /** Data properties for all trials */\n  private dataProperties = {};\n\n  // cache the query_string\n  private query_string;\n\n  constructor(private dependencies: JsPsychDataDependencies) {\n    this.reset();\n  }\n\n  reset() {\n    this.results = new DataCollection();\n    this.resultToTrialMap = new WeakMap<TrialResult, Trial>();\n    this.interactionRecords = new DataCollection();\n  }\n\n  get() {\n    return this.results;\n  }\n\n  getInteractionData() {\n    return this.interactionRecords;\n  }\n\n  write(trial: Trial) {\n    const result = trial.getResult();\n    Object.assign(result, this.dataProperties);\n    this.results.push(result);\n    this.resultToTrialMap.set(result, trial);\n  }\n\n  addProperties(properties) {\n    // first, add the properties to all data that's already stored\n    this.results.addToAll(properties);\n\n    // now add to list so that it gets appended to all future data\n    this.dataProperties = Object.assign({}, this.dataProperties, properties);\n  }\n\n  addDataToLastTrial(data) {\n    this.results.addToLast(data);\n  }\n\n  getLastTrialData() {\n    return this.results.top();\n  }\n\n  getLastTimelineData() {\n    const lastResult = this.getLastTrialData().values()[0];\n\n    return new DataCollection(\n      lastResult ? this.resultToTrialMap.get(lastResult).parent.getResults() : []\n    );\n  }\n\n  displayData(format = \"json\") {\n    format = format.toLowerCase();\n    if (format !== \"json\" && format !== \"csv\") {\n      console.log(\"Invalid format declared for displayData function. Using json as default.\");\n      format = \"json\";\n    }\n\n    const dataContainer = document.createElement(\"pre\");\n    dataContainer.id = \"jspsych-data-display\";\n    dataContainer.textContent = format === \"json\" ? this.results.json(true) : this.results.csv();\n\n    this.dependencies.getDisplayElement().replaceChildren(dataContainer);\n  }\n\n  urlVariables() {\n    if (typeof this.query_string == \"undefined\") {\n      this.query_string = getQueryString();\n    }\n    return this.query_string;\n  }\n\n  getURLVariable(whichvar) {\n    return this.urlVariables()[whichvar];\n  }\n\n  private addInteractionRecord(event: InteractionEvent) {\n    const record: InteractionRecord = { event, ...this.dependencies.getProgress() };\n    this.interactionRecords.push(record);\n    this.dependencies.onInteractionRecordAdded(record);\n  }\n\n  private interactionListeners = {\n    blur: () => {\n      this.addInteractionRecord(\"blur\");\n    },\n    focus: () => {\n      this.addInteractionRecord(\"focus\");\n    },\n    fullscreenchange: () => {\n      this.addInteractionRecord(\n        // @ts-expect-error\n        document.isFullScreen ||\n          // @ts-expect-error\n          document.webkitIsFullScreen ||\n          // @ts-expect-error\n          document.mozIsFullScreen ||\n          document.fullscreenElement\n          ? \"fullscreenenter\"\n          : \"fullscreenexit\"\n      );\n    },\n  };\n\n  createInteractionListeners() {\n    window.addEventListener(\"blur\", this.interactionListeners.blur);\n    window.addEventListener(\"focus\", this.interactionListeners.focus);\n\n    document.addEventListener(\"fullscreenchange\", this.interactionListeners.fullscreenchange);\n    document.addEventListener(\"mozfullscreenchange\", this.interactionListeners.fullscreenchange);\n    document.addEventListener(\"webkitfullscreenchange\", this.interactionListeners.fullscreenchange);\n  }\n\n  removeInteractionListeners() {\n    window.removeEventListener(\"blur\", this.interactionListeners.blur);\n    window.removeEventListener(\"focus\", this.interactionListeners.focus);\n\n    document.removeEventListener(\"fullscreenchange\", this.interactionListeners.fullscreenchange);\n    document.removeEventListener(\"mozfullscreenchange\", this.interactionListeners.fullscreenchange);\n    document.removeEventListener(\n      \"webkitfullscreenchange\",\n      this.interactionListeners.fullscreenchange\n    );\n  }\n}\n","import autoBind from \"auto-bind\";\n\nexport type KeyboardListener = (e: KeyboardEvent) => void;\n\nexport type ValidResponses = string[] | \"ALL_KEYS\" | \"NO_KEYS\";\n\nexport interface GetKeyboardResponseOptions {\n  callback_function: any;\n  valid_responses?: ValidResponses;\n  rt_method?: \"performance\" | \"audio\";\n  persist?: boolean;\n  audio_context?: AudioContext;\n  audio_context_start_time?: number;\n  allow_held_key?: boolean;\n  minimum_valid_rt?: number;\n  wait_for_key_release?: boolean;\n}\n\ninterface PendingRelease {\n  /**\n   * physical key (`KeyboardEvent.code`) whose release is being awaited; falls back to the\n   * case-normalized key value for synthetic events that do not set `code`.\n   */\n  code: string;\n  key: string;\n  rt: number;\n  callback_function: any;\n}\n\nexport class KeyboardListenerAPI {\n  constructor(\n    private getRootElement: () => Element | undefined,\n    private areResponsesCaseSensitive: boolean = false,\n    private minimumValidRt = 0\n  ) {\n    autoBind(this);\n    this.registerRootListeners();\n  }\n\n  private listeners = new Set<KeyboardListener>();\n  private heldKeys = new Set<string>();\n  private keyDownTimestamps = new Map<string, number>();\n  private pendingReleases = new Map<KeyboardListener, PendingRelease>();\n\n  private areRootListenersRegistered = false;\n\n  /**\n   * If not previously done and `this.getRootElement()` returns an element, adds the root key\n   * listeners to that element.\n   */\n  private registerRootListeners() {\n    if (!this.areRootListenersRegistered) {\n      const rootElement = this.getRootElement();\n      if (rootElement) {\n        rootElement.addEventListener(\"keydown\", this.rootKeydownListener);\n        rootElement.addEventListener(\"keyup\", this.rootKeyupListener);\n        // When the window loses focus the browser stops delivering keyup events, so a key held at\n        // that moment would otherwise never be seen as released. Treat a blur as releasing all keys.\n        window.addEventListener(\"blur\", this.rootBlurListener);\n        this.areRootListenersRegistered = true;\n      }\n    }\n  }\n\n  private rootKeydownListener(e: KeyboardEvent) {\n    const physicalKey = this.getPhysicalKey(e);\n    // Record the press timestamp only for the initial keydown, not for key-repeat events of a key\n    // that is already held down (the timestamp is only removed again by the key's keyup).\n    if (!this.keyDownTimestamps.has(physicalKey)) {\n      this.keyDownTimestamps.set(physicalKey, performance.now());\n    }\n    // Iterate over a static copy of the listeners set because listeners might add other listeners\n    // that we do not want to be included in the loop\n    for (const listener of [...this.listeners]) {\n      listener(e);\n    }\n    this.heldKeys.add(this.toLowerCaseIfInsensitive(e.key));\n  }\n\n  private toLowerCaseIfInsensitive(string: string) {\n    return this.areResponsesCaseSensitive ? string : string.toLowerCase();\n  }\n\n  /**\n   * identifies physical key of a keyboard event, for matching a keydown event with\n   * its corresponding keyup event, in the case of a change of shift state while\n   * the key is being held.\n   */\n  private getPhysicalKey(e: KeyboardEvent) {\n    return e.code || this.toLowerCaseIfInsensitive(e.key);\n  }\n\n  private rootKeyupListener(e: KeyboardEvent) {\n    const physicalKey = this.getPhysicalKey(e);\n\n    // match pending releases by physical key so that a change in shift state while the key is held\n    // (which changes `e.key`, but not `e.code`) cannot orphan a pending release.\n    for (const [listener, pending] of this.pendingReleases) {\n      if (pending.code === physicalKey) {\n        const pressTimestamp = this.keyDownTimestamps.get(physicalKey);\n        const rt_key_duration =\n          pressTimestamp === undefined ? null : Math.round(performance.now() - pressTimestamp);\n        this.pendingReleases.delete(listener);\n        // report the key as it was at keydown, so that the deferred and immediate paths record\n        // the same response for the same key press\n        pending.callback_function({ key: pending.key, rt: pending.rt, rt_key_duration });\n      }\n    }\n\n    this.keyDownTimestamps.delete(physicalKey);\n    this.heldKeys.delete(this.toLowerCaseIfInsensitive(e.key));\n  }\n\n  /**\n   * When the window loses focus (`blur`), the browser will not deliver the `keyup` events for keys\n   * that are currently held, which would otherwise leave stale entries in `heldKeys` and\n   * `keyDownTimestamps` (making a key look permanently held) and orphan any pending releases. Treat\n   * the blur as a release of every held key: resolve each pending release with\n   * `rt_key_duration: null`, since the true hold duration cannot be measured once the release is\n   * never observed, then clear the tracked key state.\n   */\n  private rootBlurListener() {\n    for (const [listener, pending] of this.pendingReleases) {\n      this.pendingReleases.delete(listener);\n      pending.callback_function({ key: pending.key, rt: pending.rt, rt_key_duration: null });\n    }\n    this.heldKeys.clear();\n    this.keyDownTimestamps.clear();\n  }\n\n  private isResponseValid(validResponses: ValidResponses, allowHeldKey: boolean, key: string) {\n    // check if key was already held down\n    if (!allowHeldKey && this.heldKeys.has(key)) {\n      return false;\n    }\n\n    if (validResponses === \"ALL_KEYS\") {\n      return true;\n    }\n    if (validResponses === \"NO_KEYS\") {\n      return false;\n    }\n\n    return validResponses.includes(key);\n  }\n\n  getKeyboardResponse({\n    callback_function,\n    valid_responses = \"ALL_KEYS\",\n    rt_method = \"performance\",\n    persist,\n    audio_context,\n    audio_context_start_time,\n    allow_held_key = false,\n    minimum_valid_rt = this.minimumValidRt,\n    wait_for_key_release = false,\n  }: GetKeyboardResponseOptions) {\n    if (rt_method !== \"performance\" && rt_method !== \"audio\") {\n      console.log(\n        'Invalid RT method specified in getKeyboardResponse. Defaulting to \"performance\" method.'\n      );\n      rt_method = \"performance\";\n    }\n\n    const usePerformanceRt = rt_method === \"performance\";\n    const startTime = usePerformanceRt ? performance.now() : audio_context_start_time * 1000;\n\n    this.registerRootListeners();\n\n    if (!this.areResponsesCaseSensitive && typeof valid_responses !== \"string\") {\n      valid_responses = valid_responses.map((r) => r.toLowerCase());\n    }\n\n    const listener: KeyboardListener = (e) => {\n      const rt = Math.round(\n        (rt_method == \"performance\" ? performance.now() : audio_context.currentTime * 1000) -\n          startTime\n      );\n      if (rt < minimum_valid_rt) {\n        return;\n      }\n\n      const key = this.toLowerCaseIfInsensitive(e.key);\n\n      if (this.isResponseValid(valid_responses, allow_held_key, key)) {\n        // if this is a valid response, then we don't want the key event to trigger other actions\n        // like scrolling via the spacebar.\n        e.preventDefault();\n\n        if (!persist) {\n          // remove keyboard listener if it exists\n          this.cancelKeyboardResponse(listener);\n        }\n\n        if (wait_for_key_release) {\n          // defer the callback until this key is released, keyed by the listener handle so that\n          // the pending release is cancelled together with the listener (see cancelKeyboardResponse\n          // and cancelAllKeyboardResponses).\n          //\n          // Because the pending release is keyed by listener, each listener tracks only one pending\n          // release at a time. With persist: true, if a second valid key is pressed before the first\n          // is released, this overwrites the earlier pending release: the superseded press is\n          // dropped and only the most recent press's release fires the callback. This is a\n          // deliberate trade-off of the single-slot design — note that it differs from the\n          // non-deferred persist path, which fires the callback for every valid press.\n          this.pendingReleases.set(listener, {\n            code: this.getPhysicalKey(e),\n            key: e.key,\n            rt,\n            callback_function,\n          });\n        } else {\n          callback_function({ key: e.key, rt });\n        }\n      }\n    };\n\n    this.listeners.add(listener);\n    return listener;\n  }\n\n  cancelKeyboardResponse(listener: KeyboardListener) {\n    // remove the listener from the set of listeners if it is contained\n    this.listeners.delete(listener);\n    // also drop any pending release so a deferred callback never fires after cancellation\n    this.pendingReleases.delete(listener);\n  }\n\n  cancelAllKeyboardResponses() {\n    this.listeners.clear();\n    this.pendingReleases.clear();\n  }\n\n  compareKeys(key1: string | null, key2: string | null) {\n    if (\n      (typeof key1 !== \"string\" && key1 !== null) ||\n      (typeof key2 !== \"string\" && key2 !== null)\n    ) {\n      console.error(\n        \"Error in jsPsych.pluginAPI.compareKeys: arguments must be key strings or null.\"\n      );\n      return undefined;\n    }\n\n    if (typeof key1 === \"string\" && typeof key2 === \"string\") {\n      // if both values are strings, then check whether or not letter case should be converted before comparing (case_sensitive_responses in initJsPsych)\n      return this.areResponsesCaseSensitive\n        ? key1 === key2\n        : key1.toLowerCase() === key2.toLowerCase();\n    }\n\n    return key1 === null && key2 === null;\n  }\n}\n","import { SetRequired } from \"type-fest\";\n\nimport { SimulationMode, SimulationOptions, TrialDescription, TrialResult } from \"../timeline\";\n\n/**\n * Parameter types for plugins\n */\nexport enum ParameterType {\n  BOOL,\n  STRING,\n  INT,\n  FLOAT,\n  FUNCTION,\n  KEY,\n  KEYS,\n  SELECT,\n  HTML_STRING,\n  IMAGE,\n  AUDIO,\n  VIDEO,\n  OBJECT,\n  COMPLEX,\n  TIMELINE,\n}\n\ntype ParameterTypeMap = {\n  [ParameterType.BOOL]: boolean;\n  [ParameterType.STRING]: string;\n  [ParameterType.INT]: number;\n  [ParameterType.FLOAT]: number;\n  [ParameterType.FUNCTION]: (...args: any[]) => any;\n  [ParameterType.KEY]: string;\n  [ParameterType.KEYS]: string[] | \"ALL_KEYS\" | \"NO_KEYS\";\n  [ParameterType.SELECT]: any;\n  [ParameterType.HTML_STRING]: string;\n  [ParameterType.IMAGE]: string;\n  [ParameterType.AUDIO]: string;\n  [ParameterType.VIDEO]: string;\n  [ParameterType.OBJECT]: object;\n  [ParameterType.COMPLEX]: any;\n  [ParameterType.TIMELINE]: any;\n};\n\ntype PreloadParameterType = ParameterType.AUDIO | ParameterType.VIDEO | ParameterType.IMAGE;\n\nexport type ParameterInfo = (\n  | { type: Exclude<ParameterType, ParameterType.COMPLEX | PreloadParameterType> }\n  | { type: ParameterType.COMPLEX; nested?: ParameterInfos }\n  | { type: PreloadParameterType; preload?: boolean }\n) & {\n  array?: boolean;\n  pretty_name?: string;\n  default?: any;\n  options?: any;\n};\n\nexport type ParameterInfos = Record<string, ParameterInfo>;\n\ntype InferredParameter<I extends ParameterInfo> = I[\"array\"] extends true\n  ? Array<ParameterTypeMap[I[\"type\"]]>\n  : ParameterTypeMap[I[\"type\"]];\n\ntype RequiredParameterNames<I extends ParameterInfos> = {\n  [K in keyof I]: I[K][\"default\"] extends undefined ? K : never;\n}[keyof I];\n\ntype InferredParameters<I extends ParameterInfos> = SetRequired<\n  {\n    [Property in keyof I]?: InferredParameter<I[Property]>;\n  },\n  RequiredParameterNames<I>\n>;\n\nexport const universalPluginParameters = <const>{\n  /**\n   * Data to add to this trial (key-value pairs)\n   */\n  data: {\n    type: ParameterType.OBJECT,\n    pretty_name: \"Data\",\n    default: {},\n  },\n  /**\n   * Function to execute when trial begins\n   */\n  on_start: {\n    type: ParameterType.FUNCTION,\n    pretty_name: \"On start\",\n    default: function () {\n      return;\n    },\n  },\n  /**\n   * Function to execute when trial is finished\n   */\n  on_finish: {\n    type: ParameterType.FUNCTION,\n    pretty_name: \"On finish\",\n    default: function () {\n      return;\n    },\n  },\n  /**\n   * Function to execute after the trial has loaded\n   */\n  on_load: {\n    type: ParameterType.FUNCTION,\n    pretty_name: \"On load\",\n    default: function () {\n      return;\n    },\n  },\n  /**\n   * Length of gap between the end of this trial and the start of the next trial\n   */\n  post_trial_gap: {\n    type: ParameterType.INT,\n    pretty_name: \"Post trial gap\",\n    default: 0,\n  },\n  /**\n   * A list of CSS classes to add to the jsPsych display element for the duration of this trial\n   */\n  css_classes: {\n    type: ParameterType.STRING,\n    pretty_name: \"Custom CSS classes\",\n    default: \"\",\n  },\n  /**\n   * Options to control simulation mode for the trial.\n   */\n  simulation_options: {\n    type: ParameterType.COMPLEX,\n    default: {},\n  },\n};\n\nexport type UniversalPluginParameters = InferredParameters<typeof universalPluginParameters>;\n\nexport interface PluginInfo {\n  name: string;\n  version?: string;\n  parameters: ParameterInfos;\n  data?: ParameterInfos;\n  citations?: Record<string, string> | string;\n}\n\nexport interface JsPsychPlugin<I extends PluginInfo> {\n  trial(\n    display_element: HTMLElement,\n    trial: TrialType<I>,\n    on_load?: () => void\n  ): void | Promise<TrialResult | void>;\n\n  simulate?(\n    trial: TrialType<I>,\n    simulation_mode: SimulationMode,\n    simulation_options: SimulationOptions,\n    on_load?: () => void\n  ): void | Promise<TrialResult | void>;\n}\n\nexport type TrialType<I extends PluginInfo> = InferredParameters<I[\"parameters\"]> &\n  TrialDescription;\n\nexport type PluginParameters<I extends PluginInfo> = InferredParameters<I[\"parameters\"]>;\n","export interface AudioPlayerOptions {\n  useWebAudio: boolean;\n  audioContext?: AudioContext;\n}\n\nexport interface AudioPlayerInterface {\n  load(): Promise<void>;\n  play(): void;\n  stop(): void;\n  addEventListener(eventName: string, callback: EventListenerOrEventListenerObject): void;\n  removeEventListener(eventName: string, callback: EventListenerOrEventListenerObject): void;\n}\n\nexport class AudioPlayer implements AudioPlayerInterface {\n  private audio: HTMLAudioElement | AudioBufferSourceNode;\n  private webAudioBuffer: AudioBuffer;\n  private audioContext: AudioContext | null;\n  private useWebAudio: boolean;\n  private src: string;\n\n  constructor(src: string, options: AudioPlayerOptions = { useWebAudio: false }) {\n    this.src = src;\n    this.useWebAudio = options.useWebAudio;\n    this.audioContext = options.audioContext || null;\n  }\n\n  async load() {\n    if (this.useWebAudio) {\n      this.webAudioBuffer = await this.preloadWebAudio(this.src);\n    } else {\n      this.audio = await this.preloadHTMLAudio(this.src);\n    }\n  }\n\n  play() {\n    if (this.audio instanceof HTMLAudioElement) {\n      this.audio.play();\n    } else {\n      // If audio is not HTMLAudioElement, it must be a WebAudio API object, so create a source node.\n      if (!this.audio) this.audio = this.getAudioSourceNode(this.webAudioBuffer);\n      this.audio.start();\n    }\n  }\n\n  stop() {\n    if (this.audio instanceof HTMLAudioElement) {\n      this.audio.pause();\n      this.audio.currentTime = 0;\n    } else {\n      this.audio!.stop();\n      // Regenerate source node for audio since the previous one is stopped and unusable.\n      this.audio = this.getAudioSourceNode(this.webAudioBuffer);\n    }\n  }\n\n  addEventListener(eventName: string, callback: EventListenerOrEventListenerObject) {\n    // If WebAudio buffer exists but source node doesn't, create it.\n    if (!this.audio && this.webAudioBuffer)\n      this.audio = this.getAudioSourceNode(this.webAudioBuffer);\n    this.audio.addEventListener(eventName, callback);\n  }\n\n  removeEventListener(eventName: string, callback: EventListenerOrEventListenerObject) {\n    // If WebAudio buffer exists but source node doesn't, create it.\n    if (!this.audio && this.webAudioBuffer)\n      this.audio = this.getAudioSourceNode(this.webAudioBuffer);\n    this.audio.removeEventListener(eventName, callback);\n  }\n\n  private getAudioSourceNode(audioBuffer: AudioBuffer): AudioBufferSourceNode {\n    const source = this.audioContext!.createBufferSource();\n    source.buffer = audioBuffer;\n    source.connect(this.audioContext!.destination);\n    return source;\n  }\n\n  private async preloadWebAudio(src: string): Promise<AudioBuffer> {\n    const buffer = await fetch(src);\n    const arrayBuffer = await buffer.arrayBuffer();\n    const audioBuffer = await this.audioContext!.decodeAudioData(arrayBuffer);\n    const source = this.audioContext!.createBufferSource();\n    source.buffer = audioBuffer;\n    source.connect(this.audioContext!.destination);\n    return audioBuffer;\n  }\n\n  private async preloadHTMLAudio(src: string): Promise<HTMLAudioElement> {\n    return new Promise<HTMLAudioElement>((resolve, reject) => {\n      const audio = new Audio(src);\n      audio.addEventListener(\"canplaythrough\", () => {\n        resolve(audio);\n      });\n      audio.addEventListener(\"error\", (err) => {\n        reject(err);\n      });\n      audio.addEventListener(\"abort\", (err) => {\n        reject(err);\n      });\n    });\n  }\n}\n","import { ParameterType } from \"../../modules/plugins\";\nimport { unique } from \"../utils\";\nimport { AudioPlayer } from \"./AudioPlayer\";\n\nconst preloadParameterTypes = <const>[\n  ParameterType.AUDIO,\n  ParameterType.IMAGE,\n  ParameterType.VIDEO,\n];\ntype PreloadType = typeof preloadParameterTypes[number];\n\nexport class MediaAPI {\n  constructor(public useWebaudio: boolean) {\n    if (\n      this.useWebaudio &&\n      typeof window !== \"undefined\" &&\n      typeof window.AudioContext !== \"undefined\"\n    ) {\n      this.context = new AudioContext();\n    }\n  }\n\n  // video //\n  private video_buffers = {};\n  getVideoBuffer(videoID: string) {\n    if (videoID.startsWith(\"blob:\")) {\n      this.video_buffers[videoID] = videoID;\n    }\n    return this.video_buffers[videoID];\n  }\n\n  // audio //\n  private context: AudioContext = null;\n  private audio_buffers = [];\n\n  audioContext(): AudioContext {\n    if (this.context && this.context.state !== \"running\") {\n      this.context.resume();\n    }\n    return this.context;\n  }\n\n  async getAudioPlayer(audioID: string): Promise<AudioPlayer> {\n    if (this.audio_buffers[audioID] instanceof AudioPlayer) {\n      return this.audio_buffers[audioID];\n    } else {\n      this.audio_buffers[audioID] = new AudioPlayer(audioID, {\n        useWebAudio: this.useWebaudio,\n        audioContext: this.context,\n      });\n      await this.audio_buffers[audioID].load();\n      return this.audio_buffers[audioID];\n    }\n  }\n\n  // preloading stimuli //\n  private preload_requests = [];\n\n  private img_cache = {};\n\n  preloadAudio(\n    files,\n    callback_complete = () => {},\n    callback_load = (filepath: string) => {},\n    callback_error = (error) => {}\n  ) {\n    files = unique(files.flat());\n\n    let n_loaded = 0;\n\n    if (files.length == 0) {\n      callback_complete();\n      return;\n    }\n\n    for (const file of files) {\n      // check if file was already loaded\n      if (this.audio_buffers[file] instanceof AudioPlayer) {\n        n_loaded++;\n        callback_load(file);\n        if (n_loaded == files.length) {\n          callback_complete();\n        }\n      } else {\n        this.audio_buffers[file] = new AudioPlayer(file, {\n          useWebAudio: this.useWebaudio,\n          audioContext: this.context,\n        });\n        this.audio_buffers[file]\n          .load()\n          .then(() => {\n            n_loaded++;\n            callback_load(file);\n            if (n_loaded == files.length) {\n              callback_complete();\n            }\n          })\n          .catch((e) => {\n            callback_error(e);\n          });\n      }\n    }\n  }\n\n  preloadImages(\n    images,\n    callback_complete = () => {},\n    callback_load = (filepath) => {},\n    callback_error = (error_msg) => {}\n  ) {\n    // flatten the images array\n    images = unique(images.flat());\n\n    var n_loaded = 0;\n\n    if (images.length === 0) {\n      callback_complete();\n      return;\n    }\n\n    for (let i = 0; i < images.length; i++) {\n      const img = new Image();\n      const src = images[i];\n      img.onload = () => {\n        n_loaded++;\n        callback_load(src);\n        if (n_loaded === images.length) {\n          callback_complete();\n        }\n      };\n\n      img.onerror = (e) => {\n        callback_error({ source: src, error: e });\n      };\n\n      img.src = src;\n\n      this.img_cache[src] = img;\n      this.preload_requests.push(img);\n    }\n  }\n\n  preloadVideo(\n    videos,\n    callback_complete = () => {},\n    callback_load = (filepath) => {},\n    callback_error = (error_msg) => {}\n  ) {\n    // flatten the video array\n    videos = unique(videos.flat());\n\n    let n_loaded = 0;\n\n    if (videos.length === 0) {\n      callback_complete();\n      return;\n    }\n\n    for (const video of videos) {\n      const video_buffers = this.video_buffers;\n\n      //based on option 4 here: http://dinbror.dk/blog/how-to-preload-entire-html5-video-before-play-solved/\n      const request = new XMLHttpRequest();\n      request.open(\"GET\", video, true);\n      request.responseType = \"blob\";\n      request.onload = () => {\n        if (request.status === 200 || request.status === 0) {\n          const videoBlob = request.response;\n          video_buffers[video] = URL.createObjectURL(videoBlob); // IE10+\n          n_loaded++;\n          callback_load(video);\n          if (n_loaded === videos.length) {\n            callback_complete();\n          }\n        }\n      };\n      request.onerror = (e) => {\n        let err: ProgressEvent | string = e;\n        if (request.status == 404) {\n          err = \"404\";\n        }\n        callback_error({ source: video, error: err });\n      };\n      request.onloadend = (e) => {\n        if (request.status == 404) {\n          callback_error({ source: video, error: \"404\" });\n        }\n      };\n      request.send();\n      this.preload_requests.push(request);\n    }\n  }\n\n  private preloadMap = new Map<string, Record<string, PreloadType>>();\n\n  getAutoPreloadList(timeline_description: any[]) {\n    /** Map each preload parameter type to a set of paths to be preloaded */\n    const preloadPaths = Object.fromEntries(\n      preloadParameterTypes.map((type) => [type, new Set<string>()])\n    );\n\n    const traverseTimeline = (node, inheritedTrialType?) => {\n      const isTimeline = typeof node.timeline !== \"undefined\";\n\n      if (isTimeline) {\n        for (const childNode of node.timeline) {\n          traverseTimeline(childNode, node.type ?? inheritedTrialType);\n        }\n      } else if ((node.type ?? inheritedTrialType)?.info) {\n        // node is a trial with type.info set\n\n        // Get the plugin name and parameters object from the info object\n        const { name: pluginName, parameters } = (node.type ?? inheritedTrialType).info;\n\n        // Extract parameters to be preloaded and their types from parameter info if this has not\n        // yet been done for `pluginName`\n        if (!this.preloadMap.has(pluginName)) {\n          this.preloadMap.set(\n            pluginName,\n            Object.fromEntries(\n              Object.entries<any>(parameters)\n                // Filter out parameter entries with media types and a non-false `preload` option\n                .filter(\n                  ([_name, { type, preload }]) =>\n                    preloadParameterTypes.includes(type) && (preload ?? true)\n                )\n                // Map each entry's value to its parameter type\n                .map(([name, { type }]) => [name, type])\n            )\n          );\n        }\n\n        // Add preload paths from this trial\n        for (const [parameterName, parameterType] of Object.entries(\n          this.preloadMap.get(pluginName)\n        )) {\n          const parameterValue = node[parameterName];\n          const elements = preloadPaths[parameterType];\n\n          if (typeof parameterValue === \"string\") {\n            elements.add(parameterValue);\n          } else if (Array.isArray(parameterValue)) {\n            for (const element of parameterValue.flat()) {\n              if (typeof element === \"string\") {\n                elements.add(element);\n              }\n            }\n          }\n        }\n      }\n    };\n\n    traverseTimeline({ timeline: timeline_description });\n\n    return {\n      images: [...preloadPaths[ParameterType.IMAGE]],\n      audio: [...preloadPaths[ParameterType.AUDIO]],\n      video: [...preloadPaths[ParameterType.VIDEO]],\n    };\n  }\n\n  cancelPreloads() {\n    for (const request of this.preload_requests) {\n      request.onload = () => {};\n      request.onerror = () => {};\n      request.oncanplaythrough = () => {};\n      request.onabort = () => {};\n    }\n    this.preload_requests = [];\n  }\n\n  private microphone_recorder: MediaRecorder = null;\n\n  initializeMicrophoneRecorder(stream: MediaStream) {\n    const recorder = new MediaRecorder(stream);\n    this.microphone_recorder = recorder;\n  }\n\n  getMicrophoneRecorder(): MediaRecorder {\n    return this.microphone_recorder;\n  }\n\n  private camera_stream: MediaStream = null;\n  private camera_recorder: MediaRecorder = null;\n\n  initializeCameraRecorder(stream: MediaStream, opts?: MediaRecorderOptions) {\n    let mimeType = this.getCompatibleMimeType() || \"video/webm\";\n    const recorderOptions: MediaRecorderOptions = {\n      ...opts,\n      mimeType\n    }\n\n    this.camera_stream = stream;\n    const recorder = new MediaRecorder(stream, recorderOptions);\n    this.camera_recorder = recorder;\n  }\n\n  // mimetype checking code adapted from https://github.com/lookit/lookit-jspsych/blob/develop/packages/record/src/videoConfig.ts#L673-L699\n  /** returns a compatible mimetype string, or null if none from the array are supported. */\n  private getCompatibleMimeType(): string {\n    const types = [\n      // chrome firefox edge\n      \"video/webm;codecs=vp9,opus\",\n      \"video/webm;codecs=vp8,opus\",\n      // general\n      \"video/mp4;codecs=avc1.42E01E,mp4a.40.2\",\n      // safari\n      \"video/mp4;codecs=h264,aac\",\n      \"video/mp4;codecs=hevc,aac\",\n    ]\n    for (const mimeType of types) {\n      if (MediaRecorder.isTypeSupported(mimeType)) {\n        return mimeType;\n      }\n    }\n    return null;\n  }\n\n  getCameraStream(): MediaStream {\n    return this.camera_stream;\n  }\n\n  getCameraRecorder(): MediaRecorder {\n    return this.camera_recorder;\n  }\n}\n","export class SimulationAPI {\n  constructor(\n    private getDisplayContainerElement: () => HTMLElement,\n    private setJsPsychTimeout: (callback: () => void, delay: number) => number\n  ) {}\n\n  dispatchEvent(event: Event) {\n    this.getDisplayContainerElement().dispatchEvent(event);\n  }\n\n  /**\n   * Dispatches a `keydown` event for the specified key\n   * @param key Character code (`.key` property) for the key to press.\n   */\n  keyDown(key: string) {\n    this.dispatchEvent(new KeyboardEvent(\"keydown\", { key }));\n  }\n\n  /**\n   * Dispatches a `keyup` event for the specified key\n   * @param key Character code (`.key` property) for the key to press.\n   */\n  keyUp(key: string) {\n    this.dispatchEvent(new KeyboardEvent(\"keyup\", { key }));\n  }\n\n  /**\n   * Dispatches a `keydown` and `keyup` event in sequence to simulate pressing a key.\n   * @param key Character code (`.key` property) for the key to press.\n   * @param delay Length of time to wait (ms) before executing action\n   */\n  pressKey(key: string, delay = 0) {\n    if (delay > 0) {\n      this.setJsPsychTimeout(() => {\n        this.keyDown(key);\n        this.keyUp(key);\n      }, delay);\n    } else {\n      this.keyDown(key);\n      this.keyUp(key);\n    }\n  }\n\n  /**\n   * Dispatches `mousedown`, `mouseup`, and `click` events on the target element\n   * @param target The element to click\n   * @param delay Length of time to wait (ms) before executing action\n   */\n  clickTarget(target: Element, delay = 0) {\n    if (delay > 0) {\n      this.setJsPsychTimeout(() => {\n        target.dispatchEvent(new MouseEvent(\"mousedown\", { bubbles: true }));\n        target.dispatchEvent(new MouseEvent(\"mouseup\", { bubbles: true }));\n        target.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n      }, delay);\n    } else {\n      target.dispatchEvent(new MouseEvent(\"mousedown\", { bubbles: true }));\n      target.dispatchEvent(new MouseEvent(\"mouseup\", { bubbles: true }));\n      target.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n    }\n  }\n\n  /**\n   * Sets the value of a target text input\n   * @param target A text input element to fill in\n   * @param text Text to input\n   * @param delay Length of time to wait (ms) before executing action\n   */\n  fillTextInput(target: HTMLInputElement, text: string, delay = 0) {\n    if (delay > 0) {\n      this.setJsPsychTimeout(() => {\n        target.value = text;\n      }, delay);\n    } else {\n      target.value = text;\n    }\n  }\n\n  /**\n   * Picks a valid key from `choices`, taking into account jsPsych-specific\n   * identifiers like \"NO_KEYS\" and \"ALL_KEYS\".\n   * @param choices Which keys are valid.\n   * @returns A key selected at random from the valid keys.\n   */\n  getValidKey(choices: \"NO_KEYS\" | \"ALL_KEYS\" | Array<string> | Array<Array<string>>) {\n    const possible_keys = [\n      \"a\",\n      \"b\",\n      \"c\",\n      \"d\",\n      \"e\",\n      \"f\",\n      \"g\",\n      \"h\",\n      \"i\",\n      \"j\",\n      \"k\",\n      \"l\",\n      \"m\",\n      \"n\",\n      \"o\",\n      \"p\",\n      \"q\",\n      \"r\",\n      \"s\",\n      \"t\",\n      \"u\",\n      \"v\",\n      \"w\",\n      \"x\",\n      \"y\",\n      \"z\",\n      \"0\",\n      \"1\",\n      \"2\",\n      \"3\",\n      \"4\",\n      \"5\",\n      \"6\",\n      \"7\",\n      \"8\",\n      \"9\",\n      \" \",\n    ];\n\n    let key;\n    if (choices == \"NO_KEYS\") {\n      key = null;\n    } else if (choices == \"ALL_KEYS\") {\n      key = possible_keys[Math.floor(Math.random() * possible_keys.length)];\n    } else {\n      const flat_choices = choices.flat();\n      key = flat_choices[Math.floor(Math.random() * flat_choices.length)];\n    }\n\n    return key;\n  }\n\n  mergeSimulationData(default_data, simulation_options) {\n    // override any data with data from simulation object\n    return {\n      ...default_data,\n      ...simulation_options?.data,\n    };\n  }\n\n  ensureSimulationDataConsistency(trial, data) {\n    // All RTs must be rounded\n    if (data.rt) {\n      data.rt = Math.round(data.rt);\n    }\n\n    // If a trial_duration and rt exist, make sure that the RT is not longer than the trial.\n    if (trial.trial_duration && data.rt && data.rt > trial.trial_duration) {\n      data.rt = null;\n      if (data.response) {\n        data.response = null;\n      }\n      if (data.correct) {\n        data.correct = false;\n      }\n    }\n\n    // If trial.choices is NO_KEYS make sure that response and RT are null\n    if (trial.choices && trial.choices == \"NO_KEYS\") {\n      if (data.rt) {\n        data.rt = null;\n      }\n      if (data.response) {\n        data.response = null;\n      }\n    }\n\n    // If response is not allowed before stimulus display complete, ensure RT\n    // is longer than display time.\n    if (trial.allow_response_before_complete) {\n      if (trial.sequence_reps && trial.frame_time) {\n        const min_time = trial.sequence_reps * trial.frame_time * trial.stimuli.length;\n        if (data.rt < min_time) {\n          data.rt = null;\n          data.response = null;\n        }\n      }\n    }\n  }\n}\n","/**\n * A class that provides a wrapper around the global setTimeout and clearTimeout functions.\n */\nexport class TimeoutAPI {\n  private timeout_handlers: number[] = [];\n\n  /**\n   * Calls a function after a specified delay, in milliseconds.\n   * @param callback The function to call after the delay.\n   * @param delay The number of milliseconds to wait before calling the function.\n   * @returns A handle that can be used to clear the timeout with clearTimeout.\n   */\n  setTimeout(callback: () => void, delay: number): number {\n    const handle = window.setTimeout(callback, delay);\n    this.timeout_handlers.push(handle);\n    return handle;\n  }\n\n  /**\n   * Clears all timeouts that have been created with setTimeout.\n   */\n  clearAllTimeouts(): void {\n    for (const handler of this.timeout_handlers) {\n      clearTimeout(handler);\n    }\n    this.timeout_handlers = [];\n  }\n}\n","import autoBind from \"auto-bind\";\n\nimport { JsPsych } from \"../../JsPsych\";\nimport { KeyboardListenerAPI } from \"./KeyboardListenerAPI\";\nimport { MediaAPI } from \"./MediaAPI\";\nimport { SimulationAPI } from \"./SimulationAPI\";\nimport { TimeoutAPI } from \"./TimeoutAPI\";\n\nexport function createJointPluginAPIObject(jsPsych: JsPsych) {\n  const settings = jsPsych.getInitSettings();\n  const keyboardListenerAPI = new KeyboardListenerAPI(\n    jsPsych.getDisplayContainerElement,\n    settings.case_sensitive_responses,\n    settings.minimum_valid_rt\n  );\n  const timeoutAPI = new TimeoutAPI();\n  const mediaAPI = new MediaAPI(settings.use_webaudio);\n  const simulationAPI = new SimulationAPI(\n    jsPsych.getDisplayContainerElement,\n    timeoutAPI.setTimeout.bind(timeoutAPI)\n  );\n  return Object.assign(\n    {},\n    ...[keyboardListenerAPI, timeoutAPI, mediaAPI, simulationAPI].map((object) => autoBind(object))\n  ) as KeyboardListenerAPI & TimeoutAPI & MediaAPI & SimulationAPI;\n}\n\nexport type PluginAPI = ReturnType<typeof createJointPluginAPIObject>;\n","import rw from \"random-words\";\nimport seedrandom from \"seedrandom/lib/alea.js\";\n\n/**\n * Uses the `seedrandom` package to replace Math.random() with a seedable PRNG.\n *\n * @param seed An optional seed. If none is given, a random seed will be generated.\n * @returns The seed value.\n */\nexport function setSeed(seed: string = Math.random().toString()) {\n  Math.random = seedrandom(seed);\n  return seed;\n}\n\nexport function repeat(array: any, repetitions: any, unpack = false) {\n  const arr_isArray = Array.isArray(array);\n  const rep_isArray = Array.isArray(repetitions);\n\n  // if array is not an array, then we just repeat the item\n  if (!arr_isArray) {\n    if (!rep_isArray) {\n      array = [array];\n      repetitions = [repetitions];\n    } else {\n      repetitions = [repetitions[0]];\n      console.log(\n        \"Unclear parameters given to randomization.repeat. Multiple set sizes specified, but only one item exists to sample. Proceeding using the first set size.\"\n      );\n    }\n  } else {\n    // if repetitions is not an array, but array is, then we\n    // repeat repetitions for each entry in array\n    if (!rep_isArray) {\n      let reps = [];\n      for (let i = 0; i < array.length; i++) {\n        reps.push(repetitions);\n      }\n      repetitions = reps;\n    } else {\n      if (array.length != repetitions.length) {\n        console.warn(\n          \"Unclear parameters given to randomization.repeat. Items and repetitions are unequal lengths. Behavior may not be as expected.\"\n        );\n        // throw warning if repetitions is too short, use first rep ONLY.\n        if (repetitions.length < array.length) {\n          let reps = [];\n          for (let i = 0; i < array.length; i++) {\n            reps.push(repetitions);\n          }\n          repetitions = reps;\n        } else {\n          // throw warning if too long, and then use the first N\n          repetitions = repetitions.slice(0, array.length);\n        }\n      }\n    }\n  }\n\n  // should be clear at this point to assume that array and repetitions are arrays with == length\n  let allsamples = [];\n  for (let i = 0; i < array.length; i++) {\n    for (let j = 0; j < repetitions[i]; j++) {\n      if (array[i] == null || typeof array[i] != \"object\") {\n        allsamples.push(array[i]);\n      } else {\n        allsamples.push(Object.assign({}, array[i]));\n      }\n    }\n  }\n\n  let out: any = shuffle(allsamples);\n\n  if (unpack) {\n    out = unpackArray(out);\n  }\n\n  return out;\n}\n\nexport function shuffle<T>(array: Array<T>) {\n  if (!Array.isArray(array)) {\n    console.error(\"Argument to shuffle() must be an array.\");\n  }\n\n  const copy_array = array.slice(0);\n  let m = copy_array.length,\n    t,\n    i;\n\n  // While there remain elements to shuffle…\n  while (m) {\n    // Pick a remaining element…\n    i = Math.floor(Math.random() * m--);\n\n    // And swap it with the current element.\n    t = copy_array[m];\n    copy_array[m] = copy_array[i];\n    copy_array[i] = t;\n  }\n\n  return copy_array;\n}\n\nexport function shuffleNoRepeats<T>(arr: Array<T>, equalityTest: (a: T, b: T) => boolean) {\n  if (!Array.isArray(arr)) {\n    console.error(\"First argument to shuffleNoRepeats() must be an array.\");\n  }\n  if (typeof equalityTest !== \"undefined\" && typeof equalityTest !== \"function\") {\n    console.error(\"Second argument to shuffleNoRepeats() must be a function.\");\n  }\n  // define a default equalityTest\n  if (typeof equalityTest == \"undefined\") {\n    equalityTest = function (a, b) {\n      if (a === b) {\n        return true;\n      } else {\n        return false;\n      }\n    };\n  }\n\n  const random_shuffle = shuffle(arr);\n\n  for (let i = 0; i < random_shuffle.length - 1; i++) {\n    if (equalityTest(random_shuffle[i], random_shuffle[i + 1])) {\n      // neighbors are equal, pick a new random neighbor to swap (not the first or last element, to avoid edge cases)\n      let random_pick = Math.floor(Math.random() * (random_shuffle.length - 2)) + 1;\n      // test to make sure the new neighbor isn't equal to the old one\n      while (\n        equalityTest(random_shuffle[i + 1], random_shuffle[random_pick]) ||\n        equalityTest(random_shuffle[i + 1], random_shuffle[random_pick + 1]) ||\n        equalityTest(random_shuffle[i + 1], random_shuffle[random_pick - 1]) ||\n        equalityTest(random_shuffle[i], random_shuffle[random_pick])\n      ) {\n        random_pick = Math.floor(Math.random() * (random_shuffle.length - 2)) + 1;\n      }\n      const new_neighbor = random_shuffle[random_pick];\n      random_shuffle[random_pick] = random_shuffle[i + 1];\n      random_shuffle[i + 1] = new_neighbor;\n    }\n  }\n\n  return random_shuffle;\n}\n\nexport function shuffleAlternateGroups<T extends any[]>(\n  arr_groups: Array<T>,\n  random_group_order = false\n) {\n  const n_groups = arr_groups.length;\n  if (n_groups == 1) {\n    console.warn(\n      \"shuffleAlternateGroups() was called with only one group. Defaulting to simple shuffle.\"\n    );\n    return shuffle(arr_groups[0]);\n  }\n\n  let group_order = [];\n  for (let i = 0; i < n_groups; i++) {\n    group_order.push(i);\n  }\n  if (random_group_order) {\n    group_order = shuffle(group_order);\n  }\n\n  const randomized_groups = [];\n  let min_length = null;\n  for (let i = 0; i < n_groups; i++) {\n    min_length =\n      min_length === null ? arr_groups[i].length : Math.min(min_length, arr_groups[i].length);\n    randomized_groups.push(shuffle(arr_groups[i]));\n  }\n\n  const out = [];\n  for (let i = 0; i < min_length; i++) {\n    for (let j = 0; j < group_order.length; j++) {\n      out.push(randomized_groups[group_order[j]][i]);\n    }\n  }\n\n  return out;\n}\n\nexport function sampleWithoutReplacement<T>(arr: Array<T>, size: number) {\n  if (!Array.isArray(arr)) {\n    console.error(\"First argument to sampleWithoutReplacement() must be an array\");\n  }\n\n  if (size > arr.length) {\n    console.error(\"Cannot take a sample larger than the size of the set of items to sample.\");\n  }\n  return shuffle(arr).slice(0, size);\n}\n\nexport function sampleWithReplacement<T>(arr: Array<T>, size: number, weights?: number[]) {\n  if (!Array.isArray(arr)) {\n    console.error(\"First argument to sampleWithReplacement() must be an array\");\n  }\n\n  const normalized_weights = [];\n  if (typeof weights !== \"undefined\") {\n    if (weights.length !== arr.length) {\n      console.error(\n        \"The length of the weights array must equal the length of the array \" +\n          \"to be sampled from.\"\n      );\n    }\n    let weight_sum = 0;\n    for (const weight of weights) {\n      weight_sum += weight;\n    }\n    for (const weight of weights) {\n      normalized_weights.push(weight / weight_sum);\n    }\n  } else {\n    for (let i = 0; i < arr.length; i++) {\n      normalized_weights.push(1 / arr.length);\n    }\n  }\n\n  const cumulative_weights = [normalized_weights[0]];\n  for (let i = 1; i < normalized_weights.length; i++) {\n    cumulative_weights.push(normalized_weights[i] + cumulative_weights[i - 1]);\n  }\n\n  const samp = [];\n  for (let i = 0; i < size; i++) {\n    const rnd = Math.random();\n    let index = 0;\n    while (rnd > cumulative_weights[index]) {\n      index++;\n    }\n    samp.push(arr[index]);\n  }\n  return samp;\n}\n\nexport function factorial(factors: Record<string, any>, repetitions = 1, unpack = false) {\n  let design = [{}];\n  for (const [factorName, factor] of Object.entries(factors)) {\n    const new_design = [];\n    for (const level of factor) {\n      for (const cell of design) {\n        new_design.push({ ...cell, [factorName]: level });\n      }\n    }\n    design = new_design;\n  }\n\n  return repeat(design, repetitions, unpack);\n}\n\nexport function randomID(length = 32) {\n  let result = \"\";\n  const chars = \"0123456789abcdefghjklmnopqrstuvwxyz\";\n  for (let i = 0; i < length; i++) {\n    result += chars[Math.floor(Math.random() * chars.length)];\n  }\n  return result;\n}\n\n/**\n * Generate a random integer from `lower` to `upper`, inclusive of both end points.\n * @param lower The lowest value it is possible to generate\n * @param upper The highest value it is possible to generate\n * @returns A random integer\n */\nexport function randomInt(lower: number, upper: number) {\n  if (upper < lower) {\n    throw new Error(\"Upper boundary must be greater than or equal to lower boundary\");\n  }\n  return lower + Math.floor(Math.random() * (upper - lower + 1));\n}\n\n/**\n * Generates a random sample from a Bernoulli distribution.\n * @param p The probability of sampling 1.\n * @returns 0, with probability 1-p, or 1, with probability p.\n */\nexport function sampleBernoulli(p: number) {\n  return Math.random() <= p ? 1 : 0;\n}\n\nexport function sampleNormal(mean: number, standard_deviation: number) {\n  return randn_bm() * standard_deviation + mean;\n}\n\nexport function sampleExponential(rate: number) {\n  return -Math.log(Math.random()) / rate;\n}\n\nexport function sampleExGaussian(\n  mean: number,\n  standard_deviation: number,\n  rate: number,\n  positive = false\n) {\n  let s = sampleNormal(mean, standard_deviation) + sampleExponential(rate);\n  if (positive) {\n    while (s <= 0) {\n      s = sampleNormal(mean, standard_deviation) + sampleExponential(rate);\n    }\n  }\n  return s;\n}\n\ntype RandomWordsOptions = {\n  min?: number;\n  max?: number;\n  exactly?: number;\n  maxLength?: number;\n  wordsPerString?: number;\n  seperator?: string;\n  formatter?: (word: string, index: number) => string;\n  join?: string;\n};\n\ntype RandomWordsResult<T extends RandomWordsOptions> = T extends { join: string }\n  ? string\n  : string[];\n\n/**\n * Generate one or more random words.\n *\n * This is a wrapper function for the {@link https://www.npmjs.com/package/random-words `random-words` npm package}.\n *\n * @param opts An object with optional properties `min`, `max`, `exactly`,\n * `join`, `maxLength`, `wordsPerString`, `separator`, and `formatter`.\n *\n * @returns An array of words or a single string, depending on parameter choices.\n */\nexport function randomWords<T extends RandomWordsOptions>(opts: T) {\n  // there is a type incompatibility here because `random-words` uses overloads rather than generics\n  return rw(opts) as RandomWordsResult<T>;\n}\n\n// Box-Muller transformation for a random sample from normal distribution with mean = 0, std = 1\n// https://stackoverflow.com/a/36481059/3726673\nfunction randn_bm() {\n  var u = 0,\n    v = 0;\n  while (u === 0) u = Math.random(); //Converting [0,1) to (0,1)\n  while (v === 0) v = Math.random();\n  return Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\n}\n\nfunction unpackArray(array: object[]) {\n  const out: Record<string, any> = {};\n\n  for (const x of array) {\n    for (const key of Object.keys(x)) {\n      if (typeof out[key] === \"undefined\") {\n        out[key] = [];\n      }\n      out[key].push(x[key]);\n    }\n  }\n\n  return out;\n}\n","interface turkInformation {\n  /**\n   * Is the experiment being loaded in preview mode on Mechanical Turk?\n   */\n  previewMode: boolean;\n  /**\n   * Is the experiment being loaded outside of the Mechanical Turk environment?\n   */\n  outsideTurk: boolean;\n  /**\n   * The HIT ID.\n   */\n  hitId: string;\n  /**\n   * The Assignment ID.\n   */\n  assignmentId: string;\n  /**\n   * The worker ID.\n   */\n  workerId: string;\n  /**\n   * URL for submission of the HIT.\n   */\n  turkSubmitTo: string;\n}\n\n/**\n * Gets information about the Mechanical Turk Environment, HIT, Assignment, and Worker\n * by parsing the URL variables that Mechanical Turk generates.\n * @returns An object containing information about the Mechanical Turk Environment, HIT, Assignment, and Worker.\n */\nexport function turkInfo(): turkInformation {\n  const turk: turkInformation = {\n    previewMode: false,\n    outsideTurk: false,\n    hitId: \"INVALID_URL_PARAMETER\",\n    assignmentId: \"INVALID_URL_PARAMETER\",\n    workerId: \"INVALID_URL_PARAMETER\",\n    turkSubmitTo: \"INVALID_URL_PARAMETER\",\n  };\n\n  const param = function (url, name) {\n    name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n    const regexS = \"[\\\\?&]\" + name + \"=([^&#]*)\";\n    const regex = new RegExp(regexS);\n    const results = regex.exec(url);\n    return results == null ? \"\" : results[1];\n  };\n\n  const src = param(window.location.href, \"assignmentId\")\n    ? window.location.href\n    : document.referrer;\n\n  const keys = [\"assignmentId\", \"hitId\", \"workerId\", \"turkSubmitTo\"];\n  keys.map(function (key) {\n    turk[key] = unescape(param(src, key));\n  });\n\n  turk.previewMode = turk.assignmentId == \"ASSIGNMENT_ID_NOT_AVAILABLE\";\n\n  turk.outsideTurk =\n    !turk.previewMode && turk.hitId === \"\" && turk.assignmentId == \"\" && turk.workerId == \"\";\n\n  return turk;\n}\n\n/**\n * Send data to Mechnical Turk for storage.\n * @param data An object containing `key:value` pairs to send to Mechanical Turk. Values\n * cannot contain nested objects, arrays, or functions.\n * @returns Nothing\n */\nexport function submitToTurk(data) {\n  const turk = turkInfo();\n  const assignmentId = turk.assignmentId;\n  const turkSubmitTo = turk.turkSubmitTo;\n\n  if (!assignmentId || !turkSubmitTo) return;\n\n  const form = document.createElement(\"form\");\n  form.method = \"POST\";\n  form.action = turkSubmitTo + \"/mturk/externalSubmit?assignmentId=\" + assignmentId;\n\n  for (const key in data) {\n    if (data.hasOwnProperty(key)) {\n      const hiddenField = document.createElement(\"input\");\n      hiddenField.type = \"hidden\";\n      hiddenField.name = key;\n      hiddenField.id = key;\n      hiddenField.value = data[key];\n\n      form.appendChild(hiddenField);\n    }\n  }\n\n  document.body.appendChild(form);\n  form.submit();\n}\n","/**\n * Maintains a visual progress bar using HTML and CSS\n */\nexport class ProgressBar {\n  constructor(\n    private readonly containerElement: HTMLDivElement,\n    private readonly message: string | ((progress: number) => string)\n  ) {\n    this.setupElements();\n  }\n\n  private _progress = 0;\n\n  private innerDiv: HTMLDivElement;\n  private messageSpan: HTMLSpanElement;\n\n  /** Adds the progress bar HTML code into `this.containerElement` */\n  private setupElements() {\n    this.messageSpan = document.createElement(\"span\");\n\n    this.innerDiv = document.createElement(\"div\");\n    this.innerDiv.id = \"jspsych-progressbar-inner\";\n    this.update();\n\n    const outerDiv = document.createElement(\"div\");\n    outerDiv.id = \"jspsych-progressbar-outer\";\n    outerDiv.appendChild(this.innerDiv);\n\n    this.containerElement.appendChild(this.messageSpan);\n    this.containerElement.appendChild(outerDiv);\n  }\n\n  /** Updates the progress bar according to `this.progress` */\n  private update() {\n    this.innerDiv.style.width = this._progress * 100 + \"%\";\n\n    if (typeof this.message === \"function\") {\n      this.messageSpan.innerHTML = this.message(this._progress);\n    } else {\n      this.messageSpan.innerHTML = this.message;\n    }\n  }\n\n  /**\n   * The bar's current position as a number in the closed interval [0, 1]. Set this to update the\n   * progress bar accordingly.\n   */\n  set progress(progress: number) {\n    if (typeof progress !== \"number\" || progress < 0 || progress > 1) {\n      throw new Error(\"jsPsych.progressBar.progress must be a number between 0 and 1\");\n    }\n\n    this._progress = progress;\n    this.update();\n  }\n\n  get progress() {\n    return this._progress;\n  }\n}\n","import { Class } from \"type-fest\";\n\nimport { JsPsychExtension } from \"../modules/extensions\";\nimport { JsPsychPlugin, PluginInfo } from \"../modules/plugins\";\nimport { Trial } from \"./Trial\";\nimport { PromiseWrapper } from \"./util\";\n\nexport class TimelineVariable {\n  constructor(public readonly name: string) {}\n}\n\nexport type Parameter<T> = T | (() => T) | TimelineVariable;\n\nexport type TrialExtensionsConfiguration = Array<{\n  type: Class<JsPsychExtension>;\n  params?: Record<string, any>;\n}>;\n\nexport type SimulationMode = \"visual\" | \"data-only\";\n\nexport type SimulationOptions = {\n  data?: Record<string, any>;\n  mode?: SimulationMode;\n  simulate?: boolean;\n};\n\nexport type SimulationOptionsParameter = Parameter<{\n  data?: Parameter<Record<string, Parameter<any>>>;\n  mode?: Parameter<SimulationMode>;\n  simulate?: Parameter<boolean>;\n}>;\n\nexport interface TrialDescription extends Record<string, any> {\n  type: Parameter<Class<JsPsychPlugin<any>>>;\n\n  /** https://www.jspsych.org/latest/overview/plugins/#the-post_trial_gap-iti-parameter */\n  post_trial_gap?: Parameter<number>;\n\n  /** https://www.jspsych.org/latest/overview/plugins/#the-save_trial_parameters-parameter */\n  save_trial_parameters?: Parameter<Record<string, boolean>>;\n\n  /**\n   * Whether to include the values of timeline variables under a `timeline_variables` key. Can be\n   * `true` to save the values of all timeline variables, or an array of timeline variable names to\n   * only save specific timeline variables. Defaults to `false`.\n   */\n  save_timeline_variables?: Parameter<boolean | string[]>;\n\n  /** https://www.jspsych.org/latest/overview/style/#using-the-css_classes-trial-parameter */\n  css_classes?: Parameter<string | string[]>;\n\n  /** https://www.jspsych.org/latest/overview/simulation/#controlling-simulation-mode-with-simulation_options */\n  simulation_options?: SimulationOptionsParameter | string;\n\n  /** https://www.jspsych.org/latest/overview/extensions/ */\n  extensions?: Parameter<TrialExtensionsConfiguration>;\n\n  /**\n   * Whether to record the data of this trial. Defaults to `true`.\n   */\n  record_data?: Parameter<boolean>;\n\n  // Events\n\n  /** https://www.jspsych.org/latest/overview/events/#on_start-trial */\n  on_start?: (trial: any) => void;\n\n  /** https://www.jspsych.org/latest/overview/events/#on_load */\n  on_load?: () => void;\n\n  /** https://www.jspsych.org/latest/overview/events/#on_finish-trial */\n  on_finish?: (data: any) => void;\n}\n\n/** https://www.jspsych.org/latest/overview/timeline/#sampling-methods */\nexport type SampleOptions =\n  | { type: \"with-replacement\"; size: number; weights?: number[] }\n  | { type: \"without-replacement\"; size: number }\n  | { type: \"fixed-repetitions\"; size: number }\n  | { type: \"alternate-groups\"; groups: number[][]; randomize_group_order?: boolean }\n  | { type: \"custom\"; fn: (ids: number[]) => number[] };\n\nexport type TimelineArray = Array<TimelineDescription | TrialDescription | TimelineArray>;\n\nexport interface TimelineDescription extends Record<string, any> {\n  timeline: TimelineArray;\n  timeline_variables?: Record<string, any>[];\n\n  name?: string;\n\n  // Control flow\n\n  /** https://www.jspsych.org/latest/overview/timeline/#repeating-a-set-of-trials */\n  repetitions?: number;\n\n  /** https://www.jspsych.org/latest/overview/timeline/#looping-timelines */\n  loop_function?: (data: any) => boolean;\n\n  /** https://www.jspsych.org/latest/overview/timeline/#conditional-timelines */\n  conditional_function?: () => boolean;\n\n  // Randomization\n\n  /** https://www.jspsych.org/latest/overview/timeline/#random-orders-of-trials */\n  randomize_order?: boolean;\n\n  /** https://www.jspsych.org/latest/overview/timeline/#sampling-methods */\n  sample?: SampleOptions;\n\n  // Events\n\n  /** https://www.jspsych.org/latest/overview/events/#on_timeline_start */\n  on_timeline_start?: () => void;\n\n  /** https://www.jspsych.org/latest/overview/events/#on_timeline_finish */\n  on_timeline_finish?: () => void;\n}\n\nexport const timelineDescriptionKeys = [\n  \"timeline\",\n  \"timeline_variables\",\n  \"name\",\n  \"repetitions\",\n  \"loop_function\",\n  \"conditional_function\",\n  \"randomize_order\",\n  \"sample\",\n  \"on_timeline_start\",\n  \"on_timeline_finish\",\n];\n\nexport function isTrialDescription(\n  description: TrialDescription | TimelineDescription\n): description is TrialDescription {\n  return !isTimelineDescription(description);\n}\n\nexport function isTimelineDescription(\n  description: TrialDescription | TimelineDescription | TimelineArray\n): description is TimelineDescription | TimelineArray {\n  return Boolean((description as TimelineDescription).timeline) || Array.isArray(description);\n}\n\nexport enum TimelineNodeStatus {\n  PENDING,\n  RUNNING,\n  PAUSED,\n  COMPLETED,\n  ABORTED,\n}\n\n/**\n * Functions and options needed by `TimelineNode`s, provided by the `JsPsych` instance. This\n * approach allows to keep the public `JsPsych` API slim and decouples the `JsPsych` and timeline\n * node classes, simplifying unit testing.\n */\nexport interface TimelineNodeDependencies {\n  /**\n   * Called at the start of a trial, prior to invoking the plugin's trial method.\n   */\n  onTrialStart: (trial: Trial) => void;\n\n  /**\n   * Called when a trial's result data is available, before invoking `onTrialFinished()`.\n   */\n  onTrialResultAvailable: (trial: Trial) => void;\n\n  /**\n   * Called after a trial has finished.\n   */\n  onTrialFinished: (trial: Trial) => void;\n\n  /**\n   * Invoke `on_start` extension callbacks according to `extensionsConfiguration`\n   */\n  runOnStartExtensionCallbacks(extensionsConfiguration: TrialExtensionsConfiguration): void;\n\n  /**\n   * Invoke `on_load` extension callbacks according to `extensionsConfiguration`\n   */\n  runOnLoadExtensionCallbacks(extensionsConfiguration: TrialExtensionsConfiguration): void;\n\n  /**\n   * Invoke `on_finish` extension callbacks according to `extensionsConfiguration` and return a\n   * joint extensions result object\n   */\n  runOnFinishExtensionCallbacks(\n    extensionsConfiguration: TrialExtensionsConfiguration\n  ): Promise<Record<string, any>>;\n\n  /**\n   * Returns the simulation mode or `undefined`, if the experiment is not running in simulation\n   * mode.\n   */\n  getSimulationMode(): SimulationMode | undefined;\n\n  /**\n   * Returns the global simulation options as passed to `jsPsych.simulate()`\n   */\n  getGlobalSimulationOptions(): Record<string, SimulationOptionsParameter>;\n\n  /**\n   * Given a plugin class, create a new instance of it and return it.\n   */\n  instantiatePlugin: <Info extends PluginInfo>(\n    pluginClass: Class<JsPsychPlugin<Info>>\n  ) => JsPsychPlugin<Info>;\n\n  /**\n   * Return JsPsych's display element so it can be provided to plugins\n   */\n  getDisplayElement: () => HTMLElement;\n\n  /**\n   * Return the default inter-trial interval as provided to `initJsPsych()`\n   */\n  getDefaultIti: () => number;\n\n  /**\n   * A `PromiseWrapper` whose promise is resolved with result data whenever `jsPsych.finishTrial()`\n   * is called.\n   */\n  finishTrialPromise: PromiseWrapper<TrialResult | void>;\n\n  /**\n   * Clear all of the timeouts\n   */\n  clearAllTimeouts: () => void;\n}\n\nexport type TrialResult = Record<string, any>;\nexport type TrialResults = Array<Record<string, any>>;\n","/**\n * Maintains a promise and offers a function to resolve it. Whenever the promise is resolved, it is\n * replaced with a new one.\n */\nexport class PromiseWrapper<ResolveType = void> {\n  constructor() {\n    this.reset();\n  }\n\n  private promise: Promise<ResolveType>;\n  private resolvePromise: (resolveValue: ResolveType) => void;\n\n  reset() {\n    this.promise = new Promise((resolve) => {\n      this.resolvePromise = resolve;\n    });\n  }\n  get() {\n    return this.promise;\n  }\n  resolve(value: ResolveType) {\n    this.resolvePromise(value);\n    this.reset();\n  }\n}\n\nexport function isPromise(value: any): value is Promise<any> {\n  return value && typeof value[\"then\"] === \"function\";\n}\n\nexport function delay(ms: number) {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Returns the string representation of a `path` array like accepted by lodash's `get` and `set`\n * functions.\n */\nexport function parameterPathArrayToString([firstPathElement, ...remainingPathElements]: string[]) {\n  let pathString = firstPathElement ?? \"\";\n\n  for (const pathElement of remainingPathElements) {\n    pathString += Number.isNaN(Number.parseInt(pathElement))\n      ? `.${pathElement}`\n      : `[${pathElement}]`;\n  }\n\n  return pathString;\n}\n\nfunction isObjectOrArray(value: any): value is Record<string, any> | any[] {\n  return typeof value === \"object\" && value !== null;\n}\n\ntype LookupResult = { doesPathExist: boolean; value?: any };\n\n/**\n * Initialized with an object, provides a `lookup` method to look up nested object and array paths\n * and a `set` method to override the element that `lookup` uses at a given path. The original\n * object remains unmodified. All looked up values are cached, including those at intermediate\n * paths. This means, `set`ting the element at a path only affects nested path lookups if the paths\n * have not been looked up and cached before.\n */\nexport class ParameterObjectPathCache {\n  private static lookupChild(\n    objectOrArray: Record<string, any> | any[],\n    childName: string\n  ): LookupResult {\n    let doesPathExist: boolean = false;\n    let childValue: any;\n\n    if (Number.isNaN(Number.parseInt(childName))) {\n      // `childName` refers to an object property\n      if (Object.hasOwn(objectOrArray, childName)) {\n        doesPathExist = true;\n        childValue = objectOrArray[childName];\n      }\n    } else {\n      // `childName` refers to an array index\n      if (Number.parseInt(childName) < objectOrArray.length) {\n        doesPathExist = true;\n        childValue = objectOrArray[childName];\n      }\n    }\n\n    return { doesPathExist, value: childValue };\n  }\n\n  private cache = new Map<string, any>();\n  private rootObject: any;\n\n  private get(path: string[]) {\n    return this.cache.get(path.join(\".\"));\n  }\n\n  private has(path: string[]) {\n    return this.cache.has(path.join(\".\"));\n  }\n\n  constructor() {}\n\n  public initialize(rootObject: any) {\n    this.rootObject = rootObject;\n    this.cache.set(\"\", rootObject);\n  }\n\n  public reset() {\n    this.cache.clear();\n    this.cache.set(\"\", this.rootObject);\n  }\n\n  public set(path: string[], value: any) {\n    this.cache.set(path.join(\".\"), value);\n  }\n\n  public lookup(path: string[]): LookupResult {\n    if (this.has(path)) {\n      return { doesPathExist: true, value: this.get(path) };\n    }\n\n    // Recursively find the closest ancestor path that has already been cached and start looking up\n    // the path from there, caching intermediate elements along the way\n    const lookupPath = (path: string[]): LookupResult => {\n      const parentPath = path.slice(0, -1);\n      const childName = path[path.length - 1];\n      if (!this.has(parentPath) && parentPath.length > 0) {\n        if (!lookupPath(parentPath).doesPathExist) {\n          return { doesPathExist: false };\n        }\n      }\n\n      const parentValue = this.get(parentPath);\n      if (!isObjectOrArray(parentValue)) {\n        return { doesPathExist: false };\n      }\n\n      const lookupResult = ParameterObjectPathCache.lookupChild(parentValue, childName);\n      if (lookupResult.doesPathExist) {\n        this.set(path, lookupResult.value);\n      }\n      return lookupResult;\n    };\n\n    return lookupPath(path);\n  }\n}\n","import type { Timeline } from \"./Timeline\";\nimport { ParameterObjectPathCache } from \"./util\";\nimport {\n  TimelineArray,\n  TimelineDescription,\n  TimelineNodeDependencies,\n  TimelineNodeStatus,\n  TimelineVariable,\n  TrialDescription,\n  TrialResult,\n} from \".\";\n\nexport type GetParameterValueOptions = {\n  /**\n   * If true, and the retrieved parameter value is a function, invoke the function and return its\n   * return value (defaults to `true`)\n   */\n  evaluateFunctions?: boolean;\n\n  /**\n   * Whether to fall back to parent timeline node parameters (defaults to `true`)\n   */\n  recursive?: boolean;\n\n  /**\n   * Whether the timeline node should cache the parameter lookup result for successive lookups,\n   * including those of nested properties or array elements (defaults to `true`)\n   */\n  cacheResult?: boolean;\n\n  /**\n   * A function that will be invoked with the original result of the parameter value lookup.\n   * Whatever it returns will subsequently be used instead of the original result. This allows to\n   * modify results before they are cached.\n   */\n  replaceResult?: (originalResult: any) => any;\n};\n\nexport abstract class TimelineNode {\n  public abstract readonly description: TimelineDescription | TrialDescription | TimelineArray;\n\n  /**\n   * The globally unique trial index of this node. It is set when the node is run. Timeline nodes\n   * have the same trial index as their first trial.\n   */\n  public index?: number;\n\n  public abstract readonly parent?: Timeline;\n\n  abstract run(): Promise<void>;\n\n  /**\n   * Returns a flat array of all currently available results of this node\n   */\n  abstract getResults(): TrialResult[];\n\n  /**\n   * Recursively evaluates the given timeline variable, starting at the current timeline node.\n   * Returns the result, or `undefined` if the variable is neither specified in the timeline\n   * description of this node, nor in the description of any parent node.\n   */\n  abstract evaluateTimelineVariable(variable: TimelineVariable): any;\n\n  /**\n   * Returns the most recent (child) TimelineNode. For trial nodes, this is always the trial node\n   * itself since trial nodes do not have child nodes. For timeline nodes, the return value is a\n   * Trial object most of the time, but it may also be a Timeline object when a timeline hasn't yet\n   * instantiated its children (e.g. during initial timeline callback functions).\n   */\n  abstract getLatestNode(): TimelineNode;\n\n  /**\n   * Returns an active child timeline (or itself) that matches the given name, or `undefined` if no such child exists.\n   */\n  abstract getActiveTimelineByName(name: string): Timeline | undefined;\n\n  protected status = TimelineNodeStatus.PENDING;\n\n  constructor(protected readonly dependencies: TimelineNodeDependencies) {}\n\n  getStatus() {\n    return this.status;\n  }\n\n  private parameterValueCache = new ParameterObjectPathCache();\n\n  /**\n   * Initializes the parameter value cache with `this.description`. To be called by subclass\n   * constructors after setting `this.description`.\n   */\n  protected initializeParameterValueCache() {\n    this.parameterValueCache.initialize(this.description);\n  }\n\n  /**\n   * Resets all cached parameter values in this timeline node and all of its parents. This is\n   * necessary to re-evaluate function parameters and timeline variables at each new trial.\n   */\n  protected resetParameterValueCache() {\n    this.parameterValueCache.reset();\n    this.parent?.resetParameterValueCache();\n  }\n\n  /**\n   * Retrieves a parameter value from the description of this timeline node, recursively falling\n   * back to the description of each parent timeline node unless `recursive` is set to `false`. If\n   * the parameter...\n   *\n   * * is a timeline variable, evaluates the variable and returns the result.\n   * * is not specified, returns `undefined`.\n   * * is a function and `evaluateFunctions` is not set to `false`, invokes the function and returns\n   *   its return value\n   * * has previously been looked up, return the cached result of the previous lookup\n   *\n   * @param parameterPath The path of the respective parameter in the timeline node description. If\n   * the path is an array, nested object properties or array items will be looked up.\n   * @param options See {@link GetParameterValueOptions}\n   */\n  public getParameterValue(\n    parameterPath: string | string[],\n    options: GetParameterValueOptions = {}\n  ): any {\n    const {\n      evaluateFunctions = true,\n      recursive = true,\n      cacheResult = true,\n      replaceResult,\n    } = options;\n\n    if (typeof parameterPath === \"string\") {\n      parameterPath = [parameterPath];\n    }\n\n    let { doesPathExist, value: result } = this.parameterValueCache.lookup(parameterPath);\n    if (!doesPathExist && recursive && this.parent) {\n      result = this.parent.getParameterValue(parameterPath, options);\n    }\n\n    if (typeof result === \"function\" && evaluateFunctions) {\n      result = result();\n    }\n    if (result instanceof TimelineVariable) {\n      result = this.evaluateTimelineVariable(result);\n    }\n\n    if (typeof replaceResult === \"function\") {\n      result = replaceResult(result);\n    }\n\n    if (cacheResult) {\n      this.parameterValueCache.set(parameterPath, result);\n    }\n\n    return result;\n  }\n\n  /**\n   * Retrieves and evaluates the `data` parameter. It is different from other parameters in that\n   * it's properties may be functions that have to be evaluated, and parent nodes' data parameter\n   * properties are merged into the result.\n   */\n  public getDataParameter(): Record<string, any> | undefined {\n    const data = this.getParameterValue(\"data\", { recursive: false });\n\n    return {\n      ...Object.fromEntries(\n        typeof data === \"object\"\n          ? Object.keys(data).map((key) => [key, this.getParameterValue([\"data\", key])])\n          : []\n      ),\n      ...this.parent?.getDataParameter(),\n    };\n  }\n}\n","import { Class } from \"type-fest\";\n\nimport { ParameterInfos } from \"../modules/plugins\";\nimport { JsPsychPlugin, ParameterType, PluginInfo } from \"../modules/plugins\";\nimport { deepCopy, deepMerge } from \"../modules/utils\";\nimport { Timeline } from \"./Timeline\";\nimport { GetParameterValueOptions, TimelineNode } from \"./TimelineNode\";\nimport { delay, isPromise, parameterPathArrayToString } from \"./util\";\nimport {\n  SimulationOptions,\n  TimelineNodeDependencies,\n  TimelineNodeStatus,\n  TimelineVariable,\n  TrialDescription,\n  TrialResult,\n  timelineDescriptionKeys,\n} from \".\";\n\nexport class Trial extends TimelineNode {\n  public readonly pluginClass: Class<JsPsychPlugin<any>>;\n  public pluginInstance: JsPsychPlugin<any>;\n  public trialObject?: TrialDescription;\n  public index?: number;\n\n  private result: TrialResult;\n  private readonly pluginInfo: PluginInfo;\n\n  constructor(\n    dependencies: TimelineNodeDependencies,\n    public readonly description: TrialDescription,\n    public readonly parent: Timeline\n  ) {\n    super(dependencies);\n    this.initializeParameterValueCache();\n\n    this.trialObject = deepCopy(description);\n    this.pluginClass = this.getParameterValue(\"type\", { evaluateFunctions: false });\n    this.pluginInfo = this.pluginClass?.[\"info\"];\n    if (!this.pluginInfo) {\n      throw new Error(\n        \"Plugin not recognized. Please provide a valid plugin using the 'type' parameter.\"\n      );\n    }\n\n    if (!(\"version\" in this.pluginInfo) && !(\"data\" in this.pluginInfo)) {\n      console.warn(\n        this.pluginInfo[\"name\"],\n        \"is missing the 'version' and 'data' fields. Please update plugin as 'version' and 'data' will be required in v9. See https://www.jspsych.org/latest/developers/plugin-development/ for more details.\"\n      );\n    } else if (!(\"version\" in this.pluginInfo)) {\n      console.warn(\n        this.pluginInfo[\"name\"],\n        \"is missing the 'version' field. Please update plugin as 'version' will be required in v9. See https://www.jspsych.org/latest/developers/plugin-development/ for more details.\"\n      );\n    } else if (!(\"data\" in this.pluginInfo)) {\n      console.warn(\n        this.pluginInfo[\"name\"],\n        \"is missing the 'data' field. Please update plugin as 'data' will be required in v9. See https://www.jspsych.org/latest/developers/plugin-development/ for more details.\"\n      );\n    }\n  }\n\n  public async run() {\n    this.status = TimelineNodeStatus.RUNNING;\n    this.processParameters();\n\n    this.onStart();\n    this.addCssClasses();\n\n    this.pluginInstance = this.dependencies.instantiatePlugin(this.pluginClass);\n\n    this.result = this.processResult(await this.executeTrial());\n\n    this.dependencies.onTrialResultAvailable(this);\n\n    this.status = TimelineNodeStatus.COMPLETED;\n\n    await this.onFinish();\n    this.removeCssClasses();\n\n    const gap = this.getParameterValue(\"post_trial_gap\") ?? this.dependencies.getDefaultIti();\n    if (gap !== 0 && this.dependencies.getSimulationMode() !== \"data-only\") {\n      await delay(gap);\n    }\n\n    this.resetParameterValueCache();\n  }\n\n  private async executeTrial() {\n    const trialPromise = this.dependencies.finishTrialPromise.get();\n\n    /** Used as a way to figure out if `finishTrial()` has ben called without awaiting `trialPromise` */\n    let hasTrialPromiseBeenResolved = false;\n    trialPromise.then(() => {\n      hasTrialPromiseBeenResolved = true;\n    });\n\n    const { trialReturnValue, hasTrialBeenSimulated } = this.invokeTrialMethod();\n\n    // Wait until the trial has completed and grab result data\n    let result: TrialResult | void;\n    if (isPromise(trialReturnValue)) {\n      result = await Promise.race([trialReturnValue, trialPromise]);\n\n      // If `finishTrial()` was called, use the result provided to it. This may happen although\n      // `trialReturnValue` won the race (\"run-to-completion\").\n      if (hasTrialPromiseBeenResolved) {\n        result = await trialPromise;\n      }\n    } else {\n      // The `simulate` method always invokes `onLoad()`, so we don't call `onLoad()` when the trial\n      // has been simulated\n      if (!hasTrialBeenSimulated) {\n        this.onLoad();\n      }\n\n      result = await trialPromise;\n    }\n\n    // The trial has finished, time to clean up.\n    this.cleanupTrial();\n\n    return result;\n  }\n\n  private invokeTrialMethod(): {\n    trialReturnValue: void | Promise<void | TrialResult>;\n    hasTrialBeenSimulated: boolean;\n  } {\n    const globalSimulationMode = this.dependencies.getSimulationMode();\n\n    if (globalSimulationMode && typeof this.pluginInstance.simulate === \"function\") {\n      const simulationOptions = this.getSimulationOptions();\n\n      if (simulationOptions.simulate !== false) {\n        return {\n          hasTrialBeenSimulated: true,\n          trialReturnValue: this.pluginInstance.simulate(\n            this.trialObject,\n            simulationOptions.mode ?? globalSimulationMode,\n            simulationOptions,\n            this.onLoad\n          ),\n        };\n      }\n    }\n\n    return {\n      hasTrialBeenSimulated: false,\n      trialReturnValue: this.pluginInstance.trial(\n        this.dependencies.getDisplayElement(),\n        this.trialObject,\n        this.onLoad\n      ),\n    };\n  }\n\n  /**\n   * Cleanup the trial by removing the display element and removing event listeners\n   */\n  private cleanupTrial() {\n    this.dependencies.clearAllTimeouts();\n    this.dependencies.getDisplayElement().innerHTML = \"\";\n  }\n\n  /**\n   * Add the CSS classes from the `css_classes` parameter to the display element\n   */\n  private addCssClasses() {\n    const classes: string | string[] = this.getParameterValue(\"css_classes\");\n    const classList = this.dependencies.getDisplayElement().classList;\n    if (typeof classes === \"string\") {\n      classList.add(classes);\n    } else if (Array.isArray(classes)) {\n      classList.add(...classes);\n    }\n  }\n\n  /**\n   * Removes the provided css classes from the display element\n   */\n  private removeCssClasses() {\n    const classes = this.getParameterValue(\"css_classes\");\n    if (classes) {\n      this.dependencies\n        .getDisplayElement()\n        .classList.remove(...(typeof classes === \"string\" ? [classes] : classes));\n    }\n  }\n\n  private processResult(result: TrialResult | void) {\n    if (!result) {\n      result = {};\n    }\n\n    for (const [parameterName, shouldParameterBeIncluded] of Object.entries(\n      this.getParameterValue(\"save_trial_parameters\") ?? {}\n    )) {\n      if (this.pluginInfo.parameters[parameterName]) {\n        if (shouldParameterBeIncluded && !Object.hasOwn(result, parameterName)) {\n          let parameterValue = this.trialObject[parameterName];\n          if (typeof parameterValue === \"function\") {\n            parameterValue = parameterValue.toString();\n          }\n          result[parameterName] = parameterValue;\n        } else if (!shouldParameterBeIncluded && Object.hasOwn(result, parameterName)) {\n          delete result[parameterName];\n        }\n      } else {\n        console.warn(\n          `Non-existent parameter \"${parameterName}\" specified in save_trial_parameters.`\n        );\n      }\n    }\n\n    result = {\n      ...this.getDataParameter(),\n      ...result,\n      trial_type: this.pluginInfo.name,\n      trial_index: this.index,\n      plugin_version: this.pluginInfo[\"version\"] ? this.pluginInfo[\"version\"] : null,\n    };\n\n    // Add timeline variables to the result according to the `save_timeline_variables` parameter\n    const saveTimelineVariables = this.getParameterValue(\"save_timeline_variables\");\n    if (saveTimelineVariables === true) {\n      result.timeline_variables = { ...this.parent.getAllTimelineVariables() };\n    } else if (Array.isArray(saveTimelineVariables)) {\n      result.timeline_variables = Object.fromEntries(\n        Object.entries(this.parent.getAllTimelineVariables()).filter(([key, _]) =>\n          saveTimelineVariables.includes(key)\n        )\n      );\n    }\n\n    return result;\n  }\n\n  /**\n   * Runs a callback function retrieved from a parameter value and returns its result.\n   *\n   * @param parameterName The name of the parameter to retrieve the callback function from.\n   * @param callbackParameters The parameters (if any) to be passed to the callback function\n   */\n  private runParameterCallback(parameterName: string, ...callbackParameters: unknown[]) {\n    const callback = this.getParameterValue(parameterName, { evaluateFunctions: false });\n    if (callback) {\n      return callback(...callbackParameters);\n    }\n  }\n\n  private onStart() {\n    this.dependencies.onTrialStart(this);\n    this.runParameterCallback(\"on_start\", this.trialObject);\n    this.dependencies.runOnStartExtensionCallbacks(this.getParameterValue(\"extensions\"));\n  }\n\n  private onLoad = () => {\n    this.runParameterCallback(\"on_load\");\n    this.dependencies.runOnLoadExtensionCallbacks(this.getParameterValue(\"extensions\"));\n  };\n\n  private async onFinish() {\n    const extensionResults = await this.dependencies.runOnFinishExtensionCallbacks(\n      this.getParameterValue(\"extensions\")\n    );\n    Object.assign(this.result, extensionResults);\n\n    await Promise.resolve(this.runParameterCallback(\"on_finish\", this.getResult()));\n\n    this.dependencies.onTrialFinished(this);\n  }\n\n  public evaluateTimelineVariable(variable: TimelineVariable) {\n    // Timeline variable values are specified at the timeline level, not at the trial level, hence\n    // deferring to the parent timeline here\n    return this.parent?.evaluateTimelineVariable(variable);\n  }\n\n  public getParameterValue(\n    parameterPath: string | string[],\n    options: GetParameterValueOptions = {}\n  ) {\n    // Disable recursion for timeline description keys\n    if (\n      timelineDescriptionKeys.includes(\n        typeof parameterPath === \"string\" ? parameterPath : parameterPath[0]\n      )\n    ) {\n      options.recursive = false;\n    }\n    return super.getParameterValue(parameterPath, options);\n  }\n\n  /**\n   * Retrieves and evaluates the `simulation_options` parameter, considering nested properties and\n   * global simulation options.\n   */\n  public getSimulationOptions() {\n    const simulationOptions: SimulationOptions = this.getParameterValue(\"simulation_options\", {\n      replaceResult: (result = {}) => {\n        if (typeof result === \"string\") {\n          // Look up the global simulation options by their key\n          const globalSimulationOptions = this.dependencies.getGlobalSimulationOptions();\n          result = globalSimulationOptions[result] ?? globalSimulationOptions[\"default\"] ?? {};\n        }\n\n        return deepMerge(\n          deepCopy(this.dependencies.getGlobalSimulationOptions().default),\n          deepCopy(result)\n        );\n      },\n    });\n\n    if (typeof simulationOptions === \"undefined\") {\n      return {};\n    }\n\n    simulationOptions.mode = this.getParameterValue([\"simulation_options\", \"mode\"]);\n    simulationOptions.simulate = this.getParameterValue([\"simulation_options\", \"simulate\"]);\n    simulationOptions.data = this.getParameterValue([\"simulation_options\", \"data\"]);\n\n    if (typeof simulationOptions.data === \"object\") {\n      simulationOptions.data = Object.fromEntries(\n        Object.keys(simulationOptions.data).map((key) => [\n          key,\n          this.getParameterValue([\"simulation_options\", \"data\", key]),\n        ])\n      );\n    }\n\n    return simulationOptions;\n  }\n\n  /**\n   * Returns the result object of this trial or `undefined` if the result is not yet known or the\n   * `record_data` trial parameter is `false`.\n   */\n  public getResult() {\n    return this.getParameterValue(\"record_data\") === false ? undefined : this.result;\n  }\n\n  public getResults() {\n    const result = this.getResult();\n    return result ? [result] : [];\n  }\n\n  /**\n   * Checks that the parameters provided in the trial description align with the plugin's info\n   * object, resolves missing parameter values from the parent timeline, resolves timeline variable\n   * parameters, evaluates parameter functions if the expected parameter type is not `FUNCTION`, and\n   * sets default values for optional parameters.\n   */\n  private processParameters() {\n    const assignParameterValues = (\n      parameterObject: Record<string, any>,\n      parameterInfos: ParameterInfos,\n      parentParameterPath: string[] = []\n    ) => {\n      for (const [parameterName, parameterConfig] of Object.entries(parameterInfos)) {\n        const parameterPath = [...parentParameterPath, parameterName];\n\n        // evaluate parameter and validate required parameter\n        let parameterValue = this.getParameterValue(parameterPath, {\n          evaluateFunctions: parameterConfig.type !== ParameterType.FUNCTION,\n          replaceResult: (originalResult) => {\n            if (typeof originalResult === \"undefined\") {\n              if (typeof parameterConfig.default === \"undefined\") {\n                throw new Error(\n                  `You must specify a value for the \"${parameterPathArrayToString(\n                    parameterPath\n                  )}\" parameter in the \"${this.pluginInfo.name}\" plugin.`\n                );\n              } else {\n                return parameterConfig.default;\n              }\n            } else {\n              return originalResult;\n            }\n          },\n        });\n\n        // TODO: ensure that this throws an error in v9!\n        // major parameter type validation\n        if (!parameterConfig.array && parameterValue !== null) {\n          switch (parameterConfig.type) {\n            case ParameterType.BOOL:\n              if (typeof parameterValue !== \"boolean\") {\n                const parameterPathString = parameterPathArrayToString(parameterPath);\n                console.warn(\n                  `A non-boolean value (\\`${parameterValue}\\`) was provided for the boolean parameter \"${parameterPathString}\" in the \"${this.pluginInfo.name}\" plugin.`\n                );\n              }\n              break;\n            // @ts-ignore falls through\n            case ParameterType.KEYS: // \"ALL_KEYS\", \"NO_KEYS\", and single key strings are checked here\n              if (Array.isArray(parameterValue)) break;\n            case ParameterType.STRING:\n            case ParameterType.HTML_STRING:\n            case ParameterType.KEY:\n            case ParameterType.AUDIO:\n            case ParameterType.VIDEO:\n            case ParameterType.IMAGE:\n              if (typeof parameterValue !== \"string\") {\n                const parameterPathString = parameterPathArrayToString(parameterPath);\n                console.warn(\n                  `A non-string value (\\`${parameterValue}\\`) was provided for the parameter \"${parameterPathString}\" in the \"${this.pluginInfo.name}\" plugin.`\n                );\n              }\n              break;\n            case ParameterType.FLOAT:\n            case ParameterType.INT:\n              if (typeof parameterValue !== \"number\") {\n                const parameterPathString = parameterPathArrayToString(parameterPath);\n                console.warn(\n                  `A non-numeric value (\\`${parameterValue}\\`) was provided for the numeric parameter \"${parameterPathString}\" in the \"${this.pluginInfo.name}\" plugin.`\n                );\n              }\n              break;\n            case ParameterType.FUNCTION:\n              if (typeof parameterValue !== \"function\") {\n                const parameterPathString = parameterPathArrayToString(parameterPath);\n                console.warn(\n                  `A non-function value (\\`${parameterValue}\\`) was provided for the function parameter \"${parameterPathString}\" in the \"${this.pluginInfo.name}\" plugin.`\n                );\n              }\n              break;\n            case ParameterType.SELECT:\n              if (!parameterConfig.options) {\n                const parameterPathString = parameterPathArrayToString(parameterPath);\n                console.warn(\n                  `The \"options\" array is required for the \"select\" parameter \"${parameterPathString}\" in the \"${this.pluginInfo.name}\" plugin.`\n                );\n              }\n          }\n\n          // truncate floats to integers if the parameter type is INT\n          if (parameterConfig.type === ParameterType.INT && parameterValue % 1 !== 0) {\n            const parameterPathString = parameterPathArrayToString(parameterPath);\n            console.warn(\n              `A float value (\\`${parameterValue}\\`) was provided for the integer parameter \"${parameterPathString}\" in the \"${this.pluginInfo.name}\" plugin. The value will be truncated to an integer.`\n            );\n\n            parameterValue = Math.trunc(parameterValue);\n          }\n        }\n\n        if (parameterConfig.type === ParameterType.SELECT) {\n          if (!parameterConfig.options.includes(parameterValue)) {\n            const parameterPathString = parameterPathArrayToString(parameterPath);\n            console.warn(\n              `The value \"${parameterValue}\" is not a valid option for the parameter \"${parameterPathString}\" in the \"${\n                this.pluginInfo.name\n              }\" plugin. Valid options are: ${parameterConfig.options.join(\", \")}.`\n            );\n          }\n        }\n\n        // array validation\n        if (parameterConfig.array && !Array.isArray(parameterValue)) {\n          const parameterPathString = parameterPathArrayToString(parameterPath);\n          throw new Error(\n            `A non-array value (\\`${parameterValue}\\`) was provided for the array parameter \"${parameterPathString}\" in the \"${this.pluginInfo.name}\" plugin. Please make sure that \"${parameterPathString}\" is an array.`\n          );\n        }\n\n        if (parameterConfig.type === ParameterType.COMPLEX && parameterConfig.nested) {\n          // Assign parameter values according to the `nested` schema\n          if (parameterConfig.array) {\n            // ...for each nested array element\n            parameterValue = parameterValue.map((_, arrayIndex) => {\n              const arrayElementPath = [...parameterPath, arrayIndex.toString()];\n              const arrayElementValue = this.getParameterValue(arrayElementPath);\n              assignParameterValues(arrayElementValue, parameterConfig.nested, arrayElementPath);\n              return arrayElementValue;\n            });\n          } else {\n            // ...for the nested object\n            assignParameterValues(parameterValue, parameterConfig.nested, parameterPath);\n          }\n        }\n\n        parameterObject[parameterName] = parameterValue;\n      }\n    };\n\n    const trialObject = deepCopy(this.description);\n    assignParameterValues(trialObject, this.pluginInfo.parameters);\n    this.trialObject = trialObject;\n  }\n\n  public getLatestNode() {\n    return this;\n  }\n\n  public getActiveTimelineByName(name: string): Timeline | undefined {\n    // This returns undefined because the function is looking\n    // for a timeline. If we get to this point, then none\n    // of the parent nodes match the name.\n    return undefined;\n  }\n}\n","import { DataCollection } from \"../modules/data/DataCollection\";\nimport {\n  repeat,\n  sampleWithReplacement,\n  sampleWithoutReplacement,\n  shuffle,\n  shuffleAlternateGroups,\n} from \"../modules/randomization\";\nimport { TimelineNode } from \"./TimelineNode\";\nimport { Trial } from \"./Trial\";\nimport { PromiseWrapper } from \"./util\";\nimport {\n  TimelineArray,\n  TimelineDescription,\n  TimelineNodeDependencies,\n  TimelineNodeStatus,\n  TimelineVariable,\n  TrialDescription,\n  TrialResult,\n  isTimelineDescription,\n  isTrialDescription,\n} from \".\";\n\nexport class Timeline extends TimelineNode {\n  public readonly children: TimelineNode[] = [];\n  public readonly description: TimelineDescription;\n\n  constructor(\n    dependencies: TimelineNodeDependencies,\n    description: TimelineDescription | TimelineArray,\n    public readonly parent?: Timeline\n  ) {\n    super(dependencies);\n    this.description = Array.isArray(description) ? { timeline: description } : description;\n    this.initializeParameterValueCache();\n  }\n\n  private currentChild?: TimelineNode;\n  private shouldAbort = false;\n\n  public async run() {\n    if (typeof this.index === \"undefined\") {\n      // We're the first timeline node to run. Otherwise, another node would have set our index\n      // right before running us.\n      this.index = 0;\n    }\n\n    this.status = TimelineNodeStatus.RUNNING;\n\n    const { conditional_function, loop_function, repetitions = 1 } = this.description;\n\n    // Generate initial timeline variable order so the first set of timeline variables is already\n    // available to the `on_timeline_start` and `conditional_function` callbacks\n    let timelineVariableOrder = this.generateTimelineVariableOrder();\n    this.setCurrentTimelineVariablesByIndex(timelineVariableOrder[0]);\n    let isInitialTimelineVariableOrder = true; // So we don't regenerate the order in the first iteration\n\n    let currentLoopIterationResults: TrialResult[];\n\n    if (!conditional_function || conditional_function()) {\n      this.onStart();\n\n      for (let repetition = 0; repetition < repetitions; repetition++) {\n        do {\n          currentLoopIterationResults = [];\n\n          // Generate a new timeline variable order in each iteration except for the first one where\n          // it has been done before\n          if (isInitialTimelineVariableOrder) {\n            isInitialTimelineVariableOrder = false;\n          } else {\n            timelineVariableOrder = this.generateTimelineVariableOrder();\n          }\n\n          for (const timelineVariableIndex of timelineVariableOrder) {\n            this.setCurrentTimelineVariablesByIndex(timelineVariableIndex);\n\n            for (const childNodeDescription of this.description.timeline) {\n              const childNode = this.instantiateChildNode(childNodeDescription);\n\n              const previousChild = this.currentChild;\n              this.currentChild = childNode;\n              childNode.index = previousChild\n                ? previousChild.getLatestNode().index + 1\n                : this.index;\n\n              await childNode.run();\n              // @ts-expect-error TS thinks `this.status` must be `RUNNING` now, but it might have\n              // changed while `await`ing\n              if (this.status === TimelineNodeStatus.PAUSED) {\n                await this.resumePromise.get();\n              }\n              if (this.shouldAbort) {\n                this.status = TimelineNodeStatus.ABORTED;\n                return;\n              }\n\n              currentLoopIterationResults.push(...this.currentChild.getResults());\n            }\n          }\n        } while (loop_function && loop_function(new DataCollection(currentLoopIterationResults)));\n      }\n\n      this.onFinish();\n    }\n\n    this.status = TimelineNodeStatus.COMPLETED;\n  }\n\n  private onStart() {\n    if (this.description.on_timeline_start) {\n      this.description.on_timeline_start();\n    }\n  }\n\n  private onFinish() {\n    if (this.description.on_timeline_finish) {\n      this.description.on_timeline_finish();\n    }\n  }\n\n  pause() {\n    if (this.currentChild instanceof Timeline) {\n      this.currentChild.pause();\n    }\n    this.status = TimelineNodeStatus.PAUSED;\n  }\n\n  private resumePromise = new PromiseWrapper();\n  resume() {\n    if (this.status == TimelineNodeStatus.PAUSED) {\n      if (this.currentChild instanceof Timeline) {\n        this.currentChild.resume();\n      }\n      this.status = TimelineNodeStatus.RUNNING;\n      this.resumePromise.resolve();\n    }\n  }\n\n  /**\n   * If the timeline is running or paused, aborts the timeline after the current trial has completed\n   */\n  abort() {\n    if (this.status === TimelineNodeStatus.RUNNING || this.status === TimelineNodeStatus.PAUSED) {\n      if (this.currentChild instanceof Timeline) {\n        this.currentChild.abort();\n      }\n\n      this.shouldAbort = true;\n      if (this.status === TimelineNodeStatus.PAUSED) {\n        this.resume();\n      }\n    }\n  }\n\n  private instantiateChildNode(\n    childDescription: TimelineDescription | TimelineArray | TrialDescription\n  ) {\n    const newChildNode = isTimelineDescription(childDescription)\n      ? new Timeline(this.dependencies, childDescription, this)\n      : new Trial(this.dependencies, childDescription, this);\n\n    this.children.push(newChildNode);\n    return newChildNode;\n  }\n\n  private currentTimelineVariables: Record<string, any>;\n  private setCurrentTimelineVariablesByIndex(index: number | null) {\n    this.currentTimelineVariables = {\n      ...this.parent?.getAllTimelineVariables(),\n      ...(index === null ? undefined : this.description.timeline_variables[index]),\n    };\n  }\n\n  /**\n   * If the timeline has timeline variables, returns the order of `timeline_variables` array indices\n   * to be used, according to the timeline's `sample` setting. If the timeline has no timeline\n   * variables, returns `[null]`.\n   */\n  private generateTimelineVariableOrder() {\n    const timelineVariableLength = this.description.timeline_variables?.length;\n    if (!timelineVariableLength) {\n      return [null];\n    }\n\n    let order = [...Array(timelineVariableLength).keys()];\n\n    const sample = this.description.sample;\n\n    if (sample) {\n      switch (sample.type) {\n        case \"custom\":\n          order = sample.fn(order);\n          break;\n\n        case \"with-replacement\":\n          order = sampleWithReplacement(order, sample.size, sample.weights);\n          break;\n\n        case \"without-replacement\":\n          order = sampleWithoutReplacement(order, sample.size);\n          break;\n\n        case \"fixed-repetitions\":\n          order = repeat(order, sample.size);\n          break;\n\n        case \"alternate-groups\":\n          order = shuffleAlternateGroups(sample.groups, sample.randomize_group_order);\n          break;\n\n        default:\n          throw new Error(\n            `Invalid type \"${\n              // @ts-expect-error TS doesn't have a type for `sample` in this case\n              sample.type\n            }\" in timeline sample parameters. Valid options for type are \"custom\", \"with-replacement\", \"without-replacement\", \"fixed-repetitions\", and \"alternate-groups\"`\n          );\n      }\n    }\n\n    if (this.description.randomize_order) {\n      order = shuffle(order);\n    }\n\n    return order;\n  }\n\n  /**\n   * Returns the current values of all timeline variables, including those from parent timelines\n   */\n  public getAllTimelineVariables() {\n    return this.currentTimelineVariables;\n  }\n\n  public evaluateTimelineVariable(variable: TimelineVariable) {\n    if (this.currentTimelineVariables?.hasOwnProperty(variable.name)) {\n      return this.currentTimelineVariables[variable.name];\n    }\n    throw new Error(`Timeline variable ${variable.name} not found.`);\n  }\n\n  public getResults() {\n    const results: TrialResult[] = [];\n    for (const child of this.children) {\n      if (child instanceof Trial) {\n        const childResult = child.getResult();\n        if (childResult) {\n          results.push(childResult);\n        }\n      } else if (child instanceof Timeline) {\n        results.push(...child.getResults());\n      }\n    }\n\n    return results;\n  }\n\n  /**\n   * Returns the naive progress of the timeline (as a fraction), without considering conditional or\n   * loop functions.\n   */\n  public getNaiveProgress() {\n    if (this.status === TimelineNodeStatus.PENDING) {\n      return 0;\n    }\n\n    const activeNode = this.getLatestNode();\n    if (!activeNode) {\n      return 1;\n    }\n\n    let completedTrials = activeNode.index;\n    if (activeNode.getStatus() === TimelineNodeStatus.COMPLETED) {\n      completedTrials++;\n    }\n\n    return Math.min(completedTrials / this.getNaiveTrialCount(), 1);\n  }\n\n  /**\n   * Recursively computes the naive number of trials in the timeline, without considering\n   * conditional or loop functions.\n   */\n  public getNaiveTrialCount() {\n    // Since child timeline nodes are instantiated lazily, we cannot rely on them but instead have\n    // to recurse the description programmatically.\n\n    const getTrialCount = (description: TimelineArray | TimelineDescription | TrialDescription) => {\n      const getTimelineArrayTrialCount = (description: TimelineArray) =>\n        description\n          .map((childDescription) => getTrialCount(childDescription))\n          .reduce((a, b) => a + b);\n\n      if (Array.isArray(description)) {\n        return getTimelineArrayTrialCount(description);\n      }\n\n      if (isTrialDescription(description)) {\n        return 1;\n      }\n      if (isTimelineDescription(description)) {\n        let conditionCount = description.timeline_variables?.length || 1;\n\n        switch (description.sample?.type) {\n          case \"with-replacement\":\n          case \"without-replacement\":\n            conditionCount = description.sample.size;\n            break;\n\n          case \"fixed-repetitions\":\n            conditionCount *= description.sample.size;\n            break;\n\n          case \"alternate-groups\":\n            conditionCount = description.sample.groups\n              .map((group) => group.length)\n              .reduce((a, b) => a + b, 0);\n            break;\n        }\n\n        return (\n          getTimelineArrayTrialCount(description.timeline) *\n          (description.repetitions ?? 1) *\n          conditionCount\n        );\n      }\n      return 0;\n    };\n\n    return getTrialCount(this.description);\n  }\n\n  public getLatestNode() {\n    return this.currentChild?.getLatestNode() ?? this;\n  }\n\n  public getActiveTimelineByName(name: string) {\n    if (this.description.name === name) {\n      return this;\n    }\n\n    return this.currentChild?.getActiveTimelineByName(name);\n  }\n}\n","import autoBind from \"auto-bind\";\n// To work with citations\nimport { Class } from \"type-fest\";\n\nimport { version } from \"../package.json\";\nimport { ExtensionManager, ExtensionManagerDependencies } from \"./ExtensionManager\";\nimport { JsPsychData, JsPsychDataDependencies } from \"./modules/data\";\nimport { JsPsychExtension } from \"./modules/extensions\";\nimport { PluginAPI, createJointPluginAPIObject } from \"./modules/plugin-api\";\nimport { JsPsychPlugin } from \"./modules/plugins\";\nimport * as randomization from \"./modules/randomization\";\nimport * as turk from \"./modules/turk\";\nimport * as utils from \"./modules/utils\";\nimport { ProgressBar } from \"./ProgressBar\";\nimport {\n  SimulationMode,\n  SimulationOptionsParameter,\n  TimelineArray,\n  TimelineDescription,\n  TimelineNodeDependencies,\n  TimelineVariable,\n  TrialResult,\n} from \"./timeline\";\nimport { Timeline } from \"./timeline/Timeline\";\nimport { Trial } from \"./timeline/Trial\";\nimport { PromiseWrapper } from \"./timeline/util\";\n\nexport class JsPsych {\n  turk = turk;\n  randomization = randomization;\n  utils = utils;\n  data: JsPsychData;\n  pluginAPI: PluginAPI;\n\n  version() {\n    return version;\n  }\n\n  // prettier-ignore\n  private citation: any = '__CITATIONS__';\n\n  /** Options */\n  private options: any = {};\n\n  /** Experiment timeline */\n  private timeline?: Timeline;\n\n  /** Target DOM element */\n  private displayContainerElement: HTMLElement;\n  private displayElement: HTMLElement;\n\n  /** Time that the experiment began */\n  private experimentStartTime: Date;\n\n  /**\n   * Whether the page is retrieved directly via the `file://` protocol (true) or hosted on a web\n   * server (false)\n   */\n  private isFileProtocolUsed = false;\n\n  /** The simulation mode (if the experiment is being simulated) */\n  private simulationMode?: SimulationMode;\n\n  /** Simulation options passed in via `simulate()` */\n  private simulationOptions: Record<string, SimulationOptionsParameter>;\n\n  private extensionManager: ExtensionManager;\n\n  constructor(options?) {\n    // override default options if user specifies an option\n    options = {\n      display_element: undefined,\n      on_finish: () => {},\n      on_trial_start: () => {},\n      on_trial_finish: () => {},\n      on_data_update: () => {},\n      on_interaction_data_update: () => {},\n      on_close: () => {},\n      use_webaudio: true,\n      show_progress_bar: false,\n      message_progress_bar: \"Completion Progress\",\n      auto_update_progress_bar: true,\n      default_iti: 0,\n      minimum_valid_rt: 0,\n      experiment_width: null,\n      override_safe_mode: false,\n      case_sensitive_responses: false,\n      extensions: [],\n      ...options,\n    };\n    this.options = options;\n\n    autoBind(this); // so we can pass JsPsych methods as callbacks and `this` remains the JsPsych instance\n\n    // detect whether page is running in browser as a local file, and if so, disable web audio and\n    // video preloading to prevent CORS issues\n    if (\n      window.location.protocol == \"file:\" &&\n      (options.override_safe_mode === false || typeof options.override_safe_mode === \"undefined\")\n    ) {\n      options.use_webaudio = false;\n      this.isFileProtocolUsed = true;\n      console.warn(\n        \"jsPsych detected that it is running via the file:// protocol and not on a web server. \" +\n          \"To prevent issues with cross-origin requests, Web Audio and video preloading have been disabled. \" +\n          \"If you would like to override this setting, you can set 'override_safe_mode' to 'true' in initJsPsych. \" +\n          \"For more information, see: https://www.jspsych.org/overview/running-experiments\"\n      );\n    }\n\n    // initialize modules\n    this.data = new JsPsychData(this.dataDependencies);\n    this.pluginAPI = createJointPluginAPIObject(this);\n\n    this.extensionManager = new ExtensionManager(\n      this.extensionManagerDependencies,\n      options.extensions\n    );\n  }\n\n  private endMessage?: string;\n\n  /**\n   * Starts an experiment using the provided timeline and returns a promise that is resolved when\n   * the experiment is finished.\n   *\n   * @param timeline The timeline to be run\n   */\n  async run(timeline: TimelineDescription | TimelineArray) {\n    if (typeof timeline === \"undefined\") {\n      console.error(\"No timeline declared in jsPsych.run(). Cannot start experiment.\");\n    }\n\n    if (timeline.length === 0) {\n      console.error(\n        \"No trials have been added to the timeline (the timeline is an empty array). Cannot start experiment.\"\n      );\n    }\n\n    // create experiment timeline\n    this.timeline = new Timeline(this.timelineDependencies, timeline);\n\n    await this.prepareDom();\n    await this.extensionManager.initializeExtensions();\n\n    document.documentElement.setAttribute(\"jspsych\", \"present\");\n\n    this.experimentStartTime = new Date();\n\n    await this.timeline.run();\n    await Promise.resolve(this.options.on_finish(this.data.get()));\n\n    if (this.endMessage) {\n      this.getDisplayElement().innerHTML = this.endMessage;\n    }\n\n    this.data.removeInteractionListeners();\n  }\n\n  async simulate(\n    timeline: any[],\n    simulation_mode: \"data-only\" | \"visual\" = \"data-only\",\n    simulation_options = {}\n  ) {\n    this.simulationMode = simulation_mode;\n    this.simulationOptions = simulation_options;\n    await this.run(timeline);\n  }\n\n  public progressBar?: ProgressBar;\n\n  getProgress() {\n    return {\n      total_trials: this.timeline?.getNaiveTrialCount(),\n      current_trial_global: this.timeline?.getLatestNode().index ?? 0,\n      percent_complete: this.timeline?.getNaiveProgress() * 100,\n    };\n  }\n\n  getStartTime() {\n    return this.experimentStartTime; // TODO This seems inconsistent, given that `getTotalTime()` returns a number, not a `Date`\n  }\n\n  getTotalTime() {\n    if (!this.experimentStartTime) {\n      return 0;\n    }\n    return new Date().getTime() - this.experimentStartTime.getTime();\n  }\n\n  getDisplayElement() {\n    return this.displayElement;\n  }\n\n  getDisplayContainerElement() {\n    return this.displayContainerElement;\n  }\n\n  abortExperiment(endMessage?: string, data = {}) {\n    this.endMessage = endMessage;\n    this.timeline.abort();\n    this.pluginAPI.cancelAllKeyboardResponses();\n    this.pluginAPI.clearAllTimeouts();\n    this.finishTrial(data);\n  }\n\n  abortCurrentTimeline() {\n    let currentTimeline = this.timeline?.getLatestNode();\n    if (currentTimeline instanceof Trial) {\n      currentTimeline = currentTimeline.parent;\n    }\n    if (currentTimeline instanceof Timeline) {\n      currentTimeline.abort();\n    }\n  }\n\n  /**\n   * Aborts a named timeline. The timeline must be currently running in order to abort it.\n   *\n   * @param name The name of the timeline to abort. Timelines can be given names by setting the `name` parameter in the description of the timeline.\n   */\n  abortTimelineByName(name: string): void {\n    const timeline = this.timeline?.getActiveTimelineByName(name);\n    if (timeline) {\n      timeline.abort();\n    }\n  }\n\n  getCurrentTrial() {\n    const activeNode = this.timeline?.getLatestNode();\n    if (activeNode instanceof Trial) {\n      return activeNode.description;\n    }\n    return undefined;\n  }\n\n  getInitSettings() {\n    return this.options;\n  }\n\n  timelineVariable(variableName: string) {\n    return new TimelineVariable(variableName);\n  }\n\n  evaluateTimelineVariable(variableName: string) {\n    return this.timeline\n      ?.getLatestNode()\n      ?.evaluateTimelineVariable(new TimelineVariable(variableName));\n  }\n\n  pauseExperiment() {\n    this.timeline?.pause();\n  }\n\n  resumeExperiment() {\n    this.timeline?.resume();\n  }\n\n  getSafeModeStatus() {\n    return this.isFileProtocolUsed;\n  }\n\n  getTimeline() {\n    return this.timeline?.description.timeline;\n  }\n\n  /**\n   * Prints out a string containing citations for the jsPsych library and all input plugins/extensions in the specified format.\n   * If called without input, prints citation for jsPsych library.\n   *\n   * @param plugins The plugins/extensions to generate citations for. Always prints the citation for the jsPsych library at the top.\n   * @param format The desired output citation format. Currently supports \"apa\" and \"bibtex\".\n   * @returns String containing citations separated with newline character.\n   */\n  getCitations(\n    plugins: Array<Class<JsPsychPlugin<any>> | Class<JsPsychExtension>> = [],\n    format: \"apa\" | \"bibtex\" = \"apa\"\n  ) {\n    const formatOptions = [\"apa\", \"bibtex\"];\n    format = format.toLowerCase() as \"apa\" | \"bibtex\";\n    // Check if plugins is an array\n    if (!Array.isArray(plugins)) {\n      throw new Error(\"Expected array of plugins/extensions\");\n    }\n    // Check if format is supported\n    else if (!formatOptions.includes(format)) {\n      throw new Error(\"Unsupported citation format\");\n    }\n    // Print citations\n    else {\n      const jsPsychCitation = this.citation[format];\n      const citationSet = new Set([jsPsychCitation]);\n\n      for (const plugin of plugins) {\n        try {\n          const pluginCitation = plugin[\"info\"].citations[format];\n          citationSet.add(pluginCitation);\n        } catch {\n          console.error(`${plugin} does not have citation in ${format} format.`);\n        }\n      }\n      const citationList = Array.from(citationSet).join(\"\\n\");\n      return citationList;\n    }\n  }\n\n  get extensions() {\n    return this.extensionManager?.extensions ?? {};\n  }\n\n  private async prepareDom() {\n    // Wait until the document is ready\n    if (document.readyState !== \"complete\") {\n      await new Promise((resolve) => {\n        window.addEventListener(\"load\", resolve);\n      });\n    }\n\n    const options = this.options;\n\n    // set DOM element where jsPsych will render content\n    // if undefined, then jsPsych will use the <body> tag and the entire page\n    if (typeof options.display_element === \"undefined\") {\n      // check if there is a body element on the page\n      let body = document.body;\n      if (!body) {\n        body = document.createElement(\"body\");\n        document.documentElement.appendChild(body);\n      }\n      // using the full page, so we need the HTML element to have 100% height, and body to be full\n      // width and height with no margin\n      document.querySelector(\"html\").style.height = \"100%\";\n\n      body.style.margin = \"0px\";\n      body.style.height = \"100%\";\n      body.style.width = \"100%\";\n      options.display_element = body;\n    } else {\n      // make sure that the display element exists on the page\n      const display =\n        options.display_element instanceof Element\n          ? options.display_element\n          : document.querySelector(\"#\" + options.display_element);\n      if (display === null) {\n        console.error(\"The display_element specified in initJsPsych() does not exist in the DOM.\");\n      } else {\n        options.display_element = display;\n      }\n    }\n\n    const contentElement = document.createElement(\"div\");\n    contentElement.id = \"jspsych-content\";\n\n    const contentWrapperElement = document.createElement(\"div\");\n    contentWrapperElement.className = \"jspsych-content-wrapper\";\n    contentWrapperElement.appendChild(contentElement);\n\n    this.displayContainerElement = options.display_element;\n    this.displayContainerElement.appendChild(contentWrapperElement);\n    this.displayElement = contentElement;\n\n    // set experiment_width if not null\n    if (options.experiment_width !== null) {\n      this.displayElement.style.width = options.experiment_width + \"px\";\n    }\n\n    // add tabIndex attribute to scope event listeners\n    options.display_element.tabIndex = 0;\n\n    // Add CSS classes to container and display elements\n    this.displayContainerElement.classList.add(\"jspsych-display-element\");\n    this.displayElement.classList.add(\"jspsych-content\");\n\n    // create listeners for user browser interaction\n    this.data.createInteractionListeners();\n\n    // add event for closing window\n    window.addEventListener(\"beforeunload\", options.on_close);\n\n    if (this.options.show_progress_bar) {\n      const progressBarContainer = document.createElement(\"div\");\n      progressBarContainer.id = \"jspsych-progressbar-container\";\n\n      this.progressBar = new ProgressBar(progressBarContainer, this.options.message_progress_bar);\n\n      this.getDisplayContainerElement().insertAdjacentElement(\"afterbegin\", progressBarContainer);\n    }\n  }\n\n  private finishTrialPromise = new PromiseWrapper<TrialResult | void>();\n  finishTrial(data?: TrialResult) {\n    this.finishTrialPromise.resolve(data);\n  }\n\n  private timelineDependencies: TimelineNodeDependencies = {\n    onTrialStart: (trial: Trial) => {\n      this.options.on_trial_start(trial.trialObject);\n\n      // apply the focus to the element containing the experiment.\n      this.getDisplayContainerElement().focus();\n      // reset the scroll on the DOM target\n      this.getDisplayElement().scrollTop = 0;\n    },\n\n    onTrialResultAvailable: (trial: Trial) => {\n      const result = trial.getResult();\n      if (result) {\n        result.time_elapsed = this.getTotalTime();\n        this.data.write(trial);\n      }\n    },\n\n    onTrialFinished: (trial: Trial) => {\n      const result = trial.getResult();\n      this.options.on_trial_finish(result);\n\n      if (result) {\n        this.options.on_data_update(result);\n      }\n\n      if (this.progressBar && this.options.auto_update_progress_bar) {\n        this.progressBar.progress = this.timeline.getNaiveProgress();\n      }\n    },\n\n    runOnStartExtensionCallbacks: (extensionsConfiguration) =>\n      this.extensionManager.onStart(extensionsConfiguration),\n\n    runOnLoadExtensionCallbacks: (extensionsConfiguration) =>\n      this.extensionManager.onLoad(extensionsConfiguration),\n\n    runOnFinishExtensionCallbacks: (extensionsConfiguration) =>\n      this.extensionManager.onFinish(extensionsConfiguration),\n\n    getSimulationMode: () => this.simulationMode,\n\n    getGlobalSimulationOptions: () => this.simulationOptions,\n\n    instantiatePlugin: (pluginClass) => new pluginClass(this),\n\n    getDisplayElement: () => this.getDisplayElement(),\n\n    getDefaultIti: () => this.getInitSettings().default_iti,\n\n    finishTrialPromise: this.finishTrialPromise,\n\n    clearAllTimeouts: () => this.pluginAPI.clearAllTimeouts(),\n  };\n\n  private extensionManagerDependencies: ExtensionManagerDependencies = {\n    instantiateExtension: (extensionClass) => new extensionClass(this),\n  };\n\n  private dataDependencies: JsPsychDataDependencies = {\n    getProgress: () => ({\n      time: this.getTotalTime(),\n      trial: this.timeline?.getLatestNode().index ?? 0,\n    }),\n\n    onInteractionRecordAdded: (record) => {\n      this.options.on_interaction_data_update(record);\n    },\n\n    getDisplayElement: () => this.getDisplayElement(),\n  };\n}\n","export class MigrationError extends Error {\n  constructor(message = \"The global `jsPsych` variable is no longer available in jsPsych v7.\") {\n    super(\n      `${message} Please follow the migration guide at https://www.jspsych.org/7.0/support/migration-v7/ to update your experiment.`\n    );\n    this.name = \"MigrationError\";\n  }\n}\n\n// Define a global jsPsych object to handle invocations on it with migration errors\n(window as any).jsPsych = {\n  get init() {\n    throw new MigrationError(\"`jsPsych.init()` was replaced by `initJsPsych()` in jsPsych v7.\");\n  },\n\n  get data() {\n    throw new MigrationError();\n  },\n  get randomization() {\n    throw new MigrationError();\n  },\n  get turk() {\n    throw new MigrationError();\n  },\n  get pluginAPI() {\n    throw new MigrationError();\n  },\n\n  get ALL_KEYS() {\n    throw new MigrationError(\n      'jsPsych.ALL_KEYS was replaced by the \"ALL_KEYS\" string in jsPsych v7.'\n    );\n  },\n  get NO_KEYS() {\n    throw new MigrationError('jsPsych.NO_KEYS was replaced by the \"NO_KEYS\" string in jsPsych v7.');\n  },\n};\n","// __rollup-babel-import-regenerator-runtime__\n\nimport { JsPsych } from \"./JsPsych\";\nimport { MigrationError } from \"./migration\";\n\n// temporary patch for Safari\nif (\n  typeof window !== \"undefined\" &&\n  window.hasOwnProperty(\"webkitAudioContext\") &&\n  !window.hasOwnProperty(\"AudioContext\")\n) {\n  // @ts-expect-error\n  window.AudioContext = webkitAudioContext;\n}\n// end patch\n\n// The following function provides a uniform interface to initialize jsPsych, no matter whether a\n// browser supports ES6 classes or not (and whether the ES6 build or the Babel build is used).\n/**\n * Creates a new JsPsych instance using the provided options.\n *\n * @param options The options to pass to the JsPsych constructor\n * @returns A new JsPsych instance\n */\nexport function initJsPsych(options?) {\n  const jsPsych = new JsPsych(options);\n\n  // Handle invocations of non-existent v6 methods with migration errors\n  const migrationMessages = {\n    init: \"`jsPsych.init()` was replaced by `initJsPsych()` in jsPsych v7.\",\n\n    ALL_KEYS: 'jsPsych.ALL_KEYS was replaced by the \"ALL_KEYS\" string in jsPsych v7.',\n    NO_KEYS: 'jsPsych.NO_KEYS was replaced by the \"NO_KEYS\" string in jsPsych v7.',\n\n    // Getter functions that were renamed\n    currentTimelineNodeID:\n      \"`currentTimelineNodeID()` was renamed to `getCurrentTimelineNodeID()` in jsPsych v7.\",\n    progress: \"`progress()` was renamed to `getProgress()` in jsPsych v7.\",\n    startTime: \"`startTime()` was renamed to `getStartTime()` in jsPsych v7.\",\n    totalTime: \"`totalTime()` was renamed to `getTotalTime()` in jsPsych v7.\",\n    currentTrial: \"`currentTrial()` was renamed to `getCurrentTrial()` in jsPsych v7.\",\n    initSettings: \"`initSettings()` was renamed to `getInitSettings()` in jsPsych v7.\",\n    allTimelineVariables:\n      \"`allTimelineVariables()` was renamed to `getAllTimelineVariables()` in jsPsych v7.\",\n  };\n\n  Object.defineProperties(\n    jsPsych,\n    Object.fromEntries(\n      Object.entries(migrationMessages).map(([key, message]) => [\n        key,\n        {\n          get() {\n            throw new MigrationError(message);\n          },\n        },\n      ])\n    )\n  );\n\n  return jsPsych;\n}\n\nexport { JsPsych } from \"./JsPsych\";\nexport type { JsPsychPlugin, PluginInfo, TrialType } from \"./modules/plugins\";\nexport { ParameterType } from \"./modules/plugins\";\nexport type { JsPsychExtension, JsPsychExtensionInfo } from \"./modules/extensions\";\nexport { DataCollection } from \"./modules/data/DataCollection\";\n"],"names":["ParameterType","TimelineNodeStatus","path","description"],"mappings":"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"}