{"version":3,"file":"quest.umd.cjs","sources":["../src/lib/_util.js","../src/lib/_settings.js","../src/lang/lang-en.js","../src/lib/_file_saver.js","../src/lib/_saveload.js","../src/lib/_text.js","../src/lib/_io.js","../src/lib/_command.js","../src/lib/_defaults.js","../node_modules/picocolors/picocolors.browser.js","../__vite-browser-external","../node_modules/postcss/lib/css-syntax-error.js","../node_modules/postcss/lib/symbols.js","../node_modules/postcss/lib/stringifier.js","../node_modules/postcss/lib/stringify.js","../node_modules/postcss/lib/node.js","../node_modules/postcss/lib/declaration.js","../node_modules/nanoid/non-secure/index.cjs","../node_modules/postcss/lib/previous-map.js","../node_modules/postcss/lib/input.js","../node_modules/postcss/lib/map-generator.js","../node_modules/postcss/lib/comment.js","../node_modules/postcss/lib/container.js","../node_modules/postcss/lib/document.js","../node_modules/postcss/lib/warn-once.js","../node_modules/postcss/lib/warning.js","../node_modules/postcss/lib/result.js","../node_modules/postcss/lib/tokenize.js","../node_modules/postcss/lib/at-rule.js","../node_modules/postcss/lib/root.js","../node_modules/postcss/lib/list.js","../node_modules/postcss/lib/rule.js","../node_modules/postcss/lib/parser.js","../node_modules/postcss/lib/parse.js","../node_modules/postcss/lib/lazy-result.js","../node_modules/postcss/lib/no-work-result.js","../node_modules/postcss/lib/processor.js","../node_modules/postcss/lib/fromJSON.js","../node_modules/postcss/lib/postcss.js","../node_modules/postcss/lib/postcss.mjs","../src/lib/_templates.js","../src/lib/_world.js","../src/lib/_npc.js","../src/lib/_parser.js","../src/lib/_commands.js"],"sourcesContent":["\"use strict\";\n\n// ============  Utilities  =================================\n\n// Should all be language neutral\n\nimport {\n    world,\n    lang,\n    settings,\n    w,\n    errormsg,\n    player,\n    setPlayer,\n    parser,\n    io,\n    saveLoad,\n    commentmsg,\n    msg, falsemsg, game\n} from \"../index.js\";\n\nexport const INDEFINITE = 1\nexport const DEFINITE = 2\nexport const COUNT = 3\n\nexport const NULL_FUNC = function() {}\n\n\nexport const test = {};\ntest.testing = false;\n\n//@DOC\n// ## General Utility Functions\n//@UNDOC\n\n\n\n// If we try to do anything fancy with log we get this line number not the calling line\nexport const log = console.log\nexport const debuglog = (s) => { if(settings.playMode === 'dev' || settings.playMode === 'beta'){ log(s)} }\nexport const parserlog = (s) => { if(parser.debug){ log(s)} }\n\n\n//@DOC\n// Runs the given string as though the player typed it, including recording it in the output\nexport function runCmd(cmd) {\n  io.msgInputText(cmd)\n  parser.parse(cmd)\n}\n\n\nexport function doOnce(o, s) {\n  if (s === undefined) s = 'unspecifiedDoOnceFlag'\n  if (o[s]) return false\n  o[s] = true\n  return true\n}\n\n\n\n\n\nexport function c(str) {\n  if (saveLoad.transcript) {\n    commentmsg(\"Comment: \" + str)\n    return 'Comment added to transcript'\n  }\n  else {\n   return 'This function is designed for adding comments whilst recording a transcript. You have are not currently recording a transcript.'\n  }\n}\n\n\n\n//@DOC\n// If the given attribute is a string it is printed, if it is a\n// function it is called. Otherwise an error is generated.\n// If options.multiple is true, the object name is prefixed.\nexport function printOrRun(char, item, attname, options) {\n  if (options === undefined) options = {}\n  if (!options.char) options.char = char\n  if (!options.item) options.item = item\n\n  if (typeof item[attname] === \"string\") {\n    // The attribute is a string\n    let s = item[attname]\n    if (item[attname + 'Addendum']) s += item[attname + 'Addendum'](char)\n    msg(s, options);\n    return true;\n  }\n  else if (typeof item[attname] === \"function\"){\n    // The attribute is a function\n      return item[attname](options);\n  }\n  else {\n    const s = \"Unsupported type for printOrRun (\" + attname + \" is a \" + (typeof item[attname]) + \").\"\n    errormsg(s)\n    throw new Error(s)\n  }\n}\n\n\n\nexport function verbify(s) { return s.toLowerCase().replace(/[^a-zA-Z0-9_]/g, '') }\n\n\n\n// ============  Random Utilities  =======================================\n//@DOC\n// ## Random Functions\n//@UNDOC\n\nexport const random = {\n  buffer:[],\n}\n\n//@DOC\n// Returns a random number from 0 to n1, or n1 to n2, inclusive.\nrandom.int = function(n1, n2) {\n  if (this.buffer.length > 0) return this.buffer.shift()\n  if (n2 === undefined) {\n    n2 = n1;\n    n1 = 0;\n  }\n  return Math.floor(Math.random() * (n2 - n1 + 1)) + n1;\n}\n\n\n\n//@DOC\n// Returns true 'percentile' times out of 100, false otherwise.\nrandom.chance = function(percentile) {\n  return random.int(99) < percentile;\n}\n\n\n\n//@DOC\n// Returns a random element from the array, or null if it is empty\n// If the second parameter is true, then the selected value is also deleted from the array,\n// preventing it from being selected a second time.\n// If sent a string instead of an array, the string will be broken into an array on |.\nrandom.fromArray = function(arr, deleteEntry) {\n  if (typeof arr === 'string') arr.split('|')\n  if (arr.length === 0) return null;\n  const index = random.int(arr.length - 1);\n  const res = arr[index];\n  if (deleteEntry) arr.splice(index, 1)\n  return res;\n}\n\n\n\n//@DOC\n// Returns the given array, in random order using the Fisher-Yates algorithm\nrandom.shuffle = function(arr) {\n  if (typeof arr === \"number\") arr = [...Array(arr).keys()]\n  const res = []\n  while (arr.length > 0) {\n    res.push(random.fromArray(arr, true))\n  }\n  return res;\n}\n\n\n\n//@DOC\n// Returns a random number based on the standard RPG dice notation.\n// For example 2d6+3 means roll two six sided dice and add three.\n// Returns he number if sent a number.\n// It can cope with complex strings such as 2d8-3d6\n// You can also specify unusual dice, i.e., not a sequence from one to n, by separating each value with a colon,\n// so d1:5:6 rolls a three sided die, with 1, 5 and 6 on the sides.\n// It will cope with any number of parts, so -19+2d1:5:6-d4 will be fine.\n// If average is true, calculates the mean expected roll\nrandom.dice = function(s, average) {\n  if (typeof s === 'number') return s\n  s = s.replace(/ /g, '').replace(/\\-/g, '+-')\n  let total = 0\n  random.diceLog = []\n\n  for (let dice of s.split(\"+\")) {\n    if (dice === '') continue\n    let negative = 1\n    if (/^\\-/.test(dice)) {\n      dice = dice.substring(1)\n      negative = -1\n    }\n    total += negative * random.diceSubPart(dice, average)\n  }\n  return total\n}\n\n\n\n// If average is true, calculates the mean expected roll\nrandom.diceSubPart = function(dice, average) {\n  // just a number\n  if (/^\\d+$/.test(dice)) return parseInt(dice)\n\n  // normalise\n  if (/^d/.test(dice)) dice = \"1\" + dice\n\n  // collect data\n  const match = /^(\\d+)[dD]([0-9\\:]+)([hHlLeErRcC])?(\\d+)?/.exec(dice)\n  if (!match) return errormsg (\"Can't parse dice type: \" + dice)\n  let rolls = []\n  const number = parseInt(match[1])\n  const sides = match[2]\n\n  // roll the dice\n  for (let i = 0; i < number; i++) {\n    const n = random.diceRoll(sides, average)\n    rolls.push(n)\n  }\n\n  // handle highest/lowest/exploding\n  if (match[3] === 'h' || match[3] === 'H') {\n    const highestOf = match[4] ? parseInt(match[4]) : 1\n    rolls = rolls.sort(function(a, b) {\n      return b - a\n    }).slice(0, highestOf)\n  }\n  if (match[3] === 'l' || match[3] === 'L') {\n    const highestOf = match[4] ? parseInt(match[4]) : 1\n    rolls = rolls.sort(function(a, b) {\n      return a - b\n    }).slice(0, highestOf)\n  }\n  if (match[3] === 'e' || match[3] === 'E') {\n    const explodeOn = match[4] ? parseInt(match[4]) : parseInt(sides)\n    if (explodeOn < 2) return errormsg (\"Bad exploding dice will crash the game: \" + dice)\n    let exploderCount = rolls.filter(el => el >= explodeOn).length\n    for (let i = 0; i < exploderCount; i++) {\n      const n = random.diceRoll(sides, average)\n      rolls.push(n)\n      if (match[3] === 'E' && n >= explodeOn) exploderCount++\n    }\n  }\n  if (match[3] === 'r') {\n    const rerollOn = match[4] ? parseInt(match[4]) : 1\n    for (let i = 0; i < rolls.length; i++) {\n      if (rolls[i] <= rerollOn) rolls[i] = random.diceRoll(sides, average)\n    }\n  }\n  if (match[3] === 'R') {\n    const rerollOn = match[4] ? parseInt(match[4]) : 1\n    for (let i = 0; i < rolls.length; i++) {\n      while (rolls[i] <= rerollOn) rolls[i] = random.diceRoll(sides, average)\n    }\n  }\n  if (match[3] === 'C') {\n    const countIf = parseInt(match[4])\n    for (let i = 0; i < rolls.length; i++) {\n      rolls[i] = (rolls[i] >= countIf) ? 1 : 0\n    }\n  }\n  if (match[3] === 'c') {\n    const countIf = parseInt(match[4])\n    for (let i = 0; i < rolls.length; i++) {\n      rolls[i] = (rolls[i] <= countIf) ? 1 : 0\n    }\n  }\n\n  // Add them up\n  let total = 0\n  for (const n of rolls) total += n\n  return total\n}\n\n\n// Expects a string that is either:\n// a number, the number of sides for the dice, so returns a random number from 1 to that number\n// or a set of numbers separated by colon, so returns one picked at random\n// If average is true, calculates the mean expected roll\nrandom.diceRoll = function(s, average) {\n  if (average) {\n    if (/^\\d+$/.test(s)) return parseInt(s) / 2 + 0.5\n    let total = 0\n    const ary = s.split(':')\n    for (const s2 of ary) {\n      log(total)\n      total += parseInt(s2)\n    }\n      log(total)\n    return total / ary.length\n  }\n\n  const n = (/^\\d+$/.test(s)) ? random.int(1, parseInt(s)) : parseInt(random.fromArray(s.split(':')))\n  random.diceLog.push(n)\n  return n\n}\n\n\n\n\n//@DOC\n// Loads up a buffer with the given number or array of numbers.\n// The random.int function will grab the first number from the buffer and return that instead of a random\n// number, if there is anything in the buffer. Note that the other random functions all use random.int,\n// so you can use random.prime to force any of them to return a certain value. Note that there is no\n// checking, so random.int(4) could return 7 or even \"seven\". It is up to you to ensure the numbers you\n// prime the buffer with make sense.\n// This is most useful when testing, as you know in advance what the random number will be.\nrandom.prime = function(ary) {\n  if (typeof ary === 'number') ary = [ary]\n  this.buffer = ary\n}\n\n// ============  String Utilities  =======================================\n//@DOC\n// ## String Functions\n//@UNDOC\n\n//@DOC\n// Returns the string with the first letter capitalised\nexport function sentenceCase(str) {\n  if (str.length === 0) return ''\n  return str.replace(str[0], str[0].toUpperCase())\n}\n\n//@DOC\n// Returns the string with the first letter of each word capitalised\nexport function titleCase(str) {\n  return str.toLowerCase().split(' ').map(el => el.replace(el[0], el[0].toUpperCase())).join(' ')\n}\n\n//@DOC\n// Returns the string with the first letter capitalised,\n// but will ignore any HTML tags embedded in the string.\n// If the string may have HTML codes to do special formating, etc.,\n// this is probably the version you need.\nexport function sentenceCaseForHTML(str) {\n  const template = document.createElement('template')\n  template.innerHTML = str.trim()\n  let node = template.content\n  while (node.hasChildNodes()) node = node.firstChild\n  node.textContent = sentenceCase(node.textContent)\n  return template.innerHTML\n}\n\n//@DOC\n// Returns the string in a span element that will cause each\n// word to _appear_ to be capitalised, without\n// actually changing the text.\nexport function titleCaseForHTML(str) {\n  return '<span style=\"text-transform: capitalize;\">' + str + '</span>'\n}\n\n//@DOC\n// Returns a string with the given number of hard spaces. Browsers collapse multiple white spaces to just show\n// one, so you need to use hard spaces (NBSPs) if you want several together.\nexport function spaces(n) {\n  return \"&nbsp;\".repeat(n)\n}\n\n//@DOC\n// If multiple is true, returns the item name, otherwise nothing. This is useful in commands that handle\n// multiple objects, as you can have this at the start of the response string. For example, if the player does GET BALL,\n// the response might be \"Done\". If she does GET ALL, then the response for the ball needs to be \"Ball: Done\".\n// In the command, you can have `msg(\"Done\"), and it is sorted.\nexport function prefix(item, options) {\n  if (!options.multiple) { return \"\"; }\n  return sentenceCase(item.alias) + \": \";\n}\n\nexport function warningFor(o, msg) { log('Warning for ' + o.name + ': ' + msg) }\n\n//@DOC\n// Creates a string from an array. If the array element is a string, that is used, if it is an item, `lang.getName` is used (and passed the `options`). Items are sorted alphabetically, based on the \"name\" attribute.\n//\n// Options:\n//\n// * article:    DEFINITE (for \"the\") or INDEFINITE (for \"a\"), defaults to none (see `lang.getName`)\n// * sep:        separator (defaults to comma)\n// * lastSep: separator for last two items (just separator if not provided); you should not include any spaces\n// * modified:   item aliases modified (see `lang.getName`) (defaults to false)\n// * nothing:    return this if the list is empty (defaults to empty string)\n// * count:      if this is a number, the name will be prefixed by that (instead of the article)\n// * doNotSort   if true the list is not sorted\n// * separateEnsembles:  if true, ensembles are listed as the separate items\n//\n// For example:\n//\n// ```\n// formatList(listOfOjects, {article:INDEFINITE, lastSep:\"and\"})\n// -> \"a hat, Mary and some boots\"\n//\n// formatList(list, {lastSep:\"or\", nothing:\"nowhere\");\n// -> north, east or up\n// ```\n//\nexport function formatList(itemArray, options) {\n  if (options === undefined) { options = {}; }\n  // For backwards compatibility, suggest it can be removed summer 2024 (after two years)\n  if (options.lastJoiner && !options.lastSep) options.lastSep = options.lastJoiner\n\n  if (itemArray.length === 0) {\n    return options.nothing ? options.nothing : \"\";\n  }\n\n  if (!options.sep) options.sep = \",\"\n\n\n  if (!options.separateEnsembles) {\n    const toRemove = [];\n    const toAdd = [];\n    for (let item of itemArray) {\n      if (item.ensembleMaster && item.ensembleMaster.isAllTogether()) {\n        toRemove.push(item);\n        if (!toAdd.includes(item.ensembleMaster)) toAdd.push(item.ensembleMaster);\n      }\n    }\n    itemArray = array.subtract(itemArray, toRemove);\n    itemArray = itemArray.concat(toAdd);\n  }\n\n  // sort the list alphabetically on name\n  if (!options.doNotSort) {\n    itemArray.sort(function(a, b){\n      if (a.name) a = a.name;\n      if (b.name) b = b.name;\n      return a.localeCompare(b)\n    });\n  }\n\n  const l = itemArray.map(el => {\n    //if (el === undefined) return \"[undefined]\";\n    return typeof el === \"string\" ? el : lang.getName(el, options)\n  })\n\n\n  let s = \"\";\n  if (settings.oxfordComma && l.length === 2 && options.lastSep) return l[0] + ' ' + options.lastSep + ' ' + l[1]\n  do {\n    s += l.shift()\n    if (l.length === 1 && options.lastSep) {\n      if (settings.oxfordComma) s += options.sep\n      s += ' ' + options.lastSep + ' '\n    } else if (l.length > 0) s += options.sep + ' '\n  } while (l.length > 0);\n\n  return s;\n}\n\n//@DOC\n// Lists the properties of the given object; useful for debugging only.\n// To inspect an object use JSON.stringify(obj)\nexport function listProperties(obj) {\n  return Object.keys(obj).join(\", \");\n}\n\nconst arabic = [1000,900,500,400,100,90,50,40,10,9,5,4,1];\nconst roman = \"M;CM;D;CD;C;XC;L;XL;X;IX;V;IV;I\".split(\";\");\n\n//@DOC\n// Returns the given number as a string in Roman numerals.\nexport function toRoman(number) {\n  if (typeof number !== \"number\") {\n    errormsg (\"toRoman can only handle numbers\");\n    return number;\n  }\n\n  let result = \"\";\n  //var a, r;\n  for (let i = 0; i < 13; i++) {\n    while (number >= arabic[i]) {\n      result = result + roman[i];\n      number = number - arabic[i];\n    }\n  }\n  return result;\n}\n\n//@DOC\n// Returns the given number as a string formatted as money. The formatting is defined by settings.moneyFormat.\nexport function displayMoney(n) {\n  if (typeof settings.moneyFormat === \"undefined\") {\n    errormsg (\"No format for money set (set settings.moneyFormat in settings.js).\");\n    return \"\" + n;\n  }\n  const ary = settings.moneyFormat.split(\"!\");\n  if (ary.length === 2) {\n    return settings.moneyFormat.replace(\"!\", \"\" + n);\n  }\n  else if (ary.length === 3) {\n    const negative = (n < 0)\n    n = Math.abs(n);\n    let options = ary[1]\n    const showsign = options.startsWith(\"+\")\n    if (showsign) {\n      options = options.substring(1);\n    }\n    let number = displayNumber(n, options)\n    if (negative) {\n      number = \"-\" + number;\n    }\n    else if (n !== 0 && showsign) {\n      number = \"+\" + number;\n    }\n    return (ary[0] + number + ary[2]);\n  }\n  else if (ary.length === 4) {\n    const options = n < 0 ? ary[2] : ary[1];\n    return ary[0] + displayNumber(n, options) + ary[3];\n  }\n  else {\n    errormsg (\"settings.moneyFormat in settings.js expected to have either 1, 2 or 3 exclamation marks.\")\n    return \"\" + n;\n  }\n}\n\n//@DOC\n// Returns the given number as a string formatted as per the control string.\n// The control string is made up of five parts.\n// The first is a sequence of characters that are not digits that will be added to the start of the string, and is optional.\n// The second is a sequence of digits and it the number of characters left of the decimal point; this is padded with zeros to make it longer.\n// The third is a single non-digit character; the decimal marker.\n// The fourth is a sequence of digits and it the number of characters right of the decimal point; this is padded with zeros to make it longer.\n// The fifth is a sequence of characters that are not digits that will be added to the end of the string, and is optional.\nexport function displayNumber(n, control) {\n  n = Math.abs(n);  // must be positive\n  const regex = /^(\\D*)(\\d+)(\\D)(\\d*)(\\D*)$/;\n  if (!regex.test(control)) {\n    errormsg (\"Unexpected format in displayNumber (\" + control + \"). Should be a number, followed by a single character separator, followed by a number.\");\n    return \"\" + n;\n  }\n  const options = regex.exec(control);\n  const places = parseInt(options[4]);                      // eg 2\n  let padding = parseInt(options[2]);             // eg 3\n  if (places > 0) {\n    // We want a decimal point, so the padding, the total length, needs that plus the places\n    padding = padding + 1 + places;               // eg 6\n  }\n  const factor = Math.pow (10, places)            // eg 100\n  const base = (n / factor).toFixed(places);      // eg \"12.34\"\n  const decimal = base.replace(\".\", options[3])   // eg \"12,34\"\n  return (options[1] + decimal.padStart(padding, \"0\") + options[5])   // eg \"(012,34)\"\n}\n\n//@DOC\n// Converts the string to the standard direction name, so \"down\", \"dn\" and \"d\" will all return \"down\".\n// Uses the EXITS array, so language neutral.\nexport function getDir(s) {\n  for (let exit of lang.exit_list) {\n    if (exit.type === 'nocmd') continue;\n    if (exit.name === s) return exit.name;\n    if (exit.abbrev.toLowerCase() === s) return exit.name;\n    if (new RegExp(\"^(\" + exit.alt + \")$\").test(s)) return exit.name;\n  }\n  return false;\n}\n\nexport function rChunkString(str, len) {\n  str = str.toString()\n  const r = []\n\n  while (str) {\n    const chunk = str.slice(-len)\n    str = str.slice(0, -len)\n    r.unshift(chunk)\n  }\n  return r\n}\n\n// ============  Array Utilities  =======================================\n//@DOC\n// ## Array (List) Functions\n//@UNDOC\n\nexport const array = {}\n\n//@DOC\n// Returns a new array, derived by subtracting each element in b from the array a.\n// If b is not an array, then b itself will be removed.\n// Unit tested.\narray.subtract = function(a, b) {\n  if (!Array.isArray(b)) b = [b]\n  const res = []\n  for (let i = 0; i < a.length; i++) {\n    if (!b.includes(a[i])) res.push(a[i]);\n  }\n  return res;\n}\n\n//@DOC\n// Returns true if the arrays a and b are equal. They are equal if both are arrays, they have the same length,\n// and each element in order is the same.\n// Assumes a is an array, but not b.\n// Unit tested\narray.compare = function(a, b) {\n  if (!Array.isArray(b)) return false;\n  if (a.length !== b.length) return false;\n  for (let i = 0; i < a.length; i++) {\n    if (b[i] !== a[i]) return false;\n  }\n  return true;\n}\n\n//@DOC\n// Returns true if each element in a matches the elements in b, but not necessarily in the same order\n// (assumes each element is unique; repeated elements may give spurious results).\n// Assumes a is an array, but not b.\n// Unit tested\narray.compareUnordered = function(a, b) {\n  if (!Array.isArray(b)) return false;\n  if (a.length !== b.length) return false;\n  for (let el of a) {\n    if (!b.includes(el)) return false;\n  }\n  return true;\n}\n\n//@DOC\n// Removes the element el from the array, ary.\n// Unlike array.subtract, no new array is created; the original array is modified, and nothing is returned.\narray.remove = function(ary, ...el) {\n  if (el.length === 0) return\n  let index = ary.indexOf(el.shift())\n  if (index !== -1) {\n    ary.splice(index, 1)\n  }\n  array.remove(ary, ...el)\n}\n\n//@DOC\n// Returns a new array containing all the elements that are in both the given arrays.\n// Assumes no duplicates in the arrays\narray.intersection = function(ary1, ary2) {\n  return ary1.filter(function(x) {\n    // checking second array contains the element \"x\"\n    return ary2.indexOf(x) !== -1;\n  })\n}\n\n//@DOC\n// Returns a new array based on ary, but including only those objects for which the attribute attName is equal to value.\n// To filter for objects that do not have the attribute you can filter for the value undefined.\narray.filterByAttribute = function(ary, attName, value) {\n  return ary.filter(el => el[attName] === value)\n}\n\n//@DOC\n// Returns the next element after el from the array, ary.\n// If el is present more than once, it goes with the first.\n// If el is the last element, and circular is true it return the fist element and false otherwise.\narray.next = function(ary, el, circular) {\n  let index = ary.indexOf(el) + 1\n  if (index === 0) return false\n  if (index === ary.length) return circular ? ary[0] : false\n  return ary[index]\n}\n\n//@DOC\n// Returns the next element after el from the array, ary, for which the attribute, att, is true.\n// If el is present more than once, it goes with the first.\n// If el is the last element, and circular is true it return the fist element and false otherwise.\narray.nextFlagged = function(ary, el, att, circular) {\n  let o = el\n  let count = ary.length\n  while (o && !o[att] && count > 0) {\n    o = array.next(ary, o, circular)\n    count = count - 1\n  }\n  if (!o || !o[att]) return false\n  return (o)\n}\n\n//@DOC\n// Returns a copy of the given array. Members of the array are not cloned.\narray.clone = function(ary, options) {\n  if (!options) options = {}\n  let newary = options.compress ? [...new Set(ary)] : [...ary]\n  if (options.value) newary = newary.map(el => el[options.value])\n  if (options.function) newary = newary.map(el => el[options.function]())\n  if (options.attribute) newary = newary.map(el => typeof el[options.attribute] === 'function' ? el[options.attribute]() : el[options.attribute])\n  return options.reverse ? newary.reverse() : newary\n}\n\n//@DOC\n// Returns true if any member of the array matches the string.\n// It is a match if the element is also a string and they are the same or\n// if the elem,ent is a regex and the pattern matches\narray.hasMatch = function(ary, s) {\n  for (let e of ary) {\n    if (typeof e === 'string' && e === s) return true\n    if (e instanceof RegExp && s.match(e)) return true\n  }\n  return false\n}\n\n//@DOC\n// Returns an array of combinations based on the given array\n// Combinations have between one and three elements from the original array\n// and will be in the original order.\n// Each combination is a string with the elements separated with a space.\n// Used by the parser (in case it seems obscure and pointless!)\narray.combos = function(ary, sep=' ') {\n  const res = []\n  for (let i = 0; i < ary.length; i++) {\n    res.push(ary[i])\n    for (let j = i + 1; j < ary.length; j++) {\n      res.push(ary[i] + sep + ary[j])\n      for (let k = j + 1; k < ary.length; k++) {\n        res.push(ary[i] + sep + ary[j] + sep + ary[k])\n      }\n    }\n  }\n  return res\n}\n\narray.fromTokens = function(ary, scope, cmdParams) {\n  const items = []\n  while (ary.length > 0) {\n    const res = array.oneFromTokens(ary, scope, cmdParams)\n    if (!res) return null\n    items.push(res)\n  }\n  return items\n}\n\narray.oneFromTokens = function(ary, scope, cmdParams = {}) {\n  for (let i = ary.length; i > 0; i--) {\n    const s = ary.slice(0, i).join(' ')\n    const items = parser.findInList(s, scope, cmdParams)\n    if (items.length > 0) {\n      for (let j = 0; j < i; j++) ary.shift()\n      return items\n    }\n  }\n  return null\n}\n\narray.value = function(ary, index, opt) {\n  if (index >= ary.length || index < 0) {\n    if (opt === 'none') return ''\n    if (opt === 'wrap') return ary[index % ary.length]\n    if (opt === 'end') return ary[ary.length - 1]\n    if (opt === 'start') return ary[0]\n  }\n  return ary[index]\n}\n\n// ============  Scope Utilities  =======================================\n\n\n//@DOC\n// ## Scope Functions\n//@UNDOC\n\n\n\n//@DOC\n// Returns an array of objects the player can currently reach and see.\nexport function scopeReachable() {\n  const list = [];\n  for (let key in w) {\n    if (w[key].scopeStatus.canReach && world.ifNotDark(w[key])) {\n      list.push(w[key]);\n    }\n  }\n  return list;\n}\n\n//@DOC\n// Returns an array of objects held by the given character.\nexport function scopeHeldBy(chr = player(), situation = world.PARSER) {\n  return chr.getContents(situation)\n}\n\n//@DOC\n// Returns an array of objects at the player's location that can be seen.\nexport function scopeHereListed() {\n  const list = [];\n  for (let key in w) {\n    const o = w[key]\n    if (!o.player && o.isAtLoc(player().loc, world.LOOK) && world.ifNotDark(o)) {\n      list.push(o);\n    }\n  }\n  return list;\n}\n\n//@DOC\n// Returns an array of objects at the player's location that can be seen.\nexport function scopeHereParser() {\n  const list = [];\n  for (let key in w) {\n    const o = w[key]\n    if (!o.player && o.isAtLoc(player().loc, world.PARSER)) {\n      list.push(o);\n    }\n  }\n  return list;\n}\n\n//@DOC\n// Returns an array of NPCs at the player's location (excludes those flagged as scenery).\nexport function scopeNpcHere(ignoreDark) {\n  const list = [];\n  for (let key in w) {\n    const o = w[key]\n    if (o.isAtLoc(player().loc, world.LOOK) && o.npc && (world.ifNotDark(o) || ignoreDark)) {\n      list.push(o);\n    }\n  }\n  return list;\n}\n\n//@DOC\n// Returns an array of NPCs at the player's location (includes those flagged as scenery).\nexport function scopeAllNpcHere(ignoreDark) {\n  const list = [];\n  for (let key in w) {\n    const o = w[key]\n    if (o.isAtLoc(player().loc, world.PARSER) && o.npc && (world.ifNotDark(o) || ignoreDark)) {\n      list.push(o);\n    }\n  }\n  return list;\n}\n\n//@DOC\n// Returns an array of objects for which the given export function returns true.\nexport function scopeBy(func) {\n  const list = [];\n  for (let key in w) {\n    if (func(w[key])) {\n      list.push(w[key]);\n    }\n  }\n  return list;\n}\n\nexport const util = {};\n\nutil.getContents = function(situation) {\n  const list = [];\n  for (let key in w) {\n    if (w[key].isAtLoc(this.name, situation)) {\n      list.push(w[key]);\n    }\n  }\n  return list;\n}\n\n// Is this container already inside the given object, and hence\n// putting the object in the container will destroy the universe\nutil.testForRecursion = function(char, item) {\n  let contName = this.name;\n  while (w[contName]) {\n    if (w[contName].loc === item.name) return falsemsg(lang.container_recursion, {char:char, container:this, item:item})\n    contName = w[contName].loc\n  }\n  return true;\n}\n\nutil.nameModifierFunctionForContainer = function(o, list) {\n  //console.log(\"here\")\n  const contents = o.getContents(world.LOOK);\n  //console.log(contents)\n  if (contents.length > 0 && (!o.closed || o.transparent)) {\n    list.push(lang.contentsForData[o.contentsType].prefix + o.listContents(world.LOOK) + lang.contentsForData[o.contentsType].suffix)\n  }\n  //console.log(list)\n}\n\n//@DOC\n// Returns the given number, num, but restricted to lie\n// between min and max; i.e., if number is less than min,\n// then min will be returned instead.\nutil.clamp = function(num, min, max) {\n  return num <= min ? min : (num >= max  ? max : num)\n}\n\nutil.registerTimerFunction = function(eventName, func) {\n  if (world.isCreated && !settings.saveDisabled) {\n    errormsg(\"Attempting to use registerEvent after set up.\")\n    return\n  }\n  settings.eventFunctions[eventName] = func;\n}\nutil.registerTimerEvent = function(eventName, triggerTime, interval) {\n  if (!settings.eventFunctions[eventName]) errormsg(\"A timer is trying to call event '\" + eventName + \"' but no such function is registered.\")\n  game.timerEventNames.push(eventName)\n  game.timerEventTriggerTimes.push(triggerTime)\n  game.timerEventIntervals.push(interval ? interval : -1)\n}\n\nutil.findTopic = function(alias, char, n = 1) {\n  if (w[alias]) return w[alias]\n  for (const key in w) {\n    const o = w[key]\n    if (o.conversationTopic && (!char || o.belongsTo(char.name)) && o.alias === alias) {\n      n--\n      if (n === 0) return o\n    }\n  }\n  if (char) {\n    errormsg(\"Trying to find topic \" + n + \" called \\\"\" + alias + \"\\\" for \" + char.name + \" and came up empty-handed!\")\n  }\n  else {\n    errormsg(\"Trying to find topic \" + n + \" called \\\"\" + alias + \"\\\" for anyone and came up empty-handed!\")\n  }\n}\n\n// Useful in a receiveItems array, as it just sorts out giving for you, based on the standard parameters\nutil.giveItem = function(p) {\n  p.item.moveToFrom(p, p.npc, p.char)\n}\n\nutil.changeListeners = []\n\n// This is used in world.endTurn, before turn events are run, and after too (just once if no turn events). Also after timer events if one fired\nutil.handleChangeListeners = function() {\n  for (let el of util.changeListeners) {\n    if (el.test(el.object, el.object[el.attName], el.oldValue, el.attName)) {\n      el.func(el.object, el.object[el.attName], el.oldValue, el.attName)\n    }\n    el.oldValue = el.object[el.attName]\n  }\n}\n\nutil.defaultChangeListenerTest = function(object, currentValue, oldValue, attName) {\n  return currentValue !== oldValue\n}\n\nutil.addChangeListener = function(object, attName, func, test = util.defaultChangeListenerTest) {\n  if (world.isCreated && !settings.saveDisabled) {\n    errormsg(\"Attempting to use addChangeListener after set up.\")\n    return\n  }\n  util.changeListeners.push({object:object, attName:attName, func:func, test:test, oldValue:object[attName]})\n}\n\nutil.getChangeListenersSaveString = function() {\n  if (util.changeListeners.length === 0) return \"NoChangeListeners\"\n  const strings = util.changeListeners.map(el => el.oldValue.toString())\n    return \"ChangeListenersUsedStrings=\" + saveLoad.encodeArray(strings);\n}\n\nutil.setChangeListenersLoadString = function(s) {\n  if (s === \"NoChangeListeners\") return\n  const parts = s.split(\"=\");\n  if (parts.length !== 2) return errormsg(\"Bad format in saved data (\" + s + \")\")\n  if (parts[0] !== \"ChangeListenersUsedStrings\") return errormsg(\"Expected ChangeListenersUsedStrings to be first\")\n  const strings = saveLoad.decodeArray(parts[1])\n  for (let i = 0; i < strings.length; i++) {\n    util.changeListeners[i].oldValue = strings[i].match(/^\\d+$/) ? parseInt(strings[i]) : strings[i]\n  }\n}\n\n\n// ============  Response Utilities  =======================================\n\n\n//@DOC\n// ## The Respond Function\n//@UNDOC\n\n//@DOC\n// Searches the given list for a suitable response, according to the given params, and runs that response.\n// This is a big topic, see [here](https://github.com/ThePix/QuestJS/wiki/The-respond-function) for more.\nexport function respond(params, list) {\n  if (settings.responseDebug) log(params)\n  if (!params.char) errormsg(\"A call to \\\"respond\\\" does not have \\\"char\\\" set in the params.\")\n  const response = util.findResponse(params, list, params.extraTest)\n  if (!response) {\n    if (params.afterScript) params.afterScript(params)\n    if (!params.noResponseNotError) {\n      errormsg(\"Failed to find a response. ASK/TELL or some other system using the respond function was given a list of options that did not have a default. Below the stack trace, you should see the parameters sent and the list of responses. The last response should have no test function (or a test function that always returns true).\")\n      log(params)\n      log(list)\n    }\n    return false\n  }\n  if (params.beforeScript) params.beforeScript.bind(params.char)(params, response)\n  if (response.script) response.script.bind(params.char)(params, response)\n  if (response.msg) {\n    if (params.char) {\n      params.char.msg(response.msg, params)\n    }\n    else {\n      msg(response.msg, params)\n    }\n  }\n  if (!response.script && !response.msg && !response.failed) {\n    errormsg(\"No script or msg for response\")\n    console.log(response)\n  }\n  if (params.afterScript) params.afterScript.bind(params.char)(params, response)\n  return !response.failed\n}\n\nexport function getResponseList(params, list, result) {\n  if (!result) result = []\n  for (let item of list) {\n    if (item.name) {\n      params.text = item.name.toLowerCase()\n      //console.log(\"check item: \" + item.name)\n      if (item.test) {\n        if (!result.includes(item) && item.test.bind(params.char)(params, item)) result.push(item)\n      }\n      else {\n        if (!result.includes(item)) result.push(item)\n      }\n      //console.log(\"item is good: \" + item.name)\n    }\n    if (item.responses) result = getResponseList(params, item.responses, result)\n    //console.log(\"done\")\n  }\n  return result\n}\n\nutil.findResponse = function(params, list, extraTest) {\n  for (let item of list) {\n    if (extraTest && !extraTest.bind(params.char)(params, item)) continue\n    if (item.test && !item.test.bind(params.char)(params, item)) continue\n    if (item.regex && !params.text.match(item.regex)) continue\n    if (item.responses) return util.findResponse(params, item.responses)\n    return item\n  }\n  return false\n}\n\nutil.addResponse = function(route, data, list) {\n  util.addResponseToList(route, data, list)\n}\n\nutil.addResponseToList = function(route, data, list) {\n  const sublist = util.getResponseSubList(route, list)\n  sublist.unshift(data)\n}\n\nutil.getResponseSubList = function(route, list) {\n  const s = route.shift()\n  if (s) {\n    const sublist = list.find(el => el.name === s)\n    if (!sublist) throw \"Failed to add sub-list with \" + s\n    return util.getResponseSubList(route, sublist.responses)\n  }\n  else {\n    return list\n  }\n}\n\nutil.verifyResponses = function(list, level) {\n  //  console.log(list)\n  if (level === undefined) level = 1\n  if (list[list.length - 1].test) {\n    console.log(\"WARNING: Last entry at depth \" + level + \" has a test condition:\")\n    console.log(list)\n  }\n  for (let item of list) {\n    if (item.responses) {\n      //console.log(item.name)\n      if (item.responses.length === 0) {\n        console.log(\"Zero responses at depth \" + level + \" for: \" + item.name)\n      }\n      else {\n        util.verifyResponses(item.responses, level + 1)\n      }\n    }\n  }\n}\n\n// This should be assigned to an object, and then used from there\nutil.listContents = function(situation, modified = true) {\n  return formatList(this.getContents(situation), {article:INDEFINITE, lastSep:lang.list_and, modified:modified, nothing:lang.list_nothing, loc:this.name})\n}\n\n//@DOC\n// Returns the number of the internal the given number falls in\n// For example, if intervals\n// Unit tested.\nutil.getByInterval = function(intervals, n) {\n  let count = 0\n  while (count < intervals.length) {\n    if (n < intervals[count]) return count\n    n -= intervals[count]\n    count++\n  }\n  return false\n}\n\nutil.guessMyType = function(value) {\n  if (value.match(/^\\d+$/)) value = parseInt(value)\n  if (value === 'true') value = true\n  if (value === 'false') value = false\n  if (value === 'undefined') value = undefined\n  return value\n}\n\n//@DOC\n// Returns a string formatted in CSS from the given dictionary.\n// If includeCurlyBraces is true, you get curly braces too.\nutil.dictionaryToCss = function(d, includeCurlyBraces) {\n  const ary = []\n  for (let key in d) ary.push(key + ':' + d[key])\n  return includeCurlyBraces ? '{' + ary.join(';') + '}' : ary.join(';')\n}\n\nutil.getNameModifiers = function(item, options) {\n  if (!options.modified) return ''\n  const list = []\n  for (let f of item.nameModifierFunctions) f(item, list, options)\n  if (item.nameModifierFunction) item.nameModifierFunction(list, options)\n  if (list.length === 0) return ''\n  if (options.noBrackets) return ' ' + list.join('; ')\n  return ' (' + list.join('; ') + ')'\n}\n\n//@DOC\n// Returns the game time as a string. The game time is game.elapsedTime seconds after game.startTime.\nutil.getDateTime = function(options) {\n  if (!settings.dateTime.formats) {\n    const time = new Date(game.elapsedTime * 1000 + game.startTime.getTime())\n    return time.toLocaleString(settings.dateTime.locale, settings.dateTime)\n  }\n\n  return util.getCustomDateTime(options)\n}\n\nutil.getDateTimeDict = function(options) {\n  if (!options) options = {}\n  return settings.dateTime.formats ? util.getCustomDateTimeDict(options) : util.getStdDateTimeDict(options)\n}\n\nutil.getStdDateTimeDict = function(options) {\n  const dict = {}\n  let timeInSeconds = game.elapsedTime\n  if (options.add) timeInSeconds += options.add\n  const time = new Date(timeInSeconds * 1000 + game.startTime.getTime())\n  dict.second = time.getSeconds()\n  dict.minute = time.getMinutes()\n  dict.hour = time.getHours()\n  dict.date = time.getDate()\n  dict.weekday = time.toLocaleString('default', { weekday: 'long' })\n  dict.month = time.toLocaleString('default', { month: 'long' })\n  dict.year = time.getFullYear()\n\n  return dict\n}\n\nutil.getCustomDateTimeDict = function(options) {\n  const dict = {}\n  let time = settings.dateTime.startTime + game.elapsedTime\n  if (options.is) time = settings.dateTime.startTime + options.is\n  if (options.add) time += options.add\n  for (let el of settings.dateTime.data) {\n    dict[el.name] = time % el.number\n    time = Math.floor(time / el.number)\n  }\n  return dict\n}\n\nutil.getCustomDateTime = function(options) {\n  if (!options) options = {}\n  const dict = util.getCustomDateTimeDict(options)\n  let s = options.format ? settings.dateTime.formats[options.format] : settings.dateTime.formats.def\n  for (let key in settings.dateTime.functions) {\n    s = s.replace('%' + key + '%', settings.dateTime.functions[key](dict))\n  }\n  return s\n}\n\nutil.seconds = function(seconds, minutes = 0, hours = 0, days = 0) {\n  if (settings.dateTime.convertSeconds) return settings.dateTime.convertSeconds(seconds, minutes, hours, days)\n  return ((((days * 24) + hours) * 60) + minutes) * 60 + seconds\n}\n\nutil.elapsed = function(seconds, minutes = 0, hours = 0, days = 0) {\n  return util.seconds(seconds, minutes, hours, days) >= game.elapsedTime\n}\n\nutil.isAfter = function(timeString) {\n  if (typeof timeString === 'number') return game.elapsedTime > timeString\n\n  if (timeString.match(/^\\d\\d\\d\\d$/)) {\n    // This is a 24h clock time, so a daily\n    const dict = util.getDateTimeDict()\n\n    const hour = parseInt(timeString.substring(0, 2))\n    const minute = parseInt(timeString.substring(2, 4))\n    if (hour < dict.hour) return true\n    if (hour > dict.hour) return false\n    return (minute < dict.minute)\n  }\n\n  const nowTime = new Date(game.elapsedTime * 1000 + game.startTime.getTime())\n  const targetTime = Date.parse(timeString)\n  if (targetTime) return nowTime > targetTime\n  return errormsg(\"Failed to parse date-time string: \" + timeString)\n}\n\nutil.changePOV = function(char, pronouns) {\n  if (typeof char === 'string') {\n    if (!w[char]) return errormsg(\"Failed to change POV, no object called '\" + char + \"'\")\n    char = w[char]\n  }\n  else if (!char) errormsg(\"Failed to change POV, char not defined.\")\n\n  if (player()) {\n    player().player = false\n    player().pronouns = player().npcPronouns\n    player().regex = new RegExp('^(' + (char.npcAlias ? char.npcAlias : char.alias) + ')$')\n  }\n  char.player = true\n  char.npcPronouns = char.pronouns\n  char.pronouns = pronouns ? pronouns : lang.pronouns.secondperson\n  char.regex = new RegExp('^(me|myself|player|' + (char.npcAlias ? char.npcAlias : char.alias) + ')$')\n  setPlayer(char)\n  setPlayer(char)\n  world.update();\n}\n\nutil.getObj = function(name) {\n  if (!name) return errormsg(\"Trying to find an object in util.getObj, but name is \" + name)\n  if (typeof name === 'string') {\n    const room = w[name]\n    if (room === undefined) throw new Error(\"Failed to find room: \" + name + \".\")\n    return room\n  }\n  else {\n    if (name.name === undefined) {\n      throw \"Not sure what to do with this room: \" + name + \" (a \" + (typeof name) + \").\"\n    }\n    return name\n  }\n}\n\nutil.findUniqueName = function(s) {\n  if (!w[s]) {\n    return (s);\n  }\n  else {\n    const res = /(\\d+)$/.exec(s);\n    if (!res) {\n      return util.findUniqueName(s + \"0\");\n    }\n    const n = parseInt(res[0]) + 1;\n    return util.findUniqueName(s.replace(/(\\d+)$/, \"\" + n));\n  }\n}\n\nutil.findSource = function(options) {\n  const fluids = options.fluid ? [options.fluid] : settings.fluids\n  const chr = options.char ? options.char : player()\n\n  // Is character a source?\n  if (chr.isSourceOf) {\n    for (const s of fluids) {\n      if (chr.isSourceOf(s)) {\n        options.source = chr\n        options.fluid = s\n        return true\n      }\n    }\n  }\n\n  // Is the room a source?\n  if (w[chr.loc].isSourceOf) {\n    for (const s of fluids) {\n      if (w[chr.loc].isSourceOf(s)) {\n        options.source = w[chr.loc]\n        options.fluid = s\n        return true\n      }\n    }\n  }\n\n  // Is there some other source?\n  const items = scopeReachable()\n  for (const s of fluids) {\n    for (let obj of items) {\n      if (obj.isSourceOf && obj.isSourceOf(s)) {\n        options.source = obj\n        options.fluid = s\n        return true\n      }\n      if (obj.containedFluidName && obj.containedFluidName === s) {\n        options.source = obj\n        options.fluid = s\n        return true\n      }\n    }\n  }\n  return false\n}\n\nutil.multiIsUltimatelyHeldBy = function(obj, objNames) {\n  for (const objName of objNames) {\n    if (!objName) continue\n    let o = w[objName]\n    if (o === obj) return true\n    while (o.loc) {\n      if (o.loc === obj.name) return true\n      o = w[o.loc]\n    }\n  }\n  return false\n}\n\nutil.testAttribute = function(o, attName) {\n  if (typeof o[attName] === 'function') {\n    return o[attName]()\n  }\n  else {\n    return o[attName]\n  }\n}\n\nutil.getLoc = function(options, loc, name) {\n  if (!loc) return\n  if (typeof loc === 'object') {\n    options[name] = loc.name\n  }\n  else if (loc === 'char' || loc === 'name') {\n    options[name] = options.char.name\n  }\n  else if (loc === 'loc' && options.container) {\n    options[name] = options.container.name\n  }\n  else if (loc === 'loc' && options.holder) {\n    options[name] = options.holder.name\n  }\n  else if (loc === 'loc') {\n    options[name] = options.char.loc\n  }\n  else if (settings.placeholderLocations.includes(loc)) {\n    options[name] = loc\n  }\n  else if (w[loc]) {\n    options[name] = loc\n  }\n  else {\n    errormsg(\"Unexpected location in util.setToFrom/util.getLoc: \" + loc)\n  }\n}\n\nutil.setToFrom = function(options, toLoc, fromLoc) {\n  util.getLoc(options, toLoc, \"toLoc\")\n  util.getLoc(options, fromLoc, \"fromLoc\")\n  return options\n}\n\nutil.defaultExitIsGuarded = function() { return false }\n\nutil.defaultExitUse = function(char, exit) {\n  if (!exit) exit = this\n  if (char.testMove && !char.testMove(exit)) return false\n  if (exit.isGuarded()) return false\n  if (exit.isLocked()) {\n    return falsemsg(exit.lockedmsg ? exit.lockedmsg : lang.locked_exit, {char:char, exit:exit})\n  }\n  if (exit.testExit && !exit.testExit(char, exit)) return false\n  for (const el of char.getCarrying()) {\n    if (el.testCarry && !el.testCarry({char:char, item:el, exit:exit})) return false\n  }\n  return this.simpleUse ? this.simpleUse(char) : util.defaultSimpleExitUse(char, exit)\n}\n\nutil.defaultSimpleExitUse = function(char, exit) {\n  if (exit.name === '_') return errormsg(\"Trying to move character to location \\\"_\\\" from room \" + exit.origin.name + \". This is probably a bug, as \\\"_\\\" is used to flag a destination that cannot be reached.\")\n  // noinspection PointlessBooleanExpressionJS\n    if (exit === undefined) exit = this\n\n  char.msg(lang.stop_posture(char))\n  char.movingMsg(exit)\n  char.moveChar(exit)\n  return true\n}\n\n// Helper function for exits.\n// You must set \"door\" and can optionally set \"doorName\" in the exit attributes\nutil.useWithDoor = function(char) {\n  const obj = w[this.door];\n  if (obj === undefined) {\n    errormsg(\"Not found an object called '\" + this.door + \"'. Any exit that uses the 'util.useWithDoor' function must also set a 'door' attribute.\");\n  }\n  const tpParams = {char:char, doorName:this.doorName ? this.doorName : \"door\"}\n  if (!obj.closed) {\n    char.moveChar(this)\n    return true\n  }\n  if (!obj.locked) {\n    obj.closed = false\n    msg(lang.open_and_enter, tpParams)\n    char.moveChar(this)\n    return true\n  }\n  if (obj.testKeys(char)) {\n    obj.closed = false\n    obj.locked = false\n    msg(lang.unlock_and_enter, tpParams)\n    char.moveChar(this)\n    return true\n  }\n  msg(lang.try_but_locked, tpParams)\n  return false\n}\n\n// Helper function for exits.\n// You can optionally set \"msg\" in the exit attributes\nutil.cannotUse = function(char, dir) {\n  const tpParams = {char:char}\n  msg(this.msg ? this.msg : lang.try_but_locked, tpParams)\n  return false\n}\n\n// Helper function for exits.\n// Set \"isHidden\" to this for exits into a transit; the exit will be hidden if the transit is not here\nutil.hiddenIfNoTransit = function() {\n  return w[this.name].transitCurrentLocation !== this.origin.name\n}\n\nutil.commandsToTest = [\n  // saying\n  {\n    name:\"say\",\n    withText:true,\n  },\n  {\n    name:\"cry\",\n    withText:true,\n    onOwn:true,\n  },\n  {\n    name:\"shout\",\n    withText:true,\n    onOwn:true,\n  },\n  {\n    name:\"scream\",\n    withText:true,\n    onOwn:true,\n  },\n  {\n    name:\"pray\",\n    onOwn:true,\n  },\n  {\n    name:\"sing\",\n    onOwn:true,\n  },\n  {\n    name:\"dance\",\n    onOwn:true,\n  },\n\n  // resting\n  {\n    name:\"rest\",\n    onOwn:true,\n  },\n  {\n    name:\"sit\",\n    onOwn:true,\n    withItem:true,\n  },\n  {\n    name:\"sleep\",\n    onOwn:true,\n  },\n\n  // attacking\n  {\n    name:\"hit\",\n    withItem:true,\n  },\n  {\n    name:\"attack\",\n    withItem:true,\n  },\n  {\n    name:\"punch\",\n    withItem:true,\n  },\n  {\n    name:\"pick\",\n    withItem:true,\n  },\n  {\n    name:\"scratch\",\n    withItem:true,\n  },\n\n  // moving\n  {\n    name:\"swim\",\n    onOwn:true,\n    withItem:true,\n  },\n  {\n    name:\"dive\",\n  },\n  {\n    name:\"climb\",\n    onOwn:true,\n    withItem:true,\n  },\n  {\n    name:\"jump\",\n    onOwn:true,\n    withItem:true,\n  },\n\n  // sensing\n  {\n    name:\"touch\",\n    withItem:true,\n  },\n  {\n    name:\"look behind\",\n    withItem:true,\n  },\n  {\n    name:\"look under\",\n    withItem:true,\n  },\n  {\n    name:\"search\",\n    onOwn:true,\n    withItem:true,\n  },\n  {\n    name:\"hear\",\n    onOwn:true,\n    withItem:true,\n  },\n  {\n    name:\"smell\",\n    onOwn:true,\n    withItem:true,\n  },\n\n  // mental\n  {\n    name:\"think\",\n    onOwn:true,\n  },\n  {\n    name:\"think about\",\n    withText:true,\n  },\n  {\n    name:\"remember\",\n    onOwn:true,\n    withItem:true,\n    withText:true,\n  },\n\n  // rude (beause some people will try it)\n  {\n    name:\"piss\",\n    onOwn:true,\n    rude:'p***',\n  },\n  {\n    name:\"fuck\",\n    onOwn:true,\n    withItem:true,\n    rude:'f***',\n  },\n  {\n    name:\"fart\",\n    onOwn:true,\n    rude:'p***',\n  },\n\n  // misc\n  {\n    name:\"dig\",\n  },\n  {\n    name:\"undress\",\n    onOwn:true,\n    withItem:true,\n  },\n  {\n    name:\"kiss\",\n    withItem:true,\n  },\n  {\n    name:\"comfort\",\n    withItem:true,\n  },\n  {\n    name:\"hints\",\n    onOwn:true,\n  },\n  {\n    name:\"plugh\",\n    onOwn:true,\n  },\n  {\n    name:\"xyzzy\",\n    onOwn:true,\n  },\n\n  // check the scenery\n  {\n    name:\"x sky\",\n    onOwn:true,\n  },\n  {\n    name:\"x floor\",\n    onOwn:true,\n  },\n  {\n    name:\"x wall\",\n    onOwn:true,\n  },\n]\n\nutil.testme = function(item) {\n  log('-------------------------------------')\n  log('Testing implementation of odd commands, using ' + item.name)\n  test.testing = true\n  for (const d of util.commandsToTest) {\n    if (d.onOwn) {\n      test.testOutput = []\n      parser.parse(d.name)\n      if (test.testOutput[0] === lang.not_known_msg) log('No command to handle ' + d.name.toUpperCase())\n    }\n    if (d.withText) {\n      test.testOutput = []\n      parser.parse(d.name + ' some text')\n      if (test.testOutput[0] === lang.not_known_msg) log('No command to handle ' + d.name.toUpperCase() + ' <text>')\n    }\n    if (d.withItem) {\n      test.testOutput = []\n      parser.parse(d.name + ' ' + item.alias)\n      if (test.testOutput[0] === lang.not_known_msg) log('No command to handle ' + d.name.toUpperCase() + ' <item>')\n    }\n\n\n\n  }\n  test.testing = false\n}\n","// noinspection JSUnusedGlobalSymbols\n\n\"use strict\";\n\n// Comment necessary for require in QEdit\n\nimport {game, io, lang, sentenceCase, world, player} from \"../index.js\";\n\nexport function run() {\n    world.init()\n    settings.performanceLog('World initiated')\n    io.init()\n    settings.performanceLog('io.init completed')\n}\n\nexport const settings = {\n  performanceLogStartTime:performance.now(),\n\n  // Also title, author, thanks (option; array)\n\n  // Files\n  lang:\"lang-en\",      // Set to the language file of your choice\n  customExits:false,      // Set to true to use custom exits, in exits.js\n  // files:[\"code\", \"data\"], // Additional files to load\n  // libraries:[\n  //     \"_file_saver\",\n  //     \"_saveload\",\n  //     \"_text\",\n  //     \"_io\",\n  //     \"_command\",\n  //     \"_defaults\",\n  //     \"_templates\",\n  //     \"_world\",\n  //     \"_npc\",\n  //     \"_parser\",\n  //     \"_commands\"\n  // ],  // util already loaded\n  // customLibraries:[],\n  imagesFolder:'assets/images/',\n  iconsFolder:'assets/icons/',\n  soundsFolder:'assets/audio/',\n  videosFolder:'assets/video/',\n  cssFolder:'assets/css/',\n  themes:['sans-serif'],\n  styleFile:'style',\n  soundsFileExt:'.mp3',\n\n\n  // The side panes\n  panes:'left',           //Can be set to Left, Right or None (setting PANES to None will more than double the speed of your game!)\n  panesCollapseAt:700,\n  compassPane:true,           // Set to true to have a compass world.\n  useCompassIcons:true,\n  statusPane:\"Status\",    // Title of the panel; set to false to turn off\n  statusWidthLeft:120,    // How wide the left column is in the status pane\n  statusWidthRight:40,    // How wide the right column is in the status pane\n  status:[\n    function() { return \"<td>Health points:</td><td>\" + player().hitpoints + \"</td>\"; },\n  ],\n  customPaneFunctions:{},\n\n  // Functions for the side panes lists\n  isHeldNotWorn:function(item) {\n    return item.isAtLoc(player().name, world.SIDE_PANE) && world.ifNotDark(item) && !item.getWorn();\n  },\n  isHere:function(item) {\n    return item.isAtLoc(player().loc, settings.sceneryInSidePane ? world.PARSER : world.SIDE_PANE) && world.ifNotDark(item);\n  },\n  isWorn:function(item) {\n    return item.isAtLoc(player().name, world.SIDE_PANE) && world.ifNotDark(item) && item.getWorn();\n  },\n\n\n  // Other UI settings\n  textInput:true,         // Allow the player to type commands\n  cursor:\">\",             // The cursor, obviously\n  cmdEcho:true,           // Commands are printed to the screen\n  textEffectDelay:25,\n  roomTemplate:[\n    \"#{cap:{hereName}}\",\n    \"{terse:{hereDesc}}\",\n    \"{objectsHere:You can see {objects} here.}\",\n    \"{exitsHere:You can go {exits}.}\",\n    \"{ifNot:settings:playMode:play:{ifExists:currentLocation:todo:{class:todo:{show:currentLocation:todo}}}}\",\n  ],\n  silent:false,\n  walkthroughMenuResponses:[],\n  startingDialogEnabled:false,\n  darkModeActive:false,   // setting to true is a bad idea (use io.toggleDarkMode)\n  plainFontModeActive:false,   // setting to true is a bad idea (use io.togglePlainFontMode)\n  narrowMode:0,\n  mapAndImageCollapseAt:1200,\n  funcForDisambigMenu:'showMenuWithNumbers',\n  eventFunctions:{},\n  timerInterval:1000,  // For timer events, in milliseconds\n\n  // Conversations settings\n  noTalkTo:\"TALK TO is not a feature in this game.\",\n  noAskTell:\"ASK/TELL ABOUT is not a feature in this game.\",\n  npcReactionsAlways:false,\n  turnsQuestionsLast:5,\n  givePlayerSayMsg:true,\n  givePlayerAskTellMsg:true,\n  funcForDynamicConv:'showMenu',\n\n  // Other game play settings\n  failCountsAsTurn:false,\n  lookCountsAsTurn:false,\n  beforeEnter:function () {},\n  afterEnter:function () {},\n\n  // When save is disabled, objects can be created during game play\n  saveDisabled:false,\n\n  // Date and time settings\n  dateTime:{\n    year:\"numeric\",\n    month:\"short\",\n    day:\"2-digit\",\n    hour:\"2-digit\",\n    minute:\"2-digit\",\n    secondsPerTurn:60,\n    locale:'en-GB',\n    start:new Date('February 14, 2019 09:43:00'),\n  },\n\n  // Other settings\n  // The parser will convert \"two\" to 2\" in player input (can slow down the game)\n  convertNumbersInParser:true,\n  tests:false,\n  maxUndo:10,\n  moneyFormat:\"$!\",\n  questVersion:'1.4.0',\n  mapStyle:{right:'0', top:'200px', width:'300px', height:'300px', 'background-color':'beige' },\n  openQuotation:\"'\",\n  closeQuotation:\"'\",\n  fluids:[],\n  getDefaultRoomHeading:function(item) { return sentenceCase(lang.addDefiniteArticle(item, {ignorePossessive:'noLink'}) + item.alias) },\n  afterFinish:[],\n  roomSetList:{},\n  placeholderLocations:[],\n  modulesToEndTurn:[],\n  saveLoadExcludedAtts:[\n    \"name\", \"ensembleMembers\", \"clonePrototype\", \"saveLoadExcludedAtts\",  \"startTime\",\n    \"verbFunctions\", \"pronouns\", \"nameModifierFunctions\",\n    \"afterEnterIf\", \"askOptions\", \"tellOptions\", \"regex\",\n    \"reactions\", \"receiveItems\", \"scopeStatus\",\n  ],\n\n  getLocationDescriptionAttName:function() {\n    return game.dark ? \"darkDesc\" : \"desc\"\n  },\n\n  statsData:[\n    {name:'Objects', test:function(o) { return true }},\n    {name:'Locations', test:function(o) { return o.room }},\n    {name:'Items', test:function(o) { return !o.room }},\n    {name:'Takeables', test:function(o) { return o.takeable }},\n    {name:'Scenery', test:function(o) { return o.scenery }},\n    {name:'NPCs', test:function(o) { return o.npc && !o.player }},\n  ],\n\n  performanceLog:function() { },\n\n  // This is split out for io.showInTab to use\n  loadCssFiles:function(doc = document, path = '') {\n    settings.loadCssFile(settings.cssFolder + 'default.css', doc, path)\n    for (let file of settings.themes) {\n      settings.loadCssFile(settings.cssFolder + file + '.css', doc, path)\n    }\n    settings.loadCssFile(settings.folder + settings.styleFile + '.css', doc, path)\n  },\n\n  loadCssFile:function(filename, doc = document, path = '') {\n    const link = document.createElement( \"link\" )\n    link.href = path + filename\n    link.type = \"text/css\"\n    link.rel = \"stylesheet\"\n    link.media = \"screen,print\"\n    doc.head.appendChild(link)\n  },\n}\n\n//settings.scriptLoadLogging = true\nsettings.performanceLogStart = function() {\n  settings.performanceLogStartTime = performance.now()\n}\nsettings.performanceLog = function(s) {\n  if (!settings.performanceLogging) return\n  const dur = Math.round(performance.now() - settings.performanceLogStartTime).toString().padStart(4)\n  console.log(s.padEnd(32) + dur)\n}\n\n// These two functions use values in settings, so have to be set later\nsettings.inventoryPane = [\n  {name:'Items Held', alt:'itemsHeld', test:settings.isHeldNotWorn, getLoc:function() { return player().name; } },\n  {name:'Items Worn', alt:'itemsWorn', test:settings.isWorn, getLoc:function() { return player().name; } },\n  {name:'Items Here', alt:'itemsHere', test:settings.isHere, getLoc:function() { return player().loc; } },\n]\n\nsettings.setUpDialogClick = function() {\n  settings.startingDialogEnabled = false\n  io.enable()\n  settings.startingDialogOnClick()\n  world.begin()\n  if (settings.textInput) { document.querySelector('#textbox').focus(); }\n  document.querySelector(\"#dialog\").style.display = 'none'\n}\n\nsettings.setUpDialog = function() {\n  const diag = document.querySelector(\"#dialog\")\n  document.querySelector(\"#dialog-title\").innerHTML = settings.startingDialogTitle\n  document.querySelector(\"#dialog-content\").innerHTML = settings.startingDialogHtml\n  if (settings.startingDialogButton) document.querySelector(\"#dialog-button\").innerHTML = settings.startingDialogButton\n  document.querySelector(\"#dialog-button\").addEventListener('click', settings.setUpDialogClick)\n\n  io.disable()\n  diag.show()\n  diag.style.display = 'block'\n  diag.style.width = settings.startingDialogWidth + 'px'\n  diag.style.height = 'auto'\n  diag.style.top = '100px'\n}\n","\"use strict\";\n\nimport {\n    Cmd, COUNT, DEFINITE, INDEFINITE, io, parser, saveLoad, settings, util, world,\n    errormsg, formatList, metamsg, msg, player, processText, rChunkString, sentenceCase, wait,\n} from '../index.js';\n\n// Language support\n\nexport const lang = {\n\n  regex:{\n    //----------------------------------------------------------------------------------------------\n    // Regular Expressions for Commands\n\n    // Meta commands\n    MetaUnfinish:/^unfinish?$/,\n    MetaHello:/^(?:hello|hi|yo)$|^\\?$/,\n    MetaHelp:/^help$|^\\?$/,\n    MetaHint:/^(?:hint|clue)s?$/,\n    MetaCredits:/^(?:about|credits|version|info)$/,\n    MetaDarkMode:/^(?:dark|dark mode|toggle dark|toggle dark mode)$/,\n    MetaAutoScrollMode:/^(?:scroll|autoscroll|toggle scroll|toggle autoscroll)$/,\n    MetaNarrowMode:/^(?:narrow|narrow mode|toggle narrow|toggle narrow mode|mobile|mobile mode|toggle mobile|toggle mobile mode)$/,\n    MetaPlainFontMode:/^(?:font|plain font|plain fonts|fonts)$/,\n    MetaWarnings:/^warn(?:ing|ings|)$/,\n    MetaImages:/^images$/,\n    MetaSilent:/^(?:sh|silent)$/,\n    MetaSpoken:/^spoken$/,\n    MetaIntro:/^intro$/,\n    MetaBrief:/^brief$/,\n    MetaTerse:/^terse$/,\n    MetaVerbose:/^verbose$/,\n    MetaTranscript:/^transcript$|^script$/,\n    MetaTranscriptStart:/^transcript on$|^script start$/,\n    MetaTranscriptOn:/^transcript on$|^script on$/,\n    MetaTranscriptOff:/^transcript off$|^script off$/,\n    MetaTranscriptClear:/^transcript clear$|^script clear$|^transcript delete$|^script delete$/,\n    MetaTranscriptShow:/^transcript show$|^script show$|^show script$|^show transcript$|^showscript$/,\n    MetaTranscriptWalkthrough:/^(?:transcript|script) walk$/,\n    MetaUserComment:/^(?:\\*|\\;)(.+)$/,\n    MetaSave:/^save$/,\n    MetaSaveGame:/^(?:save) (.+)$/,\n    MetaFileSaveGame:/^(?:fsave) (.+)$/,\n    MetaSaveOverwriteGame:/^(?:save) (.+) (?:overwrite|ow)$/,\n    MetaLoad:/^(?:load|reload|restore)$/,\n    MetaLoadGame:/^(?:load|reload|restore) (.+)$/,\n    MetaFileLoadGame:/^(?:fload|freload|frestore)$/,\n    MetaDir:/^(?:reload|load|restore|dir|directory|ls|save ls|save dir)$/,\n    MetaDeleteGame:/^(?:delete|del) (.+)$/,\n    MetaUndo:/^undo$/,\n    MetaAgain:/^(?:again|g)$/,\n    MetaOops:/^(?:oops)$/,\n    MetaRestart:/^restart$/,\n    MetaScore:/^score$/,\n    MetaPronouns:/^pronouns$/,\n    MetaTopicsNote:/^topics?$/,\n\n    // Kind of meta\n    Look:/^l$|^look$|^describe (?:room|the room|location|the location|where i am|here)$/,\n    Exits:/^exits$/,\n    Map:/^map$/,\n    Inv:/^inventory$|^inv$|^i$/,\n\n    // Misc\n    Wait:/^wait$|^z$/,\n    Smell:/^smell$|^sniff$/,\n    Listen:/^listen$/,\n    PurchaseFromList:/^buy$|^purchase$/,\n\n    // Use item\n    Examine:/^(?:examine|exam|ex|x|describe) (.+)$/,\n    LookAt:/^(?:look at|look|l) (.+)$/,\n    LookOut:/^(?:look out of|look out) (.+)$/,\n    LookBehind:/^(?:look behind|check behind) (.+)$/,\n    LookUnder:/^(?:look under|check under) (.+)$/,\n    LookInside:/^(?:look inside|look in) (.+)$/,\n    LookThrough:/^(?:look|peek|peer) (?:down|through) (.+)$/,\n    Search:/^(?:search) (.+)$/,\n    Take:/^(?:take|get|pick up|pick|t|grab) (.+)$/,\n    Drop:/^(?:drop|d|discard) (.+)$/,\n    Wear2:/^put (?:my |your |his |her |)(.+) on$/,\n    Wear:/^(?:wear|don|put on) (?:my |your |his |her |)(.+)$/,\n    Remove:/^(?:remove|doff|take off|unwear) (?:my |your |his |her |)(.+)$/,\n    Remove2:/^take (?:my |your |his |her |)(.+) off$/,\n    Read:/^(?:read|r) (.+)$/,\n    SmellItem:/^(?:smell|sniff) (.+)$/,\n    ListenToItem:/^(?:listen to|listen) (.+)$/,\n    Purchase:/^(?:purchase|buy) (.+)$/,\n    Sell:/^(?:sell) (.+)$/,\n    Smash:/^(?:smash|break|destroy|burst|pierce|puncture|bust) (.+)$/,\n    Turn:/^(?:turn|rotate|twist) (.+)$/,\n    TurnLeft:/^(?:turn|rotate|twist) (.+) (?:left|anticlockwise|anti-clockwise|widdershins)$/,\n    TurnRight:/^(?:turn|rotate|twist) (.+) (?:right|clockwise)$/,\n    SwitchOn:/^(?:turn on|switch on|active|enable) (.+)$/,\n    SwitchOn2:/^(?:turn|switch) (.+) on$/,\n    SwitchOff2:/^(?:turn|switch|deactivate|disable) (.+) off$/,\n    SwitchOff:/^(?:turn off|switch off) (.+)$/,\n    Open:/^(?:open) (.+)$/,\n    OpenWith:[\n      /^(?:open) (.+) (?:with|using) (.+)$/,\n      {regex:/^(?:use|with|using) (.+?) (?:to open|open) (.+)$/, mod:{reverse:true}},\n    ],\n    Close:/^(?:close) (.+)$/,\n    Lock:/^(?:lock) (.+)$/,\n    LockWith:[\n      /^(?:lock) (.+) (?:with|using) (.+)$/,\n      {regex:/^(?:use|with|using) (.+?) (?:to lock|lock) (.+)$/, mod:{reverse:true}},\n    ],\n    Unlock:/^(?:unlock) (.+)$/,\n    UnlockWith:[\n      /^(?:unlock) (.+) (?:with|using) (.+)$/,\n      {regex:/^(?:use|with|using) (.+?) (?:to unlock|unlock) (.+)$/, mod:{reverse:true}},\n    ],\n    Push:/^(?:push|press) (.+)$/,\n    Pull:/^(?:pull|drag) (.+)$/,\n    Fill:/^(?:fill) (.+)$/,\n    Empty:/^(?:empty|discharge|decant|pour out|pour) (.+)$/,\n    Eat:/^(eat|feed on|feed|partake of|partake|dine on|dine) (.+)$/,\n    Drink:/^(drink|imbibe|quaff|guzzle|knock back|swig|swill|sip|down|chug) (.+)$/,\n    Ingest:/^(consume|swallow|ingest) (.+)$/,\n    Sit:/^(?:sit down|sit)$/,\n    Recline:/^(?:recline|lie down|lie)$/,\n    SitOn:/^(?:sit on|sit upon|sit) (.+)$/,\n    StandOn:/^(?:stand on|stand upon|stand) (.+)$/,\n    ReclineOn:/^(?:recline on|recline upon|recline|lie on|lie upon|lie) (.+)$/,\n    GetOff:/^(?:get off|off) (.+)$/,\n    Use:/^(?:use) (.+)$/,\n    TalkTo:/^(?:talk to|talk|speak to|speak|converse with|converse) (.+)$/,\n    Topics:/^topics? (?:for )?(.+)$/,\n\n    Make:/^(?:make|build|construct) (.+)$/,\n    MakeWith:[\n      /^(?:make|build|construct) (.+) (?:with|from|using) (.+)$/,\n      {regex:/^(?:with:from|using) (.+) (?:make|build|construct) (.+)$/, mod:{reverse:true}},\n      {regex:/^(?:use) (.+) to (?:make|build|construct) (.+)$/, mod:{reverse:true}},\n    ],\n    NpcMake:[\n      /^(.+), ?(?:make|build|construct) (.+)$/,\n      /^(?:tell|ask|instruct) (.+) to (?:make|build|construct) (.+)$/,\n    ],\n    NpcMakeWith:[\n      /^(.+), ?(?:make|build|construct) (.+) (?:with|from|using) (.+)$/,\n      /^(?:tell|ask|instruct) (.+) to (?:make|build|construct) (.+) (?:with|from|using) (.+)$/,\n      {regex:/^(.+), ?(?:with:from|using) (.+) (?:make|build|construct) (.+)$/, mod:{reverse:true}},\n      {regex:/^(?:tell|ask|instruct) (.+) to (?:with:from|using) (.+) (?:make|build|construct) (.+)$/, mod:{reverse:true}},\n      {regex:/^(.+), ?(?:use) (.+) to (?:make|build|construct) (.+)$/, mod:{reverse:true}},\n      {regex:/^(?:tell|ask|instruct) (.+) to (?:use) (.+) to (?:make|build|construct) (.+)$/, mod:{reverse:true}},\n    ],\n\n    GoInItem:/^(?:enter|go in|in|inside|go inside|climb in|climb inside|get in|get inside) (.+)$/,\n    GoOutItem:/^(?:exit|go out|out|outside|go outide|leave) (.+)$/,\n    GoUpItem:/^(?:go up|up|climb up|climb|ascend) (.+)$/,\n    GoDownItem:/^(?:go down|down|climb down|descend) (.+)$/,\n    GoThroughItem:/^(?:go through|walk through) (.+)$/,\n    NpcGoInItem:[\n      /^(.+), ?(?:enter|go in|in|inside|go inside|climb in|climb inside|get in|get inside) (.+)$/,\n      /^(?:tell|ask|instruct) (.+) to (?:enter|go in|in|inside|go inside|climb in|climb inside|get in|get inside) (.+)$/,\n    ],\n    NpcGoOutItem:[\n      /^(.+), ?(?:exit|go out|out|outside|go outide|leave) (.+)$/,\n      /^(?:tell|ask|instruct) (.+) to (?:exit|go out|out|outside|go outide|leave) (.+)$/,\n    ],\n    NpcGoUpItem:[\n      /^(.+), ?(?:go up|up|climb up|climb|ascend) (.+)$/,\n      /^(?:tell|ask|instruct) (.+) to (?:go up|up|climb up|climb|ascend) (.+)$/,\n    ],\n    NpcGoDownItem:[\n      /^(.+), ?(?:go down|down|climb down|descend) (.+)$/,\n      /^(?:tell|ask|instruct) (.+) to (?:go down|down|climb down|descend) (.+)$/,\n    ],\n    NpcGoThroughItem:[\n      /^(.+), ?(?:go through|walk through) (.+)$/,\n      /^(?:tell|ask|instruct) (.+) to (?:go through|walk through) (.+)$/,\n    ],\n\n    // Misc again\n    Say:/^(say|shout|whisper|holler|scream|yell) (.+)$/,\n    Stand:/^stand$|^stand up$|^get up$/,\n    NpcStand:[/^(.+), ?(?:stand|stand up|get up)$/, /^(?:tell|ask|instruct) (.+) to (?:stand|stand up|get up)$/],\n    GetFluid:/^(?:get|take|scoop|pick|grab)(?:| up) (.+)$/,\n    FillWith:/^(?:fill) (.+) (?:with) (.+)$/,\n    NpcFillWith:[/^(.+), ?(?:fill) (.+) (?:with) (.+)$/, /^(?:tell|ask|instruct) (.+) to (?:fill) (.+) (?:with) (.+)$/],\n\n    EmptyInto:/^(?:empty|pour out|pour|discharge|decant) (.+) (?:into|in to|in|down|onto|on to|on) (.+)$/,\n    NpcEmptyInto:[/^(.+), ?(?:empty|pour|discharge|decant) (.+) (?:into|in to|in|down|onto|on to|on) (.+)$/, /^(?:tell|ask|instruct) (.+) to (?:empty|pour|discharge) (.+) (?:into|in to|in|down|onto|on to|on) (.+)$/],\n    EmptyFluidInto:/^(?:empty|pour out|pour|discharge|decant) (.+) (?:into|in to|in|down|onto|on to|on) (.+)$/,\n    NpcEmptyFluidInto:[/^(.+), ?(?:empty|pour|discharge|decant) (.+) (?:into|in to|in|down|onto|on to|on) (.+)$/, /^(?:tell|ask|instruct) (.+) to (?:empty|pour|discharge) (.+) (?:into|in to|in|down|onto|on to|on) (.+)$/],\n    PutFluidIn:/^(?:put|place|drop) (.+) (?:in to|into|in|on to|onto|on) (.+)$/,\n\n    PutIn:/^(?:put|place|drop) (.+) (?:in to|into|in|on to|onto|on) (.+)$/,\n    NpcPutIn:[/^(.+), ?(?:put|place|drop|insert) (.+) (?:in to|into|in|on to|onto|on) (.+)$/, /^(?:tell|ask|instruct) (.+) to (?:put|place|drop) (.+) (?:in to|into|in|on to|onto|on) (.+)$/],\n    TakeOut:/^(?:take|get|remove) (.+) (?:from|out of|out|off of|off) (.+)$/,\n    NpcTakeOut:[/^(.+), ?(?:take|get|remove) (.+) (?:from|out of|out|off of|off) (.+)$/, /^(?:tell|ask|instruct) (.+) to (?:take|get|remove) (.+) (?:from|out of|out|off of|off) (.+)$/],\n    GiveTo:/^(?:give|offer|proffer) (.+) (?:to) (.+)$/,\n    NpcGiveTo:[/^(.+), ?(?:give|offer|proffer) (.+) (?:to) (.+)$/, /^(?:tell|ask|instruct) (.+) to ?(?:give|offer|proffer) (.+) (?:to) (.+)$/],\n    Give:/^(?:give|offer|proffer) (.+)$/,\n    NpcGive:[/^(.+), ?(?:give|offer|proffer) (.+)$/, /^(?:tell|ask|instruct) (.+) to ?(?:give|offer|proffer) (.+)$/],\n    //NpcGiveToMe:[/^(.+), ?(?:give) me (.+)$/, /^(?:tell|ask|instruct) (.+) to ?(?:give) me (.+)$/],\n\n    TieUp:/^(?:tie|fasten|attach|connect|hook) (.+)$/,\n    TieTo:/^(?:tie|fasten|attach|connect|hook) (.+) (?:to) (.+)$/,\n    NpcTieUp:[/^(.+), ?(?:tie|fasten|attach|connect|hook) (.+)$/, /^(?:tell|ask|instruct) (.+) to ?(?:tie|fasten|attach) (.+)$/],\n    NpcTieTo:[/^(.+), ?(?:tie|fasten|attach|connect|hook) (.+) (?:to) (.+)$/, /^(?:tell|ask|instruct) (.+) to ?(?:tie|fasten|attach) (.+) (?:to) (.+)$/],\n    Untie:/^(?:untie|unfasten|detach|disconnect|unhook) (.+)$/,\n    NpcUntie:[/^(.+), ?(?:untie|unfasten|detach|disconnect|unhook) (.+)$/, /^(?:tell|ask|instruct) (.+) to ?(?:untie|unfasten|detach) (.+)$/],\n    UntieFrom:/^(?:untie|unfasten|detach) (.+) (?:from) (.+)$/,\n    NpcUntieFrom:[/^(.+), ?(?:untie|unfasten|detach) (.+) (?:frm) (.+)$/, /^(?:tell|ask|instruct) (.+) to ?(?:untie|unfasten|detach) (.+) (?:from) (.+)$/],\n    UseWith:/^(?:use) (.+) (?:with|on) (.+)$/,\n\n    LookExit:/^(?:look|peer|l|glance) (northwest|nw|north|n|northeast|ne|in|in|enter|i|up|u|west|w|east|e|out|out|exit|o|down|dn|d|southwest|sw|south|s|southeast|se)$/,\n\n    PushExit:/^(push|pull|move|shift) (.+) (northwest|nw|north|n|northeast|ne|in|in|enter|i|up|u|west|w|east|e|out|out|exit|o|down|dn|d|southwest|sw|south|s|southeast|se)$/,\n    NpcPushExit:[\n      /^(.+), ?(push|pull|move|shift) (.+) (northwest|nw|north|n|northeast|ne|in|in|enter|i|up|u|west|w|east|e|out|out|exit|o|down|dn|d|southwest|sw|south|s|southeast|se)$/,\n      /^(?:tell|ask|instruct) (.+) to (push|pull|move|shift) (.+) (northwest|nw|north|n|northeast|ne|in|in|enter|i|up|u|west|w|east|e|out|out|exit|o|down|dn|d|southwest|sw|south|s|southeast|se)$/,\n    ],\n    AskAbout:/^(?:ask) (.+?) (about|what|who|how|why|where|when) (.+)$/,\n    TellAbout:/^(?:tell) (.+?) (about|what|who|how|why|where|when) (.+)$/,\n    TalkAbout:[\n      /^(?:talk to|talk with|talk|speak to|speak with|speak) (.+?) about (what|who|how|why|where|when) (.+)$/,\n      /^(?:talk to|talk with|talk|speak to|speak with|speak) (.+?) (about|what|who|how|why|where|when) (.+)$/,\n    ],\n    FollowMe:[/^(.+), ?(?:follow|follow me)$/, /^(?:tell|ask|instruct) (.+) to (?:follow|follow me)$/],\n    WaitHere:[\n      /^(.+), ?(?:stop follow|stop following|stop follow me|stop following me|wait|wait here|stay|stay here)$/,\n      /^(?:tell|ask|instruct) (.+) to (?:stop follow|stop following|stop follow me|stop following me|wait|wait here|stay|stay here)$/,\n    ],\n\n\n    //Debug\n    DebugWalkThrough:/^wt (.+)$/,\n    DebugInspect:/^inspect (.+)$/,\n    DebugInspectByName:/^inspect2 (.+)$/,\n    DebugWarpName:/^warp (.+)$/,\n    DebugTest:/^test$/,\n    DebugInspectCommand:/^(?:cmd|command) (.+)$/,\n    DebugListCommands:/^(?:cmd|command)s$/,\n    DebugListCommands2:/^(?:cmd|command)s2$/,\n    DebugParserToggle:/^parser$/,\n    DebugStats:/^stats?$/,\n    DebugHighlight:/^highlight$/,\n  },\n\n  // This will be added to the start of the regex of a command to make an NPC command\n  // The saved capture group is the NPC's name\n  tell_to_prefixes:{\n    1:'(?:tell|ask|instruct) (.+) to ',   // TELL KYLE TO GET SPOON\n    2:'(.+), ?',                 // KYLE, GET SPOON\n  },\n\n\n\n  //----------------------------------------------------------------------------------------------\n  // Standard Responses\n\n\n\n  // TAKEABLE\n  take_successful:\"{nv:char:take:true} {nm:item:the}{ifIs:params:excess:true:, that is all there is}.\",\n  take_successful_counted:\"{nv:char:take:true} {number:count} {nm:item}.\",\n  drop_successful:\"{nv:char:drop:true} {nm:item:the}{ifIs:params:excess:true:, that is all {nv:char:have}}.\",\n  drop_successful_counted:\"{nv:char:drop:true} {number:count} {nm:item}.\",\n  cannot_take:\"{multi}{pv:char:can't:true} take {ob:item}.\",\n  cannot_drop:\"{multi}{pv:char:can't:true} drop {ob:item}.\",\n  not_carrying:\"{multi}{pv:char:don't:true} have {if:item:countable:any:{ob:item}}.\",\n  already_have:\"{multi}{pv:char:'ve:true} got {ob:item} already.\",\n  cannot_take_component:\"{multi}{pv:char:can't:true} take {ob:item}; {pv:item:be} part of {nm:whole:the}.\",\n\n\n  // EDIBLE\n  eat_successful:\"{nv:char:eat:true} {nm:item:the}.\",\n  drink_successful:\"{nv:char:drink:true} {nm:item:the}.\",\n  cannot_eat:\"{nv:item:be:true} not something {nv:char:can} eat.\",\n  cannot_drink:\"{nv:item:be:true} not something {nv:char:can} drink.\",\n  cannot_ingest:\"{nv:item:be:true} not something {nv:char:can} ingest.\",\n\n\n  // WEARABLE\n  wear_successful:\"{nv:char:put:true} on {nm:item:the}.\",\n  remove_successful:\"{nv:char:take:true} {nm:item:the-pa::char} off.\",\n  cannot_wear:\"{multi}{nv:char:can't:true} wear {ob:item}.\",\n  cannot_wear_ensemble:\"{multi}Individual parts of an ensemble must be worn and removed separately.\",\n  not_wearing:\"{multi}{nv:char:be:true} not wearing {ob:item}.\",\n  cannot_wear_over:\"{nv:char:can't:true} put {nm:item:the} on over {pa:char} {nm:outer}.\",\n  cannot_remove_under:\"{nv:char:can't:true} take off {pa:char} {nm:item} whilst wearing {pa:char} {nm:outer}.\",\n  already_wearing:\"{multi}{nv:char:be:true} already wearing {ob:item}.\",\n  invWearingPrefix:\"wearing\",\n  invHoldingPrefix:\"holding\",\n\n\n  // CONTAINER, etc.\n  open_successful:\"{nv:char:open:true} {nm:container:the}.\",\n  close_successful:\"{nv:char:close:true} {nm:container:the}.\",\n  lock_successful:\"{nv:char:lock:true} {nm:container:the}.\",\n  unlock_successful:\"{nv:char:unlock:true} {nm:container:the}.\",\n  close_and_lock_successful:\"{nv:char:close:true} {nm:container:the} and {cj:char:lock} {sb:container}.\",\n  cannot_open:\"{nv:item:can't:true} be opened.\",\n  cannot_open_with:\"{nv:player:can't:true} open that with {nm:secondItem:the}.\",\n  cannot_lock_with:\"{nv:player:can't:true} lock that with {nm:secondItem:the}.\",\n  cannot_unlock_with:\"{nv:player:can't:true} unlock that with {nm:secondItem:the}.\",\n  cannot_close:\"{nv:item:can't:true} be closed.\",\n  cannot_lock:\"{nv:char:can't:true} lock {ob:item}.\",\n  cannot_unlock:\"{nv:char:can't:true} unlock {ob:item}.\",\n  not_container:\"{nv:container:be:true} not a container.\",\n  not_container_not_vessel:\"{nv:container:be:true} not a container. It is a vessel, they are different, alright?\",\n  container_recursion:\"What? {nv:char:want:true} to put {nm:item:the} in {nm:container:the} when {nm:container:the} is already in {nm:item:the}? That's just too freaky for me.\",\n  not_inside:\"{nv:item:be:true} not inside that.\",\n  locked:\"{nv:container:be:true} locked.\",\n  no_key:\"{nv:char:do:true} not have the right key.\",\n  locked_exit:\"That way is locked.\",\n  open_and_enter:\"{nv:char:open:true} the {show:doorName} and walk through.\",\n  unlock_and_enter:\"{nv:char:unlock:true} the {show:doorName}, open it and walk through.\",\n  try_but_locked:\"{nv:char:try:true} the {show:doorName}, but it is locked.\",\n  container_closed:\"{nv:container:be:true} closed.\",\n  inside_container:\"{nv:item:be:true} inside {nm:container:the}.\",\n  look_inside:\"Inside {nm:container:the} {nv:char:can} see {show:list}.\",\n  look_inside_it:\"Inside {sb:container} {nv:char:can} see {show:list}.\",\n\n\n  // MECHANDISE\n  purchase_successful:\"{nv:char:buy:true} {nm:item:the} for {money:money}.\",\n  sell_successful:\"{nv:char:sell:true} {nm:item:the} for {money:money}.\",\n  cannot_purchase_again:\"{nv:char:can't:true} buy {nm:item:the} here - probably because {pv:char:be} already holding {ob:item}.\",\n  cannot_purchase_here:\"{nv:char:can't:true} buy {nm:item:the} here.\",\n  cannot_afford:\"{nv:char:can't:true} afford {nm:item:the} (need {money:money}).\",\n  cannot_sell_here:\"{nv:char:can't:true} sell {nm:item:the} here.\",\n\n\n  // BACKDROP\n  default_scenery:\"It's just part of the scenery, nothing to worry abot.\",\n\n  // FURNITURE\n  sit_on_successful:\"{nv:char:sit:true} on {nm:item:the}.\",\n  stand_on_successful:\"{nv:char:stand:true} on {nm:item:the}.\",\n  recline_on_successful:\"{nv:char:lie:true} down on {nm:item:the}.\",\n  cannot_stand_on:\"{nv:item:be:true} not something {nv:char:can} stand on.\",\n  cannot_sit_on:\"{nv:item:be:true} not something {nv:char:can} sit on.\",\n  cannot_recline_on:\"{nv:item:be:true} not something {nv:char:can} lie on.\",\n  no_sit_object:\"There is nothing to sit on here.\",\n  no_recline_object:\"There is nothing to lie down on here.\",\n\n\n  // SWITCHABLE\n  switch_on_successful:\"{nv:char:switch:true} {nm:item:the} on.\",\n  switch_off_successful:\"{nv:char:switch:true} {nm:item:the} off.\",\n  cannot_switch_on:\"{nv:char:can't:true} turn {ob:item} on.\",\n  cannot_switch_off:\"{nv:char:can't:true} turn {ob:item} off.\",\n\n\n  // VESSEL\n  fill_successful:\"{nv:char:fill:true} {nm:item:the}.\",\n  empty_into_successful:\"{nv:char:empty:true} {nm:source:the} into {nm:item:the}.\",\n  empty_onto_successful:\"{nv:char:empty:true} {nm:source:the} over {nm:item:the}, and then watch it all run down on to the ground.\",\n  empty_successful:\"{nv:char:empty:true} {nm:source:the} onto the ground, and it soaks away.\",\n  already_empty:\"{nv:source:be:true} already empty.\",\n  cannot_fill:\"{nv:item:be:true} not something {nv:char:can} fill.\",\n  cannot_mix:\"{nv:item:be:true} not something {nv:char:can} mix liquids in.\",\n  not_vessel:\"{pv:item:be:true} not a vessel.\",\n  not_sink:\"Trying to put a liquid (or similar substance) in {nm:item:the} is just going to cause a mess.\",\n  not_source:\"{pv:source:be:true} not something {nv:char:can} get a liquid (or similar substance) out of.\",\n  cannot_get_fluid:\"{nv:char:try:true} to scoop up {show:fluid} but it all slips through {pa:char} fingers. Perhaps {pv:char:need} some kind of vessel.\",\n  no_fluid_here:\"There's no {show:fluid} here.\",\n  no_fluid_here_at_all:\"There's nothing to fill anything with here.\",\n  not_a_fluid_here:\"I don't know of a liquid (or similar substance) called {show:text}.\",\n  already_full:\"{pv:item:be:true} already full of {show:fluid}.\",\n  pour_into_self:\"It is not possible to pour from a vessel into the same vessel!\",\n  no_generic_fluid_here:\"There's nothing to fill {sb:item} with here.\",\n  not_carrying_fluid:\"{nv:char:be:true} not carrying anything with {show:fluid} in it.\",\n\n  // VESSEL (but source is referred to as \"item\" as it is caught by the general item handling)\n  cannot_empty:\"{nv:item:be:true} not something {nv:char:can} empty.\",\n\n\n\n  // CONSTRUCTION\n  component_wrong:\"{nv:char:cannot:true} make {nm:item:a} from {nm:wrong:a}.\",\n  component_missing:\"{nv:char:need:true} {nm:missing:a} to build {nm:item:a}.\",\n  construction_done:\"{nv:char:build:true} {nm:item:a} from {show:list}.\",\n  construction_already:\"{nm:item:the:true} has already been made.\",\n\n\n  // NPC\n  not_npc:\"{nv:char:can:true} tell {nm:item:the} to do anything {pv:char:like}, but there is no way {pv:item:'ll} do it.\",\n  not_npc_for_give:\"Realistically, {nv:item:be} not interested in anything {sb:char} might give {ob:item}.\",\n  not_interested_for_give:\"{nv:npc:be:true} not interested in {nm:item:the}.\",\n  cannot_follow:\"'Follow me,' {nv:char:say} to {nm:npc:the}. Being an inanimate object, {nv:char:be} not too optimistic it will do as it is told.\",\n  cannot_wait:\"'Wait here,' {nv:char:say} to {nm:item:the}. Being an inanimate object, {nv:char:feel} pretty confident it will do as it is told.\",\n  already_following:\"'I'm already following you!'\",\n  already_waiting:\"'I'm already waiting!'\",\n\n  cannot_ask_about:\"{nv:char:can:true} ask {ob:item} about {show:text} all {pv:char:like}, but {pv:item:be} not about to reply.\",\n  cannot_tell_about:\"{nv:char:can:true} tell {ob:item} about {show:text} all {pv:char:like}, but {pv:item:be} not interested.\",\n  cannot_talk_about:\"{nv:char:can:true} talk to {ob:item} about {show:text} all {pv:char:like}, but {pv:item:be} not interested.\",\n  topics_no_ask_tell:\"This character has no ASK/ABOUT or TELL/ABOUT options set up.\",\n  topics_none_found:\"No suggestions for what to ask or tell {nm:item:the} available.\",\n  topics_ask_list:\"Some suggestions for what to ask {nm:item:the} about: {show:list}.\",\n  topics_tell_list:\"Some suggestions for what to tell {nm:item:the} about: {show:list}.\",\n  cannot_talk_to:\"{nv:char:chat:true} to {nm:item:the} for a few moments, before realizing that {pv:item:be} not about to reply.\",\n  no_topics:\"{nv:char:have:true} nothing to talk to {nm:item:the} about.\",\n  not_able_to_hear:\"Doubtful {nv:item:will} be interested in anything {sb:char} has to say.\",\n  npc_no_interest_in:\"{nv:char:have:true} no interest in that subject.\",\n  npc_dead:\"{nv:char:be:true} dead.\",\n\n\n  // BUTTON\n  press_button_successful:\"{nv:char:push:true} {nm:item:the}.\",\n\n  // SHIFTABLE\n  push_exit_successful:\"{nv:char:push:true} {nm:item:the} {show:dir}.\",\n  cannot_push:\"{pv:item:be:true} not something {nv:char:can} move around like that.\",\n  cannot_push_up:\"{pv:char:be:true} not getting {nm:item:the} up there!\",\n  take_not_push:\"Just pick the thing up already!\",\n\n\n  // ROPE\n  rope_examine_attached_both_ends:\" It is {item.attachedVerb} to both {nm:obj1:the} and {nm:obj2:the}.\",\n  rope_examine_attached_one_end:\" It is {item.attachedVerb} to {nm:obj1:the}.\",\n  rope_attach_verb:'tie',\n  rope_attached_verb:'tied',\n  rope_detach_verb:'untie',\n  rope_one_end:'One end',\n  rope_other_end:'The other end',\n  rope_examine_end_attached:'is {item.attachedVerb} to {nm:obj:the}.',\n  rope_examine_end_held:'is held by {nm:holder:the}.',\n  rope_examine_end_headed:'heads into {nm:loc:the}.',\n  rope_no_attachable_here:\"There is nothing here {nv:char:can} attach {nm:item:the} to.\",\n  rope_not_attachable_to:\"That is not something {nv:char:can} attach {nm:item:the} to.\",\n  rope_not_detachable:\"{nv:char:cannot:true} attach that to - or detach it from - anything.\",\n  rope_tied_both_ends_already:\"{pv:item:be:true} already attached to {nm:obj1:the} and {nm:obj12:the}.\",\n  rope_not_attachable:\"{nv:char:cannot:true} attach that to anything.\",\n  rope_not_attached:\"{nv:item:be:true} not {item.attachedVerb} to anything.\",\n  rope_detach_end_ambig:\"Which end of {nm:item:the} do you want to detach?\",\n  rope_not_attached_to:\"{nv:item:be:true} not attached to {nm:obj:the}.\",\n  rope_tethered:\"{nv:char:can:true} not detach {nm:item:the} from {nm:obj:the}.\",\n  rope_attach_success:\"{nv:char:attach:true} {nm:item:the} to {nm:obj:the}.\",\n  rope_detach_success:\"{nv:char:detach:true} {nm:item:the} from {nm:obj:the}.\",\n  rope_cannot_move:\"{nv:item:be:true} not long enough, {nv:char:cannot} go any further.\",\n  rope_wind:\"{nv:char:wind:true} in {nm:item:the}.\",\n  rope_unwind:\"{nv:item:unwind:true} behind {nm:char:the}.\",\n  rope_tied_both_end:\"It is tied to something.\",\n  rope_tied_one_end:\"It is tied up at this end.\",\n  rope_no_end:\"{nv:char:cannot:true} see either end of {nm:item:the}.\",\n\n\n  // TRANSIT\n  transit_already_here:\"{nv:char:press:true} the button; nothing happens.\",\n  transit_go_to_dest:\"{nv:char:press:true} the button; the door closes...\",\n\n  // Movement\n  go_successful:\"{nv:char:head:true} {show:dir}.\",\n  not_that_way:\"{nv:char:can't:true} go {show:dir}.\",\n  no_look_that_way:\"{nv:char:can't:true} see anything of interest {show:dir}.\",\n  default_look_exit:\"{nv:char:look:true} {show:dir}; definitely an exit that way.\",\n  can_go:\"{nv:char:think:true} {pv:char:can} go {exits}.\",\n  cannot_go_in:\"{pv:item:be:true} not something {nv:char:can} get inside.\",\n  cannot_go_out:\"{pv:item:be:true} not something from which {nv:char:can} go out.\",\n  cannot_go_up:\"{pv:item:be:true} not something {nv:char:can} go up.\",\n  cannot_go_down:\"{pv:item:be:true} not something {nv:char:can} go down.\",\n  cannot_go_through:\"{pv:item:be:true} not something {nv:char:can} get through.\",\n\n\n  // General cannot Messages\n  cannot_read:\"Nothing worth reading there.\",\n  cannot_use:\"No obvious way to use {ob:item}.\",\n  cannot_smash:\"{nv:item:be:true} not something {nv:char:can} break.\",\n  cannot_turn:\"{nv:item:be:true} not something {nv:char:can} turn.\",\n  cannot_look_out:\"Not something {nv:char:can} look out of.\",\n  cannot_smell:\"{nv:item:have:true} no smell.\",\n  cannot_listen:\"{nv:item:be:true} not making any noise.\",\n\n\n  // General command messages\n  not_known_msg:\"I don't even know where to begin with that.\",\n  disambig_msg:\"Which do you mean?\",\n  no_multiples_msg:\"You cannot use multiple objects with that command.\",\n  nothing_msg:\"Nothing there to do that with.\",\n  general_obj_error:\"So I kind of get what you want to do, but not what you want to do it with.\",\n  done_msg:\"{multi}Done.\",\n  nothing_for_sale:\"Nothing for sale here.\",\n  wait_msg:\"Time passes...\",\n  no_map:\"Sorry, no map available.\",\n  inventory_prefix:\"{nv:char:be:true} carrying\",\n  no_receiver:\"There's no one here to give things to.\",\n\n\n  // General command fails\n  no_smell:\"{pv:char:can't:true} smell anything here.\",\n  no_listen:\"{pv:char:can't:true} hear anything of note here.\",\n  nothing_there:\"{nv:char:be:true} sure there's nothing there.\",\n  nothing_inside:\"There's nothing to see inside.\",\n  not_open:\"You have to open it first.\",\n  it_is_empty:\"{pv:container:be:true} empty.\",\n  not_here:\"{pv:item:be:true} not here.\",\n  char_has_it:\"{multi}{nv:holder:have:true} {ob:item}.\",\n  none_here:\"There's no {nm:item} here.\",\n  none_held:\"{nv:char:have:true} no {nm:item}.\",\n  //none_here_countable:\"There's no {nm:item} here.\",\n  //none_held_countable:\"{nv:char:have:true} no {nm:item}.\",\n  nothing_useful:\"That's not going to do anything useful.\",\n  already:\"{sb:item:true} already {cj:item:be}.\",\n  default_examine:\"{pv:item:be:true} just your typical, every day {nm:item}.\",\n  not_enough:\"There {ifMoreThan:count:1:are:is} only {show:count} {nm:item}.\",\n  it_is_dark:\"It is dark.\",\n  abort_cmds:\"Abandoning later commands\",\n\n  error:\"Oh dear, I seem to have hit an error trying to handle that (F12 for more details).\",\n\n\n\n\n  //----------------------------------------------------------------------------------------------\n  // Complex responses (requiring functions)\n\n  // Used deep in the parser, so prefer to use function, rather than string\n  object_unknown_msg:function(name) {\n    return \"There doesn't seem to be anything you might call '\" + name + \"' here.\";\n  },\n\n\n  // For furniture\n  stop_posture:function(char) {\n    if (!char.posture) return \"\"\n    if (!char.postureFurniture && char.posture === \"standing\") return \"\"\n    const options = {char:char}\n    if (w[char.postureFurniture]) options.item = w[char.postureFurniture]\n    char.posture = false\n    char.postureFurniture = false\n    return processText(options.item ? \"{nv:char:get:true} off {nm:item:the}.\" : \"{nv:char:stand:true} up.\", options)\n  },\n\n\n\n  // use (or potentially use) different verbs in the responses, so not simple strings\n  say_no_one_here:\"{nv:char:say:true}, '{show:text},' but no one notices.\",\n  say_no_response: \"No one seems interested in what {nv:char:say}.\",\n  say_no_response_full: \"{nv:char:say:true}, '{show:text},' but no one seem interested.\",\n  say_something:\"{nv:char:say:true}, '{show:text}.'\",\n\n  // If the player does SPEAK TO MARY and Mary has some topics, this will be the menu title.\n  speak_to_menu_title:function(char) {\n    return \"Talk to \" + lang.getName(char, {article:DEFINITE}) + \" about:\";\n  },\n  // If the player does TELL MARY ABOUT HOUSE this will appear before the response.\n  tell_about_intro:function(char, text1, text2) {\n    return \"{nv:char:tell:true} \" + lang.getName(char, {article:DEFINITE}) + \" \" + text2 + \" \" + text1 + \".\";\n  },\n  // If the player does ASK MARY ABOUT HOUSE this will appear before the response.\n  ask_about_intro:function(char, text1, text2) {\n    return \"{nv:char:ask:true} \" + lang.getName(char, {article:DEFINITE}) + \" \" + text2 + \" \" + text1 + \".\";\n  },\n  // If the player does TALK TO MARY ABOUT HOUSE this will appear before the response.\n  talk_about_intro:function(char, text1, text2) {\n    return \"{nv:char:talk:true} to \" + lang.getName(char, {article:DEFINITE}) + \" \" + text2 + \" \" + text1 + \".\";\n  },\n\n\n\n\n  // Use when the NPC leaves a room; will give a message if the player can observe it\n  npc_leaving_msg:function(npc, exit) {\n    let flag = npc.inSight(exit.origin)\n    if (!flag) return\n    if (exit.npcLeaveMsg) { return exit.npcLeaveMsg(npc) }\n    let s = typeof flag === 'string' ? flag + \" {nv:npc:leave}\" : \"{nv:npc:leave:true}\"\n    s += \" {nm:room:the}, heading {show:dir}.\"\n    msg(s, {room:exit.origin, npc:npc, dir:exit.dir})\n  },\n\n  // the NPC has already been moved, so npc.loc is the destination\n  npc_entering_msg:function(npc, exit) {\n    let flag = npc.inSight(w[exit.name])\n    if (!flag) return\n    if (exit.npcEnterMsg) { return exit.npcEnterMsg(npc) }\n    let s = typeof flag === 'string' ? flag + \" {nv:npc:enter}\" : \"{nv:npc:enter:true}\"\n    s += \" {nm:room:the} from {show:dir}.\"\n    msg(s, {room:w[exit.name], npc:npc, dir:exit.reverseNice()})\n  },\n\n  //----------------------------------------------------------------------------------------------\n  // Meta-command responses\n\n\n  // Save/load messages\n\n  sl_dir_headings:['Filename', 'Game', 'Ver', 'Timestamp', 'Comment'],\n  sl_dir_msg:\"Ver is the version of the game that was being played when saved. Loading a save game from a different version may or may not work. You can delete a file with the DEL command. Type SAVE for general instructions on saving and loading.\",\n  sl_no_filename:\"Trying to save with no filename.\",\n  sl_saved:\"Saved file \\\"{filename}\\\" {if:toFile:to file:to LocalStorage}.\",\n  sl_already_exists:\"File already exists. To overwrite an existing file, use SAVE [filename] OVERWRITE or SAVE [filename] OW.\",\n  sl_file_not_found:\"Load failed: File not found.\",\n  sl_deleted:\"Deleted.\",\n  sl_file_loaded:\"Loaded file \\\"{filename}\\\"\",\n  sl_bad_format:\"Improperly formatted file. Looks like this might be for a game called \\\"{show:title}\\\"?\",\n\n\n  // Achievements\n\n  ach_none_yet:\"No achievements yet!\",\n  ach_list_intro:\"You got {if:count:1:this single, solitary achievement:these achievements}!\",\n  ach_list_item:\"{show:text} ({date:date})\",\n  ach_got_one:\"You got an achievement!|{show:text}\",\n\n\n  spoken_on:\"Game mode is now 'spoken'. Type INTRO to hear the introductory text.\",\n  spoken_off:\"Game mode is now 'unspoken'.\",\n  mode_brief:\"Game mode is now 'brief'; no room descriptions (except with LOOK).\",\n  mode_terse:\"Game mode is now 'terse'; room descriptions only shown on first entering and with LOOK.\",\n  mode_verbose:\"Game mode is now 'verbose'; room descriptions shown every time you enter a room.\",\n  mode_silent_on:\"Game is now in silent mode.\",\n  mode_silent_off:\"Silent mode off.\",\n  transcript_on:\"Transcript is now on.\",\n  transcript_off:\"Transcript is now off.\",\n  transcript_cleared:\"Transcript cleared.\",\n  transcript_none:\"Cannot show transcript, nothing has been recorded.\",\n  transcript_already_on:\"Transcript is already turned on.\",\n  transcript_already_off:\"Transcript is already turned off.\",\n  transcript_finish:\"To see the transcript, click {cmd:SCRIPT SHOW:here}.\",\n  finish_options:\"You might like to {cmd:UNFINISH THEN UNDO:UNDO} your last action, or {cmd:UNFINISH THEN RESTART:RESTART} (and perhaps load a saved game).\",\n  new_tab_failed:\"I am unable to create a new tab. This is probably because your browser is blocking me! There may be a banner across the top of the screen where you can give permission. You will need to do the command again.\",\n  undo_disabled:\"Sorry, UNDO is not enabled in this game.\",\n  undo_not_available:\"There are no saved game-states to UNDO back to.\",\n  undo_done:\"Undoing...\",\n  again_not_available:\"There are no previous commands to repeat.\",\n  scores_not_implemented:'Scores are not a part of this game.',\n  restart_are_you_sure:'Do you really want to restart the game? {b:[Y/N]}',\n  restart_no:'Restart cancelled',\n  yes_regex:/^(y|yes)$/i,\n\n\n\n\n  helloScript:function() {\n    metamsg(\"Hi!\")\n    metamsg(\"If you are wondering what to do, typing HELP will give you a quick guide at how to get going. In fact, we can do that now...\")\n    metamsg(\">HELP\")\n    wait()\n    return lang.helpScript()\n  },\n\n  helpScript:function() {\n    if (settings.textInput) {\n      metamsg(\"Type commands at the prompt to interact with the world.\");\n      metamsg(\"{b:Movement:} To move, use the eight compass directions (or just {class:help-eg:N}, {class:help-eg:NE}, etc.). When \\\"Num Lock\\\" is on, you can use the number pad for all eight compass directions. Also try - and + for {class:help-eg:UP} and {class:help-eg:DOWN}, / and * for {class:help-eg:IN} and {class:help-eg:OUT}.\");\n      metamsg(\"{b:Other commands:} You can also {class:help-eg:LOOK} (or just {class:help-eg:L} or 5 on the number pad), {class:help-eg:HELP} (or {class:help-eg:?}) or {class:help-eg:WAIT} (or {class:help-eg:Z} or the dot on the number pad). Other commands are generally of the form {class:help-eg:GET HAT} or {class:help-eg:PUT THE BLUE TEAPOT IN THE ANCIENT CHEST}. Experiment and see what you can do!\");\n      metamsg(\"{b:Using items: }You can use {class:help-eg:ALL} and {class:help-eg:ALL BUT} with some commands, for example {class:help-eg:TAKE ALL}, and {class:help-eg:PUT ALL BUT SWORD IN SACK}. You can also use pronouns, so {class:help-eg:LOOK AT MARY}, then {class:help-eg:TALK TO HER}. The pronoun will refer to the last subject in the last successful command, so after {class:help-eg:PUT HAT AND FUNNY STICK IN THE DRAWER}, '{class:help-eg:IT}' will refer to the funny stick (the hat and the stick are subjects of the sentence, the drawer was the object).\");\n      metamsg(\"{b:Characters: }If you come across another character, you can ask him or her to do something. Try things like {class:help-eg:MARY,PUT THE HAT IN THE BOX}, or {class:help-eg:TELL MARY TO GET ALL BUT THE KNIFE}. Depending on the game you may be able to {class:help-eg:TALK TO} a character, to {class:help-eg:ASK} or {class:help-eg:TELL} a character {class:help-eg:ABOUT} a topic, or just {class:help-eg:SAY} something and they will respond..\");\n      metamsg(\"{b:Meta-commands:} Type {class:help-eg:ABOUT} to find out about the author, {class:help-eg:SCRIPT} to learn about transcripts or {class:help-eg:SAVE} to learn about saving games. Use {class:help-eg:WARNINGS} to see any applicable sex, violence or trigger warnings.\")\n      let s = \"You can also use {class:help-eg:BRIEF/TERSE/VERBOSE} to control room descriptions. Use {class:help-eg:SILENT} to toggle sounds and music (if implemented).\"\n      if (typeof map !== \"undefined\") s += \" Use {class:help-eg:MAP} to toggle/show the map.\"\n      if (typeof imagePane !== \"undefined\") s += \" Use {class:help-eg:IMAGES} to toggle/show the image pane.\"\n      metamsg(s)\n      metamsg(\"{b:Accessibility:} Type {class:help-eg:DARK} to toggle dark mode or {class:help-eg:SPOKEN} to toggle the text being read out. Use {class:help-eg:FONT} to toggle replacing all the fonts the author carefully chose to a standard sans-serif font. Use {class:help-eg:SCROLL} to toggle whether the text automatically scrolling.\")\n      metamsg(\"{b:Mobile:} If you are on a mobile phone, type {class:help-eg:NARROW} to reduce the width of the text. Type it again to reduce it even more, and a third time to go back to standard width.\")\n      metamsg(\"{b:Shortcuts:} You can often just type the first few characters of an item's name and Quest will guess what you mean.  If fact, if you are in a room with Brian, who is holding a ball, and a box, Quest should be able to work out that {class:help-eg:B,PUT B IN B} mean you want Brian to put the ball in the box.\")\n      metamsg(\"You can use the up and down arrows to scroll back though your previous typed commands - especially useful if you realise you spelled something wrong. If you do not have arrow keys, use {class:help-eg:OOPS} to retrieve the last typed command so you can edit it. Use {class:help-eg:AGAIN} or just {class:help-eg:G} to repeat the last typed command.\")\n      metamsg(\"See also {link:here:https://github.com/ThePix/QuestJS/wiki/How-To-Play} for more details, which will open in a new tab.\")\n    }\n    if (settings.panes !== \"none\") {\n      if (settings.inventoryPane) {\n        metamsg(\"{b:User Interface:} To interact with an object, click on its name in the side pane, and a set of possible actions will appear under it. Click on the appropriate action.\")\n      }\n      if (settings.compassPane) {\n        if (settings.useCompassIcons) {\n          metamsg(\"You can also use the compass rose at the top to move around. Click the eye symbol, &#128065;, to look at you current location, the clock symbol to wait or &#128712; for help.\")\n        }\n        else {\n          metamsg(\"You can also use the compass rose at the top to move around. Click 'Lk' to look at you current location, 'Z' to wait or '?' for help.\")\n        }\n      }\n      if (settings.collapsibleSidePanes) {\n        metamsg(\"You can click on the eye symbol by the pane titles to toggle them being visible. This may be useful if there is a lot there, and entries are disappearing off the bottom of your screen, though you may miss that something is here if you are not careful!\")\n      }\n    }\n    if (settings.additionalHelp !== undefined) {\n      for (const s of settings.additionalHelp) metamsg(s)\n    }\n    return world.SUCCESS_NO_TURNSCRIPTS\n  },\n\n  hintScript:function() {\n    metamsg(\"Sorry, no hints available.\")\n    return world.SUCCESS_NO_TURNSCRIPTS\n  },\n\n  aboutScript:function() {\n    metamsg(\"{i:{show:settings:title} version {show:settings:version}} was written by {show:settings:author} using QuestJS (Quest 6) version {show:settings:questVersion}.\", {settings:settings})\n    if (settings.ifdb) metamsg(\"IFDB number: \" + settings.ifdb)\n    if (settings.thanks && settings.thanks.length > 0) {\n      metamsg(\"{i:Thanks to:} \" + formatList(settings.thanks, {lastSep:lang.list_and}) + \".\")\n    }\n    if (settings.additionalAbout !== undefined) {\n      for (const key in settings.additionalAbout) metamsg('{i:' + key + ':} ' + settings.additionalAbout[key])\n    }\n    if (settings.ifid) metamsg(\"{i:IFDB number:} \" + settings.ifid)\n    return world.SUCCESS_NO_TURNSCRIPTS\n  },\n\n  warningsScript:function() {\n    switch (typeof settings.warnings) {\n      case 'undefined' : metamsg('No warning have been set for this game.'); break;\n      case 'string' : metamsg(settings.warnings); break;\n      default: for (const el of settings.warnings) metamsg(el)\n    }\n    return world.SUCCESS_NO_TURNSCRIPTS;\n  },\n\n  saveLoadScript:function() {\n    if (!settings.localStorageDisabled) {\n      metamsg(\"QuestJS offers players two ways to save your progress - to LocalStorage or to file.\")\n\n      metamsg(\"{b:Saving To LocalStorage}\")\n      metamsg(\"LocalStorage is a part of your computer the browser has set aside; this is the easier way to save.\")\n      metamsg(\"Note, however, that if you clear your browsing data (or have your browser set to do so automatically when the browser is closed) you will lose your saved games. There is also a limit to how much can be saved to LocalStorage, and if this is a big game, you may not be allowed to save to LocalStorage.\")\n      metamsg(\"To save your progress to LocalStorage, type {class:help-eg:SAVE [filename]}. By default, if you have already saved the game, you will not be permitted to save with the same filename, to prevent you accidentally saving when you meant to load. However, you can overwrite a file with the same name by using {class:help-eg:SAVE [filename] OVERWRITE} or just {class:help-eg:SAVE [filename] OW}.\");\n      metamsg(\"To load your game, refresh/reload this page in your browser, then type {class:help-eg:LOAD [filename]}.\");\n      metamsg(\"To see a list of all your QuestJS save games, type {class:help-eg:DIR} or {class:help-eg:LS}. You can delete a saved file with {class:help-eg:DELETE [filename]} or {class:help-eg:DEL [filename]}.\")\n\n      metamsg(\"{b:Saving To File}\")\n      metamsg(\"Alternatively you can save the game as a file on your computer. It is a little more hassle, but probably more reliable.\")\n    }\n    metamsg(\"To save your progress to file, type {class:help-eg:FSAVE [filename]}. The file will be saved to wherever downloaded files get saved on your computer. If there is already a file with that name, the browser will probably append a number to the name.\");\n    metamsg(\"To load your game, refresh/reload this page in your browser, then type {class:help-eg:FLOAD}. A dialog will open up, allowing you to navigate to the downloads folder and select your file.\")\n    metamsg(\"There is no built-in facility to list or delete games saved as files, though you can delete through your normal file manager.\")\n\n    return world.SUCCESS_NO_TURNSCRIPTS;\n  },\n\n\n  hintSheet:'Hint Sheet',\n  hintSheetIntro:\"To use this hint sheet, start to read through the list of questions to see if there is one dealing with the place where you're stuck in the game. To decode a hint, substitute the numbers in the hint for the numbered words in the 'dictionary' at the bottom of the hint sheet. <i>To get back to your game, just go to its tab.</i>\",\n  // linkHintInvisiClues:\"Hints can be found on {link:this page:\" + folder + \"/hints.html}, in the form of InvisiClues, so you can avoid seeing spoilers you do want to see. The page will open in a new tab, so will not affect your playing of the game.\",\n\n\n  transcriptScript:function() {\n    metamsg(\"The TRANSCRIPT or SCRIPT commands can be used to handle recording the input and output. This can be very useful when testing a game, as the author can go back through it and see exactly what happened, and how the user got there.\")\n    metamsg(\"Use SCRIPT ON to turn on recording and SCRIPT OFF to turn it off. To clear the stored data, use SCRIPT CLEAR. To clear the old data and turn recording on in one step, use SCRIPT START.\")\n    metamsg(\"Use SCRIPT SHOW to display it - it will appear in a new tab; you will not lose your place in the game. Some browsers (Firefox especially) may block the new tab, but will probably give the option to allow it in a banner at the top. You will probably need to do the command again.\")\n    metamsg(\"You can add a comment to the transcript by starting your text with an asterisk, {code:*}, or semi-colon, {code:;}, - Quest will record it, but otherwise just ignore it.\")\n    metamsg(\"Everything gets saved to \\\"LocalStorage\\\", so will be saved between sessions. If you complete the game the text input will disappear, however if you have a transcript recording, a link will be available to access it.\");\n    metamsg(\"Transcript is currently: \" + (io.transcript ? 'on' : 'off'))\n    return world.SUCCESS_NO_TURNSCRIPTS;\n  },\n\n  transcriptTitle:function() {\n    let html = ''\n    html += '<h2>QuestJS Transcript for \"'\n    html += settings.title + '\" (version ' + settings.version\n    html += ')</h2>'\n    html += '<p><a onclick=\"document.download()\" style=\"cursor:pointer;border:black solid 1px;border-radius:5px;background:silver;line-height:1em\">Click here</a> to save this file to your downloads folder as \"transcript.html\".</p>'\n    html += '<hr/>'\n    return html\n  },\n  transcriptStart:function() {\n    const now = new Date()\n    return '<p><i>Transcript started at ' + now.toLocaleTimeString() + ' on ' + now.toDateString() + '</i></p>'\n  },\n  transcriptEnd:function() {\n    const now = new Date()\n    return '<p><i>Transcript ended at ' + now.toLocaleTimeString() + ' on ' + now.toDateString() + '</i></p>'\n  },\n\n\n  topicsScript:function() {\n    metamsg(\"Use TOPICS FOR [name] to see a list of topic suggestions to ask a character about (if implemented in this game).\");\n    return world.SUCCESS_NO_TURNSCRIPTS;\n  },\n\n  betaTestIntro:function() {\n    metamsg(\"This version is for beta-testing (\" + settings.version + \"); the browser reports that it is running on: \" + navigator.userAgent)\n    if (settings.textInput) {\n      metamsg(\"A transcript will be automatically recorded. When you finish, do Ctrl-Enter or type SCRIPT SHOW to open the transcript in a new tab, or click the link if you reach the end of the game; it can then be saved (you should see a save button at the top) and attached to an e-mail. Alternatively, copy-and-pasted into an e-mail.\")\n      metamsg(\"You can add your own comments to the transcript by starting a command with *.\")\n    }\n    else {\n      metamsg(\"A transcript will be automatically recorded. As this game has no text input, you will need to access the transcript through the developer tools. Press F12 to show the tools, and click on the \\\"Console\\\" tab. Type <code>io.scriptShow()</code> and press return. the transcript should appear in a new tab.\")\n    }\n    metamsg(\"If you have not already done so, I recommend checking to ensure you can see the transcript before progressing too far though the game.\")\n    metamsg(\"PLEASE NOTE: Transcripts and save games are saved in LocalStorage; if you have this set to be deleted when you close your browser, you will lose all progress!\")\n    saveLoad.transcriptStart()\n  },\n\n  game_over_html:'<p>G<br/>A<br/>M<br/>E<br/>/<br/>O<br/>V<br/>E<br/>R</p>',\n\n\n\n\n  //----------------------------------------------------------------------------------------------\n  //  Language Data\n\n  // Misc\n\n  list_and:\"and\",\n  list_nothing:\"nothing\",\n  list_or:\"or\",\n  list_nowhere:\"nowhere\",\n  never_mind:\"Never mind.\",\n  default_description:\"It's just scenery.\",\n  click_to_continue:\"Click to continue...\",\n  buy:\"Buy\", // used in the command link in the purchase table\n  buy_headings:[\"Item\", \"Cost\", \"\"],\n  current_money:\"Current money\",\n  inside:\"inside\",\n  on_top:\"on top\",\n  carrying:\"carrying\",\n\n\n  command_split_regex:/\\.| then |, then |,then |, and then |,and then /i,  // case insenstive as used early\n  article_filter_regex:/^(?:the |an |a )?(.+)$/,\n  joiner_regex:/\\band\\b|\\, ?and\\b|\\,/,\n  all_regex:/^(all|everything)$/,\n  all_exclude_regex:/^((all|everything) (but|bar|except)\\b)/,\n  go_pre_regex:\"go to |goto |go |head |\",\n\n  yesNo:['Yes', 'No'],\n  tp_false:'false',\n  tp_true:'true',\n\n\n  // Use this to stop commands getting saved to the walkthrough - note the space at the end\n  noWalkthroughRegex:/^(script|transcript) /,\n\n\n  //----------------------------------------------------------------------------------------------\n  // Language constructs\n\n  pronouns:{\n    thirdperson:{subjective:\"it\", objective:\"it\", possessive: \"its\", possAdj: \"its\", reflexive:\"itself\"},\n    massnoun:{subjective:\"it\", objective:\"it\", possessive: \"its\", possAdj: \"its\", reflexive:\"itself\"},\n    male:{subjective:\"he\", objective:\"him\", possessive: \"his\", possAdj: \"his\", reflexive:\"himself\"},\n    female:{subjective:\"she\", objective:\"her\", possessive: \"hers\", possAdj: \"her\", reflexive:\"herself\"},\n    nonbinary:{subjective:\"they\", objective:\"them\", possessive: \"theirs\", possAdj: \"their\", reflexive:\"themselves\"},\n    plural:{subjective:\"they\", objective:\"them\", possessive: \"theirs\", possAdj: \"their\", reflexive:\"themselves\"},\n    firstperson:{subjective:\"I\", objective:\"me\", possessive: \"mine\", possAdj: \"my\", reflexive:\"myself\"},\n    secondperson:{subjective:\"you\", objective:\"you\", possessive: \"yours\", possAdj: \"your\", reflexive:\"yourself\"},\n  },\n\n\n  // Display verbs used in the side panel\n  verbs:{\n    examine:\"Examine\",\n    use:\"Use\",\n    take:\"Take\",\n    drop:\"Drop\",\n    open:\"Open\",\n    close:\"Close\",\n    switchon:\"Switch on\",\n    switchoff:\"Switch off\",\n    wear:\"Wear\",\n    remove:\"Remove\",\n    lookat:\"Look at\",\n    talkto:\"Talk to\",\n    eat:\"Eat\",\n    drink:\"Drink\",\n    read:\"Read\",\n    push:\"Push\",\n    equip:\"Equip\",\n    unequip:\"Unequip\",\n    attack:\"Attack\",\n    sitOn:\"Sit on\",\n    standOn:\"Stand on\",\n    reclineOn:\"Lie on\",\n    getOff:\"Get off\",\n    fill:\"Fill\",\n    empty:\"Empty\",\n    turn:\"Turn\",\n  },\n\n  // Flag the state of an item in a list\n  invModifiers:{\n    worn:\"worn\",\n    open:\"open\",\n    equipped:\"equipped\",\n    dead:\"dead\",\n  },\n\n\n  // Change the abbrev values to suit your game (or language)\n  // You may want to do that in settings, which is loaded first\n  exit_list:[\n    {name:'northwest', abbrev:'NW', niceDir:\"the northwest\", type:'compass', key:103, x:-1 ,y:1, z:0, opp:'southeast', symbol:'fa-arrow-left', rotate:45},\n    {name:'north', abbrev:'N', niceDir:\"the north\", type:'compass', key:104, x:0 ,y:1, z:0, opp:'south', symbol:'fa-arrow-up'},\n    {name:'northeast', abbrev:'NE', niceDir:\"the northeast\", type:'compass', key:105, x:1 ,y:1, z:0, opp:'southwest', symbol:'fa-arrow-up', rotate:45},\n    {name:'in', abbrev:'In', alt:'enter', niceDir:\"inside\", type:'inout', key:111, opp:'out', symbol:'fa-sign-in-alt'},\n    {name:'up', abbrev:'U', niceDir:\"above\", type:'vertical', key:109, x:0 ,y:0, z:1, opp:'down', symbol:'fa-arrow-up'},\n\n    {name:'west', abbrev:'W', niceDir:\"the west\", type:'compass', key:100, x:-1 ,y:0, z:0, opp:'east', symbol:'fa-arrow-left'},\n    {name:'Look', abbrev:'L', type:'nocmd', key:101, symbol:'fa-eye'},\n    {name:'east', abbrev:'E', niceDir:\"the east\", type:'compass', key:102, x:1 ,y:0, z:0, opp:'west', symbol:'fa-arrow-right'},\n    {name:'out', abbrev:'Out', alt:'exit|o|leave', niceDir:\"outside\", type:'inout', key:106,opp:'in', symbol:'fa-sign-out-alt'},\n    {name:'down', abbrev:'Dn', alt:'d', niceDir:\"below\", type:'vertical', key:107, x:0 ,y:0, z:-1, opp:'up', symbol:'fa-arrow-down'},\n\n    {name:'southwest', abbrev:'SW', niceDir:\"the southwest\", type:'compass', key:97, x:-1 ,y:-1, z:0, opp:'northeast', symbol:'fa-arrow-down', rotate:45},\n    {name:'south', abbrev:'S', niceDir:\"the south\", type:'compass', key:98, x:0 ,y:-1, z:0, opp:'north', symbol:'fa-arrow-down'},\n    {name:'southeast', abbrev:'SE', niceDir:\"the southeast\", type:'compass', key:99, x:1 ,y:-1, z:0, opp:'northwest', symbol:'fa-arrow-right', rotate:45},\n    {name:'Wait', abbrev:'Z', type:'nocmd', key:110, symbol:'fa-clock'},\n    {name:'Help', abbrev:'?', type:'nocmd', symbol:'fa-info'},\n  ],\n\n  numberUnits:\"zero;one;two;three;four;five;six;seven;eight;nine;ten;eleven;twelve;thirteen;fourteen;fifteen;sixteen;seventeen;eighteen;nineteen;twenty\".split(\";\"),\n  numberTens:\"twenty;thirty;forty;fifty;sixty;seventy;eighty;ninety\".split(\";\"),\n\n  ordinalReplacements:[\n    {regex:/one$/, replace:\"first\"},\n    {regex:/two$/, replace:\"second\"},\n    {regex:/three$/, replace:\"third\"},\n    {regex:/five$/, replace:\"fifth\"},\n    {regex:/eight$/, replace:\"eighth\"},\n    {regex:/nine$/, replace:\"ninth\"},\n    {regex:/twelve$/, replace:\"twelfth\"},\n    {regex:/y$/, replace:\"ieth\"},\n  ],\n\n\n\n  conjugations:{\n    i:[\n      { name:\"be\", value:\"am\"},\n      { name:\"'be\", value:\"'m\"},\n      { name:\"were\", value:\"was\"},  // Used in present tense for, eg \"I was going to do that\"\n    ],\n    you:[\n      { name:\"be\", value:\"are\"},\n      { name:\"'be\", value:\"'re\"},\n    ],\n    we:[\n      { name:\"be\", value:\"are\"},\n      { name:\"'be\", value:\"'re\"},\n    ],\n    they:[\n      { name:\"be\", value:\"are\"},\n      { name:\"'be\", value:\"'re\"},\n    ],\n    it:[\n      { name:\"be\", value:\"is\"},\n      { name:\"were\", value:\"was\"},\n      { name:\"have\", value:\"has\"},\n      { name:\"can\", value:\"can\"},\n      { name:\"will\", value:\"will\"},\n      { name:\"mould\", value:\"moulds\"},\n      { name:\"*ould\", value:\"ould\"},\n      { name:\"must\", value:\"must\"},\n      { name:\"don't\", value:\"doesn't\"},\n      { name:\"can't\", value:\"can't\"},\n      { name:\"won't\", value:\"won't\"},\n      { name:\"cannot\", value:\"cannot\"},\n      { name:\"@n't\", value:\"n't\"},\n      { name:\"'ve\", value:\"'s\"},\n      { name:\"'be\", value:\"'s\"},\n      { name:\"'ll\", value:\"'ll\"},\n      { name:\"*ay\", value:\"ays\"},\n      { name:\"*uy\", value:\"uys\"},\n      { name:\"*oy\", value:\"oys\"},\n      { name:\"*ey\", value:\"eys\"},\n      { name:\"*y\", value:\"ies\"},\n      { name:\"*ss\", value:\"sses\"},\n      { name:\"*s\", value:\"sses\"},\n      { name:\"*sh\", value:\"shes\"},\n      { name:\"*ch\", value:\"ches\"},\n      { name:\"*o\", value:\"oes\"},\n      { name:\"*x\", value:\"xes\"},\n      { name:\"*z\", value:\"zes\"},\n      { name:\"*\", value:\"s\"},\n    ],\n  },\n\n  contentsForData:{\n    surface:{prefix:'with ', suffix:' on it'},\n    container:{prefix:'containing ', suffix:''},\n  },\n\n\n  //----------------------------------------------------------------------------------------------\n  //                                   LANGUAGE FUNCTIONS\n\n//@DOC\n// ## Language Functions\n//@UNDOC\n\n\n  //@DOC\n  // Returns \"the \" if appropriate for this item.\n  // If the item has 'defArticle' it returns that; if it has a proper name, returns an empty string.\n  addDefiniteArticle:function(item, options) {\n    return lang.addArticle(item, DEFINITE, options)\n  },\n\n  //@DOC\n  // Returns \"a \" or \"an \" if appropriate for this item.\n  // If the item has 'indefArticle' it returns that; if it has a proper name, returns an empty string.\n  // If it starts with a vowel, it returns \"an \", otherwise \"a \".\n  addIndefiniteArticle:function(item, options) {\n    return lang.addArticle(item, INDEFINITE, options)\n  },\n\n  addArticle:function(item, type, options = {}){\n    if (type === 'the') type = DEFINITE\n    if (type === 'a') type = INDEFINITE\n    if (!type || (type !== DEFINITE && type !== INDEFINITE)) return\n\n    // owned, so handle differently\n    // test if player exists yet in case this is used during item creation\n    if (player() && item.owner === player().name) return player().pronouns.possAdj + \" \"\n    if (typeof options.possAdj === 'string') {\n      if (!w[options.possAdj]) {\n        throw \"Oh dear... I am looking to create a possessive in lang.addArticle (probably from lang.getName or formatList), and I cannot find \" + options.possAdj + \". This will not end well.\"\n      }\n      options.possAdj = w[options.possAdj]\n    }\n    if (options.possAdj === true) {\n      options.possAdj = item.owner ? w[item.owner] : undefined\n    }\n    if (item.owner && options.possAdj && options.possAdj === w[item.owner]) {\n      return options.possAdj.pronouns.possAdj + \" \"\n    }\n    // If ignorePossessive is true, just skip this\n    // If it is 'noLink',\n    if (item.owner && options.ignorePossessive !== true) {\n      const suboptions = {\n        possessive:true,\n        noLink:options.ignorePossessive === 'noLink'\n      }\n      return lang.getName(w[item.owner], suboptions) + \" \"\n    }\n\n    // handle \"the\"\n    if (type === DEFINITE) {\n      if (item.defArticle) return item.defArticle + \" \"\n      return item.properNoun ? \"\" : \"the \"\n    }\n\n    // handle \"a\"\n    if (item.indefArticle) return item.indefArticle + \" \"\n    if (item.properNoun) return \"\"\n    if (item.pronouns === lang.pronouns.plural) return \"some \"\n    if (item.pronouns === lang.pronouns.massnoun) return \"some \"\n    if (/^[aeiou]/i.test(item.alias)) return \"an \"\n    return \"a \"\n  },\n\n  getName:function(item, options) {\n    if (!options) options = {}\n    if (!item.alias) item.alias = item.name\n    let s = ''\n    // The count needs to be an item specific attribute because there could be several items in a list\n    // and we need to be clear which item the count belongs to\n    let count = options[item.name + '_count'] ? options[item.name + '_count'] : false\n    // Or we can set count_this to an attribute, and use that to get the number\n    // processText(\"Mandy watches as {nv:item:grow:false:count_this}.\", {item:w.grown_tamarind_tree, count_this:'seedsPlanted'})\n    if (options.count_this) count = item[options.count_this]\n    // Or use suppressCount if we do not want the number, but do want it plural when it should\n    if (!count && options.suppressCount) count = item[options.suppressCount]\n\n    // Or if this is a countable, and loc is set, get the count from that location\n    if (!count && options.loc && item.countable) count = item.countAtLoc(options.loc)\n\n    if (item.getDisplayName) {\n      options.count = count\n      s = item.getDisplayName(options)\n    }\n\n    else if (item.pronouns === lang.pronouns.firstperson || item.pronouns === lang.pronouns.secondperson) {\n      s = options.possessive ? item.pronouns.possAdj : item.pronouns.subjective;\n    }\n\n    else {\n      if (count === 'infinity') {\n        s += item.infinity ? item.infinity + ' ' : 'a lot of '\n      }\n      else if (options.article === DEFINITE && options.suppressCount) {\n        s += lang.addDefiniteArticle(item)\n      }\n      else if (!options.suppressCount && count && count > 1) {\n        s += lang.toWords(count) + ' '\n      }\n      else if (options.article === DEFINITE) {\n        s += lang.addDefiniteArticle(item)\n      }\n      else if (options.article === INDEFINITE) {\n        s += lang.addIndefiniteArticle(item, options)\n      }\n      else if (options.article === COUNT) {\n        s += 'one '\n      }\n      if (item.getAdjective) {\n        s += item.getAdjective()\n      }\n      if (!count || count === 1) {\n        s += (options.enhanced && item.enhancedAlias ? item.enhancedAlias : item.alias)\n      }\n      else {\n        s += item.pluralAlias\n      }\n      if (options.possessive) {\n        if (s.endsWith('s')) {\n          s += \"'\"\n        }\n        else {\n          s += \"'s\"\n        }\n      }\n    }\n    if (options.capital) s = sentenceCase(s)\n    if (settings.nameTransformer) s = settings.nameTransformer(s, item, options)\n    s += util.getNameModifiers(item, options)\n    return s\n  },\n\n\n  //@DOC\n  // Returns the given number in words, so 19 would be returned as 'nineteen'.\n  // Numbers uner -2000 and over 2000 are returned as a string of digits,\n  // so 2001 is returned as '2001'.\n  toWordsMax:10000,\n  toWordsMillions:['', ' thousand', ' million', ' billion', ' trillion', ' quadrillion', ' quintillion', ' sextillion', 's eptillion', ' octillion', ' nonillion', ' decillion', ' undecillion', ' duodecillion'],\n\n  toWords:function(number, noun) {\n    if (typeof number !== \"number\") return errormsg (\"toWords can only handle numbers\")\n    number = Math.round(number)\n    //if (number < -lang.toWordsMax || number > lang.toWordsMax) return number.toString()\n\n    let negative = false\n    if (number === 0) return noun ? 'zero ' + lang.getPlural(noun) : 'zero'\n    if (number < 0) {\n      negative = true\n      number = -number;\n    }\n\n    const parts = rChunkString(number, 3)\n    let count = 0\n    //let commaFlag = false\n    const result = []\n\n    while (parts.length) {\n      const bit = lang._toWords1000(parts.pop())\n      if (bit !== 'zero') {\n        result.unshift(bit + lang.toWordsMillions[count])\n      }\n      count++\n    }\n    let s = formatList(result, {lastJoiner:'and', doNotSort:true})\n    const md = s.match(/ and /g)\n    if (md && md.length > 1) {\n      const pos = s.lastIndexOf(' and ')\n      s = s.substring(0, pos) + ',' + s.substring(pos)\n    }\n\n\n    if (negative) s = 'minus ' + s\n    if (!noun) return s\n    return s + ' ' + (number === 1 ? noun : lang.getPlural(noun))\n  },\n\n  // For internal use, handles integers from 1 to 999 only\n  _toWords1000:function(number) {\n    let s = ''\n    let hundreds = Math.floor(number / 100);\n    number = number % 100;\n    if (hundreds > 0) {\n      s = s + lang.numberUnits[hundreds] + \" hundred\";\n      if (number > 0) {\n        s = s + \" and \";\n      }\n    }\n\n    if (number < 20) {\n      if (number !== 0 || s === \"\") {\n        s = s + lang.numberUnits[number];\n      }\n    }\n    else {\n      let units = number % 10;\n      let tens = Math.floor(number / 10) % 10;\n      s = s + lang.numberTens[tens - 2];\n      if (units !== 0) {\n        s = s + '-' + lang.numberUnits[units];\n      }\n    }\n    return (s);\n  },\n\n  //@DOC\n  // Returns the given number in words, as is conventionally said for a year,\n  // so 1924 with return \"nineteen twenty-three\".\n  // Throws an error if not a number and rounds to the nearest whole number.\n  // Does not properly handle zero - there was no year zero\n  toYear:function(number) {\n    if (typeof number !== \"number\") {\n      errormsg (\"toYear can only handle numbers\");\n      return number;\n    }\n    number = Math.round(number)\n    let s = \"\"\n    let negative = false\n    if (number < 0) {\n      negative = true\n      number = -number;\n    }\n    if (number < 10000) {\n      let hundreds = Math.floor(number / 100);\n      log(hundreds)\n      number = number % 100;\n      if (hundreds > 0) {\n        s += lang.numberUnits[hundreds]\n        if (number > 0) {\n          s += \" \"\n        }\n      }\n      log(s)\n\n      if (number < 20) {\n        if (number !== 0 || s === \"\") {\n          s = s + lang.numberUnits[number];\n        }\n      }\n      else {\n        let units = number % 10;\n        let tens = Math.floor(number / 10) % 10;\n        s = s + lang.numberTens[tens - 2];\n        if (units !== 0) {\n          s = s + '-' + lang.numberUnits[units];\n        }\n      }\n    }\n    else {\n      s = number.toString();\n    }\n    if (negative) s+= ' BCE'\n    return (s);\n  },\n\n\n\n  //@DOC\n  // Returns the given number in words as the ordinal, so 19 would be returned as 'nineteenth'.\n  // Numbers uner -2000 and over 2000 are returned as a string of digits with 'th' appended,\n  // so 2001 is returned as '2001th'.\n  toOrdinal:function(number) {\n    if (typeof number !== \"number\") {\n      errormsg (\"toOrdinal can only handle numbers\");\n      return number;\n    }\n\n    let s = lang.toWords(number);\n    for (let or of lang.ordinalReplacements) {\n      if (or.regex.test(s)) {\n        return s.replace(or.regex, or.replace);\n      }\n    }\n    return (s + \"th\");\n  },\n\n  convertNumbers:function(s) {\n    for (let i = 0; i < lang.numberUnits.length; i++) {\n      let regex = new RegExp(\"\\\\b\" + lang.numberUnits[i] + \"\\\\b\");\n      if (regex.test(s)) s = s.replace(regex, \"\" + i);\n    }\n    return s;\n  },\n\n  getPlural:function(s) {\n    if (s.match(/o$/)) return s + 'es'\n    if (s.match(/on$/)) return s + 'a'\n    if (s.match(/us$/)) return s.replace(/us$/, 'i')\n    if (s.match(/um$/)) return s.replace(/um$/, 'a')\n    if (s.match(/[aeiou]y$/)) return s + 's'\n    if (s.match(/y$/)) return s.replace(/y$/, 'ies')\n    if (s.match(/sis$/)) return s.replace(/sis$/, 'ses')\n    if (s.match(/(s|ss|sh|ch|z|x)$/)) return s + 'es'\n    return s + 's'\n  },\n\n\n\n\n\n\n\n\n\n\n\n\n\n  // Conjugating\n\n\n\n\n  //@DOC\n  // Returns the verb properly conjugated for the item, so \"go\" with a ball would return\n  // \"goes\", but \"go\" with the player (if using second person pronouns).\n  conjugate:function(item, verb, options = {}) {\n    let gender = item.pronouns.subjective;\n    if (gender === \"he\" || gender === \"she\") { gender = \"it\"; }\n    const arr = lang.conjugations[gender.toLowerCase()];\n\n    if (!arr) {\n      errormsg(\"No conjugations found: conjugations_\" + gender.toLowerCase());\n      return verb;\n    }\n    for (let conj of arr) {\n      if (conj.name === verb) {\n        return conj.value;\n      }\n    }\n\n    for (let conj of arr) {\n      const name = conj.name;\n      const value = conj.value;\n      if (name.startsWith(\"@\") && verb.endsWith(name.substring(1))) {\n        return lang.conjugate (item, verb.substring(0, verb.length - name.length + 1)) + value;\n      }\n      else if (name.startsWith(\"*\") && verb.endsWith(name.substring(1))) {\n          // #todo - Why this comma expression in return?\n        // noinspection CommaExpressionJS\n          return item, verb.substring(0, verb.length - name.length + 1) + value;\n      }\n    }\n    return options.capitalise ? sentenceCase(verb) : verb\n  },\n\n\n\n  //@DOC\n  // Returns the pronoun for the item, followed by the conjugated verb,\n  // so \"go\" with a ball would return \"it goes\", but \"go\" with the player (if using second person pronouns)\n  // would return \"you go\".\n  // The first letter is capitalised if 'capitalise' is true.\n  pronounVerb:function(item, verb, options) {\n    let s = item.pronouns.subjective + \" \" + lang.conjugate (item, verb);\n    s = s.replace(/ +\\'/, \"'\");  // yes this is a hack!\n    return options.capitalise ? sentenceCase(s) : s;\n  },\n\n  pronounVerbForGroup:function(item, verb, options) {\n    let s = item.groupPronouns().subjective + \" \" + lang.conjugate (item.group(), verb);\n    s = s.replace(/ +\\'/, \"'\");  // yes this is a hack!\n    return options.capitalise ? sentenceCase(s) : s;\n  },\n\n  verbPronoun:function(item, verb, options) {\n    let s = lang.conjugate (item, verb) + \" \" + item.pronouns.subjective;\n    s = s.replace(/ +\\'/, \"'\");  // yes this is a hack!\n    return options.capitalise ? sentenceCase(s) : s;\n  },\n\n  //@DOC\n  // Returns the name for the item, followed by the conjugated verb,\n  // so \"go\" with a ball would return \"the ball goes\", but \"go\" with\n  // a some bees would return \"the bees go\". For the player, (if using second person pronouns)\n  // would return the pronoun \"you go\".\n  // The first letter is capitalised if 'capitalise' is true.\n  nounVerb:function(item, verb, options) {\n    if (item === player() && !player().useproperNoun) {\n      return lang.pronounVerb(item, verb, options);\n    }\n    if (options.article === undefined) options.article = DEFINITE\n    let s = lang.getName(item, options) + \" \" + lang.conjugate (item, verb);\n    s = s.replace(/ +\\'/, \"'\");  // yes this is a hack!\n    return options.capitalise ? sentenceCase(s) : s;\n  },\n\n  verbNoun:function(item, verb, options) {\n    if (item === player()) {\n      return lang.pronounVerb(item, verb, options);\n    }\n    if (options.article === undefined) options.article = DEFINITE\n    let s = lang.conjugate (item, verb) + \" \" + lang.getName(item, options);\n    s = s.replace(/ +\\'/, \"'\");  // yes this is a hack!\n    return options.capitalise ? sentenceCase(s) : s;\n  },\n\n}\n\nlang.createVerb = function(name, options = {}) {\n  if (options.words === undefined) options.words = name.toLowerCase()\n  if (options.ing === undefined) options.ing = name + 'ing'\n  if (options.defmsg === undefined) options.defmsg = options.ing + \" {nm:item:the} is not going to achieve much.\"\n  if (options.defmsg === true) options.defmsg = \"{pv:item:'be:true} not something you can do that with.\"\n  new Cmd(name, {\n    regex:new RegExp(\"^(?:\" + options.words + \") (.+)$\"),\n    objects:[\n      {scope:options.held ? parser.isHeld : parser.isHere},\n    ],\n    npcCmd:true,\n    defmsg:options.defmsg\n  })\n}\n\nlang.createVerbWith = function(name, options = {}) {\n  if (options.words === undefined) options.words = name.toLowerCase()\n  if (options.ing === undefined) options.ing = name + 'ing'\n  if (options.defmsg === undefined) options.defmsg = options.ing + \" {nm:item:the} is not going to achieve much.\"\n  if (options.defmsg === true) options.defmsg = \"{pv:item:'be:true} not something you can do that with.\"\n  new Cmd(name + \"With\", {\n    regexes:[\n      new RegExp(\"^(?:\" + options.words + \") (.+) (?:using|with) (.+)$\"),\n      { regex:new RegExp(\"^(?:use|with|using) (.+) to (?:\" + options.words + \") (.+)$\"), mod:{reverse:true}},\n      { regex:new RegExp(\"^(?:use|with|using) (.+) (?:\" + options.words + \") (.+)$\"), mod:{reverse:true}},\n    ],\n    objects:[\n      {scope:options.held ? parser.isHeld : parser.isHere},\n      {scope:parser.isHeld},\n    ],\n    attName:name.toLowerCase(),\n    npcCmd:true,\n    withScript:true,\n    defmsg:options.defmsg\n  })\n}\n\nlang.questions = [\n  { q:'who am i', script:function() { parser.parse('look me'); return world.SUCCESS_NO_TURNSCRIPTS }},\n  { q:'who are (?:u|you)', script:function() { metamsg('Me? I am the parser. I am going to try to understand your commands, and then hopefully the protagonist will act on them in the game world.'); return world.SUCCESS_NO_TURNSCRIPTS }},\n  { q:'who is (?:|the )(?:player|protagonist)', script:function() { metamsg('The protagonist is a character in the game world, but a special one - one that you control directly. He or she is your proxy, acting on your behalf, so if you want to know what he or she is like, try WHO AM I?.'); return world.SUCCESS_NO_TURNSCRIPTS }},\n  { q:'what am i', script:function() { parser.parse('look me'); return world.SUCCESS_NO_TURNSCRIPTS }},\n  { q:'what (?:(?:have i got|do i have)(?:| on me| with me)|am i (?:carry|hold)ing)', script:function() { parser.parse('inv'); return world.SUCCESS_NO_TURNSCRIPTS }},\n  { q:'where am i', script:function() { parser.parse('look'); return world.SUCCESS_NO_TURNSCRIPTS }},\n  { q:'what do i do', script:function() { parser.parse('help'); return world.SUCCESS_NO_TURNSCRIPTS }},\n  { q:'(?:what do i do now|where do i go)', script:function() { parser.parse('hint'); return world.SUCCESS_NO_TURNSCRIPTS }},\n]\n","// noinspection JSDeprecatedSymbols,RegExpSimplifiable\n\n/*\n* FileSaver.js\n* A saveAs() FileSaver implementation.\n*\n* By Eli Grey, http://eligrey.com\n*\n* License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)\n* source  : http://purl.eligrey.com/github/FileSaver.js\n*/\n\n// The one and only way of getting global scope in all environments\n// https://stackoverflow.com/q/3277182/1008999\nconst _global = typeof window === 'object' && window.window === window\n  ? window : typeof self === 'object' && self.self === self\n  ? self : typeof global === 'object' && global.global === global\n  ? global\n  : this\n\nfunction bom (blob, opts) {\n  if (typeof opts === 'undefined') opts = { autoBom: false }\n  else if (typeof opts !== 'object') {\n    console.warn('Deprecated: Expected third argument to be a object')\n    opts = { autoBom: !opts }\n  }\n\n  // prepend BOM for UTF-8 XML and text/* types (including HTML)\n  // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n  if (opts.autoBom && /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n    return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type })\n  }\n  return blob\n}\n\nfunction download (url, name, opts) {\n  let xhr = new XMLHttpRequest()\n  xhr.open('GET', url)\n  xhr.responseType = 'blob'\n  xhr.onload = function () {\n    saveAs(xhr.response, name, opts)\n  }\n  xhr.onerror = function () {\n    console.error('could not download file')\n  }\n  xhr.send()\n}\n\nfunction corsEnabled (url) {\n  let xhr = new XMLHttpRequest()\n  // use sync to avoid popup blocker\n  xhr.open('HEAD', url, false)\n  try {\n    xhr.send()\n  } catch (e) {}\n  return xhr.status >= 200 && xhr.status <= 299\n}\n\n// `a.click()` doesn't work for all browsers (#465)\nfunction click (node) {\n  try {\n    node.dispatchEvent(new MouseEvent('click'))\n  } catch (e) {\n    let evt = document.createEvent('MouseEvents')\n    evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80,\n                          20, false, false, false, false, 0, null)\n    node.dispatchEvent(evt)\n  }\n}\n\n// Detect WebView inside a native macOS app by ruling out all browsers\n// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too\n// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos\nconst isMacOSWebView = _global.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent)\n\nexport const saveAs = _global.saveAs || (\n  // probably in some web worker\n  (typeof window !== 'object' || window !== _global)\n    ? function saveAs () { /* noop */ }\n\n  // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView\n  : ('download' in HTMLAnchorElement.prototype && !isMacOSWebView)\n  ? function saveAs (blob, name, opts) {\n    let URL = _global.URL || _global.webkitURL\n    let a = document.createElement('a')\n    name = name || blob.name || 'download'\n\n    a.download = name\n    a.rel = 'noopener' // tabnabbing\n\n    // TODO: detect chrome extensions & packaged apps\n    // a.target = '_blank'\n\n    if (typeof blob === 'string') {\n      // Support regular links\n      a.href = blob\n      if (a.origin !== location.origin) {\n        corsEnabled(a.href)\n          ? download(blob, name, opts)\n          : click(a, a.target = '_blank')\n      } else {\n        click(a)\n      }\n    } else {\n      // Support blobs\n      a.href = URL.createObjectURL(blob)\n      setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s\n      setTimeout(function () { click(a) }, 0)\n    }\n  }\n\n  // Use msSaveOrOpenBlob as a second approach\n  : 'msSaveOrOpenBlob' in navigator\n  ? function saveAs (blob, name, opts) {\n    name = name || blob.name || 'download'\n\n    if (typeof blob === 'string') {\n      if (corsEnabled(blob)) {\n        download(blob, name, opts)\n      } else {\n        let a = document.createElement('a')\n        a.href = blob\n        a.target = '_blank'\n        setTimeout(function () { click(a) })\n      }\n    } else {\n      // noinspection JSUnresolvedFunction\n        navigator.msSaveOrOpenBlob(bom(blob, opts), name)\n    }\n  }\n\n  // Fallback to using FileReader and a popup\n  : function saveAs (blob, name, opts, popup) {\n    // Open a popup immediately do go around popup blocker\n    // Mostly only available on user interaction and the fileReader is async so...\n    popup = popup || open('', '_blank')\n    if (popup) {\n      popup.document.title =\n      popup.document.body.innerText = 'downloading...'\n    }\n\n    if (typeof blob === 'string') return download(blob, name, opts)\n\n    let force = blob.type === 'application/octet-stream'\n    // noinspection JSCheckFunctionSignatures\n                  let isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari\n    let isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent)\n\n    if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && typeof FileReader !== 'undefined') {\n      // Safari doesn't allow downloading of blob URLs\n      let reader = new FileReader()\n      reader.onloadend = function () {\n        let url = reader.result\n        url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;')\n        if (popup) { // noinspection JSPrimitiveTypeWrapperUsage\n            popup.location.href = url\n        }\n        else location = url\n        popup = null // reverse-tabnabbing #460\n      }\n      reader.readAsDataURL(blob)\n    } else {\n      let URL = _global.URL || _global.webkitURL\n      let url = URL.createObjectURL(blob)\n      if (popup) popup.location = url\n      else location.href = url\n      popup = null // reverse-tabnabbing #460\n      setTimeout(function () { URL.revokeObjectURL(url) }, 4E4) // 40s\n    }\n  }\n)\n\n_global.saveAs = saveAs.saveAs = saveAs;\n","// noinspection JSDeprecatedSymbols\n\n\"use strict\";\n\nimport {\n    _msg, metamsg, clearScreen, cloneObject, endTurnUI, errormsg, Exit,\n    game, io, lang, saveAs, settings, tp, util, world, w\n} from '../index.js';\n\n// Should all be language neutral\n\n\n/*\n\nThe game state is saved as a name-value pair.\n\nThe value is the game state, with each segment separated by an exclamation mark. The first four segments are the header, the rest are the body. The header consists of the title, version, comment and timestamp. Each segment of the body is an object in the game.\n\nAn object is saved as its name followed by an equals sign followed by either \"Object\" or by \"Clone:\" and the name of the clone's prototype, followed by an equals sign, and then the data. Each datam is separated by a semi-colon. Each datum consists of the name, the type and the value, separated by colons.\n\nIf a datum is an object, and has a name attribute, the name is saved as type qobject.\n\nIf the datam is an array and the first element is a string, it is assumed that all the elements are strings, and it is saved as an array. Other arrays are not saved.\n\nIf the datam is a number, a string or true it is saved as such.\n\nAny other objects or values will not be saved.\n\n\n*/\n\n\nexport const saveLoad = {\n\n  getName:function(filename) {\n    return \"QJS:\" + settings.title + \":\" + filename\n  },\n\n  saveGame:function(filename, overwrite) {\n    if (filename === undefined) {\n      errormsg(lang.sl_no_filename);\n      return false;\n    }\n\n    if (localStorage.getItem(this.getName(filename)) && !overwrite) {\n      metamsg(lang.sl_already_exists)\n      return\n    }\n    const comment = settings.saveComment ? settings.saveComment() : \"-\"\n    const s = saveLoad.saveTheWorld(comment)\n    //console.log(s)\n    localStorage.setItem(this.getName(filename), s)\n    metamsg(lang.sl_saved, {filename:filename, toFile:false})\n    if (settings.afterSave) settings.afterSave(filename)\n    return true;\n  },\n\n  saveGameAsFile:function(filename) {\n    const comment = settings.saveComment ? settings.saveComment() : \"-\"\n    const s = saveLoad.saveTheWorld(comment)\n    const myFile = new File([s], filename+\".q6save\", {type: \"text/plain;charset=utf-8\"})\n    saveAs(myFile)\n    metamsg(lang.sl_saved, {filename:filename, toFile:true})\n    if (settings.afterSave) settings.afterSave(filename, true)\n    return true\n  },\n\n  saveTheWorld:function(comment) {\n    return saveLoad.getSaveHeader(comment) + saveLoad.getSaveBody();\n  },\n\n  getHeader:function(s) {\n    const arr = s.split(\"!\");\n    return { title:saveLoad.decodeString(arr[0]), version:saveLoad.decodeString(arr[1]), comment:saveLoad.decodeString(arr[2]), timestamp:arr[3] };\n  },\n\n  getSaveHeader:function(comment) {\n    const currentdate = new Date();\n    let s = saveLoad.encodeString(settings.title) + \"!\";\n    s += saveLoad.encodeString(settings.version) + \"!\";\n    s += saveLoad.encodeString(comment) + \"!\";\n    s += currentdate.toLocaleString() + \"!\";\n    return s;\n  },\n\n  getSaveBody:function() {\n    const l = [tp.getSaveString(), game.getSaveString(), util.getChangeListenersSaveString()]\n    for (let key in w) {\n      l.push(key + \"=\" + w[key].getSaveString())\n    }\n    return l.join(\"!\")\n  },\n\n\n\n\n\n  // LOAD\n\n  // This function will be attached to #fileDialog as its \"onchange\" event\n  loadGameAsFile:function() {\n\t\tconst fileInput = document.querySelector(\"#fileDialog\")\n\t\tconst fileIn = fileInput.files\n\n\t\tconst reader = new FileReader()\n\t\treader.readAsText(fileIn[0])\n\t\treader.onload = function(){\n\t\t\tsaveLoad.loadGame(fileIn[0].name, reader.result)\n\t\t\tconst el = document.querySelector(\"#fileDialogForm\")\n\t\t\tel.reset()\n\t\t}\n\t\treader.onerror = function(){\n\t\t\tlog(reader.error)\n\t\t}\n  },\n\n  loadGameFromLS:function(filename) {\n    //log(\">\" + filename + \"<\")\n    const contents = localStorage.getItem(this.getName(filename));\n    this.loadGame(filename, contents)\n  },\n\n  loadGame:function(filename, contents) {\n    if (!contents) {\n      metamsg(lang.sl_file_not_found);\n    }\n    else if (!contents.startsWith(settings.title + '!')) {\n      const encodedTitle = contents.substr(0, contents.indexOf('!'));\n      metamsg(lang.sl_bad_format, {title:saveLoad.decodeString(encodedTitle)})\n    }\n    else {\n      saveLoad.loadTheWorld(contents, 4)\n      clearScreen()\n      metamsg(lang.sl_file_loaded, {filename:filename})\n      if (settings.afterLoad) settings.afterLoad(filename)\n      loc().description()\n    }\n  },\n\n\n\n  loadTheWorld:function(s, removeHeader) {\n    const arr = s.split(\"!\");\n    if (removeHeader !== undefined) {\n      arr.splice(0, removeHeader);\n    }\n\n    // Eliminate all clones\n    for (let key in w) {\n      if (w[key].clonePrototype) delete w[key]\n    }\n\n    tp.setLoadString(arr.shift())\n    game.setLoadString(arr.shift())\n    util.setChangeListenersLoadString(arr.shift())\n    for (let el of arr) {\n      this.setLoadString(el);\n    }\n    world.update()\n    endTurnUI(true)\n  },\n\n\n\n  setLoadString:function(s) {\n    const parts = s.split(\"=\");\n    if (parts.length !== 3) {\n      errormsg(\"Bad format in saved data (\" + s + \")\");\n      return;\n    }\n    const name = parts[0];\n    const saveType = parts[1]\n    const arr = parts[2].split(\";\");\n\n    if (saveType.startsWith(\"Clone\")) {\n      const clonePrototype = saveType.split(\":\")[1];\n      if (!w[clonePrototype]) {\n        errormsg(\"Cannot find prototype '\" + clonePrototype + \"'\");\n        return;\n      }\n      const obj = cloneObject(w[clonePrototype]);\n      this.setFromArray(obj, arr);\n      w[obj.name] = obj;\n      obj.afterLoadForTemplate();\n      return\n    }\n\n    if (saveType === \"Object\") {\n      if (!w[name]) {\n        errormsg(\"Cannot find object '\" + name + \"'\");\n        return;\n      }\n      const obj = w[name];\n      this.setFromArray(obj, arr);\n      obj.afterLoadForTemplate();\n      return\n    }\n\n    // todo - wtf hash??\n    errormsg(\"Unknown save type for object '\" + name + \"' (\" + hash.saveType + \")\");\n  },\n\n\n\n\n\n  // UTILs\n\n  decode:function(hash, str) {\n    if (str.length === 0) return false\n    const parts = str.split(\":\")\n    const key = parts[0]\n    const attType = parts[1]\n    const s = parts[2]\n\n    if (attType === \"boolean\") {\n      hash[key] = (s === \"true\")\n    }\n\n    else if (attType === \"number\") {\n      hash[key] = parseFloat(s)\n    }\n\n    else if (attType === \"string\") {\n      hash[key] = saveLoad.decodeString(s)\n    }\n\n    else if (attType === \"array\") {\n      hash[key] = saveLoad.decodeArray(s)\n    }\n\n    else if (attType === \"numberarray\") {\n      hash[key] = saveLoad.decodeNumberArray(s)\n    }\n\n    else if (attType === \"emptyarray\") {\n      hash[key] = []\n    }\n\n    else if (attType === \"emptystring\") {\n      hash[key] = ''\n    }\n\n    else if (attType === \"qobject\") {\n      // this will cause an issue if it points to a clone that has not been done yet !!!\n      hash[key] = w[s]\n    }\n\n    return key\n  },\n\n  encode:function(key, value) {\n    if (value === 0) return key + \":number:0;\"\n    if (value === false) return key + \":boolean:false;\"\n    if (value === '') return key + \":emptystring;\"\n    if (!value) return ''\n    let attType = typeof value;\n    if (Array.isArray(value)) {\n      try {\n        if (value.length === 0) return key + \":emptyarray;\";\n        if (typeof value[0] === 'string') return key + \":array:\" + saveLoad.encodeArray(value) + \";\";\n        if (typeof value[0] === 'number') return key + \":numberarray:\" + saveLoad.encodeNumberArray(value) + \";\";\n        return '';\n      } catch (error) {\n        // Add the name of the attribute to the error message\n        //console.trace()\n        log(value)\n        throw \"Error encountered with attribute \\\"\" + key + \"\\\": \" + error + \". More here: https://github.com/ThePix/QuestJS/wiki/Save-Load#save-errors\"\n      }\n    }\n    if (value instanceof Exit) {\n      return '';\n    }\n    if (attType === \"object\") {\n      if (value.name) return key + \":qobject:\" + value.name + \";\";\n      return '';\n    }\n    if (attType === \"string\") {\n      return key + \":string:\" + saveLoad.encodeString(value) + \";\";\n    }\n    return key + \":\" + attType + \":\" + value + \";\";\n  },\n\n\n  replacements:[\n    { unescaped:':', escaped:'cln'},\n    { unescaped:';', escaped:'scln'},\n    { unescaped:'!', escaped:'exm'},\n    { unescaped:'=', escaped:'eqs'},\n    { unescaped:'~', escaped:'tld'},\n  ],\n\n\n  encodeString:function(s) {\n    for (let d of saveLoad.replacements) {\n      if (typeof s !== 'string') throw \"Found type \\\"\" + (typeof s) + \"\\\" in array - should be only strings.\"\n      s = s.replace(new RegExp(d.unescaped, \"g\"), \"@@@\" + d.escaped + \"@@@\");\n    }\n    return s;\n  },\n\n  decodeString:function(s) {\n    //if (typeof s !== 'string') {\n    //  console.log(\"Expecting a string there, but found this instead (did you add an object to a list rather than its name?):\")\n    //  console.log(s)\n    ///}\n    for (let d of saveLoad.replacements) {\n      s = s.replace(new RegExp(\"@@@\" + d.escaped + \"@@@\", \"g\"), d.unescaped);\n    }\n    return s;\n  },\n\n  encodeArray:function(ary) {\n    return ary.map(el => saveLoad.encodeString(el)).join('~');\n  },\n\n  decodeArray:function(s) {\n    return s.split('~').map(el => saveLoad.decodeString(el));\n  },\n\n  encodeNumberArray:function(ary) {\n    return ary.map(el => {\n      if (typeof el !== 'number') throw \"Found type \\\"\" + (typeof el) + \"\\\" in array - should be only numbers.\"\n      return el.toString()\n    }).join('~');\n  },\n\n  decodeNumberArray:function(s) {\n    return s.split('~').map(el => parseFloat(el));\n  },\n\n  decodeExit:function(s) {\n    return s.split('~').map(el => saveLoad.decodeString(el));\n  },\n\n\n  lsTest:function() {\n    const test = 'test';\n    try {\n        localStorage.setItem(test, test);\n        localStorage.removeItem(test);\n        return true;\n    } catch(e) {\n        return false;\n    }\n  },\n\n\n\n\n  // Other functions\n\n  deleteGame:function(filename) {\n    localStorage.removeItem(this.getName(filename));\n    metamsg(lang.sl_deleted);\n  },\n\n  dirGame:function() {\n    const arr0 = lang.sl_dir_headings.map(el => '<th>' + el + '</th>')\n    if (!settings.saveComment) arr0.pop()\n    let s = arr0.join('')\n    for (let key in localStorage) {\n      if (!key.startsWith('QJS:')) continue\n      const arr1 = key.split(':')\n      const arr2 = localStorage[key].split('!')\n      log(arr2.slice(1, 4))\n      s += \"<tr>\"\n      s += \"<td>\" + arr1[2] + \"</td>\"\n      s += \"<td>\" + arr1[1] + \"</td>\"\n      s += \"<td>\" + arr2[1] + \"</td>\"\n      s += \"<td>\" + arr2[3] + \"</td>\"\n      if (settings.saveComment) s += \"<td>\" + arr2[2] + \"</td>\"\n      s += \"</tr>\"\n    }\n    _msg(s, {}, {cssClass:\"meta\", tag:'table'})\n    metamsg(lang.sl_dir_msg)\n  },\n\n  testExistsGame:function(filename) {\n    const data = localStorage[this.getName(filename)]\n    return data !== undefined\n  },\n\n  getSummary:function(filename) {\n    const data = localStorage[this.getName(filename)]\n    if (!data) return null\n    const arr = data.split('!')\n    return arr.slice(1, 4)\n  },\n\n  setFromArray:function(obj, arr) {\n    const keys = Object.keys(obj).filter(e => !obj.saveLoadExclude(e))\n    for (let el of keys) delete obj[el]\n    for (let el of arr) saveLoad.decode(obj, el)\n  },\n\n\n\n  // ------------------------------------------------------------------------------------------\n  //    TRANSCRIPTS\n  //\n  // Here because it uses localStorage. That said, there are two independant systems, the second\n  // records commands to create a walk-through, and is saved in an array, this.transcriptWalkthrough\n  // because only the author should ever use it.\n\n  transcript:false,  // Set to true when recording\n  transcriptName:\"QJST:\" + settings.title + \":transcript\",\n\n  transcriptStart:function() {\n    this.transcript = true\n    this.transcriptWalkthrough = []\n    metamsg(lang.transcript_on)\n    this.transcriptWrite(lang.transcriptStart())\n  },\n\n  transcriptEnd:function() {\n    this.transcriptWrite(lang.transcriptEnd())\n    this.transcript = false\n    metamsg(lang.transcript_off)\n  },\n\n  transcriptAppend:function(data) {\n    if (!this.transcript) return\n    if (data.cssClass === 'menu') {\n      let previous = this.transcriptWalkthrough.pop()\n      if (previous) {\n        previous = previous.replace(/\\,$/, '').trim()\n        this.transcriptWalkthrough.push('    {cmd:' + previous + ', menu:' + data.n + '},')\n      }\n    }\n    this.transcriptWrite('<p class=\"' + data.cssClass + '\">' + data.text + '</p>')\n  },\n\n  // Used internally to write to the file, appending it to the existing text.\n  transcriptWrite:function(html) {\n    let s = localStorage.getItem(this.transcriptName)\n    if (!s) s = ''\n    s += '\\n\\n' + html\n    localStorage.setItem(this.transcriptName, s)\n  },\n\n  transcriptClear:function(data) {\n    localStorage.removeItem(this.transcriptName)\n    metamsg(lang.transcript_cleared)\n  },\n\n  // Is there a transcript saved?\n  transcriptExists:function(data) {\n    return localStorage.getItem(this.transcriptName) !== undefined\n  },\n\n  transcriptShow:function() {\n    const s = localStorage.getItem(this.transcriptName)\n    if (!s) {\n      metamsg(lang.transcript_none)\n      return false\n    }\n\n    let html = ''\n    html += '<div id=\"main\"><div id=\"inner\"><div id=\"output\">'\n    html += lang.transcriptTitle()\n    html += s\n    html += '</div></div></div>'\n    io.showInTab(html, 'QuestJS Transcript: ' + settings.title)\n    metamsg(lang.done_msg)\n  },\n\n  transcriptWalk:function() {\n    let html = ''\n    html += '<div id=\"main\"><div id=\"inner\"><div id=\"output\">'\n    html += '<br/><h2>Generated QuestJS Walk-through</h2><br/><br/>'\n    html += '<p>Copy-and-paste the code below into code.js. You can quickly run the walk-though with [Ctrl][Enter].</p>'\n    html += '<p>If you already have a walk-through, you will need to just copy-and-paste the right bit - probably all but the first and last lines, and insert just before the curly brace at the end. You may need to rename it too.</p>'\n    html += '<pre>\\n\\n\\nconst walkthroughs = {\\n  c:[\\n'\n    html += this.transcriptWalkthrough.join('\\n')\n    html += '\\n  ],\\n}</pre>'\n    html += '</div></div></div>'\n    io.showInTab(html, 'QuestJS Transcript: ' + settings.title)\n  },\n\n  achievementsKey:'__achievement__list__for__this__game__',\n\n  setAchievement(s) {\n    const achievementsJSON = localStorage.getItem(this.achievementsKey)\n    const achievements = achievementsJSON ? JSON.parse(achievementsJSON) : {}\n\n    if (achievements[s]) return\n\n    achievements[s] = Date.now()\n    _msg(lang.ach_got_one, {text:s, date:achievements[s]}, {cssClass:\"meta achieve\", tag:'p'})\n    localStorage.setItem(this.achievementsKey, JSON.stringify(achievements))\n  },\n\n  listAchievements() {\n    const achievementsJSON = localStorage.getItem(this.achievementsKey)\n    const achievements = achievementsJSON ? JSON.parse(achievementsJSON) : {}\n\n    if (Object.keys(achievements).length === 0) {\n      _msg(lang.ach_none_yet, {}, {cssClass:\"meta achieve\", tag:'p'})\n      return\n    }\n    _msg(lang.ach_list_intro, {count:Object.keys(achievements).length}, {cssClass:\"meta achieve\", tag:'p'})\n    for (const key in achievements) {\n      _msg(lang.ach_list_item, {text:key, date:achievements[key]}, {cssClass:\"meta achieve\", tag:'p'})\n    }\n  },\n\n\n\n  resetAchievements() {\n    localStorage.removeItem(this.achievementsKey)\n  },\n\n}\n","// noinspection UnnecessaryLabelJS\n\n\"use strict\";\n\nimport {\n    INDEFINITE,\n    io,\n    lang,\n    saveLoad,\n    world,\n    w,\n    errormsg,\n    formatList,\n    scopeHereListed,\n    player,\n    loc,\n    settings,\n    sentenceCase,\n    sentenceCaseForHTML,\n    titleCaseForHTML,\n    random,\n    array,\n    displayMoney,\n    util,\n    scopeHereParser, DEFINITE, COUNT\n} from '../index.js';\n\n//@DOC\n// ## The Text Processor Function\n//@UNDOC\n\n//@DOC\n// Returns a string in which all the text processor directives have been resolved, using the optionasl parameters.\n// More details [here(https://github.com/ThePix/QuestJS/wiki/The-Text-Processor).\nexport function processText(str, params) {\n  if (params === undefined) {\n    params = {tpNoParamsPassed:true};\n  }\n  if (typeof str !== \"string\") {\n    str = \"\" + str;\n  }\n  params.tpOriginalString = str;\n  if (params.count) params.item_count = params.count\n  //log(params)\n  if (tp.usedStrings.includes(str)) {\n    params.tpFirstTime = false;\n  }\n  else {\n    tp.usedStrings.push(str);\n    params.tpFirstTime = true;\n  }\n    return tp.processText(str, params);\n}\n\n// Most of the text processors are set up in text.js; these are the language specific ones.\nexport const tp = {\n  text_processors:{},\n  setLoadString:function(s) {\n    const parts = s.split(\"=\");\n    if (parts.length !== 2) return errormsg(\"Bad format in saved data (\" + s + \")\")\n    if (parts[0] !== \"TPUsedStrings\") return errormsg(\"Expected TP to be first\")\n    tp.usedStrings = saveLoad.decodeArray(parts[1])\n  },\n  getSaveString:function() {\n      return \"TPUsedStrings=\" + saveLoad.encodeArray(tp.usedStrings);\n  },\n}\n\ntp.usedStrings = [];\n\ntp.colours = ['#e6194b', '#3cb44b', '#ffe119', '#4363d8', '#f58231', '#911eb4', '#46f0f0', '#f032e6', '#bcf60c', '#fabebe', '#008080', '#e6beff', '#9a6324', '#fffac8', '#800000', '#aaffc3', '#808000', '#ffd8b1', '#000075', '#808080', '#ffffff', '#000000']\n\n// Use this to add you custom text processor\n// Should take a string array as a parameter (the input text,\n// excluding the curly braces, name and colon),\n// and return a string.\ntp.addDirective = function(name, fn) {\n  tp.text_processors[name] = fn;\n};\n\ntp.comparisons = {\n  '=':'if',\n  '==':'if',\n  '!=':'ifNot',\n  '!==':'ifNot',\n  '<>':'ifNot',\n  '<':'ifLessThan',\n  '>':'ifMoreThan',\n  '<=':'ifLessThanOrEqual',\n  '>=':'ifMoreThanOrEqual',\n}\n\ntp.processText = function(str, params) {\n  const s = tp.findFirstToken(str);\n  if (s) {\n    let arr = s.split(\":\");\n    let left = arr.shift();\n    if (typeof tp.text_processors[left] !== \"function\") {\n      if (left.startsWith('if ')) {\n        const data = /if (not |)(\\w+)\\.(\\w+) *([<>=!]{0,3}) *(.*)/.exec(left)\n        if (data[4] === '') {\n          arr.unshift(data[3])\n          arr.unshift(data[2])\n          left = data[1] === 'not ' ? 'ifNot' : 'if'\n        }\n        else {\n          arr.unshift(data[5])\n          arr.unshift(data[3])\n          arr.unshift(data[2])\n          left = tp.comparisons[data[4]]\n        }\n      }\n      else if (left.match(/^(not)?here /)) {\n        const ary = left.split(' ')\n        ary.shift()\n        left = left.startsWith('here') ? 'ifHere' : 'ifNotHere'\n        for (const el of ary.reverse()) arr.unshift(el)\n      }\n      else if (left === \"player\") {\n        arr.unshift(player().name);\n        left = \"show\";\n      }\n      else if (left === \"currentLocation\") {\n        arr.unshift(loc().name);\n        left = \"show\";\n      }\n      else if (w[left]) {\n        arr.unshift(left);\n        left = \"show\";\n      }\n      else if (arr.length === 0) {\n        arr = left.split(\".\");\n        left = \"show\";\n      }\n      else {\n        errormsg(\"Attempting to use unknown text processor directive '\" + left + \"' (\" + params.tpOriginalString + \")\");\n        return str;\n      }\n    }\n    str = str.replace(\"{\" + s + \"}\", tp.text_processors[left](arr, params));\n    str = tp.processText(str, params);\n  }\n  return str\n};\n\n// Find the first token. This is the first to end, so\n// we get nested.\ntp.findFirstToken = function (s) {\n  const end = s.indexOf(\"}\");\n  if (end === -1) { return false; }\n  const start = s.lastIndexOf(\"{\", end);\n  if (start === -1) {\n    errormsg(\"Failed to find starting curly brace in text processor (<i>\" + s + \"</i>)\");\n    return false;\n  }\n  return s.substring(start + 1, end);\n};\n\ntp.text_processors.i = function(arr, params) { return \"<i>\" + arr.join(\":\") + \"</i>\"; };\ntp.text_processors.b = function(arr, params) { return \"<b>\" + arr.join(\":\") + \"</b>\"; };\ntp.text_processors.u = function(arr, params) { return \"<u>\" + arr.join(\":\") + \"</u>\"; };\ntp.text_processors.s = function(arr, params) { return \"<strike>\" + arr.join(\":\") + \"</strike>\"; };\ntp.text_processors.code = function(arr, params) { return \"<code>\" + arr.join(\":\") + \"</code>\"; };\ntp.text_processors.sup = function(arr, params) { return \"<sup>\" + arr.join(\":\") + \"</sup>\"; };\ntp.text_processors.sub = function(arr, params) { return \"<sub>\" + arr.join(\":\") + \"</sub>\"; };\ntp.text_processors.huge = function(arr, params) { return '<span style=\"font-size:2em\">' + arr.join(\":\") + '</span>'; };\ntp.text_processors.big = function(arr, params) { return '<span style=\"font-size:1.5em\">' + arr.join(\":\") + '</span>'; };\ntp.text_processors.small = function(arr, params) { return '<span style=\"font-size:0.8em\">' + arr.join(\":\") + '</span>'; };\ntp.text_processors.tiny = function(arr, params) { return '<span style=\"font-size:0.6em\">' + arr.join(\":\") + '</span>'; };\ntp.text_processors.smallcaps = function(arr, params) { return '<span style=\"font-variant:small-caps\">' + arr.join(\":\") + '</span>'; };\ntp.text_processors.cap = function(arr, params) {\n  return sentenceCaseForHTML(arr.join(\":\"))\n}\ntp.text_processors.title = function(arr, params) {\n  return titleCaseForHTML(arr.join(\":\"))\n}\ntp.text_processors.upper = function(arr, params) {\n  return arr.join(\":\").toUpperCase()\n}\ntp.text_processors.lower = function(arr, params) {\n  return arr.join(\":\").toLowerCase()\n}\n\ntp.text_processors.rainbow = function(arr, params) {\n  const s = arr.pop()\n  const colours = arr.length === 0 ? tp.colours : arr\n  let result = ''\n  for (let i = 0; i < s.length; i++) {\n    result += '<span style=\"color:' + random.fromArray(colours) + '\">' + s.charAt(i) + '</span>'\n  }\n  return result\n};\n\ntp._charSwap = function(c, upper, lower) {\n  if (c.match(/[A-Z]/)) return String.fromCharCode(c.charCodeAt(0) - 'A'.charCodeAt(0) + upper)\n  if (c.match(/[a-z]/)) return String.fromCharCode(c.charCodeAt(0) - 'a'.charCodeAt(0) + lower)\n  return c\n}\n\n// Try 391:3AC for Greek, 402:431 for Cyrillic, 904:904 for Devanagari\ntp.text_processors.encode = function(arr, params) {\n  const upper = parseInt(arr.shift(), 16)\n  const lower = parseInt(arr.shift(), 16)\n  const s = arr.shift()\n  let result = ''\n  for (let i = 0; i < s.length; i++) {\n    result += tp._charSwap(s.charAt(i), upper, lower)\n  }\n  return result\n};\n\ntp.text_processors.blur = function(arr, params) {\n  const n = arr.shift();\n  return '<span style=\"color:transparent;text-shadow: 0 0 ' + n + 'px rgba(0,0,0,1);\">' + arr.join(\":\") + \"</span>\";\n};\n\ntp.text_processors.font = function(arr, params) {\n  const f = arr.shift();\n  return '<span style=\"font-family:' + f + '\">' + arr.join(\":\") + \"</span>\";\n};\n\ntp.text_processors.class = function(arr, params) {\n  const c = arr.shift()\n  return '<span class=\"' + c + '\">' + arr.join(\":\") + '</span>'\n}\n\ntp.text_processors.colour = function(arr, params) {\n  const c = arr.shift();\n  return '<span style=\"color:' + c + '\">' + arr.join(\":\") + \"</span>\";\n};\n\ntp.text_processors.color = tp.text_processors.colour;\n\ntp.text_processors.back = function(arr, params) {\n  const c = arr.shift();\n  return '<span style=\"background-color:' + c + '\">' + arr.join(\":\") + \"</span>\";\n};\n\ntp.text_processors.dialogue = function(arr, params) {\n  let prefix = \"<span\";\n  const style = arr.shift()\n  if (arr.length < 1) errormsg(\"Failed to find enough parts in text processor 'dialog' (\" + params.tpOriginalString + \")\")\n\n  if (style.startsWith('.')) {\n    prefix += ' class=\"' + style.replace('.', '') + '\"'\n  }\n  else if (params[style]) {\n    prefix += ' style=\"' + params[style].dialogueStyle + '\"'\n  }\n  else {\n    if (arr.length < 2) errormsg(\"Failed to find enough parts in text processor 'dialog' without a class (\" + params.tpOriginalString + \")\")\n    const colour = arr.shift()\n    prefix += ' style=\"'\n    if (style.includes('i')) prefix += \"font-style:italic;\"\n    if (style.includes('b')) prefix += \"font-weight:bold;\"\n    if (style.includes('u')) prefix += \"text-decoration:underline;\"\n    if (colour) {\n      prefix += \"color:\" + colour\n    }\n    prefix += '\"'\n  }\n  prefix += '>'\n  return prefix + settings.openQuotation + arr.join() + settings.closeQuotation + \"</span>\"\n}\n\ntp.text_processors.random = function(arr, params) {\n  return arr[random.int(0, arr.length - 1)];\n};\n\ntp.text_processors.select = function(arr, params) { return tp.select(arr, params, 'none') }\ntp.text_processors.selectNone = function(arr, params) { return tp.select(arr, params, 'none') }\ntp.text_processors.selectWrap = function(arr, params) { return tp.select(arr, params, 'wrap') }\ntp.text_processors.selectStart = function(arr, params) { return tp.select(arr, params, 'start') }\ntp.text_processors.selectEnd = function(arr, params) { return tp.select(arr, params, 'end') }\n\ntp.text_processors.cycle = function(arr, params) { return tp.select(arr, params, 'none', true) }\ntp.text_processors.cycleNone = function(arr, params) { return tp.select(arr, params, 'none', true) }\ntp.text_processors.cycleWrap = function(arr, params) { return tp.select(arr, params, 'wrap', true) }\ntp.text_processors.cycleStart = function(arr, params) { return tp.select(arr, params, 'start', true) }\ntp.text_processors.cycleEnd = function(arr, params) { return tp.select(arr, params, 'end', true) }\n\ntp.select = function(arr, params, opt, cycling) {\n  let name = arr.shift()\n  if (name.match(/\\./)) {\n    const ary = name.split('.')\n    name = ary[0]\n    arr.unshift(ary[1])\n  }\n  const o = tp._findObject(name, params, arr)\n  if (!o) errormsg('Failed to find an object called \"' + name + '\" in text processor select.')\n  const l = o[arr[0]]\n  if (l === undefined && !cycling) errormsg('Failed to find an attribute called \"' + arr[0] + '\" for \"' + name + '\" in text processor \"select\" directive.')\n  if (Array.isArray(l)) {\n    let n = o[arr[1]]\n    if (cycling) {\n      if (typeof n !== 'number') {\n        n = 0\n        o[arr[1]] = 0\n      }\n      o[arr[1]]++\n    }\n    if (!l) errormsg('Failed to find a secondary attribute called \"' + arr[1] + '\" for \"' + name + '\" in text processor \"select\" directive.')\n    return array.value(l, Math.round(n), opt)\n  }\n  if (typeof l === 'number') {\n    if (cycling) o[arr[0]]++\n    arr.shift()\n    return array.value(arr, Math.round(l), opt)\n  }\n  if (l === undefined && cycling) {\n    o[arr[0]] = 1\n    arr.shift()\n    return array.value(arr, 0, opt)\n  }\n  errormsg('Failed to do anything with the attribute called \"' + arr[1] + '\" for \"' + name + '\" in text processor select - neither an array or an integer.')\n};\n\ntp._findObject = function(name, params, arr) {\n  if (params && params[name]) return typeof params[name] === 'string' ? w[params[name]] : params[name]\n  if (name === \"player\") return player()\n  if (name === \"currentLocation\") return loc()\n  if (name === \"settings\") return settings\n  if (name === \"params\") return params\n  if (w[name]) return w[name]\n  const ary = name.split('.')\n  if (ary.length === 1) return undefined\n  if (ary.length > 2) {\n    console.log(\"The text process cannot handle attributes of attributes, so failed to deal with: \" + name)\n    console.log(ary)\n    return undefined\n  }\n  arr.unshift(ary[1])\n  return w[ary[0]]\n}\n\ntp.text_processors.multi = function(arr, params) {\n  if (!params.multiple) return ''\n  return sentenceCase(params.item.alias) + \": \"\n}\n\ntp.text_processors.show = function(arr, params) {\n  let name = arr.shift()\n  return tp.handleShow(arr, name, null, params)\n}\n\ntp.text_processors.showOrNot = function(arr, params) {\n  let name = arr.shift()\n  let def = arr.shift()\n  return tp.handleShow(arr, name, def, params)\n}\n\ntp.handleShow = function(arr, name, def, params) {\n  if (params[name] !== undefined) {\n    if (typeof params[name] === 'object') return tp.getWhatever(params[name][arr[0]], params, params[name], def, arr)\n    return tp.getWhatever(params[name], params, undefined, def, arr)\n  }\n  const obj = tp._findObject(name, params, arr)\n  if (!obj) return errormsg(\"Failed to find object '\" + name + \"' in text processor 'show' (\" + params.tpOriginalString + \")\")\n  return tp.getWhatever(obj[arr[0]], params, obj, def, arr)\n}\ntp.text_processors.object = tp.text_processors.show\n\ntp.getWhatever = function(val, params, obj, def, arr) {\n  if (val === undefined || val === null) return def ? def : ''\n  if (val === false) return lang.tp_false\n  if (val === true) return lang.tp_true\n  if (val === undefined) return ''\n  if (typeof val === 'string') return val\n  if (typeof val === 'number') return val.toString()\n  if (val && typeof val === 'object') {  // because null is an object!\n    if (!arr[0]) return errormsg(\"Got an object, but no attribute in show for: \" + val.name)\n    if (!val[arr[0]]) return errormsg(\"Got an object, but no attribute valled \" + arr[0] + \" in show for: \" + val.name)\n    return val[arr[0]].toString()\n  }\n  if (typeof val !== 'function') return errormsg(\"Got a value of a type I was not expecting in show: \" + (typeof val))\n  const func = val.bind(obj)\n  arr.shift()  // consume the function name\n  return tp.getWhatever(func(params), params, obj, def, arr)\n}\n\ntp.text_processors.contents = function(arr, params) {\n  let name = arr.shift()\n  const obj = typeof params[name] === 'object' ? params[name] : tp._findObject(name, params, arr)\n  if (!obj) return errormsg(\"Failed to find object '\" + name + \"' in text processor 'contents' (\" + params.tpOriginalString + \")\")\n  return formatList(obj.getContents(world.LOOK), {article:INDEFINITE, sep:arr[0], lastSep:arr[1], nothing:arr[2]})\n}\n\ntp.text_processors.rndalt = function(arr, params) {\n  let name = arr.shift()\n  if (params[name]) {\n    if (typeof params[name] === 'string') return params[name]\n    if (typeof params[name] === 'number') return params[name].toString()\n    if (arr.length > 0) return params[name][arr[0]]\n  }\n  const obj = tp._findObject(name, params, arr)\n  if (!obj) return errormsg(\"Failed to find object '\" + name + \"' in text processor 'show' (\" + params.tpOriginalString + \")\")\n  if (obj.alt) return random.fromArray(obj.alt)\n  return obj.alias\n}\n\ntp.text_processors.number = function(arr, params) {\n  let name = arr.shift()\n  if (name.match(/^\\d+$/)) return lang.toWords(parseInt(name))\n  if (typeof params[name] === 'number') return lang.toWords(params[name], arr[0])\n  const obj = tp._findObject(name, params, arr)\n  if (!obj) return errormsg(\"Failed to find object '\" + name + \"' in text processor 'number' (\" + params.tpOriginalString + \")\")\n  const att = arr.shift()\n  if (typeof obj[att] === 'number') return lang.toWords(obj[att], arr[0])\n  return errormsg(\"Failed to find a number for object '\" + name + \"' in text processor (\" + params.tpOriginalString + \")\")\n}\n\ntp.text_processors.ordinal = function(arr, params) {\n  let name = arr.shift()\n  if (name.match(/^\\d+$/)) return lang.toOrdinal(parseInt(name))\n  if (typeof params[name] === 'number') return lang.toOrdinal(params[name])\n  const obj = tp._findObject(name, params, arr)\n  if (!obj) return errormsg(\"Failed to find object '\" + name + \"' in text processor 'number' (\" + params.tpOriginalString + \")\")\n  if (typeof obj[arr[0]] === 'number') return lang.toOrdinal(obj[arr[0]])\n  return errormsg(\"Failed to find a number for object '\" + name + \"' in text processor (\" + params.tpOriginalString + \")\")\n};\n\ntp.text_processors.money = function(arr, params) {\n  let name = arr.shift()\n  if (name.match(/^\\d+$/)) return displayMoney(parseInt(name))\n  if (typeof params[name] === 'number') return displayMoney(params[name])\n  const obj = tp._findObject(name, params, arr)\n  if (!obj) return errormsg(\"Failed to find object '\" + name + \"' in text processor 'money' (\" + params.tpOriginalString + \")\")\n  if (obj.loc === player().name && obj.getSellingPrice) {\n    return displayMoney(obj.getSellingPrice(player()))\n  }\n  if (obj.loc === player().name && obj.getBuyingPrice) {\n    return displayMoney(obj.getBuyingPrice(player()))\n  }\n  if (obj.getPrice) {\n    return displayMoney(obj.getPrice())\n  }\n  if (obj.price) {\n    return displayMoney(obj.price)\n  }\n  if (obj.money) {\n    return displayMoney(obj.money)\n  }\n  return errormsg(\"Failed to find a price for object '\" + name + \"' in text processor (\" + params.tpOriginalString + \")\")\n};\ntp.text_processors['$'] = tp.text_processors.money\n\ntp.text_processors.dateTime = function(arr, params) {\n  const options = {format:arr[0]}\n  if (!isNaN(arr[1])) options.is = parseInt(arr[1])\n  if (!isNaN(arr[2])) options.add = parseInt(arr[2])\n  return util.getDateTime(options)\n};\n\n// Specifically for use with achievements\ntp.text_processors.date = function(arr, params) {\n  return new Date(params[arr[0]]).toLocaleString()\n}\n\ntp.text_processors.transitDest = function(arr, params) {\n  const transit = arr[0] ? w[arr[0]] : w[player().loc]\n  if (!transit.transitDoorDir) return errormsg(\"Trying to use the 'transitDest' text process directive when the player is not in a transit location (\" + params.tpOriginalString + \").\")\n  if (transit.currentButtonName) {\n    const button = w[transit.currentButtonName]\n    if (button.title) return button.title\n  }\n  const destName = transit[transit.transitDoorDir].name\n  return lang.getName(w[destName], {capital:true})\n};\n\ntp.text_processors.img = function(arr, params) {\n  const src = arr[0].includes('/') ? arr[0] : settings.imagesFolder + arr[0]\n  return '<img src=\"' + src + '\" title=\"' + arr[1] + '\" alt=\"' + arr[2] + '\"/>';\n}\n\ntp.once = function(params, s1, s2) {\n  if (params.tpFirstTime && s1) return s1\n  if (!params.tpFirstTime && s2) return s2\n  return ''\n}\ntp.text_processors.once = function(arr, params) { return tp.once(params, arr[0], arr[1]) }\ntp.text_processors.first = tp.text_processors.once\ntp.text_processors.notOnce = function(arr, params) { return tp.once(params, arr[1], arr[0]) }\ntp.text_processors.notfirst = tp.text_processors.notOnce\n\ntp.text_processors.cmd = function(arr, params) {\n  if (arr.length === 1) {\n    return io.cmdlink(arr[0], arr[0])\n  }\n  else {\n    return io.cmdlink(arr[0], arr[1])\n  }\n}\n\ntp.text_processors.command = function(arr, params) {\n  if (arr.length === 1) {\n    return io.cmdlink(arr[0], arr[0]);\n  }\n  else {\n    return io.cmdlink(arr[0], arr[1]);\n  }\n}\n\ntp.text_processors.exit = tp.text_processors.command\ntp.text_processors.page = tp.text_processors.command\n\ntp.text_processors.hour = function(arr, params) {\n  const hour = util.getDateTimeDict().hour\n  if (hour < arr[0]) return ''\n  if (hour >= arr[1]) return ''\n  return arr[2]\n}\n\ntp.text_processors.link = function(arr, params) {\n  let s1 = arr.shift()\n  let s2 = arr.join(':')\n  return '<a href=\\\"' + s2 + '\\\" target=\"_blank\">' + s1 + '</a>'\n}\n\ntp.text_processors.popup = function(arr, params) {\n  let s1 = arr.shift()\n  let s2 = arr.join(':')\n  let id = s1.replace(/[^a-zA-Z_]/, '') + random.int(0, 999999999)\n  const html = '<div id=\\\"' + id + '\\\" class=\\\"popup\\\" onclick=\\\"io.toggleDisplay(\\'' + id + '\\')\"><p>' + s2 + '</p></div>'\n  document.querySelector('#main').innerHTML += html\n  return '<span class=\\\"popup-link\\\" onclick=\\\"io.toggleDisplay(\\'#' + id + '\\')\">' + s1 + '</span>'\n}\n\ntp.text_processors.roomSet = function(arr, params) {\n  const n = loc().roomSetOrder - 1\n  return n < arr.length ? arr[n] : ''\n}\n\n//-----------  CONDITIONALS  --------------------\n\ntp.text_processors.if = function(arr, params) { return tp.handleIf(arr, params, false) }\ntp.text_processors.ifNot = function(arr, params) { return tp.handleIf(arr, params, true) }\ntp.handleIf = function(arr, params, reverse) {\n  let name = arr.shift(), flag\n\n  if (typeof params[name] === 'boolean') return (params[name] ? arr[0] : (arr[1] ? arr[1] : \"\"))\n\n  const obj = tp._findObject(name, params, arr)\n  if (!obj) return errormsg(\"Failed to find object '\" + name + \"' in text processor 'if/ifNot' (\" + params.tpOriginalString + \")\")\n  name = arr.shift();\n  let attValue = typeof obj[name] === 'function' ? obj[name](params) : obj[name]\n  if (typeof attValue === 'object') attValue = attValue.name\n  if (attValue === undefined) attValue = false\n  if (typeof attValue === \"boolean\") {\n    flag = attValue\n  }\n  else {\n    let value = arr.shift()\n    if (typeof attValue === \"number\") {\n      if (isNaN(value)) return errormsg(\"Trying to compare a numeric attribute, '\" + name + \"' with a string (\" + params.tpOriginalString + \").\")\n      value = parseInt(value)\n    }\n    flag = (attValue === value)\n  }\n  if (reverse) flag = !flag\n  return (flag ? arr[0] : (arr[1] ? arr[1] : \"\"))\n}\n\ntp.text_processors.ifIs = function(arr, params) { return tp.handleIfIs(arr, params, false) }\ntp.text_processors.ifNotIs = function(arr, params) { return tp.handleIfIs(arr, params, true) }\n\ntp.handleIfIs = function(arr, params, reverse) {\n  let name = arr.shift(), flag;\n  const obj = tp._findObject(name, params, arr)\n  if (!obj) return errormsg(\"Failed to find object '\" + name + \"' in text processor 'if/ifNot' (\" + params.tpOriginalString + \")\")\n  name = arr.shift();\n  let attValue = typeof obj[name] === 'function' ? obj[name](params) : obj[name]\n  if (typeof attValue === 'object') attValue = attValue.name\n  const value = util.guessMyType(arr.shift())\n  flag = (attValue === value)\n  if (reverse) flag = !flag\n  return (flag ? arr[0] : (arr[1] ? arr[1] : \"\"))\n}\n\ntp.text_processors.ifExists = function(arr, params) { return tp.handleIfExists(arr, params, false) }\ntp.text_processors.ifNotExists = function(arr, params) { return tp.handleIfExists(arr, params, true) }\ntp.handleIfExists = function(arr, params, reverse) {\n  let name = arr.shift(), flag\n  const obj = tp._findObject(name, params, arr)\n  if (!obj) return errormsg(\"Failed to find object '\" + name + \"' in text processor 'if/ifNotExists' (\" + params.tpOriginalString + \")\")\n  name = arr.shift()\n  flag = obj[name] !== undefined\n  if (reverse) flag = !flag\n  return (flag ? arr[0] : (arr[1] ? arr[1] : \"\"))\n}\n\ntp.text_processors.ifLessThan = function(arr, params) { return tp.handleIfLessMoreThan(arr, params, false, false) }\ntp.text_processors.ifMoreThan = function(arr, params) { return tp.handleIfLessMoreThan(arr, params, true, false) }\ntp.text_processors.ifLessThanOrEqual = function(arr, params) { return tp.handleIfLessMoreThan(arr, params, false, true) }\ntp.text_processors.ifMoreThanOrEqual = function(arr, params) { return tp.handleIfLessMoreThan(arr, params, true, true) }\ntp.handleIfLessMoreThan = function(arr, params, moreThan, orEqual) {\n  let name = arr.shift(), flag\n  const obj = tp._findObject(name, params, arr)\n  if (!obj) return errormsg(\"Failed to find object '\" + name + \"' in text processor 'ifLessMoreThan' (\" + params.tpOriginalString + \")\")\n  name = arr.shift()\n  let attValue = typeof obj[name] === 'function' ? obj[name](params) : obj[name]\n  if (typeof attValue !== \"number\") return errormsg(\"Trying to use ifLessThan with a non-numeric (or nonexistent) attribute, '\" + name + \"' (\" + params.tpOriginalString + \").\")\n  let value = arr.shift()\n  if (isNaN(value)) return errormsg(\"Trying to compare a numeric attribute, '\" + name + \"' with a string (\" + params.tpOriginalString + \").\")\n  value = parseInt(value)\n  flag = moreThan ? (orEqual ? (attValue >= value) : (attValue > value)) : (orEqual ? (attValue <= value) : (attValue < value))\n  return (flag ? arr[0] : (arr[1] ? arr[1] : \"\"))\n}\n\ntp.text_processors.ifHere = function(arr, params) { return tp.handleIfHere(arr, params, false, 'loc') }\ntp.text_processors.ifNotHere = function(arr, params) { return tp.handleIfHere(arr, params, true, 'loc') }\ntp.text_processors.ifHeld = function(arr, params) { return tp.handleIfHere(arr, params, false, 'name') }\ntp.text_processors.ifNotHeld = function(arr, params) { return tp.handleIfHere(arr, params, true, 'name') }\ntp.handleIfHere = function(arr, params, reverse, locAtt) {\n  const name = arr.shift();\n  const obj = tp._findObject(name, params, arr)\n  if (!obj) return errormsg(\"Failed to find object '\" + name + \"' in text processor 'ifHere' (\" + params.tpOriginalString + \")\")\n  let flag = obj.isAtLoc(player()[locAtt], world.ALL)\n  if (reverse) flag = !flag\n  return (flag ? arr[0] : (arr[1] ? arr[1] : \"\"))\n}\n\ntp.text_processors.ifPlayer = function(arr, params) { return tp.handleIfPlayer(arr, params, false) }\ntp.text_processors.ifNotPlayer = function(arr, params) { return tp.handleIfPlayer(arr, params, true) }\ntp.handleIfPlayer = function(arr, params, reverse) {\n  let name = arr.shift(), flag\n  const obj = tp._findObject(name, params, arr)\n  if (!obj) return errormsg(\"Failed to find object '\" + name + \"' in text processor 'if/ifNotPlayer' (\" + params.tpOriginalString + \")\")\n  flag = obj === player()\n  if (reverse) flag = !flag\n  return (flag ? arr[0] : (arr[1] ? arr[1] : \"\"))\n}\n\n//---------------  SUPPORT  FOR  ROOM  TEMPLATES  ------------------------------------\n\ntp.text_processors.terse = function(arr, params) {\n  if ((settings.verbosity === world.TERSE && loc().visited === 0) || settings.verbosity === world.VERBOSE || params.fullDescription) {\n    return sentenceCase(arr.join(\":\"))\n  }\n  else {\n    return ''\n  }\n}\n\n// Need to do some hackery here...\n// It is assumed this is only used in the room template, and therefore should be safe\n// The issue is that the text for every room is {hereDesc}, so the \"once\" directive\n// would only work the first time. In the second room, {hereDesc} has already been done, so once fails.\n// The hack then is to pre-process the room text in here\ntp.text_processors.hereDesc = function(arr, params) {\n  let s\n  const attName = settings.getLocationDescriptionAttName()\n  if (typeof loc()[attName] === 'string') {\n    s = loc()[attName]\n  }\n  else if (typeof loc()[attName] === 'function') {\n    s = loc()[attName]()\n    if (s === undefined) {\n      log(\"This location description is not set up properly. It has a '\" + attName +\n          \"' function that does not return a string. The location is \\\"\" + loc().name + \"\\\".\")\n      return \"[Bad description, F12 for details]\"\n    }\n  }\n  else {\n    s = \"This is a location in dire need of a description.\"\n  }\n  for (const el of scopeHereParser()) {\n    if (typeof el.scenery === 'string') s += (settings.sceneryOnNewLine ? '|' : ' ') + el.scenery\n  }\n  delete params.tpFirstTime\n  return processText(s, params)\n}\n\ntp.text_processors.hereName = function(arr, params) {\n  return loc().headingAlias\n};\n\ntp.text_processors.objectsHere = function(arr, params) {\n  const listOfOjects = scopeHereListed();\n  return listOfOjects.length === 0 ? \"\" : arr.join(\":\");\n};\n\ntp.text_processors.exitsHere = function(arr, params) {\n  const list = loc().getExitDirs()\n  return list.length === 0 ? \"\" : arr.join(\":\");\n};\n\ntp.text_processors.objects = function(arr, params) {\n  const listOfOjects = scopeHereListed();\n  return formatList(listOfOjects, {\n      article:INDEFINITE, lastSep:lang.list_and,\n      modified:true, nothing:lang.list_nothing,\n      loc:player().loc\n  });\n}\n\ntp.text_processors.exits = function(arr, params) {\n  const list = loc().getExitDirs()\n  return formatList(list, {lastSep:lang.list_or, nothing:lang.list_nowhere});\n}\n\n//----------------  PARAMS  AND  NEUTRAL  LANGUAGE  SUPPORT  ---------------------------\n// Then {nv:char:try} to get\n\n\n/*\nThe name functions could readily be expanded. You can add further parameters and Quest will then grab those and pass them to lang.getName. Thus, if we have this:\n\nmsg(\"You see {nm:item:the:false:x_count}.\", {item:w.terror_cat, x_count:4})\n\nThen the options passed to lang.getName will include x_count set to 4.\n*/\n\n// {function:character:article:capitalise}\ntp.text_processors.nm = function(arr, params) { return tp.nameFunction(arr, params, false) }\ntp.text_processors.nms = function(arr, params) { return tp.nameFunction(arr, params, true) }\ntp.text_processors.list = function(arr, params) { return tp.nameFunction(arr, params, false, true) }\ntp.nameFunction = function(arr, params, isPossessive, isList) {\n\n  const name = arr.shift()\n  let subject\n  if (isList) {\n    subject = params[name]\n    if (!subject) {\n      errormsg(\"Cannot find parameter for list text processor directive:\" + name)\n      return false\n    }\n    if (!Array.isArray(subject)) {\n      errormsg(\"Parameter for list text processor directive is not a list:\" + name)\n      return false\n    }\n  }\n  else {\n    subject = tp._findObject(name, params, arr)\n    if (!subject) return false;\n  }\n\n  const options = {possessive:isPossessive};\n  if (arr[0] === 'THE') { options.article = DEFINITE; options.ignorePossessive = true }\n  if (arr[0] === 'the') options.article = DEFINITE\n  if (arr[0] === 'the-pa') {options.article = DEFINITE; options.possAdj = true }\n  if (arr[0] === 'A') { options.article = INDEFINITE; options.ignorePossessive = true }\n  if (arr[0] === 'a') options.article = INDEFINITE\n  if (arr[0] === 'a-pa') {options.article = INDEFINITE; options.possAdj = true }\n  if (arr[2] && options.possAdj) {\n    options.possAdj = tp._findObject(arr[2], params, [])\n  }\n  if (arr[0] === 'count') options.article = COUNT\n  if (params[subject.name + '_count']) options[subject.name + '_count'] = params[subject.name + '_count']\n  if (params[name + '_count']) options[subject.name + '_count'] = params[name + '_count']\n  if (params[subject.name + '_count_loc']) options['loc'] = params[subject.name + '_count_loc']\n  let n = 2\n  while (arr[n]) {\n    options[arr[n]] = params[arr[n]]\n    n++\n  }\n  options.lastSep = lang.list_and\n  options.othing = lang.list_nothing\n\n  const s = isList ? formatList(subject, options) :lang.getName(subject, options)\n\n  return arr[1] === 'true' ? sentenceCase(s) : s;\n}\n\n// {function:character:verb:capitalise}\ntp.text_processors.nv = function(arr, params) { return tp.conjugations(lang.nounVerb, arr, params) }\ntp.text_processors.pv = function(arr, params) { return tp.conjugations(lang.pronounVerb, arr, params) }\ntp.text_processors.vn = function(arr, params) { return tp.conjugations(lang.verbNoun, arr, params) }\ntp.text_processors.vp = function(arr, params) { return tp.conjugations(lang.verbPronoun, arr, params) }\ntp.text_processors.cj = function(arr, params) { return tp.conjugations(lang.conjugate, arr, params) }\ntp.conjugations = function(func, arr, params) {\n  const name = arr.shift()\n  const subject = tp._findObject(name, params, arr)\n  if (!subject) return false\n  const options = {capitalise:arr[1] === 'true'}\n  let n = 2\n  while (arr[n]) {\n    options[arr[n]] = params[arr[n]]\n    n++\n  }\n  return func(subject, arr[0], options)\n}\n\n// {function:item:capitalise}\ntp.handlePronouns = function(arr, params, pronoun) {\n  const name = arr.shift()\n  const subject = tp._findObject(name, params, arr)\n  if (!subject) return false;\n  return arr[0] === 'true' ? sentenceCase(subject.pronouns[pronoun]) : subject.pronouns[pronoun];\n};\ntp.text_processors.pa = function(arr, params) {\n  return tp.handlePronouns(arr, params, \"possAdj\");\n};\ntp.text_processors.ob = function(arr, params) {\n  return tp.handlePronouns(arr, params, \"objective\");\n};\ntp.text_processors.sb = function(arr, params) {\n  return tp.handlePronouns(arr, params, \"subjective\");\n};\ntp.text_processors.ps = function(arr, params) {\n  return tp.handlePronouns(arr, params, \"possessive\");\n};\ntp.text_processors.rf = function(arr, params) {\n  return tp.handlePronouns(arr, params, \"reflexive\");\n};\n\n// {pa2:chr1:chr2}\ntp.text_processors.pa2 = function(arr, params) {\n  const name1 = arr.shift()\n  const chr1 = tp._findObject(name1, params, arr)\n  if (!chr1) return false;\n  const name2 = arr.shift()\n  const chr2 = tp._findObject(name2, params, arr)\n  if (!chr2) return false;\n\n  if (chr1.pronouns === chr2.pronouns && chr1 !== chr2) {\n    const opt = {article:DEFINITE, possessive:true};\n    return arr[0] === 'true' ? sentenceCase(lang.getName(chr1, opt)) : lang.getName(chr1, opt)\n  }\n\n  return arr[0] === 'true' ? sentenceCase(chr1.pronouns.possAdj) : chr1.pronouns.possAdj;\n};\n\n// {pa3:chr1:chr2}\ntp.text_processors.pa3 = function(arr, params) {\n  const name1 = arr.shift()\n  const chr1 = tp._findObject(name1, params, arr)\n  if (!chr1) return false;\n  const name2 = arr.shift()\n  const chr2 = tp._findObject(name2, params, arr)\n  if (!chr2) return false;\n\n  // todo - undefined variable 'subject'\n  if (chr1 !== chr2) {\n    const opt = {article:DEFINITE, possessive:true};\n    return arr[0] === 'true' ? sentenceCase(lang.getName(subject, opt)) : lang.getName(subject, opt);\n  }\n\n  return arr[0] === 'true' ? sentenceCase(chr1.pronouns.possAdj) : chr1.pronouns.possAdj;\n};\n","// noinspection JSDeprecatedSymbols\n\n\"use strict\"\nimport {\n    DEFINITE, lang, commands, saveLoad, test, random, settings, w,\n    processText, runCmd, sentenceCase, verbify, player, loc, world, parser\n} from '../index.js';\n\n// This is at the top of the file so authors know to ignore stack trace enties for lines 1 to 15 in _io.js\nexport const printError = function(msg, err, suppressTrace) {\n  console.error(\"ERROR: \" + msg)\n  if (world.isCreated) {\n    io.print({tag:'p', cssClass:\"error\", text: lang.error})\n    saveLoad.transcriptAppend({ cssClass:'error', text:msg, stack:err.stack, })\n    io.reset()  // ensure the interface is still useable!\n  }\n  if (suppressTrace) return false\n  console.log('Look through the trace below to find the offending code. The first entry in the list may be \"errormsg\" in the file \"_io.js\", which is me so can be ignored. The next will the code that detected the error and called the \"errormsg\" message. You may need to look further down to find the root cause, especially for a text process issue.')\n  if (settings.playMode !== 'dev') console.log(\"If this is uploaded, it might be worth doing [Crtl]-[Shft]-R to reload the page. You will lose any progress, but it will clear the browser cache and ensure you are using the latest version of the game files.\")\n  console.log(err)\n  return false;\n}\n\nif (settings.playMode !== 'dev') {\n  window.onbeforeunload = function(event) {\n    event.returnValue = \"Are you sure?\";\n  }\n}\n\nsettings.mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\")\nsettings.autoscroll = !settings.mediaQuery.matches\n\n// ============  Output  =======================================\n\n//@DOC\n// ##Output functions\n//\n// The idea is that you can have them world. differently - or not at all -\n// so error messages can be world.ed in red, meta-data (help., etc)\n// is grey, and debug messages can be turned on and off as required.\n//\n// Note that not all use the text processor (so if there is an issue with\n// the text processor, we can use the others to report it). Also unit tests\n// capture output with msg and errormsg, but not debugmsg or headings.\n//\n// Should all be language neutral\n//@UNDOC\n\n/*\ntag   required\naction  required\ncssClass\nprintBlank\n*/\n\nexport function _msg(s, params, options) {\n  if (options.tag === undefined) options.tag = 'p'\n  if (options.cssClass === undefined) options.cssClass = 'default-' + options.tag.toLowerCase();\n  let processed = params ? processText(s, params).trim() : s.trim();\n  if (processed === \"\" && !options.printBlank) return;\n\n  for (let line of processed.split('|')) {\n    for (const el in io.escapeCodes) {\n      line = line.replace(RegExp('@@@' + el + '@@@', 'ig'), io.escapeCodes[el])\n    }\n    if (settings.convertDoubleDash && !test.testing) line = line.replace(/ -- /g, ' &mdash; ')\n    const data = {}\n    Object.assign(data, options)  // need to do it this way as options may be same object\n    data.text = line\n    if (!data.action) data.action = 'output'\n\n    if (test.testing) {\n      if (test.ignoreHTML) line = line.replace(/(<([^>]+)>)/gi, '')\n      if (test.fullOutputData) {\n        test.testOutput.push(data)\n      }\n      else {\n        test.testOutput.push(line)\n      }\n    }\n    else {\n      io.addToOutputQueue(data)\n    }\n  }\n}\n\n//@DOC\n// Adds the given string to the print queue.\n// This allows you to add any HTML you want to the output queue.\nexport function rawPrint(s) {\n  _msg(s, false, {})\n}\n\n//@DOC\n// Output a standard message, as an HTML paragraph element (P).\n// The string will first be passed through the text processor.\n// Additional data can be put in the optional params dictionary.\n// You can specify a CSS class to use.\n// During unit testing, messages will be saved and tested\n// If the string starts with a hash and no cssClass is given the line will be printed as a level 4 heading.\n// A vertical bar will be taken as a line break.\nexport function msg(s, params, cssClass) {\n  if (!params) params = {}\n  if (typeof s !== 'string') {\n    console.error(\"Trying to print with \\\"msg\\\", but got this instead of a string:\")\n    console.error(s)\n    const err = new Error();\n    log(err.stack)\n    throw \"Bad string for msg()\"\n  }\n\n  if (/^#/.test(s) && !cssClass) {\n    s = s.replace(/^#/, '')\n    _msg(s, params, {cssClass:'default-h default-h4', tag:'h4'})\n  }\n  else {\n    _msg(s, params, {cssClass:cssClass, tag:'p'})\n  }\n}\n\n//@DOC\n// Output a standard message, as an HTML pre-formaed element (PRE).\n// The string will first be passed through the text processor.\n// Additional data can be put in the optional params dictionary.\n// During unit testing, messages will be saved and tested\nexport function msgPre(s, params, cssClass) {\n  if (!params) params = {}\n  if (typeof s !== 'string') {\n    console.error(\"Trying to print with \\\"msgPre\\\", but got this instead of a string:\")\n    console.error(s)\n    console.trace()\n    throw \"Bad string for msgPre()\"\n  }\n  _msg(s, params, {cssClass:cssClass, tag:'pre'})\n}\n\n//@DOC\n//Output a standard message, but it makes the NEXT message appear on the same line as the current message. Note that the next message will not have its own params or cssClass.\nexport function OutputTextNoBr(s, params, cssClass) {\n    if(s.startsWith(' ')) {\n        s = \"&nbsp;\" + s.substring(1, s.length);\n    }\n    if(s.endsWith(' ')) {\n        s = s.substring(0, (s.length - 1)) + \"&nbsp;\"\n    }\n   msg(\"@@OUTPUTTEXTNOBR@@\" + s, params, cssClass);\n}\nexport function msgBlankLine() {\n  _msg('', false, {tag:'p', printBlank:true})\n}\n\n//@DOC\n// As `msg`, but handles an array of strings. Each string is put in its own HTML paragraph,\n// and the set is put in an HTML division (DIV). The cssClass is applied to the division.\nexport function msgDiv(arr, params, cssClass) {\n  let s = ''\n  for (let item of arr) {\n    s += '  <p>' + item + \"</p>\\n\"\n  }\n  _msg(s, params || {}, {cssClass:cssClass, tag:'div'})\n}\n\n//@DOC\n// As `msg`, but handles an array of strings in a list. Each string is put in its own HTML list item (LI),\n// and the set is put in an HTML order list (OL) or unordered list (UL), depending on the value of `ordered`.\nexport function msgList(arr, ordered, params, cssClass) {\n  let s = ''\n  for (let item of arr) {\n    s += '  <li>' + item + \"</li>\\n\"\n  }\n  _msg(s, params || {}, {cssClass:cssClass, tag:ordered ? 'ol' : 'ul'})\n}\n\n//@DOC\n// As `msg`, but handles an array of arrays of strings in a list. This is laid out in an HTML table.\n// If `headings` is present, this array of strings is used as the column headings.\nexport function msgTable(arr, headings, params, cssClass) {\n  let s = ''\n  if (headings) {\n    s += '  <tr>\\n'\n    for (let item of headings) {\n      s += \"    <th>\" + item + \"</th>\\n\"\n    }\n    s += '  </tr>\\n'\n  }\n  for (let row of arr) {\n    s += '  <tr>\\n'\n    for (let item of row) {\n      s += \"    <td>\" + processText(item, params).trim() + \"</td>\\n\"\n    }\n    s += \"  </tr>\\n\"\n  }\n  _msg(s, params || {}, {cssClass:cssClass, tag:'table'})\n}\n\n//@DOC\n// As `msg`, but the string is presented as an HTML heading (H1 to H6).\n// The level of the heading is determined by `level`, with 1 being the top, and 6 the bottom.\n// Headings are ignored during unit testing.\nexport function msgHeading(s, level, params) {\n  _msg(s, params || {}, {tag:'h' + level, cssClass:'default-h default-h' + level})\n}\n\n//@DOC\n// Output a picture, as an HTML image element (IMG).\n// If width and height are omitted, the size of the image is used.\n// If height is omitted, the height will be proportional to the given width.\n// The file name should include the path. For a local image, that would probably be the images folder,\n// but it could be the web address of an image hosted elsewhere.\nexport function picture(filename, width, height) {\n  const src = filename.includes('/') ? filename : settings.imagesFolder + filename\n  _msg('', {}, {action:'output', width:width, height:height, tag:'img', src:src, printBlank:true})\n}\n\nexport function image(filename, width, height) {\n  const src = filename.includes('/') ? filename : settings.imagesFolder + filename\n  _msg('', {}, {action:'output', width:width, height:height, tag:'img', src:src, cssClass:'centred', printBlank:true, destination:'quest-image'})\n}\n\n//@DOC\n// Plays a sound. The filename must include the extension, and the file should be in the folder specified by audioFolder (defaults to the game folder).\nexport function sound(filename) {\n  //console.log(settings.ssFolder)\n  _msg('Your browser does not support the <code>audio</code> element.', {}, {action:'sound', name:filename})\n}\nexport function ambient(filename, volume) {\n  //console.log(settings.ssFolder)\n  _msg('Your browser does not support the <code>audio</code> element.', {}, {action:'ambient', name:filename, volume:volume})\n}\n\n//@DOC\n// Plays a video. The filename must include the extension, and the file should be in the folder specified by audioFolder (defaults to the game folder).\n// There are some issues about codecs and formats; use at your discretion.\nexport function video(filename) {\n  //console.log(settings.ssFolder)\n  _msg('Your browser does not support the <code>video</code> element.', {}, {action:'output', autoplay:true, tag:'video', src:settings.videoFolder + '/' + filename})\n}\n\n//@DOC\n// Draw an image in the main window, embedded in the text.\n// This uses SVG, which is a standard web drawing system.\n// The first and second parameters are the width and height of the image.\n// The third parameter is an array of strings, each element being an SVG primitive.\n// The image will be added to the output queue in the same way text is.\nexport function draw(width, height, data, options) {\n  if (!options) options = {}\n  //console.log(options)\n  let s = '<svg width=\"' + width + '\" height=\"' + height + '\" viewBox=\"'\n  s += options.x !== undefined ? ('' + options.x + ' ' + options.y) : '0 0'\n  s += ' ' + width + ' ' + height + '\" '\n  if (options.background) s += 'style=\"background:' + options.background + '\" '\n  s += 'xmlns=\"http://www.w3.org/2000/svg\">'\n  s += data.join('') + '</svg>'\n  if (settings.reportAllSvg) console.log(s.replace(/></g, '>\\n<'))\n  if (options.destination) {\n    document.querySelector('#' + options.destination).innerHTML = s\n  }\n  else {\n    rawPrint(s)\n  }\n}\n\n//@DOC\n// Just the same as msg, but adds the \"failed\" CSS class. This allows failed command responses to be differentiated.\n// Returns the value FAILED, allowing commands to give a message and give up\n//     if (notAllowed) return failedmsg(\"That is not allowed.\")\nexport function failedmsg(s, params) {\n  _msg(s, params || {}, {cssClass:\"default-p failed\", tag:'p'});\n  return world.FAILED;\n}\n\n//@DOC\n// Just the same as msg, but adds the \"failed\" CSS class. This allows failed command responses to be differentiated.\n// Returns the value false, allowing commands to give a message and give up\n//     if (notAllowed) return falsemsg(\"That is not allowed.\")\nexport function falsemsg(s, params) {\n  _msg(s, params || {}, {cssClass:\"default-p failed\", tag:'p'});\n  return false;\n}\n\n//@DOC\n// Output a meta-message - a message to inform the player about something outside the game world,\n// such as hints and help messages.\n// The string will first be passed through the text processor.\n// Additional data can be put in the optional params dictionary.\n// During unit testing, messages will be saved and tested\nexport function metamsg(s, params) {\n  _msg(s, params || {}, {cssClass:\"meta\", tag:'p'});\n}\n\n//@DOC\n// Output a message from the parser indicating the input text could not be parsed.\n// During unit testing, messages will be saved and tested.\n// Does not use the text processor.\nexport function parsermsg(s) {\n  _msg(s, false, {cssClass:\"parser\", tag:'p'});\n  return false;\n}\n\n//@DOC\n// Output a message from the user\n// Does not use the text processor.\nexport function commentmsg(s) {\n  _msg(s, false, {cssClass:\"comment\", tag:'p'});\n  return false;\n}\n\n//@DOC\n// Output an error message.\n// Use for when something has gone wrong, but not when the player types something odd -\n// if you see this during play, there is a bug in your game (or my code!), it is not the player\n// to blame.\n//\n// This bypasses the normal output system. It will not wait for other text to be output (for example\n// after wait). During unit testing, error messages will be output to screen as they occur.\n// It does not use the text processor.\nexport function errormsg(s, suppressTrace) {\n  if (test.errorOutput !== undefined) {\n    // This is an expected error in a unit test\n    test.errorOutput.push(s)\n    return false\n  }\n\n  printError(s, new Error('error state caught by QuestJS runtime'), suppressTrace)\n\n}\n\n//@DOC\n// Output a debug message.\n// Debug messages are ignored if DEBUG is false.\n// You should also consider using `console.log` when debugging; it gives a message in the console,\n// and outputs objects and array far better.\n//\n// This bypasses the normal output system. It will not wait for other text to be output (for example\n// after wait). During unit testing, error messages will be output to screen as they occur.\n// It does not use the text processor.\nexport function debugmsg(s) {\n  if (settings.playMode === 'dev' || settings.playMode === 'meta') {\n    io.print({tag:'pre', cssClass:\"debug\", text:s, id:io.nextid})\n    io.nextid++\n  }\n}\n\n//@DOC\n// Adds a blank line to the output.\nexport function blankLine() {\n  rawPrint('&nbsp;')\n}\n\n//@DOC\n// Adds a horizontal rule to the output.\nexport function hr() {\n  rawPrint('<hr/>')\n}\n\n//@DOC\n// Clears the screen.\nexport function clearScreen() {\n  io.addToOutputQueue({action:'clear'})\n}\n\n//@DOC\n// Stops outputting whilst waiting for the player to click.\nexport function wait(delay, text, func) {\n  if (test.testing || settings.walkthroughInProgress) return\n  if (delay === undefined) {\n    io.addToOutputQueue({action:'wait', text:text, cssClass:'continue', func:func})\n  }\n  else {\n    io.addToOutputQueue({action:'delay', delay:delay, text:text, cssClass:'continue', func:func})\n  }\n}\n\n//@DOC\n// Clears the screen.\nexport function trigger(func) {\n  io.addToOutputQueue({action:'func', func:func})\n}\n\n//@DOC\n// Use like this:\n//      showMenu('What is your favourite color?', ['Blue', 'Red', 'Yellow', 'Pink'], function(result) {\n//        msg(\"You picked \" + result + \".\");\n//      });\nexport function showMenu(title, options, fn) {\n  const opts = {article:DEFINITE, capital:true, noLinks:true}\n  io.input(title, options, false, fn, function(options) {\n    for (let i = 0; i < options.length; i++) {\n      let s = '<a class=\"menu-option\" onclick=\"io.menuResponse(' + i + ')\">';\n      s += (typeof options[i] === 'string' ? options[i] : lang.getName(options[i], opts))\n      s += '</a>';\n      msg(s);\n    }\n  })\n}\n\nexport function showMenuNumbersOnly(title, options, fn) {\n  const opts = {article:DEFINITE, capital:true, noLinks:true}\n  parser.overrideWith(function(s) {io.menuResponse(s)})\n  const disableTextFunction = function(disable) {\n    if (disable) {\n      io.disable(3)\n      // add a keypress event handler to capture keypresses directly\n      io.keydownFunctions.push(io.keydownForMenuFunction)\n    }\n    else {\n      io.enable()\n    }\n  }\n  io.input(title, options, disableTextFunction, fn, function(options) {\n    for (let i = 0; i < options.length; i++) {\n      let s = (i + 1) + '. <a class=\"menu-option\" onclick=\"io.menuResponse(' + i + ')\">';\n      s += (typeof options[i] === 'string' ? options[i] : lang.getName(options[i], opts))\n      s += '</a>';\n      msg(s);\n    }\n  })\n}\n\nexport function showMenuWithNumbers(title, options, fn) {\n  const opts = {article:DEFINITE, capital:true, noLinks:true}\n  parser.overrideWith(function(s) {io.menuResponse(s)})\n  const disableTextFunction = function(disable) {\n    if (disable) {\n      io.disable(2)\n    }\n    else {\n      io.enable()\n      io.doNotSaveInput = false\n    }\n  }\n  const failFunction = function(input) {\n    msg(\"I do not understand: \" + input)\n    runCmd(input)\n    io.savedCommands.push(input)\n  }\n  io.doNotSaveInput = true\n  io.input(title, options, disableTextFunction, fn, function(options) {\n    for (let i = 0; i < options.length; i++) {\n      let s = (i + 1) + '. <a class=\"menu-option\" onclick=\"io.menuResponse(' + i + ')\">';\n      s += (typeof options[i] === 'string' ? options[i] : lang.getName(options[i], opts))\n      s += '</a>';\n      msg(s);\n    }\n  }, failFunction)\n}\n\nexport function showDropDown(title, options, fn) {\n  const opts = {article:DEFINITE, capital:true, noLinks:true}\n  io.input(title, options, false, fn, function(options) {\n    let s = '<select id=\"menu-select\" class=\"custom-select\" style=\"width:400px;\" ';\n    s += 'onchange=\\\"io.menuResponse(io.getDropDownText(\\'menu-select\\'))\\\">';\n    s += '<option value=\"-1\">-- Select one --</option>';\n    for (let i = 0; i < options.length; i++) {\n      s += '<option value=\"' + (i+1) + '\">';\n      s += (typeof options[i] === 'string' ? options[i] : lang.getName(options[i], opts))\n      s += '</option>';\n    }\n    msg(s + \"</select>\");\n    //document.querySelector('#menu-select').selectmenu();\n    document.querySelector('#menu-select').focus();\n  })\n}\n\nexport function showMenuDiag(title, options, fn, cssClass) {\n  io.showMenuDiagTitle = title\n  const opts = {article:DEFINITE, capital:true, noLinks:true}\n  const disableTextFunction = function(disable) {\n    if (disable) {\n      io.disable(3)\n    }\n    else {\n      io.enable()\n      if (!test.testing) {\n        const el = document.querySelector('#sidepane-menu')\n        if (el) el.remove() // may not exist in walk-through\n      }\n    }\n  }\n\n  const displayFunction = function(options) {\n    let s = '<div id=\"sidepane-menu\"'\n    if (cssClass) s += ' class=\"' + cssClass + '\"'\n    s += '>'\n    if (typeof io.showMenuDiagTitle === 'string') {\n      s += '<p class=\"sidepane-menu-title\">' + io.showMenuDiagTitle + '</p>'\n    }\n    else {\n      s += '<h4 class=\"sidepane-menu-title\">' + io.showMenuDiagTitle.title + '</h4>'\n      s += '<p class=\"sidepane-menu-title\">' + io.showMenuDiagTitle.text + '</p>'\n    }\n    for (let i = 0; i < options.length; i++) {\n      s += '<p value=\"' + i + '\" onclick=\"io.menuResponse(' + i + ')\" class=\"sidepane-menu-option\">'\n      s += (typeof options[i] === 'string' ? options[i] : lang.getName(options[i], opts))\n      s += '</p>';\n    }\n    s += '</div>'\n    document.querySelector('body').innerHTML += s\n  }\n\n  io.input(false, options, disableTextFunction, fn, displayFunction)\n\n  return world.SUCCESS_NO_TURNSCRIPTS\n}\n\nexport function showYesNoMenu(title, fn) {\n  showMenu(title, lang.yesNo, fn)\n}\n\nexport function showYesNoMenuWithNumbers(title, fn) {\n  showMenuWithNumbers(title, lang.yesNo, fn)\n}\n\nexport function showYesNoDropDown(title, fn) {\n  showDropDown(title, lang.yesNo, fn)\n}\n\nexport function askText(title, fn) {\n  io.menuFns.push(fn)\n  msg(title)\n  io.disable(2)\n  document.querySelector('#input').style.display = 'block'\n\n  parser.overrideWith(function(result) {\n    io.enable()\n    if (!settings.textInput) document.querySelector('#input').style.display = 'none'\n    io.savedCommands.pop()\n    if (io.savedCommandsPos > io.savedCommands.length) io.savedCommandsPos = io.savedCommands.length\n    const fn = io.menuFns.pop()\n    fn(result)\n  })\n}\n\nexport function showDiag(title, text, submitButton) {\n  if (!submitButton) return errormsg(\"Trying to use showDiag with no button\")\n  askDiag({title:title, text:text, width:400, height:'auto'}, null, submitButton)\n}\n\nexport function askDiag(title, fn, submitButton) {\n  io.menuFns.push(fn)\n  io.showMenuDiagTitle = title\n  io.showMenuDiagSubmit = submitButton\n  const disableTextFunction = function(disable) {\n    if (disable) {\n      io.disable(3)\n    }\n    else {\n      io.enable()\n      const el = document.querySelector('#sidepane-text')\n      // el will not exist if walk-through\n      if (el) el.remove()\n    }\n  }\n\n  const displayFunction = function() {\n    let s = '<div id=\"sidepane-menu\"'\n    if (title.width) s += ' style=\"width:' + title.width + 'px;top:100px;\"'\n    s += '>'\n\n    if (typeof title === 'string') {\n      s += '<p class=\"sidepane-menu-title\">' + io.showMenuDiagTitle + '</p>'\n    }\n    else {\n      s += '<h4 class=\"sidepane-menu-title\">' + io.showMenuDiagTitle.title + '</h4>'\n      s += '<p class=\"sidepane-menu-title\">' + io.showMenuDiagTitle.text + '</p>'\n    }\n    if (fn) s += '<input type=\"text\" id=\"text-dialog\" class=\"sidepane-menu-option\">'\n    if (io.showMenuDiagSubmit) {\n      s += '<div id=\"dialog-footer\" style=\"text-align:right\"><hr>'\n      s += '<input type=\"button\" onclick=\"io.textResponse()\" value=\"' + io.showMenuDiagSubmit + '\" class=\"sidepane-menu-button\"></div>'\n    }\n    s += '</div>'\n    document.querySelector('body').innerHTML += s\n\n\n    if (fn) {\n      const el = document.getElementById(\"text-dialog\")\n      el.addEventListener(\"keydown\", function(event) {\n        if (event.keyCode === 13) {\n          event.preventDefault();\n          io.textResponse()\n        }\n      })\n      el.focus()\n      io.menuFns.pop()\n    }\n  }\n\n  io.input(false, [], disableTextFunction, fn, displayFunction)\n\n  return world.SUCCESS_NO_TURNSCRIPTS\n}\n\n// This should be called after each turn to ensure we are at the end of the page and the text box has the focus\nexport function endTurnUI(update) {\n  if (!loc()) return errormsg(\"currentLocation not set (\" + (player() ? 'but player is' : 'nor is player') + \")\")\n  if (settings.panes !== 'none' && update) {\n    // set the lang.exit_list\n    for (let exit of lang.exit_list) {\n      const el = document.querySelector('#exit-' + exit.name)\n      if (!el) continue\n      if (loc().hasExit(exit.name, {excludeScenery:true}) || exit.type === 'nocmd') {\n        el.style.display = 'block'\n      }\n      else {\n        el.style.display = 'none'\n      }\n    }\n    io.updateStatus()\n  }\n  for (let o of io.modulesToUpdate) {\n    o.update(update)\n  }\n  io.updateUIItems()\n  if (settings.updateCustomUI) settings.updateCustomUI()\n\n  io.scrollToEnd()\n  // give focus to command bar\n  if (settings.textInput) { document.querySelector('#textbox').focus(); }\n}\n\nexport function createAdditionalPane(position, title, id, func) {\n  const el = document.querySelector(\"#panes\")\n\n  const div = document.createElement('div');\n  div.id = id + '-outer'\n  div.classList.add(\"pane-div\");\n  div.innerHTML = io.getSidePaneHeadingHTML(title) + '<div id=\"' + id + '\">' + func() + '</div>'\n  el.insertBefore(div, el.children[position])\n  settings.customPaneFunctions[id] = func\n}\n\n// ============  Hidden from creators!  =======================================\n\nexport const io = {\n\n  // Each line that is output is given an id, n plus an id number.\n  nextid:0,\n  // A list of names for items currently world. in the inventory panes\n  currentItemList:[],\n\n  modulesToUpdate:[],\n  modulesToInit:[],\n  modulesToDisable:[],\n  modulesToEnable:[],\n  spoken:false,\n  //False for normal function, true if things should be printed to the same paragraph\n  otnb:false,\n  sameLine:false,\n  slID:\"output\",\n  menuFns:[],\n  keydownFunctions:[],\n\n\n  escapeCodes:{\n    colon:':',\n    lcurly:'{',\n    rcurly:'}',\n    lsquare:'[',\n    rsquare:']',\n    vert:'|',\n    hash:'#',\n  },\n\n  menuFunctions:{\n    showMenu:showMenu,\n    showDropDown:showDropDown,\n    showMenuNumbersOnly:showMenuNumbersOnly,\n    showMenuWithNumbers:showMenuWithNumbers,\n    showMenuDiag:showMenuDiag,\n  },\n\n  showInTab:function(html, title = \"Quest JS Tab\") {\n    const path = location.protocol + '//' + location.pathname.replace('index.html', '')\n    const tab = window.open('about:blank', '_blank')\n    if (!tab) {\n      metamsg(lang.new_tab_failed)\n      return false\n    }\n\n    settings.loadCssFiles(tab.document, path)\n\n    const myScript = tab.document.createElement(\"script\")\n    myScript.setAttribute(\"src\", path + 'lib/_transcript.js')\n    tab.document.head.appendChild(myScript)\n    tab.document.body.innerHTML = html\n    tab.document.title = title\n    tab.document.head.setAttribute('data-favicon', settings.favicon)\n    tab.document.head.setAttribute('data-path', path)\n\n    const link = tab.document.createElement('link')\n    link.id = 'dynamic-favicon'\n    link.rel = 'shortcut icon'\n    link.href = path + settings.favicon\n    tab.document.head.appendChild(link)\n  },\n\n}\n\n// This is used by the various menu functions (not showMenuDiag).\nio.input = function(title, options, disableTextFunction, reactFunction, displayFunction, failFunction) {\n  // Store the values so we can use them later in io.menuResponse\n  io.menuStartId = io.nextid\n  io.menuFns.push(reactFunction)\n  io.menuFailFn = failFunction\n  io.menuOptions = options\n  io.disableTextFunction = disableTextFunction ? disableTextFunction : function(disable) {\n    if (disable) io.disable(3)\n    if (!disable) io.enable()\n  }\n\n  // Skip if unit-testing\n  if (test.testing) {\n    if (test.menuResponseNumber === undefined) {\n      debugmsg(\"Error when testing menu (possibly due to disambiguation?), test.menuResponseNumber = \" + test.menuResponseNumber)\n    }\n    else {\n      let n\n      if (Array.isArray(test.menuResponseNumber)) {\n        n = test.menuResponseNumber.shift()\n        if (test.menuResponseNumber.length === 0) {\n          delete test.menuResponseNumber\n        }\n      }\n      else {\n        n = test.menuResponseNumber\n        delete test.menuResponseNumber\n      }\n      // Sort out the menuResponseNumber before hand in case the response also\n      // uses it - we want it done before that\n      io.menuResponse(n)\n    }\n    return;\n  }\n\n  // Skip if walk-through\n  if (settings.walkthroughMenuResponses.length > 0) {\n    const response = settings.walkthroughMenuResponses.shift()\n    if (typeof response === 'number') {\n      io.menuResponse(response)\n    }\n    else {\n      io.textResponse(response)\n    }\n    return;\n  }\n\n  io.disableTextFunction(true)\n  if (title) msg(title, {}, 'menu-title');\n  displayFunction(options)\n}\n\n// The output system is quite complicated...\n// https://github.com/ThePix/QuestJS/wiki/The-Output-Queue\n\nio.outputQueue = []\nio.outputSuspended = false\n\n// Stops the current pause immediately (no effect if not paused)\nio.unpause = function() {\n  document.querySelector('.continue').remove()\n  io.textBecamesOld()\n  io.outputSuspended = false\n  io.outputFromQueue()\n  if (settings.textInput) document.querySelector('#textbox').focus();\n}\n\nio.addToOutputQueue = function(data) {\n  data.id = io.nextid\n  io.outputQueue.push(data)\n  io.nextid++\n  io.outputFromQueue()\n}\n\nio.forceOutputFromQueue = function() {\n  io.outputSuspended = false\n  io.outputFromQueue()\n}\n\nio.outputFromQueue = function() {\n  if (io.outputSuspended) return\n  if (io.outputQueue.length === 0) {\n    if (!io.disableTextFunction) io.enable()\n    return\n  }\n\n  //if (settings.textInput) document.querySelector('#input').style.display = 'block'\n  const data = io.outputQueue.shift()\n  if (data.action === 'wait' && (!settings.disableWaitInDevMode || settings.playMode !== 'dev')) {\n    io.disable()\n    io.outputSuspended = true\n    //if (settings.textInput) document.querySelector('#input').style.display = 'none'\n    data.tag = 'p'\n    data.onclick=\"io.unpause()\"\n    if (!data.text) data.text = lang.click_to_continue\n    io.print(data)\n  }\n  if (data.action === 'delay' && (!settings.disableWaitInDevMode || settings.playMode !== 'dev')) {\n    log('here')\n    io.disable()\n    io.outputSuspended = true\n    if (data.text) {\n      data.tag = 'p'\n      io.print(data)\n    }\n    setTimeout(io.unpause, data.delay * 1000)\n  }\n  if (data.action === 'output') {\n    const html = io.print(data)\n    io.speak(data.text);\n    saveLoad.transcriptAppend(data);\n    io.outputFromQueue()\n  }\n  if (data.action === 'func') {\n    if (data.func()) io.outputFromQueue()\n  }\n  if (data.action === 'effect') {\n    io.disable()\n    // need a way to handle spoken and transcript here\n    data.effect(data)\n  }\n  if (data.action === 'clear') {\n    document.querySelector('#output').textContent = \"\";\n    io.outputFromQueue()\n  }\n  if (data.action === 'sound') {\n    if (!settings.silent) {\n      const el = document.getElementById(data.name)\n      el.currentTime = 0\n      el.play()\n    }\n  }\n  if (data.action === 'ambient') {\n    for (let el of document.getElementsByTagName('audio')) el.pause()\n    if (!settings.silent && data.name) {\n      const el = document.getElementById(data.name)\n      el.currentTime = 0\n      el.loop = true\n      el.play()\n      if (data.volume) el.volume = data.volume / 10\n    }\n  }\n\n  io.scrollToEnd()\n  if (settings.textInput) document.querySelector('#textbox').focus()\n}\n\nio.allowedHtmlAttrs = ['width', 'height', 'onclick', 'src', 'autoplay' ]\n\nio.print = function(data) {\n  let html\n  let keepSL\n  let slID\n  if (typeof data === 'string') {\n    // noinspection JSUnusedAssignment\n      html = data\n  }\n\n  if (data.html) {\n    html = data.html\n  }\n  else if (!io.sameLine){\n    html = '<' + data.tag + ' id=\"n' + data.id + '\"'\n    if (data.cssClass) html += ' class=\"' + data.cssClass + '\"'\n    for (let s of io.allowedHtmlAttrs) if (data[s]) html += ' ' + s + '=\"' + data[s] + '\"'\n    html += '>' + data.text + \"</\" + data.tag + '>'\n  }\n  else {\n      html = data.text\n  }\n  if (data.destination) {\n    document.querySelector(\"#\" + data.destination).innerHTML = html\n  }\n  else {\n\n      let keepSL = (html.indexOf(\"@@OUTPUTTEXTNOBR@@\") > -1)\n      let slID = \"n\" + (data.id-1)\n      if(keepSL) {\n          html = html.replace(\"@@OUTPUTTEXTNOBR@@\", \"\");\n      }\n      if(io.sameLine) {\n        let last = document.getElementById(slID)\n        last.innerHTML = last.innerHTML + html\n        io.sameLine = false\n      }\n      else {\n        document.querySelector(\"#output\").innerHTML += html\n      }\n      io.sameLine = keepSL;\n\n  }\n\n  return html;\n}\n\nio.typewriterEffect = function(data) {\n  if (!data.position) {\n    document.querySelector(\"#output\").innerHTML += '<' + data.tag + ' id=\"n' + data.id + '\" class=\\\"typewriter\\\"></' + data.tag + '>'\n    data.position = 0\n    data.text = processText(data.text, data.params)\n  }\n  const el = document.querySelector('#n' + data.id)\n  el.innerHTML = data.text.slice(0, data.position) + \"<span class=\\\"typewriter-active\\\">\" + data.text.slice(data.position, data.position + 1) + \"</span>\"\n  data.position++\n  if (data.position <= data.text.length) {\n    io.outputQueue.unshift(data)\n    io.outputSuspended = true\n  }\n  setTimeout(io.forceOutputFromQueue, settings.textEffectDelay)\n}\n\nio.unscrambleEffect = function(data) {\n  // Set up the system\n  if (!data.count) {\n    document.querySelector(\"#output\").innerHTML += '<' + data.tag + ' id=\"n' + data.id + '\" class=\"typewriter\"></' + data.tag + '>'\n    data.count = 0\n    data.text = processText(data.text, data.params)\n    if (!data.pick) data.pick = io.unscamblePick\n    data.mask = ''\n    data.scrambled = ''\n    for (let i = 0; i < data.text.length; i++) {\n      if (data.text.charAt(i) === ' ' && !data.incSpaces) {\n        data.scrambled += ' '\n        data.mask += ' '\n      }\n      else {\n        data.scrambled += data.pick(i)\n        data.mask += 'x'\n        data.count++\n      }\n    }\n  }\n\n  if (data.randomPlacing) {\n    let pos = random.int(0, data.count - 1)\n    let newMask = ''\n    for (let i = 0; i < data.mask.length; i++) {\n      if (data.mask.charAt(i) === ' ') {\n        newMask += ' '\n      }\n      else if (pos === 0) {\n        newMask += ' '\n        pos--\n      }\n      else {\n        newMask += 'x'\n        pos--\n      }\n    }\n    data.mask = newMask\n  }\n  else {\n    data.mask = data.mask.replace('x', ' ')\n  }\n  data.count--\n  document.querySelector(\"#n\" + data.id).innerHTML = io.unscambleScramble(data)\n  if (data.count > 0) {\n    io.outputQueue.unshift(data)\n    io.outputSuspended = true\n  }\n  setTimeout(io.forceOutputFromQueue, settings.textEffectDelay)\n}\n\nio.unscamblePick = function() {\n  let c = String.fromCharCode(random.int(33, 125))\n  return c === '<' ? '~' : c\n}\n\nio.unscambleScramble = function(data) {\n  let s = ''\n  for (let i = 0; i < data.text.length; i++) {\n    s += (data.mask.charAt(i) === ' ' ? data.text.charAt(i) : data.pick(i))\n  }\n  return s\n}\n\nio.cmdlink = function(command, str) {\n  return `<a class=\"cmd-link\" onclick=\"runCmd('${command}')\">${str}</a>`;\n}\n\nio.setTitleAndInit = function(s) {\n  document.title = s\n  for (let o of io.modulesToInit) {\n    o.init()\n  }\n  io.calcMargins()\n}\n\nio.calcMargins = function() {\n  //How much space do we need for images and map?\n  let mapImageWidth = 0\n  if (typeof map !== 'undefined') {\n    if (!settings.hideMap) mapImageWidth = settings.mapWidth\n  }\n  if (typeof imagePane !== 'undefined') {\n    if (!settings.hideImagePane && settings.imageWidth > mapImageWidth) mapImageWidth = settings.imageWidth\n  }\n  document.querySelector('#main').style.marginLeft = '40px'\n  document.querySelector('#main').style.marginRight = '40px'\n\n  // Do we show the side panes?\n  if (settings.panes !== 'none') {\n    const margin = settings.panes === 'left' ? 'margin-left' : 'margin-right'\n    if (io.resizePanesListener.matches) { // If media query matches\n      // hide sidepane\n      document.querySelector('#main').style[margin] = (io.mainGutter) + 'px'\n      document.querySelector('#panes').style.display = 'none'\n    } else {\n      // show sidepane\n      document.querySelector('#main').style[margin] = (io.panesWidth + io.mainGutter) + 'px'\n      document.querySelector('#panes').style.display = 'block'\n    }\n  }\n\n  // Note: As of Jan/22 this takes account of settings.hideMap - but not of whether\n  // the image should be hidden\n  let margin = settings.panes === 'right' ? 'margin-left' : 'margin-right'\n  if (settings.mapImageSide) margin = settings.mapImageSide === 'left' ? 'margin-left' : 'margin-right'\n  if (io.resizeMapImageListener.matches || settings.hideMap) { // If media query matches\n    // hide image\n    document.querySelector('#main').style[margin] = io.mainGutter + 'px'\n    document.querySelector('#quest-image').style.display = 'none'\n    document.querySelector('#quest-map').style.display = 'none'\n  } else {\n    // show image\n    document.querySelector('#main').style[margin] = (mapImageWidth + io.mainGutter) + 'px'\n    document.querySelector('#quest-image').style.display = 'block'\n    document.querySelector('#quest-map').style.display = 'block'\n  }\n}\n\nio.mainGutter = 20\nio.panesWidth = 160\nio.resizePanesListener = window.matchMedia('(max-width: ' + settings.panesCollapseAt + 'px)')\nio.resizeMapImageListener = window.matchMedia('(max-width: ' + settings.mapAndImageCollapseAt + 'px)')\nio.resizePanesListener.addListener(io.calcMargins) // Attach listener function on state changes\nio.resizeMapImageListener.addListener(io.calcMargins) // Attach listener function on state changes\n\n// 0: not disabled at all\n// 1: disable until output is done\n// 2: awaiting special input, eg from menu, including text\n// 3: awaiting special input, eg from menu, excluding text\nio.disableLevel = 0\n\nio.disable = function(level) {\n  if (!level) level = 1\n  if (level <= io.disableLevel) return\n  io.disableLevel = level\n  if (level !== 2) document.querySelector('#input').style.display = 'none'\n  io.setCssByClass('compass-button .dark-body', 'color', '#808080')\n  io.setCssByClass('item', 'color', '#808080')\n  io.setCssByClass('item-action', 'color', '#808080')\n  for (let o of io.modulesToDisable) {\n    o.ioDisable(level)\n  }\n}\n\nio.enable = function() {\n  //log('enable (' + io.disableLevel + ')')\n  if (!io.disableLevel) return\n  io.disableLevel = 0\n  document.querySelector('#input').style.display = 'block'\n  if (settings.panes !== 'none') {\n    io.setCssByClass('compass-button .dark-body', 'color', io.textColour)\n    io.setCssByClass('item', 'color', io.textColour)\n    io.setCssByClass('item-action', 'color', io.textColour)\n  }\n  for (let o of io.modulesToEnable) {\n    o.ioEnable()\n  }\n}\n\n// Call this to reset the interface\n// Used when an input is not recognised and when an error is encountered\n// Ensures input is enabled\nio.reset = function() {\n  io.enable()\n  io.menuFns = []\n  io.keydownFunctions = []\n}\n\nio.startCommand = function() {\n  io.textBecamesOld()\n  // may want to do other stuff here\n}\n\nio.textBecamesOld = function() {\n  io.addClassForClass(\"default-p\", 'old-text')\n  io.addClassForClass(\"default-h\", 'old-text')\n  io.addClassForClass(\"meta\", 'old-text')\n  io.addClassForClass(\"parser\", 'old-text')\n  io.addClassForClass(\"error\", 'old-text')\n}\n\nio.addClassForClass = function(oldClass, newClass) {\n  const collection = document.getElementsByClassName(oldClass)\n  for (const el of collection) el.classList.add(newClass)\n}\n\nio.updateUIItems = function() {\n  if (settings.panes === 'none' || !settings.inventoryPane) { return; }\n\n  for (let inv of settings.inventoryPane) {\n    document.querySelector('#' + inv.alt).textContent = \"\"\n    inv.hasContent = false\n  }\n\n  io.currentItemList = [];\n  for (let key in w) {\n    const item = w[key];\n    for (let inv of settings.inventoryPane) {\n      const loc = inv.getLoc ? inv.getLoc() : null\n      if (inv.test(item) && !item.inventorySkip) {\n        io.appendItem(item, inv.alt, loc, false, inv.highlight ? inv.highlight(item) : 0);\n        inv.hasContent = true\n      }\n    }\n  }\n  if (settings.additionalInv) settings.additionalInv()\n  for (let inv of settings.inventoryPane) {\n    if (!inv.hasContent && inv.noContent) {\n      const s = processText(inv.noContent)\n      document.querySelector('#' + inv.alt).innerHTML = '<div class=\"item-nothing\">' + s + '</div>'\n    }\n  }\n  for (const key in settings.customPaneFunctions) {\n    const el = document.querySelector('#' + key)\n    if (!el) return\n      el.innerHTML = settings.customPaneFunctions[key]()\n  }\n  io.clickItem('')\n};\n\nio.updateStatus = function() {\n  if (settings.panes !== 'none' && settings.statusPane) {\n    //document.querySelector(\"#status-pane\").textContent = \"\"\n    let s = ''\n    for (let st of settings.status) {\n      if (typeof st === \"string\") {\n        if (player()[st] !== undefined) {\n          s += '<tr><td width=\"' + settings.statusWidthLeft + '\">' + sentenceCase(st) + \"</td>\"\n          s += '<td width=\"' + settings.statusWidthRight + '\">' + player()[st] + \"</td></tr>\"\n        }\n        else {\n          s += \"<tr>\" + processText(st) + \"</tr>\"\n        }\n      }\n      else if (typeof st === \"function\") {\n        s += \"<tr>\" + st() + \"</tr>\"\n      }\n    }\n    document.querySelector(\"#status-pane\").innerHTML = s\n  }\n\n  if (settings.toolbar) {\n    io.createToolbar()\n  }\n\n}\n\nio.menuResponse = function(n) {\n  let input = n\n  if (typeof n === 'string' && n.match(/^\\d+$/)) n = parseInt(n) - 1\n  if (typeof n === 'string') {\n    n = io.menuOptions.findIndex(el => typeof el === 'string' ? el.includes(n) : el.alias.includes(n) )\n  }\n\n  // stop disabling input\n  io.disableTextFunction(false)\n  delete io.disableTextFunction\n\n  // stop overriding the parser\n  parser.overrideWith()\n\n  // remove choices from screen\n  for (let i = io.menuStartId; i < io.nextid; i++) document.querySelector('#n' + i).remove()\n\n  // handle bad number\n  if (n === undefined || n >= io.menuOptions[n] || n === -1) {\n    io.menuFailFn(input)\n  }\n\n  // handle good number\n  else {\n    saveLoad.transcriptAppend({cssClass:'menu', text:(io.menuOptions[n].alias ? io.menuOptions[n].alias : io.menuOptions[n]), n:n});\n    const fn = io.menuFns.pop()\n    fn(io.menuOptions[n])\n  }\n  endTurnUI(true);\n  if (settings.textInput) document.querySelector('#textbox').focus()\n};\n\nio.textResponse = function(s) {\n  if (s === undefined) {\n    const el = document.querySelector('#text-dialog')\n    if (el) s = el.value\n  }\n  const el = document.querySelector('#sidepane-menu')\n  // in case walk-through\n  if (el) el.remove()\n\n  // stop disabling input\n  io.enable()\n\n  saveLoad.transcriptAppend({cssClass:'menu', text:s})\n  if (io.menuFns.length) {\n    const fn = io.menuFns.pop()\n    if (fn) fn(s)\n  }\n  endTurnUI(true);\n  if (settings.textInput) document.querySelector('#textbox').focus()\n}\n\n// Used by showMenuNumbersOnly to capture number presses and pass the right menu option to the parser\nio.keydownForMenuFunction = function(e) {\n  const n = parseInt(e.key)\n  if (!isNaN(n) && n <= io.menuOptions.length && n !== 0) {\n    io.menuResponse(n - 1)\n  }\n  // Just ignore other keypresses\n\n  // stopping the typed character appearing in the text field is not easy...\n  // stopPropagation and stopImmediatePropagation did not do it,\n  // even though it seems to happen after this\n  // so just delete it!\n  setTimeout(function() {\n    document.querySelector('#textbox').value = ''\n    document.querySelector('#textbox').focus()\n  }, 10)\n}\n\nio.clickItem = function(itemName) {\n  if (io.disableLevel) return\n  if (!itemName) return\n\n  const o = w[itemName]\n  if (o.sidebarButtonVerb) {\n    runCmd(o.sidebarButtonVerb + ' ' + w[itemName].alias)\n    return\n  }\n\n if (io.disableLevel) return;\n  // duplicated items would toggle twice\n  const uniq = [...new Set(io.currentItemList)];\n\n  for (let item of uniq) {\n    for (const el of document.querySelectorAll('.' + item + '-actions')) {\n      if (item === itemName) {\n        el.style.display = el.style.display === 'none' ? 'block' : 'none'\n      }\n      else {\n        el.style.display = 'none'\n      }\n    }\n  }\n};\n\nio.clickItemAction = function(itemName, action) {\n  if (io.disableLevel) return\n  const item = w[itemName];\n  const cmd = action.includes('%') ? action.replace('%', item.alias) : action + ' ' + item.alias\n  runCmd(cmd)\n}\n\n// Add the item to the DIV named htmlDiv\n// The item will be given verbs from its attName attribute\nio.appendItem = function(item, htmlDiv, loc, isSubItem, highlight) {\n  const el = document.querySelector('#' + htmlDiv)\n  io.currentItemList.push(item.name)\n\n  el.innerHTML += io.getItemHtml(item, loc, isSubItem, highlight)\n\n  if (item.container && !item.closed) {\n    if (typeof item.getContents !== 'function') {\n      log(\"WARNING: item flagged as container but no getContents function:\");\n      log(item);\n    }\n    const l = item.getContents(world.SIDE_PANE);\n    for (let el of l) {\n      io.appendItem(el, htmlDiv, item.name, true);\n    }\n  }\n}\n\nio.getItemHtml = function(item, loc, isSubItem, highlight) {\n  if (typeof item.getVerbs !== 'function') return errormsg(\"Item with bad getVerbs: \" + item.name)\n  const verbList = item.getVerbs(loc)\n  if (verbList === undefined) { errormsg(\"No verbs for \" + item.name); console.log(item); }\n\n  let s = '<div id=\"' + item.name + '-item\"><p class=\"item' + (isSubItem ? ' sub-item' : '') + (highlight ? ' highlight-item' + highlight : '') + '\" onclick=\"io.clickItem(\\'' + item.name + '\\')\">' + io.getIcon(item) + item.getListAlias(loc) + \"</p></div>\"\n  for (let verb of verbList) {\n    if (typeof verb === 'string') verb = {name:verb, action:verb}\n    s += '<div class=\"' + item.name + '-actions item-action'\n    if (verb.style) s += ' ' + verb.style\n    s += '\" onclick=\"io.clickItemAction(\\'' + item.name + '\\', \\'' + verb.action + '\\')\" style=\"display: none;\">';\n    s += verb.name;\n    s += '</div>';\n  }\n  return s\n}\n\n// Creates the panes on the left or right\n// Should only be called once, when the page is first built\nio.createPanes = function() {\n  io.panesWidth = document.querySelector('.side-panes').clientWidth\n};\n\nio.getSidePaneHeadingHTML = function(title) {\n  if (!title) return ''\n  const id = verbify(title) + '-side-pane-heading'\n  let s = '<h4 class=\"side-pane-heading\" id=' + id + '>' + title\n  if (settings.collapsibleSidePanes) {\n    s += ' <i class=\"fas fa-eye\" onclick=\"io._clickSidePaneHeading(\\'' + id + '\\')\"></i>'\n  }\n  s += '</h4>'\n  return s\n}\n\nio._clickSidePaneHeading = function(id) {\n  const el = document.querySelector(\"#\" + id).nextElementSibling\n  if (el.style.display === 'none') {\n    el.style.display = 'block'\n  }\n  else {\n    el.style.display = 'none'\n  }\n}\n\n\n// Gets the command with the given name\nio.getCommand = function(name) {\n    return commands.find(function (el) {\n      return el.name === name;\n  });\n};\n\nio.msgInputText = function(s) {\n  if (saveLoad.transcript && !s.match(lang.noWalkthroughRegex)) saveLoad.transcriptWalkthrough.push('    \"' + s + '\",')\n  if (!settings.cmdEcho || s === '') return\n  document.querySelector(\"#output\").innerHTML += '<p id=\"n' + io.nextid + '\" class=\"input-text\">&gt; ' + s + \"</p>\"\n  io.nextid++\n  io.speak(s, true)\n}\n\nio.savedCommands = ['help'];\nio.savedCommandsPos = 0;\n\n// Called from scriptOnLoad in _settings.js, if there are no more scripts to load\nio.init = function() {\n  settings.performanceLog('Start io.onload')\n  // io.createPanes();\n  if (settings.playMode === 'play') window.oncontextmenu = function () { return false }\n  document.querySelector(\"#fileDialog\").onchange = saveLoad.loadGameAsFile\n\n  document.addEventListener('keydown', function(event){\n    if (io.keydownFunctions.length) {\n      const fn = io.keydownFunctions.pop()\n      fn(event)\n      return\n    }\n    const keycode = (event.keyCode ? event.keyCode : event.which)\n    if (keycode === 13){\n      // enter\n      if (event.ctrlKey && (settings.playMode === 'dev' || settings.playMode === 'beta')) {\n        parser.parse(\"script show\")\n      }\n      else {\n        const s = document.querySelector('#textbox').value;\n        io.msgInputText(s);\n        if (s) {\n          if (io.savedCommands[io.savedCommands.length - 1] !== s && !io.doNotSaveInput) {\n            io.savedCommands.push(s)\n          }\n          io.savedCommandsPos = io.savedCommands.length;\n          parser.parse(s);\n          if (io.doNotEraseLastCommand) {\n            io.doNotEraseLastCommand = false\n          }\n          else {\n            document.querySelector('#textbox').value = ''\n          }\n        }\n      }\n    }\n    if (keycode === 38){\n      // up arrow\n      io.savedCommandsPos -= 1;\n      if (io.savedCommandsPos < 0) { io.savedCommandsPos = 0; }\n      document.querySelector('#textbox').value = io.savedCommands[io.savedCommandsPos]\n      // Get cursor to end of text\n      const el = document.querySelector('#textbox')\n      if (el.setSelectionRange) {\n        setTimeout(function() {el.setSelectionRange(9999, 9999); }, 0);\n      }\n      else if (typeof el.selectionStart == \"number\") {\n        el.selectionStart = el.selectionEnd = el.value.length;\n      }\n      else if (typeof el.createTextRange != \"undefined\") {\n        el.focus();\n        let range = el.createTextRange();\n        range.collapse(false);\n        range.select();\n      }\n    }\n    if (keycode === 40){\n      // down arrow\n      io.savedCommandsPos += 1;\n      if (io.savedCommandsPos >= io.savedCommands.length) { io.savedCommandsPos = io.savedCommands.length - 1; }\n      document.querySelector('#textbox').value = io.savedCommands[io.savedCommandsPos]\n    }\n    if (keycode === 27){\n      // ESC\n      document.querySelector('#textbox').value = ''\n    }\n    if (!io.disableLevel) {\n      // disable most special keys - all but the enter key\n      if (settings.customKeyResponses) {\n        if (settings.customKeyResponses(keycode, event)) return false\n      }\n      for (let exit of lang.exit_list) {\n        if (exit.key && exit.key === keycode) {\n          io.msgInputText(exit.name);\n          parser.parse(exit.name);\n          document.querySelector('#textbox').value = ''\n          event.stopPropagation();\n          event.preventDefault();\n          return false;\n        }\n      }\n      if (keycode === 123 && settings.playMode === 'play') return false\n      if (event.ctrlKey && event.shiftKey && keycode === 73 && settings.playMode === 'play') return false\n      if (event.ctrlKey && event.shiftKey && keycode === 74 && settings.playMode === 'play') return false\n\n      if (keycode === 96 && (settings.playMode === 'dev' || settings.playMode === 'beta')){\n        if (event.ctrlKey && event.altKey) {\n          parser.parse(\"wt b\")\n        }\n        else if (event.altKey) {\n          parser.parse(\"wt a\")\n        }\n        else if (event.ctrlKey) {\n          parser.parse(\"wt c\")\n        }\n        else {\n          parser.parse(\"test\")\n        }\n        setTimeout(function() { document.querySelector('#textbox').value = '' }, 1);\n      }\n      if (keycode === 90 && event.ctrlKey) {\n        parser.parse(\"undo\")\n      }\n    }\n  })\n  if (settings.panes !== 'none') io.textColour = document.querySelector(\".side-panes\").style.color\n  /*if (settings.soundFiles) {\n    const main = document.querySelector('#main')\n    for (let el of settings.soundFiles) {\n      main.innerHTML += '<audio id=\"' + el + '\" src=\"' + settings.soundsFolder + el + settings.soundsFileExt + '\"/>'\n    }\n  }*/\n  settings.performanceLog('UI built')\n  endTurnUI(true)\n  settings.performanceLog('endTurnUI completed')\n\n  if (document.querySelector('#loading')) document.querySelector('#loading').remove()\n  if (!settings.suppressTitle) msgHeading(settings.title, 2)\n  if (settings.subtitle) msgHeading(settings.subtitle, 3)\n  io.setTitleAndInit(settings.title)\n  if (settings.playMode === 'beta') lang.betaTestIntro()\n  settings.performanceLog('Title/intro printed')\n\n  if (settings.startingDialogEnabled) {\n    settings.setUpDialog()\n    setTimeout(function() {\n      if (settings.startingDialogInit) settings.startingDialogInit()\n    }, 10)\n  }\n  else {\n    if (settings.startingDialogAlt) settings.startingDialogAlt()\n    settings.delayStart = false\n    world.begin()\n  }\n  settings.performanceLog('End io.onload')\n}\n\nio.synth = window.speechSynthesis;\nio.voice = null;\nio.voice2 = null;\n\nio.speak = function(str, altVoice){\n  if (!io.spoken) return\n  if (!io.voice) {\n    io.voice = io.synth.getVoices().find(function(el) {\n      return /UK/.test(el.name) && /Female/.test(el.name);\n    });\n    if (!io.voice) io.voice = io.synth.getVoices()[0];\n  }\n  if (!io.voice2) {\n    io.voice2 = io.synth.getVoices().find(function(el) {\n      return /UK/.test(el.name) && /Male/.test(el.name);\n    });\n    if (!io.voice2) io.voice2 = io.synth.getVoices()[0];\n  }\n\n  const utterThis = new SpeechSynthesisUtterance(str);\n  utterThis.onend = function (event) {\n    //console.log('SpeechSynthesisUtterance.onend');\n  }\n  utterThis.onerror = function (event) {\n    //console.error('SpeechSynthesisUtterance.onerror: ' + event.name);\n  }\n  utterThis.voice = altVoice ? io.voice2 : io.voice;\n  // I think these can vary from 0 to 2\n  utterThis.pitch = 1;\n  utterThis.rate = 1;\n  io.synth.speak(utterThis);\n};\n\nio.dialogShowing = false;\n//@DOC\n// Appends an HTML DIV, with the given title and content,\n// and shows it as a dialog. Used by the transcript\n// (and really only useful for displaying data).\nio.showHtml = function(title, html) {\n  if (io.dialogShowing) return false;\n  document.querySelector('body').innerHTML += '<div id=\"showHtml\" title=\"' + title + '\">' + html + '</div>'\n  io.dialogShowing = true;\n  document.querySelector(\"#showHtml\").dialog({\n    width: 860,\n    close:function() { document.querySelector(\"#showHtml\").remove(); io.dialogShowing = false; },\n  });\n  return true;\n}\n\nio.finish = function(giveOptions) {\n  settings.finished = {\n    textInput:settings.textInput,\n    inputDisplay:document.querySelector('#input').style.display,\n  }\n  io.finished = true\n  settings.textInput = false\n  document.querySelector('#input').style.display = 'none'\n  if (settings.panes !== 'none') {\n    for (const el of document.querySelectorAll('.pane-div')) {\n      el.style.display = 'none'\n    }\n    document.querySelector('.pane-div-finished').style.display = 'block'\n  }\n  for (const el of settings.afterFinish) el()\n  if (settings.finishMetaComment) metamsg(settings.finishMetaComment)\n  if (saveLoad.transcriptExists()) metamsg(lang.transcript_finish)\n  if (giveOptions) metamsg(lang.finish_options)\n}\n\nio.unfinish = function() {\n  settings.finished = {\n    textInput:settings.textInput,\n    inputDisplay:document.querySelector('#input').style.display,\n  }\n  io.finished = false\n  settings.textInput = settings.finished.textInput\n  document.querySelector('#input').style.display = settings.finished.inputDisplay\n  if (settings.panes !== 'none') {\n    for (const el of document.querySelectorAll('.pane-div')) {\n      el.style.display = 'block'\n    }\n    document.querySelector('.pane-div-finished').style.display = 'none'\n  }\n  settings.finished = false\n}\n\nio.toggleDarkMode = function() {\n  settings.darkModeActive = !settings.darkModeActive\n  if (settings.darkModeActive) {\n    document.querySelector('body').classList.add(\"dark-body\")\n  }\n  else {\n    document.querySelector('body').classList.remove(\"dark-body\")\n  }\n  if (settings.afterDarkToggle) settings.afterDarkToggle()\n  if (settings.panes !== 'none') io.textColour = document.querySelector(\".side-panes\").style.color\n  metamsg(lang.done_msg)\n  return world.SUCCESS_NO_TURNSCRIPTS\n}\n\nio.toggleAutoScrollMode = function() {\n  settings.autoscroll = !settings.autoscroll\n  if (settings.afterAutoScrollToggle) settings.afterAutoScrollToggle()\n  metamsg(lang.done_msg)\n  return world.SUCCESS_NO_TURNSCRIPTS\n}\n\nio.toggleNarrowMode = function() {\n  settings.narrowMode = (settings.narrowMode + 1) % 3\n  document.querySelector('body').classList.remove(\"narrow-body\")\n  document.querySelector('body').classList.remove(\"very-narrow-body\")\n  if (settings.narrowMode === 1) document.querySelector('body').classList.add(\"narrow-body\")\n  if (settings.narrowMode === 2) document.querySelector('body').classList.add(\"very-narrow-body\")\n  if (settings.afterNarrowChange) settings.afterNarrowChange()\n  metamsg(lang.done_msg)\n  return world.SUCCESS_NO_TURNSCRIPTS\n}\n\nio.togglePlainFontMode = function() {\n  settings.plainFontModeActive = !settings.plainFontModeActive\n  if (settings.plainFontModeActive) {\n    document.querySelector('body').classList.add(\"plain-font-body\")\n  }\n  else {\n    document.querySelector('body').classList.remove(\"plain-font-body\")\n  }\n  if (settings.afterPlainFontToggle) settings.afterPlainFontToggle()\n  metamsg(lang.done_msg)\n  return world.SUCCESS_NO_TURNSCRIPTS\n}\n\n// If the element starts off displayed, you will probably needs to explicitly set display to block for it\n// otherwise this will assume it is not\nio.toggleDisplay = function(el) {\n  if (typeof el === 'string') el = document.querySelector(el)\n  el.style.display = el.style.display === 'block' ? 'none' : 'block'\n}\n\nio.copyTextToClipboard = function(text) {\n  // from: https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript\n  const textArea = document.createElement(\"textarea\")\n  // Place in top-left corner of screen regardless of scroll position.\n  textArea.style.position = 'fixed';\n  textArea.style.top = '0';\n  textArea.style.left = '0';\n\n  // Styling just in case it gets displayed to make is as unobstrusive as possible\n  textArea.style.width = '2em';\n  textArea.style.height = '2em';\n  textArea.style.padding = '0';\n  textArea.style.border = 'none';\n  textArea.style.outline = 'none';\n  textArea.style.boxShadow = 'none';\n  textArea.style.background = 'transparent';\n\n  textArea.value = text;\n  document.body.appendChild(textArea);\n  textArea.focus();\n  textArea.select();\n\n  try {\n    const successful = document.execCommand('copy');\n    metamsg('Copying text command was ' + (successful ? 'successful' : 'unsuccessful'));\n  } catch (err) {\n    metamsg('Oops, unable to copy');\n  }\n\n  document.body.removeChild(textArea);\n}\n\nio.getIcon = function(item) {\n  if (settings.iconsFolder === false) return ''\n  if (!item.icon) return ''\n  if (item.icon() === '') return ''\n  return '<img src=\"' + settings.iconsFolder + (settings.darkModeActive ? 'l_' : 'd_') + item.icon() + '.png\"  alt=\"Icon\"/>'\n}\n\nio.againOrOops = function(isAgain) {\n  if (io.savedCommands.length === 0) {\n    metamsg(lang.again_not_available)\n    return world.FAILED\n  }\n  io.savedCommands.pop() // do not save AGAIN/OOPS\n  if (isAgain) {\n    parser.parse(io.savedCommands[io.savedCommands.length - 1])\n  }\n  else {\n    document.querySelector('#textbox').value = io.savedCommands[io.savedCommands.length - 1]\n    io.doNotEraseLastCommand = true\n  }\n  return world.SUCCESS_NO_TURNSCRIPTS;\n}\n\nio.setCssByClass = function(name, prop, val) {\n  for (const el of document.querySelectorAll('.' + name)) el.style[prop] = val\n}\n\n// Display Icons for compass\nio.compassIcon = function(exit) {\n    if (!settings.useCompassIcons) {\n        return exit.abbrev;\n    }\n  const transform = exit.rotate ? ' style=\"transform: rotate(40deg)\"' : ''\n  return '<i class=\"fas ' + exit.symbol + '\"' + transform + '></i>';\n}\n\nio.scrollToEnd = function() {\n  if (settings.autoscroll) window.scrollTo(0,document.getElementById('main').scrollHeight);\n}\n\nio.getDropDownText = function(name) {\n  const el = document.querySelector('#' + name)\n  return el.options[el.selectedIndex].text\n}\n\n// Create Toolbar\nio.createToolbar = function() {\n  let el = document.querySelector(\"#toolbar\")\n  if (!el) {\n    const div = document.createElement('div')\n    div.setAttribute(\"id\", \"toolbar\")\n    //div.classList.add('button')\n    div.classList.add('toolbar')\n    document.querySelector(\"body\").insertBefore(div, document.querySelector(\"#main\"))\n    el = document.querySelector(\"#toolbar\")\n    document.querySelector(\"#main\").style.paddingTop = '30px'\n    document.querySelector(\"#panes\").style.top = '36px'\n  }\n\n  let html = \"\";\n  html += '<div class=\"left\">' + io.getToolbarHTML(settings.toolbar[0]) + '</div>'\n  html += '<div class=\"middle\">' + io.getToolbarHTML(settings.toolbar[1]) + '</div>'\n  html += '<div class=\"right\">' + io.getToolbarHTML(settings.toolbar[2]) + '</div>'\n  el.innerHTML = html\n}\n\nio.getToolbarHTML = function(data = {}) {\n  if (data.room) return sentenceCase(lang.getName(w[player().loc], { article:DEFINITE }))\n  if (data.title) return '<b><i>' + settings.title + '</i></b>'\n  if (data.content) return data.content()\n  if (data.buttons) {\n    let s = ''\n    for (let el of data.buttons) {\n      const js = el.cmd ? \"runCmd('\" + el.cmd + \"')\" : el.onclick\n      s += ` <a class=\"link\" onclick=\"if (!io.disableLevel)${js}\"><i class=\"fas ${el.icon}\" title=\"${el.title}\"></i></a>`;\n    }\n    return s\n  }\n  return ''\n}\n\nio.focus = function(el) {\n  if (typeof el === 'string') el = document.querySelector('#' + el)\n  if (el !== document.activeElement) el.focus()\n}\n\nio.showHintSheet = function() {\n  let html = '<div id=\"main\"><div id=\"inner\"><div id=\"output\"><h2 class=\"default-h default-h2\">' + lang.hintSheet + '</h2>'\n  html += \"<p class=\\\"default-p\\\">\" + lang.hintSheetIntro + \"</p>\"\n\n  const words = []\n  for (const el of settings.hintSheetData) words.push(...el.a.split(' '))\n  const uniqueWords = [...new Set(words)].sort()\n\n  for (const el of settings.hintSheetData) {\n    html += \"<p class=\\\"default-p\\\"><i>\" + el.q + '</i>&nbsp;&nbsp;&nbsp; ' + io.encodeWords(el.a, uniqueWords) + \"</p>\"\n  }\n\n  html += \"<hr/><table><tr>\"\n\n  for (let i = 0; i < uniqueWords.length; i++) {\n    html += \"<td>\" + i + \" - \" + uniqueWords[i] + \"</td>\"\n\n    if (i % 6 === 5) html += \"</tr><tr>\"\n  }\n\n  html += '</tr><table></div></div></div>'\n  io.showInTab(html, lang.hintSheet)\n}\n\nio.encodeWords = function(s, words) {\n  const numbers = []\n  for (const word of s.split(' ')) numbers.push(words.indexOf(word))\n  return numbers.map(el => '' + el).join(' ')\n}\n","// noinspection JSUnusedGlobalSymbols\n\n\"use strict\";\n\nimport {\n    errormsg, failedmsg, falsemsg, metamsg, printOrRun,\n    sentenceCase, player, loc,\n    lang, parser, world, w, settings, commands, game\n} from '../index.js';\n\n// Should all be language neutral (except the inspect function, which is just for debugging)\n\nexport class Cmd {\n  constructor(name, hash) {\n    this.name = name\n    this.objects = []\n    this.rules = []\n    for (let key in hash) this[key] = hash[key]\n\n    this.attName = this.attName ? this.attName : this.name.toLowerCase()\n    for (let key in this.objects) {\n      if (!this.objects[key].attName) this.objects[key].attName = this.attName\n    }\n    if (!this.regex && !this.regexes) {\n      this.regexes = Array.isArray(lang.regex[this.name]) ? lang.regex[this.name] : [lang.regex[this.name]]\n    }\n    if (this.withScript) this.script = this.scriptWith\n    commands.push(this)\n  }\n\n\n  default(options) { falsemsg(this.defmsg, options) }\n\n  // Is this command a match at the most basic level (ignoring items, etc)\n  // Also resets the command\n  _test(s) {\n    if (!Array.isArray(this.regexes)) console.log(this)  // it will crash in the next line!\n    for (let regex of this.regexes) {\n      if (regex instanceof RegExp) {\n        if (regex.test(s)) {\n          this.tmp = {regex:regex, mod:{}}\n          return true\n        }\n      }\n      else {\n        if (regex.regex.test(s)) {\n          this.tmp = {regex:regex.regex, mod:regex.mod}\n          return true\n        }\n      }\n    }\n    this.tmp = { score: parser.NO_MATCH }\n    return false\n  }\n\n  // A command can have an array of regexs, \"antiRegexes\" that will stop the command getting matched\n  _testNot(s) {\n    if (!Array.isArray(this.antiRegexes)) return true\n    for (let regex of this.antiRegexes) {\n      if (regex instanceof RegExp) {\n        if (regex.test(s)) {\n          return false\n        }\n      }\n      else {\n        if (regex.regex.test(s)) {\n          return false\n        }\n      }\n    }\n    return true\n  }\n\n\n  // We want to see if this command is a good match to the string\n  // This will involve trying to matching objects, according to the\n  // values in the command\n  //\n  // The results go in an attribute, tmp, that should have alreadsy been set by test,\n  // and is a dictionary containing:\n  //\n  // objectTexts - the matched object names from the player input\n  // objects - the matched objects (lists of lists ready to be disabiguated)\n  // score - a rating of how good the match is\n  // error - a string to report why it failed, if it did!\n  //\n  // objects will be an array for each object role (so PUT HAT IN BOX is two),\n  // of arrays for each object listed (so GET HAT, TEAPOT AND GUN is three),\n  // of possible object matches (so GET HAT is four if there are four hats in the room)\n  //\n  // score is a rating for how well this command matches, based on the score attribute\n  // of the command itself (defaults to 10); if zero or less, this is an error\n  //\n  // If this does give an error, it is only reported if no command is a success\n  //\n  // The parameter mod allows us to change how this is done, eg if the nouns are reversed\n  // and will have been set in test\n  matchItems(s) {\n    if (!this._test(s)) return\n    if (!this._testNot(s)) return\n\n\n    parser.msg(\"---------------------------------------------------------\");\n    parser.msg(\"* Looking at candidate: \" + this.name);\n\n    // this is a temporary set of data used while we parser one input\n    this.tmp.objectTexts = [];\n    this.tmp.objects = [];\n    this.tmp.score = this.score ? this.score : 10\n    this.tmp.error = undefined\n\n    // Array of item positions corresponding to capture groups in the regex\n    let arr = this.tmp.regex.exec(s)\n    arr.shift()  // first element is the whole match, so discard\n    if (this.tmp.mod.reverse) arr = arr.reverse()\n    if (this.tmp.mod.reverseNotFirst) {\n      const first = arr.shift()\n      arr = arr.reverse()\n      arr.unshift(first)\n    }\n    if (this.tmp.mod.func) arr = this.tmp.mod.func(arr)\n\n    parser.msg(\"..Base score: \" + this.tmp.score);\n\n    for (let i = 0; i < arr.length; i++) {\n      const cmdParams = this.objects[i]\n      if (!cmdParams) {\n        errormsg(\"The command \\\"\" + this.name + \"\\\" seems to have an error. It has more capture groups than there are elements in the 'objects' attribute.\", true)\n        return false\n      }\n      if (arr[i] === undefined) {\n        errormsg(\"The command \\\"\" + this.name + \"\\\" seems to have an error. It has captured undefined. This is probably an issue with the command's regular expression.\", true)\n        return false\n      }\n      let score = 0;\n      this.tmp.objectTexts.push(arr[i])\n\n      if (cmdParams.special) {\n        // this capture group has been flagged to be special\n        const specialError = parser.specialText[cmdParams.special].error(arr[i], cmdParams)\n        if (specialError) return this.setError(parser.BAD_SPECIAL, specialError)\n        const special = parser.specialText[cmdParams.special].exec(arr[i], cmdParams)\n        if (special !== false) this.tmp.objects.push(special)\n        score = 1\n        if (special.name) {\n          parser.msg(\"-> special match object found: \" + special.name)\n        }\n        else {\n          parser.msg(\"-> special match found: \" + special)\n        }\n      }\n\n      else if (lang.all_regex.test(arr[i]) || lang.all_exclude_regex.test(arr[i])) {\n        // Handle ALL and ALL BUT\n        this.tmp.all = true\n        if (!cmdParams.multiple) return this.setError(parser.DISALLOWED_MULTIPLE, lang.no_multiples_msg)\n        if (!cmdParams.scope) console.log(\"WARNING: Command without scope - \" + this.name)\n\n        let scope = parser.getScope(cmdParams)\n        let exclude = [player()];\n\n        // anything flagged as scenery should be excluded\n        for (let item of scope) {\n          if (item.scenery || item.excludeFromAll) exclude.push(item)\n        }\n\n        if (lang.all_exclude_regex.test(arr[i])) {\n          // if this is ALL BUT we need to remove some things from the list\n          // excludes must be in isVisible\n          // if it is ambiguous or not recognised it does not get added to the list\n          let s = arr[i].replace(lang.all_exclude_regex, \"\").trim();\n          const objectNames = s.split(lang.joiner_regex).map(function(el){ return el.trim(); });\n          for (let s in objectNames) {\n            const items = parser.findInList(s, world.scope);\n            if (items.length === 1) exclude.push(items[0])\n          }\n        }\n        scope = scope.filter(el => !exclude.includes(el))\n        if (scope.length > 1 && !cmdParams.multiple) return this.setError(parser.DISALLOWED_MULTIPLE, lang.no_multiples_msg)\n        if (scope.length === 0) return this.setError(parser.NONE_FOR_ALL, this.nothingForAll ? this.nothingForAll : lang.nothing_msg)\n        score = 2\n        this.tmp.objects.push(scope.map(el => [el]))\n      }\n\n      else {\n        if (!cmdParams.scope) {\n          console.warn(\"No scope found in command. This may be because the scope specified does not exist; check the spelling. The command in question is:\")\n          log(this)\n          parser.msg(\"ERROR: No scope\")\n          return null\n        }\n        const scope = parser.getScopes(cmdParams)\n        parser.matchToNames(arr[i], scope, cmdParams, this.tmp)\n        if (this.tmp.score === parser.NO_OBJECT) {\n          this.tmp.error = this.noobjecterror(this.tmp.error_s, i)\n          if (this.objects.length > 1) this.tmp.score += 10\n          parser.msg(\"Result score is (no object): \" + this.tmp.score)\n          return\n        }\n      }\n      parser.msg(\"...Adding to the score: \" + score)\n      parser.msg(\"Result score is: \" + this.tmp.score)\n      this.tmp.score += score\n    }\n  }\n\n\n  // If this has multiple parts the error probably takes priority\n  // GET STUFF -> assume item\n  // FILL JUG WITH WATER -> assume fluid\n  setError(score, msg) {\n    this.tmp.error = msg\n    this.tmp.score = score\n    if (this.objects.length > 1) this.tmp.score += 10\n    parser.msg(\"Match failed: \" + this.tmp.score + \" (\" + msg + \")\")\n  }\n\n\n\n  // This is the default script for commands\n  // Assumes objects is:\n  // optionally the verb, a string\n  // an array of objects - each object will have the attribute indicated by attName called\n  // optionally an array of one object\n  script(objects) {\n    let success = false;\n    let suppressEndturn = false\n    let verb\n    if (typeof objects[0] === 'string') verb = objects.shift()\n    let secondItem\n    if (objects.length > 1) secondItem = objects[1][0]\n    const multiple = objects[0] && (objects[0].length > 1 || parser.currentCommand.all)\n    if (objects[0].length === 0) {\n      metamsg(lang.nothing_msg)\n      return world.FAILED;\n    }\n    for (let i = 0; i < objects[0].length; i++) {\n      const options = {multiple:multiple, verb:verb, char:player(), item:objects[0][i], secondItem:secondItem}\n      const obj = objects[0][i]\n      if (!obj[this.attName + '_count']) obj[this.attName + '_count'] = 0\n      if (!obj[this.attName]) {\n        this.default(options)\n      }\n      else {\n        let result = this.processCommand(options);\n        if (result === world.SUCCESS_NO_TURNSCRIPTS) {\n          suppressEndturn = true;\n          result = true;\n        }\n        if (result) obj[this.attName + '_count']++\n        success = result || success;\n      }\n    }\n    if (success) {\n      return (this.noTurnscripts || suppressEndturn ? world.SUCCESS_NO_TURNSCRIPTS : world.SUCCESS);\n    }\n    else {\n      return world.FAILED;\n    }\n  }\n\n\n  // This is the second script for commands\n  // Assumes a verb and two objects; the verb may or may not be the first object\n  scriptWith(objects) {\n    let success = false;\n    let suppressEndturn = false\n    let verb\n    if (objects.length > 2) verb = objects.shift()\n    const multiple = objects[0] && (objects[0].length > 1 || parser.currentCommand.all)\n    if (objects[0].length === 0) {\n      metamsg(lang.nothing_msg)\n      return world.FAILED;\n    }\n    for (let i = 0; i < objects[0].length; i++) {\n      const options = {multiple:multiple, verb:verb, char:player(), item:objects[0][i], with:objects[1][0]}\n      if (!objects[0][i][this.attName]) {\n        this.default(options)\n      }\n      else {\n        let result = this.processCommand(options);\n        if (result === world.SUCCESS_NO_TURNSCRIPTS) {\n          suppressEndturn = true;\n          result = true;\n        }\n        success = result || success;\n      }\n    }\n    if (success) {\n      return (this.noTurnscripts || suppressEndturn ? world.SUCCESS_NO_TURNSCRIPTS : world.SUCCESS);\n    }\n    else {\n      return world.FAILED;\n    }\n  }\n\n  processCommand(options) {\n    for (let rule of this.rules) {\n      if (typeof rule !== \"function\") {\n        errormsg(\"Failed to process command '\" + this.name + \"' as one of its rules is not a function.\")\n        console.log (this)\n        console.log (rule)\n      }\n      if (!rule(this, options)) return false\n    }\n    let result = printOrRun(options.char, options.item, this.attName, options);\n    if (typeof result !== \"boolean\" && result !== world.SUCCESS_NO_TURNSCRIPTS) {\n      // Assume the author wants to return true from the verb\n      result = true;\n    }\n    return result;\n  };\n\n  noobjecterror(s) {\n    return lang.object_unknown_msg(s)\n  }\n\n\n}\n\n// Use only for NPC commands that you are not giving your\n// own custom script attribute. Commands must be an order to a single\n// NPC in the form verb-object.\nexport class NpcCmd extends Cmd {\n  constructor(name, hash) {\n    super(name, hash)\n    if (!this.cmdCategory) this.cmdCategory = name\n  }\n\n  script(objects) {\n    const npc = objects[0][0];\n    if (!npc.npc) {\n      failedmsg(lang.not_npc, {char:player(), item:npc})\n      return world.FAILED\n    }\n    let success = false, handled;\n    if (objects.length !== 2) {\n      errormsg(\"The command \" + name + \" is trying to use a facility for NPCs to do it, but there is no object list; this facility is only for commands in the form verb-object.\")\n      return world.FAILED\n    }\n    const multiple = (objects[1].length > 1 || parser.currentCommand.all)\n    for (let obj of objects[1]) {\n      const options = {multiple:multiple, char:npc, item:obj}\n      if (!npc.getAgreement(this.cmdCategory, {item:obj, cmd:this})) continue\n      if (!obj[this.attName]) {\n        this.default(options)\n      }\n      else {\n        let result = this.processCommand({multiple:multiple, char:npc, item:obj})\n        if (result === world.SUCCESS_NO_TURNSCRIPTS) {\n          result = true;\n        }\n        success = result || success\n      }\n    }\n    if (success) {\n      npc.pause()\n      return (this.noTurnscripts ? world.SUCCESS_NO_TURNSCRIPTS : world.SUCCESS)\n    }\n    else {\n      return world.FAILED\n    }\n  }\n}\n\nexport class ExitCmd extends Cmd {\n  constructor(name, dir, hash) {\n    super(name, hash)\n    this.exitCmd = true\n    this.dir = dir\n    this.objects = [{special:'ignore'}, {special:'ignore'}, ]\n  }\n\n  script(objects) {\n    if (!loc().hasExit(this.dir)) {\n      const exitObj = lang.exit_list.find(el => el.name === this.dir )\n      if (exitObj.not_that_way) return failedmsg(exitObj.not_that_way, {char:player(), dir:this.dir})\n      if (settings.customNoExitMsg) return failedmsg(settings.customNoExitMsg(player(), this.dir))\n      return failedmsg(lang.not_that_way, {char:player(), dir:this.dir})\n    }\n    else {\n      const ex = loc().getExit(this.dir);\n      if (typeof ex === \"object\"){\n        if (!player().testMove(ex)) {\n          return world.FAILED\n        }\n        if (typeof ex.use !== 'function') {\n          errormsg(\"Exit's 'use' attribute is not a function (or does not exist).\")\n          console.log(\"Bad exit:\")\n          console.log(ex)\n          return world.FAILED\n        }\n        const flag = ex.use(player(), ex)\n        if (typeof flag !== \"boolean\") {\n          console.warn(\"Exit on \" + loc().name + \" failed to return a Boolean value, indicating success or failure; assuming success\")\n          return world.SUCCESS\n        }\n        if (flag && ex.extraTime) game.elapsedTime += ex.extraTime\n        return flag ? world.SUCCESS : world.FAILED\n      }\n      else {\n        errormsg(\"Unsupported type for direction\")\n        return world.FAILED\n      }\n    }\n  }\n}\n\nexport class NpcExitCmd extends Cmd {\n  constructor(name, dir, hash) {\n    super(name, hash)\n    this.exitCmd = true\n    this.dir = dir\n    this.objects = [{scope:parser.isHere, attName:\"npc\"}, {special:'ignore'}, {special:'ignore'}, ]\n  }\n\n  script(objects) {\n    const npc = objects[0][0]\n    if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n    if (!loc().hasExit(this.dir)) {\n      const exitObj = lang.exit_list.find(el => el.name === this.dir )\n      if (exitObj.not_that_way) return failedmsg(exitObj.not_that_way, {char:npc, dir:this.dir})\n      return failedmsg(lang.not_that_way, {char:npc, dir:this.dir})\n    }\n\n    const ex = loc().getExit(this.dir)\n    if (typeof ex !== \"object\"){\n      errormsg(\"Unsupported type for direction\")\n      return world.FAILED\n    }\n\n    if (npc.testMove && !npc.testMove(ex)) return world.FAILED\n    if (!npc.getAgreement(\"Go\", {exit:ex})) return world.FAILED\n\n    const flag = ex.use(npc, ex)\n    if (flag) npc.pause()\n    return flag ? world.SUCCESS : world.FAILED;\n  }\n}\n\n  // Should be called during the initialisation process\nexport function initCommands() {\n    // #todo - clarify why contents of collection newCmds are updated, but never queried\n  // noinspection JSMismatchedCollectionQueryUpdate\n    const newCmds = [];\n  for (let el of commands) {\n    if (!el.regexes) {\n      el.regexes = [el.regex]\n    }\n    if (el.npcCmd) {\n      if (!Array.isArray(el.regexes)) console.log(el)\n      //console.log(\"creating NPC command for \" + el.name)\n      const regexAsStr = el.regexes[0].source.substr(1);  // lose the ^ at the start, as we will prepend to it\n      const objects = el.objects.slice();\n      objects.unshift({scope:parser.isHere, attName:\"npc\"});\n\n      const data = {\n        objects:objects,\n        attName:el.attName,\n        default:el.default,\n        defmsg:el.defmsg,\n        rules:el.rules,\n        score:el.score,\n        cmdCategory:el.cmdCategory ? el.cmdCategory : el.name,\n        forNpc:true,\n      };\n\n      const cmd = new NpcCmd(\"Npc\" + el.name, data)\n      cmd.regexes = []\n      for (let key in lang.tell_to_prefixes) {\n        cmd.regexes.push(new RegExp(\"^\" + lang.tell_to_prefixes[key] + regexAsStr))\n      }\n      if (el.useThisScriptForNpcs) cmd.script = el.script\n      cmd.scope = []\n      for (let el2 of el.objects) {\n        cmd.scope.push(el2 === parser.isHeld ? parser.isHeldByNpc : el2)\n        cmd.scope.push(el2 === parser.isWorn ? parser.isWornByNpc : el2)\n      }\n      newCmds.push(cmd)\n    }\n  }\n\n  //commands.push.apply(commands, newCmds); ?????\n\n  for (let el of lang.exit_list) {\n    if (el.type !== 'nocmd') {\n      let regex = \"(\" + lang.go_pre_regex + \")(\" + el.name + \"|\" + el.abbrev.toLowerCase()\n      if (el.alt) { regex += \"|\" + el.alt; }\n      regex += \")$\";\n      new ExitCmd(\"Go\" + sentenceCase(el.name), el.name, { regexes:[new RegExp(\"^\" + regex)] })\n\n      const regexes = []\n      for (let key in lang.tell_to_prefixes) {\n        regexes.push(new RegExp(\"^\" + lang.tell_to_prefixes[key] + regex))\n      }\n      new NpcExitCmd(\"NpcGo\" + sentenceCase(el.name) + \"2\", el.name, { regexes:regexes })\n    }\n  }\n}\n\n// Useful in a command's script when handling NPCs as well as the player\nexport function extractChar(cmd, objects) {\n  let char;\n  if (cmd.forNpc) {\n    char = objects[0][0];\n    if (!char.npc) {\n      failedmsg(lang.not_npc, {char:player(), item:char});\n      return world.FAILED;\n    }\n    objects.shift();\n  }\n  else {\n    char = player();\n  }\n  return char\n}\n\nexport function findCmd(name) {\n  return commands.find(el => el.name === name)\n}\n\nexport function testCmd(name, s) {\n  const cmd = findCmd(name)\n  cmd.matchItems(s)\n  log(cmd.tmp)\n  metamsg(\"See results in console (F12)\")\n}\n\nexport const cmdRules = {};\n\n// Item's location is the char and it is not worn\ncmdRules.isHeldNotWorn = function(cmd, options) {\n  if (!options.item.getWorn() && options.item.isAtLoc(options.char.name, world.PARSER)) return true\n\n  if (options.item.isAtLoc(options.char.name, world.PARSER)) return falsemsg(lang.already_wearing, options)\n\n  if (options.item.loc) {\n    options.holder = w[options.item.loc]\n    if (options.holder.npc || options.holder.player) return falsemsg(lang.char_has_it, options)\n  }\n\n  return falsemsg(lang.not_carrying, options)\n}\n\n// Item's location is the char and it is worn\ncmdRules.isWorn = function(cmd, options) {\n  if (options.item.getWorn() && options.item.isAtLoc(options.char.name, world.PARSER)) return true\n\n  if (options.item.isAtLoc(options.char.name, world.PARSER)) return falsemsg(lang.not_wearing, options)\n\n  if (options.item.loc) {\n    options.holder = w[options.item.loc];\n    if (options.holder.npc || options.holder.player) return falsemsg(lang.char_has_it, options)\n  }\n\n  return falsemsg(lang.not_carrying, options)\n}\n\n// Item's location is the char\ncmdRules.isHeld = function(cmd, options) {\n  if (options.item.isAtLoc(options.char.name, world.PARSER)) return true\n\n  if (options.item.loc) {\n    options.holder = w[options.item.loc]\n    if (options.holder.npc || options.holder.player) return falsemsg(lang.char_has_it, options)\n  }\n\n  return falsemsg(lang.not_carrying, options)\n}\n\n// Item's location is the char's location or the char\n// or item is reachable, but not held by someone else\ncmdRules.isPresent = function(cmd, options) {\n  if (options.item.isAtLoc(options.char.loc, world.PARSER)) return true\n  if (options.item.isAtLoc(options.char.name, world.PARSER)) return true\n\n  if (options.item.loc) {\n    options.holder = w[options.item.loc]\n    // Has a specific location and held by someone\n    if (options.holder.npc || options.holder.player) return falsemsg(lang.char_has_it, options)\n  }\n\n  if (options.item.scopeStatus.canReach) return true\n\n  return falsemsg(lang.not_here, options)\n}\n\n// Item's location is the char's location or the char\n// or item is reachable, but not held by someone else\ncmdRules.isHere = function(cmd, options) {\n  if (options.item.isAtLoc(options.char.loc, world.PARSER)) return true\n\n  if (options.item.loc) {\n    options.holder = w[options.item.loc]\n    if (options.already && options.holder === options.char) return falsemsg(lang.already_have, options)\n    if (options.holder.npc || options.holder.player) return falsemsg(lang.char_has_it, options)\n  }\n\n  if (options.item.scopeStatus.canReach || options.item.multiLoc) return true\n  return falsemsg(lang.not_here, options)\n}\n\n// Used by take to note if player already holding\ncmdRules.isHereAlready = function(cmd, options) {\n  options.already = true\n  return cmdRules.isHere(cmd, options)\n}\n\n// In this location or held by this char, or in a container (used by eg TAKE)\ncmdRules.isPresentOrContained = function(cmd, options) {\n  // use parser functions here as we do not want messages at this point\n\n  if (!options.item.isAtLoc) log(options.item.name)\n  if (!options.char) log(cmd.name)\n\n  if (options.item.isAtLoc(options.char.name, world.PARSER)) return true;\n  if (parser.isHere(options.item)) return true;\n\n  if (options.item.loc) {\n    options.holder = w[options.item.loc]\n    if (options.holder && (options.holder.npc || options.holder.player)) return falsemsg(lang.char_has_it, options)\n  }\n  if (parser.isContained(options.item)) return true;\n  return falsemsg(lang.not_here, options)\n}\n\ncmdRules.testManipulate = function(cmd, options) {\n  return options.char.testManipulate(options.item, cmd.name);\n\n}\n\ncmdRules.canTalkTo = function(cmd, options) {\n  if (!options.char.testTalk(options.item)) return false\n  if (!options.item.npc && !options.item.talker && !options.item.player) return falsemsg(lang.not_able_to_hear, options)\n  return true\n}\n\ncmdRules.testPosture = function(cmd, options) {\n  return options.char.testPosture(cmd.name);\n\n}\n","// noinspection JSUnusedGlobalSymbols\n\n\"use strict\";\n\n// Should all be language neutral\n\nimport {\n    array, w, lang, random, saveLoad, util, world, settings,\n    errormsg, failedmsg, msg, NULL_FUNC, sentenceCase, player, Exit, game, parser\n} from \"../index.js\";\n\nexport const DEFAULT_OBJECT = {\n  pronouns: lang.pronouns.thirdperson,\n\n  isLocatedAt:function(loc) { return loc === this.loc },\n\n  isApparentTo:function(situation) {\n    if (settings.defaultIsApparentTo) return settings.defaultIsApparentTo(situation)\n\n    if (situation === world.LOOK && this.scenery) return false\n    if (situation === world.SIDE_PANE && this.scenery && !settings.showSceneryInSidePanes) return false\n    return !(situation === world.SIDE_PANE && this.player);\n\n  },\n\n  isAtLoc:function(loc, situation) {\n    if (typeof loc !== \"string\") loc = loc.name\n    if (!w[loc] && !settings.placeholderLocations.includes(loc)) {\n      errormsg(\"The location name `\" + loc + \"`, does not match anything in the game.\")\n    }\n    if (!this.isLocatedAt(loc, situation)) return false\n    return this.isApparentTo(situation)\n  },\n\n  isHere:function() {\n    return this.isAtLoc(player().loc);\n  },\n\n  isHeld:function() {\n    return this.isAtLoc(player().name);\n  },\n\n  isHeldBy:function(char) {\n    return this.isAtLoc(char.name);\n  },\n\n  isUltimatelyHeldBy:function(obj) {\n    let o = this\n    while (o.loc) {\n      if (o.loc === obj.name) return true\n      if (!o.loc) return errormsg(\"isUltimatelyHeldBy has found that the object \\\"\" + o.name + \"\\\" has no loc attribute (or it is set to undefined/false/null/0), and so has failed. If this is a takeable item you may need to give it a custom isUltimatelyHeldBy function. If this is a takeable container or surface, it needs a loc attribute set.\")\n      if (!w[o.loc] && !settings.placeholderLocations.includes(o.loc)) {\n        return errormsg(\"isUltimatelyHeldBy has found that the object \\\"\" + o.name + \"\\\" has its \\\"loc\\\" attribute set to \\\"\" + o.loc + \"\\\"), which does not exist, and so has failed.\")\n      }\n      o = w[o.loc]\n    }\n    return false\n  },\n\n  isHereOrHeld:function() {\n    return this.isHere() || this.isHeld();\n  },\n\n  isHereOrHeldBy:function(char) {\n    return this.isHere() || this.isHeldBy(char);\n  },\n\n  countAtLoc:function(loc) {\n    if (typeof loc !== \"string\") loc = loc.name;\n    return this.isAtLoc(loc) ? 1 : 0;\n  },\n\n  scopeSnapshot:function(mode) {\n    if (this.scopeStatus['done' + mode]) return  // already done this one\n\n    if (Object.keys(this.scopeStatus).length === 0) world.scope.push(this)\n\n    this.scopeStatus['can' + mode] = true  // set the value\n    this.scopeStatus['done' + mode] = true\n\n    if (!this.getContents && !this.componentHolder) return // no lower levels so done\n\n    let l\n    if (this.getContents) {\n      // this is a container, so get the contents\n\n      // cannot see or reach contents and not flagged is a visible room, and not the player, so abort\n      if (!this['can' + mode + 'ThroughThis']() && !this.scopeStatus['room' + mode] && this !== player()) return\n      l = this.getContents(world.PARSER)\n    }\n    else {\n      // this has components, so get them\n      l = []\n      for (let key in w) {\n        if (w[key].loc === this.name) l.push(w[key]);\n      }\n    }\n    for (let el of l) {\n      // go through them\n      el.scopeSnapshot(mode)\n    }\n  },\n\n  canReachThroughThis:() => false,\n  canSeeThroughThis:() => false,\n  afterTakeOut:NULL_FUNC,\n  afterDropIn:NULL_FUNC,\n  testTalkPlayer:() => false,\n  getExits:function() { return []; },\n  hasExit:dir => false,\n  getWorn:() => false,\n  saveLoadExcludedAtts:[],\n\n\n  moveToFrom:function(options, toLoc, fromLoc) {\n    util.setToFrom(options, toLoc, fromLoc)\n    if (options.fromLoc === undefined) options.fromLoc = this.loc\n    if (options.fromLoc === options.toLoc) return\n\n    if (!w[options.fromLoc] && !settings.placeholderLocations.includes(options.fromLoc)) {\n      errormsg(\"The location name `\" + options.fromLoc + \"`, does not match anything in the game.\")\n    }\n    if (!w[options.toLoc] && !settings.placeholderLocations.includes(options.toLoc)) {\n      errormsg(\"The location name `\" + options.toLoc + \"`, does not match anything in the game.\")\n    }\n\n    this.loc = options.toLoc\n    options.item = this\n    if (!settings.placeholderLocations.includes(options.fromLoc)) w[options.fromLoc].afterTakeOut(options)\n    if (!settings.placeholderLocations.includes(options.toLoc)) w[options.toLoc].afterDropIn(options)\n    if (this.afterMove !== undefined) this.afterMove(options)\n    if (options.toLoc === player().name && this.afterTake !== undefined) this.afterTake(options)\n  },\n\n  afterLoad:NULL_FUNC,\n\n  afterLoadForTemplate:function() {\n    this.afterLoad();\n  },\n\n  beforeSave:NULL_FUNC,\n\n  beforeSaveForTemplate:function() {\n    this.beforeSave();\n  },\n\n  getSaveString:function() {\n    this.beforeSaveForTemplate()\n    let s = this.getSaveStringPreamble()\n    for (let key in this) {\n      if (typeof this[key] !== \"function\") {\n        if (!this.saveLoadExclude(key)) {\n          s += saveLoad.encode(key, this[key]);\n        }\n      }\n    }\n    return s\n  },\n\n  getSaveStringPreamble:function(item) {\n    return \"Object=\"\n  },\n\n  saveLoadExclude:function(att) {\n    if (typeof this[att] === 'function') return true\n    if (typeof this[att] === 'object' && !Array.isArray(this[att])) return true\n    if (this[att] instanceof Exit) return true\n    if (array.hasMatch(settings.saveLoadExcludedAtts, att)) return true\n    return array.hasMatch(this.saveLoadExcludedAtts, att);\n\n  },\n\n\n  setAlias:function(alias, options = {}) {\n    if (this.synonyms && this.alias) this.synonyms.push(this.alias)\n    this.alias = alias\n    this.listAlias = options.listAlias ? options.listAlias : sentenceCase(alias)\n    this.properNoun = options.properNoun === undefined ? /^[A-Z]/.test(this.alias) : options.properNoun\n    if (this.room) this.headingAlias = options.headingAlias ? options.headingAlias : settings.getDefaultRoomHeading(this)\n    this.parserOptionsSet = false\n    this.pluralAlias = options.pluralAlias ? options.pluralAlias : lang.getPlural(alias)\n    this.properNoun = options.properNoun === undefined ? /^[A-Z]/.test(this.alias) : options.properNoun\n  },\n\n\n  eventActive:false,\n  eventCountdown:0,\n  eventIsActive:function() { return this.eventActive},\n  endTurn:function(turn) { this.doEvent(turn) },\n  doEvent:function(turn) {\n    //console.log(\"this=\" + this.name);\n    // Not active, so stop\n    if (!this.eventIsActive()) return;\n    // Countdown running, so stop\n    if (this.eventCountdown > 1) {\n      this.eventCountdown--;\n      return;\n    }\n    // If there is a condition and it is not met, stop\n    //console.log(\"this=\" + this.name);\n    if (this.eventCondition && !this.eventCondition(turn)) return;\n    if (typeof this.eventScript !== 'function') log(\"About to call eventScrip on the object '\" + this.name + \"', but it will throw an exception because there is no such function!\")\n    this.eventScript(turn);\n    if (typeof this.eventPeriod === \"number\") {\n      this.eventCountdown = this.eventPeriod;\n    }\n    else {\n      this.eventActive = false;\n    }\n  },\n};\n\nexport const DEFAULT_ROOM = {\n  room:true,\n  beforeEnter:NULL_FUNC,\n  beforeFirstEnter:NULL_FUNC,\n  afterEnter:NULL_FUNC,\n  afterEnterIf:{},\n  afterEnterIfFlags:'',\n  afterFirstEnter:NULL_FUNC,\n  afterExit:NULL_FUNC,\n  visited:0,\n\n  lightSource:() => world.LIGHT_FULL,\n\n  isAtLoc:function(loc, situation) { return situation === world.PARSER && loc === this.name },\n\n  description:function() {\n    for (let line of settings.roomTemplate) {\n      msg(line);\n    }\n    return true;\n  },\n\n  examine:function() {\n    msg('{hereDesc}')\n    return true\n  },\n\n  darkDesc:() => msg(lang.it_is_dark),\n\n  getContents: util.getContents,\n\n  getExit:function(dir) {\n    return this[dir]\n  },\n\n  hasExit:function(dir, options) {\n    if (options === undefined) options = {}\n    if (!this[dir]) return false\n    if (options.excludeAlsoDir && this[dir].isAlsoDir) return false\n    if (options.excludeLocked && this[dir].isLocked()) return false\n    if (options.excludeScenery && this[dir].scenery) return false\n    if (game.dark && !this[dir].illuminated) return false\n    return !this[dir].isHidden()\n  },\n\n  getExitObjs:function(options) {\n    if (options === undefined) options = {};\n    const list = []\n    if (options.excludeAlsoDir === undefined) options.excludeAlsoDir = true\n    for (let exit of lang.exit_list) {\n      if (this.hasExit(exit.name, options)) {\n        list.push(exit)\n      }\n    }\n    return list\n  },\n\n  getExits:function(options) {\n    return this.getExitObjs(options).map(el => this.getExit(el.name))\n  },\n\n  getExitDirs:function(options) {\n    return this.getExits(options).map(el => el.dir)\n  },\n\n  // returns null if there are no exits\n  getRandomExit:function(options) { return random.fromArray(this.getExits(options)) },\n\n  findExit:function(dest, options) {\n    if (typeof dest === \"object\") dest = dest.name;\n    for (let exit of lang.exit_list) {\n      if (this.hasExit(exit.name, options) && this[exit.name].name === dest) {\n        return this.getExit(exit.name)\n      }\n    }\n    return null;\n  },\n\n  // Lock or unlock the exit indicated\n  // Returns false if the exit does not exist or is not an Exit object\n  // Returns true if successful\n  setExitLock:function(dir, locked) {\n    if (!this[dir]) return false\n    this['exit_locked_' + dir] = locked\n    return true\n  },\n\n  isExitLocked:function(dir) {\n    return this['exit_locked_' + dir]\n  },\n\n  // Hide or unhide the exit indicated\n  // Returns false if the exit does not exist or is not an Exit object\n  // Returns true if successful\n  setExitHide:function(dir, hidden) {\n    if (!this[dir]) return false\n    this['exit_hidden_' + dir] = hidden\n    return true\n  },\n\n  isExitHidden:function(dir) {\n    return this['exit_hidden_' + dir]\n  },\n\n  // Returns an exit going TO this room. If sent \"west\", it will return the exit from the room to the west, to this room\n  // which will probably be east, but may not\n  getReverseExit:function(dir) {\n    const dest = this[dir]\n    return dest.findExit(this)\n  },\n\n  // Used for GO IN HOUSE, CLIMB UP TREE, GO THROUGH PORTAL, etc.\n  // dir should be one of 'In', 'Out', 'Up', 'Down', Through' - case sensitive\n  goItem:function(obj, dir, char) {\n    const att = 'go' + dir + 'Direction'\n    if (!char) char = player()\n    if (!obj[att]) return failedmsg(lang['cannot_go_' + dir.toLowerCase()], {item:obj, char:char})\n    if (!this[obj[att]]) return errormsg(\"Trying to 'go \" + dir.toLowerCase() + \"' using unknown exit '\" + obj[att] + \"' for \" + this.name)\n    return this[obj[att]].use(char) ? world.SUCCESS : world.FAILED\n  }\n\n//\n\n\n};\n\nexport const DEFAULT_ITEM = {\n  lightSource:() => world.LIGHT_NONE,\n  icon:() => \"\",\n  testKeys:(char, toLock) => false,\n  getListAlias:function(loc) { return this.listAlias },\n\n  getVerbs:function() {\n    const verbList = []\n    //console.log('verbs for ' + this.name)\n    //console.log('count ' + this.verbFunctions.length)\n    //console.log(verbList)\n    for (let f of this.verbFunctions) f(this, verbList)\n\n    //console.log(verbList)\n    if (player() && !this.isAtLoc(player().name)) {\n      if (this.hereVerbs) {\n        for (let s of this.hereVerbs) verbList.push(s)\n      }\n    }\n    else if (this.getWorn()) {\n      if (this.wornVerbs) {\n        for (let s of this.wornVerbs) verbList.push(s)\n      }\n    }\n    else {\n      if (this.heldVerbs) {\n        for (let s of this.heldVerbs) verbList.push(s)\n      }\n    }\n    if (this.verbFunction) this.verbFunction(verbList)\n    return verbList;\n  },\n\n  transform:function(item) {\n    item.loc = this.loc\n    delete this.loc\n    for (const key in w) {\n      if (w[key].loc === this.name) w[key].loc = item.name\n    }\n    for (const key in parser.pronouns) {\n      if (parser.pronouns[key] === this) parser.pronouns[key] = item\n    }\n  },\n};\n","var x=String;\nvar create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x}};\nmodule.exports=create();\nmodule.exports.createColors = create;\n","export default {}","'use strict'\n\nlet pico = require('picocolors')\n\nlet terminalHighlight = require('./terminal-highlight')\n\nclass CssSyntaxError extends Error {\n  constructor(message, line, column, source, file, plugin) {\n    super(message)\n    this.name = 'CssSyntaxError'\n    this.reason = message\n\n    if (file) {\n      this.file = file\n    }\n    if (source) {\n      this.source = source\n    }\n    if (plugin) {\n      this.plugin = plugin\n    }\n    if (typeof line !== 'undefined' && typeof column !== 'undefined') {\n      if (typeof line === 'number') {\n        this.line = line\n        this.column = column\n      } else {\n        this.line = line.line\n        this.column = line.column\n        this.endLine = column.line\n        this.endColumn = column.column\n      }\n    }\n\n    this.setMessage()\n\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, CssSyntaxError)\n    }\n  }\n\n  setMessage() {\n    this.message = this.plugin ? this.plugin + ': ' : ''\n    this.message += this.file ? this.file : '<css input>'\n    if (typeof this.line !== 'undefined') {\n      this.message += ':' + this.line + ':' + this.column\n    }\n    this.message += ': ' + this.reason\n  }\n\n  showSourceCode(color) {\n    if (!this.source) return ''\n\n    let css = this.source\n    if (color == null) color = pico.isColorSupported\n    if (terminalHighlight) {\n      if (color) css = terminalHighlight(css)\n    }\n\n    let lines = css.split(/\\r?\\n/)\n    let start = Math.max(this.line - 3, 0)\n    let end = Math.min(this.line + 2, lines.length)\n\n    let maxWidth = String(end).length\n\n    let mark, aside\n    if (color) {\n      let { bold, red, gray } = pico.createColors(true)\n      mark = text => bold(red(text))\n      aside = text => gray(text)\n    } else {\n      mark = aside = str => str\n    }\n\n    return lines\n      .slice(start, end)\n      .map((line, index) => {\n        let number = start + 1 + index\n        let gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | '\n        if (number === this.line) {\n          let spacing =\n            aside(gutter.replace(/\\d/g, ' ')) +\n            line.slice(0, this.column - 1).replace(/[^\\t]/g, ' ')\n          return mark('>') + aside(gutter) + line + '\\n ' + spacing + mark('^')\n        }\n        return ' ' + aside(gutter) + line\n      })\n      .join('\\n')\n  }\n\n  toString() {\n    let code = this.showSourceCode()\n    if (code) {\n      code = '\\n\\n' + code + '\\n'\n    }\n    return this.name + ': ' + this.message + code\n  }\n}\n\nmodule.exports = CssSyntaxError\nCssSyntaxError.default = CssSyntaxError\n","'use strict'\n\nmodule.exports.isClean = Symbol('isClean')\n\nmodule.exports.my = Symbol('my')\n","'use strict'\n\nconst DEFAULT_RAW = {\n  colon: ': ',\n  indent: '    ',\n  beforeDecl: '\\n',\n  beforeRule: '\\n',\n  beforeOpen: ' ',\n  beforeClose: '\\n',\n  beforeComment: '\\n',\n  after: '\\n',\n  emptyBody: '',\n  commentLeft: ' ',\n  commentRight: ' ',\n  semicolon: false\n}\n\nfunction capitalize(str) {\n  return str[0].toUpperCase() + str.slice(1)\n}\n\nclass Stringifier {\n  constructor(builder) {\n    this.builder = builder\n  }\n\n  stringify(node, semicolon) {\n    /* c8 ignore start */\n    if (!this[node.type]) {\n      throw new Error(\n        'Unknown AST node type ' +\n          node.type +\n          '. ' +\n          'Maybe you need to change PostCSS stringifier.'\n      )\n    }\n    /* c8 ignore stop */\n    this[node.type](node, semicolon)\n  }\n\n  document(node) {\n    this.body(node)\n  }\n\n  root(node) {\n    this.body(node)\n    if (node.raws.after) this.builder(node.raws.after)\n  }\n\n  comment(node) {\n    let left = this.raw(node, 'left', 'commentLeft')\n    let right = this.raw(node, 'right', 'commentRight')\n    this.builder('/*' + left + node.text + right + '*/', node)\n  }\n\n  decl(node, semicolon) {\n    let between = this.raw(node, 'between', 'colon')\n    let string = node.prop + between + this.rawValue(node, 'value')\n\n    if (node.important) {\n      string += node.raws.important || ' !important'\n    }\n\n    if (semicolon) string += ';'\n    this.builder(string, node)\n  }\n\n  rule(node) {\n    this.block(node, this.rawValue(node, 'selector'))\n    if (node.raws.ownSemicolon) {\n      this.builder(node.raws.ownSemicolon, node, 'end')\n    }\n  }\n\n  atrule(node, semicolon) {\n    let name = '@' + node.name\n    let params = node.params ? this.rawValue(node, 'params') : ''\n\n    if (typeof node.raws.afterName !== 'undefined') {\n      name += node.raws.afterName\n    } else if (params) {\n      name += ' '\n    }\n\n    if (node.nodes) {\n      this.block(node, name + params)\n    } else {\n      let end = (node.raws.between || '') + (semicolon ? ';' : '')\n      this.builder(name + params + end, node)\n    }\n  }\n\n  body(node) {\n    let last = node.nodes.length - 1\n    while (last > 0) {\n      if (node.nodes[last].type !== 'comment') break\n      last -= 1\n    }\n\n    let semicolon = this.raw(node, 'semicolon')\n    for (let i = 0; i < node.nodes.length; i++) {\n      let child = node.nodes[i]\n      let before = this.raw(child, 'before')\n      if (before) this.builder(before)\n      this.stringify(child, last !== i || semicolon)\n    }\n  }\n\n  block(node, start) {\n    let between = this.raw(node, 'between', 'beforeOpen')\n    this.builder(start + between + '{', node, 'start')\n\n    let after\n    if (node.nodes && node.nodes.length) {\n      this.body(node)\n      after = this.raw(node, 'after')\n    } else {\n      after = this.raw(node, 'after', 'emptyBody')\n    }\n\n    if (after) this.builder(after)\n    this.builder('}', node, 'end')\n  }\n\n  raw(node, own, detect) {\n    let value\n    if (!detect) detect = own\n\n    // Already had\n    if (own) {\n      value = node.raws[own]\n      if (typeof value !== 'undefined') return value\n    }\n\n    let parent = node.parent\n\n    if (detect === 'before') {\n      // Hack for first rule in CSS\n      if (!parent || (parent.type === 'root' && parent.first === node)) {\n        return ''\n      }\n\n      // `root` nodes in `document` should use only their own raws\n      if (parent && parent.type === 'document') {\n        return ''\n      }\n    }\n\n    // Floating child without parent\n    if (!parent) return DEFAULT_RAW[detect]\n\n    // Detect style by other nodes\n    let root = node.root()\n    if (!root.rawCache) root.rawCache = {}\n    if (typeof root.rawCache[detect] !== 'undefined') {\n      return root.rawCache[detect]\n    }\n\n    if (detect === 'before' || detect === 'after') {\n      return this.beforeAfter(node, detect)\n    } else {\n      let method = 'raw' + capitalize(detect)\n      if (this[method]) {\n        value = this[method](root, node)\n      } else {\n        root.walk(i => {\n          value = i.raws[own]\n          if (typeof value !== 'undefined') return false\n        })\n      }\n    }\n\n    if (typeof value === 'undefined') value = DEFAULT_RAW[detect]\n\n    root.rawCache[detect] = value\n    return value\n  }\n\n  rawSemicolon(root) {\n    let value\n    root.walk(i => {\n      if (i.nodes && i.nodes.length && i.last.type === 'decl') {\n        value = i.raws.semicolon\n        if (typeof value !== 'undefined') return false\n      }\n    })\n    return value\n  }\n\n  rawEmptyBody(root) {\n    let value\n    root.walk(i => {\n      if (i.nodes && i.nodes.length === 0) {\n        value = i.raws.after\n        if (typeof value !== 'undefined') return false\n      }\n    })\n    return value\n  }\n\n  rawIndent(root) {\n    if (root.raws.indent) return root.raws.indent\n    let value\n    root.walk(i => {\n      let p = i.parent\n      if (p && p !== root && p.parent && p.parent === root) {\n        if (typeof i.raws.before !== 'undefined') {\n          let parts = i.raws.before.split('\\n')\n          value = parts[parts.length - 1]\n          value = value.replace(/\\S/g, '')\n          return false\n        }\n      }\n    })\n    return value\n  }\n\n  rawBeforeComment(root, node) {\n    let value\n    root.walkComments(i => {\n      if (typeof i.raws.before !== 'undefined') {\n        value = i.raws.before\n        if (value.includes('\\n')) {\n          value = value.replace(/[^\\n]+$/, '')\n        }\n        return false\n      }\n    })\n    if (typeof value === 'undefined') {\n      value = this.raw(node, null, 'beforeDecl')\n    } else if (value) {\n      value = value.replace(/\\S/g, '')\n    }\n    return value\n  }\n\n  rawBeforeDecl(root, node) {\n    let value\n    root.walkDecls(i => {\n      if (typeof i.raws.before !== 'undefined') {\n        value = i.raws.before\n        if (value.includes('\\n')) {\n          value = value.replace(/[^\\n]+$/, '')\n        }\n        return false\n      }\n    })\n    if (typeof value === 'undefined') {\n      value = this.raw(node, null, 'beforeRule')\n    } else if (value) {\n      value = value.replace(/\\S/g, '')\n    }\n    return value\n  }\n\n  rawBeforeRule(root) {\n    let value\n    root.walk(i => {\n      if (i.nodes && (i.parent !== root || root.first !== i)) {\n        if (typeof i.raws.before !== 'undefined') {\n          value = i.raws.before\n          if (value.includes('\\n')) {\n            value = value.replace(/[^\\n]+$/, '')\n          }\n          return false\n        }\n      }\n    })\n    if (value) value = value.replace(/\\S/g, '')\n    return value\n  }\n\n  rawBeforeClose(root) {\n    let value\n    root.walk(i => {\n      if (i.nodes && i.nodes.length > 0) {\n        if (typeof i.raws.after !== 'undefined') {\n          value = i.raws.after\n          if (value.includes('\\n')) {\n            value = value.replace(/[^\\n]+$/, '')\n          }\n          return false\n        }\n      }\n    })\n    if (value) value = value.replace(/\\S/g, '')\n    return value\n  }\n\n  rawBeforeOpen(root) {\n    let value\n    root.walk(i => {\n      if (i.type !== 'decl') {\n        value = i.raws.between\n        if (typeof value !== 'undefined') return false\n      }\n    })\n    return value\n  }\n\n  rawColon(root) {\n    let value\n    root.walkDecls(i => {\n      if (typeof i.raws.between !== 'undefined') {\n        value = i.raws.between.replace(/[^\\s:]/g, '')\n        return false\n      }\n    })\n    return value\n  }\n\n  beforeAfter(node, detect) {\n    let value\n    if (node.type === 'decl') {\n      value = this.raw(node, null, 'beforeDecl')\n    } else if (node.type === 'comment') {\n      value = this.raw(node, null, 'beforeComment')\n    } else if (detect === 'before') {\n      value = this.raw(node, null, 'beforeRule')\n    } else {\n      value = this.raw(node, null, 'beforeClose')\n    }\n\n    let buf = node.parent\n    let depth = 0\n    while (buf && buf.type !== 'root') {\n      depth += 1\n      buf = buf.parent\n    }\n\n    if (value.includes('\\n')) {\n      let indent = this.raw(node, null, 'indent')\n      if (indent.length) {\n        for (let step = 0; step < depth; step++) value += indent\n      }\n    }\n\n    return value\n  }\n\n  rawValue(node, prop) {\n    let value = node[prop]\n    let raw = node.raws[prop]\n    if (raw && raw.value === value) {\n      return raw.raw\n    }\n\n    return value\n  }\n}\n\nmodule.exports = Stringifier\nStringifier.default = Stringifier\n","'use strict'\n\nlet Stringifier = require('./stringifier')\n\nfunction stringify(node, builder) {\n  let str = new Stringifier(builder)\n  str.stringify(node)\n}\n\nmodule.exports = stringify\nstringify.default = stringify\n","'use strict'\n\nlet { isClean, my } = require('./symbols')\nlet CssSyntaxError = require('./css-syntax-error')\nlet Stringifier = require('./stringifier')\nlet stringify = require('./stringify')\n\nfunction cloneNode(obj, parent) {\n  let cloned = new obj.constructor()\n\n  for (let i in obj) {\n    if (!Object.prototype.hasOwnProperty.call(obj, i)) {\n      /* c8 ignore next 2 */\n      continue\n    }\n    if (i === 'proxyCache') continue\n    let value = obj[i]\n    let type = typeof value\n\n    if (i === 'parent' && type === 'object') {\n      if (parent) cloned[i] = parent\n    } else if (i === 'source') {\n      cloned[i] = value\n    } else if (Array.isArray(value)) {\n      cloned[i] = value.map(j => cloneNode(j, cloned))\n    } else {\n      if (type === 'object' && value !== null) value = cloneNode(value)\n      cloned[i] = value\n    }\n  }\n\n  return cloned\n}\n\nclass Node {\n  constructor(defaults = {}) {\n    this.raws = {}\n    this[isClean] = false\n    this[my] = true\n\n    for (let name in defaults) {\n      if (name === 'nodes') {\n        this.nodes = []\n        for (let node of defaults[name]) {\n          if (typeof node.clone === 'function') {\n            this.append(node.clone())\n          } else {\n            this.append(node)\n          }\n        }\n      } else {\n        this[name] = defaults[name]\n      }\n    }\n  }\n\n  error(message, opts = {}) {\n    if (this.source) {\n      let { start, end } = this.rangeBy(opts)\n      return this.source.input.error(\n        message,\n        { line: start.line, column: start.column },\n        { line: end.line, column: end.column },\n        opts\n      )\n    }\n    return new CssSyntaxError(message)\n  }\n\n  warn(result, text, opts) {\n    let data = { node: this }\n    for (let i in opts) data[i] = opts[i]\n    return result.warn(text, data)\n  }\n\n  remove() {\n    if (this.parent) {\n      this.parent.removeChild(this)\n    }\n    this.parent = undefined\n    return this\n  }\n\n  toString(stringifier = stringify) {\n    if (stringifier.stringify) stringifier = stringifier.stringify\n    let result = ''\n    stringifier(this, i => {\n      result += i\n    })\n    return result\n  }\n\n  assign(overrides = {}) {\n    for (let name in overrides) {\n      this[name] = overrides[name]\n    }\n    return this\n  }\n\n  clone(overrides = {}) {\n    let cloned = cloneNode(this)\n    for (let name in overrides) {\n      cloned[name] = overrides[name]\n    }\n    return cloned\n  }\n\n  cloneBefore(overrides = {}) {\n    let cloned = this.clone(overrides)\n    this.parent.insertBefore(this, cloned)\n    return cloned\n  }\n\n  cloneAfter(overrides = {}) {\n    let cloned = this.clone(overrides)\n    this.parent.insertAfter(this, cloned)\n    return cloned\n  }\n\n  replaceWith(...nodes) {\n    if (this.parent) {\n      let bookmark = this\n      let foundSelf = false\n      for (let node of nodes) {\n        if (node === this) {\n          foundSelf = true\n        } else if (foundSelf) {\n          this.parent.insertAfter(bookmark, node)\n          bookmark = node\n        } else {\n          this.parent.insertBefore(bookmark, node)\n        }\n      }\n\n      if (!foundSelf) {\n        this.remove()\n      }\n    }\n\n    return this\n  }\n\n  next() {\n    if (!this.parent) return undefined\n    let index = this.parent.index(this)\n    return this.parent.nodes[index + 1]\n  }\n\n  prev() {\n    if (!this.parent) return undefined\n    let index = this.parent.index(this)\n    return this.parent.nodes[index - 1]\n  }\n\n  before(add) {\n    this.parent.insertBefore(this, add)\n    return this\n  }\n\n  after(add) {\n    this.parent.insertAfter(this, add)\n    return this\n  }\n\n  root() {\n    let result = this\n    while (result.parent && result.parent.type !== 'document') {\n      result = result.parent\n    }\n    return result\n  }\n\n  raw(prop, defaultType) {\n    let str = new Stringifier()\n    return str.raw(this, prop, defaultType)\n  }\n\n  cleanRaws(keepBetween) {\n    delete this.raws.before\n    delete this.raws.after\n    if (!keepBetween) delete this.raws.between\n  }\n\n  toJSON(_, inputs) {\n    let fixed = {}\n    let emitInputs = inputs == null\n    inputs = inputs || new Map()\n    let inputsNextIndex = 0\n\n    for (let name in this) {\n      if (!Object.prototype.hasOwnProperty.call(this, name)) {\n        /* c8 ignore next 2 */\n        continue\n      }\n      if (name === 'parent' || name === 'proxyCache') continue\n      let value = this[name]\n\n      if (Array.isArray(value)) {\n        fixed[name] = value.map(i => {\n          if (typeof i === 'object' && i.toJSON) {\n            return i.toJSON(null, inputs)\n          } else {\n            return i\n          }\n        })\n      } else if (typeof value === 'object' && value.toJSON) {\n        fixed[name] = value.toJSON(null, inputs)\n      } else if (name === 'source') {\n        let inputId = inputs.get(value.input)\n        if (inputId == null) {\n          inputId = inputsNextIndex\n          inputs.set(value.input, inputsNextIndex)\n          inputsNextIndex++\n        }\n        fixed[name] = {\n          inputId,\n          start: value.start,\n          end: value.end\n        }\n      } else {\n        fixed[name] = value\n      }\n    }\n\n    if (emitInputs) {\n      fixed.inputs = [...inputs.keys()].map(input => input.toJSON())\n    }\n\n    return fixed\n  }\n\n  positionInside(index) {\n    let string = this.toString()\n    let column = this.source.start.column\n    let line = this.source.start.line\n\n    for (let i = 0; i < index; i++) {\n      if (string[i] === '\\n') {\n        column = 1\n        line += 1\n      } else {\n        column += 1\n      }\n    }\n\n    return { line, column }\n  }\n\n  positionBy(opts) {\n    let pos = this.source.start\n    if (opts.index) {\n      pos = this.positionInside(opts.index)\n    } else if (opts.word) {\n      let index = this.toString().indexOf(opts.word)\n      if (index !== -1) pos = this.positionInside(index)\n    }\n    return pos\n  }\n\n  rangeBy(opts) {\n    let start = {\n      line: this.source.start.line,\n      column: this.source.start.column\n    }\n    let end = this.source.end\n      ? {\n          line: this.source.end.line,\n          column: this.source.end.column + 1\n        }\n      : {\n          line: start.line,\n          column: start.column + 1\n        }\n\n    if (opts.word) {\n      let index = this.toString().indexOf(opts.word)\n      if (index !== -1) {\n        start = this.positionInside(index)\n        end = this.positionInside(index + opts.word.length)\n      }\n    } else {\n      if (opts.start) {\n        start = {\n          line: opts.start.line,\n          column: opts.start.column\n        }\n      } else if (opts.index) {\n        start = this.positionInside(opts.index)\n      }\n\n      if (opts.end) {\n        end = {\n          line: opts.end.line,\n          column: opts.end.column\n        }\n      } else if (opts.endIndex) {\n        end = this.positionInside(opts.endIndex)\n      } else if (opts.index) {\n        end = this.positionInside(opts.index + 1)\n      }\n    }\n\n    if (\n      end.line < start.line ||\n      (end.line === start.line && end.column <= start.column)\n    ) {\n      end = { line: start.line, column: start.column + 1 }\n    }\n\n    return { start, end }\n  }\n\n  getProxyProcessor() {\n    return {\n      set(node, prop, value) {\n        if (node[prop] === value) return true\n        node[prop] = value\n        if (\n          prop === 'prop' ||\n          prop === 'value' ||\n          prop === 'name' ||\n          prop === 'params' ||\n          prop === 'important' ||\n          /* c8 ignore next */\n          prop === 'text'\n        ) {\n          node.markDirty()\n        }\n        return true\n      },\n\n      get(node, prop) {\n        if (prop === 'proxyOf') {\n          return node\n        } else if (prop === 'root') {\n          return () => node.root().toProxy()\n        } else {\n          return node[prop]\n        }\n      }\n    }\n  }\n\n  toProxy() {\n    if (!this.proxyCache) {\n      this.proxyCache = new Proxy(this, this.getProxyProcessor())\n    }\n    return this.proxyCache\n  }\n\n  addToError(error) {\n    error.postcssNode = this\n    if (error.stack && this.source && /\\n\\s{4}at /.test(error.stack)) {\n      let s = this.source\n      error.stack = error.stack.replace(\n        /\\n\\s{4}at /,\n        `$&${s.input.from}:${s.start.line}:${s.start.column}$&`\n      )\n    }\n    return error\n  }\n\n  markDirty() {\n    if (this[isClean]) {\n      this[isClean] = false\n      let next = this\n      while ((next = next.parent)) {\n        next[isClean] = false\n      }\n    }\n  }\n\n  get proxyOf() {\n    return this\n  }\n}\n\nmodule.exports = Node\nNode.default = Node\n","'use strict'\n\nlet Node = require('./node')\n\nclass Declaration extends Node {\n  constructor(defaults) {\n    if (\n      defaults &&\n      typeof defaults.value !== 'undefined' &&\n      typeof defaults.value !== 'string'\n    ) {\n      defaults = { ...defaults, value: String(defaults.value) }\n    }\n    super(defaults)\n    this.type = 'decl'\n  }\n\n  get variable() {\n    return this.prop.startsWith('--') || this.prop[0] === '$'\n  }\n}\n\nmodule.exports = Declaration\nDeclaration.default = Declaration\n","let urlAlphabet =\n  'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nlet customAlphabet = (alphabet, defaultSize = 21) => {\n  return (size = defaultSize) => {\n    let id = ''\n    let i = size\n    while (i--) {\n      id += alphabet[(Math.random() * alphabet.length) | 0]\n    }\n    return id\n  }\n}\nlet nanoid = (size = 21) => {\n  let id = ''\n  let i = size\n  while (i--) {\n    id += urlAlphabet[(Math.random() * 64) | 0]\n  }\n  return id\n}\nmodule.exports = { nanoid, customAlphabet }\n","'use strict'\n\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\nlet { existsSync, readFileSync } = require('fs')\nlet { dirname, join } = require('path')\n\nfunction fromBase64(str) {\n  if (Buffer) {\n    return Buffer.from(str, 'base64').toString()\n  } else {\n    /* c8 ignore next 2 */\n    return window.atob(str)\n  }\n}\n\nclass PreviousMap {\n  constructor(css, opts) {\n    if (opts.map === false) return\n    this.loadAnnotation(css)\n    this.inline = this.startWith(this.annotation, 'data:')\n\n    let prev = opts.map ? opts.map.prev : undefined\n    let text = this.loadMap(opts.from, prev)\n    if (!this.mapFile && opts.from) {\n      this.mapFile = opts.from\n    }\n    if (this.mapFile) this.root = dirname(this.mapFile)\n    if (text) this.text = text\n  }\n\n  consumer() {\n    if (!this.consumerCache) {\n      this.consumerCache = new SourceMapConsumer(this.text)\n    }\n    return this.consumerCache\n  }\n\n  withContent() {\n    return !!(\n      this.consumer().sourcesContent &&\n      this.consumer().sourcesContent.length > 0\n    )\n  }\n\n  startWith(string, start) {\n    if (!string) return false\n    return string.substr(0, start.length) === start\n  }\n\n  getAnnotationURL(sourceMapString) {\n    return sourceMapString.replace(/^\\/\\*\\s*# sourceMappingURL=/, '').trim()\n  }\n\n  loadAnnotation(css) {\n    let comments = css.match(/\\/\\*\\s*# sourceMappingURL=/gm)\n    if (!comments) return\n\n    // sourceMappingURLs from comments, strings, etc.\n    let start = css.lastIndexOf(comments.pop())\n    let end = css.indexOf('*/', start)\n\n    if (start > -1 && end > -1) {\n      // Locate the last sourceMappingURL to avoid pickin\n      this.annotation = this.getAnnotationURL(css.substring(start, end))\n    }\n  }\n\n  decodeInline(text) {\n    let baseCharsetUri = /^data:application\\/json;charset=utf-?8;base64,/\n    let baseUri = /^data:application\\/json;base64,/\n    let charsetUri = /^data:application\\/json;charset=utf-?8,/\n    let uri = /^data:application\\/json,/\n\n    if (charsetUri.test(text) || uri.test(text)) {\n      return decodeURIComponent(text.substr(RegExp.lastMatch.length))\n    }\n\n    if (baseCharsetUri.test(text) || baseUri.test(text)) {\n      return fromBase64(text.substr(RegExp.lastMatch.length))\n    }\n\n    let encoding = text.match(/data:application\\/json;([^,]+),/)[1]\n    throw new Error('Unsupported source map encoding ' + encoding)\n  }\n\n  loadFile(path) {\n    this.root = dirname(path)\n    if (existsSync(path)) {\n      this.mapFile = path\n      return readFileSync(path, 'utf-8').toString().trim()\n    }\n  }\n\n  loadMap(file, prev) {\n    if (prev === false) return false\n\n    if (prev) {\n      if (typeof prev === 'string') {\n        return prev\n      } else if (typeof prev === 'function') {\n        let prevPath = prev(file)\n        if (prevPath) {\n          let map = this.loadFile(prevPath)\n          if (!map) {\n            throw new Error(\n              'Unable to load previous source map: ' + prevPath.toString()\n            )\n          }\n          return map\n        }\n      } else if (prev instanceof SourceMapConsumer) {\n        return SourceMapGenerator.fromSourceMap(prev).toString()\n      } else if (prev instanceof SourceMapGenerator) {\n        return prev.toString()\n      } else if (this.isMap(prev)) {\n        return JSON.stringify(prev)\n      } else {\n        throw new Error(\n          'Unsupported previous source map format: ' + prev.toString()\n        )\n      }\n    } else if (this.inline) {\n      return this.decodeInline(this.annotation)\n    } else if (this.annotation) {\n      let map = this.annotation\n      if (file) map = join(dirname(file), map)\n      return this.loadFile(map)\n    }\n  }\n\n  isMap(map) {\n    if (typeof map !== 'object') return false\n    return (\n      typeof map.mappings === 'string' ||\n      typeof map._mappings === 'string' ||\n      Array.isArray(map.sections)\n    )\n  }\n}\n\nmodule.exports = PreviousMap\nPreviousMap.default = PreviousMap\n","'use strict'\n\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\nlet { fileURLToPath, pathToFileURL } = require('url')\nlet { resolve, isAbsolute } = require('path')\nlet { nanoid } = require('nanoid/non-secure')\n\nlet terminalHighlight = require('./terminal-highlight')\nlet CssSyntaxError = require('./css-syntax-error')\nlet PreviousMap = require('./previous-map')\n\nlet fromOffsetCache = Symbol('fromOffsetCache')\n\nlet sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)\nlet pathAvailable = Boolean(resolve && isAbsolute)\n\nclass Input {\n  constructor(css, opts = {}) {\n    if (\n      css === null ||\n      typeof css === 'undefined' ||\n      (typeof css === 'object' && !css.toString)\n    ) {\n      throw new Error(`PostCSS received ${css} instead of CSS string`)\n    }\n\n    this.css = css.toString()\n\n    if (this.css[0] === '\\uFEFF' || this.css[0] === '\\uFFFE') {\n      this.hasBOM = true\n      this.css = this.css.slice(1)\n    } else {\n      this.hasBOM = false\n    }\n\n    if (opts.from) {\n      if (\n        !pathAvailable ||\n        /^\\w+:\\/\\//.test(opts.from) ||\n        isAbsolute(opts.from)\n      ) {\n        this.file = opts.from\n      } else {\n        this.file = resolve(opts.from)\n      }\n    }\n\n    if (pathAvailable && sourceMapAvailable) {\n      let map = new PreviousMap(this.css, opts)\n      if (map.text) {\n        this.map = map\n        let file = map.consumer().file\n        if (!this.file && file) this.file = this.mapResolve(file)\n      }\n    }\n\n    if (!this.file) {\n      this.id = '<input css ' + nanoid(6) + '>'\n    }\n    if (this.map) this.map.file = this.from\n  }\n\n  fromOffset(offset) {\n    let lastLine, lineToIndex\n    if (!this[fromOffsetCache]) {\n      let lines = this.css.split('\\n')\n      lineToIndex = new Array(lines.length)\n      let prevIndex = 0\n\n      for (let i = 0, l = lines.length; i < l; i++) {\n        lineToIndex[i] = prevIndex\n        prevIndex += lines[i].length + 1\n      }\n\n      this[fromOffsetCache] = lineToIndex\n    } else {\n      lineToIndex = this[fromOffsetCache]\n    }\n    lastLine = lineToIndex[lineToIndex.length - 1]\n\n    let min = 0\n    if (offset >= lastLine) {\n      min = lineToIndex.length - 1\n    } else {\n      let max = lineToIndex.length - 2\n      let mid\n      while (min < max) {\n        mid = min + ((max - min) >> 1)\n        if (offset < lineToIndex[mid]) {\n          max = mid - 1\n        } else if (offset >= lineToIndex[mid + 1]) {\n          min = mid + 1\n        } else {\n          min = mid\n          break\n        }\n      }\n    }\n    return {\n      line: min + 1,\n      col: offset - lineToIndex[min] + 1\n    }\n  }\n\n  error(message, line, column, opts = {}) {\n    let result, endLine, endColumn\n\n    if (line && typeof line === 'object') {\n      let start = line\n      let end = column\n      if (typeof start.offset === 'number') {\n        let pos = this.fromOffset(start.offset)\n        line = pos.line\n        column = pos.col\n      } else {\n        line = start.line\n        column = start.column\n      }\n      if (typeof end.offset === 'number') {\n        let pos = this.fromOffset(end.offset)\n        endLine = pos.line\n        endColumn = pos.col\n      } else {\n        endLine = end.line\n        endColumn = end.column\n      }\n    } else if (!column) {\n      let pos = this.fromOffset(line)\n      line = pos.line\n      column = pos.col\n    }\n\n    let origin = this.origin(line, column, endLine, endColumn)\n    if (origin) {\n      result = new CssSyntaxError(\n        message,\n        origin.endLine === undefined\n          ? origin.line\n          : { line: origin.line, column: origin.column },\n        origin.endLine === undefined\n          ? origin.column\n          : { line: origin.endLine, column: origin.endColumn },\n        origin.source,\n        origin.file,\n        opts.plugin\n      )\n    } else {\n      result = new CssSyntaxError(\n        message,\n        endLine === undefined ? line : { line, column },\n        endLine === undefined ? column : { line: endLine, column: endColumn },\n        this.css,\n        this.file,\n        opts.plugin\n      )\n    }\n\n    result.input = { line, column, endLine, endColumn, source: this.css }\n    if (this.file) {\n      if (pathToFileURL) {\n        result.input.url = pathToFileURL(this.file).toString()\n      }\n      result.input.file = this.file\n    }\n\n    return result\n  }\n\n  origin(line, column, endLine, endColumn) {\n    if (!this.map) return false\n    let consumer = this.map.consumer()\n\n    let from = consumer.originalPositionFor({ line, column })\n    if (!from.source) return false\n\n    let to\n    if (typeof endLine === 'number') {\n      to = consumer.originalPositionFor({ line: endLine, column: endColumn })\n    }\n\n    let fromUrl\n\n    if (isAbsolute(from.source)) {\n      fromUrl = pathToFileURL(from.source)\n    } else {\n      fromUrl = new URL(\n        from.source,\n        this.map.consumer().sourceRoot || pathToFileURL(this.map.mapFile)\n      )\n    }\n\n    let result = {\n      url: fromUrl.toString(),\n      line: from.line,\n      column: from.column,\n      endLine: to && to.line,\n      endColumn: to && to.column\n    }\n\n    if (fromUrl.protocol === 'file:') {\n      if (fileURLToPath) {\n        result.file = fileURLToPath(fromUrl)\n      } else {\n        /* c8 ignore next 2 */\n        throw new Error(`file: protocol is not available in this PostCSS build`)\n      }\n    }\n\n    let source = consumer.sourceContentFor(from.source)\n    if (source) result.source = source\n\n    return result\n  }\n\n  mapResolve(file) {\n    if (/^\\w+:\\/\\//.test(file)) {\n      return file\n    }\n    return resolve(this.map.consumer().sourceRoot || this.map.root || '.', file)\n  }\n\n  get from() {\n    return this.file || this.id\n  }\n\n  toJSON() {\n    let json = {}\n    for (let name of ['hasBOM', 'css', 'file', 'id']) {\n      if (this[name] != null) {\n        json[name] = this[name]\n      }\n    }\n    if (this.map) {\n      json.map = { ...this.map }\n      if (json.map.consumerCache) {\n        json.map.consumerCache = undefined\n      }\n    }\n    return json\n  }\n}\n\nmodule.exports = Input\nInput.default = Input\n\nif (terminalHighlight && terminalHighlight.registerInput) {\n  terminalHighlight.registerInput(Input)\n}\n","'use strict'\n\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\nlet { dirname, resolve, relative, sep } = require('path')\nlet { pathToFileURL } = require('url')\n\nlet Input = require('./input')\n\nlet sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)\nlet pathAvailable = Boolean(dirname && resolve && relative && sep)\n\nclass MapGenerator {\n  constructor(stringify, root, opts, cssString) {\n    this.stringify = stringify\n    this.mapOpts = opts.map || {}\n    this.root = root\n    this.opts = opts\n    this.css = cssString\n    this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute\n  }\n\n  isMap() {\n    if (typeof this.opts.map !== 'undefined') {\n      return !!this.opts.map\n    }\n    return this.previous().length > 0\n  }\n\n  previous() {\n    if (!this.previousMaps) {\n      this.previousMaps = []\n      if (this.root) {\n        this.root.walk(node => {\n          if (node.source && node.source.input.map) {\n            let map = node.source.input.map\n            if (!this.previousMaps.includes(map)) {\n              this.previousMaps.push(map)\n            }\n          }\n        })\n      } else {\n        let input = new Input(this.css, this.opts)\n        if (input.map) this.previousMaps.push(input.map)\n      }\n    }\n\n    return this.previousMaps\n  }\n\n  isInline() {\n    if (typeof this.mapOpts.inline !== 'undefined') {\n      return this.mapOpts.inline\n    }\n\n    let annotation = this.mapOpts.annotation\n    if (typeof annotation !== 'undefined' && annotation !== true) {\n      return false\n    }\n\n    if (this.previous().length) {\n      return this.previous().some(i => i.inline)\n    }\n    return true\n  }\n\n  isSourcesContent() {\n    if (typeof this.mapOpts.sourcesContent !== 'undefined') {\n      return this.mapOpts.sourcesContent\n    }\n    if (this.previous().length) {\n      return this.previous().some(i => i.withContent())\n    }\n    return true\n  }\n\n  clearAnnotation() {\n    if (this.mapOpts.annotation === false) return\n\n    if (this.root) {\n      let node\n      for (let i = this.root.nodes.length - 1; i >= 0; i--) {\n        node = this.root.nodes[i]\n        if (node.type !== 'comment') continue\n        if (node.text.indexOf('# sourceMappingURL=') === 0) {\n          this.root.removeChild(i)\n        }\n      }\n    } else if (this.css) {\n      this.css = this.css.replace(/(\\n)?\\/\\*#[\\S\\s]*?\\*\\/$/gm, '')\n    }\n  }\n\n  setSourcesContent() {\n    let already = {}\n    if (this.root) {\n      this.root.walk(node => {\n        if (node.source) {\n          let from = node.source.input.from\n          if (from && !already[from]) {\n            already[from] = true\n            let fromUrl = this.usesFileUrls\n              ? this.toFileUrl(from)\n              : this.toUrl(this.path(from))\n            this.map.setSourceContent(fromUrl, node.source.input.css)\n          }\n        }\n      })\n    } else if (this.css) {\n      let from = this.opts.from\n        ? this.toUrl(this.path(this.opts.from))\n        : '<no source>'\n      this.map.setSourceContent(from, this.css)\n    }\n  }\n\n  applyPrevMaps() {\n    for (let prev of this.previous()) {\n      let from = this.toUrl(this.path(prev.file))\n      let root = prev.root || dirname(prev.file)\n      let map\n\n      if (this.mapOpts.sourcesContent === false) {\n        map = new SourceMapConsumer(prev.text)\n        if (map.sourcesContent) {\n          map.sourcesContent = map.sourcesContent.map(() => null)\n        }\n      } else {\n        map = prev.consumer()\n      }\n\n      this.map.applySourceMap(map, from, this.toUrl(this.path(root)))\n    }\n  }\n\n  isAnnotation() {\n    if (this.isInline()) {\n      return true\n    }\n    if (typeof this.mapOpts.annotation !== 'undefined') {\n      return this.mapOpts.annotation\n    }\n    if (this.previous().length) {\n      return this.previous().some(i => i.annotation)\n    }\n    return true\n  }\n\n  toBase64(str) {\n    if (Buffer) {\n      return Buffer.from(str).toString('base64')\n    } else {\n      return window.btoa(unescape(encodeURIComponent(str)))\n    }\n  }\n\n  addAnnotation() {\n    let content\n\n    if (this.isInline()) {\n      content =\n        'data:application/json;base64,' + this.toBase64(this.map.toString())\n    } else if (typeof this.mapOpts.annotation === 'string') {\n      content = this.mapOpts.annotation\n    } else if (typeof this.mapOpts.annotation === 'function') {\n      content = this.mapOpts.annotation(this.opts.to, this.root)\n    } else {\n      content = this.outputFile() + '.map'\n    }\n    let eol = '\\n'\n    if (this.css.includes('\\r\\n')) eol = '\\r\\n'\n\n    this.css += eol + '/*# sourceMappingURL=' + content + ' */'\n  }\n\n  outputFile() {\n    if (this.opts.to) {\n      return this.path(this.opts.to)\n    } else if (this.opts.from) {\n      return this.path(this.opts.from)\n    } else {\n      return 'to.css'\n    }\n  }\n\n  generateMap() {\n    if (this.root) {\n      this.generateString()\n    } else if (this.previous().length === 1) {\n      let prev = this.previous()[0].consumer()\n      prev.file = this.outputFile()\n      this.map = SourceMapGenerator.fromSourceMap(prev)\n    } else {\n      this.map = new SourceMapGenerator({ file: this.outputFile() })\n      this.map.addMapping({\n        source: this.opts.from\n          ? this.toUrl(this.path(this.opts.from))\n          : '<no source>',\n        generated: { line: 1, column: 0 },\n        original: { line: 1, column: 0 }\n      })\n    }\n\n    if (this.isSourcesContent()) this.setSourcesContent()\n    if (this.root && this.previous().length > 0) this.applyPrevMaps()\n    if (this.isAnnotation()) this.addAnnotation()\n\n    if (this.isInline()) {\n      return [this.css]\n    } else {\n      return [this.css, this.map]\n    }\n  }\n\n  path(file) {\n    if (file.indexOf('<') === 0) return file\n    if (/^\\w+:\\/\\//.test(file)) return file\n    if (this.mapOpts.absolute) return file\n\n    let from = this.opts.to ? dirname(this.opts.to) : '.'\n\n    if (typeof this.mapOpts.annotation === 'string') {\n      from = dirname(resolve(from, this.mapOpts.annotation))\n    }\n\n    file = relative(from, file)\n    return file\n  }\n\n  toUrl(path) {\n    if (sep === '\\\\') {\n      path = path.replace(/\\\\/g, '/')\n    }\n    return encodeURI(path).replace(/[#?]/g, encodeURIComponent)\n  }\n\n  toFileUrl(path) {\n    if (pathToFileURL) {\n      return pathToFileURL(path).toString()\n    } else {\n      throw new Error(\n        '`map.absolute` option is not available in this PostCSS build'\n      )\n    }\n  }\n\n  sourcePath(node) {\n    if (this.mapOpts.from) {\n      return this.toUrl(this.mapOpts.from)\n    } else if (this.usesFileUrls) {\n      return this.toFileUrl(node.source.input.from)\n    } else {\n      return this.toUrl(this.path(node.source.input.from))\n    }\n  }\n\n  generateString() {\n    this.css = ''\n    this.map = new SourceMapGenerator({ file: this.outputFile() })\n\n    let line = 1\n    let column = 1\n\n    let noSource = '<no source>'\n    let mapping = {\n      source: '',\n      generated: { line: 0, column: 0 },\n      original: { line: 0, column: 0 }\n    }\n\n    let lines, last\n    this.stringify(this.root, (str, node, type) => {\n      this.css += str\n\n      if (node && type !== 'end') {\n        mapping.generated.line = line\n        mapping.generated.column = column - 1\n        if (node.source && node.source.start) {\n          mapping.source = this.sourcePath(node)\n          mapping.original.line = node.source.start.line\n          mapping.original.column = node.source.start.column - 1\n          this.map.addMapping(mapping)\n        } else {\n          mapping.source = noSource\n          mapping.original.line = 1\n          mapping.original.column = 0\n          this.map.addMapping(mapping)\n        }\n      }\n\n      lines = str.match(/\\n/g)\n      if (lines) {\n        line += lines.length\n        last = str.lastIndexOf('\\n')\n        column = str.length - last\n      } else {\n        column += str.length\n      }\n\n      if (node && type !== 'start') {\n        let p = node.parent || { raws: {} }\n        let childless =\n          node.type === 'decl' || (node.type === 'atrule' && !node.nodes)\n        if (!childless || node !== p.last || p.raws.semicolon) {\n          if (node.source && node.source.end) {\n            mapping.source = this.sourcePath(node)\n            mapping.original.line = node.source.end.line\n            mapping.original.column = node.source.end.column - 1\n            mapping.generated.line = line\n            mapping.generated.column = column - 2\n            this.map.addMapping(mapping)\n          } else {\n            mapping.source = noSource\n            mapping.original.line = 1\n            mapping.original.column = 0\n            mapping.generated.line = line\n            mapping.generated.column = column - 1\n            this.map.addMapping(mapping)\n          }\n        }\n      }\n    })\n  }\n\n  generate() {\n    this.clearAnnotation()\n    if (pathAvailable && sourceMapAvailable && this.isMap()) {\n      return this.generateMap()\n    } else {\n      let result = ''\n      this.stringify(this.root, i => {\n        result += i\n      })\n      return [result]\n    }\n  }\n}\n\nmodule.exports = MapGenerator\n","'use strict'\n\nlet Node = require('./node')\n\nclass Comment extends Node {\n  constructor(defaults) {\n    super(defaults)\n    this.type = 'comment'\n  }\n}\n\nmodule.exports = Comment\nComment.default = Comment\n","'use strict'\n\nlet { isClean, my } = require('./symbols')\nlet Declaration = require('./declaration')\nlet Comment = require('./comment')\nlet Node = require('./node')\n\nlet parse, Rule, AtRule, Root\n\nfunction cleanSource(nodes) {\n  return nodes.map(i => {\n    if (i.nodes) i.nodes = cleanSource(i.nodes)\n    delete i.source\n    return i\n  })\n}\n\nfunction markDirtyUp(node) {\n  node[isClean] = false\n  if (node.proxyOf.nodes) {\n    for (let i of node.proxyOf.nodes) {\n      markDirtyUp(i)\n    }\n  }\n}\n\nclass Container extends Node {\n  push(child) {\n    child.parent = this\n    this.proxyOf.nodes.push(child)\n    return this\n  }\n\n  each(callback) {\n    if (!this.proxyOf.nodes) return undefined\n    let iterator = this.getIterator()\n\n    let index, result\n    while (this.indexes[iterator] < this.proxyOf.nodes.length) {\n      index = this.indexes[iterator]\n      result = callback(this.proxyOf.nodes[index], index)\n      if (result === false) break\n\n      this.indexes[iterator] += 1\n    }\n\n    delete this.indexes[iterator]\n    return result\n  }\n\n  walk(callback) {\n    return this.each((child, i) => {\n      let result\n      try {\n        result = callback(child, i)\n      } catch (e) {\n        throw child.addToError(e)\n      }\n      if (result !== false && child.walk) {\n        result = child.walk(callback)\n      }\n\n      return result\n    })\n  }\n\n  walkDecls(prop, callback) {\n    if (!callback) {\n      callback = prop\n      return this.walk((child, i) => {\n        if (child.type === 'decl') {\n          return callback(child, i)\n        }\n      })\n    }\n    if (prop instanceof RegExp) {\n      return this.walk((child, i) => {\n        if (child.type === 'decl' && prop.test(child.prop)) {\n          return callback(child, i)\n        }\n      })\n    }\n    return this.walk((child, i) => {\n      if (child.type === 'decl' && child.prop === prop) {\n        return callback(child, i)\n      }\n    })\n  }\n\n  walkRules(selector, callback) {\n    if (!callback) {\n      callback = selector\n\n      return this.walk((child, i) => {\n        if (child.type === 'rule') {\n          return callback(child, i)\n        }\n      })\n    }\n    if (selector instanceof RegExp) {\n      return this.walk((child, i) => {\n        if (child.type === 'rule' && selector.test(child.selector)) {\n          return callback(child, i)\n        }\n      })\n    }\n    return this.walk((child, i) => {\n      if (child.type === 'rule' && child.selector === selector) {\n        return callback(child, i)\n      }\n    })\n  }\n\n  walkAtRules(name, callback) {\n    if (!callback) {\n      callback = name\n      return this.walk((child, i) => {\n        if (child.type === 'atrule') {\n          return callback(child, i)\n        }\n      })\n    }\n    if (name instanceof RegExp) {\n      return this.walk((child, i) => {\n        if (child.type === 'atrule' && name.test(child.name)) {\n          return callback(child, i)\n        }\n      })\n    }\n    return this.walk((child, i) => {\n      if (child.type === 'atrule' && child.name === name) {\n        return callback(child, i)\n      }\n    })\n  }\n\n  walkComments(callback) {\n    return this.walk((child, i) => {\n      if (child.type === 'comment') {\n        return callback(child, i)\n      }\n    })\n  }\n\n  append(...children) {\n    for (let child of children) {\n      let nodes = this.normalize(child, this.last)\n      for (let node of nodes) this.proxyOf.nodes.push(node)\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  prepend(...children) {\n    children = children.reverse()\n    for (let child of children) {\n      let nodes = this.normalize(child, this.first, 'prepend').reverse()\n      for (let node of nodes) this.proxyOf.nodes.unshift(node)\n      for (let id in this.indexes) {\n        this.indexes[id] = this.indexes[id] + nodes.length\n      }\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  cleanRaws(keepBetween) {\n    super.cleanRaws(keepBetween)\n    if (this.nodes) {\n      for (let node of this.nodes) node.cleanRaws(keepBetween)\n    }\n  }\n\n  insertBefore(exist, add) {\n    let existIndex = this.index(exist)\n    let type = existIndex === 0 ? 'prepend' : false\n    let nodes = this.normalize(add, this.proxyOf.nodes[existIndex], type).reverse()\n    existIndex = this.index(exist)\n    for (let node of nodes) this.proxyOf.nodes.splice(existIndex, 0, node)\n\n    let index\n    for (let id in this.indexes) {\n      index = this.indexes[id]\n      if (existIndex <= index) {\n        this.indexes[id] = index + nodes.length\n      }\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  insertAfter(exist, add) {\n    let existIndex = this.index(exist)\n    let nodes = this.normalize(add, this.proxyOf.nodes[existIndex]).reverse()\n    existIndex = this.index(exist)\n    for (let node of nodes) this.proxyOf.nodes.splice(existIndex + 1, 0, node)\n\n    let index\n    for (let id in this.indexes) {\n      index = this.indexes[id]\n      if (existIndex < index) {\n        this.indexes[id] = index + nodes.length\n      }\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  removeChild(child) {\n    child = this.index(child)\n    this.proxyOf.nodes[child].parent = undefined\n    this.proxyOf.nodes.splice(child, 1)\n\n    let index\n    for (let id in this.indexes) {\n      index = this.indexes[id]\n      if (index >= child) {\n        this.indexes[id] = index - 1\n      }\n    }\n\n    this.markDirty()\n\n    return this\n  }\n\n  removeAll() {\n    for (let node of this.proxyOf.nodes) node.parent = undefined\n    this.proxyOf.nodes = []\n\n    this.markDirty()\n\n    return this\n  }\n\n  replaceValues(pattern, opts, callback) {\n    if (!callback) {\n      callback = opts\n      opts = {}\n    }\n\n    this.walkDecls(decl => {\n      if (opts.props && !opts.props.includes(decl.prop)) return\n      if (opts.fast && !decl.value.includes(opts.fast)) return\n\n      decl.value = decl.value.replace(pattern, callback)\n    })\n\n    this.markDirty()\n\n    return this\n  }\n\n  every(condition) {\n    return this.nodes.every(condition)\n  }\n\n  some(condition) {\n    return this.nodes.some(condition)\n  }\n\n  index(child) {\n    if (typeof child === 'number') return child\n    if (child.proxyOf) child = child.proxyOf\n    return this.proxyOf.nodes.indexOf(child)\n  }\n\n  get first() {\n    if (!this.proxyOf.nodes) return undefined\n    return this.proxyOf.nodes[0]\n  }\n\n  get last() {\n    if (!this.proxyOf.nodes) return undefined\n    return this.proxyOf.nodes[this.proxyOf.nodes.length - 1]\n  }\n\n  normalize(nodes, sample) {\n    if (typeof nodes === 'string') {\n      nodes = cleanSource(parse(nodes).nodes)\n    } else if (Array.isArray(nodes)) {\n      nodes = nodes.slice(0)\n      for (let i of nodes) {\n        if (i.parent) i.parent.removeChild(i, 'ignore')\n      }\n    } else if (nodes.type === 'root' && this.type !== 'document') {\n      nodes = nodes.nodes.slice(0)\n      for (let i of nodes) {\n        if (i.parent) i.parent.removeChild(i, 'ignore')\n      }\n    } else if (nodes.type) {\n      nodes = [nodes]\n    } else if (nodes.prop) {\n      if (typeof nodes.value === 'undefined') {\n        throw new Error('Value field is missed in node creation')\n      } else if (typeof nodes.value !== 'string') {\n        nodes.value = String(nodes.value)\n      }\n      nodes = [new Declaration(nodes)]\n    } else if (nodes.selector) {\n      nodes = [new Rule(nodes)]\n    } else if (nodes.name) {\n      nodes = [new AtRule(nodes)]\n    } else if (nodes.text) {\n      nodes = [new Comment(nodes)]\n    } else {\n      throw new Error('Unknown node type in node creation')\n    }\n\n    let processed = nodes.map(i => {\n      /* c8 ignore next */\n      if (!i[my]) Container.rebuild(i)\n      i = i.proxyOf\n      if (i.parent) i.parent.removeChild(i)\n      if (i[isClean]) markDirtyUp(i)\n      if (typeof i.raws.before === 'undefined') {\n        if (sample && typeof sample.raws.before !== 'undefined') {\n          i.raws.before = sample.raws.before.replace(/\\S/g, '')\n        }\n      }\n      i.parent = this.proxyOf\n      return i\n    })\n\n    return processed\n  }\n\n  getProxyProcessor() {\n    return {\n      set(node, prop, value) {\n        if (node[prop] === value) return true\n        node[prop] = value\n        if (prop === 'name' || prop === 'params' || prop === 'selector') {\n          node.markDirty()\n        }\n        return true\n      },\n\n      get(node, prop) {\n        if (prop === 'proxyOf') {\n          return node\n        } else if (!node[prop]) {\n          return node[prop]\n        } else if (\n          prop === 'each' ||\n          (typeof prop === 'string' && prop.startsWith('walk'))\n        ) {\n          return (...args) => {\n            return node[prop](\n              ...args.map(i => {\n                if (typeof i === 'function') {\n                  return (child, index) => i(child.toProxy(), index)\n                } else {\n                  return i\n                }\n              })\n            )\n          }\n        } else if (prop === 'every' || prop === 'some') {\n          return cb => {\n            return node[prop]((child, ...other) =>\n              cb(child.toProxy(), ...other)\n            )\n          }\n        } else if (prop === 'root') {\n          return () => node.root().toProxy()\n        } else if (prop === 'nodes') {\n          return node.nodes.map(i => i.toProxy())\n        } else if (prop === 'first' || prop === 'last') {\n          return node[prop].toProxy()\n        } else {\n          return node[prop]\n        }\n      }\n    }\n  }\n\n  getIterator() {\n    if (!this.lastEach) this.lastEach = 0\n    if (!this.indexes) this.indexes = {}\n\n    this.lastEach += 1\n    let iterator = this.lastEach\n    this.indexes[iterator] = 0\n\n    return iterator\n  }\n}\n\nContainer.registerParse = dependant => {\n  parse = dependant\n}\n\nContainer.registerRule = dependant => {\n  Rule = dependant\n}\n\nContainer.registerAtRule = dependant => {\n  AtRule = dependant\n}\n\nContainer.registerRoot = dependant => {\n  Root = dependant\n}\n\nmodule.exports = Container\nContainer.default = Container\n\n/* c8 ignore start */\nContainer.rebuild = node => {\n  if (node.type === 'atrule') {\n    Object.setPrototypeOf(node, AtRule.prototype)\n  } else if (node.type === 'rule') {\n    Object.setPrototypeOf(node, Rule.prototype)\n  } else if (node.type === 'decl') {\n    Object.setPrototypeOf(node, Declaration.prototype)\n  } else if (node.type === 'comment') {\n    Object.setPrototypeOf(node, Comment.prototype)\n  } else if (node.type === 'root') {\n    Object.setPrototypeOf(node, Root.prototype)\n  }\n\n  node[my] = true\n\n  if (node.nodes) {\n    node.nodes.forEach(child => {\n      Container.rebuild(child)\n    })\n  }\n}\n/* c8 ignore stop */\n","'use strict'\n\nlet Container = require('./container')\n\nlet LazyResult, Processor\n\nclass Document extends Container {\n  constructor(defaults) {\n    // type needs to be passed to super, otherwise child roots won't be normalized correctly\n    super({ type: 'document', ...defaults })\n\n    if (!this.nodes) {\n      this.nodes = []\n    }\n  }\n\n  toResult(opts = {}) {\n    let lazy = new LazyResult(new Processor(), this, opts)\n\n    return lazy.stringify()\n  }\n}\n\nDocument.registerLazyResult = dependant => {\n  LazyResult = dependant\n}\n\nDocument.registerProcessor = dependant => {\n  Processor = dependant\n}\n\nmodule.exports = Document\nDocument.default = Document\n","/* eslint-disable no-console */\n'use strict'\n\nlet printed = {}\n\nmodule.exports = function warnOnce(message) {\n  if (printed[message]) return\n  printed[message] = true\n\n  if (typeof console !== 'undefined' && console.warn) {\n    console.warn(message)\n  }\n}\n","'use strict'\n\nclass Warning {\n  constructor(text, opts = {}) {\n    this.type = 'warning'\n    this.text = text\n\n    if (opts.node && opts.node.source) {\n      let range = opts.node.rangeBy(opts)\n      this.line = range.start.line\n      this.column = range.start.column\n      this.endLine = range.end.line\n      this.endColumn = range.end.column\n    }\n\n    for (let opt in opts) this[opt] = opts[opt]\n  }\n\n  toString() {\n    if (this.node) {\n      return this.node.error(this.text, {\n        plugin: this.plugin,\n        index: this.index,\n        word: this.word\n      }).message\n    }\n\n    if (this.plugin) {\n      return this.plugin + ': ' + this.text\n    }\n\n    return this.text\n  }\n}\n\nmodule.exports = Warning\nWarning.default = Warning\n","'use strict'\n\nlet Warning = require('./warning')\n\nclass Result {\n  constructor(processor, root, opts) {\n    this.processor = processor\n    this.messages = []\n    this.root = root\n    this.opts = opts\n    this.css = undefined\n    this.map = undefined\n  }\n\n  toString() {\n    return this.css\n  }\n\n  warn(text, opts = {}) {\n    if (!opts.plugin) {\n      if (this.lastPlugin && this.lastPlugin.postcssPlugin) {\n        opts.plugin = this.lastPlugin.postcssPlugin\n      }\n    }\n\n    let warning = new Warning(text, opts)\n    this.messages.push(warning)\n\n    return warning\n  }\n\n  warnings() {\n    return this.messages.filter(i => i.type === 'warning')\n  }\n\n  get content() {\n    return this.css\n  }\n}\n\nmodule.exports = Result\nResult.default = Result\n","'use strict'\n\nconst SINGLE_QUOTE = \"'\".charCodeAt(0)\nconst DOUBLE_QUOTE = '\"'.charCodeAt(0)\nconst BACKSLASH = '\\\\'.charCodeAt(0)\nconst SLASH = '/'.charCodeAt(0)\nconst NEWLINE = '\\n'.charCodeAt(0)\nconst SPACE = ' '.charCodeAt(0)\nconst FEED = '\\f'.charCodeAt(0)\nconst TAB = '\\t'.charCodeAt(0)\nconst CR = '\\r'.charCodeAt(0)\nconst OPEN_SQUARE = '['.charCodeAt(0)\nconst CLOSE_SQUARE = ']'.charCodeAt(0)\nconst OPEN_PARENTHESES = '('.charCodeAt(0)\nconst CLOSE_PARENTHESES = ')'.charCodeAt(0)\nconst OPEN_CURLY = '{'.charCodeAt(0)\nconst CLOSE_CURLY = '}'.charCodeAt(0)\nconst SEMICOLON = ';'.charCodeAt(0)\nconst ASTERISK = '*'.charCodeAt(0)\nconst COLON = ':'.charCodeAt(0)\nconst AT = '@'.charCodeAt(0)\n\nconst RE_AT_END = /[\\t\\n\\f\\r \"#'()/;[\\\\\\]{}]/g\nconst RE_WORD_END = /[\\t\\n\\f\\r !\"#'():;@[\\\\\\]{}]|\\/(?=\\*)/g\nconst RE_BAD_BRACKET = /.[\\n\"'(/\\\\]/\nconst RE_HEX_ESCAPE = /[\\da-f]/i\n\nmodule.exports = function tokenizer(input, options = {}) {\n  let css = input.css.valueOf()\n  let ignore = options.ignoreErrors\n\n  let code, next, quote, content, escape\n  let escaped, escapePos, prev, n, currentToken\n\n  let length = css.length\n  let pos = 0\n  let buffer = []\n  let returned = []\n\n  function position() {\n    return pos\n  }\n\n  function unclosed(what) {\n    throw input.error('Unclosed ' + what, pos)\n  }\n\n  function endOfFile() {\n    return returned.length === 0 && pos >= length\n  }\n\n  function nextToken(opts) {\n    if (returned.length) return returned.pop()\n    if (pos >= length) return\n\n    let ignoreUnclosed = opts ? opts.ignoreUnclosed : false\n\n    code = css.charCodeAt(pos)\n\n    switch (code) {\n      case NEWLINE:\n      case SPACE:\n      case TAB:\n      case CR:\n      case FEED: {\n        next = pos\n        do {\n          next += 1\n          code = css.charCodeAt(next)\n        } while (\n          code === SPACE ||\n          code === NEWLINE ||\n          code === TAB ||\n          code === CR ||\n          code === FEED\n        )\n\n        currentToken = ['space', css.slice(pos, next)]\n        pos = next - 1\n        break\n      }\n\n      case OPEN_SQUARE:\n      case CLOSE_SQUARE:\n      case OPEN_CURLY:\n      case CLOSE_CURLY:\n      case COLON:\n      case SEMICOLON:\n      case CLOSE_PARENTHESES: {\n        let controlChar = String.fromCharCode(code)\n        currentToken = [controlChar, controlChar, pos]\n        break\n      }\n\n      case OPEN_PARENTHESES: {\n        prev = buffer.length ? buffer.pop()[1] : ''\n        n = css.charCodeAt(pos + 1)\n        if (\n          prev === 'url' &&\n          n !== SINGLE_QUOTE &&\n          n !== DOUBLE_QUOTE &&\n          n !== SPACE &&\n          n !== NEWLINE &&\n          n !== TAB &&\n          n !== FEED &&\n          n !== CR\n        ) {\n          next = pos\n          do {\n            escaped = false\n            next = css.indexOf(')', next + 1)\n            if (next === -1) {\n              if (ignore || ignoreUnclosed) {\n                next = pos\n                break\n              } else {\n                unclosed('bracket')\n              }\n            }\n            escapePos = next\n            while (css.charCodeAt(escapePos - 1) === BACKSLASH) {\n              escapePos -= 1\n              escaped = !escaped\n            }\n          } while (escaped)\n\n          currentToken = ['brackets', css.slice(pos, next + 1), pos, next]\n\n          pos = next\n        } else {\n          next = css.indexOf(')', pos + 1)\n          content = css.slice(pos, next + 1)\n\n          if (next === -1 || RE_BAD_BRACKET.test(content)) {\n            currentToken = ['(', '(', pos]\n          } else {\n            currentToken = ['brackets', content, pos, next]\n            pos = next\n          }\n        }\n\n        break\n      }\n\n      case SINGLE_QUOTE:\n      case DOUBLE_QUOTE: {\n        quote = code === SINGLE_QUOTE ? \"'\" : '\"'\n        next = pos\n        do {\n          escaped = false\n          next = css.indexOf(quote, next + 1)\n          if (next === -1) {\n            if (ignore || ignoreUnclosed) {\n              next = pos + 1\n              break\n            } else {\n              unclosed('string')\n            }\n          }\n          escapePos = next\n          while (css.charCodeAt(escapePos - 1) === BACKSLASH) {\n            escapePos -= 1\n            escaped = !escaped\n          }\n        } while (escaped)\n\n        currentToken = ['string', css.slice(pos, next + 1), pos, next]\n        pos = next\n        break\n      }\n\n      case AT: {\n        RE_AT_END.lastIndex = pos + 1\n        RE_AT_END.test(css)\n        if (RE_AT_END.lastIndex === 0) {\n          next = css.length - 1\n        } else {\n          next = RE_AT_END.lastIndex - 2\n        }\n\n        currentToken = ['at-word', css.slice(pos, next + 1), pos, next]\n\n        pos = next\n        break\n      }\n\n      case BACKSLASH: {\n        next = pos\n        escape = true\n        while (css.charCodeAt(next + 1) === BACKSLASH) {\n          next += 1\n          escape = !escape\n        }\n        code = css.charCodeAt(next + 1)\n        if (\n          escape &&\n          code !== SLASH &&\n          code !== SPACE &&\n          code !== NEWLINE &&\n          code !== TAB &&\n          code !== CR &&\n          code !== FEED\n        ) {\n          next += 1\n          if (RE_HEX_ESCAPE.test(css.charAt(next))) {\n            while (RE_HEX_ESCAPE.test(css.charAt(next + 1))) {\n              next += 1\n            }\n            if (css.charCodeAt(next + 1) === SPACE) {\n              next += 1\n            }\n          }\n        }\n\n        currentToken = ['word', css.slice(pos, next + 1), pos, next]\n\n        pos = next\n        break\n      }\n\n      default: {\n        if (code === SLASH && css.charCodeAt(pos + 1) === ASTERISK) {\n          next = css.indexOf('*/', pos + 2) + 1\n          if (next === 0) {\n            if (ignore || ignoreUnclosed) {\n              next = css.length\n            } else {\n              unclosed('comment')\n            }\n          }\n\n          currentToken = ['comment', css.slice(pos, next + 1), pos, next]\n          pos = next\n        } else {\n          RE_WORD_END.lastIndex = pos + 1\n          RE_WORD_END.test(css)\n          if (RE_WORD_END.lastIndex === 0) {\n            next = css.length - 1\n          } else {\n            next = RE_WORD_END.lastIndex - 2\n          }\n\n          currentToken = ['word', css.slice(pos, next + 1), pos, next]\n          buffer.push(currentToken)\n          pos = next\n        }\n\n        break\n      }\n    }\n\n    pos++\n    return currentToken\n  }\n\n  function back(token) {\n    returned.push(token)\n  }\n\n  return {\n    back,\n    nextToken,\n    endOfFile,\n    position\n  }\n}\n","'use strict'\n\nlet Container = require('./container')\n\nclass AtRule extends Container {\n  constructor(defaults) {\n    super(defaults)\n    this.type = 'atrule'\n  }\n\n  append(...children) {\n    if (!this.proxyOf.nodes) this.nodes = []\n    return super.append(...children)\n  }\n\n  prepend(...children) {\n    if (!this.proxyOf.nodes) this.nodes = []\n    return super.prepend(...children)\n  }\n}\n\nmodule.exports = AtRule\nAtRule.default = AtRule\n\nContainer.registerAtRule(AtRule)\n","'use strict'\n\nlet Container = require('./container')\n\nlet LazyResult, Processor\n\nclass Root extends Container {\n  constructor(defaults) {\n    super(defaults)\n    this.type = 'root'\n    if (!this.nodes) this.nodes = []\n  }\n\n  removeChild(child, ignore) {\n    let index = this.index(child)\n\n    if (!ignore && index === 0 && this.nodes.length > 1) {\n      this.nodes[1].raws.before = this.nodes[index].raws.before\n    }\n\n    return super.removeChild(child)\n  }\n\n  normalize(child, sample, type) {\n    let nodes = super.normalize(child)\n\n    if (sample) {\n      if (type === 'prepend') {\n        if (this.nodes.length > 1) {\n          sample.raws.before = this.nodes[1].raws.before\n        } else {\n          delete sample.raws.before\n        }\n      } else if (this.first !== sample) {\n        for (let node of nodes) {\n          node.raws.before = sample.raws.before\n        }\n      }\n    }\n\n    return nodes\n  }\n\n  toResult(opts = {}) {\n    let lazy = new LazyResult(new Processor(), this, opts)\n    return lazy.stringify()\n  }\n}\n\nRoot.registerLazyResult = dependant => {\n  LazyResult = dependant\n}\n\nRoot.registerProcessor = dependant => {\n  Processor = dependant\n}\n\nmodule.exports = Root\nRoot.default = Root\n\nContainer.registerRoot(Root)\n","'use strict'\n\nlet list = {\n  split(string, separators, last) {\n    let array = []\n    let current = ''\n    let split = false\n\n    let func = 0\n    let inQuote = false\n    let prevQuote = ''\n    let escape = false\n\n    for (let letter of string) {\n      if (escape) {\n        escape = false\n      } else if (letter === '\\\\') {\n        escape = true\n      } else if (inQuote) {\n        if (letter === prevQuote) {\n          inQuote = false\n        }\n      } else if (letter === '\"' || letter === \"'\") {\n        inQuote = true\n        prevQuote = letter\n      } else if (letter === '(') {\n        func += 1\n      } else if (letter === ')') {\n        if (func > 0) func -= 1\n      } else if (func === 0) {\n        if (separators.includes(letter)) split = true\n      }\n\n      if (split) {\n        if (current !== '') array.push(current.trim())\n        current = ''\n        split = false\n      } else {\n        current += letter\n      }\n    }\n\n    if (last || current !== '') array.push(current.trim())\n    return array\n  },\n\n  space(string) {\n    let spaces = [' ', '\\n', '\\t']\n    return list.split(string, spaces)\n  },\n\n  comma(string) {\n    return list.split(string, [','], true)\n  }\n}\n\nmodule.exports = list\nlist.default = list\n","'use strict'\n\nlet Container = require('./container')\nlet list = require('./list')\n\nclass Rule extends Container {\n  constructor(defaults) {\n    super(defaults)\n    this.type = 'rule'\n    if (!this.nodes) this.nodes = []\n  }\n\n  get selectors() {\n    return list.comma(this.selector)\n  }\n\n  set selectors(values) {\n    let match = this.selector ? this.selector.match(/,\\s*/) : null\n    let sep = match ? match[0] : ',' + this.raw('between', 'beforeOpen')\n    this.selector = values.join(sep)\n  }\n}\n\nmodule.exports = Rule\nRule.default = Rule\n\nContainer.registerRule(Rule)\n","'use strict'\n\nlet Declaration = require('./declaration')\nlet tokenizer = require('./tokenize')\nlet Comment = require('./comment')\nlet AtRule = require('./at-rule')\nlet Root = require('./root')\nlet Rule = require('./rule')\n\nconst SAFE_COMMENT_NEIGHBOR = {\n  empty: true,\n  space: true\n}\n\nfunction findLastWithPosition(tokens) {\n  for (let i = tokens.length - 1; i >= 0; i--) {\n    let token = tokens[i]\n    let pos = token[3] || token[2]\n    if (pos) return pos\n  }\n}\n\nclass Parser {\n  constructor(input) {\n    this.input = input\n\n    this.root = new Root()\n    this.current = this.root\n    this.spaces = ''\n    this.semicolon = false\n    this.customProperty = false\n\n    this.createTokenizer()\n    this.root.source = { input, start: { offset: 0, line: 1, column: 1 } }\n  }\n\n  createTokenizer() {\n    this.tokenizer = tokenizer(this.input)\n  }\n\n  parse() {\n    let token\n    while (!this.tokenizer.endOfFile()) {\n      token = this.tokenizer.nextToken()\n\n      switch (token[0]) {\n        case 'space':\n          this.spaces += token[1]\n          break\n\n        case ';':\n          this.freeSemicolon(token)\n          break\n\n        case '}':\n          this.end(token)\n          break\n\n        case 'comment':\n          this.comment(token)\n          break\n\n        case 'at-word':\n          this.atrule(token)\n          break\n\n        case '{':\n          this.emptyRule(token)\n          break\n\n        default:\n          this.other(token)\n          break\n      }\n    }\n    this.endFile()\n  }\n\n  comment(token) {\n    let node = new Comment()\n    this.init(node, token[2])\n    node.source.end = this.getPosition(token[3] || token[2])\n\n    let text = token[1].slice(2, -2)\n    if (/^\\s*$/.test(text)) {\n      node.text = ''\n      node.raws.left = text\n      node.raws.right = ''\n    } else {\n      let match = text.match(/^(\\s*)([^]*\\S)(\\s*)$/)\n      node.text = match[2]\n      node.raws.left = match[1]\n      node.raws.right = match[3]\n    }\n  }\n\n  emptyRule(token) {\n    let node = new Rule()\n    this.init(node, token[2])\n    node.selector = ''\n    node.raws.between = ''\n    this.current = node\n  }\n\n  other(start) {\n    let end = false\n    let type = null\n    let colon = false\n    let bracket = null\n    let brackets = []\n    let customProperty = start[1].startsWith('--')\n\n    let tokens = []\n    let token = start\n    while (token) {\n      type = token[0]\n      tokens.push(token)\n\n      if (type === '(' || type === '[') {\n        if (!bracket) bracket = token\n        brackets.push(type === '(' ? ')' : ']')\n      } else if (customProperty && colon && type === '{') {\n        if (!bracket) bracket = token\n        brackets.push('}')\n      } else if (brackets.length === 0) {\n        if (type === ';') {\n          if (colon) {\n            this.decl(tokens, customProperty)\n            return\n          } else {\n            break\n          }\n        } else if (type === '{') {\n          this.rule(tokens)\n          return\n        } else if (type === '}') {\n          this.tokenizer.back(tokens.pop())\n          end = true\n          break\n        } else if (type === ':') {\n          colon = true\n        }\n      } else if (type === brackets[brackets.length - 1]) {\n        brackets.pop()\n        if (brackets.length === 0) bracket = null\n      }\n\n      token = this.tokenizer.nextToken()\n    }\n\n    if (this.tokenizer.endOfFile()) end = true\n    if (brackets.length > 0) this.unclosedBracket(bracket)\n\n    if (end && colon) {\n      if (!customProperty) {\n        while (tokens.length) {\n          token = tokens[tokens.length - 1][0]\n          if (token !== 'space' && token !== 'comment') break\n          this.tokenizer.back(tokens.pop())\n        }\n      }\n      this.decl(tokens, customProperty)\n    } else {\n      this.unknownWord(tokens)\n    }\n  }\n\n  rule(tokens) {\n    tokens.pop()\n\n    let node = new Rule()\n    this.init(node, tokens[0][2])\n\n    node.raws.between = this.spacesAndCommentsFromEnd(tokens)\n    this.raw(node, 'selector', tokens)\n    this.current = node\n  }\n\n  decl(tokens, customProperty) {\n    let node = new Declaration()\n    this.init(node, tokens[0][2])\n\n    let last = tokens[tokens.length - 1]\n    if (last[0] === ';') {\n      this.semicolon = true\n      tokens.pop()\n    }\n\n    node.source.end = this.getPosition(\n      last[3] || last[2] || findLastWithPosition(tokens)\n    )\n\n    while (tokens[0][0] !== 'word') {\n      if (tokens.length === 1) this.unknownWord(tokens)\n      node.raws.before += tokens.shift()[1]\n    }\n    node.source.start = this.getPosition(tokens[0][2])\n\n    node.prop = ''\n    while (tokens.length) {\n      let type = tokens[0][0]\n      if (type === ':' || type === 'space' || type === 'comment') {\n        break\n      }\n      node.prop += tokens.shift()[1]\n    }\n\n    node.raws.between = ''\n\n    let token\n    while (tokens.length) {\n      token = tokens.shift()\n\n      if (token[0] === ':') {\n        node.raws.between += token[1]\n        break\n      } else {\n        if (token[0] === 'word' && /\\w/.test(token[1])) {\n          this.unknownWord([token])\n        }\n        node.raws.between += token[1]\n      }\n    }\n\n    if (node.prop[0] === '_' || node.prop[0] === '*') {\n      node.raws.before += node.prop[0]\n      node.prop = node.prop.slice(1)\n    }\n\n    let firstSpaces = []\n    let next\n    while (tokens.length) {\n      next = tokens[0][0]\n      if (next !== 'space' && next !== 'comment') break\n      firstSpaces.push(tokens.shift())\n    }\n\n    this.precheckMissedSemicolon(tokens)\n\n    for (let i = tokens.length - 1; i >= 0; i--) {\n      token = tokens[i]\n      if (token[1].toLowerCase() === '!important') {\n        node.important = true\n        let string = this.stringFrom(tokens, i)\n        string = this.spacesFromEnd(tokens) + string\n        if (string !== ' !important') node.raws.important = string\n        break\n      } else if (token[1].toLowerCase() === 'important') {\n        let cache = tokens.slice(0)\n        let str = ''\n        for (let j = i; j > 0; j--) {\n          let type = cache[j][0]\n          if (str.trim().indexOf('!') === 0 && type !== 'space') {\n            break\n          }\n          str = cache.pop()[1] + str\n        }\n        if (str.trim().indexOf('!') === 0) {\n          node.important = true\n          node.raws.important = str\n          tokens = cache\n        }\n      }\n\n      if (token[0] !== 'space' && token[0] !== 'comment') {\n        break\n      }\n    }\n\n    let hasWord = tokens.some(i => i[0] !== 'space' && i[0] !== 'comment')\n\n    if (hasWord) {\n      node.raws.between += firstSpaces.map(i => i[1]).join('')\n      firstSpaces = []\n    }\n    this.raw(node, 'value', firstSpaces.concat(tokens), customProperty)\n\n    if (node.value.includes(':') && !customProperty) {\n      this.checkMissedSemicolon(tokens)\n    }\n  }\n\n  atrule(token) {\n    let node = new AtRule()\n    node.name = token[1].slice(1)\n    if (node.name === '') {\n      this.unnamedAtrule(node, token)\n    }\n    this.init(node, token[2])\n\n    let type\n    let prev\n    let shift\n    let last = false\n    let open = false\n    let params = []\n    let brackets = []\n\n    while (!this.tokenizer.endOfFile()) {\n      token = this.tokenizer.nextToken()\n      type = token[0]\n\n      if (type === '(' || type === '[') {\n        brackets.push(type === '(' ? ')' : ']')\n      } else if (type === '{' && brackets.length > 0) {\n        brackets.push('}')\n      } else if (type === brackets[brackets.length - 1]) {\n        brackets.pop()\n      }\n\n      if (brackets.length === 0) {\n        if (type === ';') {\n          node.source.end = this.getPosition(token[2])\n          this.semicolon = true\n          break\n        } else if (type === '{') {\n          open = true\n          break\n        } else if (type === '}') {\n          if (params.length > 0) {\n            shift = params.length - 1\n            prev = params[shift]\n            while (prev && prev[0] === 'space') {\n              prev = params[--shift]\n            }\n            if (prev) {\n              node.source.end = this.getPosition(prev[3] || prev[2])\n            }\n          }\n          this.end(token)\n          break\n        } else {\n          params.push(token)\n        }\n      } else {\n        params.push(token)\n      }\n\n      if (this.tokenizer.endOfFile()) {\n        last = true\n        break\n      }\n    }\n\n    node.raws.between = this.spacesAndCommentsFromEnd(params)\n    if (params.length) {\n      node.raws.afterName = this.spacesAndCommentsFromStart(params)\n      this.raw(node, 'params', params)\n      if (last) {\n        token = params[params.length - 1]\n        node.source.end = this.getPosition(token[3] || token[2])\n        this.spaces = node.raws.between\n        node.raws.between = ''\n      }\n    } else {\n      node.raws.afterName = ''\n      node.params = ''\n    }\n\n    if (open) {\n      node.nodes = []\n      this.current = node\n    }\n  }\n\n  end(token) {\n    if (this.current.nodes && this.current.nodes.length) {\n      this.current.raws.semicolon = this.semicolon\n    }\n    this.semicolon = false\n\n    this.current.raws.after = (this.current.raws.after || '') + this.spaces\n    this.spaces = ''\n\n    if (this.current.parent) {\n      this.current.source.end = this.getPosition(token[2])\n      this.current = this.current.parent\n    } else {\n      this.unexpectedClose(token)\n    }\n  }\n\n  endFile() {\n    if (this.current.parent) this.unclosedBlock()\n    if (this.current.nodes && this.current.nodes.length) {\n      this.current.raws.semicolon = this.semicolon\n    }\n    this.current.raws.after = (this.current.raws.after || '') + this.spaces\n  }\n\n  freeSemicolon(token) {\n    this.spaces += token[1]\n    if (this.current.nodes) {\n      let prev = this.current.nodes[this.current.nodes.length - 1]\n      if (prev && prev.type === 'rule' && !prev.raws.ownSemicolon) {\n        prev.raws.ownSemicolon = this.spaces\n        this.spaces = ''\n      }\n    }\n  }\n\n  // Helpers\n\n  getPosition(offset) {\n    let pos = this.input.fromOffset(offset)\n    return {\n      offset,\n      line: pos.line,\n      column: pos.col\n    }\n  }\n\n  init(node, offset) {\n    this.current.push(node)\n    node.source = {\n      start: this.getPosition(offset),\n      input: this.input\n    }\n    node.raws.before = this.spaces\n    this.spaces = ''\n    if (node.type !== 'comment') this.semicolon = false\n  }\n\n  raw(node, prop, tokens, customProperty) {\n    let token, type\n    let length = tokens.length\n    let value = ''\n    let clean = true\n    let next, prev\n\n    for (let i = 0; i < length; i += 1) {\n      token = tokens[i]\n      type = token[0]\n      if (type === 'space' && i === length - 1 && !customProperty) {\n        clean = false\n      } else if (type === 'comment') {\n        prev = tokens[i - 1] ? tokens[i - 1][0] : 'empty'\n        next = tokens[i + 1] ? tokens[i + 1][0] : 'empty'\n        if (!SAFE_COMMENT_NEIGHBOR[prev] && !SAFE_COMMENT_NEIGHBOR[next]) {\n          if (value.slice(-1) === ',') {\n            clean = false\n          } else {\n            value += token[1]\n          }\n        } else {\n          clean = false\n        }\n      } else {\n        value += token[1]\n      }\n    }\n    if (!clean) {\n      let raw = tokens.reduce((all, i) => all + i[1], '')\n      node.raws[prop] = { value, raw }\n    }\n    node[prop] = value\n  }\n\n  spacesAndCommentsFromEnd(tokens) {\n    let lastTokenType\n    let spaces = ''\n    while (tokens.length) {\n      lastTokenType = tokens[tokens.length - 1][0]\n      if (lastTokenType !== 'space' && lastTokenType !== 'comment') break\n      spaces = tokens.pop()[1] + spaces\n    }\n    return spaces\n  }\n\n  spacesAndCommentsFromStart(tokens) {\n    let next\n    let spaces = ''\n    while (tokens.length) {\n      next = tokens[0][0]\n      if (next !== 'space' && next !== 'comment') break\n      spaces += tokens.shift()[1]\n    }\n    return spaces\n  }\n\n  spacesFromEnd(tokens) {\n    let lastTokenType\n    let spaces = ''\n    while (tokens.length) {\n      lastTokenType = tokens[tokens.length - 1][0]\n      if (lastTokenType !== 'space') break\n      spaces = tokens.pop()[1] + spaces\n    }\n    return spaces\n  }\n\n  stringFrom(tokens, from) {\n    let result = ''\n    for (let i = from; i < tokens.length; i++) {\n      result += tokens[i][1]\n    }\n    tokens.splice(from, tokens.length - from)\n    return result\n  }\n\n  colon(tokens) {\n    let brackets = 0\n    let token, type, prev\n    for (let [i, element] of tokens.entries()) {\n      token = element\n      type = token[0]\n\n      if (type === '(') {\n        brackets += 1\n      }\n      if (type === ')') {\n        brackets -= 1\n      }\n      if (brackets === 0 && type === ':') {\n        if (!prev) {\n          this.doubleColon(token)\n        } else if (prev[0] === 'word' && prev[1] === 'progid') {\n          continue\n        } else {\n          return i\n        }\n      }\n\n      prev = token\n    }\n    return false\n  }\n\n  // Errors\n\n  unclosedBracket(bracket) {\n    throw this.input.error(\n      'Unclosed bracket',\n      { offset: bracket[2] },\n      { offset: bracket[2] + 1 }\n    )\n  }\n\n  unknownWord(tokens) {\n    throw this.input.error(\n      'Unknown word',\n      { offset: tokens[0][2] },\n      { offset: tokens[0][2] + tokens[0][1].length }\n    )\n  }\n\n  unexpectedClose(token) {\n    throw this.input.error(\n      'Unexpected }',\n      { offset: token[2] },\n      { offset: token[2] + 1 }\n    )\n  }\n\n  unclosedBlock() {\n    let pos = this.current.source.start\n    throw this.input.error('Unclosed block', pos.line, pos.column)\n  }\n\n  doubleColon(token) {\n    throw this.input.error(\n      'Double colon',\n      { offset: token[2] },\n      { offset: token[2] + token[1].length }\n    )\n  }\n\n  unnamedAtrule(node, token) {\n    throw this.input.error(\n      'At-rule without name',\n      { offset: token[2] },\n      { offset: token[2] + token[1].length }\n    )\n  }\n\n  precheckMissedSemicolon(/* tokens */) {\n    // Hook for Safe Parser\n  }\n\n  checkMissedSemicolon(tokens) {\n    let colon = this.colon(tokens)\n    if (colon === false) return\n\n    let founded = 0\n    let token\n    for (let j = colon - 1; j >= 0; j--) {\n      token = tokens[j]\n      if (token[0] !== 'space') {\n        founded += 1\n        if (founded === 2) break\n      }\n    }\n    // If the token is a word, e.g. `!important`, `red` or any other valid property's value.\n    // Then we need to return the colon after that word token. [3] is the \"end\" colon of that word.\n    // And because we need it after that one we do +1 to get the next one.\n    throw this.input.error(\n      'Missed semicolon',\n      token[0] === 'word' ? token[3] + 1 : token[2]\n    )\n  }\n}\n\nmodule.exports = Parser\n","'use strict'\n\nlet Container = require('./container')\nlet Parser = require('./parser')\nlet Input = require('./input')\n\nfunction parse(css, opts) {\n  let input = new Input(css, opts)\n  let parser = new Parser(input)\n  try {\n    parser.parse()\n  } catch (e) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (e.name === 'CssSyntaxError' && opts && opts.from) {\n        if (/\\.scss$/i.test(opts.from)) {\n          e.message +=\n            '\\nYou tried to parse SCSS with ' +\n            'the standard CSS parser; ' +\n            'try again with the postcss-scss parser'\n        } else if (/\\.sass/i.test(opts.from)) {\n          e.message +=\n            '\\nYou tried to parse Sass with ' +\n            'the standard CSS parser; ' +\n            'try again with the postcss-sass parser'\n        } else if (/\\.less$/i.test(opts.from)) {\n          e.message +=\n            '\\nYou tried to parse Less with ' +\n            'the standard CSS parser; ' +\n            'try again with the postcss-less parser'\n        }\n      }\n    }\n    throw e\n  }\n\n  return parser.root\n}\n\nmodule.exports = parse\nparse.default = parse\n\nContainer.registerParse(parse)\n","'use strict'\n\nlet { isClean, my } = require('./symbols')\nlet MapGenerator = require('./map-generator')\nlet stringify = require('./stringify')\nlet Container = require('./container')\nlet Document = require('./document')\nlet warnOnce = require('./warn-once')\nlet Result = require('./result')\nlet parse = require('./parse')\nlet Root = require('./root')\n\nconst TYPE_TO_CLASS_NAME = {\n  document: 'Document',\n  root: 'Root',\n  atrule: 'AtRule',\n  rule: 'Rule',\n  decl: 'Declaration',\n  comment: 'Comment'\n}\n\nconst PLUGIN_PROPS = {\n  postcssPlugin: true,\n  prepare: true,\n  Once: true,\n  Document: true,\n  Root: true,\n  Declaration: true,\n  Rule: true,\n  AtRule: true,\n  Comment: true,\n  DeclarationExit: true,\n  RuleExit: true,\n  AtRuleExit: true,\n  CommentExit: true,\n  RootExit: true,\n  DocumentExit: true,\n  OnceExit: true\n}\n\nconst NOT_VISITORS = {\n  postcssPlugin: true,\n  prepare: true,\n  Once: true\n}\n\nconst CHILDREN = 0\n\nfunction isPromise(obj) {\n  return typeof obj === 'object' && typeof obj.then === 'function'\n}\n\nfunction getEvents(node) {\n  let key = false\n  let type = TYPE_TO_CLASS_NAME[node.type]\n  if (node.type === 'decl') {\n    key = node.prop.toLowerCase()\n  } else if (node.type === 'atrule') {\n    key = node.name.toLowerCase()\n  }\n\n  if (key && node.append) {\n    return [\n      type,\n      type + '-' + key,\n      CHILDREN,\n      type + 'Exit',\n      type + 'Exit-' + key\n    ]\n  } else if (key) {\n    return [type, type + '-' + key, type + 'Exit', type + 'Exit-' + key]\n  } else if (node.append) {\n    return [type, CHILDREN, type + 'Exit']\n  } else {\n    return [type, type + 'Exit']\n  }\n}\n\nfunction toStack(node) {\n  let events\n  if (node.type === 'document') {\n    events = ['Document', CHILDREN, 'DocumentExit']\n  } else if (node.type === 'root') {\n    events = ['Root', CHILDREN, 'RootExit']\n  } else {\n    events = getEvents(node)\n  }\n\n  return {\n    node,\n    events,\n    eventIndex: 0,\n    visitors: [],\n    visitorIndex: 0,\n    iterator: 0\n  }\n}\n\nfunction cleanMarks(node) {\n  node[isClean] = false\n  if (node.nodes) node.nodes.forEach(i => cleanMarks(i))\n  return node\n}\n\nlet postcss = {}\n\nclass LazyResult {\n  constructor(processor, css, opts) {\n    this.stringified = false\n    this.processed = false\n\n    let root\n    if (\n      typeof css === 'object' &&\n      css !== null &&\n      (css.type === 'root' || css.type === 'document')\n    ) {\n      root = cleanMarks(css)\n    } else if (css instanceof LazyResult || css instanceof Result) {\n      root = cleanMarks(css.root)\n      if (css.map) {\n        if (typeof opts.map === 'undefined') opts.map = {}\n        if (!opts.map.inline) opts.map.inline = false\n        opts.map.prev = css.map\n      }\n    } else {\n      let parser = parse\n      if (opts.syntax) parser = opts.syntax.parse\n      if (opts.parser) parser = opts.parser\n      if (parser.parse) parser = parser.parse\n\n      try {\n        root = parser(css, opts)\n      } catch (error) {\n        this.processed = true\n        this.error = error\n      }\n\n      if (root && !root[my]) {\n        /* c8 ignore next 2 */\n        Container.rebuild(root)\n      }\n    }\n\n    this.result = new Result(processor, root, opts)\n    this.helpers = { ...postcss, result: this.result, postcss }\n    this.plugins = this.processor.plugins.map(plugin => {\n      if (typeof plugin === 'object' && plugin.prepare) {\n        return { ...plugin, ...plugin.prepare(this.result) }\n      } else {\n        return plugin\n      }\n    })\n  }\n\n  get [Symbol.toStringTag]() {\n    return 'LazyResult'\n  }\n\n  get processor() {\n    return this.result.processor\n  }\n\n  get opts() {\n    return this.result.opts\n  }\n\n  get css() {\n    return this.stringify().css\n  }\n\n  get content() {\n    return this.stringify().content\n  }\n\n  get map() {\n    return this.stringify().map\n  }\n\n  get root() {\n    return this.sync().root\n  }\n\n  get messages() {\n    return this.sync().messages\n  }\n\n  warnings() {\n    return this.sync().warnings()\n  }\n\n  toString() {\n    return this.css\n  }\n\n  then(onFulfilled, onRejected) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (!('from' in this.opts)) {\n        warnOnce(\n          'Without `from` option PostCSS could generate wrong source map ' +\n            'and will not find Browserslist config. Set it to CSS file path ' +\n            'or to `undefined` to prevent this warning.'\n        )\n      }\n    }\n    return this.async().then(onFulfilled, onRejected)\n  }\n\n  catch(onRejected) {\n    return this.async().catch(onRejected)\n  }\n\n  finally(onFinally) {\n    return this.async().then(onFinally, onFinally)\n  }\n\n  async() {\n    if (this.error) return Promise.reject(this.error)\n    if (this.processed) return Promise.resolve(this.result)\n    if (!this.processing) {\n      this.processing = this.runAsync()\n    }\n    return this.processing\n  }\n\n  sync() {\n    if (this.error) throw this.error\n    if (this.processed) return this.result\n    this.processed = true\n\n    if (this.processing) {\n      throw this.getAsyncError()\n    }\n\n    for (let plugin of this.plugins) {\n      let promise = this.runOnRoot(plugin)\n      if (isPromise(promise)) {\n        throw this.getAsyncError()\n      }\n    }\n\n    this.prepareVisitors()\n    if (this.hasListener) {\n      let root = this.result.root\n      while (!root[isClean]) {\n        root[isClean] = true\n        this.walkSync(root)\n      }\n      if (this.listeners.OnceExit) {\n        if (root.type === 'document') {\n          for (let subRoot of root.nodes) {\n            this.visitSync(this.listeners.OnceExit, subRoot)\n          }\n        } else {\n          this.visitSync(this.listeners.OnceExit, root)\n        }\n      }\n    }\n\n    return this.result\n  }\n\n  stringify() {\n    if (this.error) throw this.error\n    if (this.stringified) return this.result\n    this.stringified = true\n\n    this.sync()\n\n    let opts = this.result.opts\n    let str = stringify\n    if (opts.syntax) str = opts.syntax.stringify\n    if (opts.stringifier) str = opts.stringifier\n    if (str.stringify) str = str.stringify\n\n    let map = new MapGenerator(str, this.result.root, this.result.opts)\n    let data = map.generate()\n    this.result.css = data[0]\n    this.result.map = data[1]\n\n    return this.result\n  }\n\n  walkSync(node) {\n    node[isClean] = true\n    let events = getEvents(node)\n    for (let event of events) {\n      if (event === CHILDREN) {\n        if (node.nodes) {\n          node.each(child => {\n            if (!child[isClean]) this.walkSync(child)\n          })\n        }\n      } else {\n        let visitors = this.listeners[event]\n        if (visitors) {\n          if (this.visitSync(visitors, node.toProxy())) return\n        }\n      }\n    }\n  }\n\n  visitSync(visitors, node) {\n    for (let [plugin, visitor] of visitors) {\n      this.result.lastPlugin = plugin\n      let promise\n      try {\n        promise = visitor(node, this.helpers)\n      } catch (e) {\n        throw this.handleError(e, node.proxyOf)\n      }\n      if (node.type !== 'root' && node.type !== 'document' && !node.parent) {\n        return true\n      }\n      if (isPromise(promise)) {\n        throw this.getAsyncError()\n      }\n    }\n  }\n\n  runOnRoot(plugin) {\n    this.result.lastPlugin = plugin\n    try {\n      if (typeof plugin === 'object' && plugin.Once) {\n        if (this.result.root.type === 'document') {\n          let roots = this.result.root.nodes.map(root =>\n            plugin.Once(root, this.helpers)\n          )\n\n          if (isPromise(roots[0])) {\n            return Promise.all(roots)\n          }\n\n          return roots\n        }\n\n        return plugin.Once(this.result.root, this.helpers)\n      } else if (typeof plugin === 'function') {\n        return plugin(this.result.root, this.result)\n      }\n    } catch (error) {\n      throw this.handleError(error)\n    }\n  }\n\n  getAsyncError() {\n    throw new Error('Use process(css).then(cb) to work with async plugins')\n  }\n\n  handleError(error, node) {\n    let plugin = this.result.lastPlugin\n    try {\n      if (node) node.addToError(error)\n      this.error = error\n      if (error.name === 'CssSyntaxError' && !error.plugin) {\n        error.plugin = plugin.postcssPlugin\n        error.setMessage()\n      } else if (plugin.postcssVersion) {\n        if (process.env.NODE_ENV !== 'production') {\n          let pluginName = plugin.postcssPlugin\n          let pluginVer = plugin.postcssVersion\n          let runtimeVer = this.result.processor.version\n          let a = pluginVer.split('.')\n          let b = runtimeVer.split('.')\n\n          if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) {\n            // eslint-disable-next-line no-console\n            console.error(\n              'Unknown error from PostCSS plugin. Your current PostCSS ' +\n                'version is ' +\n                runtimeVer +\n                ', but ' +\n                pluginName +\n                ' uses ' +\n                pluginVer +\n                '. Perhaps this is the source of the error below.'\n            )\n          }\n        }\n      }\n    } catch (err) {\n      /* c8 ignore next 3 */\n      // eslint-disable-next-line no-console\n      if (console && console.error) console.error(err)\n    }\n    return error\n  }\n\n  async runAsync() {\n    this.plugin = 0\n    for (let i = 0; i < this.plugins.length; i++) {\n      let plugin = this.plugins[i]\n      let promise = this.runOnRoot(plugin)\n      if (isPromise(promise)) {\n        try {\n          await promise\n        } catch (error) {\n          throw this.handleError(error)\n        }\n      }\n    }\n\n    this.prepareVisitors()\n    if (this.hasListener) {\n      let root = this.result.root\n      while (!root[isClean]) {\n        root[isClean] = true\n        let stack = [toStack(root)]\n        while (stack.length > 0) {\n          let promise = this.visitTick(stack)\n          if (isPromise(promise)) {\n            try {\n              await promise\n            } catch (e) {\n              let node = stack[stack.length - 1].node\n              throw this.handleError(e, node)\n            }\n          }\n        }\n      }\n\n      if (this.listeners.OnceExit) {\n        for (let [plugin, visitor] of this.listeners.OnceExit) {\n          this.result.lastPlugin = plugin\n          try {\n            if (root.type === 'document') {\n              let roots = root.nodes.map(subRoot =>\n                visitor(subRoot, this.helpers)\n              )\n\n              await Promise.all(roots)\n            } else {\n              await visitor(root, this.helpers)\n            }\n          } catch (e) {\n            throw this.handleError(e)\n          }\n        }\n      }\n    }\n\n    this.processed = true\n    return this.stringify()\n  }\n\n  prepareVisitors() {\n    this.listeners = {}\n    let add = (plugin, type, cb) => {\n      if (!this.listeners[type]) this.listeners[type] = []\n      this.listeners[type].push([plugin, cb])\n    }\n    for (let plugin of this.plugins) {\n      if (typeof plugin === 'object') {\n        for (let event in plugin) {\n          if (!PLUGIN_PROPS[event] && /^[A-Z]/.test(event)) {\n            throw new Error(\n              `Unknown event ${event} in ${plugin.postcssPlugin}. ` +\n                `Try to update PostCSS (${this.processor.version} now).`\n            )\n          }\n          if (!NOT_VISITORS[event]) {\n            if (typeof plugin[event] === 'object') {\n              for (let filter in plugin[event]) {\n                if (filter === '*') {\n                  add(plugin, event, plugin[event][filter])\n                } else {\n                  add(\n                    plugin,\n                    event + '-' + filter.toLowerCase(),\n                    plugin[event][filter]\n                  )\n                }\n              }\n            } else if (typeof plugin[event] === 'function') {\n              add(plugin, event, plugin[event])\n            }\n          }\n        }\n      }\n    }\n    this.hasListener = Object.keys(this.listeners).length > 0\n  }\n\n  visitTick(stack) {\n    let visit = stack[stack.length - 1]\n    let { node, visitors } = visit\n\n    if (node.type !== 'root' && node.type !== 'document' && !node.parent) {\n      stack.pop()\n      return\n    }\n\n    if (visitors.length > 0 && visit.visitorIndex < visitors.length) {\n      let [plugin, visitor] = visitors[visit.visitorIndex]\n      visit.visitorIndex += 1\n      if (visit.visitorIndex === visitors.length) {\n        visit.visitors = []\n        visit.visitorIndex = 0\n      }\n      this.result.lastPlugin = plugin\n      try {\n        return visitor(node.toProxy(), this.helpers)\n      } catch (e) {\n        throw this.handleError(e, node)\n      }\n    }\n\n    if (visit.iterator !== 0) {\n      let iterator = visit.iterator\n      let child\n      while ((child = node.nodes[node.indexes[iterator]])) {\n        node.indexes[iterator] += 1\n        if (!child[isClean]) {\n          child[isClean] = true\n          stack.push(toStack(child))\n          return\n        }\n      }\n      visit.iterator = 0\n      delete node.indexes[iterator]\n    }\n\n    let events = visit.events\n    while (visit.eventIndex < events.length) {\n      let event = events[visit.eventIndex]\n      visit.eventIndex += 1\n      if (event === CHILDREN) {\n        if (node.nodes && node.nodes.length) {\n          node[isClean] = true\n          visit.iterator = node.getIterator()\n        }\n        return\n      } else if (this.listeners[event]) {\n        visit.visitors = this.listeners[event]\n        return\n      }\n    }\n    stack.pop()\n  }\n}\n\nLazyResult.registerPostcss = dependant => {\n  postcss = dependant\n}\n\nmodule.exports = LazyResult\nLazyResult.default = LazyResult\n\nRoot.registerLazyResult(LazyResult)\nDocument.registerLazyResult(LazyResult)\n","'use strict'\n\nlet MapGenerator = require('./map-generator')\nlet stringify = require('./stringify')\nlet warnOnce = require('./warn-once')\nlet parse = require('./parse')\nconst Result = require('./result')\n\nclass NoWorkResult {\n  constructor(processor, css, opts) {\n    css = css.toString()\n    this.stringified = false\n\n    this._processor = processor\n    this._css = css\n    this._opts = opts\n    this._map = undefined\n    let root\n\n    let str = stringify\n    this.result = new Result(this._processor, root, this._opts)\n    this.result.css = css\n\n    let self = this\n    Object.defineProperty(this.result, 'root', {\n      get() {\n        return self.root\n      }\n    })\n\n    let map = new MapGenerator(str, root, this._opts, css)\n    if (map.isMap()) {\n      let [generatedCSS, generatedMap] = map.generate()\n      if (generatedCSS) {\n        this.result.css = generatedCSS\n      }\n      if (generatedMap) {\n        this.result.map = generatedMap\n      }\n    }\n  }\n\n  get [Symbol.toStringTag]() {\n    return 'NoWorkResult'\n  }\n\n  get processor() {\n    return this.result.processor\n  }\n\n  get opts() {\n    return this.result.opts\n  }\n\n  get css() {\n    return this.result.css\n  }\n\n  get content() {\n    return this.result.css\n  }\n\n  get map() {\n    return this.result.map\n  }\n\n  get root() {\n    if (this._root) {\n      return this._root\n    }\n\n    let root\n    let parser = parse\n\n    try {\n      root = parser(this._css, this._opts)\n    } catch (error) {\n      this.error = error\n    }\n\n    if (this.error) {\n      throw this.error\n    } else {\n      this._root = root\n      return root\n    }\n  }\n\n  get messages() {\n    return []\n  }\n\n  warnings() {\n    return []\n  }\n\n  toString() {\n    return this._css\n  }\n\n  then(onFulfilled, onRejected) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (!('from' in this._opts)) {\n        warnOnce(\n          'Without `from` option PostCSS could generate wrong source map ' +\n            'and will not find Browserslist config. Set it to CSS file path ' +\n            'or to `undefined` to prevent this warning.'\n        )\n      }\n    }\n\n    return this.async().then(onFulfilled, onRejected)\n  }\n\n  catch(onRejected) {\n    return this.async().catch(onRejected)\n  }\n\n  finally(onFinally) {\n    return this.async().then(onFinally, onFinally)\n  }\n\n  async() {\n    if (this.error) return Promise.reject(this.error)\n    return Promise.resolve(this.result)\n  }\n\n  sync() {\n    if (this.error) throw this.error\n    return this.result\n  }\n}\n\nmodule.exports = NoWorkResult\nNoWorkResult.default = NoWorkResult\n","'use strict'\n\nlet NoWorkResult = require('./no-work-result')\nlet LazyResult = require('./lazy-result')\nlet Document = require('./document')\nlet Root = require('./root')\n\nclass Processor {\n  constructor(plugins = []) {\n    this.version = '8.4.23'\n    this.plugins = this.normalize(plugins)\n  }\n\n  use(plugin) {\n    this.plugins = this.plugins.concat(this.normalize([plugin]))\n    return this\n  }\n\n  process(css, opts = {}) {\n    if (\n      this.plugins.length === 0 &&\n      typeof opts.parser === 'undefined' &&\n      typeof opts.stringifier === 'undefined' &&\n      typeof opts.syntax === 'undefined'\n    ) {\n      return new NoWorkResult(this, css, opts)\n    } else {\n      return new LazyResult(this, css, opts)\n    }\n  }\n\n  normalize(plugins) {\n    let normalized = []\n    for (let i of plugins) {\n      if (i.postcss === true) {\n        i = i()\n      } else if (i.postcss) {\n        i = i.postcss\n      }\n\n      if (typeof i === 'object' && Array.isArray(i.plugins)) {\n        normalized = normalized.concat(i.plugins)\n      } else if (typeof i === 'object' && i.postcssPlugin) {\n        normalized.push(i)\n      } else if (typeof i === 'function') {\n        normalized.push(i)\n      } else if (typeof i === 'object' && (i.parse || i.stringify)) {\n        if (process.env.NODE_ENV !== 'production') {\n          throw new Error(\n            'PostCSS syntaxes cannot be used as plugins. Instead, please use ' +\n              'one of the syntax/parser/stringifier options as outlined ' +\n              'in your PostCSS runner documentation.'\n          )\n        }\n      } else {\n        throw new Error(i + ' is not a PostCSS plugin')\n      }\n    }\n    return normalized\n  }\n}\n\nmodule.exports = Processor\nProcessor.default = Processor\n\nRoot.registerProcessor(Processor)\nDocument.registerProcessor(Processor)\n","'use strict'\n\nlet Declaration = require('./declaration')\nlet PreviousMap = require('./previous-map')\nlet Comment = require('./comment')\nlet AtRule = require('./at-rule')\nlet Input = require('./input')\nlet Root = require('./root')\nlet Rule = require('./rule')\n\nfunction fromJSON(json, inputs) {\n  if (Array.isArray(json)) return json.map(n => fromJSON(n))\n\n  let { inputs: ownInputs, ...defaults } = json\n  if (ownInputs) {\n    inputs = []\n    for (let input of ownInputs) {\n      let inputHydrated = { ...input, __proto__: Input.prototype }\n      if (inputHydrated.map) {\n        inputHydrated.map = {\n          ...inputHydrated.map,\n          __proto__: PreviousMap.prototype\n        }\n      }\n      inputs.push(inputHydrated)\n    }\n  }\n  if (defaults.nodes) {\n    defaults.nodes = json.nodes.map(n => fromJSON(n, inputs))\n  }\n  if (defaults.source) {\n    let { inputId, ...source } = defaults.source\n    defaults.source = source\n    if (inputId != null) {\n      defaults.source.input = inputs[inputId]\n    }\n  }\n  if (defaults.type === 'root') {\n    return new Root(defaults)\n  } else if (defaults.type === 'decl') {\n    return new Declaration(defaults)\n  } else if (defaults.type === 'rule') {\n    return new Rule(defaults)\n  } else if (defaults.type === 'comment') {\n    return new Comment(defaults)\n  } else if (defaults.type === 'atrule') {\n    return new AtRule(defaults)\n  } else {\n    throw new Error('Unknown node type: ' + json.type)\n  }\n}\n\nmodule.exports = fromJSON\nfromJSON.default = fromJSON\n","'use strict'\n\nlet CssSyntaxError = require('./css-syntax-error')\nlet Declaration = require('./declaration')\nlet LazyResult = require('./lazy-result')\nlet Container = require('./container')\nlet Processor = require('./processor')\nlet stringify = require('./stringify')\nlet fromJSON = require('./fromJSON')\nlet Document = require('./document')\nlet Warning = require('./warning')\nlet Comment = require('./comment')\nlet AtRule = require('./at-rule')\nlet Result = require('./result.js')\nlet Input = require('./input')\nlet parse = require('./parse')\nlet list = require('./list')\nlet Rule = require('./rule')\nlet Root = require('./root')\nlet Node = require('./node')\n\nfunction postcss(...plugins) {\n  if (plugins.length === 1 && Array.isArray(plugins[0])) {\n    plugins = plugins[0]\n  }\n  return new Processor(plugins)\n}\n\npostcss.plugin = function plugin(name, initializer) {\n  let warningPrinted = false\n  function creator(...args) {\n    // eslint-disable-next-line no-console\n    if (console && console.warn && !warningPrinted) {\n      warningPrinted = true\n      // eslint-disable-next-line no-console\n      console.warn(\n        name +\n          ': postcss.plugin was deprecated. Migration guide:\\n' +\n          'https://evilmartians.com/chronicles/postcss-8-plugin-migration'\n      )\n      if (process.env.LANG && process.env.LANG.startsWith('cn')) {\n        /* c8 ignore next 7 */\n        // eslint-disable-next-line no-console\n        console.warn(\n          name +\n            ': 里面 postcss.plugin 被弃用. 迁移指南:\\n' +\n            'https://www.w3ctech.com/topic/2226'\n        )\n      }\n    }\n    let transformer = initializer(...args)\n    transformer.postcssPlugin = name\n    transformer.postcssVersion = new Processor().version\n    return transformer\n  }\n\n  let cache\n  Object.defineProperty(creator, 'postcss', {\n    get() {\n      if (!cache) cache = creator()\n      return cache\n    }\n  })\n\n  creator.process = function (css, processOpts, pluginOpts) {\n    return postcss([creator(pluginOpts)]).process(css, processOpts)\n  }\n\n  return creator\n}\n\npostcss.stringify = stringify\npostcss.parse = parse\npostcss.fromJSON = fromJSON\npostcss.list = list\n\npostcss.comment = defaults => new Comment(defaults)\npostcss.atRule = defaults => new AtRule(defaults)\npostcss.decl = defaults => new Declaration(defaults)\npostcss.rule = defaults => new Rule(defaults)\npostcss.root = defaults => new Root(defaults)\npostcss.document = defaults => new Document(defaults)\n\npostcss.CssSyntaxError = CssSyntaxError\npostcss.Declaration = Declaration\npostcss.Container = Container\npostcss.Processor = Processor\npostcss.Document = Document\npostcss.Comment = Comment\npostcss.Warning = Warning\npostcss.AtRule = AtRule\npostcss.Result = Result\npostcss.Input = Input\npostcss.Rule = Rule\npostcss.Root = Root\npostcss.Node = Node\n\nLazyResult.registerPostcss(postcss)\n\nmodule.exports = postcss\npostcss.default = postcss\n","import postcss from './postcss.js'\n\nexport default postcss\n\nexport const stringify = postcss.stringify\nexport const fromJSON = postcss.fromJSON\nexport const plugin = postcss.plugin\nexport const parse = postcss.parse\nexport const list = postcss.list\n\nexport const document = postcss.document\nexport const comment = postcss.comment\nexport const atRule = postcss.atRule\nexport const rule = postcss.rule\nexport const decl = postcss.decl\nexport const root = postcss.root\n\nexport const CssSyntaxError = postcss.CssSyntaxError\nexport const Declaration = postcss.Declaration\nexport const Container = postcss.Container\nexport const Processor = postcss.Processor\nexport const Document = postcss.Document\nexport const Comment = postcss.Comment\nexport const Warning = postcss.Warning\nexport const AtRule = postcss.AtRule\nexport const Result = postcss.Result\nexport const Input = postcss.Input\nexport const Rule = postcss.Rule\nexport const Root = postcss.Root\nexport const Node = postcss.Node\n","// noinspection JSUnusedGlobalSymbols\n\n\"use strict\";\n\n// Should all be language neutral\n\nimport {\n    DEFINITE,\n    INDEFINITE,\n    lang,\n    util,\n    w,\n    errormsg,\n    failedmsg,\n    falsemsg,\n    formatList,\n    clearScreen,\n    debugmsg,\n    msg,\n    NULL_FUNC,\n    printOrRun,\n    processText,\n    respond,\n    scopeReachable,\n    sentenceCase,\n    showMenu,\n    player,\n    loc,\n    world,\n    settings,\n    regions, createItem, cloneObject, game, Exit\n} from \"../index.js\";\nimport {list} from \"postcss\";\n\nexport const TAKEABLE_DICTIONARY = {\n  afterCreation:function(o) {\n    o.verbFunctions.push(function(o, verbList) {\n      verbList.push(o.isAtLoc(player().name) ? lang.verbs.drop : lang.verbs.take)\n    })\n  },\n\n  takeable:true,\n  msgDrop:lang.drop_successful,\n  msgDropIn:lang.done_msg,\n  msgTake:lang.take_successful,\n  msgTakeOut:lang.done_msg,\n\n  drop:function(options) {\n    if (this.testDrop && !this.testDrop(options)) return false\n    const dest = w[options.char.loc]\n    if (dest.testDropIn && !dest.testDropIn(options)) return false\n\n    msg(this.msgDrop, options);\n    this.moveToFrom(options, \"loc\", \"name\")\n    return true;\n  },\n\n  take:function(options) {\n    const char = options.char\n    if (this.isAtLoc(char.name)) return falsemsg(lang.already_have, options)\n    if (!char.testManipulate(this, \"take\")) return false\n    if (this.testTake && !this.testTake(options)) return false\n    if (w[char.loc].testTakeOut && !w[char.loc].testTakeOut(options)) return false\n\n    msg(this.msgTake, options)\n\n    this.moveToFrom(options, \"name\", \"loc\")\n    if (this.scenery) this.scenery = false\n    return true\n  },\n\n  // This returns the location from which the item is to be taken\n  // (and does not do taking from a location).\n  // This can be useful for weird objects, such as ropes\n  takeFromLoc:function(char) { return this.loc },\n\n};\n\nexport const TAKEABLE = () => TAKEABLE_DICTIONARY;\n\nexport const SHIFTABLE = function() {\n    return {\n      shiftable: true,\n  };\n}\n\nexport const createEnsemble = function(name, ensembleMembers, dict) {\n  const res = createItem(name, dict);\n  res.ensemble = true;\n  res.ensembleMembers = ensembleMembers;\n  res.parserPriority = 30;\n  res.inventorySkip = true;\n  res.takeable = true;\n  res.getWorn = function(situation) { return this.isAtLoc(this.ensembleMembers[0].loc, situation) && this.ensembleMembers[0].getWorn(); }\n\n  res.nameModifierFunctions = [function(o, list) {\n    if (o.ensembleMembers[0].getWorn() && o.isAllTogether() && o.ensembleMembers[0].isAtLoc(player().name)) list.push(lang.invModifiers.worn)\n  }]\n\n\n  // Tests if all parts are n the same location and either all are worn or none are worn\n  // We can use this to determine if the set is together or not too\n  res.isLocatedAt = function(loc, situation) {\n    if (situation !== world.PARSER) return false;\n    const worn = this.ensembleMembers[0].getWorn();\n    for (let member of this.ensembleMembers) {\n      if (member.loc !== loc) return false;\n      if (member.getWorn() !== worn) return false;\n    }\n    return true;\n  }\n\n\n  // Tests if all parts are together\n  res.isAllTogether = function() {\n    const worn = this.ensembleMembers[0].getWorn();\n    const loc = this.ensembleMembers[0].loc;\n    for (let member of this.ensembleMembers) {\n      if (member.loc !== loc) return false;\n      if (member.breakEnsemble && member.breakEnsemble()) return false;\n      if (member.getWorn() !== worn) return false;\n    }\n    return true;\n  }\n\n  res.msgDrop = lang.drop_successful\n  res.msgTake = lang.take_successful\n\n  res.drop = function(options) {\n    const dest = w[options.char.loc]\n    if (dest.testDrop && !dest.testDrop(options)) return false\n    if (dest.testDropIn && !dest.testDropIn(options)) return false\n    msg(this.msgDrop, options);\n    for (let member of this.ensembleMembers) {\n      member.moveToFrom(options, \"loc\")\n    }\n    return true;\n  }\n\n  res.take = function(options) {\n    const char = options.char\n    if (this.isAtLoc(char.name)) {\n      msg(lang.already_have, options);\n      return false;\n    }\n\n    if (!char.testManipulate(this, \"take\")) return false;\n    if (this.testTake && !this.testTake(options)) return false\n    if (w[char.loc].testTakeOut && !w[char.loc].testTakeOut(options)) return false\n    msg(this.msgTake, options);\n    for (let member of this.ensembleMembers) {\n      member.moveToFrom(options, \"name\")\n      if (member.scenery) member.scenery = false\n    }\n    return true;\n  }\n\n  for (let member of ensembleMembers) {\n    member.ensembleMaster = res;\n  }\n  return res;\n}\n\nexport const MERCH = function(value, locs) {\n  const res = {\n    price:value,\n    getPrice:function() { return this.price },\n    msgPurchase:lang.purchase_successful,\n    msgSell:lang.sell_successful,\n\n\n    // The price when the player sells the item\n    // By default, half the \"list\" price\n    //\n    getSellingPrice:function(char) {\n      if (w[char.loc].buyingValue) {\n        return Math.round(this.getPrice() * (w[char.loc].buyingValue) / 100);\n      }\n      return Math.round(this.getPrice() / 2);\n    },\n\n    // The price when the player buys the item\n    // Uses the sellingDiscount, as te shop is selling it!\n    getBuyingPrice:function(char) {\n      if (w[char.loc].sellingDiscount) {\n        return Math.round(this.getPrice() * (100 - w[char.loc].sellingDiscount) / 100);\n      }\n      return this.getPrice();\n    },\n\n    isLocatedAt:function(loc, situation) {\n      if (this.salesLoc || this.salesLocs) {\n        // In the shop for sale\n        return (situation === world.PURCHASE || situation === world.PARSER) && this.isForSale(loc)\n      }\n      else {\n        // Acting like a normal item\n        return this.loc === loc\n      }\n    },\n\n    isForSale:function(loc) {\n      if (!this.salesLoc && !this.salesLocs) return false  // already sold\n      if (this.doNotClone) return (this.salesLoc === loc)\n      return (this.salesLocs.includes(loc))\n    },\n\n    canBeSoldHere:function(loc) {\n      return w[loc].willBuy && w[loc].willBuy(this);\n    },\n\n    purchase:function(options) {\n      if (this.testPurchase && !this.testPurchase(options)) return false\n      if (!this.isForSale(options.char.loc)) {\n        return failedmsg(this.doNotClone && this.isAtLoc(options.char.name) ? lang.cannot_purchase_again : lang.cannot_purchase_here, options)\n      }\n\n      const cost = this.getBuyingPrice(options.char);\n      options.money = cost\n      if (options.char.money < cost) return failedmsg(lang.cannot_afford, options);\n      return this.purchaseScript(options, options.char, cost)\n    },\n\n    purchaseScript:function(options, char, cost) {\n      char.money -= cost;\n      msg(this.msgPurchase, options);\n      if (this.doNotClone) {\n        this.loc = char.name\n        delete this.salesLoc\n        if (this.afterPurchase) this.afterPurchase(options)\n      }\n      else {\n        const o = cloneObject(this, char.name)\n        o.loc = char.name\n        delete o.salesLocs\n        if (o.afterPurchase) o.afterPurchase(options)\n      }\n      return world.SUCCESS;\n    },\n\n    sell:function(options) {\n      if (this.testSell && !this.testSell(options)) return false\n      if (!this.canBeSoldHere(options.char.loc)) {\n        return failedmsg(lang.cannot_sell_here, options);\n      }\n      const cost = this.getSellingPrice(options.char);\n      options.money = cost\n      options.char.money += cost;\n      msg(this.msgSell, options);\n      if (this.doNotClone) {\n        this.salesLoc = options.char.loc\n        delete this.loc\n      }\n      else {\n        delete w[this.name]\n      }\n      if (this.afterSell) this.afterSell(options)\n      return world.SUCCESS;\n    },\n  }\n  if (!Array.isArray(locs)) {\n    res.doNotClone = true;\n    res.salesLoc = locs;\n  }\n  else {\n    res.salesLocs = locs;\n  }\n  return res;\n}\n\n// countableLocs should be a dictionary, with the room name as the key, and the number there as the value\nexport const COUNTABLE = function(countableLocs) {\n  const res = Object.assign({}, TAKEABLE_DICTIONARY)\n  res.countable = true\n  res.countableLocs = countableLocs ? countableLocs : {}\n  res.multiLoc = true\n  res.defaultToAll = true\n\n  res.isUltimatelyHeldBy = function(obj) {\n    const locs = []\n    for (const key in this.countableLocs) {\n      if (this.countableLocs[key]) locs.push(key)\n    }\n    return util.multiIsUltimatelyHeldBy(obj, locs)\n  }\n\n  res.extractNumber = function() {\n    const md = /^(\\d+)/.exec(this.cmdMatch)\n    if (!md) { return false;}\n    return parseInt(md[1])\n  }\n\n  res.beforeSaveForTemplate = function() {\n    const l = []\n    for (let key in this.countableLocs) {\n      l.push(key + \"=\" + this.countableLocs[key])\n    }\n    this.customSaveCountableLocs = l.join(\",\")\n    this.beforeSave()\n  }\n\n  res.afterLoadForTemplate = function() {\n    const l = this.customSaveCountableLocs.split(\",\")\n    this.countableLocs = {}\n    for (let el of l) {\n      const parts = el.split(\"=\")\n      this.countableLocs[parts[0]] = parseInt(parts[1])\n    }\n    this.customSaveCountableLocs = false\n    this.afterLoad()\n  };\n\n  res.getListAlias = function(loc) {\n    return sentenceCase(this.pluralAlias) + \" (\" + this.countAtLoc(loc) + \")\";\n  };\n\n  res.isLocatedAt = function(loc, situation) {\n    if (!this.countableLocs[loc]) { return false; }\n    return (this.countableLocs[loc] > 0 || this.countableLocs[loc] === 'infinity');\n  };\n\n  res.countAtLoc = function(loc) {\n    if (typeof loc !== 'string') loc = loc.name\n    if (!this.countableLocs[loc]) { return 0; }\n    return this.countableLocs[loc];\n  };\n\n  res.moveToFrom = function(options, toLoc, fromLoc) {\n    util.setToFrom(options, toLoc, fromLoc)\n    let count = options.count ? options.count : this.extractNumber()\n    if (!count) count = options.fromLoc === player().name ? 1 : this.countAtLoc(options.fromLoc)\n    if (count === 'infinity') count = 1\n    this.takeFrom(options.fromLoc, count)\n    this.giveTo(options.toLoc, count)\n  };\n\n  res.takeFrom = function(loc, count) {\n    if (this.countableLocs[loc] !== 'infinity') this.countableLocs[loc] -= count\n    if (this.countableLocs[loc] <= 0) this.countableLocs[loc] = false\n    w[loc].afterDropIn(player(), {item:this, count:count})\n  };\n\n  res.giveTo = function(loc, count) {\n    if (!this.countableLocs[loc]) { this.countableLocs[loc] = 0; }\n    if (this.countableLocs[loc] !== 'infinity') this.countableLocs[loc] += count;\n    w[loc].afterDropIn(player(), {item:this, count:count});\n  };\n\n  res.findSource = function(sourceLoc, tryContainers) {\n    // some at the specific location, so use them\n    if (this.isAtLoc(sourceLoc)) {\n      return sourceLoc;\n    }\n\n    if (tryContainers) {\n      const containers = scopeReachable().filter(el => el.container);\n      for (let container of containers) {\n        if (container.closed) continue;\n        if (this.isAtLoc(container.name)) return container.name;\n      }\n    }\n\n    return false;\n  }\n\n\n  res.getTakeDropCount = function(options, loc) {\n    options.excess = false // do this here to ensure it is resrt\n    let n = this.extractNumber()\n    let m = this.countAtLoc(loc)\n    if (!n) {  // no number specified\n      if (m === 'infinity') {\n        n = 1\n      }\n      else if (this.defaultToAll) {\n        n = m\n      }\n      else {\n        n = 1\n      }\n    }\n    if (n > m) {  // too big number specified\n      n = m\n      options.excess = true\n    }\n    options.count = n\n  }\n\n  // As this is flagged as multiLoc, need to take special care about where the thing is\n  res.take = function(options) {\n    const sourceLoc = this.findSource(options.char.loc, true);\n    if (!sourceLoc) return falsemsg(lang.none_here, options)\n    this.getTakeDropCount(options, sourceLoc)\n\n    if (this.testTake && !this.testTake(options)) return false\n    if (w[sourceLoc].testTakeOut && !w[sourceLoc].testTakeOut(options)) return false\n\n    msg(this.msgTake, options)\n    this.takeFrom(sourceLoc, options.count)\n    this.giveTo(options.char.name, options.count)\n    if (this.scenery) this.scenery = false\n    return true\n  }\n\n  res.drop = function(options) {\n    if (this.countAtLoc(options.char.name) === 0) return falsemsg(lang.none_held, options)\n    const dest = w[options.char.loc]\n    options.destination = dest\n    this.getTakeDropCount(options, options.char.name)\n\n    if (this.testDrop && !this.testDrop(options)) return false\n    if (dest.testDropIn && !dest.testDropIn(options)) return false\n\n    msg(this.msgDrop, options);\n    this.takeFrom(options.char.name, options.count);\n    this.giveTo(options.char.loc, options.count);\n    return true;\n  };\n\n  res.afterCreation = function(o) {\n    if (!o.regex) o.regex = new RegExp(\"^(\\\\d+ )?\" + o.name + \"s?$\")\n  }\n\n\n  return res;\n};\n\nexport const WEARABLE = function(wear_layer, slots) {\n  const res = Object.assign({}, TAKEABLE_DICTIONARY)\n  res.wearable = true\n  res.armour = 0\n  res.wear_layer = wear_layer ? wear_layer : false\n  res.slots = slots && wear_layer ? slots: []\n  res.worn = false\n  res.useDefaultsTo = function(char) {\n    return char === player() ? 'Wear' : 'NpcWear'\n  }\n\n  res.getSlots = function() { return this.slots }\n  res.getWorn = function() { return this.worn }\n  res.getArmour = function() { return this.armour }\n  res.msgWear = lang.wear_successful\n  res.msgRemove = lang.remove_successful\n\n  res.afterCreation = function(o) {\n    o.verbFunctions.push(function(o, verbList) {\n      if (!o.isAtLoc(player().name)) {\n        verbList.push(lang.verbs.take)\n      }\n      else if (o.getWorn()) {\n        if (!o.getWearRemoveBlocker(player(), false)) verbList.push(lang.verbs.remove)\n      }\n      else {\n        verbList.push(lang.verbs.drop)\n        if (!o.getWearRemoveBlocker(player(), true)) verbList.push(lang.verbs.wear)\n      }\n    })\n\n    o.nameModifierFunctions.push(function(o, list) {\n      if (o.worn && o.isAtLoc(player().name)) list.push(lang.invModifiers.worn)\n    })\n  }\n\n  res.icon = () => 'garment12'\n\n  res.getWearRemoveBlocker = function(char, toWear) {\n    if (!this.wear_layer) return false\n    const slots = this.getSlots()\n    for (let slot of slots) {\n      let outer = char.getOuterWearable(slot)\n      if (outer && outer !== this && (outer.wear_layer >= this.wear_layer || outer.wear_layer === 0)) {\n        return outer\n      }\n    }\n    return false\n  }\n\n  res.testWear = function() { return true }\n  res.testRemove = function() { return true }\n\n  res._canWearRemove = function(toWear, options) {\n    if (toWear) {\n      if (!this.testWear(options)) return false\n    }\n    else {\n      if (!this.testRemove(options)) return false\n    }\n    const outer = this.getWearRemoveBlocker(options.char, toWear)\n    if (outer) {\n      options.outer = outer\n      return falsemsg(toWear ? lang.cannot_wear_over : lang.cannot_remove_under, options)\n    }\n    return true;\n  };\n\n  // Assumes the item is already held\n  res.wear = function(options) {\n    if (!this._canWearRemove(true, options)) return false\n    if (!options.char.testManipulate(this, \"wear\")) return false\n    msg(this.msgWear, options)\n    this.worn = true\n    if (this.afterWear) this.afterWear(options)\n    return true\n  };\n\n  // Assumes the item is already held\n  res.remove = function(options) {\n    if (!this._canWearRemove(false, options)) return false\n    if (!options.char.testManipulate(this, \"remove\")) return false\n    msg(this.msgRemove, options);\n    this.worn = false;\n    if (this.afterRemove) this.afterRemove(options);\n    return true;\n  };\n\n\n  return res;\n};\n\nexport const OPENABLE_DICTIONARY = {\n  msgClose:lang.close_successful,\n  msgOpen:lang.open_successful,\n  msgLock:lang.lock_successful,\n  msgUnlock:lang.unlock_successful,\n  msgCloseAndLock:lang.close_and_lock_successful,\n  openMsg:function(options) { msg(this.msgOpen, options) },\n  open:function(options) {\n    options.container = this\n    if (!this.openable) {\n      msg(lang.cannot_open, {item:this});\n      return false;\n    }\n    else if (!this.closed) {\n      msg(lang.already, {item:this});\n      return false;\n    }\n    else if (this.testOpen && !this.testOpen(options)) {\n      return false\n    }\n    if (this.locked) {\n      if (this.testKeys(options.char)) {\n        this.locked = false\n        this.closed = false\n        msg(this.msgUnlock, options)\n        this.openMsg(options)\n        return true\n      }\n      else {\n        msg(lang.locked, options)\n        return false;\n      }\n    }\n    this.closed = false;\n    this.openMsg(options)\n    if (this.afterOpen) this.afterOpen(options)\n    return true;\n  },\n\n  close:function(options) {\n    options.container = this\n    if (!this.openable) {\n      msg(lang.cannot_close, {item:this});\n      return false;\n    }\n    else if (this.closed) {\n      msg(lang.already, {item:this});\n      return false;\n    }\n    else if (this.testClose && !this.testClose(options)) {\n      return false\n    }\n    this.closed = true;\n    msg(this.msgClose, options)\n    if (this.afterClose) this.afterClose(options)\n    return true;\n  },\n\n\n}\n\nexport const CONTAINER = function(openable) {\n  const res = Object.assign({}, OPENABLE_DICTIONARY);\n  res.container = true\n\n  res.closed = openable;\n  res.openable = openable\n  res.contentsType = \"container\"\n  res.getContents = util.getContents\n  res.testForRecursion = util.testForRecursion\n  res.listContents = util.listContents\n  res.transparent = false\n\n  res.afterCreation = function(o) {\n    o.verbFunctions.push(function(o, verbList) {\n      if (o.openable) {\n        verbList.push(o.closed ? lang.verbs.open : lang.verbs.close);\n      }\n    })\n    o.nameModifierFunctions.push(util.nameModifierFunctionForContainer)\n  };\n\n  res.lookinside = function(options) {\n    options.container = this\n    if (this.closed && !this.transparent) {\n      msg(lang.not_open, options);\n      return false;\n    }\n    options.list = this.listContents(world.LOOK, true)\n    msg(lang.look_inside, options);\n    return true;\n  };\n\n  res.openMsg = function(options) {\n    options.list = this.listContents(world.LOOK)\n    msg(this.msgOpen + \" \" + (options.list === lang.list_nothing ? lang.it_is_empty : lang.look_inside_it), options)\n  };\n\n  res.icon = function() {\n    return this.closed ? 'closed12' : 'opened12'\n  };\n\n  res.canReachThroughThis = function() { return !this.closed };\n  res.canSeeThroughThis = function() { return !this.closed || this.transparent };\n\n  return res;\n};\n\nexport const SURFACE = function() {\n  const res = {}\n  res.container = true\n  res.getContents = util.getContents\n  res.testForRecursion = util.testForRecursion\n  res.listContents = util.listContents\n  res.afterCreation = function(o) { o.nameModifierFunctions.push(util.nameModifierFunctionForContainer) }\n  res.closed = false;\n  res.openable = false;\n  res.contentsType = \"surface\";\n  res.canReachThroughThis = () => true;\n  res.canSeeThroughThis = () => true;\n  return res;\n};\n\nexport const OPENABLE = function(alreadyOpen) {\n  const res = Object.assign({}, OPENABLE_DICTIONARY);\n  res.closed = !alreadyOpen;\n  res.openable = true;\n\n  res.afterCreation = function(o) {\n    o.verbFunctions.push(function(o, verbList) {\n      verbList.push(o.closed ? lang.verbs.open : lang.verbs.close);\n    })\n    o.nameModifierFunctions.push(function(o, list) {\n      if (!o.closed) list.push(lang.invModifiers.open)\n    })\n  }\n\n  return res\n}\n\nexport const LOCKED_WITH = function(keyNames) {\n  if (typeof keyNames === \"string\") { keyNames = [keyNames]; }\n  if (keyNames === undefined) { keyNames = []; }\n    return {\n      keyNames: keyNames,\n      locked: true,\n      lockwith: function (options) {\n          this.lock(options)\n      },\n      unlockwith: function (options) {\n          this.unlock(options)\n      },\n\n      lock: function (options) {\n          options.container = this\n          if (this.locked) return falsemsg(lang.already, options)\n          if (!this.testKeys(options.char, true)) return falsemsg(lang.no_key, options)\n\n          if (!this.closed) {\n              this.closed = true\n              this.locked = true\n              msg(this.msgCloseAndLock, options)\n          } else {\n              this.locked = true\n              msg(this.msgLock, options)\n          }\n          if (this.afterLock) this.afterLock(options)\n          return true\n      },\n\n      unlock: function (options) {\n          options.container = this\n          if (!this.locked) return falsemsg(lang.already, {item: this})\n          if (options.secondItem) {\n              if (!this.keyNames.includes(options.secondItem.name)) return falsemsg(lang.cannot_unlock_with, options)\n          } else {\n              if (!this.testKeys(options.char, false)) return falsemsg(lang.no_key, options)\n          }\n          msg(this.msgUnlock, options)\n          this.locked = false\n          if (this.afterUnlock) this.afterUnlock(options)\n          return true\n      },\n\n      testKeys: function (char, toLock) {\n\n          for (let s of this.keyNames) {\n              if (!w[s]) return errormsg(\"The key name for this container, `\" + s + \"`, does not match any key in the game.\")\n              if (w[s].isAtLoc(char.name)) return true\n          }\n          return false;\n      }\n  }\n}\n\nexport const LOCKED_DOOR = function(key, loc1, loc2, name1, name2) {\n  const res = Object.assign({}, OPENABLE(false), LOCKED_WITH(key))\n  res.loc1 = loc1\n  res.loc2 = loc2\n  res.name1 = name1\n  res.name2 = name2\n  res.scenery = true\n\n  res.afterCreation = function(item) {\n    const room1 = w[item.loc1]\n    if (!room1) return errormsg(\"Bad location name '\" + item.loc1 + \"' for door \" + item.name)\n\n    const exit1 = room1.findExit(item.loc2)\n    if (!exit1) return errormsg(\"No exit to '\" + item.loc2 + \"' for door \" + item.name)\n    item.dir1 = exit1.dir\n    if (!room1[item.dir1]) return errormsg(\"Bad exit '\" + item.dir1 + \"' in location '\" + room1.name + \"' for door: \" + item.name + \" (possibly because the room is defined after the door?)\")\n\n    const room2 = w[item.loc2]\n    if (!room2) return errormsg(\"Bad location name '\" + item.loc2 + \"' for door \" + item.name)\n    const exit2 = room2.findExit(item.loc1)\n    if (!exit2) return errormsg(\"No exit to '\" + item.loc1 + \"' for door \" + item.name)\n    item.dir2 = exit2.dir\n    if (!room2[item.dir2]) return errormsg(\"Bad exit '\" + item.dir2 + \"' in location '\" + room2.name + \"' for door: \" + item.name + \" (possibly because the room is defined after the door?)\")\n\n    room1[item.dir1].use = util.useWithDoor\n    room1[item.dir1].door = item.name\n    room1[item.dir1].doorName = item.name1 || 'door to ' + lang.getName(w[item.loc2], {article:DEFINITE})\n\n    room2[item.dir2].use = util.useWithDoor\n    room2[item.dir2].door = item.name\n    room2[item.dir2].doorName = item.name2 || 'door to ' + lang.getName(w[item.loc1], {article:DEFINITE})\n  }\n\n  res.isLocatedAt = function(loc) { return (loc === this.loc1 || loc === this.loc2) }\n\n  res.icon = () => 'door12'\n\n  return res;\n}\n\nexport const KEY = function() {\n  const res = Object.assign({}, TAKEABLE_DICTIONARY)\n  res.key = true\n  res.icon = () => 'key12'\n  return res;\n}\n\nexport const READABLE = function(mustBeHeld) {\n  const res = {}\n  res.readable = true\n  res.mustBeHeld = mustBeHeld\n  res.icon = () => 'readable12'\n  res.afterCreation = function(o) {\n    o.verbFunctions.push(function(o, verbList) {\n      if (o.loc === player().name || !o.mustBeHeld) verbList.push(lang.verbs.read)\n    })\n  }\n  return res;\n}\n\nexport const BACKSCENE = function() {\n  return {\n    scenery:true,\n    parserPriority:-15,\n    isLocatedAt:function(loc, situation) {\n      if (!w[loc].room) return false\n      const locationType = w[loc].locationType || w[loc]._region\n      if (!locationType) return false\n      if (w[loc + '_' + this.name]) return false\n      return !!regions[locationType][this.name];\n\n    },\n    examine_for_backscene:function() {\n      if (!loc()) return\n\n      const locationType = loc().locationType || loc()._region\n      const addendum = loc()['addendum_examine_' + this.name] ? ' ' + loc()['addendum_examine_' + this.name] : ''\n\n      if (typeof loc()['examine_' + this.name] === 'function') {\n        loc()['examine_' + this.name](addendum)\n      }\n      else if (typeof loc()['examine_' + this.name] === 'string') {\n        msg(loc()['examine_' + this.name] + addendum)\n      }\n      else if (loc()._region && regions[loc()._region][this.name]) {\n        msg(regions[loc()._region][this.name] + addendum)\n      }\n      else if (this.defaultExamine) {\n        msg(this.defaultExamine + addendum)\n      }\n      else {\n        msg(lang.default_scenery)\n      }\n    },\n    afterCreation:function(o) {\n      o.defaultExamine = o.examine\n      o.examine = o.examine_for_backscene\n    },\n  }\n}\n\nexport const FURNITURE = function(options) {\n  if (options === undefined) return errormsg(\"No options for FURNITURE template. Look in the stack traces below for a reference to a file you are using to create objects, and see what the line number is.\")\n  const res = {\n    testPostureOn:() => true,\n    getoff:function(options) {\n      if (!options.char.posture) {\n        options.char.msg(lang.already, options);\n        return false;\n      }\n      if (options.char.posture) {\n        options.char.msg(lang.stop_posture(options.char));  // stop_posture handles details\n        return true;\n      }\n    },\n  }\n  res.useDefaultsTo = function(char) {\n    const cmd = this.useCmd ? this.useCmd : (this.reclineon ? 'ReclineOn' : (this.siton ? 'SitOn' : 'StandOn'))\n    return char === player() ? cmd : 'Npc' + cmd\n  }\n\n  res.afterCreation = function(o) {\n    o.verbFunctions.push(function(o, verbList) {\n      if (player().posture && player().postureFurniture === o.name) {\n        verbList.push(lang.verbs.getOff)\n        return\n      }\n      if (player().posture && player().posture !== 'standing') return\n      if (o.siton) verbList.push(lang.verbs.sitOn)\n      if (o.standon) verbList.push(lang.verbs.standOn)\n      if (o.reclineon) verbList.push(lang.verbs.reclineOn)\n    })\n  }\n\n  res.assumePosture = function(options, posture, name, adverb) {\n    options.posture = posture\n    const char = options.char\n    if (char.posture === posture && char.postureFurniture === this.name) {\n      char.msg(lang.already, {item:char})\n      return false\n    }\n    if (!this.testPostureOn({char:char, posture:posture})) return false\n    if (char.posture && char.postureFurniture !== this.name) {\n      char.msg(lang.stop_posture(char))\n      char.msg(lang[name + '_on_successful'], options)\n    }\n    else if (char.posture && this[char.posture + \"_to_\" + posture] && this.postureChangesImplemented) {\n      char.msg(this[char.posture + \"_to_\" + posture], options)\n    }\n    else {\n      char.msg(lang[name + '_on_successful'], options)\n    }\n    char.posture = posture\n    char.postureFurniture = this.name\n    char.postureAdverb = adverb === undefined ? 'on' : adverb;\n    if (this.afterPostureOn) this.afterPostureOn(options)\n    return true\n  }\n\n  if (options.sit) {\n    res.siton = function(options) {\n      return this.assumePosture(options, \"sitting\", 'sit')\n    }\n  }\n  if (options.stand) {\n    res.standon = function(options) {\n      return this.assumePosture(options, \"standing\", 'stand')\n    }\n  }\n  if (options.recline) {\n    res.reclineon = function(options) {\n      return this.assumePosture(options, \"reclining\", 'recline')\n    }\n  }\n  if (options.useCmd) {\n    res.useCmd = options.useCmd\n  }\n  res.icon = () => 'furniture12'\n  return res;\n}\n\nexport const SWITCHABLE = function(alreadyOn, nameModifier) {\n  const res = {}\n  res.switchedon = alreadyOn\n  res.nameModifier = nameModifier\n  res.msgSwitchOff = lang.switch_off_successful\n  res.msgSwitchOn = lang.switch_on_successful\n\n  res.afterCreation = function(o) {\n    o.verbFunctions.push(function(o, verbList) {\n      if (!o.mustBeHeldToOperate || o.isAtLoc(player())) {\n        verbList.push(o.switchedon ? lang.verbs.switchoff : lang.verbs.switchon)\n      }\n    })\n    o.nameModifierFunctions.push(function(o, list) {\n      if (o.nameModifier && o.switchedon) list.push(o.nameModifier)\n    })\n  }\n\n  res.switchon = function(options) {\n    if (this.switchedon) {\n      options.char.msg(lang.already, {item:this});\n      return false;\n    }\n    if (!this.testSwitchOn(options)) return false\n    if (!options.char.getAgreement(\"SwitchOn\", {item:this, switchOn:true})) return false\n\n    if (!this.suppressMsgs) options.char.msg(this.msgSwitchOn, options);\n    this.doSwitchon(options);\n    return true;\n  };\n\n  res.doSwitchon = function(options) {\n    let lighting = game.dark;\n    this.switchedon = true;\n    world.update();\n    if (lighting !== game.dark) {\n      loc().description();\n    }\n    if (this.afterSwitchOn) this.afterSwitchOn(options)\n  };\n\n  res.testSwitchOn = () => true;\n  res.testSwitchOff = () => true;\n\n  res.switchoff = function(options) {\n    if (!this.switchedon) {\n      options.char.msg(lang.already, {item:this});\n      return false;\n    }\n    if (!this.testSwitchOff(options)) return false\n    if (!options.char.getAgreement(\"SwitchOn\", {item:this})) return false\n\n    if (!this.suppressMsgs) options.char.msg(this.msgSwitchOff, options);\n    this.doSwitchoff(options);\n    return true;\n  };\n\n  res.doSwitchoff = function(options) {\n    let lighting = game.dark;\n    this.switchedon = false;\n    world.update();\n    if (lighting !== game.dark) {\n      loc().description();\n    }\n    if (this.afterSwitchOff) this.afterSwitchOff(options)\n  };\n\n  res.icon = function() {\n    return this.switchedon ? 'turnedon12' : 'turnedoff12'\n  }\n\n  return res;\n};\n\n// Ideally Quest will check components when doing a command for the whole\n// I think?\nexport const COMPONENT = function(nameOfWhole) {\n  const res = {\n    scenery:true,\n    component:true,\n    loc:nameOfWhole,\n    takeable:true, // Set this as it has its own take attribute\n    isLocatedAt:function(loc, situation) {\n      if (situation !== world.PARSER && situation !== world.ALL) return false;\n      let cont = w[this.loc];\n      return cont.isAtLoc(loc);\n    },\n    take:function(options) {\n      options.whole = w[this.loc]\n      msg(lang.cannot_take_component, options);\n      return false;\n    },\n  };\n  if (!w[nameOfWhole]) debugmsg(\"Whole is not define: \" + nameOfWhole);\n  w[nameOfWhole].componentHolder = true;\n  return res;\n};\n\nexport const EDIBLE = function(isLiquid) {\n  const res = Object.assign({}, TAKEABLE_DICTIONARY);\n  res.isLiquid = isLiquid\n  res.msgIngest = isLiquid ? lang.drink_successful : lang.eat_successful\n  res.eat = function(options) {\n    if (this.isLiquid) {\n      msg(lang.cannot_eat, options);\n      return false;\n    }\n    msg(this.msgIngest, options);\n    this.loc = null;\n    if (this.afterIngest) this.afterIngest(options);\n    return true;\n  };\n  res.drink = function(options) {\n    if (!this.isLiquid) {\n      msg(lang.cannot_drink, options);\n      return false;\n    }\n    msg(this.msgIngest, options);\n    this.loc = null;\n    if (this.afterIngest) this.afterIngest(options);\n    return true;\n  };\n  res.ingest = function(options) {\n    if (this.isLiquid) {\n      return this.drink(options)\n    }\n    else {\n      return this.eat(options)\n    }\n  }\n  res.icon = () => 'edible12'\n  res.afterCreation = function(o) {\n    o.verbFunctions.push(function(o, verbList) {\n      verbList.push(o.isAtLoc(player().name) ? lang.verbs.drop : lang.verbs.take)\n      if (o.isAtLoc(player())) verbList.push(o.isLiquid ? lang.verbs.drink : lang.verbs.eat)\n    })\n  }\n  return res;\n};\n\nexport const VESSEL = function() {\n  const res = {}\n  res.vessel = true\n\n  res.afterCreation = function(o) {\n    if (o.volumeContained) {\n        // todo - what is a list?\n      list.push(\"full of \" + o.containedFluidName)\n    }\n  };\n\n  res.findSource = function(options) { return util.findSource(options) };\n\n  res.fill = function(options) {\n    if (!this.findSource(options)) return falsemsg(lang.no_generic_fluid_here, {item:this})\n    return this.doFill(options)\n  };\n\n  res.doFill = function(options) {\n    options.item = this\n    if (this.testFill && !this.testFill(options)) return false\n    if (this.containedFluidName) return falsemsg(lang.already_full, options)\n\n    this.containedFluidName = options.fluid\n    if (options.source.vessel) delete options.source.containedFluidName\n\n    msg(lang.fill_successful, options)\n    if (this.afterFill) this.afterFill(options)\n    return true\n  }\n\n  res.empty = function(options) {\n    delete options.item\n    return this.doEmpty(options)\n  }\n\n  res.doEmpty = function(options) {\n    options.source = this\n    options.fluid = this.containedFluidName\n\n    if (!this.containedFluidName) return falsemsg(lang.already_empty, options)\n    if (this.testEmpty && !this.testEmpty(options)) return false\n\n    if (!options.item) {\n      msg(lang.empty_successful, options)\n      delete this.containedFluidName\n    }\n    else if (options.item === options.source) {\n      return falsemsg(lang.pour_into_self, options)\n    }\n    else if (options.item.vessel) {\n      if (options.item.containedFluidName) return falsemsg(lang.already_full, {char:options.char, item:options.sink, fluid:options.item.containedFluidName})\n      msg(lang.empty_into_successful, options)\n      options.item.containedFluidName = this.containedFluidName\n      delete this.containedFluidName\n    }\n    else if (options.item.sink) {\n      if (!options.item.sink(this.containedFluidName, options.char, this)) return false\n    }\n    else {\n      msg(lang.empty_onto_successful, options)\n      delete this.containedFluidName\n    }\n    if (this.afterEmpty) this.afterEmpty(options.char, {fluid:this.containedFluidName, sink:options.item})\n    delete this.containedFluidName\n    return true\n  }\n\n  res.handleInOutContainer = function(options, items) {\n    let success = false;\n    for (const obj of items) {\n      if (!options.char.testManipulate(obj, options.verb)) return world.FAILED\n      options.count = obj.countable ? obj.extractNumber() : undefined\n      options.item = obj\n      if (options.count) options[obj.name + '_count'] = options.count  // for the text processor\n      let flag\n      if (this.container) {\n          // todo - what is func, char and container there??:\n        success = success || func(char, container, obj, options)\n      }\n      /*else if (obj.representsFluid) {\n        flag = this.doFill({char:options.char, fluid:obj.representsFluid})\n        success = success || flag\n      }*/\n      else {\n        msg(lang.not_container_not_vessel, options)\n      }\n    }\n    if (success) options.char.pause();\n    return success ? world.SUCCESS : world.FAILED;\n  };\n\n  res.afterCreation = function(o) {\n    o.verbFunctions.push(function(o, verbList) {\n      if (!o.isAtLoc(player().name)) return\n      verbList.push(o.containedFluidName ? lang.verbs.empty : lang.verbs.fill)\n    })\n  }\n  return res;\n}\n\nexport const CONSTRUCTION = function(componentNames) {\n  const res = {}\n  res.construction = true\n  res.componentNames = componentNames ? componentNames : []\n  res.destroyComponentsOnBuild = true\n  res.msgConstruction = lang.construction_done\n\n  res.testComponents = function(components, options) {\n    for (const el of components) {\n      if (!res.componentNames.includes(el.name)) {\n        options.wrong = el\n        return falsemsg(lang.component_wrong, options)\n      }\n    }\n    return true\n  }\n\n  res.buildPrecheck = function(options) {\n    if (this.loc) return falsemsg(lang.construction_already, options)\n    for (const el of options.components) {\n      if (el.loc !== player().name) {\n        options.missing = el\n        return falsemsg(lang.component_missing, options)\n      }\n    }\n    return true\n  }\n\n  res.build = function(options) {\n    const components = this.componentNames.map(el => w[el])\n    options.components = components\n    if (!this.buildPrecheck(options)) return false\n    if (this.testConstruction && !this.testConstruction(options)) return false\n\n    if (this.destroyComponentsOnBuild) {\n      for (const el of components) delete el.loc\n    }\n    this.loc = this.buildAtLocation ? player().loc : player().name\n    options.list = formatList(components, {article:DEFINITE, lastSep:'and'})\n    msg(this.msgConstruction, options)\n    if (this.afterConstruction) this.afterConstruction(options)\n    return true\n  }\n\n  return res\n}\n\nexport const ROPE = function(length, tetheredTo) {\n  const res = Object.assign({\n    rope:true,\n    ropeLength:length,\n    tethered:(tetheredTo !== undefined),\n    tiedTo1:tetheredTo,\n    locs:tetheredTo ? [w[w[tetheredTo].loc]] : [],\n    attachVerb:lang.rope_attach_verb,\n    attachedVerb:lang.rope_attached_verb,\n    detachVerb:lang.rope_detach_verb,\n    msgDetach:lang.rope_detach_success,\n    msgAttach:lang.rope_attach_success,\n    msgWind:lang.rope_wind,\n    msgUnwind:lang.rope_unwind,\n    isLocatedAt:function(loc, situation) {\n      if (this.loc) {\n        this.locs = [this.loc]\n        this.loc = false\n      }\n      if (typeof loc !== \"string\") loc = loc.name\n      // If the rope is in the location and held by the character, only want it to appear once in the side pane\n      if (situation === world.SIDE_PANE && this.locs.includes(player().name) && loc !== player().name) return false\n      return this.locs.includes(loc)\n    },\n    isUltimatelyHeldBy:function(obj) { return util.multiIsUltimatelyHeldBy(obj, this.locs) },\n    isAttachedTo:function(item) {\n      return this.tiedTo1 === item.name || this.tiedTo2 === item.name\n    },\n    getAttached:function() {\n      let res = this.tiedTo1 ? [this.tiedTo1] : []\n      if (this.tiedTo2) res.push(this.tiedTo2)\n      return res\n    },\n    examineAddendum:function() {\n      // It is tied to the chair, and trails into the kitchen.\n\n      // What is it tied to (and we can see)\n      const obj1 = (this.tiedTo1 && w[this.tiedTo1].isHere()) ? w[this.tiedTo1] : false\n      const obj2 = (this.tiedTo2 && w[this.tiedTo2].isHere()) ? w[this.tiedTo2] : false\n\n      // Handle the easy cases, only one loc in locs\n      if (this.locs.length === 1) {\n        if (obj1 && obj2) return processText(lang.examineAddBothEnds, {item:this, obj1:obj1, obj2:obj2})\n        if (obj1) return processText(lang.rope_examine_attached_one_end, {item:this, obj1:obj1})\n        if (obj2) return processText(lang.rope_examine_attached_one_end, {item:this, obj1:obj2})\n        return ''  // just in one place, like any ordinary object\n      }\n\n      // Who is it held by (and we can see)\n      const end1 = w[this.locs[0]]\n      const holder1 = (end1.npc || end1.player) && end1.isHere() ? end1 : false\n      const end2 = w[this.locs[this.locs.length - 1]]\n      const holder2 = (end2.npc || end2.player) && end2.isHere() ? end2 : false\n\n      // What locations does it go to\n      const index = this.locs.findIndex(el => el === player().loc)\n      const loc1 = (index > 0 && w[this.locs[index - 1]].room) ? w[this.locs[index - 1]] : false\n      const loc2 = (index < (this.locs.length - 1) && w[this.locs[index + 1]].room) ? w[this.locs[index + 1]] : false\n\n      let s = ''\n      let flag = false\n      if (obj1 || holder1 || loc1) {\n        s += ' ' + lang.rope_one_end + ' '\n        flag = true\n      }\n      if (obj1) {\n        s += lang.rope_examine_end_attached.replace('obj', 'obj1')\n      }\n      else if (holder1) {\n        s += lang.rope_examine_end_held.replace('holder', 'holder1')\n      }\n      else if (loc1) {\n        s += lang.rope_examine_end_headed.replace('loc', 'loc1')\n      }\n\n      if (obj2 || holder2 || loc2) {\n        s += ' ' + (flag ? lang.rope_other_end : lang.rope_one_end) + ' '\n      }\n      if (obj2) {\n        s += lang.rope_examine_end_attached.replace('obj', 'obj2')\n      }\n      else if (holder2) {\n        s += lang.rope_examine_end_held.replace('holder', 'holder2')\n      }\n      else if (loc2) {\n        s += lang.rope_examine_end_headed.replace('loc', 'loc2')\n      }\n\n      return processText(s, {item:this, obj1:obj1, obj2:obj2, holder1:holder1, holder2:holder2, loc1:loc1, loc2:loc2})\n    },\n    canAttachTo:function(item) {\n      return item.attachable\n    },\n    handleTieTo:function(char, obj) {\n      if (obj === undefined) obj = this.findAttachable(this)\n      const options = {char:char, item:this, obj:obj}\n\n      if (obj === undefined) return falsemsg(lang.rope_no_attachable_here, options)\n      if (!obj.attachable) return failedmsg(lang.rope_not_attachable_to, options)\n\n      if (this.tiedTo1 === obj.name) return failedmsg(lang.already, {item:this})\n      if (this.tiedTo2 === obj.name) return failedmsg(lang.already, {item:this})\n      if (this.tiedTo1 && this.tiedTo) return failedmsg(lang.rope_tied_both_ends_already, {item:this, obj1:w[this.tiedTo1], obj2:w[this.tiedTo2]})\n\n      if (obj.testAttach && !obj.testAttach(options)) return world.FAILED\n      this.attachTo(char, obj)\n      if (!this.suppessMsgs) msg(this.msgAttach, options)\n      return world.SUCCESS\n    },\n    handleUntieFrom:function(char, obj) {\n      const tpParams = {char:char, item:this, obj:obj}\n      if (obj === undefined) {\n        // obj not set; can we guess it?\n        if (!this.tiedTo1 && !this.tiedTo2) return failedmsg(lang.rope_not_attached, tpParams)\n        if (this.tiedTo1 && !this.tiedTo2) {\n          obj = w[this.tiedTo1]\n        }\n        else if (!this.tiedTo1 && this.tiedTo2) {\n          obj = w[this.tiedTo2]\n        }\n        else if (w[this.tiedTo1].isHere() && !w[this.tiedTo2].isHere()) {\n          obj = w[this.tiedTo1]\n        }\n        else if (!w[this.tiedTo1].isHere() && w[this.tiedTo2].isHere()) {\n          obj = w[this.tiedTo2]\n        }\n        else {\n          return failedmsg(lang.rope_detach_end_ambig, tpParams)\n        }\n        tpParams.obj = obj\n      }\n      else {\n        if (this.tiedTo1 !== obj.name && this.tiedTo2 !== obj.name) {\n          return failedmsg(lang.rope_not_attached_to, tpParams)\n        }\n      }\n      if (obj === this.tiedTo1 && this.tethered) return failedmsg(lang.rope_tethered, tpParams)\n\n      this.detachFrom(char, obj)\n      if (!this.suppessMsgs) msg(this.msgDetach, tpParams)\n      return world.SUCCESS\n    },\n    useWith:function(char, item) {\n      return this.handleTieTo(char, item) === world.SUCCESS\n    },\n    attachTo:function(char, item) {\n      const loc = item.loc // may want to go deep in case tied to a component of an item !!!\n      if (!this.tiedTo1) {\n        if (this.locs.length > 1) this.locs.shift()\n        if (this.locs[0] !== loc) this.locs.unshift(loc)\n        this.tiedTo1 = item.name\n      }\n      else {\n        if (this.locs.length > 1) this.locs.pop()\n        if (this.locs[this.locs.length - 1] !== loc) this.locs.push(loc)\n        this.tiedTo2 = item.name\n      }\n      if (this.afterAttach) this.afterAttach(char, {item:item})\n    },\n    detachFrom:function(char, item) {\n      if (this.tiedTo1 === item.name) {\n        if (this.locs.length === 2 && this.locs.includes(char.name)) this.locs.shift() // remove this room\n        if (this.locs[0] !== char.name) {\n          this.locs.unshift(char.name)\n        }\n        this.tiedTo1 = false\n      }\n      else {\n        if (this.locs.length === 2 && this.locs.includes(char.name)) this.locs.pop() // remove this room\n        if (this.locs[this.locs.length - 1] !== char.name) this.locs.push(char.name)\n        this.tiedTo2 = false\n      }\n      if (this.afterDetach) this.afterDetach(char, {item:item})\n    },\n    findAttachable:function() {\n      // Is there some other source?\n      const items = scopeReachable()\n      for (let obj of items) {\n        if (obj.attachable) return obj\n      }\n      return undefined\n    },\n  }, TAKEABLE_DICTIONARY)\n\n  res.moveToFrom = function() {\n    errormsg(\"You cannot use \\\"moveToFrom\\\" with a ROPE object, due to the complicated nature of these things. You should either prevent the user trying to do this, or look to implement some custom code as the ROPE template does for DROP and TAKE. Sorry I cannot be any more help than that!\")\n  }\n\n  res.drop = function(options) {\n    const char = options.char\n    if (!this.isAtLoc(char.name)) return falsemsg(lang.not_carrying, options)\n\n    let end\n    if (this.locs.length === 1) {\n      // Rope is in one place so move as a single item\n      this.locs = [char.loc]\n      end = 0\n    }\n    else if (this.locs[0] === char.name) {\n      // end 1 is here and not attached, so get that\n      this.locs.shift()\n      end = 1\n    }\n    else if (this.locs[this.locs.length - 1] === char.name) {\n      // end 2 is here and not attached, so get that\n      this.locs.pop()\n      end = 2\n    }\n    options.end = end\n    options.toLoc = char.loc\n    options.fromLoc = char.name\n\n    msg(this.msgDrop, options)\n    if (w[char.loc].afterDropIn) w[char.loc].afterDropIn(options);\n    if (w[char.name].afterTakeFrom) w[char.name].afterTakeFrom(options);\n    if (this.afterMove !== undefined) this.afterMove(options)\n    return true;\n  }\n\n  res.take = function(options) {\n    const char = options.char\n    if (this.isAtLoc(char.name) && !this.isAtLoc(options.char.loc)) return falsemsg(lang.already_have, options)\n    if (!char.testManipulate(this, \"take\")) return false;\n    if (this.tiedTo1 && this.tiedTo2) return falsemsg(lang.rope_tied_both_end, options)\n\n    let end\n    if (this.locs.length === 1 && !this.tiedTo1 && !this.tiedTo2) {\n      // Rope is in one place, not tied to anything, so move as a single item\n      this.locs = [char.name]\n      end = 0\n    }\n    else if (this.locs[0] === char.loc && !this.tiedTo1) {\n      // end 1 is here and not attached, so get that\n      this.locs.unshift(char.name)\n      end = 1\n    }\n    else if (this.locs[this.locs.length - 1] === char.loc && !this.tiedTo2) {\n      // end 2 is here and not attached, so get that\n      this.locs.push(char.name)\n      end = 2\n    }\n    else if (this.locs[0] === char.loc || this.locs[this.locs.length - 1] === char.loc) {\n      // an end is here - presumably tied to something\n      return falsemsg(lang.rope_tied_one_end, options)\n    }\n    else {\n      return falsemsg(lang.rope_no_end, options)\n    }\n    options.end = end\n    options.toLoc = char.name\n    options.fromLoc = char.loc\n\n    msg(this.msgTake, options)\n    if (w[char.loc].afterTakeOut) w[char.loc].afterTakeOut(options)\n    if (w[char.name].afterDropIn) w[char.name].afterDropIn(options)\n    if (this.afterMove !== undefined) this.afterMove(options)\n    if (this.afterTake !== undefined) this.afterTake(options)\n    if (this.scenery) this.scenery = false\n    return true;\n  }\n\n  res.testCarry = function(options) {\n    if (this.ropeLength === undefined) return true // length not set, infinitely long!\n    if (this.locs.length < 3) return true // just in one room\n    if (!this.locs.includes(options.char.name)) return true // not carrying, so no issue\n    if (this.locs[0] === options.char.name) {\n      if (this.locs[2] === options.exit.name) return true // heading back where we came from\n    }\n    else {\n      if (this.locs[this.locs.length - 3] === options.exit.name) return true // heading back where we came from\n    }\n    if (this.locs.length <= this.ropeLength) return true\n    msg(lang.rope_cannot_move, options)\n    return false\n  }\n  res.afterCarry = function(options) {\n    const char = options.char\n    if (this.locs.length === 1) return // carried as single item, treat as std item\n    if (!this.locs.includes(char.name)) return // not carrying, so no issue\n    if (this.locs[0] === char.name) {\n      // suppose locs is me, lounge, kitchen, garden\n      // case 1: move lounge to kitchen -> me, kitchen, garden\n      // case 2: move lounge to hall -> me, hall, lounge, kitchen, garden\n      this.locs.shift()  // remove me\n      if (this.locs[1] === char.loc) {\n        this.locs.shift()\n        char.msg(this.msgWind, {char:char, item:this})\n      }\n      else {\n        this.locs.unshift(char.loc)\n        char.msg(this.msgUnwind, {char:char, item:this})\n      }\n      this.locs.unshift(char.name)\n    }\n    else {\n      this.locs.pop()  // remove me\n      if (this.locs[this.locs.length - 2] === char.loc) {\n        this.locs.pop()\n        char.msg(this.msgWind, {char:char, item:this})\n      }\n      else {\n        this.locs.push(char.loc)\n        char.msg(this.msgUnwind, {char:char, item:this})\n      }\n      this.locs.push(char.name)\n    }\n  }\n  return res\n}\n\nexport const BUTTON_DICTIONARY = {\n  button:true,\n  msgPress:lang.press_button_successful,\n\n  afterCreation:function(o) {\n    o.verbFunctions.push(function(o, verbList) {\n      verbList.push(lang.verbs.push)\n    })\n  },\n}\n\nexport const BUTTON = function() {\n  const res = Object.assign({}, BUTTON_DICTIONARY)\n\n  res.push = function(options) {\n    msg(this.msgPress, options)\n    if (this.afterPress) this.afterPress(options)\n  }\n\n  return res\n}\n\nexport const TRANSIT_BUTTON = function(nameOfTransit, transitDest) {\n  const res = Object.assign({}, BUTTON_DICTIONARY)\n  res.loc = nameOfTransit;\n  res.transitDest = transitDest\n  res.transitButton = true;\n  res.transitAlreadyHere = lang.transit_already_here\n  res.transitGoToDest = lang.transit_go_to_dest\n\n  res.push = function(options) {\n    const transit = w[this.loc];\n    const exit = transit[transit.transitDoorDir]\n\n    if (this.testTransitButton && !this.testTransitButton(options.char, {multiple:options.multiple, transit:transit})) return false\n    if (transit.testTransit && !transit.testTransit(options.char, {multiple:options.multiple, button:this})) return false\n    if (this.locked) return falsemsg(this.transitLocked)\n    if (exit.name === this.transitDest) return falsemsg(this.transitAlreadyHere)\n\n    if (transit.transitAutoMove) {\n      player().moveChar(transit[transit.transitDoorDir])  //player.previousLoc,\n    }\n    else {\n      printOrRun(player(), this, \"transitGoToDest\")\n      transit.transitUpdate(this, true)\n    }\n    return true\n  }\n\n  return res;\n};\n\n// This is for rooms\nexport const ROOM_SET = function(setName) {\n  return { roomSet:setName }\n}\n\n// This is for rooms\nexport const EXIT_FAKER = function() {\n  const res = {}\n\n  res.exit_attributes = ['msg', 'npcLeaveMsg', 'npcEnterMsg']\n\n  res.getExit = function(dir) {\n    if (this['exit_' + dir] === undefined) return undefined\n    const params = {origin:this, dir:dir}\n    if (this['exit_func_' + dir]) params.simpleUse = this[this['exit_func_' + dir]]\n    for (const att of this.exit_attributes) {\n      if (this['exit_' + att + '_' + dir]) params[att] = this['exit_' + att + '_' + dir]\n    }\n    return new Exit(this['exit_' + dir], params)\n  }\n\n  res.hasExit = function(dir, options) {\n    if (options === undefined) options = {}\n    if (!this['exit_' + dir]) return false\n    if (options.excludeLocked && this.isExitLocked(dir)) return false\n\n    if (options.excludeScenery && this['exit_scenery_' + dir]) return false\n    if (game.dark && !this['exit_illuminated_' + dir]) return false\n    return !this.isExitHidden(dir)\n  }\n\n  return res\n}\n\n// This is for rooms\nexport const TRANSIT = function(exitDir) {\n    return {\n      saveExitDests: true,\n      transitDoorDir: exitDir,\n      mapMoveableLoc: true,\n      mapRedrawEveryTurn: true,\n\n      beforeEnter: function () {\n          const transitButton = this.findTransitButton(player().previousLoc)\n          if (transitButton) this.transitUpdate(transitButton)\n      },\n\n      getTransitButtons: function (includeHidden, includeLocked) {\n          return this.getContents(world.LOOK).filter(function (el) {\n              if (!el.transitButton) return false;\n              if (!includeHidden && el.hidden) return false;\n              return !(!includeLocked && el.locked);\n\n          })\n      },\n\n      findTransitButton: function (dest) {\n          for (let key in w) {\n              if (w[key].loc === this.name && w[key].transitDest === dest) return w[key]\n          }\n          return null\n      },\n\n      setTransitDest: function (transitButton) {\n          if (typeof transitButton === 'string') {\n              transitButton = this.findTransitButton(transitButton)\n          }\n          if (!transitButton) return errormsg(\"Trying to set a transit to an unfathomable destination.\")\n\n          this[this.transitDoorDir].name = transitButton.transitDest\n          this.currentButtonName = transitButton.name\n          this.transitCurrentLocation = transitButton.transitDest\n      },\n\n      getTransitDestLocation: function () {\n          return w[this[this.transitDoorDir].name]\n      },\n      getTransitDestButton: function () {\n          return w[this.currentButtonName]\n      },\n\n      transitUpdate: function (transitButton, callEvent) {\n          if (!this[this.transitDoorDir]) return errormsg(\"The transit \\\"\" + this.name + \"\\\" is set to use \\\"\" + this.transitDoorDir + \"\\\" as the exit, but has no such exit.\")\n          const previousDest = this[this.transitDoorDir].name\n          this.setTransitDest(transitButton)\n          if (typeof map !== 'undefined' && map.transitUpdate) map.transitUpdate(this, transitButton, callEvent)\n          if (callEvent && this.afterTransitMove) this.afterTransitMove(transitButton.transitDest, previousDest)\n      },\n\n      // The exit is not saved, so after a load, need to update the exit\n      afterLoadForTemplate: function () {\n          if (this.currentButtonName) this.setTransitDest(w[this.currentButtonName])\n          if (this.afterLoad) this.afterLoad()\n      },\n\n      isTransitHere: function (char = player()) {\n          log(this[this.transitDoorDir].name)\n          log(char.loc)\n          return this[this.transitDoorDir].name === char.loc\n      },\n\n\n      transitOfferMenu: function () {\n          if (this.testTransit && !this.testTransit(player())) {\n              if (this.transitAutoMove) player().moveChar(this[this.transitDoorDir])  // player.previousLoc,\n              return false\n          }\n          const buttons = this.getTransitButtons(true, false);\n          const transitDoorDir = this.transitDoorDir;\n          const room = this;\n          showMenu(this.transitMenuPrompt, buttons.map(el => el.transitDestAlias), function (result) {\n              for (let button of buttons) {\n                  if (buttons[i].transitDestAlias === result) {\n                      buttons[i].push(false, player())\n                  }\n              }\n          })\n      },\n  };\n}\n\nexport const CHARACTER = function() {\n    return {\n      // The following are used also both player and NPCs, so we can use the same functions for both\n      canReachThroughThis: () => true,\n      canSeeThroughThis: () => true,\n      getContents: util.getContents,\n      pause: NULL_FUNC,\n      testManipulate: () => true,\n      testMove: () => true,\n      testPosture: () => true,\n      testTakeDrop: () => true,\n      mentionedTopics: [],\n      testTalkFlag: true,\n      testTalk: function () {\n          return this.testTalkFlag\n      },\n      afterCarryList: [],\n      followers: [],\n      money: 0,\n\n      getAgreement: function (cmdType, options) {\n          if (this['getAgreement' + cmdType]) return this['getAgreement' + cmdType](options)\n          if (this.getAgreementDefault) return this.getAgreementDefault()\n          return true\n      },\n\n      getHolding: function () {\n          return this.getContents(world.LOOK).filter(function (el) {\n              return !el.getWorn();\n          });\n      },\n\n      getWearing: function () {\n          return this.getContents(world.LOOK).filter(function (el) {\n              return el.getWorn() && !el.ensemble;\n          });\n      },\n\n      getCarrying: function () {\n          const res = []\n          for (const key in w) {\n              if (w[key].isUltimatelyHeldBy && w[key].isUltimatelyHeldBy(this)) res.push(w[key])\n          }\n          return res\n      },\n\n      getStatusDesc: function () {\n          if (!this.posture) return false;\n          return this.posture + \" \" + this.postureAdverb + \" \" + lang.getName(w[this.postureFurniture], {article: DEFINITE});\n      },\n\n      handleGiveTo: function (options) {\n          if (!options.item.isAtLoc(options.char.name)) return falsemsg(lang.not_carrying, options)\n          if (!options.char.getAgreement(\"Give\", options)) return false\n          if (!options.char.testManipulate(options.item, \"give\")) return false\n\n          options.extraTest = function (options, response) {\n              if (!response.item) return true\n              const item = typeof response.item === 'string' ? w[response.item] : response.item\n              return item === options.item\n          }\n          return respond(options, this.receiveItems)\n      },\n\n      getOuterWearable: function (slot) {\n          const clothing = this.getWearing().filter(function (el) {\n              if (typeof el.getSlots !== \"function\") {\n                  console.log(\"Item with worn set to true, but no getSlots function\");\n                  console.log(el);\n              }\n              return el.getSlots().includes(slot);\n          });\n\n          if (clothing.length === 0) {\n              return false;\n          }\n          let outer = clothing[0];\n          for (let garment of clothing) {\n              if (garment.wear_layer > outer.wear_layer) {\n                  outer = garment;\n              }\n          }\n          return outer;\n      },\n\n      // Also used by NPCs, so has to allow for that\n      msg: function (s, params) {\n          msg(s, params);\n      },\n\n      afterCreation: function (o) {\n          o.nameModifierFunctions.push(function (o, l) {\n              let s = ''\n              const state = o.getStatusDesc();\n              const held = o.getHolding();\n              const worn = o.getWearingVisible();\n\n              const list = [];\n              if (state) {\n                  list.push(state);\n              }\n              if (held.length > 0) {\n                  list.push(lang.invHoldingPrefix + ' ' + formatList(held, {\n                      article: INDEFINITE,\n                      lastSep: lang.list_and,\n                      modified: false,\n                      nothing: lang.list_nothing,\n                      loc: o.name,\n                      npc: true\n                  }));\n              }\n              if (worn.length > 0) {\n                  list.push(lang.invWearingPrefix + ' ' + formatList(worn, {\n                      article: INDEFINITE,\n                      lastSep: lang.list_and,\n                      modified: false,\n                      nothing: lang.list_nothing,\n                      loc: o.name,\n                      npc: true\n                  }));\n              }\n              if (list.length > 0) l.push(list.join('; '))\n          })\n          o.verbFunctions.push(function (o, verbList) {\n              verbList.shift()\n              verbList.push(lang.verbs.lookat)\n              if (!settings.noTalkTo) verbList.push(lang.verbs.talkto)\n          })\n      },\n\n      // Use this to move the character. Describing it should be done elsewhere\n      moveChar: function (exit) {\n          if (!(exit instanceof Exit)) return errormsg(\"Using moveChar for \" + this.name + \" but no exit sent.\")\n          const room = util.getObj(exit.name)\n          this.previousLoc = this.loc\n\n          if (this.player) {\n              if (settings.clearScreenOnRoomEnter) clearScreen();\n              loc().afterExit(exit)\n              this.loc = room.name\n              world.update()\n              world.enterRoom(exit)\n          } else {\n              this.loc = room.name\n              this.handleMovingFollowers(exit)\n          }\n\n          if (this.afterMove) this.afterMove(exit)\n          for (const el of this.getCarrying()) {\n              if (el.afterCarry) el.afterCarry({char: this, item: el, exit: exit})\n          }\n      },\n\n      // Use when the NPC changes rooms; will give a message if the player can observe it\n      movingMsg: function (exit) {\n          if (this.player) {\n              if (exit.msg) {\n                  printOrRun(this, exit, \"msg\")\n              } else if (lang.go_successful) {\n                  msg(lang.go_successful, {char: this, dir: exit.dir})\n              }\n          } else {\n              if (exit.msgNPC) {\n                  exit.msgNPC(this)\n              } else {\n                  lang.npc_leaving_msg(this, exit)\n                  lang.npc_entering_msg(this, exit)\n              }\n          }\n      },\n\n      handleMovingFollowers: function (exit) {\n          for (let s of this.followers) {\n              const follower = w[s]\n              if (follower.loc === this.loc) continue\n              if (!follower.testFollowTo || follower.testFollowTo(w[exit.name])) {\n                  if (this.player) follower.movingMsg(exit, true)\n                  follower.moveChar(exit)\n              }\n          }\n      }\n  }\n}\n\nexport const PLAYER = function() {\n  const res = CHARACTER()\n  res.pronouns = lang.pronouns.secondperson\n  res.player = true\n\n  res.receiveItems = [\n    {\n      test:function() { return true },\n      f:function(options) {\n        msg(lang.done_msg, options)\n        util.giveItem(options)\n        return true\n      }\n    },\n  ]\n\n  return res;\n}\n","// noinspection JSUnusedGlobalSymbols\n\n\"use strict\";\n\n// This is where the world exist!\n\nimport {\n    DEFAULT_ITEM, DEFAULT_OBJECT, DEFAULT_ROOM,\n    endTurnUI, errormsg, msg, warningFor, initCommands,\n    lang, test, util, saveLoad, settings, TOPIC\n} from \"../index.js\";\n\nexport const w = {};\n\n//@DOC\n// ## World Functions\n//\n// These are functions for creating objects in the game world\n//@UNDOC\n\n//@DOC\n// Use this to create a new item (as opposed to a room).\n// It adds various defaults that apply only to items.\n// The first argument should be a string - a unique name for this object, composed only of letters, numbers and underscores.\n// It will than take any number of dictionaries that will be combined to set the properties.\n// Generally objects should not be created during play as they will not be saved properly.\n// Either keep the object hodden until required or clone existing objects.\nexport function createItem() {\n  const args = Array.prototype.slice.call(arguments)\n  const o = createItemOrRoom(args, DEFAULT_ITEM, settings.itemCreateFunc)\n\n  // Create topics from convTopics\n  if (o.convTopics) {\n    o.convTopics.forEach(function (value, i) {\n      value.loc = o.name\n      createItem(value.name ? value.name : o.name + '_convTopic_' + i, TOPIC(), value)\n    })\n    delete o.convTopics\n  }\n  if (o.player && !game.player) {\n      setPlayer(o);\n  }\n\n  return o\n}\n\n//@DOC\n// Use this to create a new room (as opposed to an item).\n// It adds various defaults that apply only to items\n// The first argument should be a string - a unique name for this object, composed only of letters, numbers and underscores.\n// It will than take any number of dictionaries that will be combined to set the properties.\n// Generally objects should not be created during play as they will not be saved properly.\n// Either keep the object hodden until required or clone existing objects.\nexport function createRoom() {\n  const args = Array.prototype.slice.call(arguments)\n  const o = createItemOrRoom(args, DEFAULT_ROOM, settings.roomCreateFunc)\n  o._region = region\n  if (o.scenery) {\n    for (const x of o.scenery) {\n      const el = typeof x === 'string' ? {alias:x} : x\n      const alias = Array.isArray(el.alias) ? el.alias.shift() : el.alias\n      const aliases = Array.isArray(el.alias) ? el.alias : []\n      if (!alias) throw \"ERROR: Scenery item is missing an alias in room: \" + o.name\n      const obj = createItem(o.name + '_scenery_' + alias.replace(/\\W/g, ''), {\n        loc:o.name,\n        alias:alias,\n        synonyms:aliases,\n        scenery:true,\n        examine:el.examine ? el.examine : lang.default_description,\n      })\n      delete el.alias\n      delete el.examine\n      for (const key in el) obj[key] = el[key]\n    }\n    delete o.scenery\n  }\n  return o\n}\n\nexport function createItemOrRoom(args, defaults, createFunc) {\n  const name = args.shift()\n  args.unshift(defaults)\n  const o = createObject(name, args)\n  if (createFunc) createFunc(o)\n  return o\n}\n\n//@DOC\n// Use this to create new items during play. The given item will be cloned at the given location.\n// The `newName` is optional, one will be generated if not supplied. If you do supply one bear inmid that\n// every clone must have a unique name.\nexport function cloneObject(item, loc, newName) {\n  if (item === undefined) { return errormsg(\"Item is not defined.\") }\n  if (typeof item === 'string') {\n    const o = w[item]\n    if (o === undefined) { return errormsg(\"No item called '\" + item + \"' found in cloneObject.\") }\n    item = o\n  }\n  if (!newName) newName = item.name\n  const clone = {};\n  for (let key in item) clone[key] = item[key]\n  clone.name = util.findUniqueName(newName)\n  if (!clone.clonePrototype) {\n    clone.clonePrototype = item\n  }\n  if (loc !== undefined) {\n    clone.loc = loc;\n  }\n\n  clone.getSaveStringPreamble = function(item) {\n    return \"Clone:\" + this.clonePrototype.name + \"=\"\n  }\n\n  w[clone.name] = clone\n  return clone\n}\n\n//@DOC\n// Use this to create new items before play. The given item will be cloned at the given location.\n// The `newName` is optional, one will be generated if not supplied. If you do supply one bear in mind that\n// every copy must have a unique name.\nexport function copyObject(item, loc, newName) {\n  if (world.isCreated) { return errormsg(\"Attempting to copy item after the game has started\") }\n  if (item === undefined) { return errormsg(\"Item is not defined.\") }\n  if (typeof item === 'string') {\n    const o = w[item]\n    if (o === undefined) { return errormsg(\"No item called '\" + item + \"' found in copyObject.\") }\n    item = o\n  }\n  if (!newName) newName = item.name\n\n\n  const copy = {...item,\n    verbFunctions:[world.defaultVerbFunction],\n    initialiserFunctions:[...item.initialiserFunctions],\n  };\n  copy.name = util.findUniqueName(newName)\n  if (loc !== undefined) {\n    copy.loc = loc;\n  }\n\n  w[copy.name] = copy\n  return copy\n}\n\n//@DOC\n// Creates a basic object. Generally it is better to use CreateItem or CreateRoom.\n// List of hashes will contain the hash that is common to everything, then the hash that is common to rooms or item, then any templates in oder and finally the author's data\nexport function createObject(name, listOfHashes) {\n  if (world.isCreated && !settings.saveDisabled) return errormsg(\"Attempting to use createObject with `\" + name + \"` after set up. To ensure games save properly you should use cloneObject to create ites during play.\")\n  if (/\\W/.test(name)) return errormsg(\"Attempting to use the prohibited name `\" + name + \"`; a name can only include letters and digits - no spaces or accented characters. Use the 'alias' attribute to give an item a name with other characters.\")\n  if (w[name]) return errormsg(\"Attempting to use the name `\" + name + \"` when there is already an item with that name in the world.\")\n  if (typeof listOfHashes.unshift !== 'function') return errormsg(\"The list of hashes for `\" + name + \"` is not what I was expecting. Maybe you meant to use createItem or createRoom?\")\n\n  // put the default attributes on the list\n  listOfHashes.unshift(DEFAULT_OBJECT)\n\n  const item = { name:name }\n\n  for (let hash of listOfHashes) {\n    for (let key in hash) {\n      item[key] = hash[key]\n    }\n  }\n\n  // Give every object an alias and list alias (used in the inventories)\n  item.setAlias(item.alias ? item.alias : item.name.replace(/_/g, \" \"), item)\n\n  item.verbFunctions = [world.defaultVerbFunction]\n  item.nameModifierFunctions = []\n  item.initialiserFunctions = []\n  for (let hash of listOfHashes) {\n    if (hash.afterCreation) item.initialiserFunctions.push(hash.afterCreation)\n  }\n\n  w[name] = item;\n  return item;\n}\n\nlet region;\n\n/*\nThis can be considered a stateless controller for the game world.\nIt is stateless because nothing here will be saved - use `game` for that.\nIt handles initialising, turn taking, room entering\n*/\nexport const world = {\n  //VISIBLE:1,\n  //REACHABLE:2,\n\n  // constants for lighting levels\n  LIGHT_NONE:0,\n  LIGHT_SELF:1,\n  LIGHT_MEAGRE:2,\n  LIGHT_FULL:3,\n  LIGHT_EXTREME:4,\n\n  // constants for verbosity of room descriptions\n  BRIEF:1,\n  TERSE:2,\n  VERBOSE:3,\n\n  // constants for isAtLoc situations\n  LOOK:1,\n  PARSER:2,\n  INVENTORY:3,\n  SIDE_PANE:4,\n  PURCHASE:5,\n  ALL:6,\n\n  // constants for command responses\n  // (but a verb will return true or false, so the command that uses it\n  // can in turn return one of these - a verb is an attribute of an object)\n  SUCCESS:1,\n  SUCCESS_NO_TURNSCRIPTS:2,\n  FAILED:-1,\n  PARSER_FAILURE:-2,\n\n  isCreated:false,\n\n\n  //------------------------------------------------------------\n  // Initialisation\n\n  init:function() {\n    settings.performanceLog('Start world.init');\n\n    // check player found:\n    player();\n\n    // Initialise all object\n    for (let key in w) {\n      world.initItem(w[key])\n    }\n\n    // Initialise commands\n    initCommands()\n\n    settings.verbosity = world.VERBOSE\n\n    game.ticker = setInterval(world.gameTimer, settings.timerInterval);\n\n    w[player().loc].visited++\n    world.update()\n    world.saveGameState()\n    settings.performanceLog('End world.init')\n    world.isCreated = true\n  },\n  // Every item or room should have this called for them.\n  // That will be done at the start, but you need to do it yourself\n  // if creating items on the fly (but you should not be doing that anyway!).\n  initItem:function(item) {\n    if (item.clonePrototype) return errormsg('Trying to initiaslise a cloned object. This is not permitted, as the prototype will not have been initialised before it was cloned. Instead, clone the object in settings.setup.')\n    // remove duplicates first - can occur if a template adds another template and the author does so too\n    for (const f of [...new Set(item.initialiserFunctions)]) f(item)\n    delete item.initialiserFunctions\n    delete item.afterCreation\n\n    // Initialise exits\n    for (let exit of lang.exit_list) {\n      // So exit is the data object from lang, while ex is the Exit the author has created\n      const ex = item[exit.name]\n      if (ex) {\n        ex.origin = item\n        ex.dir = exit.name\n        if (ex.alsoDir) {\n          for (let dir of ex.alsoDir) {\n            item[dir] = new Exit(ex.name, ex);\n            item[dir].scenery = true\n            item[dir].isAlsoDir = true\n            item[dir].dir = dir\n            delete item[dir].alsoDir\n          }\n        }\n        if (ex instanceof Link) {\n          const reverseDir = ex.reverse()\n          const dest = w[ex.name]\n          if (dest[reverseDir]) {\n            log('WARNING: The returning Exit for the Link on ' + item.name + ' goes to a direction that already has something set (conflicts with \"' + reverseDir + '\" on ' + dest.name + ').')\n            continue\n          }\n          dest[reverseDir] = new Exit(ex.origin.name)\n          dest[reverseDir].origin = dest\n          dest[reverseDir].dir = reverseDir\n        }\n      }\n    }\n\n    // Handle room set\n    if (item.roomSet) {\n      if (!settings.roomSetList[item.roomSet]) {\n        settings.roomSetList[item.roomSet] = []\n      }\n      settings.roomSetList[item.roomSet].push({name:item.name, visited:false})\n    }\n\n\n\n    if (settings.playMode === 'dev' && !settings.disableChecks && !item.abstract) {\n      if (item.loc && !w[item.loc]) {\n        warningFor(item, \"In an unknown location (\" + item.loc + \")\");\n      }\n\n      if (item.consultable && !settings.noAskTell) {\n        if (!item.tellOptions || item.tellOptions.length === 0) warningFor(item, \"No tellOptions for consultable/NPC\")\n        if (!item.askOptions || item.askOptions.length === 0) warningFor(item, \"No askOptions for consultable/NPC\")\n      }\n\n      const dirs = lang.exit_list.filter(el => el.type !== 'nocmd').map(el => el.name)\n      //console.log(dirs)\n      for (let key in item) {\n        if (dirs.includes(key)) {\n          if (!item[key] instanceof Exit) warningFor(item, \"Exit \" + key + \" is not an Exit instance.\")\n          if (item[key].name !== '_' && !w[item[key].name]) warningFor(item, \"Exit \" + key + \" goes to an unknown location (\" + item[key].name + \").\")\n        }\n        else {\n          if (item[key] instanceof Exit) warningFor(item, \"Attribute \" + key + \" is an Exit instance and probably should not.\")\n        }\n      }\n\n      if (item.abstract) {\n        // do nothing\n      }\n      if (item.room) {\n        if (typeof item.desc === 'function') {\n          try {\n            test.testing = true\n            test.testOutput = []\n            const out = item.desc()\n            test.testing = false\n            if (test.testOutput.length > 0) warningFor(item, \"The 'desc' attribute for this location is a function that prints directy to screen; should return a string only: \" + item.name)\n            if (typeof out !== 'string') {\n              warningFor(item, \"The 'desc' function attribute does not return a string\")\n            }\n          }\n          catch(err) {\n            warningFor(item, \"The 'desc' function caused an error\")\n            log(err.message)\n            log(err.stack)\n          }\n        } else if (typeof item.desc !== 'string') {\n          warningFor(item, \"The 'desc' attribute for this location is neither a string nor a function\")\n        }\n      }\n      else if (item.conversationTopic) {\n        if (!item.msg && !item.script) warningFor(item, \"Topic has neither 'script' or 'msg' attribute\")\n        if (item.msg && typeof item.msg !== 'string') warningFor(item, \"The 'msg' attribute for this topic is not a string\")\n        if (item.script && typeof item.script !== 'function') warningFor(item, \"The 'script' attribute for this topic is not a function\")\n      }\n      else {\n        if (typeof item.examine === 'function') {\n          try {\n            test.testing = true\n            test.testOutput = []\n            const out = item.examine({char:player(), item:item})\n            test.testing = false\n            if (out !== undefined) {\n              warningFor(item, \"The 'examine' function attribute returns a value; it probably should not\")\n            }\n          }\n          catch(err) {\n            warningFor(item, \"The 'examine' function caused an error\")\n            log(err.message)\n            log(err.stack)\n          }\n        }\n        else if (typeof item.examine !== 'string') {\n          warningFor(item, \"The 'examine' attribute for this item is neither a string nor a function\")\n        }\n      }\n      if (settings.customObjectChecks) settings.customObjectChecks(item)\n    }\n\n\n  },\n\n  // Start the game - could be called after the start up dialog, so not part of init\n  begin:function() {\n    settings.performanceLog('Start begin')\n    if (settings.startingDialogEnabled) return\n    if (typeof settings.intro === \"string\") {\n      msg(settings.intro)\n    }\n    else if (settings.intro) {\n      for (let el of settings.intro) msg(el)\n    }\n    if (typeof settings.setup === \"function\") settings.setup()\n    world.enterRoom()\n    settings.performanceLog('End begin')\n  },\n\n  //------------------------------------------------------------\n  // Turn taking\n\n  // Call after the player takes a turn, sending it a result, SUCCESS, SUCCESS_NO_TURNSCRIPTS or FAILED\n  endTurn:function(result) {\n    if (result === true) log(\"That command returned 'true', rather than the proper result code.\");\n    if (result === false) log(\"That command returned 'false', rather than the proper result code.\");\n    util.handleChangeListeners()\n    if (result === world.SUCCESS || (settings.failCountsAsTurn && result === world.FAILED)) {\n      game.turnCount++\n      game.elapsedTime += settings.dateTime.secondsPerTurn;\n      for (const key in w) w[key].endTurn()\n      for (const m of settings.modulesToEndTurn) m.endTurn()\n\n      util.handleChangeListeners()\n      world.resetPauses();\n      world.update();\n      world.saveGameState();\n      endTurnUI(true);\n    }\n    else {\n      endTurnUI(false);\n    }\n  },\n\n\n  // Updates the game world, specifically...\n  // Sets the scoping snapshot\n  // Sets the light/dark\n  update:function() {\n    if (!player()) return errormsg(\"No player object found. This will not go well...\")\n    if (player().loc === player().name) return errormsg(\"The location assigned to the player is the player itself.\")\n    if (!player().loc || !w[player().loc]) {\n      if (world.isCreated) {\n        return errormsg((player().loc === undefined ? \"No player location set.\" : \"Player location set to '\" +\n            player().loc + \"', which does not exist.\") + \" Has the player just moved? This is likely to be because of an error in the exit being used.\")\n      }\n      else {\n        return errormsg((player().loc === undefined ? \"No player location set.\" : \"Player location set to '\" +\n            player().loc + \"', which does not exist.\") + \" This is may be because of an error in one of the .js files; the browser has hit the error and stopped at that point, before getting to where the player is set. Is there another error above this one? If so, that i the real problem.\")\n      }\n    }\n    game.loc = w[player().loc];\n\n    world.scopeSnapshot();\n  },\n\n  resetPauses:function() {\n    for (let key in w) {\n      if (w[key].paused){\n        w[key].paused = false\n      }\n    }\n  },\n\n  // Returns true if bad lighting is not obscuring the item\n  ifNotDark:function(item) {\n    return (!game.dark || item.lightSource() > world.LIGHT_NONE);\n  },\n\n  // scopeStatus is used to track what the player can see and reach; it is a lot faster than working\n  // it out each time, as the scope needs to be checked several times every turn.\n  scopeSnapshot:function() {\n    // reset every object\n    for (let key in w) w[key].scopeStatus = {}\n    world.scope = []\n\n    world.takeScopeSnapshot(\"See\")\n    world.takeScopeSnapshot(\"Reach\")\n    if (!world.scope.includes(loc())) world.scope.push(loc())\n    if (player().onPhoneTo && !world.scope.includes(w[player().onPhoneTo])) world.scope.push(w[player().onPhoneTo])\n\n    let light = world.LIGHT_NONE\n    for (const item of world.scope) {\n      if (!item.lightSource) log(item.name)\n      if (light < item.lightSource()) {\n        light = item.lightSource()\n      }\n    }\n    game.dark = (light < world.LIGHT_MEAGRE)\n  },\n\n  // mode is either \"Reach\" or \"See\"\n  takeScopeSnapshot:function(mode) {\n    // start from the current room\n    let room = loc()\n    room.scopeStatus['room' + mode] = true\n    // crawl up the room hierarchy to the topmost reachable/visible\n    while (room.loc && room['can' + mode + 'ThroughThis']()) {\n      room = w[room.loc]\n      room.scopeStatus['room' + mode] = true\n    }\n    // room is now the top level applicable, so now work downwards from here (recursively)\n    room.scopeSnapshot(mode)\n  },\n\n  defaultVerbFunction:function(o, verbList) {\n    verbList.push(lang.verbs.examine)\n    if (o.use !== undefined) verbList.push(lang.verbs.use)\n  },\n\n  //------------------------------------------------------------\n  // Entering a new room\n\n  // Runs the script and gives the description\n  enterRoom:function(exit) {\n    if (loc().beforeEnter === undefined) {\n      return errormsg(\"This room, \" + loc().name + \", has no 'beforeEnter` function defined.  This is probably because it is not actually a room (it was not created with 'createRoom' and has not got the DEFAULT_ROOM template), but is an item. It is not clear what state the game will continue in.\")\n    }\n    settings.beforeEnter(exit)\n    if (loc().visited === 0) {\n      if (loc().roomSet) {\n        loc().roomSetOrder = 1\n        for (const el of settings.roomSetList[loc().roomSet]) {\n          if (el.visited) loc().roomSetOrder++\n          if (el.name === loc().name) el.visited = true\n        }\n      }\n      loc().beforeFirstEnter(exit)\n    }\n    loc().beforeEnter(exit)\n    world.enterRoomAfterScripts(exit);\n  },\n\n  // Called when entering a new room, after beforeEnter and beforeFirstEnter re done\n  enterRoomAfterScripts:function(exit) {\n    loc().description()\n    player().handleMovingFollowers(exit)\n    loc().visited++\n    loc().afterEnter(exit)\n    settings.afterEnter(exit)\n    if (loc().visited === 1) { loc().afterFirstEnter(exit) }\n    for (let key in loc().afterEnterIf) {\n      // if already done, skip\n      if (loc().afterEnterIfFlags.split(\" \").includes(key)) continue;\n      if (loc().afterEnterIf[key].test()) {\n        loc().afterEnterIf[key].action()\n        loc().afterEnterIfFlags += \" \" + key\n      }\n    }\n  },\n\n\n\n  //------------------------------------------------------------\n  // Real time event handling\n  gameTimer:function() {\n    // Note that this gets added to window by setInterval, so 'this' does not refer to the game object\n    game.elapsedRealTime++;\n    let somethingHappened = false\n    for (let i = 0; i < game.timerEventNames.length; i++) {\n      if (game.timerEventTriggerTimes[i] && game.timerEventTriggerTimes[i] < game.elapsedRealTime) {\n        const flag = settings.eventFunctions[game.timerEventNames[i]]()\n        if (game.timerEventIntervals[i] !== -1 && !flag) {\n          game.timerEventTriggerTimes[i] += game.timerEventIntervals[i]\n        }\n        else {\n          game.timerEventTriggerTimes[i] = 0\n        }\n        somethingHappened = true\n      }\n    }\n    if (somethingHappened) util.handleChangeListeners()\n  },\n\n\n  //------------------------------------------------------------\n  // UNDO Support\n  gameState:[],\n  saveGameState:function() {\n    if (settings.maxUndo > 0) {\n      world.gameState.push(saveLoad.getSaveBody());\n      if (world.gameState.length > settings.maxUndo) world.gameState.shift();\n    }\n  },\n\n  find:function(fn, options) {\n    for (const key in w) {\n      if (fn(w[key], options)) return w[key]\n    }\n    return null\n  }\n}\n\nexport const game = {\n  player: null,\n  loc: null,\n  turnCount:0,\n  elapsedTime:0,\n  elapsedRealTime:0,\n  startTime:settings.dateTime.start,\n  name:'built-in_game_object',\n\n  timerEventNames:[],\n  timerEventTriggerTimes:[],\n  timerEventIntervals:[],\n\n  getSaveString:function() {\n    let s = \"GameState=\"\n    for (const key in this) {\n      if (!this.saveLoadExclude(key)) s += saveLoad.encode(key, this[key])\n    }\n    return s\n  },\n  setLoadString:function(s) {\n    const parts = s.split(\"=\")\n    if (parts.length !== 2) return errormsg(\"Bad format in saved data (\" + s + \")\")\n    if (parts[0] !== \"GameState\") return errormsg(\"Expected GameState to be second\")\n    saveLoad.setFromArray(this, parts[1].split(\";\"));\n  },\n  saveLoadExclude:function(att) {\n    return (att === 'player' || typeof this[att] === 'function' || typeof this[att] === 'object')\n  },\n}\n\nexport function loc() {\n    if (!game.loc) {\n        return errormsg(\"Something wrong - current location not found!\");\n    }\n\n    return game.loc;\n}\nexport function player() {\n    if (!game.player) {\n        return errormsg(\"No player object found. This is probably due to an error in the data file where the player object is defined, but could be because you have not set one.\");\n    }\n\n    return game.player;\n}\nexport function setPlayer(char) {\n    game.player = char;\n}\n\nexport class Exit {\n  constructor(name, hash) {\n    if (!hash) hash = {}\n    this.name = name\n    // set these from util so the defaults can be modified\n    this.use = util.defaultExitUse\n    this.isGuarded = util.defaultExitIsGuarded\n    this.getExitObject = function() { return lang.exit_list.find(el => el.name === this.dir ) }\n    this.nice = function() {\n      const dirObj = this.getExitObject()\n      return dirObj.niceDir ? dirObj.niceDir : dirObj.name\n    }\n    this.reverseNice = function() {\n      const dirObj = this.reverseObject()\n      return dirObj.niceDir ? dirObj.niceDir : dirObj.name\n    }\n    this.reverse = function() { return this.getExitObject().opp }\n    this.reverseObject = function() {\n      const dir = this.getExitObject().opp\n      return lang.exit_list.find(el => el.name === dir)\n    }\n    this.isLocked = function() { return this.origin.isExitLocked(this.dir); }\n    this.setLock = function(locked) { return this.origin.setExitLock(this.dir, locked); }\n    this.isHidden = function() { return this.origin.isExitHidden(this.dir) }\n    this.setHide = function(hidden) { return this.origin.setExitHide(this.dir, hidden); }\n    for (let key in hash) {\n      if (key !== 'name') this[key] = hash[key];\n    }\n  }\n}\n\nexport class Link extends Exit {\n  constructor(name, hash) {\n    super(name, hash)\n  }\n}\n\nexport const regions = {};\nexport const setRegion = function(name, data) {\n  region = name\n  regions[name] = data\n}\n","// noinspection JSUnusedGlobalSymbols\n\n\"use strict\";\n\n// Should all be language neutral\n\nimport {\n    CHARACTER, debugmsg, errormsg, failedmsg, falsemsg, formatList,\n    getResponseList, metamsg, msg, printOrRun, respond,\n    util, io, lang, array, w,\n    game, world, settings, player, loc\n} from \"../index.js\";\n\nexport const NPC = function(isFemale) {\n  // A whole bunch of defaults are the same as the player\n  const res = Object.assign({}, CHARACTER(), CONSULTABLE(), AGENDA_FOLLOWER());\n\n  res.npc = true;\n  res.isFemale = isFemale\n  res.pronouns = isFemale ? lang.pronouns.female : lang.pronouns.male\n\n  res.askOptions = [];\n  res.tellOptions = [];\n  res.excludeFromAll = true;\n  res.reactions = []\n  res.receiveItems = [\n    {\n      msg:lang.not_interested_for_give,\n      failed:true,\n    },\n  ];\n  res.followers = []\n  res.canReachThroughThis = () => false;\n  res.icon = () => 'npc12'\n\n  // This does not work properly, it just gets all clothing!!!\n  // But authors could replace as required\n  res.getWearingVisible = function() {\n    return this.getWearing();\n  };\n\n  res.isHere = function() {\n    return this.isAtLoc(player().loc);\n  }\n\n  res.msg = function(s, params) {\n    if (this.isHere()) msg(s, params);\n  }\n\n  res.multiMsg = function(ary) {\n    if (!this.isHere()) return;\n    const counter = ary[0].replace(/[^a-z]/ig, '');\n    if (this[counter] === undefined) this[counter] = -1;\n    this[counter]++;\n    if (this[counter] >= ary.length) this[counter] = ary.length - 1;\n    if (ary[this[counter]]) msg(ary[this[counter]]);\n  }\n\n  // can we see the NPC from here?\n  // do we need a prefix?\n  res.inSight = function(room) {\n    if (!this.loc) return false\n    if (!room) room = w[this.loc]\n    if (player().loc === room.name) return true\n    if (room.visibleFrom === undefined) return false\n    if (typeof room.visibleFrom === 'function') return room.visibleFrom(loc())\n    if (Array.isArray(room.visibleFrom)) {\n      if (room.visibleFrom.includes(loc().name)) return room.visibleFromPrefix ? room.visibleFromPrefix : true\n    }\n    return false\n  }\n\n  res.setLeader = function(npc) {\n    if (typeof npc === 'string') npc = w[npc]\n    if (this.leaderName) array.remove(w[this.leaderName].followers, this.name)\n    if (npc) {\n      npc.followers.push(this.name)\n      this.leaderName = npc.name\n    }\n    else {\n      delete this.leaderName\n    }\n  }\n\n  res.getFollowers = function() {\n    return this.followers.map(el => w[el])\n  }\n\n  // Used by commands\n  res.startFollow = function() {\n    if (this.leaderName) return falsemsg(lang.already_following, {npc:this})\n    this.setLeader(player())\n    msg(\"{nv:npc:nod:true} his head.\", {npc:this})\n    return true\n  };\n  res.endFollow = function() {\n    if (!this.leaderName) return falsemsg(lang.already_waiting, {npc:this})\n    this.setLeader()\n    msg(\"{nv:npc:nod:true} his head.\", {npc:this})\n    return true\n  };\n\n  res.endTurn = function(turn) {\n    if (this.dead) return\n    this.sayTakeTurn()\n    this.doReactions()\n    if (!this.paused && !this.suspended && this.agenda && this.agenda.length > 0) this.doAgenda()\n    this.doEvent(turn)\n  }\n\n  res.doReactions = function() {\n    if (this.player) return   // needed for POV swapping\n    if (!this.isHere() && !settings.npcReactionsAlways) return\n    if (!this.reactionFlags) this.reactionFlags = []\n\n    const params = {\n      char:this,\n      noResponseNotError:true,\n      afterScript:function(params, response) {\n        if (!response) return\n        if (response.name) params.char.reactionFlags.push(response.name)\n        if (!response.noPause) params.char.pause()\n        if (response.override) params.char.reactionFlags = params.char.reactionFlags.concat(response.override)\n      },\n      extraTest:function(params, response, ) {\n        return !response.name || !params.char.reactionFlags.includes(response.name)\n      },\n    }\n    respond(params, this.reactions)\n  }\n\n  for (const key in npc_utilities) res[key] = npc_utilities[key]\n\n  // For ASK/TELL\n  res.topics = function() {\n    if (this.askOptions.length === 0 && this.tellOptions.length === 0) {\n      metamsg(lang.topics_no_ask_tell);\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    }\n\n    let flag = false;\n    for (let action of ['ask', 'tell']) {\n      const arr = getResponseList({char:this, action:action}, this[action + 'Options']);\n      const arr2 = []\n      for (let res of arr) {\n        if (res.silent && !player().mentionedTopics.includes(res.name)) continue\n        arr2.push(res.name)\n      }\n      if (arr2.length !== 0) {\n        metamsg(lang['topics_' + action + '_list'], {item:this, list:arr2.sort().join('; ')});\n        flag = true;\n      }\n    }\n\n    if (!flag) {\n      metamsg(lang.topics_none_found, {item:this})\n    }\n\n    return settings.lookCountsAsTurn ? world.SUCCESS : world.SUCCESS_NO_TURNSCRIPTS\n  }\n\n  res.sayBonus = 0;\n  res.sayPriority = 0;\n  res.sayState = 0;\n  res.sayUsed = \" \";\n  res.sayResponse = function(s) {\n    if (!this.sayResponses) return false\n\n    const params = {\n      text:s,\n      char:this,\n      extraTest:function(params, response) {\n        if (!response.regex) return true\n        if (response.id && params.char.sayUsed.match(new RegExp('\\\\b' + response.id + '\\\\b'))) return false\n        return response.regex.test(params.text)\n      },\n      afterScript:function(params, response) {\n        if (!response) return\n        if (this.oldQuestion) {\n          delete this.oldQuestion\n        }\n        else {\n          params.char.sayBonus = 0\n          params.char.sayQuestion = false\n        }\n        if (response.id) params.char.sayUsed += response.id + \" \"\n      },\n      noResponseNotError:true,\n    }\n    return respond(params, this.sayResponses)\n  }\n\n  res.sayCanHear = function(char, verb) {\n    return char.loc === this.loc;\n  }\n\n  res.askQuestion = function(questionName) {\n    if (typeof questionName !== \"string\") questionName = questionName.name\n    if (this.sayQuestion) this.oldQuestion = this.sayQuestion\n    const q = util.questionList[questionName]\n    if (!q) return errormsg(\"Trying to set a question that does not exist, \" + questionName + \", for \" + this.name)\n\n    this.sayQuestion = questionName\n    this.sayQuestionCountdown = q.countdown\n    this.sayBonus = 100\n  }\n\n  res.respondToAnswer = function(s) {\n    const q = util.questionList[this.sayQuestion]\n    return q.sayResponse(this, s)\n  }\n\n  res.sayTakeTurn = function() {\n    if (!this.sayQuestion) return\n    this.sayQuestionCountdown--\n    if (this.sayQuestionCountdown > 0) return\n    const q = util.questionList[this.sayQuestion]\n    this.sayQuestion = false\n    this.sayBonus = 0\n    if (q.expiredScript) q.expiredScript(this)\n  }\n\n  return res;\n};\n\nexport const npc_utilities = {\n  findTopic:function(alias, n = 1) {\n    return util.findTopic(alias, this, n)\n  },\n  showTopic:function(alias, n = 1) {\n    util.findTopic(alias, this, n).show()\n  },\n  hideTopic:function(alias, n = 1) {\n    util.findTopic(alias, this, n).hide()\n  },\n\n\n  talkto:function() {\n    if (settings.noTalkTo !== false) {\n      metamsg(settings.noTalkTo);\n      return false;\n    }\n\n    if (!player().testTalk(this)) return false\n    if (this.testTalk && !this.testTalk()) return false\n\n    // handle non-dynamic talkto\n    if (typeof this.talk === 'string') {\n      msg(this.talk, {char:this})\n      return true\n    }\n    if (typeof this.talk === 'function') {\n      return this.talk()\n    }\n\n    // handle dynamic talkto\n    const topics = this.getTopics()\n    player().conversingWithNpc = this\n    if (topics.length === 0) return failedmsg(this.no_topics ? this.no_topics : lang.no_topics, {char:player(), item:this});\n\n    if (this.greeting) {\n      printOrRun(this, this, \"greeting\");\n    }\n    topics.push(lang.never_mind)\n\n    const fn = io.menuFunctions[settings.funcForDynamicConv]\n    fn(lang.speak_to_menu_title(this), topics, function(result) {\n      if (result !== lang.never_mind) {\n        result.runscript();\n      }\n    })\n\n    return world.SUCCESS_NO_TURNSCRIPTS;\n  },\n\n  askTopics:function(...topics) {\n    const title = topics.shift()\n    const fn = io.menuFunctions[settings.funcForDynamicConv]\n    fn(title, topics, function(result) {\n      result.runscript();\n    })\n  },\n\n  getTopics:function() {\n    const list = [];\n    for (let key in w) {\n      if (w[key].isTopicVisible && w[key].isTopicVisible(this)) {\n        list.push(w[key]);\n      }\n    }\n    return list;\n  },\n\n}\n\nexport const AGENDA_FOLLOWER = function() {\n  const res = {}\n  res.agenda = []\n  res.suspended = false\n  res.followers = []\n  res.inSight = function() { return false }\n  res.endTurn = function(turn) {\n    if (!this.paused && !this.suspended && this.agenda.length > 0) this.doAgenda()\n    this.doEvent(turn)\n  }\n\n  res.setAgenda = function(agenda) {\n    this.agenda = agenda\n    this.suspended = false\n    this.agendaWaitCounter = false\n    this.patrolCounter = false\n  }\n\n  res.doAgenda = function() {\n    // If this NPC has followers, we fake it so it seems to be the group\n    if (this.followers.length !== 0) {\n      this.savedPronouns = this.pronouns;\n      this.savedAlias = this.alias\n      this.pronouns = lang.pronouns.plural;\n      this.followers.unshift(this.name);\n      this.alias = formatList(this.getFollowers(), {lastSep:lang.list_and});\n      this.followers.shift();\n    }\n\n    if (!Array.isArray(this.agenda)) throw \"Agenda is not a list for \" + this.name\n    if (typeof this.agenda[0] !== 'string') throw \"Next agenda item is not a string for \" + this.name\n    const arr = this.agenda[0].split(\":\");\n    const functionName = arr.shift();\n    if (typeof agenda[functionName] !== \"function\") {\n      errormsg(\"Unknown function `\" + functionName + \"' in agenda for \" + this.name);\n      return;\n    }\n    const flag = agenda[functionName](this, arr)\n    if (flag) this.agenda.shift()\n    if (flag === 'next') this.doAgenda()\n\n    // If we are faking the group, reset\n    if (this.savedPronouns) {\n      this.pronouns = this.savedPronouns\n      this.alias = this.savedAlias\n      this.savedPronouns = false\n    }\n  }\n\n  res.pause = function() {\n    //debugmsg(\"pausing \" + this.name);\n    if (this.leaderName) {\n      w[this.leaderName].pause();\n    }\n    else {\n      this.paused = true;\n    }\n  }\n\n  return res\n}\n\nexport const agenda = {\n  debug:function(s, npc, arr) {\n    if (settings.agendaDebugging && settings.playMode === 'dev') debugmsg('AGENDA for ' + npc.name + ': ' + s + '; ' + formatList(arr, {doNotSort:true}))\n  },\n  debugS:function(s) {\n    if (settings.agendaDebugging && settings.playMode === 'dev') debugmsg('AGENDA comment: ' + s)\n  },\n\n\n  // wait one turn\n  pause:function(npc, arr) {\n    return true;\n  },\n\n  // print the array as text if the player is here\n  // otherwise this will be skipped\n  // Used by several other functions, so this applies to them too\n  text:function(npc, arr) {\n    if (typeof npc[arr[0]] === \"function\") {\n      this.debug(\"text (function)\", npc, arr);\n      const fn = arr.shift();\n      const res = npc[fn](arr);\n      return (typeof res === \"boolean\" ? res : true);\n    }\n    this.debug(\"text (string)\", npc, arr);\n\n    if (npc.inSight()) msg(arr.join(':'))\n    return true;\n  },\n\n  msg:function(npc, arr) {\n    this.debug(\"msg (string)\", npc, arr)\n    msg(arr.join(':'))\n    return true\n  },\n\n  // Alias for text\n  run:function(npc, arr) { return this.text(npc, arr) },\n\n  // sets one attribute on the given item\n  // it will guess if Boolean, integer or string\n  setItemAtt:function(npc, arr) {\n    return this._setItemAtt(npc, arr, false)\n  },\n\n  // sets one attribute on the given item\n  // it will guess if Boolean, integer or string\n  setItemAttThen:function(npc, arr) {\n    return this._setItemAtt(npc, arr, true)\n  },\n\n\n  // sets one attribute on the given item\n  // it will guess if Boolean, integer or string\n  _setItemAtt:function(npc, arr, next) {\n    this.debug(\"setItemAtt\", npc, arr)\n    const item = arr.shift()\n    const att = arr.shift()\n    let value = arr.shift()\n    if (!w[item]) errormsg(\"Item '\" + item + \"' not recognised in the agenda of \" + npc.name)\n    if (value === \"true\") value = true\n    if (value === \"false\") value = false\n    if (/^\\d+$/.test(value)) value = parseInt(value)\n    w[item][att] = value\n    this.text(npc, arr)\n    return next ? 'next' : true\n  },\n\n  // delete one attribute on the given item\n  deleteItemAtt:function(npc, arr) {\n    this.debug(\"deleteItemAtt\", npc, arr)\n    const item = arr.shift()\n    const att = arr.shift()\n    if (!w[item]) errormsg(\"Item '\" + item + \"' not recognised in the agenda of \" + npc.name)\n    delete w[item][att]\n    this.text(npc, arr)\n    return true\n  },\n\n  // Wait n turns\n  wait:function(npc, arr) {\n    this.debug(\"wait\", npc, arr);\n    if (arr.length === 0) return true;\n    if (isNaN(arr[0])) errormsg(\"Expected wait to be given a number in the agenda of '\" + npc.name + \"'\");\n    const count = parseInt(arr.shift());\n    if (npc.agendaWaitCounter !== undefined) {\n      npc.agendaWaitCounter++;\n      if (npc.agendaWaitCounter >= count) {\n        this.debugS(\"Pass\")\n        this.text(npc, arr);\n        return true;\n      }\n      return false;\n    }\n    npc.agendaWaitCounter = 0;\n    return false;\n  },\n\n  // Wait until ...\n  // This may be repeated any number of times\n  waitFor:function(npc, arr) { return this.handleWaitFor(npc, arr, false) },\n  waitForNow:function(npc, arr) { return this.handleWaitFor(npc, arr, true) },\n\n  handleWaitFor:function(npc, arr, immediate) {\n    this.debug(\"waitFor\", npc, arr);\n    let name = arr.shift();\n    if (typeof npc[name] === \"function\") {\n      if (npc[name](arr)) {\n        this.text(npc, arr)\n        this.debugS(\"Pass\")\n        return (immediate ? 'next' : true)\n      }\n      else {\n        return false\n      }\n    }\n    else {\n      if (name === \"player\") name = player().name;\n      if (npc.loc === w[name].loc) {\n        this.text(npc, arr)\n        this.debugS(\"Pass\")\n        return (immediate ? 'next' : true)\n      }\n      else {\n        return false\n      }\n    }\n  },\n\n  waitUntil:function(npc, arr) { return agenda.handleWaitUntilWhile(npc, arr, true) },\n  waitUntilNow:function(npc, arr) { return agenda.handleWaitUntilWhile(npc, arr, true, true) },\n\n  waitWhile:function(npc, arr) { return agenda.handleWaitUntilWhile(npc, arr, false) },\n  waitWhileNow:function(npc, arr) { return agenda.handleWaitUntilWhile(npc, arr, false, true) },\n\n  handleWaitUntilWhile:function(npc, arr, reverse, immediate) {\n    const item = arr[0] === 'player' ? player() : w[arr[0]]\n    arr.shift()\n    const attName = arr.shift()\n    const value = util.guessMyType(arr.shift())\n    let flag = item[attName] === value\n    if (reverse) flag = !flag\n    if (flag) return false\n    msg(arr.join(':'))\n    return immediate ? 'next' : true\n  },\n\n  joinedBy:function(npc, arr) {\n    this.debug(\"joinedBy\", npc, arr);\n    const followerName = arr.shift();\n    w[followerName].setLeader(npc);\n    this.text(npc, arr);\n    return true;\n  },\n\n  joining:function(npc, arr) {\n    this.debug(\"joining\", npc, arr);\n    const leaderName = arr.shift();\n    npc.setLeader(w[leaderName]);\n    this.text(npc, arr);\n    return true;\n  },\n\n  disband:function(npc, arr) {\n    this.debug(\"disband\", npc, arr)\n    for (let s of npc.followers) {\n      const follower = w[s]\n      follower.leader = false\n    }\n    npc.followers = []\n    this.text(npc, arr)\n    return true\n  },\n\n  // Move the given item directly to the given location, then print the rest of the array as text\n  // Do not use for items with a funny location, such as COUNTABLES\n  moveItem:function(npc, arr) {\n    this.debug(\"moveItem\", npc, arr)\n    const item = arr.shift()\n    let dest = arr.shift()\n    if (dest === \"player\") {\n      dest = player().name\n    }\n    else if (dest === \"_\") {\n      dest = false\n    }\n    else {\n      if (!w[dest]) return errormsg(\"Location '\" + dest + \"' not recognized in the agenda of \" + npc.name)\n    }\n    w[item].moveToFrom({char:npc, toLoc:dest, item:item})\n    this.text(npc, arr)\n    return true\n  },\n\n  // Move directly to the given location, then print the rest of the array as text\n  // Use \"player\" to go directly to the room the player is in.\n  // Use an item (i.e., an object not flagged as a room) to have the NPC move\n  // to the room containing the item.\n  // None of the usual reactions will be performed, so items carried with not react to\n  // moving, any followers will be left behind, etc.\n  jumpTo:function(npc, arr) {\n    let dest = arr.shift()\n    if (dest === \"player\") {\n      dest = player().loc\n    }\n    else if (dest === \"_\") {\n      dest = undefined\n      this.text(npc, arr)\n    }\n    else {\n      if (!w[dest]) return errormsg(\"Location '\" + dest + \"' not recognised in the agenda of \" + npc.name)\n      if (!w[dest].room) dest = dest.loc  // go to the room the item is in\n      if (!w[dest]) return errormsg(\"Location '\" + dest + \"' not recognized in the agenda of \" + npc.name)\n    }\n    npc.loc = dest\n    this.text(npc, arr)\n    return true\n  },\n\n  // Move to the given location, then print the rest of the array as text.\n  // There must be an exit from the current room to that room.\n  moveTo:function(npc, arr) {\n    let dest = arr.shift()\n    if (!w[dest]) return errormsg(\"Location '\" + dest + \"' not recognised in the agenda of \" + npc.name)\n    if (!w[dest].room) dest = dest.loc  // go to the room the item is in\n    const exit = w[npc.loc].findExit(dest)\n    if (!exit)return errormsg(\"Could not find an exit to location '\" + dest + \"' in the agenda of \" + npc.name)\n    //log(\"Move \" + npc.name + \" to \" + dest)\n    npc.movingMsg(exit)\n    npc.moveChar(exit)\n    this.text(npc, arr)\n    return true\n  },\n\n  patrol:function(npc, arr) {\n    this.debug(\"patrol\", npc, arr);\n    if (npc.patrolCounter === undefined) npc.patrolCounter = -1;\n    npc.patrolCounter = (npc.patrolCounter + 1) % arr.length;\n    this.moveTo(npc, [arr[npc.patrolCounter]]);\n    return false;\n  },\n\n  // Move to another room via a random, unlocked exit, then print the rest of the array as text\n  walkRandom:function(npc, arr) {\n    this.debug(\"walkRandom\", npc, arr);\n    const exit = w[npc.loc].getRandomExit({excludeLocked:true, excludeScenery:true});\n    if (exit === null) {\n      this.text(npc, arr);\n      return true;\n    }\n    if (!w[exit.name]) errormsg(\"Location '\" + exit.name + \"' not recognised in the agenda of \" + npc.name)\n    npc.movingMsg(exit)\n    npc.moveChar(exit)\n    return false;\n  },\n\n  // Move to the given location, using available, unlocked exits, one room per turn\n  // then print the rest of the array as text\n  // Use \"player\" to go to the room the player is in (if the player moves, the NPC will head\n  // to the new position, but will be omniscient!).\n  // Use an item (i.e., an object not flagged as a room) to have the NPC move\n  // to the room containing the item.\n  // This may be repeated any number of turns\n  leadTo:function(npc, arr) {\n    this.debug(\"leadTo\", npc, arr)\n    if (npc.loc !== player().loc) return false\n    return this.walkTo(npc, arr)\n  },\n  walkTo:function(npc, arr) {\n    this.debug(\"walkTo\", npc, arr)\n    let dest = arr.shift();\n    if (dest === \"player\") dest = player().loc;\n    if (w[dest] === undefined) {\n      errormsg(\"Location '\" + dest + \"' not recognised in the agenda of \" + npc.name);\n      return true;\n    }\n    if (!w[dest].room) {\n      dest = w[dest].loc;\n      if (w[dest] === undefined) {\n        errormsg(\"Object location '\" + dest + \"' not recognised in the agenda of \" + npc.name);\n        return true;\n      }\n    }\n    if (npc.isAtLoc(dest)) {\n      this.text(npc, arr);\n      return true;\n    }\n    else {\n      const route = agenda.findPath(w[npc.loc], w[dest]);\n      if (!route) errormsg(\"Location '\" + dest + \"' not reachable in the agenda of \" + npc.name)\n      const exit = w[npc.loc].findExit(route[0])\n      npc.movingMsg(exit)\n      npc.moveChar(exit)\n      if (npc.isAtLoc(dest)) {\n        this.text(npc, arr);\n        return true;\n      }\n      else {\n        return false;\n      }\n    }\n  },\n\n  // Initiate a conversation, with this topic\n  showTopic:function(npc, arr) {\n    let alias = arr.shift()\n    npc.showTopic(alias)\n    this.text(npc, arr)\n    return true\n  },\n\n\n}\n\n// start and end are the objects, not their names!\nagenda.findPath = function(start, end, maxlength) {\n  if (start === end) return [];\n\n  if (!game.pathID) game.pathID = 0;\n  if (maxlength === undefined) maxlength = 999;\n  game.pathID++;\n  let currentList = [start];\n  let length = 0;\n  let nextList, dest, exits;\n  start.pathfinderNote = { id:game.pathID };\n\n  // At each iteration we look at the rooms linked from the previous one\n  // Any new rooms go into nextList\n  // Each room gets flagged with \"pathfinderNote\"\n  while (currentList.length > 0 && length < maxlength) {\n    nextList = [];\n    length++;\n    for (let room of currentList) {\n      exits = room.getExits({npc:true});\n      for (let exit of exits) {\n        if (exit.name === '_') continue\n        dest = w[exit.name];\n        if (dest === undefined) {\n          errormsg(\"Dest is undefined: \" + exit.name + ' (room ' + room.name + '). Giving up.');\n          console.log(this)\n          return false\n        }\n        if (dest.pathfinderNote && dest.pathfinderNote.id === game.pathID) continue;\n        dest.pathfinderNote = { jumpFrom:room, id:game.pathID };\n        if (dest === end) return agenda.extractPath(start, end);\n        nextList.push(dest);\n      }\n    }\n    currentList = nextList;\n  }\n  return false\n  /*console.error(\"Path-finding failed: \" + (currentList.length === 0 ? 'list is empty' : 'exceeded maximum length'))\n  log(\"start: \" + start.name)\n  log(\"end: \" + end.name)\n  log(\"maxlength: \" + maxlength)\n  console.trace()\n  throw(\"Path-finding failed, see comments above.\")*/\n}\n\nagenda.extractPath = function(start, end) {\n  let res = [end];\n  let current = end;\n  let count = 0;\n\n  do {\n    current = current.pathfinderNote.jumpFrom;\n    res.push(current);\n    count++;\n  } while (current !== start && count < 99);\n  res.pop();  // The last is the start location, which we do not ned\n  return res.reverse();\n}\n\nexport const CONSULTABLE = function() {\n  const res = {}\n  res.consultable = true\n\n  res.askabout = function(text1, text2) {\n    return this.asktellabout(text1, text2, lang.ask_about_intro, this.askOptions, \"ask\")\n  }\n  res.tellabout = function(text1, text2) {\n    return this.asktellabout(text1, text2, lang.tell_about_intro, this.tellOptions, \"tell\")\n  }\n\n  res.talkabout = function(text1, text2) {\n    let data = this.talkOptions\n    if (!this.talkOptions) data = this.tellOptions ? this.tellOptions.concat(this.askOptions) : this.askOptions\n    return this.asktellabout(text1, text2, lang.talk_about_intro, data, \"talk\");\n  }\n\n\n  res.asktellabout = function(text1, text2, intro, list, action) {\n    if (settings.noAskTell !== false) {\n      metamsg(settings.noAskTell);\n      return false;\n    }\n\n    if (!player().testTalk(this)) return false\n    if (this.testTalk && !this.testTalk(text1, action)) return false\n\n    if (!list || list.length === 0) {\n      metamsg(settings.noAskTell);\n      return errormsg(\"No \" + action + \"Options set for \" + this.name + \" and I think there should at least be default saying why.\")\n    }\n    if (settings.givePlayerAskTellMsg) msg(intro(this, text1, text2), {char:player()});\n\n    const params = {\n      text:text1,\n      text2:text2,\n      char:this,\n      action:action,\n      extraTest:function(params, response) {\n        if (!response.regex) return true\n        return response.regex.test(params.text)\n      },\n      afterScript:this.askTellDone\n    }\n    return respond(params, list)\n  }\n  res.askTellDone = function(params, response) {\n    if (!response) {\n      msg(lang.npc_no_interest_in, params)\n      return\n    }\n    if (response.mentions) {\n      for (let s of response.mentions) {\n        if (!player().mentionedTopics.includes(s)) player().mentionedTopics.push(s)\n      }\n    }\n    if (params.char.pause) params.char.pause()\n  }\n\n  return res;\n};\n\nexport class Question {\n  constructor(name, responses) {\n    this.name = name\n    this.responses = responses\n    this.countdown = settings.turnsQuestionsLast\n  }\n\n  sayResponse(char, s) {\n    const params = {\n      text:s,\n      char:char,\n      question:this,\n      extraTest:function(params, response) {\n        if (!response.regex) return true\n        return response.regex.test(params.text)\n      },\n      afterScript:function(params, response) {\n        if (this.oldQuestion) {\n          delete this.oldQuestion\n        }\n        else {\n        //if (!response || response.disableReset) return\n          params.char.sayBonus = 0\n          params.char.sayQuestion = false\n          delete params.char.questionExpiredFunction\n        }\n        if (params.question.afterScript) {\n          params.question.afterScript(params, response)\n        }\n      },\n      noResponseNotError:true,\n    }\n    return respond(params, this.responses)\n  }\n}\n\nutil.questionList = {}\nutil.createQuestion = function(name, responses, options = {}) {\n  const q = new Question(name, responses)\n  for (const key in options) q[key] = options[key]\n  util.questionList[name] = q\n  return q\n}\n\nexport const TOPIC = function(fromStart) {\n    return {\n      conversationTopic: true,\n      showTopic: fromStart,\n      hideTopic: false,\n      hideAfter: true,\n      properNoun: true, // we do not want \"the\" prepended\n      nowShow: [],\n      nowHide: [],\n      count: 0,\n      isVisible: () => true,\n      isAtLoc: () => false,\n      belongsTo: function (loc) {\n          return this.loc === loc\n      },\n      eventPeriod: 1,\n      eventIsActive: function () {\n          return this.showTopic && !this.hideTopic && this.countdown;\n      },\n      eventScript: function () {\n          this.countdown--\n          if (this.countdown < 0) this.hide()\n      },\n      runscript: function () {\n          let obj = player().conversingWithNpc\n          if (obj === undefined) return errormsg(\"No conversing NPC called \" + player().conversingWithNpc + \" found.\")\n          obj.pause()\n          this.hideTopic = this.hideAfter\n          if (!this.script && !this.msg) return errormsg(\"Topic \" + this.name + \" has neither script nor msg attributes.\")\n          if (this.script) {\n              if (typeof this.script !== \"function\") return errormsg(\"script for topic \" + this.name + \" is not a function.\")\n              this.script.bind(obj)({char: obj, player: player(), topic: this})\n          }\n          if (this.msg) {\n              if (typeof this.msg !== \"string\") return errormsg(\"msg for topic \" + this.name + \" is not a string.\")\n              msg(this.msg, {char: obj, topic: this})\n          }\n          this.showHideList(this.nowShow, true)\n          this.showHideList(this.nowHide, false)\n          this.count++\n          world.endTurn(world.SUCCESS)\n      },\n      isTopicVisible: function (char) {\n          return this.showTopic && !this.hideTopic && this.belongsTo(char.name) && this.isVisible(char)\n      },\n      showHideList: function (list, isShow) {\n          if (typeof list === \"string\") {\n              log(\"WARNING: \" + (isShow ? \"nowShow\" : \"nowHide\") + \" for topic \" + this.name + \" is a string.\")\n              return\n          }\n          for (let s of list) {\n              const t = util.findTopic(s)\n              if (t) {\n                  t[isShow ? 'showTopic' : 'hideTopic'] = true\n              } else {\n                  log(\"WARNING: Topic \" + this.name + \" wants to now show/hide a non-existent topic, \" + s)\n              }\n          }\n      },\n      show: function () {\n          return this.showTopic = true\n      },\n      hide: function () {\n          return this.hideTopic = true\n      },\n  };\n};\n","\"use strict\";\n\n//@DOC\n// ## Parser Functions\n//\n// Most of these are only for internal use! See here details of how it all works.\n// https://github.com/ThePix/QuestJS/wiki/The-Parser#technical-notes\n//\n//@UNDOC\n\nimport {\n    array,\n    io,\n    lang,\n    world,\n    w,\n    debugmsg,\n    parsermsg,\n    printError,\n    processText,\n    player,\n    loc,\n    settings, commands\n} from \"../index.js\";\n\nexport const parser = {};\n\nparser.currentCommand = null;\n// Stores the current values for it, him, etc.\nparser.pronouns = {}\nparser.specialText = {}\nparser.debug = false\nparser.BAD_SPECIAL = -14\nparser.DISALLOWED_MULTIPLE = -16\nparser.NO_OBJECT = -13\nparser.NONE_FOR_ALL = -12\nparser.NO_MATCH = -100\n\n//@DOC\n// The \"parse\" function should be sent either the text the player typed or null.\n// If sent null it will continue to work with the current values in currentCommand.\n// This allows us to keep trying to process a single command until all the\n//  disambiguations have been resolved.\nparser.parse = function(inputText) {\n  io.startCommand()\n  settings.performanceLogStart()\n  settings.performanceLog('Start command')\n\n  // This allows the command system to be temporarily overriden,\n  // say if the game asks a question\n  if (parser.override) {\n    parser.msg(\"Parser overriden\");\n    parser.override(inputText)\n    delete parser.override\n    return\n  }\n\n  if (settings.parserPreprocessor) inputText = settings.parserPreprocessor(inputText)\n\n  // Split into commands on full stop unless this is a user comment.\n  parser.inputTexts = parser.keepTogether(inputText) ? [inputText] : inputText.split(lang.command_split_regex)\n  while (parser.inputTexts.length > 0) {\n    const s = parser.inputTexts.shift()\n    settings.performanceLog('Start \"' + s + '\"')\n    parser.parseSingle(s)\n    settings.performanceLog('Done')\n  }\n}\n\nparser.abort = function() {\n  if (parser.inputTexts.length === 0) return\n  parsermsg(lang.abort_cmds + \": \" + parser.inputTexts.join('; '))\n  parser.inputTexts = []\n}\n\nparser.parseSingle = function(inputText) {\n  parser.msg(\"Input string: \" + inputText);\n\n  if (inputText) {\n    const res = parser.findCommand(inputText)\n    if (typeof res === \"string\") {\n      parsermsg(res)\n      parser.abort()\n      world.endTurn(world.PARSER_FAILURE)\n      return\n    }\n    if (res.tmp.score < 0) {\n      parsermsg(res.tmp.error)\n      parser.abort()\n      world.endTurn(world.PARSER_FAILURE)\n      return\n    }\n    parser.currentCommand = res;\n  }\n  settings.performanceLog('Command found')\n\n  // Need to disambiguate, until each of the lowest level lists has exactly one member\n  let needToDisAmbigFlag = false\n  for (let i = 0; i < parser.currentCommand.tmp.objects.length; i++) {\n    if (!Array.isArray(parser.currentCommand.tmp.objects[i])) continue\n    for (let j = 0; j < parser.currentCommand.tmp.objects[i].length; j++) {\n      if (parser.currentCommand.tmp.objects[i][j] instanceof Array) {\n        if (parser.currentCommand.tmp.objects[i][j].length === 1) {\n          parser.currentCommand.tmp.objects[i][j] = parser.currentCommand.tmp.objects[i][j][0];\n        }\n        else {\n          needToDisAmbigFlag = true;\n          parser.currentCommand.tmp.disambiguate1 = i;\n          parser.currentCommand.tmp.disambiguate2 = j;\n          const fn = io.menuFunctions[settings.funcForDisambigMenu]\n          fn(lang.disambig_msg, parser.currentCommand.tmp.objects[i][j], function(result) {\n            parser.currentCommand.tmp.objects[parser.currentCommand.tmp.disambiguate1][parser.currentCommand.tmp.disambiguate2] = result\n            parser.parseSingle(null)\n          }, function(input) {\n            parser.parse(input)\n          });\n        }\n      }\n    }\n  }\n\n  if (!needToDisAmbigFlag) {\n    settings.performanceLog('About to execute')\n    parser.execute();\n  }\n};\n\n//@DOC\n// You can use this to bypass the parser altogether, for the next input the player types.\n// Instead, the given function will be used, sent the text the player typed.\n//\n// Used by askQuestion in io.\nparser.overrideWith = function(fn) {\n  parser.override = fn\n}\n\n// Do it!\nparser.execute = function() {\n  parser.inspect();\n  let inEndTurnFlag = false\n  try {\n    // save objects for pronouns\n    if (parser.currentCommand.tmp.objects.length > 0 && Array.isArray(parser.currentCommand.tmp.objects[0]) && !parser.currentCommand.all) {\n      for (let obj of parser.currentCommand.tmp.objects[0]) {\n        parser.pronouns[obj.parserPronouns ? obj.parserPronouns.objective : obj.pronouns.objective] = obj\n      }\n    }\n    settings.performanceLog('About to run command script')\n    const outcome = parser.currentCommand.script(parser.currentCommand.tmp.objects)\n    if (outcome === undefined && settings.playMode === 'dev') log(\"WARNING: \" + parser.currentCommand.name + \" command did not return a result to indicate success or failure.\")\n    inEndTurnFlag = true\n    settings.performanceLog('About to run world.endTurn')\n    world.endTurn(outcome)\n  } catch (err) {\n    if (inEndTurnFlag) {\n      printError(\"Hit a coding error trying to process world.endTurn after that command.\", err)\n    }\n    else {\n      printError(\"Hit a coding error trying to process the command `\" + parser.currentCommand.cmdString + \"'.\", err)\n    }\n  }\n  settings.performanceLog('All done')\n};\n\n// This will return a dictionary, with these keys:\n// .inputString    the initial string\n// .cmdString      the sanitised string\n// .cmd            the matched command object\n// .objects        a list (of a list of a list), one member per capture group in the command regex\n// .objects[0]     a list (of a list), one member per object name given by the player for capture group 0\n// .objects[0][0]  a list of possible object matches for each object name given by the player for the\n//                      first object name in capture group 0\nparser.findCommand = function(inputText) {\n\n  // remove multiple spaces, and any from the ends\n  let cmdString = inputText.toLowerCase().trim().replace(/\\s+/g, ' ');\n\n  // convert numbers in words to digits\n  if (settings.convertNumbersInParser) {\n    cmdString = lang.convertNumbers(cmdString);\n  }\n\n  settings.performanceLog('Numbers converted')\n\n\n  // We now want to match potential objects\n  // This will help us narrow down the candidates (maybe)\n  // matchedCandidates is an array of dictionaries,\n  // each one containing a command and some matched objects if applicable\n  //let error = lang.general_obj_error;\n  let bestMatch\n\n  for (const el of commands) {\n    // matchItemsToCmd will attempt to fit the objects, returns a dictionary if successful\n    // or an error message otherwise. Could have more than one object,\n    // either because multiple were specified or because it was ambiguous (or both)\n    // We just keep the last error message as hopefully the most relevant.\n    // NB: Inside function so cannot use 'this'\n    el.matchItems(cmdString, inputText)\n\n    if (el.tmp.score > parser.NO_MATCH) {\n      if (!bestMatch || el.tmp.score > bestMatch.tmp.score) {\n        parser.msg(\"Candidate accepted!\");\n        bestMatch = el\n      }\n    }\n  }\n  settings.performanceLog('Best match found')\n\n  if (!bestMatch) {\n    io.reset()  // just in case something has gone wrong, call this to reset the interface\n    if (settings.playMode === 'dev') log(\"Command was [\" + inputText + \"]\")\n    return lang.not_known_msg;\n  }\n\n  bestMatch.tmp.string = inputText;\n  bestMatch.tmp.cmdString = cmdString;\n  parser.msg(\"This is the one:\" + bestMatch.name);\n  return bestMatch;\n};\n\nparser.matchToNames = function(s, scopes, cmdParams, res) {\n  // Within this item position, break the substring into each item section\n  // For PUT HAT, CUP IN BOX, the first will be ['hat', 'cup']\n  const objectNames = s.split(lang.joiner_regex).map(function(el){ return el.trim() }).filter(e =>  e)\n\n  let objectWordList = [], score = 0\n  for (let s of objectNames) {\n    const n = parser.matchToName(lang.article_filter_regex.exec(s)[1], scopes, cmdParams, objectWordList)\n    if (n < 0) {\n      res.score = n\n      res.error_s = s\n      return\n    }\n    if (n > score) score = n\n  }\n\n  if (objectWordList.length > 1 && !cmdParams.multiple) {\n    res.error = lang.no_multiples_msg;\n    res.score = parser.DISALLOWED_MULTIPLE;\n    return\n  }\n\n  res.objects.push(objectWordList)\n  res.score += score;\n}\n\n// Want to match items from scopes to this string fragment s\n// matches will go in objectWordList and matches, the score is returned\n// objectWordList is a list of lists of objects and corresponds to an item name typed by the user\nparser.matchToName = function(s, scopes, cmdParams, objectWordList) {\n  // objDisambigList is a list of objects that are in the given scope(s) and match the string fragment\n  let [objDisambigList, n] = this.findInScope(s, scopes, cmdParams)\n  if (n === 0) return parser.NO_OBJECT\n\n  // So create a new list that will contain objects in objDisambigList not already in objectWordList\n  // This can happen for an object like \"Ham and cheese sandwich\", which will be split up\n  // as \"ham\" and \"cheese sandwich\"\n  const objDisambigList2 = []\n  // Go though objDisambigList\n  for (const el of objDisambigList) {\n    let flag = false\n    for (const el1 of objectWordList) {\n      for (const el2 of el1) {\n        if (el2.name === el.name) flag = true\n      }\n    }\n    if (flag) {\n      parser.msg(\"..Skipping duplicate: \" + el.name)\n    }\n    else {\n      objDisambigList2.push(el)\n    }\n  }\n  if (objDisambigList2.length > 0) objectWordList.push(objDisambigList2)\n  return n\n\n}\n\n// Tries to match objects to the given string\n// It will return a list of matching objects (to be disambiguated if more than 1),\n// plus the score, depending on which list the object(s) was found in\n// (if there are three lists, the score will be 3 if found in the first list, 2 in the second,\n// or 1 if in the third list).\n// If not found the score will be 0, and an empty array returned.\nparser.findInScope = function(s, scopes, cmdParams) {\n  parser.msg(\"Now matching: \" + s)\n  // First handle IT etc.\n  for (const key in lang.pronouns) {\n    if (s === lang.pronouns[key].objective && parser.pronouns[lang.pronouns[key].objective]) {\n      return [[parser.pronouns[lang.pronouns[key].objective]], 1];\n    }\n  }\n\n  for (let i = 0; i < scopes.length; i++) {\n    parser.msg(\"..Looking for a match for: \" + s + \" (scope \" + (i + 1) + \")\")\n    const objList = this.findInList(s, scopes[i], cmdParams);\n    if (objList.length > 0) {\n      return [objList, scopes.length - i];\n    }\n  }\n  return [[], 0];\n};\n\n// Tries to match an object to the given string\n// But if there are more than 1 with the same score, it returns them all\n// s is the string to match\n// list is an array of items to match again\nparser.findInList = function(s, list, cmdParams) {\n  let res = [];\n  let score = 0;\n  let n;\n  parser.msg(\"-> Trying to match: \" + s)\n  for (let item of list) {\n    //log(item)\n    parser.msg(\"-> Considering: \" + item.name)\n    n = this.scoreObjectMatch(s, item, cmdParams);\n    if (n >=0 ) parser.msg(item.name + \" scores \" + n)\n    if (n > score) {\n      res = [];\n      score = n;\n    }\n    if (n >= score) {\n      res.push(item);\n    }\n  }\n  parser.msg(res.length > 1 ? \"Cannot decide between: \" + res.map(el => el.name).join(\", \") : (res.length === 1 ? \"..Going with: \" + res[0].name : \"Found no suitable objects\"))\n  return res\n}\n\n// Override to skip quotes in aliases\nparser.itemSetup = function(item) {\n  item.parserOptionsSet = true;\n  item.parserItemName = item.alias.toLowerCase();\n  item.parserItemNameParts = array.combos(item.parserItemName.split(' '))\n  if (item.pattern) {\n    if (!item.regex) item.regex = new RegExp(\"^(\" + item.pattern + \")$\")\n    if (!item.synonyms) item.synonyms = item.pattern.split('|');\n  }\n  if (item.synonyms) {\n    if (!Array.isArray(item.synonyms)) throw 'Expected \"synonyms\" to be an array for ' + item.name\n    item.synonyms.forEach(function (el) {\n      if (el.includes(' ')) {\n        item.parserItemNameParts = item.parserItemNameParts.concat(el.split(' '))\n      }\n    })\n  }\n}\n\nparser.scoreObjectMatch = function(s, item, cmdParams) {\n  if (!item.parserOptionsSet) parser.itemSetup(item)\n  const itemName = item.alias.toLowerCase();\n  let res = -1;\n  if (cmdParams.items && cmdParams.items.includes(item.name)) {\n    // does this pay any attention to what the player typed????\n    parser.msg('The command specifically mentions this item, so highest priority, score 100')\n    res = 100;\n  }\n  else if (s === item.parserItemName) {\n    parser.msg('The player has used the exact alias, score 60')\n    res = 60;\n  }\n  else if (item.regex && item.regex.test(s)) {\n    parser.msg('The player has used the exact string allowed in the regex, score 55')\n    parser.msg('' + item.regex)\n    parser.msg('>' + s + '<')\n    res = 55;\n  }\n  else if (item.parserItemNameParts && item.parserItemNameParts.some(function(el) { return el === s})) {\n    parser.msg('The player has matched a complete word, but not the full phrase, score 50')\n    res = 50;\n  }\n  else if (item.parserItemName.startsWith(s)) {\n    parser.msg('the player has used a string that matches the start of the alias, score length + 15')\n    res = s.length + 15;\n  }\n  else if (item.synonyms && item.synonyms.some(function(el) { return el.startsWith(s)})) {\n    parser.msg('the player has used a string that matches the start of an alt name, score length + 10')\n    res = s.length + 10;\n  }\n  else if (item.parserItemNameParts && item.parserItemNameParts.some(function(el) { return el.startsWith(s)})) {\n    parser.msg('the player has used a string that matches the start of an alt name, score length')\n    res = s.length;\n  }\n  else {\n    return -1;\n  }\n\n  if (item[cmdParams.attName]) {\n    parser.msg('bonus 20 as item has attribute ' + cmdParams.attName)\n    res += 20;\n  }\n  if (item.parserPriority) {\n    parser.msg('item.parserPriority is ' + item.parserPriority)\n    res += item.parserPriority;\n  }\n\n\n  // note what we matched against in case a command wants to use it later\n  // This is a little risky as at this point it is only a suggestion,\n  // but I cannot think of a situation where it would fail.\n  // Used by COUNTABLE\n  item.cmdMatch = s;\n  return res;\n};\n\n// For debugging only\n// Prints details about the parser.currentCommand so you can\n// see what the parser has made of the player's input\nparser.inspect = function() {\n  if (!parser.debug) return;\n\n  let s = \"PARSER RESULT:<br/>\";\n  s += \"Input text: \" + parser.currentCommand.string + \"<br/>\";\n  s += \"Matched command: \" + parser.currentCommand.name + \"<br/>\";\n  s += \"Matched regex: \" + parser.currentCommand.tmp.regex + \"<br/>\";\n  s += \"Match score: \" + parser.currentCommand.tmp.score + \"<br/>\";\n  if (parser.currentCommand.all) { s += \"Player typed ALL<br/>\"; }\n  s += \"Objects/texts (\" + parser.currentCommand.tmp.objects.length + \"):\" + \"<br/>\";\n  for (let obj of parser.currentCommand.tmp.objects) {\n    if (typeof obj === \"string\") {\n      s += \"&nbsp;&nbsp;&nbsp;&nbsp;Text: \" + obj + \"<br/>\";\n    }\n    else if (Array.isArray(obj)) {\n      s += \"&nbsp;&nbsp;&nbsp;&nbsp;Objects:\" + obj.map(function(el) { return el.name; }).join(\", \") + \"<br/>\";\n    }\n    else if (obj.name) {\n      s += \"&nbsp;&nbsp;&nbsp;&nbsp;Something called :\" + obj + \"<br/>\";\n    }\n    else {\n      s += \"&nbsp;&nbsp;&nbsp;&nbsp;Something else:\" + obj + \"<br/>\";\n    }\n  }\n  debugmsg(s);\n};\n\nparser.specialText.ignore = {\n  error:function(text) {\n    return false\n  },\n  exec:function(text) {\n    return false\n  },\n}\n\nparser.specialText.text = {\n  error:function(text) {\n    return false\n  },\n  exec:function(text) {\n    return text\n  },\n}\n\nparser.specialText.fluid = {\n  error:function(text) {\n    if (settings.fluids.includes(text)) return false\n    return processText(lang.not_a_fluid_here, {text:text})\n  },\n  exec:function(text) {\n    return text\n  },\n}\n\nparser.specialText.number = {\n  error:function(text) {\n    if (text.match(/^\\d+$/)) return false\n    return !lang.numberUnits.includes(text);\n\n  },\n  exec:function(text) {\n    if (text.match(/^\\d+$/)) return parseInt(text)\n    return lang.numberUnits.indexOf(text)\n  },\n}\n\nparser.msg = function(...ary) {\n  if (parser.debug) {\n    for (let s of ary) debugmsg(\"P&gt; \" + s)\n  }\n}\n\n// One scope for ALL (use allScope if available)\nparser.getScope = function(cmdParams) {\n  if (!cmdParams.scope) {\n    console.log(\"WARNING: No scope (or scope not found) in command\")\n    return world.scope\n  }\n\n  if (cmdParams.extendedScope) {\n    return parser.scopeFromWorld(cmdParams.allScope ? cmdParams.allScope : cmdParams.scope)\n  }\n  return parser.scopeFromScope(cmdParams.allScope ? cmdParams.allScope : cmdParams.scope)\n}\n\n// Multiple scopes when not ALL\nparser.getScopes = function(cmdParams) {\n  const baseScope = cmdParams.extendedScope ? parser.scopeFromWorld(cmdParams.scope) : parser.scopeFromScope(cmdParams.scope)\n    return [baseScope, world.scope]\n}\n\nparser.scopeFromScope = function(fn, options) {\n  const list = [];\n  for (const o of world.scope) {\n    if (fn(o, options)) {\n      list.push(o);\n    }\n  }\n  return list;\n}\n\nparser.scopeFromWorld = function(fn, options) {\n  const list = [];\n  for (const key in w) {\n    if (fn(w[key], options)) {\n      list.push(w[key]);\n    }\n  }\n  return list;\n}\n\nparser.keepTogether = function(s) {\n  return lang.regex.MetaUserComment.test(s)\n}\n\n// This set is used in the objects attribute of commands\n// The \"is\" functions are for looking at a specific place\n\n// Anywhere in the world\nparser.isInWorld = function(item) {\n  return true;\n}\n// Anywhere in the world\nparser.isReachable = function(item) {\n  return item.scopeStatus.canReach && world.ifNotDark(item);\n}\n// Anywhere in the location (used by the parser for the fallback)\nparser.isVisible = function(item) {\n  return item.scopeStatus.visible && world.ifNotDark(item);\n}\n// Held or here, but not in a container\nparser.isPresent = function(item) {\n  return parser.isHere(item) || parser.isHeld(item);\n}\n// Used by examine, so the player can X ME, even if something called metalhead is here.\nparser.isPresentOrMe = function(item) {\n  return parser.isHere(item) || parser.isHeld(item) || item === player();\n}\n// ... but not in a container\nparser.isHeldNotWorn = function(item) {\n  return item.isAtLoc(player().name, world.PARSER) && world.ifNotDark(item) && !item.getWorn();\n}\nparser.isHeld = function(item) {\n  return item.isAtLoc(player().name, world.PARSER) && world.ifNotDark(item);\n}\nparser.isHeldByNpc = function(item) {\n  const npcs = parser.scopeFromScope(parser.isReachable).filter(el => el.npc);\n  for (let npc of npcs) {\n    if (item.isAtLoc(npc.name, world.PARSER)) return true;\n  }\n  return false;\n}\nparser.isWorn = function(item) {\n  return item.isAtLoc(player().name, world.PARSER) && world.ifNotDark(item) && item.getWorn();\n}\nparser.isWornByNpc = function(item) {\n  const npcs = parser.scopeFromScope(parser.isReachable).filter(el => el.npc);\n  for (let npc of npcs) {\n    if (item.isAtLoc(npc.name, world.PARSER) && item.getWorn()) return true;\n  }\n  return false;\n}\n\nparser.isNpcOrHere = function(item) {\n  return (item.isAtLoc(player().loc, world.PARSER) && world.ifNotDark(item)) || item.npc || item.player;\n}\nparser.isNpcAndHere = function(item) {\n  return player().onPhoneTo === item.name || (item.isAtLoc(player().loc, world.PARSER) && (item.npc || item.player))\n}\nparser.isHere = function(item) {\n  return item.isAtLoc(player().loc, world.PARSER) && world.ifNotDark(item);\n}\n\nparser.isForSale = function(item) {\n  return item.isForSale && item.isForSale(player().loc) && world.ifNotDark(item);\n}\n\n//parser.isInside = function(item, options) {\n//  return item.isAtLoc(options.container.name, world.PARSER) && world.ifNotDark(item);\n//}\n\n//parser.isRoom = function(item) {\n//  return item.room;\n//}\n\n// Is in a container that is reachable\nparser.isContained = function(item) {\n  const containers = parser.scopeFromScope(parser.isReachable).filter(el => el.container);\n  for (let container of containers) {\n    if (container.closed) continue;\n    if (item.isAtLoc(container.name, world.PARSER)) return true;\n  }\n  return false;\n}\n// Is in a container that is reachable, not held by player\nparser.isLocationContained = function(item) {\n  const containers = parser.scopeFromScope(parser.isReachable).filter(el => el.container)\n  for (let container of containers) {\n    if (container.closed) continue\n    if (container.isUltimatelyHeldBy(player())) continue\n    if (item.isAtLoc(container.name, world.PARSER)) return true\n  }\n  return false;\n}\n// In this location, or in a container (used by TAKE)\nparser.isHereOrContained = function(item) {\n  if (parser.isHere(item)) return true;\n  return parser.isContained(item);\n\n}\n// In this location, or in a container not held by the player (used by TAKE ALL)\nparser.isHereOrLocationContained = function(item) {\n  if (item === loc()) return false\n  if (parser.isHere(item)) return true;\n  return parser.isLocationContained(item);\n}\n// Is a CONSTRUCTION and has no location\nparser.isUnconstructed = function(item) {\n  return !item.loc && item.construction;\n}\n\n//parser.debug = true\n","// A command has an arbitrary name, a regex or pattern,\n// and a script as a minimum.\n// regex           A regex to match against\n// objects         An array of matches in the regex (see wiki)\n// script          This will be run on a successful match\n// attName         If there is no script, then this attribute on the object will be used\n// nothingForAll   If the player uses ALL and there is nothing there, use this error message\n// noobjecterror   If the player specifies an object\n// noTurnscripts   Set to true to prevent turnscripts firing even when this command is successful\n\n\"use strict\";\n\nimport {\n    ambient, askText, Cmd, commentmsg, debugmsg, failedmsg, falsemsg, findCmd, formatList, getDir,\n    io, w, lang, regions, world, array, settings, test, util, parser, cmdRules, INDEFINITE, saveLoad,\n    metamsg, msg, msgTable, printOrRun, respond, runCmd, scopeBy, sentenceCase, verbify, player, loc\n} from \"../index.js\";\n\nconst cmdDirections = []\nfor (let exit of lang.exit_list) {\n  if (exit.type === 'nocmd') continue\n  cmdDirections.push(exit.name)\n  cmdDirections.push(exit.abbrev.toLowerCase())\n  if (exit.alt) cmdDirections.push(exit.alt)\n}\n\nexport const commands = [];\n\n  // ----------------------------------\n  // Single word commands\n\n  // Cannot just set the script to helpScript as we need to allow the\n  // author to change it in code.js, which is loaded after this.\n  new Cmd('MetaHello', {\n    script:lang.helloScript,\n  });\n  new Cmd('MetaHelp', {\n    script:lang.helpScript,\n  });\n  new Cmd('MetaHint', {\n    script:function() {\n      if (settings.hintResponses) {\n        respond({char:{msg:function(s) { settings.hintResponsesInGame ? msg(s) : metamsg(s)}}}, settings.hintResponses)\n        return world.SUCCESS_NO_TURNSCRIPTS\n\n      }\n      if (settings.hintSheetData) {\n        io.showHintSheet()\n        return world.SUCCESS_NO_TURNSCRIPTS\n      }\n      // if (settings.hintInvisiClues) {\n      //   metamsg(lang.linkHintInvisiClues)\n      //   return world.SUCCESS_NO_TURNSCRIPTS\n      // }\n      return lang.hintScript()\n    },\n  });\n  new Cmd('MetaCredits', {\n    script:lang.aboutScript,\n  });\n  new Cmd('MetaDarkMode', {\n    script:io.toggleDarkMode,\n  })\n  new Cmd('MetaNarrowMode', {\n    script:io.toggleNarrowMode,\n  })\n  new Cmd('MetaAutoScrollMode', {\n    script:io.toggleAutoScrollMode,\n  })\n  new Cmd('MetaPlainFontMode', {\n    script:io.togglePlainFontMode,\n  })\n  new Cmd('MetaSilent', {\n    script:function() {\n      if (settings.silent) {\n        metamsg(lang.mode_silent_off)\n        settings.silent = false\n      }\n      else {\n        metamsg(lang.mode_silent_on)\n        settings.silent = true\n        ambient()\n      }\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaWarnings', {\n    script:lang.warningsScript,\n  })\n\n  new Cmd('MetaSpoken', {\n    script:function() {\n      if (io.spoken) {\n        io.spoken = false\n        metamsg(lang.spoken_off)\n      }\n      else {\n        io.spoken = true\n        metamsg(lang.spoken_on)\n      }\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaIntro', {\n    script:function() {\n      io.spoken = true;\n      if (typeof settings.intro === \"string\") {\n        msg(settings.intro)\n      }\n      else {\n        for (let el of settings.intro) msg(el)\n      }\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaBrief', {\n    script:function() {\n      settings.verbosity = world.BRIEF\n      metamsg(lang.mode_brief)\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaTerse', {\n    script:function() {\n      settings.verbosity = world.TERSE\n      metamsg(lang.mode_terse)\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaVerbose', {\n    script:function() {\n      settings.verbosity = world.VERBOSE\n      metamsg(lang.mode_verbose)\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n\n  new Cmd('MetaTranscript', {\n    script:lang.transcriptScript,\n  })\n  new Cmd('MetaTranscriptStart', {\n    script:function() {\n      if (saveLoad.transcript) {\n        metamsg(lang.transcript_already_on)\n        return world.FAILED\n      }\n      saveLoad.transcriptClear()\n      saveLoad.transcriptStart()\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaTranscriptOn', {\n    script:function() {\n      if (saveLoad.transcript) {\n        metamsg(lang.transcript_already_on)\n        return world.FAILED\n      }\n      saveLoad.transcriptStart()\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaTranscriptOff', {\n    script:function() {\n      if (!saveLoad.transcript) {\n        metamsg(lang.transcript_already_off)\n        return world.FAILED\n      }\n      saveLoad.transcriptEnd()\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaTranscriptClear', {\n    script:function() {\n      saveLoad.transcriptClear()\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaTranscriptShow', {\n    script:function() {\n      saveLoad.transcriptShow()\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaUserComment', {\n    script:function(arr) {\n      commentmsg(\"Comment: \" + arr[0])\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n    objects:[\n      {special:'text'},\n    ]\n  })\n\n  // ----------------------------------\n  // File system commands\n  new Cmd('MetaSave', {\n    script:lang.saveLoadScript,\n  })\n  new Cmd('MetaSaveOverwriteGame', {\n    script:function(arr) {\n      saveLoad.saveGame(arr[0], true)\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n    objects:[\n      {special:'text'},\n    ]\n  })\n  new Cmd('MetaSaveGame', {\n    script:function(arr) {\n      if (settings.localStorageDisabled) {\n        saveLoad.saveGameAsFile(arr[0])\n      }\n      else {\n        saveLoad.saveGame(arr[0])\n      }\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n    objects:[\n      {special:'text'},\n    ]\n  })\n  new Cmd('MetaFileSaveGame', {\n    script:function(arr) {\n      saveLoad.saveGameAsFile(arr[0])\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n    objects:[\n      {special:'text'},\n    ]\n  })\n  new Cmd('MetaLoad', {\n    script:function(arr) {\n      if (settings.localStorageDisabled) {\n        document.getElementById('fileDialog').click()\n      }\n      else {\n        lang.saveLoadScript()\n      }\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n    objects:[\n    ]\n  })\n  new Cmd('MetaLoadGame', {\n    script:function(arr) {\n      saveLoad.loadGameFromLS(arr[0])\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n    objects:[\n      {special:'text'},\n    ]\n  })\n  new Cmd('MetaFileLoadGame', {\n    script:function(arr) {\n      document.getElementById('fileDialog').click()\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n    objects:[\n      {special:'text'},\n    ]\n  })\n  new Cmd('MetaDir', {\n    script:function() {\n      saveLoad.dirGame()\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaDeleteGame', {\n    script:function(arr) {\n      saveLoad.deleteGame(arr[0])\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n    objects:[\n      {special:'text'},\n    ]\n  })\n\n  new Cmd('MetaUndo', {\n    script:function() {\n      if (settings.maxUndo === 0) {\n        metamsg(lang.undo_disabled)\n        return world.FAILED\n      }\n      if (world.gameState.length < 2) {\n        metamsg(lang.undo_not_available)\n        return world.FAILED\n      }\n      world.gameState.pop()\n      const gameState = world.gameState[world.gameState.length - 1]\n      metamsg(lang.undo_done)\n      saveLoad.loadTheWorld(gameState)\n      w[player().loc].description()\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaAgain', {\n    script:function() {\n      return io.againOrOops(true)\n    },\n  })\n  new Cmd('MetaOops', {\n    script:function() {\n      return io.againOrOops(false)\n    },\n  })\n  new Cmd('MetaRestart', {\n    script:function() {\n      askText(lang.restart_are_you_sure, function(result) {\n        if (result.match(lang.yes_regex)) {\n          location.reload()\n        }\n        else {\n          metamsg(lang.restart_no)\n        }\n      });\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n  new Cmd('MetaPronouns', {\n    script:function() {\n      metamsg('See the developer console (F12) for the current pronouns')\n      console.log(parser.pronouns)\n    },\n  })\n  new Cmd('MetaScore', {\n    script:function() {\n      metamsg(lang.scores_not_implemented)\n    },\n  })\n  new Cmd('MetaTopicsNote', {\n    script:lang.topicsScript,\n  })\n\n  // These are kind of meta-commands - perhaps free commands is a better term.\n  // I see them as jogging the user's mind about the game world, rather than\n  // doing something in the game world, so by default\n  // no ttime passes.\n  // Set settings.lookCountsAsTurn to true if you disagree!\n  new Cmd('Look', {\n    script:function() {\n      loc().description(true);\n      return settings.lookCountsAsTurn ? world.SUCCESS : world.SUCCESS_NO_TURNSCRIPTS;\n    },\n    score:50,\n  })\n  new Cmd('Exits', {\n    script:function() {\n      msg(lang.can_go, {char:player()});\n      return settings.lookCountsAsTurn ? world.SUCCESS : world.SUCCESS_NO_TURNSCRIPTS;\n    },\n  })\n  new Cmd('Inv', {\n    script:function() {\n      const listOfOjects = player().getContents(world.INVENTORY);\n      msg(lang.inventory_prefix + \" \" + formatList(listOfOjects, {\n          article:INDEFINITE, lastSep:lang.list_and,\n          modified:true, nothing:lang.list_nothing,\n          loc:player().name\n      }) + \".\", {char:player()});\n      return settings.lookCountsAsTurn ? world.SUCCESS : world.SUCCESS_NO_TURNSCRIPTS;\n    },\n  })\n  new Cmd('Map', {\n    script:function() {\n        // todo - wtf showMap?\n      if (typeof showMap !== 'undefined') {\n        showMap();\n        return settings.lookCountsAsTurn ? world.SUCCESS : world.SUCCESS_NO_TURNSCRIPTS;\n      }\n      else {\n        const zone = w[player().loc]\n        if (!zone.zone) {\n          return failedmsg(lang.no_map);\n        }\n        else {\n          const flag = zone.drawMap()\n          if (!flag) return failedmsg(lang.no_map);\n          return world.SUCCESS_NO_TURNSCRIPTS\n        }\n      }\n    },\n  })\n  new Cmd('Topics', {\n    attName:\"topics\",\n    objects:[\n      {scope:parser.isNpcAndHere},\n    ],\n    defmsg:lang.no_topics,\n  })\n\n  new Cmd('Wait', {\n    script:function() {\n      msg(lang.wait_msg);\n      return world.SUCCESS;\n    },\n  })\n  new Cmd('Smell', {\n    script:function() {\n      if (loc().smell) {\n        printOrRun(player(), loc(), \"smell\");\n      }\n      else if (loc()._region && regions[loc()._region].smell) {\n        msg(regions[loc()._region].smell)\n      }\n      else {\n        msg(lang.no_smell, {char:player()});\n      }\n      return world.SUCCESS;\n    },\n  })\n  new Cmd('Listen', {\n    script:function() {\n      if (loc().listen) {\n        printOrRun(player(), loc(), \"listen\");\n      }\n      else if (loc()._region && regions[loc()._region].listen) {\n        msg(regions[loc()._region].listen)\n      }\n      else {\n        msg(lang.no_listen, {char:player()});\n      }\n      return world.SUCCESS;\n    },\n  })\n  new Cmd('PurchaseFromList', {\n    script:function() {\n      const l = [];\n      for (let key in w) {\n        if (parser.isForSale(w[key])) {\n          const price = w[key].getBuyingPrice(player())\n          const row = [sentenceCase(w[key].getName()), world.Money(price)];\n          // todo - wtf Money and buy??\n          row.push(price > player().money ? \"-\" : \"{cmd:buy \" + w[key].alias + \":\" + buy + \"}\")\n          l.push(row)\n        }\n      }\n      if (l.length === 0) {\n        return failedmsg(lang.nothing_for_sale);\n      }\n      msg(lang.current_money + \": \" + world.Money(player().money));\n      msgTable(l, lang.buy_headings)\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n  })\n\n  // Out of convenient order as it needs to be before TAKE\n  new Cmd('GetFluid', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    objects:[\n      {special:'fluid'},\n    ],\n    score:5,\n    script:function(objects) {\n      const options = {char:player(), fluid:objects[0]}\n      if (!util.findSource(options)) return failedmsg(lang.no_fluid_here, options)\n      return failedmsg(lang.cannot_get_fluid, options)\n    },\n  })\n\n  // ----------------------------------\n  // Verb-object commands\n  new Cmd('Examine', {\n    npcCmd:true,\n    objects:[\n      {scope:parser.isPresent, multiple:true}\n    ],\n    defmsg:lang.default_examine,\n  })\n  new Cmd('LookAt', {  // used for NPCs\n    npcCmd:true,\n    attName:'examine',\n    objects:[\n      {scope:parser.isPresentOrMe}\n    ],\n    defmsg:lang.default_examine,\n  })\n  new Cmd('LookOut', {\n    npcCmd:true,\n    rules:[cmdRules.isPresent],\n    objects:[\n      {scope:parser.isPresent}\n    ],\n    attName:\"lookout\",\n    defmsg:lang.cannot_look_out,\n  })\n  new Cmd('LookBehind', {\n    npcCmd:true,\n    rules:[cmdRules.isPresent],\n    attName:\"lookbehind\",\n    objects:[\n      {scope:parser.isPresent}\n    ],\n    defmsg:lang.nothing_there,\n  })\n  new Cmd('LookUnder', {\n    npcCmd:true,\n    rules:[cmdRules.isPresent],\n    attName:\"lookunder\",\n    objects:[\n      {scope:parser.isPresent}\n    ],\n    defmsg:lang.nothing_there,\n  })\n  new Cmd('LookThrough', {\n    npcCmd:true,\n    rules:[cmdRules.isPresent],\n    attName:\"lookthrough\",\n    objects:[\n      {scope:parser.isPresent}\n    ],\n    defmsg:lang.nothing_there,\n  })\n  new Cmd('LookInside', {\n    npcCmd:true,\n    rules:[cmdRules.isPresent],\n    attName:\"lookinside\",\n    objects:[\n      {scope:parser.isPresent}\n    ],\n    defmsg:lang.nothing_inside,\n  })\n  new Cmd('Search', {\n    npcCmd:true,\n    rules:[cmdRules.isPresent],\n    attName:\"search\",\n    objects:[\n      {scope:parser.isPresent}\n    ],\n    defmsg:lang.nothing_there,\n  })\n\n  new Cmd('Take', {\n    npcCmd:true,\n    rules:[cmdRules.isHereAlready, cmdRules.testManipulate],\n    objects:[\n      {scope:parser.isHereOrContained, allScope:parser.isHereOrLocationContained, multiple:true},\n    ],\n    defmsg:lang.cannot_take,\n  })\n  new Cmd('Drop', {\n    npcCmd:true,\n    rules:[cmdRules.isHeldNotWorn, cmdRules.testManipulate],\n    objects:[\n      {scope:parser.isHeld, multiple:true},\n    ],\n    default:function(options) { falsemsg(options.item.isAtLoc(options.char) ? lang.cannot_drop : lang.not_carrying, options) },\n  })\n  new Cmd('Wear2', {\n    npcCmd:true,\n    rules:[cmdRules.isHeldNotWorn, cmdRules.isHeld, cmdRules.testManipulate],\n    attName:\"wear\",\n    objects:[\n      {scope:parser.isHeld, multiple:true},\n    ],\n    default:function(options) { falsemsg(options.item.ensemble ? lang.cannot_wear_ensemble : lang.cannot_wear, options) },\n  })\n  new Cmd('Wear', {\n    npcCmd:true,\n    rules:[cmdRules.isHeldNotWorn, cmdRules.testManipulate],\n    objects:[\n      {scope:parser.isHeld, multiple:true},\n    ],\n    default:function(options) { falsemsg(options.item.ensemble ? lang.cannot_wear_ensemble : lang.cannot_wear, options) },\n  })\n  new Cmd('Remove', {\n    npcCmd:true,\n    rules:[cmdRules.isWorn, cmdRules.testManipulate],\n    objects:[\n      {scope:parser.isWorn, multiple:true},\n    ],\n    default:function(options) { falsemsg(options.item.ensemble ? lang.cannot_wear_ensemble : lang.not_wearing, options) },\n  })\n  new Cmd('Remove2', {\n    npcCmd:true,\n    rules:[cmdRules.isWorn, cmdRules.testManipulate],\n    attName:\"remove\",\n    objects:[\n      {scope:parser.isWorn, multiple:true},\n    ],\n    default:function(options) { falsemsg(options.item.ensemble ? lang.cannot_wear_ensemble : lang.not_wearing, options) },\n  })\n  new Cmd('Read', {\n    npcCmd:true,\n    rules:[cmdRules.isPresent],\n    objects:[\n      {scope:parser.isHeld, multiple:true},\n    ],\n    defmsg:lang.cannot_read,\n  })\n  new Cmd('Purchase', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate],\n    objects:[\n      {scope:parser.isForSale},\n    ],\n    defmsg:lang.cannot_purchase_here,\n  })\n  new Cmd('Sell', {\n    npcCmd:true,\n    rules:[cmdRules.isHeldNotWorn, cmdRules.testManipulate],\n    objects:[\n      {scope:parser.isHeld, multiple:true},\n    ],\n    defmsg:lang.cannot_sell_here,\n  })\n  new Cmd('Smash', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresent],\n    objects:[\n      {scope:parser.isHeld, multiple:true},\n    ],\n    defmsg:lang.cannot_smash,\n  })\n  new Cmd('Turn', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isHere},\n    ],\n    defmsg:lang.cannot_turn,\n  })\n  new Cmd('TurnLeft', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isHere},\n    ],\n    defmsg:lang.cannot_turn,\n  })\n  new Cmd('TurnRight', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isHere},\n    ],\n    defmsg:lang.cannot_turn,\n  })\n  new Cmd('SwitchOn', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    attName:\"switchon\",\n    cmdCategory:\"SwitchOn\",\n    objects:[\n      {scope:parser.isHeld, multiple:true},\n    ],\n    defmsg:lang.cannot_switch_on,\n  })\n  new Cmd('SwitchOn2', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    attName:\"switchon\",\n    cmdCategory:\"SwitchOn\",\n    objects:[\n      {scope:parser.isHeld, multiple:true},\n    ],\n    defmsg:lang.cannot_switch_on,\n  })\n\n  new Cmd('SwitchOff2', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    attName:\"switchoff\",\n    cmdCategory:\"SwitchOff\",\n    objects:[\n      {scope:parser.isHeld, multiple:true, attName:\"switchon\"},\n    ],\n    defmsg:lang.cannot_switch_off,\n  })\n  new Cmd('SwitchOff', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    attName:\"switchoff\",\n    cmdCategory:\"SwitchOff\",\n    objects:[\n      {scope:parser.isHeld, multiple:true, attName:\"switchoff\"},\n    ],\n    defmsg:lang.cannot_switch_off,\n  })\n\n  new Cmd('Open', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isPresent, multiple:true, attName:\"open\"},\n    ],\n    defmsg:lang.cannot_open,\n  })\n  new Cmd('OpenWith', {\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isPresent, multiple:true, attName:\"open\"},\n      {scope:parser.isHeld, multiple:true},\n    ],\n    defmsg:lang.cannot_open_with,\n  })\n\n  new Cmd('Close', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isPresent, multiple:true, attName:\"close\"},\n    ],\n    defmsg:lang.cannot_close,\n  })\n\n  new Cmd('Lock', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isPresent, multiple:true, attName:\"lock\"},\n    ],\n    defmsg:lang.cannot_lock,\n  })\n  new Cmd('LockWith', {\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isPresent, attName:\"lock\"},\n      {scope:parser.isHeld, attName:'key'},\n    ],\n    defmsg:lang.cannot_lock_with,\n  })\n\n  new Cmd('Unlock', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isPresent, multiple:true, attName:\"unlock\"},\n    ],\n    defmsg:lang.cannot_unlock,\n  })\n  new Cmd('UnlockWith', {\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isPresent, attName:\"unlock\"},\n      {scope:parser.isHeld, attName:'key'},\n    ],\n    defmsg:lang.cannot_unlock_with,\n  })\n\n  new Cmd('Push', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isPresent},\n    ],\n    defmsg:lang.nothing_useful,\n  })\n\n  new Cmd('Pull', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isPresent},\n    ],\n    defmsg:lang.nothing_useful,\n  })\n  new Cmd('Fill', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate],\n    objects:[\n      {scope:parser.isPresent},\n    ],\n    defmsg:lang.cannot_fill,\n  })\n  new Cmd('Empty', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    objects:[\n      {scope:parser.isPresent},\n    ],\n    defmsg:lang.cannot_empty,\n  })\n\n  new Cmd('SmellItem', {\n    npcCmd:true,\n    attName:\"smell\",\n    objects:[\n      {scope:parser.isPresent, attName:\"smell\"},\n    ],\n    defmsg:lang.cannot_smell,\n  })\n  new Cmd('ListenToItem', {\n    npcCmd:true,\n    attName:\"listen\",\n    objects:[\n      {scope:parser.isPresent, attName:\"listen\"},\n    ],\n    defmsg:lang.cannot_listen,\n  })\n\n  new Cmd('Eat', {\n    npcCmd:true,\n    rules:[cmdRules.isHeldNotWorn, cmdRules.testManipulate],\n    objects:[\n      {special:'text'},\n      {scope:parser.isHeld, multiple:true, attName:\"ingest\"},\n    ],\n    defmsg:lang.cannot_eat,\n  })\n  new Cmd('Drink', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    objects:[\n      {special:'text'},\n      {scope:parser.isPresent, attName:\"ingest\"},\n    ],\n    defmsg:lang.cannot_drink,\n  })\n  new Cmd('Ingest', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    objects:[\n      {special:'text'},\n      {scope:parser.isPresent, attName:\"ingest\"},\n    ],\n    defmsg:lang.cannot_ingest,\n  })\n\n  new Cmd('Sit', {\n    npcCmd:true,\n    cmdCategory:\"Posture\",\n    rules:[cmdRules.testPosture],\n    attName:\"siton\",\n    objects:[],\n    script:function() {\n      const objs = scopeBy(el => el.siton && el.isAtLoc(player().loc))\n      log(objs)\n      if (objs.length === 0) return failedmsg(lang.no_sit_object)\n      return objs[0].siton({char:player(), item:objs[0]}) ? world.SUCCESS : world.FAILED\n    },\n  })\n  new Cmd('Recline', {\n    npcCmd:true,\n    cmdCategory:\"Posture\",\n    rules:[cmdRules.testPosture],\n    attName:\"reclineon\",\n    objects:[],\n    script:function() {\n      const objs = scopeBy(el => el.reclineon && el.isAtLoc(player().loc))\n      log(objs)\n      if (objs.length === 0) return failedmsg(lang.no_recline_object)\n      return objs[0].reclineon({char:player(), item:objs[0]}) ? world.SUCCESS : world.FAILED\n    },\n  })\n  new Cmd('SitOn', {\n    npcCmd:true,\n    cmdCategory:\"Posture\",\n    rules:[cmdRules.testPosture, cmdRules.isHere],\n    attName:\"siton\",\n    objects:[\n      {scope:parser.isHere, attName:\"assumePosture\"},\n    ],\n    defmsg:lang.cannot_sit_on,\n  })\n  new Cmd('StandOn', {\n    npcCmd:true,\n    cmdCategory:\"Posture\",\n    rules:[cmdRules.testPosture, cmdRules.isHere],\n    attName:\"standon\",\n    objects:[\n      {scope:parser.isHere, attName:\"assumePosture\"},\n    ],\n    defmsg:lang.cannot_stand_on,\n  })\n  new Cmd('ReclineOn', {\n    npcCmd:true,\n    cmdCategory:\"Posture\",\n    rules:[cmdRules.testPosture, cmdRules.isHere],\n    attName:\"reclineon\",\n    objects:[\n      {scope:parser.isHere, attName:\"assumePosture\"},\n    ],\n    defmsg:lang.cannot_recline_on,\n  })\n  new Cmd('GetOff', {\n    npcCmd:true,\n    cmdCategory:\"Posture\",\n    score:5, // to give priority over TAKE\n    rules:[cmdRules.testPosture, cmdRules.isHere],\n    attName:\"getoff\",\n    objects:[\n      {scope:parser.isHere, attName:\"assumePosture\"},\n    ],\n    defmsg:lang.already,\n  })\n\n  new Cmd('Use', {\n    npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresentOrContained],\n    objects:[\n      {scope:parser.isPresent},\n    ],\n    script:function(objects) {\n      const obj = objects[0][0]\n      const options = {char:player(), item:obj, verb:'use'}\n\n      // Use this to bypass the rules, say if the object could be in a strange place\n      if (obj.useFunction) {\n        const result = obj.useFunction(options)\n        return result ? world.SUCCESS : world.FAILED\n      }\n\n      if (obj.use) {\n        const result = this.processCommand(options)\n        return result ? world.SUCCESS : world.FAILED\n      }\n\n      if (obj.useDefaultsTo) {\n        const cmd = findCmd(obj.useDefaultsTo(player()))\n        if (cmd) {\n          const result = cmd.processCommand(options);\n          return result ? world.SUCCESS : world.FAILED\n        }\n        else {\n          throw new Error(\"USE command defaulting to unknown command \" + obj.useDefaultsTo())\n        }\n      }\n\n      this.default({char:player(), item:obj})\n      return world.FAILED;\n    },\n    defmsg:lang.cannot_use,\n  })\n\n  new Cmd('TalkTo', {\n    rules:[cmdRules.canTalkTo],\n    attName:\"talkto\",\n    objects:[\n      {scope:parser.isNpcAndHere},\n    ],\n    defmsg:lang.cannot_talk_to,\n  })\n\n  // ----------------------------------\n  // Complex commands\n\n  new Cmd('Say', {\n    script:function(arr) {\n      const l = [];\n      for (let key in w) {\n        if (w[key].sayCanHear && w[key].sayCanHear(player(), arr[0])) l.push(w[key]);\n      }\n      l.sort(function(a, b) { return (b.sayPriority + b.sayBonus) - (a.sayPriority + b.sayBonus); });\n      if (l.length === 0) {\n          // todo - say_no_one_here is string!\n        // msg(lang.say_no_one_here(player, arr[0], arr[1]));\n        return world.SUCCESS;\n      }\n\n      const options = {char:player(), text: sentenceCase(arr[1])}\n      if (settings.givePlayerSayMsg) msg(lang.say_something, options)\n      for (let chr of l) {\n        if (chr.sayQuestion && chr.respondToAnswer(arr[1])) return world.SUCCESS;\n        if (chr.sayResponse && chr.sayResponse(arr[1], arr[0])) return world.SUCCESS;\n      }\n      if (settings.givePlayerSayMsg) {\n        msg(lang.say_no_response, options);\n      }\n      else {\n        msg(lang.say_no_response_full, options);\n      }\n      return world.SUCCESS;\n    },\n    objects:[\n      {special:'text'},\n      {special:'text'},\n    ]\n  })\n\n  new Cmd('Stand', {\n    rules:[cmdRules.testPosture],\n    script:handleStandUp,\n  })\n  new Cmd('NpcStand', {\n    rules:[cmdRules.testPosture],\n    cmdCategory:\"Posture\",\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n    ],\n    script:handleStandUp,\n  })\n\n  new Cmd('Make', {\n    objects:[\n      {scope:parser.isUnconstructed, extendedScope:true},\n    ],\n    script:function(objects) {\n      const obj = objects[0][0]\n      return obj.build({char:player(), item:obj}) ? world.SUCCESS : world.FAILED\n    },\n  })\n  new Cmd('MakeWith', {\n    objects:[\n      {scope:parser.isUnconstructed, extendedScope:true},\n      {scope:parser.isHere, multiple:true},\n    ],\n    script:function(objects) {\n      const obj = objects[0][0]\n      const options = {char:player(), item:obj}\n      if (!obj.testComponents(objects[1], options)) return world.FAILED\n      return obj.build(options) ? world.SUCCESS : world.FAILED\n    },\n  })\n  new Cmd('NpcMake', {\n    objects:[\n      {scope:parser.isUnconstructed},\n    ],\n    script:function(objects) {\n      const npc = objects[0][0]\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift()\n      const obj = objects[0][0]\n      return obj.build({char:npc, item:obj}) ? world.SUCCESS : world.FAILED\n    },\n  })\n  new Cmd('NpcMakeWith', {\n    objects:[\n      {scope:parser.isUnconstructed},\n      {scope:parser.isHere, multiple:true},\n    ],\n    script:function(objects) {\n      const npc = objects[0][0]\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift()\n      const obj = objects[0][0]\n      const options = {char:npc, item:obj}\n      if (!obj.testComponents(objects[1], options)) return world.FAILED\n      return obj.build(options) ? world.SUCCESS : world.FAILED\n    },\n  })\n\n  new Cmd('FillWith', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    objects:[\n      {scope:parser.isHeld},\n      {special:'fluid'},\n    ],\n    script:function(objects) {\n      return handleFillFromUnknown(player(), objects[0][0], objects[1]);\n    },\n  })\n  new Cmd('NpcFillWith', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    cmdCategory:\"Fill\",\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n      {scope:parser.isHeld},\n      {special:'fluid'},\n    ],\n    script:function(objects) {\n      const npc = objects[0][0]\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift()\n      return handleFillFromUnknown(npc, objects[0][0], objects[1])\n    },\n  })\n  new Cmd('EmptyInto', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    objects:[\n      {scope:parser.isHeld},\n      {scope:parser.isPresent},\n    ],\n    script:function(objects) {\n      return handleFillFromVessel(player(), objects[0][0], objects[1][0], undefined);\n    },\n  })\n  new Cmd('NpcEmptyInto', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    cmdCategory:\"Fill\",\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n      {scope:parser.isHeld},\n      {scope:parser.isPresent},\n    ],\n    script:function(objects) {\n      const npc = objects[0][0]\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift()\n      return handleFillFromVessel(npc, objects[0][0], objects[1][0], undefined)\n    },\n  })\n  new Cmd('EmptyFluidInto', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    objects:[\n      {special:'fluid'},\n      {scope:parser.isPresent},\n    ],\n    script:function(objects) {\n      return handleEmptyFluidInto(player(), objects[1][0], objects[0]);\n    },\n  })\n  new Cmd('NpcEmptyFluidInto', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    cmdCategory:\"Fill\",\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n      {special:'fluid'},\n      {scope:parser.isPresent},\n    ],\n    script:function(objects) {\n      const npc = objects[0][0]\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift()\n      return handleEmptyFluidInto(npc, objects[1][0], objects[0])\n    },\n  })\n  new Cmd('PutFluidIn', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    objects:[\n      {special:'fluid'},\n      {scope:parser.isPresent, attName: \"container\"},\n    ],\n    script:function(objects) {\n      return handleFillFromUnknown(player(), objects[1][0], objects[0])\n    },\n  })\n\n  new Cmd('PutIn', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    objects:[\n      {scope:parser.isHeld, multiple:true},\n      {scope:parser.isPresent, attName: \"container\"},\n    ],\n    script:function(objects) {\n      return handleInOutContainer(player(), objects, \"drop\", handleSingleDropInContainer)\n    },\n  })\n\n  new Cmd('NpcPutIn', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    cmdCategory:\"Drop/in\",\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n      {scope:parser.isHeldByNpc, multiple:true},\n      {scope:parser.isPresent, attName: \"container\"},\n    ],\n    script:function(objects) {\n      const npc = objects[0][0]\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift()\n      return handleInOutContainer(npc, objects, \"drop\", handleSingleDropInContainer)\n    },\n  })\n\n  new Cmd('TakeOut', {\n    rules:[cmdRules.testManipulate, cmdRules.isPresent],\n    objects:[\n      {scope:parser.isContained, multiple:true},\n      {scope:parser.isPresent, attName: \"container\"},\n    ],\n    script:function(objects) {\n      return handleInOutContainer(player(), objects, \"take\", handleSingleTakeOutContainer)\n    },\n  })\n\n  new Cmd('NpcTakeOut', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    cmdCategory:\"Take\",\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n      {scope:parser.isContained, multiple:true},\n      {scope:parser.isPresent, attName: \"container\"},\n    ],\n    script:function(objects) {\n      const npc = objects[0][0]\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift()\n      return handleInOutContainer(npc, objects, \"take\", handleSingleTakeOutContainer)\n    },\n  })\n\n  new Cmd('GiveTo', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    objects:[\n      {scope:parser.isHeld, multiple:true},\n      {scope:parser.isPresent, attName: \"npc\"},\n    ],\n    script:function(objects) {\n      return handleGiveToNpc(player(), objects)\n    },\n  })\n  new Cmd('NpcGiveTo', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    cmdCategory:\"Give\",\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n      {scope:parser.isHeldByNpc, multiple:true},\n      {scope:parser.isPresentOrMe, attName: \"npc\"},\n    ],\n    script:function(objects) {\n      const npc = objects[0][0];\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift()\n      return handleGiveToNpc(npc, objects)\n    },\n  })\n\n  new Cmd('Give', {\n    antiRegexes:[lang.regex.GiveTo],\n    matchItems:function(s) {\n      if (!this._test(s)) return\n      if (!this._testNot(s)) return\n\n      parser.msg(\"---------------------------------------------------------\");\n      parser.msg(\"* Looking at candidate: \" + this.name);\n\n      // this is a temporary set of data used while we parser one input\n      this.tmp.objectTexts = [];\n      this.tmp.objects = [];\n      this.tmp.score = this.score ? this.score : 10\n      this.tmp.error = undefined\n\n      let arr = this.tmp.regex.exec(s)\n      arr.shift()  // first element is the whole match, so discard\n\n      const scope = world.scope\n      const npcs = scope.filter(el => (el.npc && el !== player()))\n      const items = array.fromTokens(arr[0].split(' '), scope)\n      if (!items) return this.setError(parser.NO_OBJECT, lang.object_unknown_msg(arr[0]))\n\n      // The first item could be the NPC to give it to,\n      // and we want to pull that out.\n      // Disambiguation makes this tricky...\n      if (items[0].length === 1) {\n        // No need to disambig, only one item matched\n        if (items[0][0].npc) {\n          this.tmp.objects[1] = items[0]\n          items.shift()\n          this.tmp.objects[0] = items\n        }\n        else {\n          if (npcs.length === 0) return this.setError(parser.NO_OBJECT, lang.object_unknown_msg(arr[0]))\n          this.tmp.objects[1] = npcs\n          this.tmp.objects[0] = items\n        }\n      }\n      else {\n        // At least two items matched\n        // NPCs will take priority\n        const npcList = items[0].filter(el => el.npc)\n        if (npcList.length === 0) {\n          if (npcs.length === 0) return this.setError(parser.NO_OBJECT, lang.no_receiver)\n          this.tmp.objects[1] = npcs\n          this.tmp.objects[0] = items\n        }\n        else if (npcList.length === 1) {\n          this.tmp.objects[1] = [npcList[0]]\n          items.shift()\n          this.tmp.objects[0] = items\n        }\n        else {\n          this.tmp.objects[1] = [npcList]\n          items.shift()\n          this.tmp.objects[0] = items\n        }\n      }\n\n      // pre-disambig items in this.tmp.objects[0]\n      for (let i = 0; i < this.tmp.objects[0].length; i++) {\n        const el = this.tmp.objects[0][i]\n        if (el.length === 1) {\n          this.tmp.objects[0][i] = el[0]\n        }\n        else {\n          const held = el.filter(el => el.loc === player().name)\n          if (held.length === 1) {\n            this.tmp.objects[0][i] = held[0]\n          }\n          else if (held.length > 1) {\n            this.tmp.objects[0][i] = held\n          }\n          // otherwise, stick we hat we have\n        }\n      }\n\n      this.tmp.score = 10\n      parser.msg(\"..Base score: \" + this.tmp.score)\n    },\n\n    script:function(objects) {\n      return handleGiveToNpc(player(), objects)\n    },\n  })\n\n  new Cmd('NpcGive', {\n    antiRegexes:lang.regex.NpcGiveTo,\n    matchItems:function(s) {\n      if (!this._test(s)) return\n      if (!this._testNot(s)) return\n\n      parser.msg(\"---------------------------------------------------------\")\n      parser.msg(\"* Looking at candidate: \" + this.name)\n\n      // this is a temporary set of data used while we parse one input\n      this.tmp.objectTexts = [];\n      this.tmp.objects = [];\n      this.tmp.score = this.score ? this.score : 10\n      this.tmp.error = undefined\n\n      let arr = this.tmp.regex.exec(s)\n      arr.shift()  // first element is the whole match, so discard\n      const scope = world.scope\n\n      // Which NPC are we asking to do this?\n      let char\n      const charString = arr.shift()\n      const possibleChars = parser.findInList(charString, scope, {})\n      if (possibleChars.length === 0) return this.setError(parser.NO_OBJECT, lang.object_unknown_msg(charString))\n      if (possibleChars.length === 1) {\n        char = possibleChars[0]\n      }\n      else {\n        const actualChars = possibleChars.filter(el => ((el.npc || el.player) && el !== char))\n        if (possibleChars.length === 0) {\n          char = possibleChars\n        }\n        else if (possibleChars.length === 1) {\n          char = possibleChars[0]\n        }\n        else {\n          char = possibleChars\n        }\n      }\n\n      // npcs is a list of people we could be asking the character to give to\n      const npcs = scope.filter(el => ((el.npc || el.player) && el !== char))\n      const items = array.fromTokens(arr[0].split(' '), scope)\n      if (!items) return this.setError(parser.NO_OBJECT, lang.object_unknown_msg(arr[0]))\n\n      // The first item could be the NPC to give it to,\n      // and we want to pull that out.\n      // Disambiguation makes this tricky...\n      if (items[0].length === 1) {\n        // No need to disambig, only one item matched\n        if (items[0][0].npc || items[0][0] === player()) {\n          this.tmp.objects[1] = items[0]\n          items.shift()\n          this.tmp.objects[0] = items\n        }\n        else {\n          if (npcs.length === 0) return this.setError(parser.NO_OBJECT, lang.object_unknown_msg(arr[0]))\n          this.tmp.objects[1] = npcs\n          this.tmp.objects[0] = items\n        }\n      }\n      else {\n        // At least two items matched\n        // NPCs will take priority\n        const npcList = items[0].filter(el => el.npc || el.player)\n        if (npcList.length === 0) {\n          if (npcs.length === 0) return this.setError(parser.NO_OBJECT, lang.no_receiver)\n          this.tmp.objects[1] = npcs\n          this.tmp.objects[0] = items\n        }\n        else if (npcList.length === 1) {\n          this.tmp.objects[1] = [npcList[0]]\n          items.shift()\n          this.tmp.objects[0] = items\n        }\n        else {\n          this.tmp.objects[1] = [npcList]\n          items.shift()\n          this.tmp.objects[0] = items\n        }\n      }\n\n      // pre-disambig items in this.tmp.objects[0]\n      for (let i = 0; i < this.tmp.objects[0].length; i++) {\n        const el = this.tmp.objects[0][i]\n        if (el.length === 1) {\n          this.tmp.objects[0][i] = el[0]\n        }\n        else {\n          const held = el.filter(el => el.loc === char.name)\n          if (held.length === 1) {\n            this.tmp.objects[0][i] = held[0]\n          }\n          else if (held.length > 1) {\n            this.tmp.objects[0][i] = held\n          }\n          // otherwise, stick we hat we have\n        }\n      }\n      this.tmp.objects.unshift([char])\n\n      this.tmp.score = 10\n      parser.msg(\"..Base score: \" + this.tmp.score)\n    },\n\n    script:function(objects) {\n      const char = objects[0][0]\n      objects.shift()\n      return handleGiveToNpc(char, objects)\n    },\n  })\n\n  new Cmd('LookExit', {\n    script:function(objects) {\n\n      const dirName = getDir(objects[0])\n      const attName = 'look_' + dirName\n      const exit = loc()[dirName]\n      const tpParams = {char:player(), dir:dirName, exit:exit}\n\n      if (typeof loc()[attName] === \"function\") {\n        const res = loc()[attName](tpParams);\n        return res ? world.SUCCESS : world.FAILED;\n      }\n\n      if (!exit || exit.isHidden()) return failedmsg(lang.no_look_that_way, tpParams)\n      if (exit.isLocked()) return failedmsg(lang.locked_exit, {char:player(), exit:exit})\n\n      tpParams.dest = w[exit.name]\n      if (loc()[attName]) {\n        msg(loc()[attName], tpParams)\n      }\n      else if (typeof exit.look === \"function\") {\n        return exit.look(tpParams)\n      }\n      else if (exit.look) {\n        msg(exit.look, tpParams)\n      }\n      else {\n        msg(lang.default_look_exit, tpParams)\n        return world.SUCCESS_NO_TURNSCRIPTS\n      }\n      return world.SUCCESS\n    },\n    objects:[\n      {special:'text'},\n    ]\n  })\n\n  new Cmd('PushExit', {\n    rules:[cmdRules.testManipulate, cmdRules.isHere],\n    cmdCategory:\"Push\",\n    script:function(objects) {\n      return handlePushExit(player(), objects);\n    },\n    objects:[\n      {special:'text'},\n      {scope:parser.isHere, attName:\"shiftable\"},\n      {special:'text'},\n    ]\n  })\n  new Cmd('NpcPushExit', {\n    rules:[cmdRules.testManipulate, cmdRules.isHere],\n    cmdCategory:\"Push\",\n    script:function(objects) {\n      const npc = objects[0][0];\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift();\n      return handlePushExit(npc, objects);\n    },\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n      {special:'text'},\n      {scope:parser.isHere, attName:\"shiftable\"},\n      {special:'text'},\n    ]\n  })\n\n  new Cmd('TieUp', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    cmdCategory:\"Tie\",\n    objects:[\n      {scope:parser.isHeld, attName:\"rope\"},\n    ],\n    script:function(objects) {\n      const rope = objects[0][0]\n      if (!rope.rope) return failedmsg(lang.rope_not_attachable, {rope:rope, char:player()})\n      return rope.handleTieTo(player())\n    },\n  })\n  new Cmd('TieTo', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    cmdCategory:\"Tie\",\n    objects:[\n      {scope:parser.isHeld, attName:\"rope\"},\n      {scope:parser.isHere, attName:\"attachable\"},\n    ],\n    script:function(objects) {\n      const rope = objects[0][0]\n      if (!rope.rope) return failedmsg(lang.rope_not_attachable, {rope:rope, char:player()})\n      return rope.handleTieTo(player(), objects[1][0])\n    },\n  })\n  new Cmd('NpcTieUp', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    cmdCategory:\"Tie\",\n    script:function(objects) {\n      const npc = objects[0][0];\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift();\n      const rope = objects[0][0]\n      if (!rope.rope) return failedmsg(lang.rope_not_attachable, {rope:rope, char:npc})\n      return rope.handleTieTo(npc)\n    },\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n      {scope:parser.isHeld, attName:\"rope\"},\n    ]\n  })\n  new Cmd('NpcTieTo', {\n    rules:[cmdRules.testManipulate, cmdRules.isHeld],\n    cmdCategory:\"Tie\",\n    script:function(objects) {\n      const npc = objects[0][0];\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift();\n      const rope = objects[0][0]\n      if (!rope.rope) return failedmsg(lang.rope_not_attachable, {rope:rope, char:npc})\n      return rope.handleTieTo(npc, objects[1][0])\n    },\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n      {scope:parser.isHeld, attName:\"rope\"},\n      {scope:parser.isHere, attName:\"attachable\"},\n    ]\n  })\n\n  new Cmd('Untie', {\n    rules:[cmdRules.testManipulate, cmdRules.isPresent],\n    cmdCategory:\"Untie\",\n    objects:[\n      {scope:parser.isHere, attName:\"rope\"},\n    ],\n    script:function(objects) {\n      const rope = objects[0][0]\n      if (!rope.rope) return failedmsg(lang.rope_not_attachable, {rope:rope, char:player()})\n      return rope.handleUntieFrom(player())\n    },\n  })\n  new Cmd('NpcUntie', {\n    rules:[cmdRules.testManipulate, cmdRules.isPresent],\n    cmdCategory:\"Tie\",\n    script:function(objects) {\n      const npc = objects[0][0];\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift();\n      const rope = objects[0][0]\n      if (!rope.rope) return failedmsg(lang.rope_not_attachable, {rope:rope, char:npc})\n      return rope.handleUntieFrom(npc)\n    },\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n      {scope:parser.isHeld, attName:\"rope\"},\n    ]\n  })\n\n  new Cmd('UntieFrom', {\n    rules:[cmdRules.testManipulate, cmdRules.isPresent],\n    cmdCategory:\"Untie\",\n    objects:[\n      {scope:parser.isHere, attName:\"rope\"},\n      {scope:parser.isHere, attName:\"attachable\"},\n    ],\n    script:function(objects) {\n      const rope = objects[0][0]\n      if (!rope.rope) return failedmsg(lang.rope_not_attachable, {rope:rope, char:npc})\n      return rope.handleUntieFrom(player(), objects[1][0])\n    },\n  })\n  new Cmd('NpcUntieFrom', {\n    rules:[cmdRules.testManipulate, cmdRules.isPresent],\n    cmdCategory:\"Tie\",\n    script:function(objects) {\n      const npc = objects[0][0];\n      if (!npc.npc) return failedmsg(lang.not_npc, {char:player(), item:npc})\n      objects.shift();\n      const rope = objects[0][0]\n      if (!rope.rope) return failedmsg(lang.rope_not_attachable, {rope:rope, char:npc})\n      return rope.handleUntieFrom(npc, objects[1][0])\n    },\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n      {scope:parser.isHere, attName:\"rope\"},\n      {scope:parser.isHere, attName:\"attachable\"},\n    ]\n  })\n\n  new Cmd('UseWith', {\n    //npcCmd:true,\n    rules:[cmdRules.testManipulate, cmdRules.isPresent],\n    objects:[\n      {scope:parser.isPresent},\n      {scope:parser.isPresent},\n    ],\n    script:function(objects) {\n      const obj = objects[0][0]\n      const obj2 = objects[1][0]\n\n      if (obj.useWith) {\n        const result = obj.useWith(player(), obj2)\n        return result ? world.SUCCESS : world.FAILED\n      }\n      if (obj2.withUse) {\n        const result = obj2.withUse(player(), obj)\n        return result ? world.SUCCESS : world.FAILED\n      }\n\n      if (obj.useWithDefaultsTo) {\n        const cmd = findCmd(obj.useWithDefaultsTo())\n        if (cmd) {\n          const result = cmd.script(objects)\n          return result ? world.SUCCESS : world.FAILED\n        }\n        else {\n          throw new Error(\"USE command defaulting to unknown command \" + obj.useWithDefaultsTo)\n        }\n      }\n      if (obj2.withUseDefaultsTo) {\n        const cmd = findCmd(obj2.withUseDefaultsTo())\n        if (cmd) {\n          const result = cmd.script(objects)\n          return result ? world.SUCCESS : world.FAILED\n        }\n        else {\n          throw new Error(\"USE command defaulting to unknown command \" + obj2.withUseDefaultsTo)\n        }\n      }\n\n      this.default({char:player(), item:obj})\n      return world.FAILED;\n    },\n    defmsg:lang.cannot_use,\n  })\n\n  new Cmd('FollowMe', {\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n    ],\n    script:function(objects) {\n      const obj = objects[0][0]\n      const tpParams = {char:player(), npc:obj}\n      if (!obj.npc) return failedmsg(lang.cannot_follow, tpParams)\n      if (!obj.getAgreement(\"Follow\")) return world.FAILED\n      return obj.startFollow() ? world.SUCCESS : world.FAILED\n    },\n  })\n\n  new Cmd('WaitHere', {\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n    ],\n    script:function(objects) {\n      const obj = objects[0][0]\n      const tpParams = {item:obj}\n      if (!obj.npc) return falsemsg(lang.cannot_wait, tpParams)\n\n      return obj.endFollow() ? world.SUCCESS : world.FAILED\n    },\n  })\n\n  new Cmd('AskAbout', {\n    rules:[cmdRules.canTalkTo],\n    script:function(arr) {\n      if (!player().testTalk()) return false\n      if (!arr[0][0].askabout) return failedmsg(lang.cannot_ask_about, {char:player(), item:arr[0][0], text:arr[2]})\n\n      return arr[0][0].askabout(arr[2], arr[1]) ? world.SUCCESS : world.FAILED\n    },\n    objects:[\n      {scope:parser.isNpcAndHere},\n      {special:'text'},\n      {special:'text'},\n    ]\n  })\n  new Cmd('TellAbout', {\n    rules:[cmdRules.canTalkTo],\n    script:function(arr) {\n      if (!player().testTalk()) return false\n      if (!arr[0][0].tellabout) return failedmsg(lang.cannot_tell_about, {char:player(), item:arr[0][0], text:arr[1]})\n\n      return arr[0][0].tellabout(arr[2], arr[1]) ? world.SUCCESS : world.FAILED\n    },\n    objects:[\n      {scope:parser.isNpcAndHere},\n      {special:'text'},\n      {special:'text'},\n    ]\n  })\n  new Cmd('TalkAbout', {\n    rules:[cmdRules.canTalkTo],\n    //score:1, // to override TALK TO\n    script:function(arr) {\n      if (!player().testTalk()) return false\n      if (!arr[0][0].tellabout && !arr[0][0].askabout) return failedmsg(lang.cannot_tell_about, {char:player(), item:arr[0][0], text:arr[1]})\n\n      return arr[0][0].talkabout(arr[2], arr[1]) ? world.SUCCESS : world.FAILED\n    },\n    objects:[\n      {scope:parser.isNpcAndHere},\n      {special:'text'},\n      {special:'text'},\n    ]\n  })\n\nfor (const s of ['In', 'Out', 'Up', 'Down', 'Through']) {\n  new Cmd('Go' + s + 'Item', {\n    objects:[{scope:parser.isHere, attName:\"go\" + s + \"Direction\"}],\n    dirType:s,\n    script:function(objects) {\n      if (typeof objects[0][0][\"go\" + this.dirType + \"Item\"] === 'string') {\n        return failedmsg(objects[0][0][\"go\" + this.dirType + \"Item\"], {char:player(), item:objects[0][0]})\n      }\n      return loc().goItem(objects[0][0], this.dirType)\n    },\n  })\n  new Cmd('NpcGo' + s + 'Item', {\n    objects:[\n      {scope:parser.isHere, attName:\"npc\"},\n      {scope:parser.isHere, attName:\"go\" + s + \"Direction\"},\n    ],\n    dirType:s,\n    script:function(objects) {\n      if (typeof objects[1][0][\"go\" + this.dirType + \"Item\"] === 'string') {\n        return failedmsg(objects[1][0][\"go\" + this.dirType + \"Item\"], {char:objects[0][0], item:objects[1][0]})\n      }\n      return loc().goItem(objects[1][0], this.dirType, objects[0][0])\n    },\n  })\n}\n\nfor (const el of lang.questions) {\n  new Cmd('Question' + verbify(el.q), {\n    regex:new RegExp('^' + el.q + '\\\\??$'),\n    objects:[],\n    script:el.script,\n  })\n}\n\n// DEBUG commands\n\nif (settings.playMode === 'dev') {\n  new Cmd('DebugWalkThrough', {\n    objects:[\n      {special:'text'},\n    ],\n    script:function(objects) {\n        // todo wtf walkthroughts\n      if (typeof walkthroughs === \"undefined\") {\n        metamsg(\"No walkthroughs set\")\n        return world.FAILED\n      }\n      const wt = walkthroughs[objects[0]]\n      if (wt === undefined) return failedmsg(\"No walkthrough found called \" + objects[0])\n      settings.walkthroughInProgress = true\n      for (let el of wt) {\n        if (typeof el === \"string\") {\n          runCmd(el)\n        }\n        else if (typeof el === \"function\") {\n          el()\n        }\n        else {\n          settings.walkthroughMenuResponses = Array.isArray(el.menu) ? el.menu : [el.menu]\n          runCmd(el.cmd)\n          settings.walkthroughMenuResponses = []\n        }\n      }\n      settings.walkthroughInProgress = false\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n\n  new Cmd('DebugInspect', {\n    script:function(arr) {\n      const item = arr[0][0];\n      debugmsg(\"See the console for details on the object \" + item.name + \" (press F12 to world. the console)\");\n      console.log(item);\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n    objects:[\n      {scope:parser.isInWorld},\n    ],\n  })\n\n  new Cmd('DebugInspectByName', {\n    script:function(arr) {\n      const item_name = arr[0]\n      if (!w[item_name]) {\n        debugmsg(\"No object called \" + item_name);\n        return world.FAILED;\n      }\n\n      debugmsg(\"See the console for details on the object \" + item_name + \" (press F12 to world. the console)\");\n      console.log(w[item_name]);\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n    objects:[\n      {special:'text'},\n    ],\n  })\n\n  new Cmd('DebugWarpName', {\n    script:function(arr) {\n      const o = w[arr[0]]\n      if (!o) {\n        debugmsg(\"No object called \" + arr[0]);\n        return world.FAILED;\n      }\n\n      if (o.room) {\n        player().loc = o.name\n        debugmsg(\"Moved to \" + o.name)\n      }\n      else {\n        o.loc = player().name\n        delete o.scenery\n        debugmsg(\"Retrieved \" + o.name + \" (as long as it uses the \\\"loc\\\" attribute normally)\")\n      }\n      return world.SUCCESS\n    },\n    objects:[\n      {special:'text'},\n    ],\n  })\n\n  new Cmd('DebugTest', {\n    script:function() {\n      if (!settings.tests) {\n        metamsg('The TEST command is for unit testing during game development, and is not activated (F12 for more).')\n        console.log('To activate testing in your game, set settings.tests to true. More details here: https://github.com/ThePix/QuestJS/wiki/Unit-testing')\n        return world.SUCCESS_NO_TURNSCRIPTS;\n      }\n      if (typeof test.runTests !== 'function') {\n        console.log(test)\n        return world.FAILED\n      }\n      test.runTests();\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n  })\n\n  new Cmd('DebugInspectCommand', {\n    script:function(arr) {\n      debugmsg (\"Looking for \" + arr[0]);\n      for (let cmd of commands) {\n        if (cmd.name.toLowerCase() === arr[0] || (cmd.cmdCategory && cmd.cmdCategory.toLowerCase() === arr[0])) {\n          debugmsg(\"Name: \" + cmd.name);\n          for (let key in cmd) {\n            if (cmd.hasOwnProperty(key)) {\n               debugmsg(\"--\" + key + \": \" + cmd[key]);\n            }\n          }\n        }\n      }\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n    objects:[\n      {special:'text'},\n    ],\n  })\n\n  new Cmd('DebugListCommands', {\n    script:function(arr) {\n      let count = 0;\n      for (let cmd of commands) {\n        if (!cmd.name.match(/\\d$/)) {\n          let s = cmd.name + \" (\" + cmd.regex\n\n          let altCmd\n          let n = 2\n          do {\n            altCmd = commands.find(el => el.name === cmd.name + n)\n            if (altCmd) s += \" or \" + altCmd.regex\n            n++\n          } while (altCmd)\n          s += \")\"\n\n          const npcCmd = commands.find(el => el.name === \"Npc\" + cmd.name + \"2\")\n          if (npcCmd) s += \" - NPC too\"\n          debugmsg(s);\n          count++;\n        }\n      }\n      debugmsg(\"... Found \" + count + \" commands.\");\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n    objects:[\n    ],\n  })\n\n  new Cmd('DebugListCommands2', {\n    script:function(arr) {\n      let count = 0;\n      for (let cmd of commands) {\n        let s = cmd.name + \" (\" + cmd.regex + \")\"\n        debugmsg(s);\n        count++;\n      }\n      debugmsg(\"... Found \" + count + \" commands.\");\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n    objects:[\n    ],\n  })\n\n  new Cmd('DebugParserToggle', {\n    script:function(arr) {\n      if (parser.debug) {\n        parser.debug = false\n        debugmsg (\"Parser debugging messages are off.\");\n      }\n      else {\n        parser.debug = true\n        debugmsg (\"Parser debugging messages are on.\");\n      }\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n    objects:[\n    ],\n  })\n\n  new Cmd('DebugStats', {\n    script:function(arr) {\n      for (const el of settings.statsData) el.count = 0\n      for (const key in w) {\n        for (const el of settings.statsData) {\n          const res = el.test(w[key])\n          if (res === true) el.count++\n          if (typeof res === 'number') el.count += res\n        }\n      }\n      for (const el of settings.statsData) {\n        debugmsg(el.name + \": \" + el.count)\n      }\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n    objects:[\n    ],\n  })\n\n\n  new Cmd('DebugHighlight', {\n    script:function(arr) {\n      for (const el of document.querySelectorAll('.parser')) {\n        el.style.color = 'black'\n        el.style.backgroundColor = 'yellow'\n      }\n      for (const el of document.querySelectorAll('.error')) {\n        el.style.backgroundColor = 'yellow'\n      }\n      for (const el of document.querySelectorAll('.meta')) {\n        el.style.color = 'black'\n        el.style.backgroundColor = '#8f8'\n      }\n      debugmsg (\"Previous parser and error messages are now highlighted.\");\n      return world.SUCCESS_NO_TURNSCRIPTS;\n    },\n    objects:[\n    ],\n  })\n\n\n  new Cmd('MetaTranscriptWalkthrough', {\n    script:function() {\n      saveLoad.transcriptWalk()\n      return world.SUCCESS_NO_TURNSCRIPTS\n    },\n  })\n\n}\n\n// Functions used by commands\n// (but not in the commands array)\n\n// Cannot handle multiple vessels\n// want to transfer a fluid from a source to a sink\n\nexport function handleFillFromUnknown(char, sink, fluid) {\n  // fluid can be undefined\n  const options = {fluid:fluid}\n  if (!util.findSource(options)) return failedmsg(fluid ? lang.no_fluid_here : lang.no_fluid_here_at_all, options)\n  if (options.source.vessel) return handleFillFromVessel(char, options.source, sink, options.fluid)\n  return handleFillFromSource(char, options.source, sink, options.fluid)\n}\n\nexport function handleFillFromVessel(char, source, sink, fluid) {\n  // fluid can be undefined\n  if (!fluid) fluid = source.containedFluidName\n  const options = {char:char, source:source, fluid:fluid, item:sink}\n\n  if (!source.vessel) return failedmsg(lang.not_vessel, options)\n  if (source.closed) return  failedmsg(lang.container_closed, options)\n  if (!source.containedFluidName) return failedmsg(lang.already_empty, options)\n  if (!sink.vessel && !sink.sink) return failedmsg(lang.not_sink, options)\n  if (sink.vessel && sink.containedFluidName) return failedmsg(lang.already_full, options)\n  if (!char.testManipulate(source, \"fill\")) return world.FAILED\n  if (!char.getAgreement(\"Fill\", {source:source, sink:sink, fluid:fluid})) return world.FAILED\n  if (!source.isAtLoc(char.name)) return failedmsg(lang.not_carrying, options)\n  if (source.containedFluidName !== fluid) return failedmsg(lang.no_fluid_here, options);\n  return source.doEmpty(options) ? world.SUCCESS: world.FAILED;\n}\n\nexport function handleFillFromSource(char, source, sink, fluid) {\n  const options = {char:char, source:source, fluid:fluid, item:sink}\n\n  if (!source.isSourceOf) return failedmsg(lang.not_source, options)\n  if (source.closed) return  failedmsg(lang.container_closed, options)\n  if (!sink.vessel) return failedmsg(lang.not_vessel, options)\n  if (sink.containedFluidName) return failedmsg(lang.already_full, options)\n  if (!char.testManipulate(sink, \"fill\")) return world.FAILED\n  if (!char.getAgreement(\"Fill\", {source:source, sink:sink, fluid:fluid})) return world.FAILED\n  // if the source is the room itself, we assume it is here\n  if (!source.room && !source.isAtLoc(char.loc)) return failedmsg(lang.not_here, options)\n  if (!source.isSourceOf(fluid)) return failedmsg(lang.no_fluid_here, options)\n  return sink.doFill(options) ? world.SUCCESS: world.FAILED;\n}\n\nexport function handleEmptyFluidInto(char, sink, fluid) {\n  for (const key in w) {\n    const o = w[key]\n    if (o.vessel && o.containedFluidName === fluid && o.loc === char.name) {\n      return handleFillFromVessel(char, o, sink, fluid)\n    }\n  }\n  return failedmsg(lang.not_carrying_fluid, {char:char, fluid:fluid});\n}\n\nexport function handleInOutContainer(char, objects, verb, func) {\n  let success = false;\n  const container = objects[1][0];\n  const options = {char:char, container:container, verb:verb, multiple:objects[0].length > 1 || parser.currentCommand.all}\n\n  if (container.handleInOutContainer) return container.handleInOutContainer(options, objects[0])\n\n  if (!container.container) return failedmsg(lang.not_container, options)\n  if (container.closed) {\n    if (container.containerAutoOpen) {\n      if (!container.open({char:char, item:container})) return false\n    }\n    else if (!container.containerIgnoreClosed) {\n      return failedmsg(lang.container_closed, options)\n    }\n  }\n\n  for (const obj of objects[0]) {\n    if (!char.testManipulate(obj, verb)) return world.FAILED\n    options.count = obj.countable ? obj.extractNumber() : undefined\n    options.item = obj\n    if (options.count) options[obj.name + '_count'] = options.count  // for the text processor\n    const flag = func(char, container, obj, options)\n    success = success || flag\n  }\n  if (success) char.pause();\n  return success ? world.SUCCESS : world.FAILED;\n}\n\nexport function handleSingleDropInContainer(char, container, obj, options) {\n  options.fromLoc = char.name\n  options.toLoc = container.name\n  if (!char.getAgreement(\"Drop/in\", {item:obj, container:container})) return\n  if (!container.testForRecursion(char, obj)) return false\n  if (obj.testDrop && !obj.testDrop(options)) return false\n  if (!obj.msgDropIn) return falsemsg(lang.cannot_drop, options)\n  if (container.testDropIn && !container.testDropIn(options)) return false\n  if (!obj.isAtLoc(char.name)) return failedmsg(lang.not_carrying, {char:char, item:obj})\n  if (obj.getTakeDropCount) obj.getTakeDropCount(options, char.name)\n\n  if (typeof obj.msgDropIn === 'function') {\n    obj.msgDropIn(options)\n  }\n  else {\n    msg(obj.msgDropIn, options)\n  }\n  obj.moveToFrom(options)\n  return true;\n}\n\nexport function handleSingleTakeOutContainer(char, container, obj, options) {\n  options.toLoc = char.name\n  options.fromLoc = container.name\n  if (!char.getAgreement(\"Take\", {item:obj})) return false\n  if (!obj.isAtLoc(container.name)) return failedmsg(lang.not_inside, {container:container, item:obj})\n  if (obj.getTakeDropCount) obj.getTakeDropCount(options, container.name)\n  if (obj.testTake && !obj.testTake(options)) return false\n  if (container.testTakeOut && !container.testTakeOut(options)) return false\n\n  msg(obj.msgTakeOut, options)\n  obj.moveToFrom(options)\n  return true\n}\n\nexport function handleGiveToNpc(char, objects) {\n  let success = false;\n  const npc = objects[1][0];\n  const multiple = objects[0].length > 1 || parser.currentCommand.all;\n  if (!npc.npc && npc !== player()) return failedmsg(lang.not_npc_for_give, {char:char, item:npc})\n  if (!npc.handleGiveTo) log(npc)\n\n  for (const obj of objects[0]) {\n    const flag = npc.handleGiveTo({char:char, npc:npc, multiple:multiple, item:obj, toLoc:npc.name, fromLoc:char.name})\n    success = success || flag\n  }\n  // noinspection EqualityComparisonWithCoercionJS\n    if (success == world.SUCCESS) char.pause();\n  return success ? world.SUCCESS : world.FAILED;\n}\n\nexport function handleStandUp(objects) {\n  let char\n  if (objects.length === 0) {\n    char = player()\n  }\n  else {\n    const npc = objects[0][0]\n    if (!npc.npc) {\n      failedmsg(lang.not_npc, {char:player(), item:npc});\n      return world.FAILED;\n    }\n    if (!npc.posture) {\n      failedmsg(lang.already, {item:npc});\n      return world.FAILED;\n    }\n    if (!npc.getAgreement(\"Posture\", {posture:\"stand\"})) {\n      // The getAgreement should give the response\n      return world.FAILED;\n    }\n    char = npc\n  }\n\n  if (!char.testPosture()) {\n    return world.FAILED;\n  }\n  if (char.posture) {\n    msg(lang.stop_posture(char))\n    char.pause();\n    return world.SUCCESS;\n  }\n}\n\n// we know the char can manipulate, we know the obj is here and not held\nexport function handlePushExit(char, objects) {\n  const verb = objects[0]\n  const obj = objects[1][0];\n  const dir = getDir(objects[2]);\n  const room = w[char.loc]\n  const tpParams = {char:char, item:obj, dir:dir}\n\n  if (!obj.shiftable && obj.takeable) return failedmsg(lang.take_not_push, tpParams)\n  if (!obj.shiftable) return failedmsg(lang.cannot_push, tpParams)\n  if (!room[dir] || room[dir].isHidden()) return failedmsg(lang.not_that_way, tpParams)\n  if (room[dir].isLocked()) return failedmsg(lang.locked_exit, {char:char, exit:room[dir]})\n  if (typeof room[dir].noShiftingMsg === \"function\") return failedmsg(room[dir].noShiftingMsg(char, item))\n  if (typeof room[dir].noShiftingMsg === \"string\") return failedmsg(room[dir].noShiftingMsg)\n  if (!char.getAgreement(\"Push\", {item:obj, dir:dir})) return false\n\n  if (typeof obj.shift === \"function\") {\n    const res = obj.shift(char, dir, verb);\n    return res ? world.SUCCESS : world.FAILED;\n  }\n\n  // by default, objects cannot be pushed up\n  if (dir === \"up\") {\n    msg(lang.cannot_push_up, tpParams);\n    return world.FAILED;\n  }\n\n  // not using moveToFrom; if there are\n  const dest = room[dir].name;\n  obj.moveToFrom({char:char, toLoc:dest, item:obj});\n  char.loc = dest;\n  tpParams.dest = w[dest]\n  msg(lang.push_exit_successful, tpParams);\n  return world.SUCCESS;\n}\n"],"names":["log","char","item","i","node","msg","result","x","sep","list","w","func","test","name","loc","npc","this","saveAs","URL","comment","hash","c","prefix","subject","options","input","fn","margin","el","s","rule","picocolors_browserModule","require$$0","terminalHighlight","require$$1","CssSyntaxError","root","Stringifier","stringify","isClean","my","require$$2","require$$3","stringifier","Node","Declaration","nanoid","SourceMapConsumer","SourceMapGenerator","dirname","map","PreviousMap","pathToFileURL","resolve","require$$4","require$$5","require$$6","sourceMapAvailable","pathAvailable","Input","MapGenerator","Comment","parse","Rule","AtRule","Root","Container","container","LazyResult","Processor","Document","document","warnOnce","Warning","processor","warning","Result","tokenizer","array","spaces","open","parser","Parser","require$$7","require$$8","postcss","self","NoWorkResult","fromJSON","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","o","slots","res","params","agenda"],"mappings":"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","x_google_ignoreList":[9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39]}