{"version":3,"sources":["../../../../node_modules/fs.realpath/old.js","../../../../node_modules/fs.realpath/index.js","../../../../node_modules/concat-map/index.js","../../../../node_modules/balanced-match/index.js","../../../../node_modules/brace-expansion/index.js","../../../../node_modules/minimatch/minimatch.js","../../../../node_modules/inherits/inherits_browser.js","../../../../node_modules/inherits/inherits.js","../../../../node_modules/path-is-absolute/index.js","../../../../node_modules/glob/common.js","../../../../node_modules/glob/sync.js","../../../../node_modules/wrappy/wrappy.js","../../../../node_modules/once/once.js","../../../../node_modules/inflight/inflight.js","../../../../node_modules/glob/glob.js","../../../../node_modules/rimraf/rimraf.js","../node_modules/tmp/lib/tmp.js","../src/index.ts","../src/shared/globals.ts","../src/shared/tajriba_connection.ts","../src/utils/console.ts","../src/utils/object.ts","../src/admin/attributes.ts","../src/shared/attributes.ts","../src/admin/connection.ts","../src/admin/observables.ts","../src/admin/context.ts","../src/admin/runloop.ts","../src/admin/cake.ts","../src/admin/events.ts","../src/admin/participants.ts","../src/admin/scopes.ts","../src/shared/scopes.ts","../src/admin/transitions.ts","../src/admin/token_file.ts","../src/admin/classic/api/connection_test_helper.ts","../src/admin/classic/classic.ts","../src/utils/random.ts","../src/admin/classic/helpers.ts","../src/admin/classic/models.ts","../src/admin/classic/schemas.ts","../src/admin/classic/api/api.ts","../src/admin/classic/export/export_csv.ts","../src/admin/classic/loader.ts","../src/admin/classic/lobby.ts","../src/admin/classic/proxy.ts","../src/player/provider.ts","../src/player/scopes.ts","../src/player/steps.ts","../src/player/utils.ts","../src/player/classic/classic.ts","../src/player/classic/react/EmpiricaContext.tsx","../src/player/react/Consent.tsx","../src/player/react/Finished.tsx","../src/player/react/Loading.tsx","../src/player/react/NoGames.tsx","../src/player/react/PlayerCreate.tsx","../src/player/react/hooks.ts","../src/player/react/EmpiricaParticipant.tsx","../src/player/context.ts","../src/player/connection.ts","../src/player/classic/react/Lobby.tsx","../src/player/classic/react/hooks.ts","../src/player/classic/react/Steps.tsx","../src/player/classic/react/Quiz.tsx","../src/player/classic/react/Slider.tsx","../src/player/classic/react/chat/Chat.tsx","../src/player/react/EmpiricaMenu.tsx","../src/player/react/Logo.tsx","../src/player/classic/react/examples/Sweeper.tsx"],"sourcesContent":["// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar pathModule = require('path');\nvar isWindows = process.platform === 'win32';\nvar fs = require('fs');\n\n// JavaScript implementation of realpath, ported from node pre-v6\n\nvar DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);\n\nfunction rethrow() {\n  // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and\n  // is fairly slow to generate.\n  var callback;\n  if (DEBUG) {\n    var backtrace = new Error;\n    callback = debugCallback;\n  } else\n    callback = missingCallback;\n\n  return callback;\n\n  function debugCallback(err) {\n    if (err) {\n      backtrace.message = err.message;\n      err = backtrace;\n      missingCallback(err);\n    }\n  }\n\n  function missingCallback(err) {\n    if (err) {\n      if (process.throwDeprecation)\n        throw err;  // Forgot a callback but don't know where? Use NODE_DEBUG=fs\n      else if (!process.noDeprecation) {\n        var msg = 'fs: missing callback ' + (err.stack || err.message);\n        if (process.traceDeprecation)\n          console.trace(msg);\n        else\n          console.error(msg);\n      }\n    }\n  }\n}\n\nfunction maybeCallback(cb) {\n  return typeof cb === 'function' ? cb : rethrow();\n}\n\nvar normalize = pathModule.normalize;\n\n// Regexp that finds the next partion of a (partial) path\n// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']\nif (isWindows) {\n  var nextPartRe = /(.*?)(?:[\\/\\\\]+|$)/g;\n} else {\n  var nextPartRe = /(.*?)(?:[\\/]+|$)/g;\n}\n\n// Regex to find the device root, including trailing slash. E.g. 'c:\\\\'.\nif (isWindows) {\n  var splitRootRe = /^(?:[a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/][^\\\\\\/]+)?[\\\\\\/]*/;\n} else {\n  var splitRootRe = /^[\\/]*/;\n}\n\nexports.realpathSync = function realpathSync(p, cache) {\n  // make p is absolute\n  p = pathModule.resolve(p);\n\n  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {\n    return cache[p];\n  }\n\n  var original = p,\n      seenLinks = {},\n      knownHard = {};\n\n  // current character position in p\n  var pos;\n  // the partial path so far, including a trailing slash if any\n  var current;\n  // the partial path without a trailing slash (except when pointing at a root)\n  var base;\n  // the partial path scanned in the previous round, with slash\n  var previous;\n\n  start();\n\n  function start() {\n    // Skip over roots\n    var m = splitRootRe.exec(p);\n    pos = m[0].length;\n    current = m[0];\n    base = m[0];\n    previous = '';\n\n    // On windows, check that the root exists. On unix there is no need.\n    if (isWindows && !knownHard[base]) {\n      fs.lstatSync(base);\n      knownHard[base] = true;\n    }\n  }\n\n  // walk down the path, swapping out linked pathparts for their real\n  // values\n  // NB: p.length changes.\n  while (pos < p.length) {\n    // find the next part\n    nextPartRe.lastIndex = pos;\n    var result = nextPartRe.exec(p);\n    previous = current;\n    current += result[0];\n    base = previous + result[1];\n    pos = nextPartRe.lastIndex;\n\n    // continue if not a symlink\n    if (knownHard[base] || (cache && cache[base] === base)) {\n      continue;\n    }\n\n    var resolvedLink;\n    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {\n      // some known symbolic link.  no need to stat again.\n      resolvedLink = cache[base];\n    } else {\n      var stat = fs.lstatSync(base);\n      if (!stat.isSymbolicLink()) {\n        knownHard[base] = true;\n        if (cache) cache[base] = base;\n        continue;\n      }\n\n      // read the link if it wasn't read before\n      // dev/ino always return 0 on windows, so skip the check.\n      var linkTarget = null;\n      if (!isWindows) {\n        var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);\n        if (seenLinks.hasOwnProperty(id)) {\n          linkTarget = seenLinks[id];\n        }\n      }\n      if (linkTarget === null) {\n        fs.statSync(base);\n        linkTarget = fs.readlinkSync(base);\n      }\n      resolvedLink = pathModule.resolve(previous, linkTarget);\n      // track this, if given a cache.\n      if (cache) cache[base] = resolvedLink;\n      if (!isWindows) seenLinks[id] = linkTarget;\n    }\n\n    // resolve the link, then start over\n    p = pathModule.resolve(resolvedLink, p.slice(pos));\n    start();\n  }\n\n  if (cache) cache[original] = p;\n\n  return p;\n};\n\n\nexports.realpath = function realpath(p, cache, cb) {\n  if (typeof cb !== 'function') {\n    cb = maybeCallback(cache);\n    cache = null;\n  }\n\n  // make p is absolute\n  p = pathModule.resolve(p);\n\n  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {\n    return process.nextTick(cb.bind(null, null, cache[p]));\n  }\n\n  var original = p,\n      seenLinks = {},\n      knownHard = {};\n\n  // current character position in p\n  var pos;\n  // the partial path so far, including a trailing slash if any\n  var current;\n  // the partial path without a trailing slash (except when pointing at a root)\n  var base;\n  // the partial path scanned in the previous round, with slash\n  var previous;\n\n  start();\n\n  function start() {\n    // Skip over roots\n    var m = splitRootRe.exec(p);\n    pos = m[0].length;\n    current = m[0];\n    base = m[0];\n    previous = '';\n\n    // On windows, check that the root exists. On unix there is no need.\n    if (isWindows && !knownHard[base]) {\n      fs.lstat(base, function(err) {\n        if (err) return cb(err);\n        knownHard[base] = true;\n        LOOP();\n      });\n    } else {\n      process.nextTick(LOOP);\n    }\n  }\n\n  // walk down the path, swapping out linked pathparts for their real\n  // values\n  function LOOP() {\n    // stop if scanned past end of path\n    if (pos >= p.length) {\n      if (cache) cache[original] = p;\n      return cb(null, p);\n    }\n\n    // find the next part\n    nextPartRe.lastIndex = pos;\n    var result = nextPartRe.exec(p);\n    previous = current;\n    current += result[0];\n    base = previous + result[1];\n    pos = nextPartRe.lastIndex;\n\n    // continue if not a symlink\n    if (knownHard[base] || (cache && cache[base] === base)) {\n      return process.nextTick(LOOP);\n    }\n\n    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {\n      // known symbolic link.  no need to stat again.\n      return gotResolvedLink(cache[base]);\n    }\n\n    return fs.lstat(base, gotStat);\n  }\n\n  function gotStat(err, stat) {\n    if (err) return cb(err);\n\n    // if not a symlink, skip to the next path part\n    if (!stat.isSymbolicLink()) {\n      knownHard[base] = true;\n      if (cache) cache[base] = base;\n      return process.nextTick(LOOP);\n    }\n\n    // stat & read the link if not read before\n    // call gotTarget as soon as the link target is known\n    // dev/ino always return 0 on windows, so skip the check.\n    if (!isWindows) {\n      var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);\n      if (seenLinks.hasOwnProperty(id)) {\n        return gotTarget(null, seenLinks[id], base);\n      }\n    }\n    fs.stat(base, function(err) {\n      if (err) return cb(err);\n\n      fs.readlink(base, function(err, target) {\n        if (!isWindows) seenLinks[id] = target;\n        gotTarget(err, target);\n      });\n    });\n  }\n\n  function gotTarget(err, target, base) {\n    if (err) return cb(err);\n\n    var resolvedLink = pathModule.resolve(previous, target);\n    if (cache) cache[base] = resolvedLink;\n    gotResolvedLink(resolvedLink);\n  }\n\n  function gotResolvedLink(resolvedLink) {\n    // resolve the link, then start over\n    p = pathModule.resolve(resolvedLink, p.slice(pos));\n    start();\n  }\n};\n","module.exports = realpath\nrealpath.realpath = realpath\nrealpath.sync = realpathSync\nrealpath.realpathSync = realpathSync\nrealpath.monkeypatch = monkeypatch\nrealpath.unmonkeypatch = unmonkeypatch\n\nvar fs = require('fs')\nvar origRealpath = fs.realpath\nvar origRealpathSync = fs.realpathSync\n\nvar version = process.version\nvar ok = /^v[0-5]\\./.test(version)\nvar old = require('./old.js')\n\nfunction newError (er) {\n  return er && er.syscall === 'realpath' && (\n    er.code === 'ELOOP' ||\n    er.code === 'ENOMEM' ||\n    er.code === 'ENAMETOOLONG'\n  )\n}\n\nfunction realpath (p, cache, cb) {\n  if (ok) {\n    return origRealpath(p, cache, cb)\n  }\n\n  if (typeof cache === 'function') {\n    cb = cache\n    cache = null\n  }\n  origRealpath(p, cache, function (er, result) {\n    if (newError(er)) {\n      old.realpath(p, cache, cb)\n    } else {\n      cb(er, result)\n    }\n  })\n}\n\nfunction realpathSync (p, cache) {\n  if (ok) {\n    return origRealpathSync(p, cache)\n  }\n\n  try {\n    return origRealpathSync(p, cache)\n  } catch (er) {\n    if (newError(er)) {\n      return old.realpathSync(p, cache)\n    } else {\n      throw er\n    }\n  }\n}\n\nfunction monkeypatch () {\n  fs.realpath = realpath\n  fs.realpathSync = realpathSync\n}\n\nfunction unmonkeypatch () {\n  fs.realpath = origRealpath\n  fs.realpathSync = origRealpathSync\n}\n","module.exports = function (xs, fn) {\n    var res = [];\n    for (var i = 0; i < xs.length; i++) {\n        var x = fn(xs[i], i);\n        if (isArray(x)) res.push.apply(res, x);\n        else res.push(x);\n    }\n    return res;\n};\n\nvar isArray = Array.isArray || function (xs) {\n    return Object.prototype.toString.call(xs) === '[object Array]';\n};\n","'use strict';\nmodule.exports = balanced;\nfunction balanced(a, b, str) {\n  if (a instanceof RegExp) a = maybeMatch(a, str);\n  if (b instanceof RegExp) b = maybeMatch(b, str);\n\n  var r = range(a, b, str);\n\n  return r && {\n    start: r[0],\n    end: r[1],\n    pre: str.slice(0, r[0]),\n    body: str.slice(r[0] + a.length, r[1]),\n    post: str.slice(r[1] + b.length)\n  };\n}\n\nfunction maybeMatch(reg, str) {\n  var m = str.match(reg);\n  return m ? m[0] : null;\n}\n\nbalanced.range = range;\nfunction range(a, b, str) {\n  var begs, beg, left, right, result;\n  var ai = str.indexOf(a);\n  var bi = str.indexOf(b, ai + 1);\n  var i = ai;\n\n  if (ai >= 0 && bi > 0) {\n    if(a===b) {\n      return [ai, bi];\n    }\n    begs = [];\n    left = str.length;\n\n    while (i >= 0 && !result) {\n      if (i == ai) {\n        begs.push(i);\n        ai = str.indexOf(a, i + 1);\n      } else if (begs.length == 1) {\n        result = [ begs.pop(), bi ];\n      } else {\n        beg = begs.pop();\n        if (beg < left) {\n          left = beg;\n          right = bi;\n        }\n\n        bi = str.indexOf(b, i + 1);\n      }\n\n      i = ai < bi && ai >= 0 ? ai : bi;\n    }\n\n    if (begs.length) {\n      result = [ left, right ];\n    }\n  }\n\n  return result;\n}\n","var concatMap = require('concat-map');\nvar balanced = require('balanced-match');\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n  return parseInt(str, 10) == str\n    ? parseInt(str, 10)\n    : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n  return str.split('\\\\\\\\').join(escSlash)\n            .split('\\\\{').join(escOpen)\n            .split('\\\\}').join(escClose)\n            .split('\\\\,').join(escComma)\n            .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n  return str.split(escSlash).join('\\\\')\n            .split(escOpen).join('{')\n            .split(escClose).join('}')\n            .split(escComma).join(',')\n            .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n  if (!str)\n    return [''];\n\n  var parts = [];\n  var m = balanced('{', '}', str);\n\n  if (!m)\n    return str.split(',');\n\n  var pre = m.pre;\n  var body = m.body;\n  var post = m.post;\n  var p = pre.split(',');\n\n  p[p.length-1] += '{' + body + '}';\n  var postParts = parseCommaParts(post);\n  if (post.length) {\n    p[p.length-1] += postParts.shift();\n    p.push.apply(p, postParts);\n  }\n\n  parts.push.apply(parts, p);\n\n  return parts;\n}\n\nfunction expandTop(str) {\n  if (!str)\n    return [];\n\n  // I don't know why Bash 4.3 does this, but it does.\n  // Anything starting with {} will have the first two bytes preserved\n  // but *only* at the top level, so {},a}b will not expand to anything,\n  // but a{},b}c will be expanded to [a}c,abc].\n  // One could argue that this is a bug in Bash, but since the goal of\n  // this module is to match Bash's rules, we escape a leading {}\n  if (str.substr(0, 2) === '{}') {\n    str = '\\\\{\\\\}' + str.substr(2);\n  }\n\n  return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction identity(e) {\n  return e;\n}\n\nfunction embrace(str) {\n  return '{' + str + '}';\n}\nfunction isPadded(el) {\n  return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n  return i <= y;\n}\nfunction gte(i, y) {\n  return i >= y;\n}\n\nfunction expand(str, isTop) {\n  var expansions = [];\n\n  var m = balanced('{', '}', str);\n  if (!m || /\\$$/.test(m.pre)) return [str];\n\n  var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n  var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n  var isSequence = isNumericSequence || isAlphaSequence;\n  var isOptions = m.body.indexOf(',') >= 0;\n  if (!isSequence && !isOptions) {\n    // {a},b}\n    if (m.post.match(/,.*\\}/)) {\n      str = m.pre + '{' + m.body + escClose + m.post;\n      return expand(str);\n    }\n    return [str];\n  }\n\n  var n;\n  if (isSequence) {\n    n = m.body.split(/\\.\\./);\n  } else {\n    n = parseCommaParts(m.body);\n    if (n.length === 1) {\n      // x{{a,b}}y ==> x{a}y x{b}y\n      n = expand(n[0], false).map(embrace);\n      if (n.length === 1) {\n        var post = m.post.length\n          ? expand(m.post, false)\n          : [''];\n        return post.map(function(p) {\n          return m.pre + n[0] + p;\n        });\n      }\n    }\n  }\n\n  // at this point, n is the parts, and we know it's not a comma set\n  // with a single entry.\n\n  // no need to expand pre, since it is guaranteed to be free of brace-sets\n  var pre = m.pre;\n  var post = m.post.length\n    ? expand(m.post, false)\n    : [''];\n\n  var N;\n\n  if (isSequence) {\n    var x = numeric(n[0]);\n    var y = numeric(n[1]);\n    var width = Math.max(n[0].length, n[1].length)\n    var incr = n.length == 3\n      ? Math.abs(numeric(n[2]))\n      : 1;\n    var test = lte;\n    var reverse = y < x;\n    if (reverse) {\n      incr *= -1;\n      test = gte;\n    }\n    var pad = n.some(isPadded);\n\n    N = [];\n\n    for (var i = x; test(i, y); i += incr) {\n      var c;\n      if (isAlphaSequence) {\n        c = String.fromCharCode(i);\n        if (c === '\\\\')\n          c = '';\n      } else {\n        c = String(i);\n        if (pad) {\n          var need = width - c.length;\n          if (need > 0) {\n            var z = new Array(need + 1).join('0');\n            if (i < 0)\n              c = '-' + z + c.slice(1);\n            else\n              c = z + c;\n          }\n        }\n      }\n      N.push(c);\n    }\n  } else {\n    N = concatMap(n, function(el) { return expand(el, false) });\n  }\n\n  for (var j = 0; j < N.length; j++) {\n    for (var k = 0; k < post.length; k++) {\n      var expansion = pre + N[j] + post[k];\n      if (!isTop || isSequence || expansion)\n        expansions.push(expansion);\n    }\n  }\n\n  return expansions;\n}\n\n","module.exports = minimatch\nminimatch.Minimatch = Minimatch\n\nvar path = (function () { try { return require('path') } catch (e) {}}()) || {\n  sep: '/'\n}\nminimatch.sep = path.sep\n\nvar GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}\nvar expand = require('brace-expansion')\n\nvar plTypes = {\n  '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},\n  '?': { open: '(?:', close: ')?' },\n  '+': { open: '(?:', close: ')+' },\n  '*': { open: '(?:', close: ')*' },\n  '@': { open: '(?:', close: ')' }\n}\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nvar qmark = '[^/]'\n\n// * => any number of characters\nvar star = qmark + '*?'\n\n// ** when dots are allowed.  Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nvar twoStarDot = '(?:(?!(?:\\\\\\/|^)(?:\\\\.{1,2})($|\\\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nvar twoStarNoDot = '(?:(?!(?:\\\\\\/|^)\\\\.).)*?'\n\n// characters that need to be escaped in RegExp.\nvar reSpecials = charSet('().*{}+?[]^$\\\\!')\n\n// \"abc\" -> { a:true, b:true, c:true }\nfunction charSet (s) {\n  return s.split('').reduce(function (set, c) {\n    set[c] = true\n    return set\n  }, {})\n}\n\n// normalizes slashes.\nvar slashSplit = /\\/+/\n\nminimatch.filter = filter\nfunction filter (pattern, options) {\n  options = options || {}\n  return function (p, i, list) {\n    return minimatch(p, pattern, options)\n  }\n}\n\nfunction ext (a, b) {\n  b = b || {}\n  var t = {}\n  Object.keys(a).forEach(function (k) {\n    t[k] = a[k]\n  })\n  Object.keys(b).forEach(function (k) {\n    t[k] = b[k]\n  })\n  return t\n}\n\nminimatch.defaults = function (def) {\n  if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n    return minimatch\n  }\n\n  var orig = minimatch\n\n  var m = function minimatch (p, pattern, options) {\n    return orig(p, pattern, ext(def, options))\n  }\n\n  m.Minimatch = function Minimatch (pattern, options) {\n    return new orig.Minimatch(pattern, ext(def, options))\n  }\n  m.Minimatch.defaults = function defaults (options) {\n    return orig.defaults(ext(def, options)).Minimatch\n  }\n\n  m.filter = function filter (pattern, options) {\n    return orig.filter(pattern, ext(def, options))\n  }\n\n  m.defaults = function defaults (options) {\n    return orig.defaults(ext(def, options))\n  }\n\n  m.makeRe = function makeRe (pattern, options) {\n    return orig.makeRe(pattern, ext(def, options))\n  }\n\n  m.braceExpand = function braceExpand (pattern, options) {\n    return orig.braceExpand(pattern, ext(def, options))\n  }\n\n  m.match = function (list, pattern, options) {\n    return orig.match(list, pattern, ext(def, options))\n  }\n\n  return m\n}\n\nMinimatch.defaults = function (def) {\n  return minimatch.defaults(def).Minimatch\n}\n\nfunction minimatch (p, pattern, options) {\n  assertValidPattern(pattern)\n\n  if (!options) options = {}\n\n  // shortcut: comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    return false\n  }\n\n  return new Minimatch(pattern, options).match(p)\n}\n\nfunction Minimatch (pattern, options) {\n  if (!(this instanceof Minimatch)) {\n    return new Minimatch(pattern, options)\n  }\n\n  assertValidPattern(pattern)\n\n  if (!options) options = {}\n\n  pattern = pattern.trim()\n\n  // windows support: need to use /, not \\\n  if (!options.allowWindowsEscape && path.sep !== '/') {\n    pattern = pattern.split(path.sep).join('/')\n  }\n\n  this.options = options\n  this.set = []\n  this.pattern = pattern\n  this.regexp = null\n  this.negate = false\n  this.comment = false\n  this.empty = false\n  this.partial = !!options.partial\n\n  // make the set of regexps etc.\n  this.make()\n}\n\nMinimatch.prototype.debug = function () {}\n\nMinimatch.prototype.make = make\nfunction make () {\n  var pattern = this.pattern\n  var options = this.options\n\n  // empty patterns and comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    this.comment = true\n    return\n  }\n  if (!pattern) {\n    this.empty = true\n    return\n  }\n\n  // step 1: figure out negation, etc.\n  this.parseNegate()\n\n  // step 2: expand braces\n  var set = this.globSet = this.braceExpand()\n\n  if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }\n\n  this.debug(this.pattern, set)\n\n  // step 3: now we have a set, so turn each one into a series of path-portion\n  // matching patterns.\n  // These will be regexps, except in the case of \"**\", which is\n  // set to the GLOBSTAR object for globstar behavior,\n  // and will not contain any / characters\n  set = this.globParts = set.map(function (s) {\n    return s.split(slashSplit)\n  })\n\n  this.debug(this.pattern, set)\n\n  // glob --> regexps\n  set = set.map(function (s, si, set) {\n    return s.map(this.parse, this)\n  }, this)\n\n  this.debug(this.pattern, set)\n\n  // filter out everything that didn't compile properly.\n  set = set.filter(function (s) {\n    return s.indexOf(false) === -1\n  })\n\n  this.debug(this.pattern, set)\n\n  this.set = set\n}\n\nMinimatch.prototype.parseNegate = parseNegate\nfunction parseNegate () {\n  var pattern = this.pattern\n  var negate = false\n  var options = this.options\n  var negateOffset = 0\n\n  if (options.nonegate) return\n\n  for (var i = 0, l = pattern.length\n    ; i < l && pattern.charAt(i) === '!'\n    ; i++) {\n    negate = !negate\n    negateOffset++\n  }\n\n  if (negateOffset) this.pattern = pattern.substr(negateOffset)\n  this.negate = negate\n}\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nminimatch.braceExpand = function (pattern, options) {\n  return braceExpand(pattern, options)\n}\n\nMinimatch.prototype.braceExpand = braceExpand\n\nfunction braceExpand (pattern, options) {\n  if (!options) {\n    if (this instanceof Minimatch) {\n      options = this.options\n    } else {\n      options = {}\n    }\n  }\n\n  pattern = typeof pattern === 'undefined'\n    ? this.pattern : pattern\n\n  assertValidPattern(pattern)\n\n  // Thanks to Yeting Li <https://github.com/yetingli> for\n  // improving this regexp to avoid a ReDOS vulnerability.\n  if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n    // shortcut. no need to expand.\n    return [pattern]\n  }\n\n  return expand(pattern)\n}\n\nvar MAX_PATTERN_LENGTH = 1024 * 64\nvar assertValidPattern = function (pattern) {\n  if (typeof pattern !== 'string') {\n    throw new TypeError('invalid pattern')\n  }\n\n  if (pattern.length > MAX_PATTERN_LENGTH) {\n    throw new TypeError('pattern is too long')\n  }\n}\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion.  Otherwise, any series\n// of * is equivalent to a single *.  Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\nMinimatch.prototype.parse = parse\nvar SUBPARSE = {}\nfunction parse (pattern, isSub) {\n  assertValidPattern(pattern)\n\n  var options = this.options\n\n  // shortcuts\n  if (pattern === '**') {\n    if (!options.noglobstar)\n      return GLOBSTAR\n    else\n      pattern = '*'\n  }\n  if (pattern === '') return ''\n\n  var re = ''\n  var hasMagic = !!options.nocase\n  var escaping = false\n  // ? => one single character\n  var patternListStack = []\n  var negativeLists = []\n  var stateChar\n  var inClass = false\n  var reClassStart = -1\n  var classStart = -1\n  // . and .. never match anything that doesn't start with .,\n  // even when options.dot is set.\n  var patternStart = pattern.charAt(0) === '.' ? '' // anything\n  // not (start or / followed by . or .. followed by / or end)\n  : options.dot ? '(?!(?:^|\\\\\\/)\\\\.{1,2}(?:$|\\\\\\/))'\n  : '(?!\\\\.)'\n  var self = this\n\n  function clearStateChar () {\n    if (stateChar) {\n      // we had some state-tracking character\n      // that wasn't consumed by this pass.\n      switch (stateChar) {\n        case '*':\n          re += star\n          hasMagic = true\n        break\n        case '?':\n          re += qmark\n          hasMagic = true\n        break\n        default:\n          re += '\\\\' + stateChar\n        break\n      }\n      self.debug('clearStateChar %j %j', stateChar, re)\n      stateChar = false\n    }\n  }\n\n  for (var i = 0, len = pattern.length, c\n    ; (i < len) && (c = pattern.charAt(i))\n    ; i++) {\n    this.debug('%s\\t%s %s %j', pattern, i, re, c)\n\n    // skip over any that are escaped.\n    if (escaping && reSpecials[c]) {\n      re += '\\\\' + c\n      escaping = false\n      continue\n    }\n\n    switch (c) {\n      /* istanbul ignore next */\n      case '/': {\n        // completely not allowed, even escaped.\n        // Should already be path-split by now.\n        return false\n      }\n\n      case '\\\\':\n        clearStateChar()\n        escaping = true\n      continue\n\n      // the various stateChar values\n      // for the \"extglob\" stuff.\n      case '?':\n      case '*':\n      case '+':\n      case '@':\n      case '!':\n        this.debug('%s\\t%s %s %j <-- stateChar', pattern, i, re, c)\n\n        // all of those are literals inside a class, except that\n        // the glob [!a] means [^a] in regexp\n        if (inClass) {\n          this.debug('  in class')\n          if (c === '!' && i === classStart + 1) c = '^'\n          re += c\n          continue\n        }\n\n        // if we already have a stateChar, then it means\n        // that there was something like ** or +? in there.\n        // Handle the stateChar, then proceed with this one.\n        self.debug('call clearStateChar %j', stateChar)\n        clearStateChar()\n        stateChar = c\n        // if extglob is disabled, then +(asdf|foo) isn't a thing.\n        // just clear the statechar *now*, rather than even diving into\n        // the patternList stuff.\n        if (options.noext) clearStateChar()\n      continue\n\n      case '(':\n        if (inClass) {\n          re += '('\n          continue\n        }\n\n        if (!stateChar) {\n          re += '\\\\('\n          continue\n        }\n\n        patternListStack.push({\n          type: stateChar,\n          start: i - 1,\n          reStart: re.length,\n          open: plTypes[stateChar].open,\n          close: plTypes[stateChar].close\n        })\n        // negation is (?:(?!js)[^/]*)\n        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'\n        this.debug('plType %j %j', stateChar, re)\n        stateChar = false\n      continue\n\n      case ')':\n        if (inClass || !patternListStack.length) {\n          re += '\\\\)'\n          continue\n        }\n\n        clearStateChar()\n        hasMagic = true\n        var pl = patternListStack.pop()\n        // negation is (?:(?!js)[^/]*)\n        // The others are (?:<pattern>)<type>\n        re += pl.close\n        if (pl.type === '!') {\n          negativeLists.push(pl)\n        }\n        pl.reEnd = re.length\n      continue\n\n      case '|':\n        if (inClass || !patternListStack.length || escaping) {\n          re += '\\\\|'\n          escaping = false\n          continue\n        }\n\n        clearStateChar()\n        re += '|'\n      continue\n\n      // these are mostly the same in regexp and glob\n      case '[':\n        // swallow any state-tracking char before the [\n        clearStateChar()\n\n        if (inClass) {\n          re += '\\\\' + c\n          continue\n        }\n\n        inClass = true\n        classStart = i\n        reClassStart = re.length\n        re += c\n      continue\n\n      case ']':\n        //  a right bracket shall lose its special\n        //  meaning and represent itself in\n        //  a bracket expression if it occurs\n        //  first in the list.  -- POSIX.2 2.8.3.2\n        if (i === classStart + 1 || !inClass) {\n          re += '\\\\' + c\n          escaping = false\n          continue\n        }\n\n        // handle the case where we left a class open.\n        // \"[z-a]\" is valid, equivalent to \"\\[z-a\\]\"\n        // split where the last [ was, make sure we don't have\n        // an invalid re. if so, re-walk the contents of the\n        // would-be class to re-translate any characters that\n        // were passed through as-is\n        // TODO: It would probably be faster to determine this\n        // without a try/catch and a new RegExp, but it's tricky\n        // to do safely.  For now, this is safe and works.\n        var cs = pattern.substring(classStart + 1, i)\n        try {\n          RegExp('[' + cs + ']')\n        } catch (er) {\n          // not a valid class!\n          var sp = this.parse(cs, SUBPARSE)\n          re = re.substr(0, reClassStart) + '\\\\[' + sp[0] + '\\\\]'\n          hasMagic = hasMagic || sp[1]\n          inClass = false\n          continue\n        }\n\n        // finish up the class.\n        hasMagic = true\n        inClass = false\n        re += c\n      continue\n\n      default:\n        // swallow any state char that wasn't consumed\n        clearStateChar()\n\n        if (escaping) {\n          // no need\n          escaping = false\n        } else if (reSpecials[c]\n          && !(c === '^' && inClass)) {\n          re += '\\\\'\n        }\n\n        re += c\n\n    } // switch\n  } // for\n\n  // handle the case where we left a class open.\n  // \"[abc\" is valid, equivalent to \"\\[abc\"\n  if (inClass) {\n    // split where the last [ was, and escape it\n    // this is a huge pita.  We now have to re-walk\n    // the contents of the would-be class to re-translate\n    // any characters that were passed through as-is\n    cs = pattern.substr(classStart + 1)\n    sp = this.parse(cs, SUBPARSE)\n    re = re.substr(0, reClassStart) + '\\\\[' + sp[0]\n    hasMagic = hasMagic || sp[1]\n  }\n\n  // handle the case where we had a +( thing at the *end*\n  // of the pattern.\n  // each pattern list stack adds 3 chars, and we need to go through\n  // and escape any | chars that were passed through as-is for the regexp.\n  // Go through and escape them, taking care not to double-escape any\n  // | chars that were already escaped.\n  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {\n    var tail = re.slice(pl.reStart + pl.open.length)\n    this.debug('setting tail', re, pl)\n    // maybe some even number of \\, then maybe 1 \\, followed by a |\n    tail = tail.replace(/((?:\\\\{2}){0,64})(\\\\?)\\|/g, function (_, $1, $2) {\n      if (!$2) {\n        // the | isn't already escaped, so escape it.\n        $2 = '\\\\'\n      }\n\n      // need to escape all those slashes *again*, without escaping the\n      // one that we need for escaping the | character.  As it works out,\n      // escaping an even number of slashes can be done by simply repeating\n      // it exactly after itself.  That's why this trick works.\n      //\n      // I am sorry that you have to see this.\n      return $1 + $1 + $2 + '|'\n    })\n\n    this.debug('tail=%j\\n   %s', tail, tail, pl, re)\n    var t = pl.type === '*' ? star\n      : pl.type === '?' ? qmark\n      : '\\\\' + pl.type\n\n    hasMagic = true\n    re = re.slice(0, pl.reStart) + t + '\\\\(' + tail\n  }\n\n  // handle trailing things that only matter at the very end.\n  clearStateChar()\n  if (escaping) {\n    // trailing \\\\\n    re += '\\\\\\\\'\n  }\n\n  // only need to apply the nodot start if the re starts with\n  // something that could conceivably capture a dot\n  var addPatternStart = false\n  switch (re.charAt(0)) {\n    case '[': case '.': case '(': addPatternStart = true\n  }\n\n  // Hack to work around lack of negative lookbehind in JS\n  // A pattern like: *.!(x).!(y|z) needs to ensure that a name\n  // like 'a.xyz.yz' doesn't match.  So, the first negative\n  // lookahead, has to look ALL the way ahead, to the end of\n  // the pattern.\n  for (var n = negativeLists.length - 1; n > -1; n--) {\n    var nl = negativeLists[n]\n\n    var nlBefore = re.slice(0, nl.reStart)\n    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)\n    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)\n    var nlAfter = re.slice(nl.reEnd)\n\n    nlLast += nlAfter\n\n    // Handle nested stuff like *(*.js|!(*.json)), where open parens\n    // mean that we should *not* include the ) in the bit that is considered\n    // \"after\" the negated section.\n    var openParensBefore = nlBefore.split('(').length - 1\n    var cleanAfter = nlAfter\n    for (i = 0; i < openParensBefore; i++) {\n      cleanAfter = cleanAfter.replace(/\\)[+*?]?/, '')\n    }\n    nlAfter = cleanAfter\n\n    var dollar = ''\n    if (nlAfter === '' && isSub !== SUBPARSE) {\n      dollar = '$'\n    }\n    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast\n    re = newRe\n  }\n\n  // if the re is not \"\" at this point, then we need to make sure\n  // it doesn't match against an empty path part.\n  // Otherwise a/* will match a/, which it should not.\n  if (re !== '' && hasMagic) {\n    re = '(?=.)' + re\n  }\n\n  if (addPatternStart) {\n    re = patternStart + re\n  }\n\n  // parsing just a piece of a larger pattern.\n  if (isSub === SUBPARSE) {\n    return [re, hasMagic]\n  }\n\n  // skip the regexp for non-magical patterns\n  // unescape anything in it, though, so that it'll be\n  // an exact match against a file etc.\n  if (!hasMagic) {\n    return globUnescape(pattern)\n  }\n\n  var flags = options.nocase ? 'i' : ''\n  try {\n    var regExp = new RegExp('^' + re + '$', flags)\n  } catch (er) /* istanbul ignore next - should be impossible */ {\n    // If it was an invalid regular expression, then it can't match\n    // anything.  This trick looks for a character after the end of\n    // the string, which is of course impossible, except in multi-line\n    // mode, but it's not a /m regex.\n    return new RegExp('$.')\n  }\n\n  regExp._glob = pattern\n  regExp._src = re\n\n  return regExp\n}\n\nminimatch.makeRe = function (pattern, options) {\n  return new Minimatch(pattern, options || {}).makeRe()\n}\n\nMinimatch.prototype.makeRe = makeRe\nfunction makeRe () {\n  if (this.regexp || this.regexp === false) return this.regexp\n\n  // at this point, this.set is a 2d array of partial\n  // pattern strings, or \"**\".\n  //\n  // It's better to use .match().  This function shouldn't\n  // be used, really, but it's pretty convenient sometimes,\n  // when you just want to work with a regex.\n  var set = this.set\n\n  if (!set.length) {\n    this.regexp = false\n    return this.regexp\n  }\n  var options = this.options\n\n  var twoStar = options.noglobstar ? star\n    : options.dot ? twoStarDot\n    : twoStarNoDot\n  var flags = options.nocase ? 'i' : ''\n\n  var re = set.map(function (pattern) {\n    return pattern.map(function (p) {\n      return (p === GLOBSTAR) ? twoStar\n      : (typeof p === 'string') ? regExpEscape(p)\n      : p._src\n    }).join('\\\\\\/')\n  }).join('|')\n\n  // must match entire pattern\n  // ending in a * or ** will make it less strict.\n  re = '^(?:' + re + ')$'\n\n  // can match anything, as long as it's not this.\n  if (this.negate) re = '^(?!' + re + ').*$'\n\n  try {\n    this.regexp = new RegExp(re, flags)\n  } catch (ex) /* istanbul ignore next - should be impossible */ {\n    this.regexp = false\n  }\n  return this.regexp\n}\n\nminimatch.match = function (list, pattern, options) {\n  options = options || {}\n  var mm = new Minimatch(pattern, options)\n  list = list.filter(function (f) {\n    return mm.match(f)\n  })\n  if (mm.options.nonull && !list.length) {\n    list.push(pattern)\n  }\n  return list\n}\n\nMinimatch.prototype.match = function match (f, partial) {\n  if (typeof partial === 'undefined') partial = this.partial\n  this.debug('match', f, this.pattern)\n  // short-circuit in the case of busted things.\n  // comments, etc.\n  if (this.comment) return false\n  if (this.empty) return f === ''\n\n  if (f === '/' && partial) return true\n\n  var options = this.options\n\n  // windows: need to use /, not \\\n  if (path.sep !== '/') {\n    f = f.split(path.sep).join('/')\n  }\n\n  // treat the test path as a set of pathparts.\n  f = f.split(slashSplit)\n  this.debug(this.pattern, 'split', f)\n\n  // just ONE of the pattern sets in this.set needs to match\n  // in order for it to be valid.  If negating, then just one\n  // match means that we have failed.\n  // Either way, return on the first hit.\n\n  var set = this.set\n  this.debug(this.pattern, 'set', set)\n\n  // Find the basename of the path by looking for the last non-empty segment\n  var filename\n  var i\n  for (i = f.length - 1; i >= 0; i--) {\n    filename = f[i]\n    if (filename) break\n  }\n\n  for (i = 0; i < set.length; i++) {\n    var pattern = set[i]\n    var file = f\n    if (options.matchBase && pattern.length === 1) {\n      file = [filename]\n    }\n    var hit = this.matchOne(file, pattern, partial)\n    if (hit) {\n      if (options.flipNegate) return true\n      return !this.negate\n    }\n  }\n\n  // didn't get any hits.  this is success if it's a negative\n  // pattern, failure otherwise.\n  if (options.flipNegate) return false\n  return this.negate\n}\n\n// set partial to true to test if, for example,\n// \"/a/b\" matches the start of \"/*/b/*/d\"\n// Partial means, if you run out of file before you run\n// out of pattern, then that's fine, as long as all\n// the parts match.\nMinimatch.prototype.matchOne = function (file, pattern, partial) {\n  var options = this.options\n\n  this.debug('matchOne',\n    { 'this': this, file: file, pattern: pattern })\n\n  this.debug('matchOne', file.length, pattern.length)\n\n  for (var fi = 0,\n      pi = 0,\n      fl = file.length,\n      pl = pattern.length\n      ; (fi < fl) && (pi < pl)\n      ; fi++, pi++) {\n    this.debug('matchOne loop')\n    var p = pattern[pi]\n    var f = file[fi]\n\n    this.debug(pattern, p, f)\n\n    // should be impossible.\n    // some invalid regexp stuff in the set.\n    /* istanbul ignore if */\n    if (p === false) return false\n\n    if (p === GLOBSTAR) {\n      this.debug('GLOBSTAR', [pattern, p, f])\n\n      // \"**\"\n      // a/**/b/**/c would match the following:\n      // a/b/x/y/z/c\n      // a/x/y/z/b/c\n      // a/b/x/b/x/c\n      // a/b/c\n      // To do this, take the rest of the pattern after\n      // the **, and see if it would match the file remainder.\n      // If so, return success.\n      // If not, the ** \"swallows\" a segment, and try again.\n      // This is recursively awful.\n      //\n      // a/**/b/**/c matching a/b/x/y/z/c\n      // - a matches a\n      // - doublestar\n      //   - matchOne(b/x/y/z/c, b/**/c)\n      //     - b matches b\n      //     - doublestar\n      //       - matchOne(x/y/z/c, c) -> no\n      //       - matchOne(y/z/c, c) -> no\n      //       - matchOne(z/c, c) -> no\n      //       - matchOne(c, c) yes, hit\n      var fr = fi\n      var pr = pi + 1\n      if (pr === pl) {\n        this.debug('** at the end')\n        // a ** at the end will just swallow the rest.\n        // We have found a match.\n        // however, it will not swallow /.x, unless\n        // options.dot is set.\n        // . and .. are *never* matched by **, for explosively\n        // exponential reasons.\n        for (; fi < fl; fi++) {\n          if (file[fi] === '.' || file[fi] === '..' ||\n            (!options.dot && file[fi].charAt(0) === '.')) return false\n        }\n        return true\n      }\n\n      // ok, let's see if we can swallow whatever we can.\n      while (fr < fl) {\n        var swallowee = file[fr]\n\n        this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n        // XXX remove this slice.  Just pass the start index.\n        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n          this.debug('globstar found match!', fr, fl, swallowee)\n          // found a match.\n          return true\n        } else {\n          // can't swallow \".\" or \"..\" ever.\n          // can only swallow \".foo\" when explicitly asked.\n          if (swallowee === '.' || swallowee === '..' ||\n            (!options.dot && swallowee.charAt(0) === '.')) {\n            this.debug('dot detected!', file, fr, pattern, pr)\n            break\n          }\n\n          // ** swallows a segment, and continue.\n          this.debug('globstar swallow a segment, and continue')\n          fr++\n        }\n      }\n\n      // no match was found.\n      // However, in partial mode, we can't say this is necessarily over.\n      // If there's more *pattern* left, then\n      /* istanbul ignore if */\n      if (partial) {\n        // ran out of file\n        this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n        if (fr === fl) return true\n      }\n      return false\n    }\n\n    // something other than **\n    // non-magic patterns just have to match exactly\n    // patterns with magic have been turned into regexps.\n    var hit\n    if (typeof p === 'string') {\n      hit = f === p\n      this.debug('string match', p, f, hit)\n    } else {\n      hit = f.match(p)\n      this.debug('pattern match', p, f, hit)\n    }\n\n    if (!hit) return false\n  }\n\n  // Note: ending in / means that we'll get a final \"\"\n  // at the end of the pattern.  This can only match a\n  // corresponding \"\" at the end of the file.\n  // If the file ends in /, then it can only match a\n  // a pattern that ends in /, unless the pattern just\n  // doesn't have any more for it. But, a/b/ should *not*\n  // match \"a/b/*\", even though \"\" matches against the\n  // [^/]*? pattern, except in partial mode, where it might\n  // simply not be reached yet.\n  // However, a/b/ should still satisfy a/*\n\n  // now either we fell off the end of the pattern, or we're done.\n  if (fi === fl && pi === pl) {\n    // ran out of pattern and filename at the same time.\n    // an exact hit!\n    return true\n  } else if (fi === fl) {\n    // ran out of file, but still had pattern left.\n    // this is ok if we're doing the match as part of\n    // a glob fs traversal.\n    return partial\n  } else /* istanbul ignore else */ if (pi === pl) {\n    // ran out of pattern, still have file left.\n    // this is only acceptable if we're on the very last\n    // empty segment of a file with a trailing slash.\n    // a/* should match a/b/\n    return (fi === fl - 1) && (file[fi] === '')\n  }\n\n  // should be unreachable.\n  /* istanbul ignore next */\n  throw new Error('wtf?')\n}\n\n// replace stuff like \\* with *\nfunction globUnescape (s) {\n  return s.replace(/\\\\(.)/g, '$1')\n}\n\nfunction regExpEscape (s) {\n  return s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n","if (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    if (superCtor) {\n      ctor.super_ = superCtor\n      ctor.prototype = Object.create(superCtor.prototype, {\n        constructor: {\n          value: ctor,\n          enumerable: false,\n          writable: true,\n          configurable: true\n        }\n      })\n    }\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    if (superCtor) {\n      ctor.super_ = superCtor\n      var TempCtor = function () {}\n      TempCtor.prototype = superCtor.prototype\n      ctor.prototype = new TempCtor()\n      ctor.prototype.constructor = ctor\n    }\n  }\n}\n","try {\n  var util = require('util');\n  /* istanbul ignore next */\n  if (typeof util.inherits !== 'function') throw '';\n  module.exports = util.inherits;\n} catch (e) {\n  /* istanbul ignore next */\n  module.exports = require('./inherits_browser.js');\n}\n","'use strict';\n\nfunction posix(path) {\n\treturn path.charAt(0) === '/';\n}\n\nfunction win32(path) {\n\t// https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56\n\tvar splitDeviceRe = /^([a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/]+[^\\\\\\/]+)?([\\\\\\/])?([\\s\\S]*?)$/;\n\tvar result = splitDeviceRe.exec(path);\n\tvar device = result[1] || '';\n\tvar isUnc = Boolean(device && device.charAt(1) !== ':');\n\n\t// UNC paths are always absolute\n\treturn Boolean(result[2] || isUnc);\n}\n\nmodule.exports = process.platform === 'win32' ? win32 : posix;\nmodule.exports.posix = posix;\nmodule.exports.win32 = win32;\n","exports.setopts = setopts\nexports.ownProp = ownProp\nexports.makeAbs = makeAbs\nexports.finish = finish\nexports.mark = mark\nexports.isIgnored = isIgnored\nexports.childrenIgnored = childrenIgnored\n\nfunction ownProp (obj, field) {\n  return Object.prototype.hasOwnProperty.call(obj, field)\n}\n\nvar fs = require(\"fs\")\nvar path = require(\"path\")\nvar minimatch = require(\"minimatch\")\nvar isAbsolute = require(\"path-is-absolute\")\nvar Minimatch = minimatch.Minimatch\n\nfunction alphasort (a, b) {\n  return a.localeCompare(b, 'en')\n}\n\nfunction setupIgnores (self, options) {\n  self.ignore = options.ignore || []\n\n  if (!Array.isArray(self.ignore))\n    self.ignore = [self.ignore]\n\n  if (self.ignore.length) {\n    self.ignore = self.ignore.map(ignoreMap)\n  }\n}\n\n// ignore patterns are always in dot:true mode.\nfunction ignoreMap (pattern) {\n  var gmatcher = null\n  if (pattern.slice(-3) === '/**') {\n    var gpattern = pattern.replace(/(\\/\\*\\*)+$/, '')\n    gmatcher = new Minimatch(gpattern, { dot: true })\n  }\n\n  return {\n    matcher: new Minimatch(pattern, { dot: true }),\n    gmatcher: gmatcher\n  }\n}\n\nfunction setopts (self, pattern, options) {\n  if (!options)\n    options = {}\n\n  // base-matching: just use globstar for that.\n  if (options.matchBase && -1 === pattern.indexOf(\"/\")) {\n    if (options.noglobstar) {\n      throw new Error(\"base matching requires globstar\")\n    }\n    pattern = \"**/\" + pattern\n  }\n\n  self.silent = !!options.silent\n  self.pattern = pattern\n  self.strict = options.strict !== false\n  self.realpath = !!options.realpath\n  self.realpathCache = options.realpathCache || Object.create(null)\n  self.follow = !!options.follow\n  self.dot = !!options.dot\n  self.mark = !!options.mark\n  self.nodir = !!options.nodir\n  if (self.nodir)\n    self.mark = true\n  self.sync = !!options.sync\n  self.nounique = !!options.nounique\n  self.nonull = !!options.nonull\n  self.nosort = !!options.nosort\n  self.nocase = !!options.nocase\n  self.stat = !!options.stat\n  self.noprocess = !!options.noprocess\n  self.absolute = !!options.absolute\n  self.fs = options.fs || fs\n\n  self.maxLength = options.maxLength || Infinity\n  self.cache = options.cache || Object.create(null)\n  self.statCache = options.statCache || Object.create(null)\n  self.symlinks = options.symlinks || Object.create(null)\n\n  setupIgnores(self, options)\n\n  self.changedCwd = false\n  var cwd = process.cwd()\n  if (!ownProp(options, \"cwd\"))\n    self.cwd = cwd\n  else {\n    self.cwd = path.resolve(options.cwd)\n    self.changedCwd = self.cwd !== cwd\n  }\n\n  self.root = options.root || path.resolve(self.cwd, \"/\")\n  self.root = path.resolve(self.root)\n  if (process.platform === \"win32\")\n    self.root = self.root.replace(/\\\\/g, \"/\")\n\n  // TODO: is an absolute `cwd` supposed to be resolved against `root`?\n  // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')\n  self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)\n  if (process.platform === \"win32\")\n    self.cwdAbs = self.cwdAbs.replace(/\\\\/g, \"/\")\n  self.nomount = !!options.nomount\n\n  // disable comments and negation in Minimatch.\n  // Note that they are not supported in Glob itself anyway.\n  options.nonegate = true\n  options.nocomment = true\n  // always treat \\ in patterns as escapes, not path separators\n  options.allowWindowsEscape = false\n\n  self.minimatch = new Minimatch(pattern, options)\n  self.options = self.minimatch.options\n}\n\nfunction finish (self) {\n  var nou = self.nounique\n  var all = nou ? [] : Object.create(null)\n\n  for (var i = 0, l = self.matches.length; i < l; i ++) {\n    var matches = self.matches[i]\n    if (!matches || Object.keys(matches).length === 0) {\n      if (self.nonull) {\n        // do like the shell, and spit out the literal glob\n        var literal = self.minimatch.globSet[i]\n        if (nou)\n          all.push(literal)\n        else\n          all[literal] = true\n      }\n    } else {\n      // had matches\n      var m = Object.keys(matches)\n      if (nou)\n        all.push.apply(all, m)\n      else\n        m.forEach(function (m) {\n          all[m] = true\n        })\n    }\n  }\n\n  if (!nou)\n    all = Object.keys(all)\n\n  if (!self.nosort)\n    all = all.sort(alphasort)\n\n  // at *some* point we statted all of these\n  if (self.mark) {\n    for (var i = 0; i < all.length; i++) {\n      all[i] = self._mark(all[i])\n    }\n    if (self.nodir) {\n      all = all.filter(function (e) {\n        var notDir = !(/\\/$/.test(e))\n        var c = self.cache[e] || self.cache[makeAbs(self, e)]\n        if (notDir && c)\n          notDir = c !== 'DIR' && !Array.isArray(c)\n        return notDir\n      })\n    }\n  }\n\n  if (self.ignore.length)\n    all = all.filter(function(m) {\n      return !isIgnored(self, m)\n    })\n\n  self.found = all\n}\n\nfunction mark (self, p) {\n  var abs = makeAbs(self, p)\n  var c = self.cache[abs]\n  var m = p\n  if (c) {\n    var isDir = c === 'DIR' || Array.isArray(c)\n    var slash = p.slice(-1) === '/'\n\n    if (isDir && !slash)\n      m += '/'\n    else if (!isDir && slash)\n      m = m.slice(0, -1)\n\n    if (m !== p) {\n      var mabs = makeAbs(self, m)\n      self.statCache[mabs] = self.statCache[abs]\n      self.cache[mabs] = self.cache[abs]\n    }\n  }\n\n  return m\n}\n\n// lotta situps...\nfunction makeAbs (self, f) {\n  var abs = f\n  if (f.charAt(0) === '/') {\n    abs = path.join(self.root, f)\n  } else if (isAbsolute(f) || f === '') {\n    abs = f\n  } else if (self.changedCwd) {\n    abs = path.resolve(self.cwd, f)\n  } else {\n    abs = path.resolve(f)\n  }\n\n  if (process.platform === 'win32')\n    abs = abs.replace(/\\\\/g, '/')\n\n  return abs\n}\n\n\n// Return true, if pattern ends with globstar '**', for the accompanying parent directory.\n// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents\nfunction isIgnored (self, path) {\n  if (!self.ignore.length)\n    return false\n\n  return self.ignore.some(function(item) {\n    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))\n  })\n}\n\nfunction childrenIgnored (self, path) {\n  if (!self.ignore.length)\n    return false\n\n  return self.ignore.some(function(item) {\n    return !!(item.gmatcher && item.gmatcher.match(path))\n  })\n}\n","module.exports = globSync\nglobSync.GlobSync = GlobSync\n\nvar rp = require('fs.realpath')\nvar minimatch = require('minimatch')\nvar Minimatch = minimatch.Minimatch\nvar Glob = require('./glob.js').Glob\nvar util = require('util')\nvar path = require('path')\nvar assert = require('assert')\nvar isAbsolute = require('path-is-absolute')\nvar common = require('./common.js')\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nfunction globSync (pattern, options) {\n  if (typeof options === 'function' || arguments.length === 3)\n    throw new TypeError('callback provided to sync glob\\n'+\n                        'See: https://github.com/isaacs/node-glob/issues/167')\n\n  return new GlobSync(pattern, options).found\n}\n\nfunction GlobSync (pattern, options) {\n  if (!pattern)\n    throw new Error('must provide pattern')\n\n  if (typeof options === 'function' || arguments.length === 3)\n    throw new TypeError('callback provided to sync glob\\n'+\n                        'See: https://github.com/isaacs/node-glob/issues/167')\n\n  if (!(this instanceof GlobSync))\n    return new GlobSync(pattern, options)\n\n  setopts(this, pattern, options)\n\n  if (this.noprocess)\n    return this\n\n  var n = this.minimatch.set.length\n  this.matches = new Array(n)\n  for (var i = 0; i < n; i ++) {\n    this._process(this.minimatch.set[i], i, false)\n  }\n  this._finish()\n}\n\nGlobSync.prototype._finish = function () {\n  assert.ok(this instanceof GlobSync)\n  if (this.realpath) {\n    var self = this\n    this.matches.forEach(function (matchset, index) {\n      var set = self.matches[index] = Object.create(null)\n      for (var p in matchset) {\n        try {\n          p = self._makeAbs(p)\n          var real = rp.realpathSync(p, self.realpathCache)\n          set[real] = true\n        } catch (er) {\n          if (er.syscall === 'stat')\n            set[self._makeAbs(p)] = true\n          else\n            throw er\n        }\n      }\n    })\n  }\n  common.finish(this)\n}\n\n\nGlobSync.prototype._process = function (pattern, index, inGlobStar) {\n  assert.ok(this instanceof GlobSync)\n\n  // Get the first [n] parts of pattern that are all strings.\n  var n = 0\n  while (typeof pattern[n] === 'string') {\n    n ++\n  }\n  // now n is the index of the first one that is *not* a string.\n\n  // See if there's anything else\n  var prefix\n  switch (n) {\n    // if not, then this is rather simple\n    case pattern.length:\n      this._processSimple(pattern.join('/'), index)\n      return\n\n    case 0:\n      // pattern *starts* with some non-trivial item.\n      // going to readdir(cwd), but not include the prefix in matches.\n      prefix = null\n      break\n\n    default:\n      // pattern has some string bits in the front.\n      // whatever it starts with, whether that's 'absolute' like /foo/bar,\n      // or 'relative' like '../baz'\n      prefix = pattern.slice(0, n).join('/')\n      break\n  }\n\n  var remain = pattern.slice(n)\n\n  // get the list of entries.\n  var read\n  if (prefix === null)\n    read = '.'\n  else if (isAbsolute(prefix) ||\n      isAbsolute(pattern.map(function (p) {\n        return typeof p === 'string' ? p : '[*]'\n      }).join('/'))) {\n    if (!prefix || !isAbsolute(prefix))\n      prefix = '/' + prefix\n    read = prefix\n  } else\n    read = prefix\n\n  var abs = this._makeAbs(read)\n\n  //if ignored, skip processing\n  if (childrenIgnored(this, read))\n    return\n\n  var isGlobStar = remain[0] === minimatch.GLOBSTAR\n  if (isGlobStar)\n    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)\n  else\n    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)\n}\n\n\nGlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {\n  var entries = this._readdir(abs, inGlobStar)\n\n  // if the abs isn't a dir, then nothing can match!\n  if (!entries)\n    return\n\n  // It will only match dot entries if it starts with a dot, or if\n  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.\n  var pn = remain[0]\n  var negate = !!this.minimatch.negate\n  var rawGlob = pn._glob\n  var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n  var matchedEntries = []\n  for (var i = 0; i < entries.length; i++) {\n    var e = entries[i]\n    if (e.charAt(0) !== '.' || dotOk) {\n      var m\n      if (negate && !prefix) {\n        m = !e.match(pn)\n      } else {\n        m = e.match(pn)\n      }\n      if (m)\n        matchedEntries.push(e)\n    }\n  }\n\n  var len = matchedEntries.length\n  // If there are no matched entries, then nothing matches.\n  if (len === 0)\n    return\n\n  // if this is the last remaining pattern bit, then no need for\n  // an additional stat *unless* the user has specified mark or\n  // stat explicitly.  We know they exist, since readdir returned\n  // them.\n\n  if (remain.length === 1 && !this.mark && !this.stat) {\n    if (!this.matches[index])\n      this.matches[index] = Object.create(null)\n\n    for (var i = 0; i < len; i ++) {\n      var e = matchedEntries[i]\n      if (prefix) {\n        if (prefix.slice(-1) !== '/')\n          e = prefix + '/' + e\n        else\n          e = prefix + e\n      }\n\n      if (e.charAt(0) === '/' && !this.nomount) {\n        e = path.join(this.root, e)\n      }\n      this._emitMatch(index, e)\n    }\n    // This was the last one, and no stats were needed\n    return\n  }\n\n  // now test all matched entries as stand-ins for that part\n  // of the pattern.\n  remain.shift()\n  for (var i = 0; i < len; i ++) {\n    var e = matchedEntries[i]\n    var newPattern\n    if (prefix)\n      newPattern = [prefix, e]\n    else\n      newPattern = [e]\n    this._process(newPattern.concat(remain), index, inGlobStar)\n  }\n}\n\n\nGlobSync.prototype._emitMatch = function (index, e) {\n  if (isIgnored(this, e))\n    return\n\n  var abs = this._makeAbs(e)\n\n  if (this.mark)\n    e = this._mark(e)\n\n  if (this.absolute) {\n    e = abs\n  }\n\n  if (this.matches[index][e])\n    return\n\n  if (this.nodir) {\n    var c = this.cache[abs]\n    if (c === 'DIR' || Array.isArray(c))\n      return\n  }\n\n  this.matches[index][e] = true\n\n  if (this.stat)\n    this._stat(e)\n}\n\n\nGlobSync.prototype._readdirInGlobStar = function (abs) {\n  // follow all symlinked directories forever\n  // just proceed as if this is a non-globstar situation\n  if (this.follow)\n    return this._readdir(abs, false)\n\n  var entries\n  var lstat\n  var stat\n  try {\n    lstat = this.fs.lstatSync(abs)\n  } catch (er) {\n    if (er.code === 'ENOENT') {\n      // lstat failed, doesn't exist\n      return null\n    }\n  }\n\n  var isSym = lstat && lstat.isSymbolicLink()\n  this.symlinks[abs] = isSym\n\n  // If it's not a symlink or a dir, then it's definitely a regular file.\n  // don't bother doing a readdir in that case.\n  if (!isSym && lstat && !lstat.isDirectory())\n    this.cache[abs] = 'FILE'\n  else\n    entries = this._readdir(abs, false)\n\n  return entries\n}\n\nGlobSync.prototype._readdir = function (abs, inGlobStar) {\n  var entries\n\n  if (inGlobStar && !ownProp(this.symlinks, abs))\n    return this._readdirInGlobStar(abs)\n\n  if (ownProp(this.cache, abs)) {\n    var c = this.cache[abs]\n    if (!c || c === 'FILE')\n      return null\n\n    if (Array.isArray(c))\n      return c\n  }\n\n  try {\n    return this._readdirEntries(abs, this.fs.readdirSync(abs))\n  } catch (er) {\n    this._readdirError(abs, er)\n    return null\n  }\n}\n\nGlobSync.prototype._readdirEntries = function (abs, entries) {\n  // if we haven't asked to stat everything, then just\n  // assume that everything in there exists, so we can avoid\n  // having to stat it a second time.\n  if (!this.mark && !this.stat) {\n    for (var i = 0; i < entries.length; i ++) {\n      var e = entries[i]\n      if (abs === '/')\n        e = abs + e\n      else\n        e = abs + '/' + e\n      this.cache[e] = true\n    }\n  }\n\n  this.cache[abs] = entries\n\n  // mark and cache dir-ness\n  return entries\n}\n\nGlobSync.prototype._readdirError = function (f, er) {\n  // handle errors, and cache the information\n  switch (er.code) {\n    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n    case 'ENOTDIR': // totally normal. means it *does* exist.\n      var abs = this._makeAbs(f)\n      this.cache[abs] = 'FILE'\n      if (abs === this.cwdAbs) {\n        var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n        error.path = this.cwd\n        error.code = er.code\n        throw error\n      }\n      break\n\n    case 'ENOENT': // not terribly unusual\n    case 'ELOOP':\n    case 'ENAMETOOLONG':\n    case 'UNKNOWN':\n      this.cache[this._makeAbs(f)] = false\n      break\n\n    default: // some unusual error.  Treat as failure.\n      this.cache[this._makeAbs(f)] = false\n      if (this.strict)\n        throw er\n      if (!this.silent)\n        console.error('glob error', er)\n      break\n  }\n}\n\nGlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {\n\n  var entries = this._readdir(abs, inGlobStar)\n\n  // no entries means not a dir, so it can never have matches\n  // foo.txt/** doesn't match foo.txt\n  if (!entries)\n    return\n\n  // test without the globstar, and with every child both below\n  // and replacing the globstar.\n  var remainWithoutGlobStar = remain.slice(1)\n  var gspref = prefix ? [ prefix ] : []\n  var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n  // the noGlobStar pattern exits the inGlobStar state\n  this._process(noGlobStar, index, false)\n\n  var len = entries.length\n  var isSym = this.symlinks[abs]\n\n  // If it's a symlink, and we're in a globstar, then stop\n  if (isSym && inGlobStar)\n    return\n\n  for (var i = 0; i < len; i++) {\n    var e = entries[i]\n    if (e.charAt(0) === '.' && !this.dot)\n      continue\n\n    // these two cases enter the inGlobStar state\n    var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n    this._process(instead, index, true)\n\n    var below = gspref.concat(entries[i], remain)\n    this._process(below, index, true)\n  }\n}\n\nGlobSync.prototype._processSimple = function (prefix, index) {\n  // XXX review this.  Shouldn't it be doing the mounting etc\n  // before doing stat?  kinda weird?\n  var exists = this._stat(prefix)\n\n  if (!this.matches[index])\n    this.matches[index] = Object.create(null)\n\n  // If it doesn't exist, then just mark the lack of results\n  if (!exists)\n    return\n\n  if (prefix && isAbsolute(prefix) && !this.nomount) {\n    var trail = /[\\/\\\\]$/.test(prefix)\n    if (prefix.charAt(0) === '/') {\n      prefix = path.join(this.root, prefix)\n    } else {\n      prefix = path.resolve(this.root, prefix)\n      if (trail)\n        prefix += '/'\n    }\n  }\n\n  if (process.platform === 'win32')\n    prefix = prefix.replace(/\\\\/g, '/')\n\n  // Mark this as a match\n  this._emitMatch(index, prefix)\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlobSync.prototype._stat = function (f) {\n  var abs = this._makeAbs(f)\n  var needDir = f.slice(-1) === '/'\n\n  if (f.length > this.maxLength)\n    return false\n\n  if (!this.stat && ownProp(this.cache, abs)) {\n    var c = this.cache[abs]\n\n    if (Array.isArray(c))\n      c = 'DIR'\n\n    // It exists, but maybe not how we need it\n    if (!needDir || c === 'DIR')\n      return c\n\n    if (needDir && c === 'FILE')\n      return false\n\n    // otherwise we have to stat, because maybe c=true\n    // if we know it exists, but not what it is.\n  }\n\n  var exists\n  var stat = this.statCache[abs]\n  if (!stat) {\n    var lstat\n    try {\n      lstat = this.fs.lstatSync(abs)\n    } catch (er) {\n      if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n        this.statCache[abs] = false\n        return false\n      }\n    }\n\n    if (lstat && lstat.isSymbolicLink()) {\n      try {\n        stat = this.fs.statSync(abs)\n      } catch (er) {\n        stat = lstat\n      }\n    } else {\n      stat = lstat\n    }\n  }\n\n  this.statCache[abs] = stat\n\n  var c = true\n  if (stat)\n    c = stat.isDirectory() ? 'DIR' : 'FILE'\n\n  this.cache[abs] = this.cache[abs] || c\n\n  if (needDir && c === 'FILE')\n    return false\n\n  return c\n}\n\nGlobSync.prototype._mark = function (p) {\n  return common.mark(this, p)\n}\n\nGlobSync.prototype._makeAbs = function (f) {\n  return common.makeAbs(this, f)\n}\n","// Returns a wrapper function that returns a wrapped callback\n// The wrapper function should do some stuff, and return a\n// presumably different callback function.\n// This makes sure that own properties are retained, so that\n// decorations and such are not lost along the way.\nmodule.exports = wrappy\nfunction wrappy (fn, cb) {\n  if (fn && cb) return wrappy(fn)(cb)\n\n  if (typeof fn !== 'function')\n    throw new TypeError('need wrapper function')\n\n  Object.keys(fn).forEach(function (k) {\n    wrapper[k] = fn[k]\n  })\n\n  return wrapper\n\n  function wrapper() {\n    var args = new Array(arguments.length)\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i]\n    }\n    var ret = fn.apply(this, args)\n    var cb = args[args.length-1]\n    if (typeof ret === 'function' && ret !== cb) {\n      Object.keys(cb).forEach(function (k) {\n        ret[k] = cb[k]\n      })\n    }\n    return ret\n  }\n}\n","var wrappy = require('wrappy')\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n  Object.defineProperty(Function.prototype, 'once', {\n    value: function () {\n      return once(this)\n    },\n    configurable: true\n  })\n\n  Object.defineProperty(Function.prototype, 'onceStrict', {\n    value: function () {\n      return onceStrict(this)\n    },\n    configurable: true\n  })\n})\n\nfunction once (fn) {\n  var f = function () {\n    if (f.called) return f.value\n    f.called = true\n    return f.value = fn.apply(this, arguments)\n  }\n  f.called = false\n  return f\n}\n\nfunction onceStrict (fn) {\n  var f = function () {\n    if (f.called)\n      throw new Error(f.onceError)\n    f.called = true\n    return f.value = fn.apply(this, arguments)\n  }\n  var name = fn.name || 'Function wrapped with `once`'\n  f.onceError = name + \" shouldn't be called more than once\"\n  f.called = false\n  return f\n}\n","var wrappy = require('wrappy')\nvar reqs = Object.create(null)\nvar once = require('once')\n\nmodule.exports = wrappy(inflight)\n\nfunction inflight (key, cb) {\n  if (reqs[key]) {\n    reqs[key].push(cb)\n    return null\n  } else {\n    reqs[key] = [cb]\n    return makeres(key)\n  }\n}\n\nfunction makeres (key) {\n  return once(function RES () {\n    var cbs = reqs[key]\n    var len = cbs.length\n    var args = slice(arguments)\n\n    // XXX It's somewhat ambiguous whether a new callback added in this\n    // pass should be queued for later execution if something in the\n    // list of callbacks throws, or if it should just be discarded.\n    // However, it's such an edge case that it hardly matters, and either\n    // choice is likely as surprising as the other.\n    // As it happens, we do go ahead and schedule it for later execution.\n    try {\n      for (var i = 0; i < len; i++) {\n        cbs[i].apply(null, args)\n      }\n    } finally {\n      if (cbs.length > len) {\n        // added more in the interim.\n        // de-zalgo, just in case, but don't call again.\n        cbs.splice(0, len)\n        process.nextTick(function () {\n          RES.apply(null, args)\n        })\n      } else {\n        delete reqs[key]\n      }\n    }\n  })\n}\n\nfunction slice (args) {\n  var length = args.length\n  var array = []\n\n  for (var i = 0; i < length; i++) array[i] = args[i]\n  return array\n}\n","// Approach:\n//\n// 1. Get the minimatch set\n// 2. For each pattern in the set, PROCESS(pattern, false)\n// 3. Store matches per-set, then uniq them\n//\n// PROCESS(pattern, inGlobStar)\n// Get the first [n] items from pattern that are all strings\n// Join these together.  This is PREFIX.\n//   If there is no more remaining, then stat(PREFIX) and\n//   add to matches if it succeeds.  END.\n//\n// If inGlobStar and PREFIX is symlink and points to dir\n//   set ENTRIES = []\n// else readdir(PREFIX) as ENTRIES\n//   If fail, END\n//\n// with ENTRIES\n//   If pattern[n] is GLOBSTAR\n//     // handle the case where the globstar match is empty\n//     // by pruning it out, and testing the resulting pattern\n//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)\n//     // handle other cases.\n//     for ENTRY in ENTRIES (not dotfiles)\n//       // attach globstar + tail onto the entry\n//       // Mark that this entry is a globstar match\n//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)\n//\n//   else // not globstar\n//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)\n//       Test ENTRY against pattern[n]\n//       If fails, continue\n//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])\n//\n// Caveat:\n//   Cache all stats and readdirs results to minimize syscall.  Since all\n//   we ever care about is existence and directory-ness, we can just keep\n//   `true` for files, and [children,...] for directories, or `false` for\n//   things that don't exist.\n\nmodule.exports = glob\n\nvar rp = require('fs.realpath')\nvar minimatch = require('minimatch')\nvar Minimatch = minimatch.Minimatch\nvar inherits = require('inherits')\nvar EE = require('events').EventEmitter\nvar path = require('path')\nvar assert = require('assert')\nvar isAbsolute = require('path-is-absolute')\nvar globSync = require('./sync.js')\nvar common = require('./common.js')\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar inflight = require('inflight')\nvar util = require('util')\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nvar once = require('once')\n\nfunction glob (pattern, options, cb) {\n  if (typeof options === 'function') cb = options, options = {}\n  if (!options) options = {}\n\n  if (options.sync) {\n    if (cb)\n      throw new TypeError('callback provided to sync glob')\n    return globSync(pattern, options)\n  }\n\n  return new Glob(pattern, options, cb)\n}\n\nglob.sync = globSync\nvar GlobSync = glob.GlobSync = globSync.GlobSync\n\n// old api surface\nglob.glob = glob\n\nfunction extend (origin, add) {\n  if (add === null || typeof add !== 'object') {\n    return origin\n  }\n\n  var keys = Object.keys(add)\n  var i = keys.length\n  while (i--) {\n    origin[keys[i]] = add[keys[i]]\n  }\n  return origin\n}\n\nglob.hasMagic = function (pattern, options_) {\n  var options = extend({}, options_)\n  options.noprocess = true\n\n  var g = new Glob(pattern, options)\n  var set = g.minimatch.set\n\n  if (!pattern)\n    return false\n\n  if (set.length > 1)\n    return true\n\n  for (var j = 0; j < set[0].length; j++) {\n    if (typeof set[0][j] !== 'string')\n      return true\n  }\n\n  return false\n}\n\nglob.Glob = Glob\ninherits(Glob, EE)\nfunction Glob (pattern, options, cb) {\n  if (typeof options === 'function') {\n    cb = options\n    options = null\n  }\n\n  if (options && options.sync) {\n    if (cb)\n      throw new TypeError('callback provided to sync glob')\n    return new GlobSync(pattern, options)\n  }\n\n  if (!(this instanceof Glob))\n    return new Glob(pattern, options, cb)\n\n  setopts(this, pattern, options)\n  this._didRealPath = false\n\n  // process each pattern in the minimatch set\n  var n = this.minimatch.set.length\n\n  // The matches are stored as {<filename>: true,...} so that\n  // duplicates are automagically pruned.\n  // Later, we do an Object.keys() on these.\n  // Keep them as a list so we can fill in when nonull is set.\n  this.matches = new Array(n)\n\n  if (typeof cb === 'function') {\n    cb = once(cb)\n    this.on('error', cb)\n    this.on('end', function (matches) {\n      cb(null, matches)\n    })\n  }\n\n  var self = this\n  this._processing = 0\n\n  this._emitQueue = []\n  this._processQueue = []\n  this.paused = false\n\n  if (this.noprocess)\n    return this\n\n  if (n === 0)\n    return done()\n\n  var sync = true\n  for (var i = 0; i < n; i ++) {\n    this._process(this.minimatch.set[i], i, false, done)\n  }\n  sync = false\n\n  function done () {\n    --self._processing\n    if (self._processing <= 0) {\n      if (sync) {\n        process.nextTick(function () {\n          self._finish()\n        })\n      } else {\n        self._finish()\n      }\n    }\n  }\n}\n\nGlob.prototype._finish = function () {\n  assert(this instanceof Glob)\n  if (this.aborted)\n    return\n\n  if (this.realpath && !this._didRealpath)\n    return this._realpath()\n\n  common.finish(this)\n  this.emit('end', this.found)\n}\n\nGlob.prototype._realpath = function () {\n  if (this._didRealpath)\n    return\n\n  this._didRealpath = true\n\n  var n = this.matches.length\n  if (n === 0)\n    return this._finish()\n\n  var self = this\n  for (var i = 0; i < this.matches.length; i++)\n    this._realpathSet(i, next)\n\n  function next () {\n    if (--n === 0)\n      self._finish()\n  }\n}\n\nGlob.prototype._realpathSet = function (index, cb) {\n  var matchset = this.matches[index]\n  if (!matchset)\n    return cb()\n\n  var found = Object.keys(matchset)\n  var self = this\n  var n = found.length\n\n  if (n === 0)\n    return cb()\n\n  var set = this.matches[index] = Object.create(null)\n  found.forEach(function (p, i) {\n    // If there's a problem with the stat, then it means that\n    // one or more of the links in the realpath couldn't be\n    // resolved.  just return the abs value in that case.\n    p = self._makeAbs(p)\n    rp.realpath(p, self.realpathCache, function (er, real) {\n      if (!er)\n        set[real] = true\n      else if (er.syscall === 'stat')\n        set[p] = true\n      else\n        self.emit('error', er) // srsly wtf right here\n\n      if (--n === 0) {\n        self.matches[index] = set\n        cb()\n      }\n    })\n  })\n}\n\nGlob.prototype._mark = function (p) {\n  return common.mark(this, p)\n}\n\nGlob.prototype._makeAbs = function (f) {\n  return common.makeAbs(this, f)\n}\n\nGlob.prototype.abort = function () {\n  this.aborted = true\n  this.emit('abort')\n}\n\nGlob.prototype.pause = function () {\n  if (!this.paused) {\n    this.paused = true\n    this.emit('pause')\n  }\n}\n\nGlob.prototype.resume = function () {\n  if (this.paused) {\n    this.emit('resume')\n    this.paused = false\n    if (this._emitQueue.length) {\n      var eq = this._emitQueue.slice(0)\n      this._emitQueue.length = 0\n      for (var i = 0; i < eq.length; i ++) {\n        var e = eq[i]\n        this._emitMatch(e[0], e[1])\n      }\n    }\n    if (this._processQueue.length) {\n      var pq = this._processQueue.slice(0)\n      this._processQueue.length = 0\n      for (var i = 0; i < pq.length; i ++) {\n        var p = pq[i]\n        this._processing--\n        this._process(p[0], p[1], p[2], p[3])\n      }\n    }\n  }\n}\n\nGlob.prototype._process = function (pattern, index, inGlobStar, cb) {\n  assert(this instanceof Glob)\n  assert(typeof cb === 'function')\n\n  if (this.aborted)\n    return\n\n  this._processing++\n  if (this.paused) {\n    this._processQueue.push([pattern, index, inGlobStar, cb])\n    return\n  }\n\n  //console.error('PROCESS %d', this._processing, pattern)\n\n  // Get the first [n] parts of pattern that are all strings.\n  var n = 0\n  while (typeof pattern[n] === 'string') {\n    n ++\n  }\n  // now n is the index of the first one that is *not* a string.\n\n  // see if there's anything else\n  var prefix\n  switch (n) {\n    // if not, then this is rather simple\n    case pattern.length:\n      this._processSimple(pattern.join('/'), index, cb)\n      return\n\n    case 0:\n      // pattern *starts* with some non-trivial item.\n      // going to readdir(cwd), but not include the prefix in matches.\n      prefix = null\n      break\n\n    default:\n      // pattern has some string bits in the front.\n      // whatever it starts with, whether that's 'absolute' like /foo/bar,\n      // or 'relative' like '../baz'\n      prefix = pattern.slice(0, n).join('/')\n      break\n  }\n\n  var remain = pattern.slice(n)\n\n  // get the list of entries.\n  var read\n  if (prefix === null)\n    read = '.'\n  else if (isAbsolute(prefix) ||\n      isAbsolute(pattern.map(function (p) {\n        return typeof p === 'string' ? p : '[*]'\n      }).join('/'))) {\n    if (!prefix || !isAbsolute(prefix))\n      prefix = '/' + prefix\n    read = prefix\n  } else\n    read = prefix\n\n  var abs = this._makeAbs(read)\n\n  //if ignored, skip _processing\n  if (childrenIgnored(this, read))\n    return cb()\n\n  var isGlobStar = remain[0] === minimatch.GLOBSTAR\n  if (isGlobStar)\n    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)\n  else\n    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)\n}\n\nGlob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n  var self = this\n  this._readdir(abs, inGlobStar, function (er, entries) {\n    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n  })\n}\n\nGlob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n\n  // if the abs isn't a dir, then nothing can match!\n  if (!entries)\n    return cb()\n\n  // It will only match dot entries if it starts with a dot, or if\n  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.\n  var pn = remain[0]\n  var negate = !!this.minimatch.negate\n  var rawGlob = pn._glob\n  var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n  var matchedEntries = []\n  for (var i = 0; i < entries.length; i++) {\n    var e = entries[i]\n    if (e.charAt(0) !== '.' || dotOk) {\n      var m\n      if (negate && !prefix) {\n        m = !e.match(pn)\n      } else {\n        m = e.match(pn)\n      }\n      if (m)\n        matchedEntries.push(e)\n    }\n  }\n\n  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)\n\n  var len = matchedEntries.length\n  // If there are no matched entries, then nothing matches.\n  if (len === 0)\n    return cb()\n\n  // if this is the last remaining pattern bit, then no need for\n  // an additional stat *unless* the user has specified mark or\n  // stat explicitly.  We know they exist, since readdir returned\n  // them.\n\n  if (remain.length === 1 && !this.mark && !this.stat) {\n    if (!this.matches[index])\n      this.matches[index] = Object.create(null)\n\n    for (var i = 0; i < len; i ++) {\n      var e = matchedEntries[i]\n      if (prefix) {\n        if (prefix !== '/')\n          e = prefix + '/' + e\n        else\n          e = prefix + e\n      }\n\n      if (e.charAt(0) === '/' && !this.nomount) {\n        e = path.join(this.root, e)\n      }\n      this._emitMatch(index, e)\n    }\n    // This was the last one, and no stats were needed\n    return cb()\n  }\n\n  // now test all matched entries as stand-ins for that part\n  // of the pattern.\n  remain.shift()\n  for (var i = 0; i < len; i ++) {\n    var e = matchedEntries[i]\n    var newPattern\n    if (prefix) {\n      if (prefix !== '/')\n        e = prefix + '/' + e\n      else\n        e = prefix + e\n    }\n    this._process([e].concat(remain), index, inGlobStar, cb)\n  }\n  cb()\n}\n\nGlob.prototype._emitMatch = function (index, e) {\n  if (this.aborted)\n    return\n\n  if (isIgnored(this, e))\n    return\n\n  if (this.paused) {\n    this._emitQueue.push([index, e])\n    return\n  }\n\n  var abs = isAbsolute(e) ? e : this._makeAbs(e)\n\n  if (this.mark)\n    e = this._mark(e)\n\n  if (this.absolute)\n    e = abs\n\n  if (this.matches[index][e])\n    return\n\n  if (this.nodir) {\n    var c = this.cache[abs]\n    if (c === 'DIR' || Array.isArray(c))\n      return\n  }\n\n  this.matches[index][e] = true\n\n  var st = this.statCache[abs]\n  if (st)\n    this.emit('stat', e, st)\n\n  this.emit('match', e)\n}\n\nGlob.prototype._readdirInGlobStar = function (abs, cb) {\n  if (this.aborted)\n    return\n\n  // follow all symlinked directories forever\n  // just proceed as if this is a non-globstar situation\n  if (this.follow)\n    return this._readdir(abs, false, cb)\n\n  var lstatkey = 'lstat\\0' + abs\n  var self = this\n  var lstatcb = inflight(lstatkey, lstatcb_)\n\n  if (lstatcb)\n    self.fs.lstat(abs, lstatcb)\n\n  function lstatcb_ (er, lstat) {\n    if (er && er.code === 'ENOENT')\n      return cb()\n\n    var isSym = lstat && lstat.isSymbolicLink()\n    self.symlinks[abs] = isSym\n\n    // If it's not a symlink or a dir, then it's definitely a regular file.\n    // don't bother doing a readdir in that case.\n    if (!isSym && lstat && !lstat.isDirectory()) {\n      self.cache[abs] = 'FILE'\n      cb()\n    } else\n      self._readdir(abs, false, cb)\n  }\n}\n\nGlob.prototype._readdir = function (abs, inGlobStar, cb) {\n  if (this.aborted)\n    return\n\n  cb = inflight('readdir\\0'+abs+'\\0'+inGlobStar, cb)\n  if (!cb)\n    return\n\n  //console.error('RD %j %j', +inGlobStar, abs)\n  if (inGlobStar && !ownProp(this.symlinks, abs))\n    return this._readdirInGlobStar(abs, cb)\n\n  if (ownProp(this.cache, abs)) {\n    var c = this.cache[abs]\n    if (!c || c === 'FILE')\n      return cb()\n\n    if (Array.isArray(c))\n      return cb(null, c)\n  }\n\n  var self = this\n  self.fs.readdir(abs, readdirCb(this, abs, cb))\n}\n\nfunction readdirCb (self, abs, cb) {\n  return function (er, entries) {\n    if (er)\n      self._readdirError(abs, er, cb)\n    else\n      self._readdirEntries(abs, entries, cb)\n  }\n}\n\nGlob.prototype._readdirEntries = function (abs, entries, cb) {\n  if (this.aborted)\n    return\n\n  // if we haven't asked to stat everything, then just\n  // assume that everything in there exists, so we can avoid\n  // having to stat it a second time.\n  if (!this.mark && !this.stat) {\n    for (var i = 0; i < entries.length; i ++) {\n      var e = entries[i]\n      if (abs === '/')\n        e = abs + e\n      else\n        e = abs + '/' + e\n      this.cache[e] = true\n    }\n  }\n\n  this.cache[abs] = entries\n  return cb(null, entries)\n}\n\nGlob.prototype._readdirError = function (f, er, cb) {\n  if (this.aborted)\n    return\n\n  // handle errors, and cache the information\n  switch (er.code) {\n    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n    case 'ENOTDIR': // totally normal. means it *does* exist.\n      var abs = this._makeAbs(f)\n      this.cache[abs] = 'FILE'\n      if (abs === this.cwdAbs) {\n        var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n        error.path = this.cwd\n        error.code = er.code\n        this.emit('error', error)\n        this.abort()\n      }\n      break\n\n    case 'ENOENT': // not terribly unusual\n    case 'ELOOP':\n    case 'ENAMETOOLONG':\n    case 'UNKNOWN':\n      this.cache[this._makeAbs(f)] = false\n      break\n\n    default: // some unusual error.  Treat as failure.\n      this.cache[this._makeAbs(f)] = false\n      if (this.strict) {\n        this.emit('error', er)\n        // If the error is handled, then we abort\n        // if not, we threw out of here\n        this.abort()\n      }\n      if (!this.silent)\n        console.error('glob error', er)\n      break\n  }\n\n  return cb()\n}\n\nGlob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n  var self = this\n  this._readdir(abs, inGlobStar, function (er, entries) {\n    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n  })\n}\n\n\nGlob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n  //console.error('pgs2', prefix, remain[0], entries)\n\n  // no entries means not a dir, so it can never have matches\n  // foo.txt/** doesn't match foo.txt\n  if (!entries)\n    return cb()\n\n  // test without the globstar, and with every child both below\n  // and replacing the globstar.\n  var remainWithoutGlobStar = remain.slice(1)\n  var gspref = prefix ? [ prefix ] : []\n  var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n  // the noGlobStar pattern exits the inGlobStar state\n  this._process(noGlobStar, index, false, cb)\n\n  var isSym = this.symlinks[abs]\n  var len = entries.length\n\n  // If it's a symlink, and we're in a globstar, then stop\n  if (isSym && inGlobStar)\n    return cb()\n\n  for (var i = 0; i < len; i++) {\n    var e = entries[i]\n    if (e.charAt(0) === '.' && !this.dot)\n      continue\n\n    // these two cases enter the inGlobStar state\n    var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n    this._process(instead, index, true, cb)\n\n    var below = gspref.concat(entries[i], remain)\n    this._process(below, index, true, cb)\n  }\n\n  cb()\n}\n\nGlob.prototype._processSimple = function (prefix, index, cb) {\n  // XXX review this.  Shouldn't it be doing the mounting etc\n  // before doing stat?  kinda weird?\n  var self = this\n  this._stat(prefix, function (er, exists) {\n    self._processSimple2(prefix, index, er, exists, cb)\n  })\n}\nGlob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {\n\n  //console.error('ps2', prefix, exists)\n\n  if (!this.matches[index])\n    this.matches[index] = Object.create(null)\n\n  // If it doesn't exist, then just mark the lack of results\n  if (!exists)\n    return cb()\n\n  if (prefix && isAbsolute(prefix) && !this.nomount) {\n    var trail = /[\\/\\\\]$/.test(prefix)\n    if (prefix.charAt(0) === '/') {\n      prefix = path.join(this.root, prefix)\n    } else {\n      prefix = path.resolve(this.root, prefix)\n      if (trail)\n        prefix += '/'\n    }\n  }\n\n  if (process.platform === 'win32')\n    prefix = prefix.replace(/\\\\/g, '/')\n\n  // Mark this as a match\n  this._emitMatch(index, prefix)\n  cb()\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlob.prototype._stat = function (f, cb) {\n  var abs = this._makeAbs(f)\n  var needDir = f.slice(-1) === '/'\n\n  if (f.length > this.maxLength)\n    return cb()\n\n  if (!this.stat && ownProp(this.cache, abs)) {\n    var c = this.cache[abs]\n\n    if (Array.isArray(c))\n      c = 'DIR'\n\n    // It exists, but maybe not how we need it\n    if (!needDir || c === 'DIR')\n      return cb(null, c)\n\n    if (needDir && c === 'FILE')\n      return cb()\n\n    // otherwise we have to stat, because maybe c=true\n    // if we know it exists, but not what it is.\n  }\n\n  var exists\n  var stat = this.statCache[abs]\n  if (stat !== undefined) {\n    if (stat === false)\n      return cb(null, stat)\n    else {\n      var type = stat.isDirectory() ? 'DIR' : 'FILE'\n      if (needDir && type === 'FILE')\n        return cb()\n      else\n        return cb(null, type, stat)\n    }\n  }\n\n  var self = this\n  var statcb = inflight('stat\\0' + abs, lstatcb_)\n  if (statcb)\n    self.fs.lstat(abs, statcb)\n\n  function lstatcb_ (er, lstat) {\n    if (lstat && lstat.isSymbolicLink()) {\n      // If it's a symlink, then treat it as the target, unless\n      // the target does not exist, then treat it as a file.\n      return self.fs.stat(abs, function (er, stat) {\n        if (er)\n          self._stat2(f, abs, null, lstat, cb)\n        else\n          self._stat2(f, abs, er, stat, cb)\n      })\n    } else {\n      self._stat2(f, abs, er, lstat, cb)\n    }\n  }\n}\n\nGlob.prototype._stat2 = function (f, abs, er, stat, cb) {\n  if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n    this.statCache[abs] = false\n    return cb()\n  }\n\n  var needDir = f.slice(-1) === '/'\n  this.statCache[abs] = stat\n\n  if (abs.slice(-1) === '/' && stat && !stat.isDirectory())\n    return cb(null, false, stat)\n\n  var c = true\n  if (stat)\n    c = stat.isDirectory() ? 'DIR' : 'FILE'\n  this.cache[abs] = this.cache[abs] || c\n\n  if (needDir && c === 'FILE')\n    return cb()\n\n  return cb(null, c, stat)\n}\n","const assert = require(\"assert\")\nconst path = require(\"path\")\nconst fs = require(\"fs\")\nlet glob = undefined\ntry {\n  glob = require(\"glob\")\n} catch (_err) {\n  // treat glob as optional.\n}\n\nconst defaultGlobOpts = {\n  nosort: true,\n  silent: true\n}\n\n// for EMFILE handling\nlet timeout = 0\n\nconst isWindows = (process.platform === \"win32\")\n\nconst defaults = options => {\n  const methods = [\n    'unlink',\n    'chmod',\n    'stat',\n    'lstat',\n    'rmdir',\n    'readdir'\n  ]\n  methods.forEach(m => {\n    options[m] = options[m] || fs[m]\n    m = m + 'Sync'\n    options[m] = options[m] || fs[m]\n  })\n\n  options.maxBusyTries = options.maxBusyTries || 3\n  options.emfileWait = options.emfileWait || 1000\n  if (options.glob === false) {\n    options.disableGlob = true\n  }\n  if (options.disableGlob !== true && glob === undefined) {\n    throw Error('glob dependency not found, set `options.disableGlob = true` if intentional')\n  }\n  options.disableGlob = options.disableGlob || false\n  options.glob = options.glob || defaultGlobOpts\n}\n\nconst rimraf = (p, options, cb) => {\n  if (typeof options === 'function') {\n    cb = options\n    options = {}\n  }\n\n  assert(p, 'rimraf: missing path')\n  assert.equal(typeof p, 'string', 'rimraf: path should be a string')\n  assert.equal(typeof cb, 'function', 'rimraf: callback function required')\n  assert(options, 'rimraf: invalid options argument provided')\n  assert.equal(typeof options, 'object', 'rimraf: options should be object')\n\n  defaults(options)\n\n  let busyTries = 0\n  let errState = null\n  let n = 0\n\n  const next = (er) => {\n    errState = errState || er\n    if (--n === 0)\n      cb(errState)\n  }\n\n  const afterGlob = (er, results) => {\n    if (er)\n      return cb(er)\n\n    n = results.length\n    if (n === 0)\n      return cb()\n\n    results.forEach(p => {\n      const CB = (er) => {\n        if (er) {\n          if ((er.code === \"EBUSY\" || er.code === \"ENOTEMPTY\" || er.code === \"EPERM\") &&\n              busyTries < options.maxBusyTries) {\n            busyTries ++\n            // try again, with the same exact callback as this one.\n            return setTimeout(() => rimraf_(p, options, CB), busyTries * 100)\n          }\n\n          // this one won't happen if graceful-fs is used.\n          if (er.code === \"EMFILE\" && timeout < options.emfileWait) {\n            return setTimeout(() => rimraf_(p, options, CB), timeout ++)\n          }\n\n          // already gone\n          if (er.code === \"ENOENT\") er = null\n        }\n\n        timeout = 0\n        next(er)\n      }\n      rimraf_(p, options, CB)\n    })\n  }\n\n  if (options.disableGlob || !glob.hasMagic(p))\n    return afterGlob(null, [p])\n\n  options.lstat(p, (er, stat) => {\n    if (!er)\n      return afterGlob(null, [p])\n\n    glob(p, options.glob, afterGlob)\n  })\n\n}\n\n// Two possible strategies.\n// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR\n// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR\n//\n// Both result in an extra syscall when you guess wrong.  However, there\n// are likely far more normal files in the world than directories.  This\n// is based on the assumption that a the average number of files per\n// directory is >= 1.\n//\n// If anyone ever complains about this, then I guess the strategy could\n// be made configurable somehow.  But until then, YAGNI.\nconst rimraf_ = (p, options, cb) => {\n  assert(p)\n  assert(options)\n  assert(typeof cb === 'function')\n\n  // sunos lets the root user unlink directories, which is... weird.\n  // so we have to lstat here and make sure it's not a dir.\n  options.lstat(p, (er, st) => {\n    if (er && er.code === \"ENOENT\")\n      return cb(null)\n\n    // Windows can EPERM on stat.  Life is suffering.\n    if (er && er.code === \"EPERM\" && isWindows)\n      fixWinEPERM(p, options, er, cb)\n\n    if (st && st.isDirectory())\n      return rmdir(p, options, er, cb)\n\n    options.unlink(p, er => {\n      if (er) {\n        if (er.code === \"ENOENT\")\n          return cb(null)\n        if (er.code === \"EPERM\")\n          return (isWindows)\n            ? fixWinEPERM(p, options, er, cb)\n            : rmdir(p, options, er, cb)\n        if (er.code === \"EISDIR\")\n          return rmdir(p, options, er, cb)\n      }\n      return cb(er)\n    })\n  })\n}\n\nconst fixWinEPERM = (p, options, er, cb) => {\n  assert(p)\n  assert(options)\n  assert(typeof cb === 'function')\n\n  options.chmod(p, 0o666, er2 => {\n    if (er2)\n      cb(er2.code === \"ENOENT\" ? null : er)\n    else\n      options.stat(p, (er3, stats) => {\n        if (er3)\n          cb(er3.code === \"ENOENT\" ? null : er)\n        else if (stats.isDirectory())\n          rmdir(p, options, er, cb)\n        else\n          options.unlink(p, cb)\n      })\n  })\n}\n\nconst fixWinEPERMSync = (p, options, er) => {\n  assert(p)\n  assert(options)\n\n  try {\n    options.chmodSync(p, 0o666)\n  } catch (er2) {\n    if (er2.code === \"ENOENT\")\n      return\n    else\n      throw er\n  }\n\n  let stats\n  try {\n    stats = options.statSync(p)\n  } catch (er3) {\n    if (er3.code === \"ENOENT\")\n      return\n    else\n      throw er\n  }\n\n  if (stats.isDirectory())\n    rmdirSync(p, options, er)\n  else\n    options.unlinkSync(p)\n}\n\nconst rmdir = (p, options, originalEr, cb) => {\n  assert(p)\n  assert(options)\n  assert(typeof cb === 'function')\n\n  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)\n  // if we guessed wrong, and it's not a directory, then\n  // raise the original error.\n  options.rmdir(p, er => {\n    if (er && (er.code === \"ENOTEMPTY\" || er.code === \"EEXIST\" || er.code === \"EPERM\"))\n      rmkids(p, options, cb)\n    else if (er && er.code === \"ENOTDIR\")\n      cb(originalEr)\n    else\n      cb(er)\n  })\n}\n\nconst rmkids = (p, options, cb) => {\n  assert(p)\n  assert(options)\n  assert(typeof cb === 'function')\n\n  options.readdir(p, (er, files) => {\n    if (er)\n      return cb(er)\n    let n = files.length\n    if (n === 0)\n      return options.rmdir(p, cb)\n    let errState\n    files.forEach(f => {\n      rimraf(path.join(p, f), options, er => {\n        if (errState)\n          return\n        if (er)\n          return cb(errState = er)\n        if (--n === 0)\n          options.rmdir(p, cb)\n      })\n    })\n  })\n}\n\n// this looks simpler, and is strictly *faster*, but will\n// tie up the JavaScript thread and fail on excessively\n// deep directory trees.\nconst rimrafSync = (p, options) => {\n  options = options || {}\n  defaults(options)\n\n  assert(p, 'rimraf: missing path')\n  assert.equal(typeof p, 'string', 'rimraf: path should be a string')\n  assert(options, 'rimraf: missing options')\n  assert.equal(typeof options, 'object', 'rimraf: options should be object')\n\n  let results\n\n  if (options.disableGlob || !glob.hasMagic(p)) {\n    results = [p]\n  } else {\n    try {\n      options.lstatSync(p)\n      results = [p]\n    } catch (er) {\n      results = glob.sync(p, options.glob)\n    }\n  }\n\n  if (!results.length)\n    return\n\n  for (let i = 0; i < results.length; i++) {\n    const p = results[i]\n\n    let st\n    try {\n      st = options.lstatSync(p)\n    } catch (er) {\n      if (er.code === \"ENOENT\")\n        return\n\n      // Windows can EPERM on stat.  Life is suffering.\n      if (er.code === \"EPERM\" && isWindows)\n        fixWinEPERMSync(p, options, er)\n    }\n\n    try {\n      // sunos lets the root user unlink directories, which is... weird.\n      if (st && st.isDirectory())\n        rmdirSync(p, options, null)\n      else\n        options.unlinkSync(p)\n    } catch (er) {\n      if (er.code === \"ENOENT\")\n        return\n      if (er.code === \"EPERM\")\n        return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)\n      if (er.code !== \"EISDIR\")\n        throw er\n\n      rmdirSync(p, options, er)\n    }\n  }\n}\n\nconst rmdirSync = (p, options, originalEr) => {\n  assert(p)\n  assert(options)\n\n  try {\n    options.rmdirSync(p)\n  } catch (er) {\n    if (er.code === \"ENOENT\")\n      return\n    if (er.code === \"ENOTDIR\")\n      throw originalEr\n    if (er.code === \"ENOTEMPTY\" || er.code === \"EEXIST\" || er.code === \"EPERM\")\n      rmkidsSync(p, options)\n  }\n}\n\nconst rmkidsSync = (p, options) => {\n  assert(p)\n  assert(options)\n  options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))\n\n  // We only end up here once we got ENOTEMPTY at least once, and\n  // at this point, we are guaranteed to have removed all the kids.\n  // So, we know that it won't be ENOENT or ENOTDIR or anything else.\n  // try really hard to delete stuff on windows, because it has a\n  // PROFOUNDLY annoying habit of not closing handles promptly when\n  // files are deleted, resulting in spurious ENOTEMPTY errors.\n  const retries = isWindows ? 100 : 1\n  let i = 0\n  do {\n    let threw = true\n    try {\n      const ret = options.rmdirSync(p, options)\n      threw = false\n      return ret\n    } finally {\n      if (++i < retries && threw)\n        continue\n    }\n  } while (true)\n}\n\nmodule.exports = rimraf\nrimraf.sync = rimrafSync\n","/*!\n * Tmp\n *\n * Copyright (c) 2011-2017 KARASZI Istvan <github@spam.raszi.hu>\n *\n * MIT Licensed\n */\n\n/*\n * Module dependencies.\n */\nconst fs = require('fs');\nconst os = require('os');\nconst path = require('path');\nconst crypto = require('crypto');\nconst _c = { fs: fs.constants, os: os.constants };\nconst rimraf = require('rimraf');\n\n/*\n * The working inner variables.\n */\nconst\n  // the random characters to choose from\n  RANDOM_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n\n  TEMPLATE_PATTERN = /XXXXXX/,\n\n  DEFAULT_TRIES = 3,\n\n  CREATE_FLAGS = (_c.O_CREAT || _c.fs.O_CREAT) | (_c.O_EXCL || _c.fs.O_EXCL) | (_c.O_RDWR || _c.fs.O_RDWR),\n\n  // constants are off on the windows platform and will not match the actual errno codes\n  IS_WIN32 = os.platform() === 'win32',\n  EBADF = _c.EBADF || _c.os.errno.EBADF,\n  ENOENT = _c.ENOENT || _c.os.errno.ENOENT,\n\n  DIR_MODE = 0o700 /* 448 */,\n  FILE_MODE = 0o600 /* 384 */,\n\n  EXIT = 'exit',\n\n  // this will hold the objects need to be removed on exit\n  _removeObjects = [],\n\n  // API change in fs.rmdirSync leads to error when passing in a second parameter, e.g. the callback\n  FN_RMDIR_SYNC = fs.rmdirSync.bind(fs),\n  FN_RIMRAF_SYNC = rimraf.sync;\n\nlet\n  _gracefulCleanup = false;\n\n/**\n * Gets a temporary file name.\n *\n * @param {(Options|tmpNameCallback)} options options or callback\n * @param {?tmpNameCallback} callback the callback function\n */\nfunction tmpName(options, callback) {\n  const\n    args = _parseArguments(options, callback),\n    opts = args[0],\n    cb = args[1];\n\n  try {\n    _assertAndSanitizeOptions(opts);\n  } catch (err) {\n    return cb(err);\n  }\n\n  let tries = opts.tries;\n  (function _getUniqueName() {\n    try {\n      const name = _generateTmpName(opts);\n\n      // check whether the path exists then retry if needed\n      fs.stat(name, function (err) {\n        /* istanbul ignore else */\n        if (!err) {\n          /* istanbul ignore else */\n          if (tries-- > 0) return _getUniqueName();\n\n          return cb(new Error('Could not get a unique tmp filename, max tries reached ' + name));\n        }\n\n        cb(null, name);\n      });\n    } catch (err) {\n      cb(err);\n    }\n  }());\n}\n\n/**\n * Synchronous version of tmpName.\n *\n * @param {Object} options\n * @returns {string} the generated random name\n * @throws {Error} if the options are invalid or could not generate a filename\n */\nfunction tmpNameSync(options) {\n  const\n    args = _parseArguments(options),\n    opts = args[0];\n\n  _assertAndSanitizeOptions(opts);\n\n  let tries = opts.tries;\n  do {\n    const name = _generateTmpName(opts);\n    try {\n      fs.statSync(name);\n    } catch (e) {\n      return name;\n    }\n  } while (tries-- > 0);\n\n  throw new Error('Could not get a unique tmp filename, max tries reached');\n}\n\n/**\n * Creates and opens a temporary file.\n *\n * @param {(Options|null|undefined|fileCallback)} options the config options or the callback function or null or undefined\n * @param {?fileCallback} callback\n */\nfunction file(options, callback) {\n  const\n    args = _parseArguments(options, callback),\n    opts = args[0],\n    cb = args[1];\n\n  // gets a temporary filename\n  tmpName(opts, function _tmpNameCreated(err, name) {\n    /* istanbul ignore else */\n    if (err) return cb(err);\n\n    // create and open the file\n    fs.open(name, CREATE_FLAGS, opts.mode || FILE_MODE, function _fileCreated(err, fd) {\n      /* istanbu ignore else */\n      if (err) return cb(err);\n\n      if (opts.discardDescriptor) {\n        return fs.close(fd, function _discardCallback(possibleErr) {\n          // the chance of getting an error on close here is rather low and might occur in the most edgiest cases only\n          return cb(possibleErr, name, undefined, _prepareTmpFileRemoveCallback(name, -1, opts, false));\n        });\n      } else {\n        // detachDescriptor passes the descriptor whereas discardDescriptor closes it, either way, we no longer care\n        // about the descriptor\n        const discardOrDetachDescriptor = opts.discardDescriptor || opts.detachDescriptor;\n        cb(null, name, fd, _prepareTmpFileRemoveCallback(name, discardOrDetachDescriptor ? -1 : fd, opts, false));\n      }\n    });\n  });\n}\n\n/**\n * Synchronous version of file.\n *\n * @param {Options} options\n * @returns {FileSyncObject} object consists of name, fd and removeCallback\n * @throws {Error} if cannot create a file\n */\nfunction fileSync(options) {\n  const\n    args = _parseArguments(options),\n    opts = args[0];\n\n  const discardOrDetachDescriptor = opts.discardDescriptor || opts.detachDescriptor;\n  const name = tmpNameSync(opts);\n  var fd = fs.openSync(name, CREATE_FLAGS, opts.mode || FILE_MODE);\n  /* istanbul ignore else */\n  if (opts.discardDescriptor) {\n    fs.closeSync(fd);\n    fd = undefined;\n  }\n\n  return {\n    name: name,\n    fd: fd,\n    removeCallback: _prepareTmpFileRemoveCallback(name, discardOrDetachDescriptor ? -1 : fd, opts, true)\n  };\n}\n\n/**\n * Creates a temporary directory.\n *\n * @param {(Options|dirCallback)} options the options or the callback function\n * @param {?dirCallback} callback\n */\nfunction dir(options, callback) {\n  const\n    args = _parseArguments(options, callback),\n    opts = args[0],\n    cb = args[1];\n\n  // gets a temporary filename\n  tmpName(opts, function _tmpNameCreated(err, name) {\n    /* istanbul ignore else */\n    if (err) return cb(err);\n\n    // create the directory\n    fs.mkdir(name, opts.mode || DIR_MODE, function _dirCreated(err) {\n      /* istanbul ignore else */\n      if (err) return cb(err);\n\n      cb(null, name, _prepareTmpDirRemoveCallback(name, opts, false));\n    });\n  });\n}\n\n/**\n * Synchronous version of dir.\n *\n * @param {Options} options\n * @returns {DirSyncObject} object consists of name and removeCallback\n * @throws {Error} if it cannot create a directory\n */\nfunction dirSync(options) {\n  const\n    args = _parseArguments(options),\n    opts = args[0];\n\n  const name = tmpNameSync(opts);\n  fs.mkdirSync(name, opts.mode || DIR_MODE);\n\n  return {\n    name: name,\n    removeCallback: _prepareTmpDirRemoveCallback(name, opts, true)\n  };\n}\n\n/**\n * Removes files asynchronously.\n *\n * @param {Object} fdPath\n * @param {Function} next\n * @private\n */\nfunction _removeFileAsync(fdPath, next) {\n  const _handler = function (err) {\n    if (err && !_isENOENT(err)) {\n      // reraise any unanticipated error\n      return next(err);\n    }\n    next();\n  };\n\n  if (0 <= fdPath[0])\n    fs.close(fdPath[0], function () {\n      fs.unlink(fdPath[1], _handler);\n    });\n  else fs.unlink(fdPath[1], _handler);\n}\n\n/**\n * Removes files synchronously.\n *\n * @param {Object} fdPath\n * @private\n */\nfunction _removeFileSync(fdPath) {\n  let rethrownException = null;\n  try {\n    if (0 <= fdPath[0]) fs.closeSync(fdPath[0]);\n  } catch (e) {\n    // reraise any unanticipated error\n    if (!_isEBADF(e) && !_isENOENT(e)) throw e;\n  } finally {\n    try {\n      fs.unlinkSync(fdPath[1]);\n    }\n    catch (e) {\n      // reraise any unanticipated error\n      if (!_isENOENT(e)) rethrownException = e;\n    }\n  }\n  if (rethrownException !== null) {\n    throw rethrownException;\n  }\n}\n\n/**\n * Prepares the callback for removal of the temporary file.\n *\n * Returns either a sync callback or a async callback depending on whether\n * fileSync or file was called, which is expressed by the sync parameter.\n *\n * @param {string} name the path of the file\n * @param {number} fd file descriptor\n * @param {Object} opts\n * @param {boolean} sync\n * @returns {fileCallback | fileCallbackSync}\n * @private\n */\nfunction _prepareTmpFileRemoveCallback(name, fd, opts, sync) {\n  const removeCallbackSync = _prepareRemoveCallback(_removeFileSync, [fd, name], sync);\n  const removeCallback = _prepareRemoveCallback(_removeFileAsync, [fd, name], sync, removeCallbackSync);\n\n  if (!opts.keep) _removeObjects.unshift(removeCallbackSync);\n\n  return sync ? removeCallbackSync : removeCallback;\n}\n\n/**\n * Prepares the callback for removal of the temporary directory.\n *\n * Returns either a sync callback or a async callback depending on whether\n * tmpFileSync or tmpFile was called, which is expressed by the sync parameter.\n *\n * @param {string} name\n * @param {Object} opts\n * @param {boolean} sync\n * @returns {Function} the callback\n * @private\n */\nfunction _prepareTmpDirRemoveCallback(name, opts, sync) {\n  const removeFunction = opts.unsafeCleanup ? rimraf : fs.rmdir.bind(fs);\n  const removeFunctionSync = opts.unsafeCleanup ? FN_RIMRAF_SYNC : FN_RMDIR_SYNC;\n  const removeCallbackSync = _prepareRemoveCallback(removeFunctionSync, name, sync);\n  const removeCallback = _prepareRemoveCallback(removeFunction, name, sync, removeCallbackSync);\n  if (!opts.keep) _removeObjects.unshift(removeCallbackSync);\n\n  return sync ? removeCallbackSync : removeCallback;\n}\n\n/**\n * Creates a guarded function wrapping the removeFunction call.\n *\n * The cleanup callback is save to be called multiple times.\n * Subsequent invocations will be ignored.\n *\n * @param {Function} removeFunction\n * @param {string} fileOrDirName\n * @param {boolean} sync\n * @param {cleanupCallbackSync?} cleanupCallbackSync\n * @returns {cleanupCallback | cleanupCallbackSync}\n * @private\n */\nfunction _prepareRemoveCallback(removeFunction, fileOrDirName, sync, cleanupCallbackSync) {\n  let called = false;\n\n  // if sync is true, the next parameter will be ignored\n  return function _cleanupCallback(next) {\n\n    /* istanbul ignore else */\n    if (!called) {\n      // remove cleanupCallback from cache\n      const toRemove = cleanupCallbackSync || _cleanupCallback;\n      const index = _removeObjects.indexOf(toRemove);\n      /* istanbul ignore else */\n      if (index >= 0) _removeObjects.splice(index, 1);\n\n      called = true;\n      if (sync || removeFunction === FN_RMDIR_SYNC || removeFunction === FN_RIMRAF_SYNC) {\n        return removeFunction(fileOrDirName);\n      } else {\n        return removeFunction(fileOrDirName, next || function() {});\n      }\n    }\n  };\n}\n\n/**\n * The garbage collector.\n *\n * @private\n */\nfunction _garbageCollector() {\n  /* istanbul ignore else */\n  if (!_gracefulCleanup) return;\n\n  // the function being called removes itself from _removeObjects,\n  // loop until _removeObjects is empty\n  while (_removeObjects.length) {\n    try {\n      _removeObjects[0]();\n    } catch (e) {\n      // already removed?\n    }\n  }\n}\n\n/**\n * Random name generator based on crypto.\n * Adapted from http://blog.tompawlak.org/how-to-generate-random-values-nodejs-javascript\n *\n * @param {number} howMany\n * @returns {string} the generated random name\n * @private\n */\nfunction _randomChars(howMany) {\n  let\n    value = [],\n    rnd = null;\n\n  // make sure that we do not fail because we ran out of entropy\n  try {\n    rnd = crypto.randomBytes(howMany);\n  } catch (e) {\n    rnd = crypto.pseudoRandomBytes(howMany);\n  }\n\n  for (var i = 0; i < howMany; i++) {\n    value.push(RANDOM_CHARS[rnd[i] % RANDOM_CHARS.length]);\n  }\n\n  return value.join('');\n}\n\n/**\n * Helper which determines whether a string s is blank, that is undefined, or empty or null.\n *\n * @private\n * @param {string} s\n * @returns {Boolean} true whether the string s is blank, false otherwise\n */\nfunction _isBlank(s) {\n  return s === null || _isUndefined(s) || !s.trim();\n}\n\n/**\n * Checks whether the `obj` parameter is defined or not.\n *\n * @param {Object} obj\n * @returns {boolean} true if the object is undefined\n * @private\n */\nfunction _isUndefined(obj) {\n  return typeof obj === 'undefined';\n}\n\n/**\n * Parses the function arguments.\n *\n * This function helps to have optional arguments.\n *\n * @param {(Options|null|undefined|Function)} options\n * @param {?Function} callback\n * @returns {Array} parsed arguments\n * @private\n */\nfunction _parseArguments(options, callback) {\n  /* istanbul ignore else */\n  if (typeof options === 'function') {\n    return [{}, options];\n  }\n\n  /* istanbul ignore else */\n  if (_isUndefined(options)) {\n    return [{}, callback];\n  }\n\n  // copy options so we do not leak the changes we make internally\n  const actualOptions = {};\n  for (const key of Object.getOwnPropertyNames(options)) {\n    actualOptions[key] = options[key];\n  }\n\n  return [actualOptions, callback];\n}\n\n/**\n * Generates a new temporary name.\n *\n * @param {Object} opts\n * @returns {string} the new random name according to opts\n * @private\n */\nfunction _generateTmpName(opts) {\n\n  const tmpDir = opts.tmpdir;\n\n  /* istanbul ignore else */\n  if (!_isUndefined(opts.name))\n    return path.join(tmpDir, opts.dir, opts.name);\n\n  /* istanbul ignore else */\n  if (!_isUndefined(opts.template))\n    return path.join(tmpDir, opts.dir, opts.template).replace(TEMPLATE_PATTERN, _randomChars(6));\n\n  // prefix and postfix\n  const name = [\n    opts.prefix ? opts.prefix : 'tmp',\n    '-',\n    process.pid,\n    '-',\n    _randomChars(12),\n    opts.postfix ? '-' + opts.postfix : ''\n  ].join('');\n\n  return path.join(tmpDir, opts.dir, name);\n}\n\n/**\n * Asserts whether the specified options are valid, also sanitizes options and provides sane defaults for missing\n * options.\n *\n * @param {Options} options\n * @private\n */\nfunction _assertAndSanitizeOptions(options) {\n\n  options.tmpdir = _getTmpDir(options);\n\n  const tmpDir = options.tmpdir;\n\n  /* istanbul ignore else */\n  if (!_isUndefined(options.name))\n    _assertIsRelative(options.name, 'name', tmpDir);\n  /* istanbul ignore else */\n  if (!_isUndefined(options.dir))\n    _assertIsRelative(options.dir, 'dir', tmpDir);\n  /* istanbul ignore else */\n  if (!_isUndefined(options.template)) {\n    _assertIsRelative(options.template, 'template', tmpDir);\n    if (!options.template.match(TEMPLATE_PATTERN))\n      throw new Error(`Invalid template, found \"${options.template}\".`);\n  }\n  /* istanbul ignore else */\n  if (!_isUndefined(options.tries) && isNaN(options.tries) || options.tries < 0)\n    throw new Error(`Invalid tries, found \"${options.tries}\".`);\n\n  // if a name was specified we will try once\n  options.tries = _isUndefined(options.name) ? options.tries || DEFAULT_TRIES : 1;\n  options.keep = !!options.keep;\n  options.detachDescriptor = !!options.detachDescriptor;\n  options.discardDescriptor = !!options.discardDescriptor;\n  options.unsafeCleanup = !!options.unsafeCleanup;\n\n  // sanitize dir, also keep (multiple) blanks if the user, purportedly sane, requests us to\n  options.dir = _isUndefined(options.dir) ? '' : path.relative(tmpDir, _resolvePath(options.dir, tmpDir));\n  options.template = _isUndefined(options.template) ? undefined : path.relative(tmpDir, _resolvePath(options.template, tmpDir));\n  // sanitize further if template is relative to options.dir\n  options.template = _isBlank(options.template) ? undefined : path.relative(options.dir, options.template);\n\n  // for completeness' sake only, also keep (multiple) blanks if the user, purportedly sane, requests us to\n  options.name = _isUndefined(options.name) ? undefined : _sanitizeName(options.name);\n  options.prefix = _isUndefined(options.prefix) ? '' : options.prefix;\n  options.postfix = _isUndefined(options.postfix) ? '' : options.postfix;\n}\n\n/**\n * Resolve the specified path name in respect to tmpDir.\n *\n * The specified name might include relative path components, e.g. ../\n * so we need to resolve in order to be sure that is is located inside tmpDir\n *\n * @param name\n * @param tmpDir\n * @returns {string}\n * @private\n */\nfunction _resolvePath(name, tmpDir) {\n  const sanitizedName = _sanitizeName(name);\n  if (sanitizedName.startsWith(tmpDir)) {\n    return path.resolve(sanitizedName);\n  } else {\n    return path.resolve(path.join(tmpDir, sanitizedName));\n  }\n}\n\n/**\n * Sanitize the specified path name by removing all quote characters.\n *\n * @param name\n * @returns {string}\n * @private\n */\nfunction _sanitizeName(name) {\n  if (_isBlank(name)) {\n    return name;\n  }\n  return name.replace(/[\"']/g, '');\n}\n\n/**\n * Asserts whether specified name is relative to the specified tmpDir.\n *\n * @param {string} name\n * @param {string} option\n * @param {string} tmpDir\n * @throws {Error}\n * @private\n */\nfunction _assertIsRelative(name, option, tmpDir) {\n  if (option === 'name') {\n    // assert that name is not absolute and does not contain a path\n    if (path.isAbsolute(name))\n      throw new Error(`${option} option must not contain an absolute path, found \"${name}\".`);\n    // must not fail on valid .<name> or ..<name> or similar such constructs\n    let basename = path.basename(name);\n    if (basename === '..' || basename === '.' || basename !== name)\n      throw new Error(`${option} option must not contain a path, found \"${name}\".`);\n  }\n  else { // if (option === 'dir' || option === 'template') {\n    // assert that dir or template are relative to tmpDir\n    if (path.isAbsolute(name) && !name.startsWith(tmpDir)) {\n      throw new Error(`${option} option must be relative to \"${tmpDir}\", found \"${name}\".`);\n    }\n    let resolvedPath = _resolvePath(name, tmpDir);\n    if (!resolvedPath.startsWith(tmpDir))\n      throw new Error(`${option} option must be relative to \"${tmpDir}\", found \"${resolvedPath}\".`);\n  }\n}\n\n/**\n * Helper for testing against EBADF to compensate changes made to Node 7.x under Windows.\n *\n * @private\n */\nfunction _isEBADF(error) {\n  return _isExpectedError(error, -EBADF, 'EBADF');\n}\n\n/**\n * Helper for testing against ENOENT to compensate changes made to Node 7.x under Windows.\n *\n * @private\n */\nfunction _isENOENT(error) {\n  return _isExpectedError(error, -ENOENT, 'ENOENT');\n}\n\n/**\n * Helper to determine whether the expected error code matches the actual code and errno,\n * which will differ between the supported node versions.\n *\n * - Node >= 7.0:\n *   error.code {string}\n *   error.errno {number} any numerical value will be negated\n *\n * CAVEAT\n *\n * On windows, the errno for EBADF is -4083 but os.constants.errno.EBADF is different and we must assume that ENOENT\n * is no different here.\n *\n * @param {SystemError} error\n * @param {number} errno\n * @param {string} code\n * @private\n */\nfunction _isExpectedError(error, errno, code) {\n  return IS_WIN32 ? error.code === code : error.code === code && error.errno === errno;\n}\n\n/**\n * Sets the graceful cleanup.\n *\n * If graceful cleanup is set, tmp will remove all controlled temporary objects on process exit, otherwise the\n * temporary objects will remain in place, waiting to be cleaned up on system restart or otherwise scheduled temporary\n * object removals.\n */\nfunction setGracefulCleanup() {\n  _gracefulCleanup = true;\n}\n\n/**\n * Returns the currently configured tmp dir from os.tmpdir().\n *\n * @private\n * @param {?Options} options\n * @returns {string} the currently configured tmp dir\n */\nfunction _getTmpDir(options) {\n  return path.resolve(_sanitizeName(options && options.tmpdir || os.tmpdir()));\n}\n\n// Install process exit listener\nprocess.addListener(EXIT, _garbageCollector);\n\n/**\n * Configuration options.\n *\n * @typedef {Object} Options\n * @property {?boolean} keep the temporary object (file or dir) will not be garbage collected\n * @property {?number} tries the number of tries before give up the name generation\n * @property (?int) mode the access mode, defaults are 0o700 for directories and 0o600 for files\n * @property {?string} template the \"mkstemp\" like filename template\n * @property {?string} name fixed name relative to tmpdir or the specified dir option\n * @property {?string} dir tmp directory relative to the root tmp directory in use\n * @property {?string} prefix prefix for the generated name\n * @property {?string} postfix postfix for the generated name\n * @property {?string} tmpdir the root tmp directory which overrides the os tmpdir\n * @property {?boolean} unsafeCleanup recursively removes the created temporary directory, even when it's not empty\n * @property {?boolean} detachDescriptor detaches the file descriptor, caller is responsible for closing the file, tmp will no longer try closing the file during garbage collection\n * @property {?boolean} discardDescriptor discards the file descriptor (closes file, fd is -1), tmp will no longer try closing the file during garbage collection\n */\n\n/**\n * @typedef {Object} FileSyncObject\n * @property {string} name the name of the file\n * @property {string} fd the file descriptor or -1 if the fd has been discarded\n * @property {fileCallback} removeCallback the callback function to remove the file\n */\n\n/**\n * @typedef {Object} DirSyncObject\n * @property {string} name the name of the directory\n * @property {fileCallback} removeCallback the callback function to remove the directory\n */\n\n/**\n * @callback tmpNameCallback\n * @param {?Error} err the error object if anything goes wrong\n * @param {string} name the temporary file name\n */\n\n/**\n * @callback fileCallback\n * @param {?Error} err the error object if anything goes wrong\n * @param {string} name the temporary file name\n * @param {number} fd the file descriptor or -1 if the fd had been discarded\n * @param {cleanupCallback} fn the cleanup callback function\n */\n\n/**\n * @callback fileCallbackSync\n * @param {?Error} err the error object if anything goes wrong\n * @param {string} name the temporary file name\n * @param {number} fd the file descriptor or -1 if the fd had been discarded\n * @param {cleanupCallbackSync} fn the cleanup callback function\n */\n\n/**\n * @callback dirCallback\n * @param {?Error} err the error object if anything goes wrong\n * @param {string} name the temporary file name\n * @param {cleanupCallback} fn the cleanup callback function\n */\n\n/**\n * @callback dirCallbackSync\n * @param {?Error} err the error object if anything goes wrong\n * @param {string} name the temporary file name\n * @param {cleanupCallbackSync} fn the cleanup callback function\n */\n\n/**\n * Removes the temporary created file or directory.\n *\n * @callback cleanupCallback\n * @param {simpleCallback} [next] function to call whenever the tmp object needs to be removed\n */\n\n/**\n * Removes the temporary created file or directory.\n *\n * @callback cleanupCallbackSync\n */\n\n/**\n * Callback function for function composition.\n * @see {@link https://github.com/raszi/node-tmp/issues/57|raszi/node-tmp#57}\n *\n * @callback simpleCallback\n */\n\n// exporting all the needed methods\n\n// evaluate _getTmpDir() lazily, mainly for simplifying testing but it also will\n// allow users to reconfigure the temporary directory\nObject.defineProperty(module.exports, 'tmpdir', {\n  enumerable: true,\n  configurable: false,\n  get: function () {\n    return _getTmpDir();\n  }\n});\n\nmodule.exports.dir = dir;\nmodule.exports.dirSync = dirSync;\n\nmodule.exports.file = file;\nmodule.exports.fileSync = fileSync;\n\nmodule.exports.tmpName = tmpName;\nmodule.exports.tmpNameSync = tmpNameSync;\n\nmodule.exports.setGracefulCleanup = setGracefulCleanup;\n","export { ListenersCollector } from \"./admin\";\nexport {\n  Classic,\n  classicKinds,\n  ClassicListenersCollector,\n  ClassicLoader,\n} from \"./admin/classic\";\nexport * from \"./player/classic\";\nexport * from \"./player/classic/react\";\nexport * from \"./player/react\";\nexport * from \"./utils/console\";\n","import { SubAttributesPayload } from \"@empirica/tajriba\";\nimport { BehaviorSubject, Observable } from \"rxjs\";\nimport { JsonValue } from \"../utils/json\";\n\nexport class Globals {\n  protected attrs = new Map<string, BehaviorSubject<JsonValue | undefined>>();\n  private updates = new Map<string, JsonValue | undefined>();\n  public self: BehaviorSubject<Globals | undefined>;\n\n  constructor(globals: Observable<SubAttributesPayload>) {\n    this.self = new BehaviorSubject<Globals | undefined>(undefined);\n\n    globals.subscribe({\n      next: ({ attribute, done }) => {\n        if (attribute) {\n          let val = undefined;\n          if (attribute.val) {\n            val = JSON.parse(attribute.val);\n          }\n\n          this.updates.set(attribute.key, val);\n        }\n\n        if (done) {\n          for (const [key, val] of this.updates) {\n            this.obs(key).next(val);\n          }\n\n          this.updates.clear();\n\n          if (this.self) {\n            this.self.next(this);\n          }\n        }\n      },\n    });\n  }\n\n  get(key: string): JsonValue | undefined {\n    const o = this.attrs.get(key);\n    if (o) {\n      return o.getValue();\n    }\n\n    return undefined;\n  }\n\n  obs(key: string) {\n    let o = this.attrs.get(key);\n    if (!o) {\n      o = new BehaviorSubject<JsonValue | undefined>(undefined);\n      this.attrs.set(key, o);\n    }\n\n    return o;\n  }\n}\n","import { ParticipantIdent, Tajriba } from \"@empirica/tajriba\";\nimport { BehaviorSubject } from \"rxjs\";\nimport { error } from \"../utils/console\";\nimport { bs } from \"../utils/object\";\n\nexport const ErrNotConnected = new Error(\"not connected\");\n\nexport class TajribaConnection {\n  readonly tajriba: Tajriba;\n  private _connected = bs(false);\n  private _connecting: BehaviorSubject<boolean> = bs(true);\n  private _stopped = bs(false);\n\n  constructor(private url: string) {\n    this.tajriba = Tajriba.connect(this.url);\n    this._connected.next(this.tajriba.connected);\n\n    this.tajriba.on(\"connected\", () => {\n      this._connected.next(true);\n      this._connecting.next(false);\n    });\n\n    this.tajriba.on(\"disconnected\", () => {\n      if (this._connected.getValue()) {\n        this._connected.next(false);\n      }\n      if (!this._connecting.getValue()) {\n        this._connecting.next(true);\n      }\n    });\n\n    this.tajriba.on(\"error\", (err) => {\n      error(\"connection error\", err);\n    });\n  }\n\n  get connecting() {\n    return this._connecting;\n  }\n\n  get connected() {\n    return this._connected;\n  }\n\n  get stopped() {\n    return this._stopped;\n  }\n\n  async sessionParticipant(token: string, pident: ParticipantIdent) {\n    if (!this._connected.getValue()) {\n      throw ErrNotConnected;\n    }\n\n    return await this.tajriba.sessionParticipant(token, pident);\n  }\n\n  async sessionAdmin(token: string) {\n    if (!this._connected.getValue()) {\n      throw ErrNotConnected;\n    }\n\n    return await this.tajriba.sessionAdmin(token);\n  }\n\n  stop() {\n    if (this._stopped.getValue()) {\n      return;\n    }\n\n    if (this.tajriba) {\n      this.tajriba.removeAllListeners(\"connected\");\n      this.tajriba.removeAllListeners(\"disconnected\");\n      this.tajriba.stop();\n    }\n\n    this._connecting.next(false);\n    this._connected.next(false);\n    this._stopped.next(true);\n  }\n}\n","/* c8 ignore start */\n\nconst isBrowser =\n  typeof window !== \"undefined\" && typeof window.document !== \"undefined\";\n\nenum Color {\n  Bold = 1,\n\n  Black = 30,\n  Red,\n  Green,\n  Yellow,\n  Blue,\n  Magenta,\n  Cyan,\n  White,\n\n  DarkGray = 90,\n}\n\nexport type LogLine = { level: string; args: any[] };\nexport class LogsMock {\n  public logs: LogLine[] = [];\n\n  log(line: LogLine) {\n    this.logs.push(line);\n  }\n\n  clear() {\n    this.logs = [];\n  }\n}\n\nlet logsMock: LogsMock | undefined;\nexport function captureLogs(cb: () => void): LogLine[] {\n  const lm = mockLogging();\n  cb();\n  const ret = lm.logs;\n  stopMockLogging();\n\n  return ret;\n}\n\nexport async function captureLogsAsync(\n  cb: () => Promise<void>\n): Promise<LogLine[]> {\n  const lm = mockLogging();\n  await cb();\n  const ret = lm.logs;\n  stopMockLogging();\n\n  return ret;\n}\n\nexport function mockLogging() {\n  if (!logsMock) {\n    logsMock = new LogsMock();\n  }\n\n  return logsMock;\n}\n\nexport function stopMockLogging() {\n  logsMock = undefined;\n}\n\nconst colorHex = {\n  [Color.Bold]: \"font-weight: bold\",\n  [Color.Black]: \"color: #000000\",\n  [Color.Red]: \"color: #cc0000\",\n  [Color.Green]: \"color: #4e9a06\",\n  [Color.Yellow]: \"color: #c4a000\",\n  [Color.Blue]: \"color: #729fcf\",\n  [Color.Magenta]: \"color: #75507b\",\n  [Color.Cyan]: \"color: #06989a\",\n  [Color.White]: \"color: #d3d7cf\",\n  [Color.DarkGray]: \"color: #555753\",\n};\n\nexport const levels: { [key: string]: number } = {\n  trace: 0,\n  debug: 1,\n  log: 2,\n  info: 2,\n  warn: 3,\n  error: 4,\n};\n\nconst reversLevels: { [key: number]: string } = {};\nfor (const key in levels) {\n  reversLevels[levels[key]!] = key;\n}\n\nlet currentLevel = 2;\n\nexport function setLogLevel(level: keyof typeof levels) {\n  const lvl = levels[level];\n  if (lvl === undefined) {\n    return;\n  }\n\n  currentLevel = lvl;\n}\n\nfunction formatConsoleDate(date: Date, level: string[]) {\n  var hour = date.getHours();\n  var minutes = date.getMinutes();\n  var seconds = date.getSeconds();\n  var milliseconds = date.getMilliseconds();\n\n  const str =\n    (hour < 10 ? \"0\" + hour : hour) +\n    \":\" +\n    (minutes < 10 ? \"0\" + minutes : minutes) +\n    \":\" +\n    (seconds < 10 ? \"0\" + seconds : seconds) +\n    \".\" +\n    (\"00\" + milliseconds).slice(-3);\n\n  if (isBrowser) {\n    const ts = colorize(str, Color.DarkGray).concat(level);\n    return [ts[0] + \" \" + level[0], ts[1], level[1]];\n  }\n\n  return colorize(str, Color.DarkGray).concat(level);\n}\n\nconst createLogger = (lvl: number, level: string[]) => {\n  return (...args: any[]) => {\n    if (lvl < currentLevel) {\n      return;\n    }\n\n    if (logsMock) {\n      logsMock.log({ level: reversLevels[lvl]!, args: args });\n\n      return;\n    }\n\n    if (args.length === 1) {\n      switch (typeof args[0]) {\n        case \"string\":\n          for (const line of args[0].split(\"\\n\")) {\n            console.log(...formatConsoleDate(new Date(), level).concat(line));\n          }\n          return;\n\n        case \"object\":\n          if (args[0] instanceof Error) {\n            const error = args[0] as Error;\n            const prettyErr =\n              error.name +\n              \": \" +\n              error.message.replace(new RegExp(`^${error.name}[: ]*`), \"\") +\n              \"\\n\" +\n              (error.stack || \"\")\n                .split(\"\\n\")\n                .map((line) => line.trim())\n                .map((line) => {\n                  if (line.startsWith(error.name + \": \" + error.message))\n                    return null;\n\n                  if (line.startsWith(\"at\")) {\n                    return \"  \" + line;\n                  }\n\n                  return line;\n                })\n                .filter(Boolean)\n                .join(\"\\n\");\n\n            for (const line of prettyErr.split(\"\\n\")) {\n              console.log(...formatConsoleDate(new Date(), level).concat(line));\n            }\n\n            return;\n          }\n      }\n    }\n\n    console.log(...formatConsoleDate(new Date(), level).concat(args));\n  };\n};\n\nfunction colorize(s: string, ...cc: Color[]): string[] {\n  if (isBrowser) {\n    const attr = [];\n    for (const c of cc) {\n      attr.push(colorHex[c]);\n    }\n\n    return [`%c${s}`, attr.join(\"; \")];\n  }\n\n  let out = \"\";\n  for (const c of cc) {\n    out += `\\x1b[${c}m`;\n  }\n  out += `${s}\\x1b[0m`;\n\n  return [out];\n}\n\nexport const trace = createLogger(0, colorize(\"TRC\", Color.Magenta));\nexport const debug = createLogger(1, colorize(\"DBG\", Color.Yellow));\nexport const log = createLogger(2, colorize(\"LOG\", Color.Yellow));\nexport const info = createLogger(2, colorize(\"INF\", Color.Green));\nexport const warn = createLogger(3, colorize(\"WRN\", Color.Cyan));\nexport const error = createLogger(4, colorize(\"ERR\", Color.Red, Color.Bold));\n\n// export {\n//   trace,\n//   debug,\n//   log,\n//   info,\n//   warn,\n//   error,\n// };\n\n// export function warn(...args: string[]) {}\n","/* c8 ignore start */\n\nimport { BehaviorSubject } from \"rxjs\";\n\nexport function bs<T>(init: T) {\n  return new BehaviorSubject<T>(init);\n}\n\nexport function bsu<T>(init: T | undefined = undefined) {\n  return new BehaviorSubject<T | undefined>(init);\n}\n\nexport function deepEqual(obj1: any, obj2: any) {\n  if (obj1 === obj2)\n    // it's just the same object. No need to compare.\n    return true;\n\n  if (isPrimitive(obj1) && isPrimitive(obj2))\n    // compare primitives\n    return obj1 === obj2;\n\n  if (Object.keys(obj1).length !== Object.keys(obj2).length) return false;\n\n  // compare objects with same number of keys\n  for (let key in obj1) {\n    if (!(key in obj2)) return false; //other object doesn't have this prop\n    if (!deepEqual(obj1[key], obj2[key])) return false;\n  }\n\n  return true;\n}\n\n//check if value is primitive\nfunction isPrimitive(obj: any) {\n  return obj !== Object(obj);\n}\n","import { Observable, ReplaySubject } from \"rxjs\";\nimport {\n  Attribute,\n  AttributeChange,\n  Attributes as SharedAttributes,\n} from \"../shared/attributes\";\nimport { warn } from \"../utils/console\";\n\nexport type AttributeMsg = {\n  attribute?: Attribute;\n  done: boolean;\n};\n\nexport class Attributes extends SharedAttributes {\n  protected attrsByKind = new Map<\n    string,\n    Map<string, Map<string, Attribute>>\n  >();\n  private attribSubs = new Map<\n    string,\n    Map<string, ReplaySubject<AttributeMsg>>\n  >();\n\n  subscribeAttribute(kind: string, key: string): Observable<AttributeMsg> {\n    if (!this.attribSubs.has(kind)) {\n      this.attribSubs.set(kind, new Map<string, ReplaySubject<AttributeMsg>>());\n    }\n\n    const keyMap = this.attribSubs.get(kind)!;\n    let sub = keyMap.get(key);\n    if (!sub) {\n      sub = new ReplaySubject<AttributeMsg>();\n      keyMap.set(key, sub);\n\n      const attrByScopeID = this.attrsByKind.get(kind);\n\n      setTimeout(() => {\n        if (!attrByScopeID) {\n          sub!.next({ done: true });\n          return;\n        }\n\n        let attrs = [];\n        for (const [_, attrByKey] of attrByScopeID?.entries()) {\n          for (const [_, attr] of attrByKey) {\n            if (attr.key === key) {\n              attrs.push(attr);\n            }\n          }\n        }\n\n        if (attrs.length > 0) {\n          let count = 0;\n          for (const attr of attrs) {\n            count++;\n            sub!.next({ attribute: attr, done: count == attrs.length });\n          }\n        } else {\n          sub!.next({ done: true });\n        }\n      }, 0);\n    }\n\n    return sub!;\n  }\n\n  protected next(scopeIDs: string[]) {\n    const byKind = new Map<string, AttributeChange[]>();\n\n    for (const [scopeID, attrs] of this.updates) {\n      if (!scopeIDs.includes(scopeID)) {\n        continue;\n      }\n\n      for (const [_, attr] of attrs) {\n        if (typeof attr === \"boolean\") {\n          continue;\n        }\n\n        const kind = attr.node?.kind;\n        if (kind) {\n          let kindAttrs = byKind.get(kind);\n          if (!kindAttrs) {\n            kindAttrs = [];\n            byKind.set(kind, kindAttrs);\n          }\n\n          kindAttrs.push(attr);\n        }\n      }\n    }\n\n    const updates: [string, string, AttributeChange][] = [];\n    for (const [kind, attrs] of byKind) {\n      for (const attr of attrs) {\n        // This is very difficult to reproduce in tests since this.updates\n        // cannot contain an AttributeChange that would satisfy this.\n        /* c8 ignore next 4 */\n        if (!attr.nodeID && !attr.node?.id) {\n          warn(`found attribute change without node ID`);\n          continue;\n        }\n\n        if (!scopeIDs.includes(attr.nodeID || attr.node!.id)) {\n          continue;\n        }\n\n        updates.push([kind, attr.key, attr]);\n      }\n    }\n\n    super.next(scopeIDs);\n\n    for (const [kind, key, attrChange] of updates) {\n      // Forcing nodeID because we already tested it above.\n      const nodeID = attrChange.nodeID || attrChange.node!.id;\n\n      if (!scopeIDs.includes(nodeID)) {\n        continue;\n      }\n\n      const attr = this.attrs.get(nodeID)!.get(key)!;\n      const sub = this.attribSubs.get(kind)?.get(key);\n      if (sub) {\n        sub.next({ attribute: attr, done: true });\n      } else {\n        let kAttrs = this.attrsByKind.get(kind);\n        if (!kAttrs) {\n          kAttrs = new Map<string, Map<string, Attribute>>();\n          this.attrsByKind.set(kind, kAttrs);\n        }\n\n        let kkAttrs = kAttrs!.get(nodeID);\n        if (!kkAttrs) {\n          kkAttrs = new Map<string, Attribute>();\n          kAttrs!.set(nodeID, kkAttrs);\n        }\n\n        kkAttrs.set(key, attr);\n      }\n    }\n  }\n}\n","import { SetAttributeInput } from \"@empirica/tajriba\";\nimport { BehaviorSubject, Observable } from \"rxjs\";\nimport { error, trace } from \"../utils/console\";\nimport { JsonValue } from \"../utils/json\";\n\nexport interface AttributeChange {\n  /** deleted is true with the attribute was deleted. */\n  deleted?: boolean;\n  /** deletedAt is the time when the Attribute was deleted. int64 Date + Time\n   * value given in Epoch with ns precision */\n  deletedAt?: number;\n  /** createdAt is the time the Attribute was created. int64 Date + Time\n   * value given in Epoch with ns precision */\n  createdAt?: string;\n  /** id is the identifier for the Attribute. */\n  id: string;\n  /** index is the index of the attribute if the value is a vector. */\n  index?: number | null;\n  /** isNew is true if the Attribute was just created. */\n  isNew?: boolean;\n  /** key is the attribute key being updated. */\n  key: string;\n  /** nodeID is the identifier for the Attribute's Node. */\n  nodeID?: string;\n  /** node is the Attribute's Node. */\n  node?: {\n    __typename: \"Scope\";\n    id: string;\n    kind?: string;\n    name?: string;\n  };\n  /** value is the value of the updated attribute. */\n  val?: string | null;\n  /** vector indicates whether the value is a vector. */\n  vector: boolean;\n  /** version is the version number of this Attribute, starting at 1. */\n  version: number;\n}\n\nexport interface AttributeUpdate {\n  attribute: AttributeChange;\n  removed: boolean;\n}\n\nexport class Attributes {\n  protected attrs = new Map<string, Map<string, Attribute>>();\n  protected updates = new Map<string, Map<string, AttributeChange | boolean>>();\n\n  constructor(\n    attributesObs: Observable<AttributeUpdate>,\n    donesObs: Observable<string[]>,\n    readonly setAttributes: (input: SetAttributeInput[]) => Promise<unknown>\n  ) {\n    attributesObs.subscribe({\n      next: ({ attribute, removed }) => {\n        this.update(attribute, removed);\n      },\n    });\n\n    donesObs.subscribe({\n      next: (scopeIDs) => {\n        this.next(scopeIDs);\n      },\n    });\n  }\n\n  attribute(scopeID: string, key: string): Attribute {\n    let scopeMap = this.attrs.get(scopeID);\n    if (!scopeMap) {\n      scopeMap = new Map();\n      this.attrs.set(scopeID, scopeMap);\n    }\n\n    let attr = scopeMap.get(key);\n    if (!attr) {\n      attr = new Attribute(this.setAttributes, scopeID, key);\n      scopeMap.set(key, attr);\n    }\n\n    return attr;\n  }\n\n  attributes(scopeID: string): Attribute[] {\n    let scopeMap = this.attrs.get(scopeID);\n    if (!scopeMap) {\n      scopeMap = new Map();\n      this.attrs.set(scopeID, scopeMap);\n    }\n\n    return Array.from(scopeMap.values());\n  }\n\n  attributePeek(scopeID: string, key: string): Attribute | undefined {\n    let scopeUpdateMap = this.updates.get(scopeID);\n    if (scopeUpdateMap) {\n      const updated = scopeUpdateMap.get(key);\n      if (updated) {\n        if (typeof updated === \"boolean\") {\n          return;\n        } else {\n          if (!updated.val) {\n            return;\n          } else {\n            const attr = new Attribute(this.setAttributes, scopeID, key);\n            attr._update(updated);\n            return attr;\n          }\n        }\n      }\n    }\n\n    let scopeMap = this.attrs.get(scopeID);\n    if (!scopeMap) {\n      return;\n    }\n\n    let attr = scopeMap.get(key);\n    if (!attr) {\n      return;\n    }\n\n    if (attr.value === undefined) {\n      return;\n    }\n\n    return attr;\n  }\n\n  nextAttributeValue(scopeID: string, key: string): JsonValue | undefined {\n    const attr = this.attributePeek(scopeID, key);\n    if (!attr) {\n      return;\n    }\n\n    return attr.value;\n  }\n\n  private update(attr: AttributeChange, removed: boolean) {\n    let nodeID = attr.nodeID;\n    if (!nodeID) {\n      if (!attr.node?.id) {\n        error(`new attribute without node ID`);\n        return;\n      }\n      nodeID = attr.node.id;\n    }\n\n    let scopeMap = this.updates.get(nodeID);\n    if (!scopeMap) {\n      scopeMap = new Map();\n      this.updates.set(nodeID, scopeMap);\n    }\n\n    if (removed) {\n      scopeMap.set(attr.key, true);\n    } else {\n      let key = attr.key;\n      if (attr.index !== undefined && attr.index !== null) {\n        key = `${key}[${attr.index}]`;\n      }\n      scopeMap.set(key, attr);\n    }\n  }\n\n  scopeWasUpdated(scopeID?: string): boolean {\n    if (!scopeID) {\n      return false;\n    }\n\n    return this.updates.has(scopeID);\n  }\n\n  protected next(scopeIDs: string[]) {\n    for (const [scopeID, attrs] of this.updates) {\n      if (!scopeIDs.includes(scopeID)) {\n        continue;\n      }\n\n      let scopeMap = this.attrs.get(scopeID);\n\n      if (!scopeMap) {\n        scopeMap = new Map();\n        this.attrs.set(scopeID, scopeMap);\n      }\n\n      for (const [key, attrOrDel] of attrs) {\n        if (typeof attrOrDel === \"boolean\") {\n          let attr = scopeMap.get(key);\n          if (attr) {\n            attr._update(undefined);\n          }\n        } else {\n          let attr = scopeMap.get(attrOrDel.key);\n          if (!attr) {\n            attr = new Attribute(this.setAttributes, scopeID, attrOrDel.key);\n            scopeMap.set(attrOrDel.key, attr);\n          }\n\n          attr._update(attrOrDel);\n        }\n      }\n    }\n\n    for (const scopeID of scopeIDs) {\n      this.updates.delete(scopeID);\n    }\n  }\n}\n\nexport interface AttributeOptions {\n  /**\n   * Private indicates the attribute will not be visible to other Participants.\n   */\n  private: boolean;\n  /**\n   * Protected indicates the attribute will not be updatable by other\n   * Participants.\n   */\n  protected: boolean;\n  /** Immutable creates an Attribute that cannot be updated. */\n  immutable: boolean;\n  /** ephemeral indicates the Attribute should not be persisted. Ephemeral\n   * Attributes are not stored in the database and are only synced to the\n   * connected clients. An ephemeral Attribute cannot become non-ephemeral and\n   * vice versa. */\n  ephemeral: boolean;\n  /**\n   * Index, only used if the Attribute is a vector, indicates which index to\n   * update the value at.\n   */\n  index: number | null;\n  /**\n   * Append, only used if the Attribute is a vector, indicates to append the\n   * attribute to the vector.\n   */\n  append: boolean | null;\n}\n\nexport class Attribute {\n  private attr?: AttributeChange;\n  private attrs?: Attribute[];\n\n  private val = new BehaviorSubject<JsonValue | undefined>(undefined);\n  private serVal?: string;\n\n  constructor(\n    private setAttributes: (input: SetAttributeInput[]) => Promise<unknown>,\n    readonly scopeID: string,\n    readonly key: string\n  ) {}\n\n  get id() {\n    return this.attr?.id;\n  }\n\n  get createdAt() {\n    return this.attr ? new Date(this.attr!.createdAt!) : null;\n  }\n\n  get obs(): Observable<JsonValue | undefined> {\n    return this.val;\n  }\n\n  get value() {\n    return this.val.getValue();\n  }\n\n  get nodeID() {\n    return this.scopeID;\n  }\n\n  // items returns the attribute changes for the current attribute, if it is a\n  // vector. Otherwise it returns null;\n  get items() {\n    if (!this.attrs) {\n      return null;\n    }\n\n    return this.attrs;\n  }\n\n  set(value: JsonValue, ao?: Partial<AttributeOptions>) {\n    const attrProps = this._prepSet(value, ao);\n    if (!attrProps) {\n      return;\n    }\n\n    this.setAttributes([attrProps]);\n    trace(`SET ${this.key} = ${value} (${this.scopeID})`);\n  }\n\n  _prepSet(\n    value: JsonValue,\n    ao?: Partial<AttributeOptions>,\n    item?: boolean\n  ): SetAttributeInput | undefined {\n    if (ao?.append !== undefined && ao!.index !== undefined) {\n      error(`cannot set both append and index`);\n\n      throw new Error(`cannot set both append and index`);\n    }\n\n    const serVal = JSON.stringify(value);\n\n    if (!item && (ao?.index !== undefined || ao?.append)) {\n      let index = ao!.index || 0;\n      if (ao?.append) {\n        index = this.attrs?.length || 0;\n      }\n\n      if (!this.attrs) {\n        this.attrs = [];\n      }\n\n      // if (index + 1 > (this.attrs?.length || 0)) {\n      //   this.attrs.length = index! + 1;\n      // }\n\n      if (!this.attrs[index]) {\n        this.attrs[index] = new Attribute(\n          this.setAttributes,\n          this.scopeID,\n          this.key\n        );\n      } else {\n        const existing = this.attrs[index];\n        if (existing && existing.serVal === serVal) {\n          return;\n        }\n      }\n\n      this.attrs![index]!._prepSet(value, ao, true);\n      const v = this._recalcVectorVal();\n      this.val.next(v);\n    } else {\n      if (this.serVal === serVal) {\n        return;\n      }\n\n      this.val.next(value);\n    }\n\n    this.serVal = serVal;\n\n    const attrProps: SetAttributeInput = {\n      key: this.key,\n      nodeID: this.scopeID,\n      val: serVal,\n    };\n\n    if (ao) {\n      // TODO Fix this. Should check if compatible with existing attribute and\n      // only set fields set on ao.\n      attrProps.private = ao.private;\n      attrProps.protected = ao.protected;\n      attrProps.immutable = ao.immutable;\n      attrProps.ephemeral = ao.ephemeral;\n      attrProps.append = ao.append;\n      attrProps.index = ao.index;\n    }\n\n    return attrProps;\n  }\n\n  private _recalcVectorVal(): JsonValue {\n    return this.attrs!.map((a) =>\n      !a || a.val == undefined ? null : a.value || null\n    );\n  }\n\n  // internal only\n  _update(attr?: AttributeChange, item?: boolean) {\n    if (attr && this.attr && this.attr.id === attr.id) {\n      return;\n    }\n\n    if (attr && attr.vector && !item) {\n      // TODO check if is vector\n\n      if (attr.index === undefined) {\n        error(`vector attribute missing index`);\n        return;\n      }\n\n      if (this.attrs == undefined) {\n        this.attrs = [];\n      }\n\n      while (this.attrs.length < attr.index! + 1) {\n        const newAttr = new Attribute(\n          this.setAttributes,\n          this.scopeID,\n          this.key\n        );\n        this.attrs.push(newAttr);\n      }\n\n      const newAttr = new Attribute(this.setAttributes, this.scopeID, this.key);\n      newAttr._update(attr, true);\n      this.attrs[attr.index!] = newAttr;\n      const value = this._recalcVectorVal();\n      this.val.next(value);\n\n      return;\n    }\n\n    this.attr = attr;\n    this.serVal = attr?.val === undefined || attr?.val === null ? \"\" : attr.val;\n    let value: JsonValue | undefined = undefined;\n    if (this.attr?.val) {\n      value = JSON.parse(this.attr.val);\n    }\n    this.val.next(value);\n  }\n}\n","import { TajribaAdmin } from \"@empirica/tajriba\";\nimport { BehaviorSubject, merge, SubscriptionLike } from \"rxjs\";\nimport {\n  ErrNotConnected,\n  TajribaConnection,\n} from \"../shared/tajriba_connection\";\nimport { bs, bsu } from \"../utils/object\";\nimport { subscribeAsync } from \"./observables\";\nimport { error } from \"../utils/console\";\n\nexport class AdminConnection {\n  private _tajriba = bsu<TajribaAdmin>();\n  private _connected = bs(false);\n  private _connecting = bs(false);\n  private _stopped = bs(false);\n  private sub: SubscriptionLike;\n\n  constructor(\n    taj: TajribaConnection,\n    tokens: BehaviorSubject<string | null | undefined>,\n    private resetToken: () => void\n  ) {\n    let token: string | null | undefined;\n    let connected = false;\n\n    this.sub = subscribeAsync(\n      merge(taj.connected, tokens),\n      async (tokenOrConnected) => {\n        if (typeof tokenOrConnected === \"boolean\") {\n          connected = tokenOrConnected;\n        } else {\n          token = tokenOrConnected;\n        }\n\n        if (!token || !connected) {\n          return;\n        }\n\n        if (this._connected.getValue()) {\n          return;\n        }\n\n        this._connecting.next(true);\n\n        try {\n          const tajAdmin = await taj.sessionAdmin(token);\n\n          this._tajriba.next(tajAdmin);\n          this._connected.next(true);\n\n          tajAdmin.on(\"connected\", () => {\n            if (!this._connected.getValue()) {\n              this._connected.next(true);\n            }\n          });\n          tajAdmin.on(\"error\", (err) => {\n            error(\"connection error\", err);\n          });\n          tajAdmin.on(\"disconnected\", () => {\n            if (this._connected.getValue()) {\n              this._connected.next(false);\n            }\n          });\n          tajAdmin.on(\"accessDenied\", () => {\n            if (this._connected.getValue()) {\n              this._connected.next(false);\n            }\n            this.resetToken();\n          });\n        } catch (error) {\n          if (error !== ErrNotConnected) {\n            this.resetToken();\n          }\n        }\n\n        this._connecting.next(false);\n      }\n    );\n  }\n\n  stop() {\n    if (this._stopped.getValue()) {\n      return;\n    }\n\n    const taj = this._tajriba.getValue();\n    if (taj) {\n      taj.removeAllListeners(\"connected\");\n      taj.removeAllListeners(\"disconnected\");\n      taj.stop();\n      this._tajriba.next(undefined);\n    }\n\n    this.sub.unsubscribe();\n\n    this._connecting.next(false);\n    this._connected.next(false);\n    this._stopped.next(true);\n  }\n\n  get connecting() {\n    return this._connecting;\n  }\n\n  get connected() {\n    return this._connected;\n  }\n\n  get stopped() {\n    return this._stopped;\n  }\n\n  get admin() {\n    return this._tajriba;\n  }\n}\n","import { E_CANCELED, Mutex } from \"async-mutex\";\nimport { Observable, Subject, concatMap, takeUntil } from \"rxjs\";\nimport { warn } from \"../utils/console\";\n\nexport async function awaitObsValue<T>(\n  obs: Observable<T>,\n  value: T\n): Promise<T> {\n  let res: (value: T) => void;\n  const prom = new Promise<T>((r) => {\n    res = r;\n  });\n\n  const unsub = obs.subscribe((val) => {\n    if (val === value) {\n      res(val);\n    }\n  });\n\n  const val = await prom;\n  unsub.unsubscribe();\n\n  return val;\n}\n\nexport async function awaitObsValueExist<T>(obs: Observable<T>): Promise<T> {\n  let res: (value: T) => void;\n  const prom = new Promise<T>((r) => {\n    res = r;\n  });\n\n  const unsub = obs.subscribe((val) => {\n    if (val) {\n      res(val);\n    }\n  });\n\n  const val = await prom;\n  unsub.unsubscribe();\n\n  return val;\n}\n\nexport async function awaitObsValueChange<T>(obs: Observable<T>): Promise<T> {\n  let res: (value: T) => void;\n  const prom = new Promise<T>((r) => {\n    res = r;\n  });\n\n  let once = false;\n  let v: T;\n  const unsub = obs.subscribe((val) => {\n    if (once && val !== v) {\n      res(val);\n    }\n    once = true;\n    v = val;\n  });\n\n  const val = await prom;\n  unsub.unsubscribe();\n\n  return val;\n}\n\n// Subscribe to an observable and use the lock for sequential execution of async\n// functions.\nexport function lockedAsyncSubscribe<T>(\n  mutex: Mutex,\n  obs: Observable<T>,\n  fn: (val: T) => Promise<any>\n) {\n  return obs.subscribe({\n    next: async (val) => {\n      try {\n        const release = await mutex.acquire();\n        try {\n          await fn(val);\n        } catch (err) {\n          console.error(\"error in async observable subscription\");\n          console.error(err);\n        } finally {\n          release();\n        }\n      } catch (err) {\n        if (err !== E_CANCELED) {\n          console.error(\n            \"error acquiring lock in async observable subscription\"\n          );\n          console.error(err);\n        }\n      }\n    },\n  });\n}\n\n// This does not behave correctly with a ReplaySubject\nexport function subscribeAsync<T>(\n  obs: Observable<T>,\n  fn: (val: T) => Promise<any>\n) {\n  const cancel = new Subject<void>();\n  obs.pipe(concatMap(fn), takeUntil(cancel)).subscribe();\n  return {\n    closed: false,\n    unsubscribe() {\n      if (this.closed) {\n        warn(\"closing a closed async observable subscription\");\n        return;\n      }\n      this.closed = true;\n      cancel.next();\n      cancel.unsubscribe();\n    },\n  };\n}\n\nexport interface AsyncObserver<T> {\n  next: (value: T) => void;\n  error: (err: any) => void;\n  complete: () => void;\n}\n\nexport interface Unsubscribable {\n  unsubscribe(): void;\n}\n\nexport interface AsyncSubscribable<T> {\n  subscribe(observer: Partial<AsyncObserver<T>>): Promise<Unsubscribable>;\n}\n\n// A ReplaySubject that supports async subscribers\nexport class AsyncReplaySubject<T> {\n  private values: T[] = [];\n  private subscribers: ((val: T) => Promise<void>)[] = [];\n\n  async next(value: T) {\n    this.values.push(value);\n    for (const sub of this.subscribers) {\n      await sub(value);\n    }\n  }\n\n  async subscribe({ next }: { next: (val: T) => Promise<void> }) {\n    this.subscribers.push(next);\n    for (const v of this.values) {\n      await next(v);\n    }\n\n    let closed = false;\n    return {\n      get closed() {\n        return closed;\n      },\n      unsubscribe: () => {\n        if (closed) {\n          warn(\"closing a closed async observable subscription\");\n          return;\n        }\n\n        closed = true;\n        this.subscribers = this.subscribers.filter((s) => s !== next);\n      },\n    };\n  }\n}\n\n// A Subject that supports async subscribers\nexport class AsyncSubject<T> {\n  private subscribers: ((val: T) => Promise<void>)[] = [];\n\n  constructor(private value: T) {}\n\n  async next(value: T) {\n    for (const sub of this.subscribers) {\n      await sub(value);\n    }\n  }\n\n  async subscribe({ next }: { next: (val: T) => Promise<void> }) {\n    this.subscribers.push(next);\n    await next(this.value);\n\n    let closed = false;\n    return {\n      get closed() {\n        return closed;\n      },\n      unsubscribe: () => {\n        if (closed) {\n          warn(\"closing a closed async observable subscription\");\n          return;\n        }\n\n        closed = true;\n        this.subscribers = this.subscribers.filter((s) => s !== next);\n      },\n    };\n  }\n}\n","import {\n  AddGroupInput,\n  AddScopeInput,\n  AddStepInput,\n  LinkInput,\n  State,\n  TransitionInput,\n} from \"@empirica/tajriba\";\nimport { merge, Subject, SubscriptionLike } from \"rxjs\";\nimport { ScopeConstructor } from \"../shared/scopes\";\nimport { TajribaConnection } from \"../shared/tajriba_connection\";\nimport { error, warn } from \"../utils/console\";\nimport { AdminConnection } from \"./connection\";\nimport { ListenersCollector, Subscriber } from \"./events\";\nimport { Globals } from \"./globals\";\nimport { subscribeAsync } from \"./observables\";\nimport { Runloop } from \"./runloop\";\nimport {\n  FileTokenStorage,\n  MemTokenStorage,\n  SavedTokenStorage,\n  TokenProvider,\n} from \"./token_file\";\n\nexport class AdminContext<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> {\n  readonly tajriba: TajribaConnection;\n  public adminConn: AdminConnection | undefined;\n  private sub?: SubscriptionLike;\n  private runloop: Runloop<Context, Kinds> | undefined;\n  private adminSubs = new Subject<\n    Subscriber<Context, Kinds> | ListenersCollector<Context, Kinds>\n  >();\n  private adminStop = new Subject<void>();\n  private subs: (\n    | Subscriber<Context, Kinds>\n    | ListenersCollector<Context, Kinds>\n  )[] = [];\n\n  private constructor(url: string, private ctx: Context, private kinds: Kinds) {\n    this.tajriba = new TajribaConnection(url);\n  }\n\n  /**\n   * @internal\n   *\n   * NOTE: For testing purposes only.\n   */\n  get _runloop() {\n    return this.runloop;\n  }\n\n  static async init<\n    Context,\n    Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n  >(\n    url: string,\n    tokenFile: string,\n    serviceName: string,\n    serviceRegistrationToken: string,\n    ctx: Context,\n    kinds: Kinds\n  ) {\n    const adminContext = new this(url, ctx, kinds);\n    const reset = new Subject<void>();\n    let strg: SavedTokenStorage;\n    if (tokenFile === \":mem:\") {\n      strg = new MemTokenStorage();\n    } else {\n      strg = await FileTokenStorage.init(tokenFile, reset);\n    }\n\n    const tp = new TokenProvider(\n      adminContext.tajriba,\n      strg,\n      serviceName,\n      serviceRegistrationToken\n    );\n    adminContext.adminConn = new AdminConnection(\n      adminContext.tajriba,\n      tp.tokens,\n      reset.next.bind(reset)\n    );\n\n    adminContext.sub = subscribeAsync(\n      merge(adminContext.tajriba.connected, adminContext.adminConn.connected),\n      async () => {\n        await adminContext.initOrStop();\n      }\n    );\n\n    return adminContext;\n  }\n\n  async stop() {\n    this.sub?.unsubscribe();\n    delete this.sub;\n    await this.stopSubs();\n    this.tajriba.stop();\n    this.adminConn?.stop();\n  }\n\n  register(\n    subscriber: Subscriber<Context, Kinds> | ListenersCollector<Context, Kinds>\n  ) {\n    this.subs.push(subscriber);\n    if (this.runloop) {\n      this.adminSubs.next(subscriber);\n    }\n  }\n\n  private async initOrStop() {\n    // Forcing this.adminConn since adminConn is always created by init().\n    if (\n      this.tajriba.connected.getValue() &&\n      this.adminConn!.connected.getValue()\n    ) {\n      await this.initSubs();\n    } else {\n      await this.stopSubs();\n    }\n  }\n\n  private async initSubs() {\n    if (this.runloop) {\n      return;\n    }\n\n    /* c8 ignore next 5 */\n    if (!this.adminConn) {\n      // This condition is nearly impossible to create\n      warn(\"context: admin not connected\");\n      return;\n    }\n\n    /* c8 ignore next 6 */\n    const tajAdmin = this.adminConn.admin.getValue();\n    if (!tajAdmin) {\n      // This condition is nearly impossible to create\n      warn(\"context: admin not connected\");\n      return;\n    }\n\n    let globalScopeID: string | undefined;\n    try {\n      const scopes = await tajAdmin.scopes({\n        filter: { kinds: [\"global\"] },\n        first: 100,\n      });\n      globalScopeID = scopes!.edges[0]?.node.id;\n      if (!globalScopeID) {\n        warn(\"context: global scopeID not found\");\n\n        return;\n      }\n    } catch (err) {\n      error(`context: global scopeID not fetched: ${err}`);\n\n      return;\n    }\n\n    this.runloop = new Runloop(\n      this.adminConn,\n      this.ctx,\n      this.kinds,\n      globalScopeID,\n      this.adminSubs,\n      this.adminStop\n    );\n\n    for (const sub of this.subs) {\n      this.adminSubs.next(sub);\n    }\n  }\n\n  private async stopSubs() {\n    this.adminStop.next();\n    if (this.runloop) {\n      await this.runloop.stop();\n      this.runloop = undefined;\n    }\n  }\n}\n\nexport interface StepPayload {\n  id: string;\n  duration: number;\n}\n\nexport interface AddLinkPayload {\n  nodes: { id: string }[];\n  participants: { id: string }[];\n}\n\nexport interface AddTransitionPayload {\n  id: string;\n  from: State;\n  to: State;\n}\n\nexport interface AddScopePayload {\n  id: string;\n  name?: string | null | undefined;\n  kind?: string | null | undefined;\n  attributes: {\n    edges: {\n      node: {\n        id: string;\n        private: boolean;\n        protected: boolean;\n        immutable: boolean;\n        ephemeral: boolean;\n        key: string;\n        val?: string | null | undefined;\n        index?: number | null | undefined;\n      };\n    }[];\n  };\n}\n\nexport type Finalizer = () => Promise<void>;\n\nexport class TajribaAdminAccess {\n  constructor(\n    readonly addFinalizer: (cb: Finalizer) => void,\n    readonly addScopes: (input: AddScopeInput[]) => Promise<AddScopePayload[]>,\n    readonly addGroups: (input: AddGroupInput[]) => Promise<{ id: string }[]>,\n    readonly addLinks: (input: LinkInput[]) => Promise<AddLinkPayload[]>,\n    readonly addSteps: (input: AddStepInput[]) => Promise<StepPayload[]>,\n    readonly addTransitions: (\n      input: TransitionInput[]\n    ) => Promise<AddTransitionPayload[]>,\n    readonly globals: Globals\n  ) {}\n}\n","import {\n  AddGroupInput,\n  AddScopeInput,\n  AddStepInput,\n  LinkInput,\n  ScopedAttributesInput,\n  SetAttributeInput,\n  TransitionInput,\n} from \"@empirica/tajriba\";\nimport {\n  BehaviorSubject,\n  Observable,\n  ReplaySubject,\n  Subject,\n  Subscription,\n} from \"rxjs\";\nimport { AttributeChange, AttributeUpdate } from \"../shared/attributes\";\nimport { ScopeConstructor, ScopeIdent, ScopeUpdate } from \"../shared/scopes\";\nimport { error, warn } from \"../utils/console\";\nimport { Attributes } from \"./attributes\";\nimport { Cake } from \"./cake\";\nimport { AdminConnection } from \"./connection\";\nimport {\n  AddLinkPayload,\n  AddScopePayload,\n  AddTransitionPayload,\n  Finalizer,\n  StepPayload,\n  TajribaAdminAccess,\n} from \"./context\";\nimport {\n  EventContext,\n  Flusher,\n  ListenersCollector,\n  Subscriber,\n} from \"./events\";\nimport { Globals } from \"./globals\";\nimport { awaitObsValue, subscribeAsync } from \"./observables\";\nimport { ConnectionMsg, Participant, participantsSub } from \"./participants\";\nimport { Scopes } from \"./scopes\";\nimport { Subs, Subscriptions } from \"./subscriptions\";\nimport { Transition, transitionsSub } from \"./transitions\";\n\nexport class Runloop<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> {\n  private subs = new Subscriptions<Context, Kinds>();\n  private evtctx: EventContext<Context, Kinds>;\n  private participants = new Map<string, Participant>();\n  private connections = new ReplaySubject<ConnectionMsg>();\n  private transitions = new Subject<Transition>();\n  private scopesSub = new Subject<ScopeUpdate>();\n  private attributesSub = new Subject<AttributeUpdate>();\n  private donesSub = new Subject<string[]>();\n  private attributes: Attributes;\n  private finalizers: Finalizer[] = [];\n  private groupPromises: Promise<{ id: string }[]>[] = [];\n  private stepPromises: Promise<StepPayload[]>[] = [];\n  private scopePromises: Promise<AddScopePayload[]>[] = [];\n  private linkPromises: Promise<AddLinkPayload>[] = [];\n  private transitionPromises: Promise<AddTransitionPayload>[] = [];\n  private attributeInputs: SetAttributeInput[] = [];\n  private scopes: Scopes<Context, Kinds>;\n  private cake: Cake<Context, Kinds>;\n  private running = new BehaviorSubject<boolean>(false);\n  private stopped = false;\n\n  constructor(\n    private conn: AdminConnection,\n    private ctx: Context,\n    private kinds: Kinds,\n    globalScopeID: string,\n    subs: Observable<\n      Subscriber<Context, Kinds> | ListenersCollector<Context, Kinds>\n    >,\n    stop: Observable<void>\n  ) {\n    this.attributes = new Attributes(\n      this.attributesSub,\n      this.donesSub,\n      this.setAttributes.bind(this)\n    );\n\n    const mut = new TajribaAdminAccess(\n      this.addFinalizer.bind(this),\n      this.addScopes.bind(this),\n      this.addGroups.bind(this),\n      this.addLinks.bind(this),\n      this.addSteps.bind(this),\n      this.addTransitions.bind(this),\n      new Globals(\n        this.taj.globalAttributes(),\n        globalScopeID,\n        this.setAttributes.bind(this)\n      )\n    );\n\n    this.scopes = new Scopes<Context, Kinds>(\n      this.scopesSub,\n      this.donesSub,\n      this.ctx,\n      this.kinds,\n      this.attributes,\n      mut\n    );\n\n    this.evtctx = new EventContext(\n      this.subs,\n      mut,\n      this.scopes,\n      new Flusher(this.postCallback.bind(this, true))\n    );\n\n    this.cake = new Cake(\n      this.evtctx,\n      this.scopes.scope.bind(this.scopes),\n      this.scopes.subscribeKind.bind(this.scopes),\n      (kind: keyof Kinds, key: string) =>\n        this.attributes.subscribeAttribute(<string>kind, key),\n      this.connections,\n      this.transitions\n    );\n    this.cake.postCallback = this.postCallback.bind(this, true);\n\n    const subsSub = subscribeAsync(subs, async (subscriber) => {\n      let listeners: ListenersCollector<Context, Kinds>;\n      if (typeof subscriber === \"function\") {\n        listeners = new ListenersCollector<Context, Kinds>();\n        subscriber(listeners);\n      } else {\n        listeners = subscriber;\n      }\n\n      await this.cake.add(listeners);\n    });\n\n    let stopSub: Subscription;\n    stopSub = stop.subscribe({\n      next: () => {\n        subsSub.unsubscribe();\n        stopSub.unsubscribe();\n      },\n    });\n  }\n\n  /**\n   * @internal\n   *\n   * NOTE: For testing purposes only.\n   */\n  get _attributes() {\n    return this.attributes;\n  }\n\n  /**\n   * @internal\n   *\n   * NOTE: For testing purposes only.\n   */\n  get _scopes() {\n    return this.scopes;\n  }\n\n  /**\n   * @internal\n   *\n   * NOTE: For testing purposes only.\n   */\n  async _postCallback() {\n    return await this.postCallback(true);\n  }\n\n  private async postCallback(final: boolean) {\n    if (this.stopped) {\n      return;\n    }\n\n    this.running.next(true);\n\n    const promises: Promise<any>[] = [];\n\n    const subs = this.subs.newSubs();\n    if (subs) {\n      promises.push(this.processNewSub(subs));\n    }\n\n    promises.push(...this.groupPromises);\n    this.groupPromises = [];\n    promises.push(...this.stepPromises);\n    this.stepPromises = [];\n    promises.push(...this.scopePromises);\n    this.scopePromises = [];\n    promises.push(...this.linkPromises);\n    this.linkPromises = [];\n    promises.push(...this.transitionPromises);\n    this.transitionPromises = [];\n\n    if (this.attributeInputs.length > 0) {\n      // If the same key is set twice within the same loop, only send 1\n      // setAttribute update.\n      const uniqueAttrs: { [key: string]: SetAttributeInput } = {};\n      let appendCount = 0;\n      for (const attr of this.attributeInputs) {\n        if (!attr.nodeID) {\n          error(`runloop: attribute without nodeID: ${JSON.stringify(attr)}`);\n          continue;\n        }\n\n        let key = `${attr.nodeID}-${attr.key}`;\n\n        if (attr.append) {\n          key += `-${appendCount++}`;\n        }\n\n        if (attr.index !== undefined) {\n          key += `-${attr.index}`;\n        }\n\n        uniqueAttrs[key] = attr;\n      }\n\n      const attrs = Object.values(uniqueAttrs);\n\n      promises.push(this.taj.setAttributes(attrs));\n      this.attributeInputs = [];\n    }\n\n    const res = await Promise.allSettled(promises);\n    for (const r of res) {\n      if (r.status === \"rejected\") {\n        // We can ignore invalid transition errors, as they are likely due to\n        // the same transition triggered concurrently from multiple places.\n        if (\n          r.reason instanceof String &&\n          r.reason.includes(\"invalid transition\")\n        ) {\n          continue;\n        }\n\n        warn(`failed load: ${r.reason}`);\n      }\n    }\n\n    const finalizer = this.finalizers.shift();\n    if (finalizer) {\n      await finalizer();\n      await this.postCallback(false);\n    }\n\n    if (final) {\n      this.running.next(false);\n    }\n  }\n\n  async stop() {\n    await this.cake.stop();\n    await awaitObsValue(this.running, false);\n    this.stopped = true;\n  }\n\n  addFinalizer(cb: Finalizer) {\n    this.finalizers.push(cb);\n  }\n\n  async addScopes(inputs: AddScopeInput[]) {\n    if (this.stopped) {\n      return [];\n    }\n\n    const addScopes = this.taj\n      .addScopes(inputs)\n      .then((scopes) => {\n        for (const scope of scopes) {\n          for (const attrEdge of scope.attributes.edges) {\n            this.attributesSub.next({\n              attribute: attrEdge.node as AttributeChange,\n              removed: false,\n            });\n          }\n\n          this.scopesSub.next({\n            scope: scope as ScopeIdent,\n            removed: false,\n          });\n        }\n\n        this.donesSub.next(scopes.map((s) => s.id));\n\n        return scopes;\n      })\n      .catch((err) => {\n        warn(err.message);\n        return [];\n      });\n\n    this.scopePromises.push(addScopes);\n\n    return addScopes;\n  }\n\n  async addGroups(inputs: AddGroupInput[]) {\n    if (this.stopped) {\n      return [];\n    }\n\n    const addGroups = this.taj.addGroups(inputs);\n    this.groupPromises.push(addGroups);\n    return addGroups;\n  }\n\n  async addLinks(inputs: LinkInput[]) {\n    if (this.stopped) {\n      return [];\n    }\n\n    const proms: Promise<AddLinkPayload>[] = [];\n    for (const input of inputs) {\n      const linkPromise = this.taj.addLink(input);\n      this.linkPromises.push(linkPromise);\n      proms.push(linkPromise);\n    }\n\n    return Promise.all(proms);\n  }\n\n  async addSteps(inputs: AddStepInput[]) {\n    if (this.stopped) {\n      return [];\n    }\n\n    const addSteps = this.taj.addSteps(inputs);\n    this.stepPromises.push(addSteps);\n    return addSteps;\n  }\n\n  async addTransitions(inputs: TransitionInput[]) {\n    if (this.stopped) {\n      return [];\n    }\n\n    const proms: Promise<AddTransitionPayload>[] = [];\n    for (const input of inputs) {\n      const transitionPromise = this.taj.transition(input);\n      this.transitionPromises.push(transitionPromise);\n      proms.push(transitionPromise);\n    }\n\n    return Promise.all(proms);\n  }\n\n  async setAttributes(inputs: SetAttributeInput[]) {\n    this.attributeInputs.push(...inputs);\n  }\n\n  // TODO ADD iteration attributes per scope, only first 100...\n  private loadAllScopes(filters: ScopedAttributesInput[], after?: any) {\n    this.taj.scopes({ filter: filters, first: 100, after }).then((conn) => {\n      const scopes: { [key: string]: ScopeIdent } = {};\n      for (const edge of conn?.edges || []) {\n        for (const attrEdge of edge.node.attributes.edges || []) {\n          this.attributesSub.next({\n            attribute: attrEdge.node as AttributeChange,\n            removed: false,\n          });\n        }\n\n        scopes[edge.node.id] = edge.node as ScopeIdent;\n      }\n\n      for (const scope of Object.values(scopes)) {\n        this.scopesSub.next({\n          scope,\n          removed: false,\n        });\n      }\n\n      if (conn?.pageInfo.hasNextPage && conn?.pageInfo.endCursor) {\n        return this.loadAllScopes(filters, conn?.pageInfo.endCursor);\n      }\n    });\n  }\n\n  private async processNewScopesSub(filters: ScopedAttributesInput[]) {\n    if (filters.length === 0) {\n      return;\n    }\n\n    let resolve: (value: void) => void;\n    const prom = new Promise((r) => (resolve = r));\n    this.taj.scopedAttributes(filters).subscribe({\n      next: ({ attribute, scopesUpdated, done }) => {\n        if (attribute) {\n          if (attribute.node.__typename !== \"Scope\") {\n            error(`scoped attribute with non-scope node`);\n            return;\n          }\n\n          this.attributesSub.next({\n            attribute: attribute as AttributeChange,\n            removed: false,\n          });\n\n          this.scopesSub.next({\n            scope: attribute.node as ScopeIdent,\n            removed: false,\n          });\n        }\n\n        if (done) {\n          resolve();\n          if (!scopesUpdated) {\n            error(`scopesUpdated is empty`);\n            return;\n          }\n\n          this.donesSub.next(scopesUpdated);\n        }\n      },\n    });\n\n    // await Promise.all([prom, initProm]);\n    await prom;\n  }\n\n  private async processNewSub(subs: Subs) {\n    const filters: ScopedAttributesInput[] = [];\n    if (subs.scopes.ids.length > 0) {\n      filters.push({ ids: subs.scopes.ids });\n    }\n\n    if (subs.scopes.kinds.length > 0) {\n      filters.push({ kinds: subs.scopes.kinds });\n    }\n\n    if (subs.scopes.names.length > 0) {\n      filters.push({ names: subs.scopes.names });\n    }\n\n    if (subs.scopes.keys.length > 0) {\n      filters.push({ keys: subs.scopes.keys });\n    }\n\n    if (subs.scopes.kvs.length > 0) {\n      filters.push({ kvs: subs.scopes.kvs });\n    }\n\n    if (subs.participants) {\n      await participantsSub(this.taj, this.connections, this.participants);\n    }\n\n    if (subs.transitions.length > 0) {\n      for (const id of subs.transitions) {\n        transitionsSub(this.taj, this.transitions, id);\n      }\n    }\n\n    await this.processNewScopesSub(filters);\n  }\n\n  private get taj() {\n    return this.conn.admin.getValue()!;\n  }\n}\n","import { Mutex } from \"async-mutex\";\nimport { Observable } from \"rxjs\";\nimport { Attribute } from \"../shared/attributes\";\nimport { ScopeConstructor } from \"../shared/scopes\";\nimport { debug, error, warn } from \"../utils/console\";\nimport { AttributeMsg } from \"./attributes\";\nimport {\n  AttributeEventListener,\n  EventContext,\n  EvtCtxCallback,\n  Flusher,\n  KindEventListener,\n  ListenersCollector,\n  ListernerPlacement,\n  TajEventListener,\n  TajribaEvent,\n} from \"./events\";\nimport { lockedAsyncSubscribe } from \"./observables\";\nimport { Connection, ConnectionMsg } from \"./participants\";\nimport { PromiseHandle, promiseHandle } from \"./promises\";\nimport { Scope, ScopeMsg } from \"./scopes\";\nimport { Transition } from \"./transitions\";\n\n// Cake triggers callbacks, respecting listener placement\n\nexport interface unsuber {\n  unsubscribe(): void;\n}\n\nexport class Cake<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> {\n  postCallback: (() => Promise<void>) | undefined;\n  private stopped = false;\n  private unsubs: unsuber[] = [];\n  private mutex = new Mutex();\n\n  constructor(\n    private evtctx: EventContext<Context, Kinds>,\n    private scope: (id: string) => Scope<Context, Kinds> | undefined,\n    private kindSubscription: (\n      kind: keyof Kinds\n    ) => Observable<ScopeMsg<Context, Kinds>>,\n    private attributeSubscription: (\n      kind: keyof Kinds,\n      key: string\n    ) => Observable<AttributeMsg>,\n    private connections: Observable<ConnectionMsg>,\n    private transitions: Observable<Transition>\n  ) {}\n\n  async stop() {\n    this.stopped = true;\n    for (const unsub of this.unsubs) {\n      unsub.unsubscribe();\n    }\n  }\n\n  async add(listeners: ListenersCollector<Context, Kinds>) {\n    listeners.setFlusher(new Flusher(this.postCallback));\n    for (const start of listeners.starts) {\n      debug(\"start callback\");\n      try {\n        await start.callback(this.evtctx);\n      } catch (err) {\n        prettyPrintError(\"start\", err as Error);\n      }\n\n      if (this.postCallback) {\n        await this.postCallback();\n      }\n    }\n\n    if (listeners.kindListeners.length > 0) {\n      const kindListeners = new Map<\n        keyof Kinds,\n        KindEventListener<EvtCtxCallback<Context, Kinds>>[]\n      >();\n\n      for (const listener of listeners.kindListeners) {\n        const callbacks = kindListeners.get(listener.kind) || [];\n        callbacks.push(listener);\n        callbacks.sort(comparePlacement);\n        kindListeners.set(listener.kind, callbacks);\n      }\n\n      for (const [kind, listeners] of kindListeners) {\n        let kl = this.kindListeners.get(kind) || [];\n        if (this.kindListeners.has(kind)) {\n          const until = this.kindLast.get(kind);\n          if (until) {\n            await this.startKind(kind, () => listeners, until);\n          }\n          kl.push(...listeners);\n          kl.sort(comparePlacement);\n          this.kindListeners.set(kind, kl);\n        } else {\n          this.kindListeners.set(kind, listeners);\n          await this.startKind(kind, () => this.kindListeners.get(kind) || []);\n        }\n      }\n    }\n\n    if (listeners.attributeListeners.length > 0) {\n      const attributeListeners = new Map<\n        string,\n        AttributeEventListener<EvtCtxCallback<Context, Kinds>>[]\n      >();\n\n      for (const listener of listeners.attributeListeners) {\n        const key = listener.kind + \"-\" + listener.key;\n        const callbacks = attributeListeners.get(key) || [];\n        callbacks.push(listener);\n        callbacks.sort(comparePlacement);\n        attributeListeners.set(key, callbacks);\n      }\n\n      for (const [kkey, listeners] of attributeListeners) {\n        const kind = listeners[0]!.kind;\n        const key = listeners[0]!.key;\n        let kl = this.attributeListeners.get(kkey) || [];\n        if (this.attributeListeners.has(kkey)) {\n          const until = this.attributeLast.get(kkey);\n          if (until) {\n            await this.startAttribute(kind, key, () => listeners, until);\n          }\n          kl.push(...listeners);\n          kl.sort(comparePlacement);\n          this.attributeListeners.set(kkey, kl);\n        } else {\n          this.attributeListeners.set(kkey, listeners);\n          await this.startAttribute(\n            kind,\n            key,\n            () => this.attributeListeners.get(kkey) || []\n          );\n        }\n      }\n    }\n\n    for (const listener of listeners.tajEvents) {\n      switch (listener.event) {\n        case TajribaEvent.TransitionAdd: {\n          if (this.transitionEvents.length == 0) {\n            this.startTransitionAdd();\n          }\n\n          this.transitionEvents.push(listener);\n          this.transitionEvents.sort(comparePlacement);\n\n          break;\n        }\n        case TajribaEvent.ParticipantConnect: {\n          if (this.connectedEvents.length == 0) {\n            this.startConnected();\n          }\n\n          for (const [_, conn] of this.connectionsMap) {\n            try {\n              await listener.callback(this.evtctx, {\n                participant: conn.participant,\n              });\n            } catch (err) {\n              prettyPrintError(\"participant connect\", err as Error);\n            }\n\n            if (this.postCallback) {\n              await this.postCallback();\n            }\n          }\n\n          this.connectedEvents.push(listener);\n          this.connectedEvents.sort(comparePlacement);\n\n          break;\n        }\n        case TajribaEvent.ParticipantDisconnect: {\n          if (this.disconnectedEvents.length == 0) {\n            this.startDisconnected();\n          }\n\n          this.disconnectedEvents.push(listener);\n          this.disconnectedEvents.sort(comparePlacement);\n\n          break;\n        }\n        // This is difficult to simulate\n        /* c8 ignore next 3 */\n        default: {\n          error(`unsupported tajriba event listener: ${listener.event}`);\n        }\n      }\n    }\n\n    for (const ready of listeners.readys) {\n      debug(\"ready callback\");\n      try {\n        await ready.callback(this.evtctx);\n      } catch (err) {\n        prettyPrintError(\"ready\", err as Error);\n      }\n    }\n  }\n\n  kindListeners = new Map<\n    keyof Kinds,\n    KindEventListener<EvtCtxCallback<Context, Kinds>>[]\n  >();\n  kindLast = new Map<keyof Kinds, Scope<Context, Kinds>>();\n  async startKind(\n    kind: keyof Kinds,\n    callbacks: () => KindEventListener<EvtCtxCallback<Context, Kinds>>[],\n    until?: Scope<Context, Kinds>\n  ) {\n    let handle: PromiseHandle | undefined = promiseHandle();\n    const unsub = lockedAsyncSubscribe(\n      this.mutex,\n      this.kindSubscription(kind),\n      async ({ scope, done }) => {\n        if (this.stopped) {\n          if (handle) {\n            handle.result();\n          }\n\n          return;\n        }\n\n        if (scope) {\n          for (const callback of callbacks()) {\n            try {\n              await callback.callback(this.evtctx, { [kind]: scope });\n            } catch (err) {\n              prettyPrintError(kind as string, err as Error);\n            }\n            if (this.postCallback) {\n              await this.postCallback();\n            }\n          }\n\n          if (until) {\n            if (scope === until) {\n              if (handle) {\n                handle.result();\n                handle = undefined;\n              } else {\n                warn(`until kind without handle`);\n              }\n            }\n          } else {\n            this.kindLast.set(kind, scope);\n          }\n        }\n\n        if (!until && done && handle) {\n          handle.result();\n          handle = undefined;\n        }\n      }\n    );\n\n    if (handle) {\n      await handle.promise;\n    }\n\n    if (until) {\n      unsub.unsubscribe();\n    } else {\n      this.unsubs.push(unsub);\n    }\n  }\n\n  prevAttr: PromiseHandle | undefined = promiseHandle();\n\n  attributeListeners = new Map<\n    string,\n    AttributeEventListener<EvtCtxCallback<Context, Kinds>>[]\n  >();\n  attributeLast = new Map<string, Attribute>();\n  async startAttribute(\n    kind: keyof Kinds,\n    key: string,\n    callbacks: () => AttributeEventListener<EvtCtxCallback<Context, Kinds>>[],\n    until?: Attribute\n  ) {\n    let handle: PromiseHandle | undefined = promiseHandle();\n\n    const unsub = lockedAsyncSubscribe(\n      this.mutex,\n      this.attributeSubscription(kind, key),\n      async ({ attribute, done }) => {\n        if (this.stopped) {\n          if (handle) {\n            handle.result();\n          }\n\n          return;\n        }\n\n        if (attribute) {\n          let next = promiseHandle();\n          if (this.prevAttr) {\n            const p = this.prevAttr;\n            this.prevAttr = next;\n            await p;\n          } else {\n            this.prevAttr = next;\n          }\n\n          const k = <string>kind + \"-\" + key;\n\n          const props: { [key: string]: any } = {\n            [key]: attribute.value,\n            attribute,\n            attrId: attribute.id,\n          };\n\n          if (attribute.nodeID) {\n            const scope = this.scope(attribute.nodeID);\n            if (scope) {\n              props[<string>kind] = scope;\n            }\n          }\n\n          for (const callback of callbacks()) {\n            try {\n              await callback.callback(this.evtctx, props);\n            } catch (err) {\n              prettyPrintError(`${kind as string}.${key}`, err as Error);\n            }\n\n            if (this.stopped) {\n              return;\n            }\n\n            if (this.postCallback) {\n              await this.postCallback();\n            }\n\n            if (this.stopped) {\n              return;\n            }\n          }\n\n          if (until) {\n            if (attribute === until) {\n              if (handle) {\n                handle.result();\n                handle = undefined;\n              } else {\n                warn(`until attribute without handle`);\n              }\n            }\n          } else {\n            this.attributeLast.set(k, attribute);\n          }\n        }\n\n        if (!until && done && handle) {\n          handle.result();\n          handle = undefined;\n        }\n      }\n    );\n\n    if (handle) {\n      await handle.promise;\n    }\n\n    if (until) {\n      unsub.unsubscribe();\n    } else {\n      this.unsubs.push(unsub);\n    }\n  }\n\n  transitionEvents: TajEventListener<EvtCtxCallback<Context, Kinds>>[] = [];\n  startTransitionAdd() {\n    const unsub = lockedAsyncSubscribe(\n      this.mutex,\n      this.transitions,\n      async (transition) => {\n        for (const callback of this.transitionEvents) {\n          if (this.stopped) {\n            return;\n          }\n\n          debug(\n            `transition callback from '${transition.from}' to '${transition.to}'`\n          );\n\n          try {\n            await callback.callback(this.evtctx, {\n              transition,\n              step: transition.step,\n            });\n          } catch (err) {\n            prettyPrintError(\"transition\", err as Error);\n          }\n\n          if (this.postCallback) {\n            await this.postCallback();\n          }\n        }\n      }\n    );\n\n    this.unsubs.push(unsub);\n  }\n\n  connectedEvents: TajEventListener<EvtCtxCallback<Context, Kinds>>[] = [];\n  connectionsMap = new Map<string, Connection>();\n  async startConnected() {\n    let handle: PromiseHandle | undefined = promiseHandle();\n    const unsub = lockedAsyncSubscribe(\n      this.mutex,\n      this.connections,\n      async ({ connection, done }) => {\n        if (this.stopped) {\n          if (handle) {\n            handle.result();\n          }\n\n          return;\n        }\n\n        if (connection) {\n          if (!connection.connected) {\n            return;\n          }\n\n          this.connectionsMap.set(connection.participant.id, connection);\n\n          for (const callback of this.connectedEvents) {\n            debug(`connected callback`);\n\n            try {\n              await callback.callback(this.evtctx, {\n                participant: connection.participant,\n              });\n            } catch (err) {\n              prettyPrintError(\"participant connect\", err as Error);\n            }\n\n            if (this.postCallback) {\n              await this.postCallback();\n            }\n          }\n        }\n\n        if (done && handle) {\n          handle.result();\n          handle = undefined;\n        }\n      }\n    );\n\n    if (handle) {\n      await handle.promise;\n    }\n\n    this.unsubs.push(unsub);\n  }\n\n  disconnectedEvents: TajEventListener<EvtCtxCallback<Context, Kinds>>[] = [];\n  startDisconnected() {\n    const unsub = lockedAsyncSubscribe(\n      this.mutex,\n      this.connections,\n      async ({ connection }) => {\n        if (this.stopped) {\n          return;\n        }\n\n        if (!connection || connection.connected) {\n          return;\n        }\n\n        this.connectionsMap.delete(connection.participant.id);\n\n        for (const callback of this.disconnectedEvents) {\n          debug(`disconnected callback`);\n\n          try {\n            await callback.callback(this.evtctx, {\n              participant: connection.participant,\n            });\n          } catch (err) {\n            prettyPrintError(\"participant disconnect\", err as Error);\n          }\n\n          if (this.postCallback) {\n            await this.postCallback();\n          }\n        }\n      }\n    );\n\n    this.unsubs.push(unsub);\n  }\n}\n\ntype HasPlacement = { placement: ListernerPlacement };\nconst comparePlacement = (a: HasPlacement, b: HasPlacement) =>\n  a.placement - b.placement;\n\nfunction prettyPrintError(location: string, err: Error) {\n  error(`Error caught in \"${location}\" callback:`);\n  error(err);\n}\n","import {\n  AddGroupInput,\n  AddScopeInput,\n  AddStepInput,\n  LinkInput,\n  TransitionInput,\n} from \"@empirica/tajriba\";\nimport { Attribute } from \"../shared/attributes\";\nimport { ScopeConstructor } from \"../shared/scopes\";\nimport { Finalizer, TajribaAdminAccess } from \"./context\";\nimport { Scope, Scopes } from \"./scopes\";\nimport { ScopeSubscriptionInput } from \"./subscriptions\";\n\nexport type Subscriber<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> = (subs: ListenersCollector<Context, Kinds>) => void;\n\nexport enum TajribaEvent {\n  TransitionAdd = \"TRANSITION_ADD\",\n  ParticipantConnect = \"PARTICIPANT_CONNECT\",\n  ParticipantDisconnect = \"PARTICIPANT_DISCONNECT\",\n}\n\nexport enum ListernerPlacement {\n  Before,\n  None, // Not before or after\n  After,\n}\n\nconst placementString = new Map<ListernerPlacement, string>();\nplacementString.set(ListernerPlacement.Before, \"before\");\nplacementString.set(ListernerPlacement.None, \"on\");\nplacementString.set(ListernerPlacement.After, \"after\");\n\nexport function PlacementString(placement: ListernerPlacement): string {\n  return placementString.get(placement)!;\n}\n\nexport type SimpleListener<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> = {\n  placement: ListernerPlacement;\n  callback: (ctx: EventContext<Context, Kinds>) => void;\n};\n\nexport type TajEventListener<Callback extends Function> = {\n  placement: ListernerPlacement;\n  event: TajribaEvent;\n  callback: Callback;\n};\n\nexport type KindEventListener<Callback extends Function> = {\n  placement: ListernerPlacement;\n  kind: string;\n  callback: Callback;\n};\n\nexport type AttributeEventListener<Callback extends Function> = {\n  placement: ListernerPlacement;\n  kind: string;\n  key: string;\n  callback: Callback;\n};\n\nexport type EvtCtxCallback<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> = (ctx: EventContext<Context, Kinds>, props: any) => void;\n\nfunction unique<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> },\n  K extends keyof Kinds\n>(\n  kind: K,\n  placement: ListernerPlacement,\n  callback: EvtCtxCallback<Context, Kinds>\n) {\n  return async (ctx: EventContext<Context, Kinds>, props: any) => {\n    const attr = props.attribute as Attribute;\n    const scope = props[kind] as Scope<Context, Kinds>;\n    if (\n      !attr.id ||\n      scope.get(`ran-${PlacementString(placement)}-${props.attrId}`)\n    ) {\n      return;\n    }\n\n    await callback(ctx, props);\n\n    scope.set(`ran-${PlacementString(placement)}-${props.attrId}`, true);\n  };\n}\n\n// Collects event listeners.\nexport class ListenersCollector<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> {\n  /** @internal */\n  readonly starts: SimpleListener<Context, Kinds>[] = [];\n  /** @internal */\n  readonly readys: SimpleListener<Context, Kinds>[] = [];\n  /** @internal */\n  readonly tajEvents: TajEventListener<EvtCtxCallback<Context, Kinds>>[] = [];\n  /** @internal */\n  readonly kindListeners: KindEventListener<EvtCtxCallback<Context, Kinds>>[] =\n    [];\n  /** @internal */\n  readonly attributeListeners: AttributeEventListener<\n    EvtCtxCallback<Context, Kinds>\n  >[] = [];\n\n  /** @internal */\n  private flusher: Flusher | undefined;\n\n  /** @internal */\n  setFlusher(flusher: Flusher) {\n    this.flusher = flusher;\n  }\n\n  async flush(): Promise<void> {\n    if (!this.flusher) {\n      return;\n    }\n\n    await this.flusher.flush();\n  }\n\n  flushAfter(cb: () => Promise<void>): (() => Promise<void>) | void {\n    if (!this.flusher) {\n      return;\n    }\n\n    return this.flusher.flushAfter(cb);\n  }\n\n  get unique() {\n    return new ListenersCollectorProxy<Context, Kinds>(this);\n  }\n\n  // start: first callback called.\n  // ready: callback called when initial loading is finished.\n  on(\n    kind: \"start\" | \"ready\",\n    callback: (ctx: EventContext<Context, Kinds>) => void\n  ): void;\n\n  // Attach to Tajriba Hooks.\n  on(event: TajribaEvent, callback: EvtCtxCallback<Context, Kinds>): void;\n\n  // Receive Scopes by Kind as they are fetched.\n  on<Kind extends string>(\n    kind: Kind,\n    callback: EvtCtxCallback<Context, Kinds>\n  ): void;\n\n  // Receive Scope attributes as they are fetched.\n  on<Kind extends keyof Kinds>(\n    kind: Kind,\n    key: string,\n    callback: EvtCtxCallback<Context, Kinds>,\n    uniqueCall?: boolean\n  ): void;\n\n  on(\n    kindOrEvent: string,\n    keyOrNodeIDOrEventOrCallback?:\n      | string\n      | TajribaEvent\n      | EvtCtxCallback<Context, Kinds>\n      | ((ctx: EventContext<Context, Kinds>) => void),\n    callback?: EvtCtxCallback<Context, Kinds>\n  ): void {\n    this.registerListerner(\n      ListernerPlacement.None,\n      kindOrEvent,\n      keyOrNodeIDOrEventOrCallback,\n      callback\n    );\n  }\n\n  before(\n    kindOrEvent: string,\n    keyOrNodeIDOrEventOrCallback?:\n      | string\n      | TajribaEvent\n      | EvtCtxCallback<Context, Kinds>\n      | ((ctx: EventContext<Context, Kinds>) => void),\n    callback?: EvtCtxCallback<Context, Kinds>,\n    uniqueCall?: boolean\n  ): void {\n    this.registerListerner(\n      ListernerPlacement.Before,\n      kindOrEvent,\n      keyOrNodeIDOrEventOrCallback,\n      callback,\n      uniqueCall\n    );\n  }\n\n  after(\n    kindOrEvent: string,\n    keyOrNodeIDOrEventOrCallback?:\n      | string\n      | TajribaEvent\n      | EvtCtxCallback<Context, Kinds>\n      | ((ctx: EventContext<Context, Kinds>) => void),\n    callback?: EvtCtxCallback<Context, Kinds>,\n    uniqueCall?: boolean\n  ): void {\n    this.registerListerner(\n      ListernerPlacement.After,\n      kindOrEvent,\n      keyOrNodeIDOrEventOrCallback,\n      callback,\n      uniqueCall\n    );\n  }\n\n  protected registerListerner(\n    placement: ListernerPlacement,\n    kindOrEvent: string,\n    keyOrNodeIDOrEventOrCallback?:\n      | string\n      | TajribaEvent\n      | EvtCtxCallback<Context, Kinds>\n      | ((ctx: EventContext<Context, Kinds>) => void),\n    callback?: EvtCtxCallback<Context, Kinds>,\n    uniqueCall = false\n  ): void {\n    if (kindOrEvent === \"start\") {\n      if (callback) {\n        throw new Error(\"start event only accepts 2 arguments\");\n      }\n\n      if (typeof keyOrNodeIDOrEventOrCallback !== \"function\") {\n        throw new Error(\"second argument expected to be a callback\");\n      }\n\n      this.starts.push({\n        placement,\n        callback: keyOrNodeIDOrEventOrCallback as (\n          ctx: EventContext<Context, Kinds>\n        ) => void,\n      });\n\n      return;\n    }\n\n    if (kindOrEvent === \"ready\") {\n      if (callback) {\n        throw new Error(\"ready event only accepts 2 arguments\");\n      }\n\n      if (typeof keyOrNodeIDOrEventOrCallback !== \"function\") {\n        throw new Error(\"second argument expected to be a callback\");\n      }\n\n      this.readys.push({\n        placement,\n        callback: keyOrNodeIDOrEventOrCallback as (\n          ctx: EventContext<Context, Kinds>\n        ) => void,\n      });\n\n      return;\n    }\n\n    if (Object.values(TajribaEvent).includes(kindOrEvent as any)) {\n      if (typeof keyOrNodeIDOrEventOrCallback !== \"function\") {\n        throw new Error(\"second argument expected to be a callback\");\n      }\n\n      this.tajEvents.push({\n        placement,\n        event: <TajribaEvent>kindOrEvent,\n        callback: keyOrNodeIDOrEventOrCallback,\n      });\n\n      return;\n    }\n\n    if (typeof keyOrNodeIDOrEventOrCallback === \"function\") {\n      this.kindListeners.push({\n        placement,\n        kind: kindOrEvent,\n        callback: keyOrNodeIDOrEventOrCallback,\n      });\n    } else {\n      if (typeof keyOrNodeIDOrEventOrCallback !== \"string\") {\n        throw new Error(\"second argument expected to be an attribute key\");\n      }\n      if (typeof callback !== \"function\") {\n        throw new Error(\"third argument expected to be a callback\");\n      }\n\n      if (uniqueCall) {\n        callback = unique(kindOrEvent, placement, callback);\n      }\n\n      this.attributeListeners.push({\n        placement,\n        kind: kindOrEvent,\n        key: keyOrNodeIDOrEventOrCallback,\n        callback,\n      });\n    }\n  }\n}\n\n// Collects event listeners.\nexport class ListenersCollectorProxy<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> extends ListenersCollector<Context, Kinds> {\n  constructor(private coll: ListenersCollector<Context, Kinds>) {\n    super();\n  }\n\n  protected registerListerner(\n    placement: ListernerPlacement,\n    kindOrEvent: string,\n    keyOrNodeIDOrEventOrCallback?:\n      | string\n      | TajribaEvent\n      | EvtCtxCallback<Context, Kinds>\n      | ((ctx: EventContext<Context, Kinds>) => void),\n    callback?: EvtCtxCallback<Context, Kinds>\n  ): void {\n    if (\n      kindOrEvent === \"start\" ||\n      kindOrEvent === \"ready\" ||\n      Object.values(TajribaEvent).includes(kindOrEvent as any) ||\n      typeof keyOrNodeIDOrEventOrCallback === \"function\"\n    ) {\n      throw new Error(\"only attribute listeners can be unique\");\n    }\n\n    super.registerListerner(\n      placement,\n      kindOrEvent,\n      keyOrNodeIDOrEventOrCallback,\n      callback,\n      true\n    );\n\n    while (true) {\n      const listener = this.attributeListeners.pop();\n      if (!listener) {\n        break;\n      }\n\n      this.coll.attributeListeners.push(listener);\n    }\n  }\n}\n\n// Context passed to listerners on new event allowing to subscrive to more data\n// and access data.\nexport interface SubscriptionCollector {\n  scopeSub: (...inputs: Partial<ScopeSubscriptionInput>[]) => void;\n  participantsSub: () => void;\n  transitionsSub: (stepID: string) => void;\n}\n\n// Context passed to listerners on new event allowing to subscrive to more data\n// and access data.\nexport class EventContext<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> {\n  constructor(\n    /** @internal */\n    private subs: SubscriptionCollector,\n    /** @internal */\n    private taj: TajribaAdminAccess,\n    /** @internal */\n    private scopes: Scopes<Context, Kinds>,\n    /** @internal */\n    private flusher: Flusher\n  ) {}\n\n  async flush(): Promise<void> {\n    await this.flusher.flush();\n  }\n\n  flushAfter(cb: () => Promise<void>): (() => Promise<void>) | void {\n    return this.flusher.flushAfter(cb);\n  }\n\n  scopesByKind<T extends Scope<Context, Kinds>>(kind: keyof Kinds) {\n    return this.scopes.byKind<T>(kind) as Map<string, T>;\n  }\n\n  scopesByKindID<T extends Scope<Context, Kinds>>(\n    kind: keyof Kinds,\n    id: string\n  ) {\n    return this.scopes.byKind<T>(kind).get(id);\n  }\n\n  scopesByKindMatching<T extends Scope<Context, Kinds>>(\n    kind: keyof Kinds,\n    key: string,\n    val: string\n  ): T[] {\n    const scopes = Array.from(this.scopes.byKind(kind).values());\n    return scopes.filter((s) => s.get(key) === val) as T[];\n  }\n\n  scopeSub(...inputs: Partial<ScopeSubscriptionInput>[]) {\n    for (const input of inputs) {\n      this.subs.scopeSub(input);\n    }\n  }\n\n  participantsSub() {\n    this.subs.participantsSub();\n  }\n\n  transitionsSub(stepID: string) {\n    this.subs.transitionsSub(stepID);\n  }\n\n  // c8 ignore: the TajribaAdminAccess proxy functions are tested elswhere\n  /* c8 ignore next 3 */\n  addScopes(input: AddScopeInput[]) {\n    return this.taj.addScopes(input);\n  }\n\n  /* c8 ignore next 3 */\n  addGroups(input: AddGroupInput[]) {\n    return this.taj.addGroups(input);\n  }\n\n  /* c8 ignore next 3 */\n  addLinks(input: LinkInput[]) {\n    return this.taj.addLinks(input);\n  }\n\n  /* c8 ignore next 3 */\n  addSteps(input: AddStepInput[]) {\n    return this.taj.addSteps(input);\n  }\n\n  /* c8 ignore next 3 */\n  addTransitions(input: TransitionInput[]) {\n    return this.taj.addTransitions(input);\n  }\n\n  protected addFinalizer(cb: Finalizer) {\n    this.taj.addFinalizer(cb);\n  }\n\n  /* c8 ignore next 3 */\n  get globals() {\n    return this.taj.globals;\n  }\n}\n\nexport class Flusher {\n  constructor(\n    /** @internal */\n    private postCallback: (() => Promise<void>) | undefined\n  ) {}\n\n  async flush(): Promise<void> {\n    if (!this.postCallback) {\n      return;\n    }\n\n    await this.postCallback();\n  }\n\n  flushAfter(cb: () => Promise<void>): (() => Promise<void>) | void {\n    if (!this.postCallback) {\n      cb();\n      return;\n    }\n\n    return async () => {\n      await cb();\n      if (this.postCallback) {\n        await this.postCallback();\n      }\n    };\n  }\n}\n","import { EventType, TajribaAdmin } from \"@empirica/tajriba\";\nimport { Subject } from \"rxjs\";\nimport { error } from \"../utils/console\";\nimport { PromiseHandle, promiseHandle } from \"./promises\";\n\nexport interface Participant {\n  id: string;\n  identifier: string;\n}\n\nexport interface Connection {\n  participant: Participant;\n  connected: boolean;\n}\n\nexport interface ConnectionMsg {\n  connection?: Connection;\n  done: boolean;\n}\n\nexport async function participantsSub(\n  taj: TajribaAdmin,\n  connections: Subject<ConnectionMsg>,\n  participants: Map<string, Participant>\n) {\n  let handle: PromiseHandle | undefined = promiseHandle();\n  taj.onEvent({ eventTypes: [EventType.ParticipantConnected] }).subscribe({\n    next({ node, done }) {\n      if (!node) {\n        if (done) {\n          if (handle) {\n            handle?.result();\n\n            connections.next({ done: true });\n          }\n\n          return;\n        }\n        error(`received no participant on connected`);\n\n        return;\n      }\n\n      if (node.__typename !== \"Participant\") {\n        error(`received non-participant on connected`);\n\n        return;\n      }\n\n      const part = {\n        id: node.id,\n        identifier: node.identifier,\n      };\n\n      participants.set(node.id, part);\n\n      connections.next({\n        connection: {\n          participant: part,\n          connected: true,\n        },\n        done,\n      });\n\n      if (handle && done) {\n        handle.result();\n      }\n    },\n  });\n\n  taj.onEvent({ eventTypes: [EventType.ParticipantDisconnect] }).subscribe({\n    next({ node }) {\n      if (!node) {\n        error(`received no participant on disconnect`);\n\n        return;\n      }\n\n      if (node.__typename !== \"Participant\") {\n        error(`received non-participant on disconnect`);\n\n        return;\n      }\n\n      participants.delete(node.id);\n\n      connections.next({\n        connection: {\n          participant: {\n            id: node.id,\n            identifier: node.identifier,\n          },\n          connected: false,\n        },\n        done: true,\n      });\n    },\n  });\n\n  await handle.promise;\n  handle = undefined;\n}\n","import {\n  AddGroupInput,\n  AddScopeInput,\n  AddStepInput,\n  LinkInput,\n  TransitionInput,\n} from \"@empirica/tajriba\";\nimport { Observable, ReplaySubject } from \"rxjs\";\nimport {\n  Scope as SharedScope,\n  ScopeConstructor,\n  ScopeIdent,\n  Scopes as SharedScopes,\n  ScopeUpdate,\n} from \"../shared/scopes\";\nimport { Attributes } from \"./attributes\";\nimport { Finalizer, TajribaAdminAccess } from \"./context\";\n\nexport type ScopeMsg<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> = {\n  scope?: Scope<Context, Kinds>;\n  done: boolean;\n};\n\nexport class Scopes<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> extends SharedScopes<Context, Kinds, Scope<Context, Kinds>> {\n  private kindSubs = new Map<\n    keyof Kinds,\n    ReplaySubject<ScopeMsg<Context, Kinds>>\n  >();\n\n  constructor(\n    scopesObs: Observable<ScopeUpdate>,\n    donesObs: Observable<string[]>,\n    ctx: Context,\n    kinds: Kinds,\n    attributes: Attributes,\n    readonly taj: TajribaAdminAccess\n  ) {\n    super(scopesObs, donesObs, ctx, kinds, attributes);\n  }\n\n  /** @internal */\n  subscribeKind(kind: keyof Kinds): Observable<ScopeMsg<Context, Kinds>> {\n    let sub = this.kindSubs.get(kind);\n    if (!sub) {\n      sub = new ReplaySubject<ScopeMsg<Context, Kinds>>();\n      this.kindSubs.set(kind, sub);\n\n      const scopes = this.byKind(kind);\n\n      setTimeout(() => {\n        if (scopes.size === 0) {\n          sub!.next({ done: true });\n\n          return;\n        }\n\n        let count = 0;\n        for (const [_, scope] of scopes) {\n          count++;\n          sub!.next({ scope, done: scopes.size === count });\n        }\n      }, 0);\n    }\n\n    return sub!;\n  }\n\n  protected next(scopeIDs: string[]) {\n    for (const [_, scopeReplaySubject] of this.scopes) {\n      const scope = scopeReplaySubject.getValue();\n      if (this.newScopes.get(scope.id) && scopeIDs.includes(scope.id)) {\n        const kindSub = this.kindSubs.get(scope.kind);\n        if (kindSub) {\n          kindSub.next({ scope, done: true });\n        }\n        this.newScopes.set(scope.id, false);\n      }\n    }\n\n    super.next(scopeIDs);\n  }\n\n  protected create(\n    scopeClass: ScopeConstructor<Context, Kinds>,\n    scope: ScopeIdent\n  ) {\n    return new scopeClass!(this.ctx, scope, this, this.attributes) as Scope<\n      Context,\n      Kinds\n    >;\n  }\n}\n\nexport class Scope<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> extends SharedScope<Context, Kinds> {\n  /**\n   * @internal\n   */\n  readonly taj: TajribaAdminAccess;\n\n  constructor(\n    ctx: Context,\n    scope: ScopeIdent,\n    private scopes: Scopes<Context, Kinds>,\n    attributes: Attributes\n  ) {\n    super(ctx, scope, attributes);\n    this.taj = scopes.taj;\n  }\n\n  protected scopeByID<T extends Scope<Context, Kinds>>(\n    id: string\n  ): T | undefined {\n    return this.scopes.scope(id) as T | undefined;\n  }\n\n  protected scopeByKey<T extends Scope<Context, Kinds>>(\n    key: string\n  ): T | undefined {\n    const id = this.get(key);\n    if (!id || typeof id !== \"string\") {\n      return;\n    }\n\n    return this.scopes.scope(id) as T | undefined;\n  }\n\n  protected scopesByKind<T extends Scope<Context, Kinds>>(\n    kind: keyof Kinds\n  ): Map<string, T> {\n    return this.scopes.byKind<T>(kind) as Map<string, T>;\n  }\n\n  protected scopesByKindID<T extends Scope<Context, Kinds>>(\n    kind: keyof Kinds,\n    id: string\n  ): T | undefined {\n    return this.scopes.byKind<T>(kind).get(id);\n  }\n\n  protected scopesByKindMatching<T extends Scope<Context, Kinds>>(\n    kind: keyof Kinds,\n    key: string,\n    val: string\n  ): T[] {\n    const scopes = Array.from(this.scopes.byKind(kind).values());\n    return scopes.filter((s) => s.get(key) === val) as T[];\n  }\n\n  protected addScopes(input: AddScopeInput[]) {\n    return this.taj.addScopes(input);\n  }\n\n  protected addGroups(input: AddGroupInput[]) {\n    return this.taj.addGroups(input);\n  }\n\n  protected addLinks(input: LinkInput[]) {\n    return this.taj.addLinks(input);\n  }\n\n  protected addSteps(input: AddStepInput[]) {\n    return this.taj.addSteps(input);\n  }\n\n  protected addTransitions(input: TransitionInput[]) {\n    return this.taj.addTransitions(input);\n  }\n\n  protected addFinalizer(cb: Finalizer) {\n    this.taj.addFinalizer(cb);\n  }\n\n  /**\n   * @internal\n   */\n  get globals() {\n    return this.taj.globals;\n  }\n}\n","import { BehaviorSubject, Observable } from \"rxjs\";\nimport { Attribute, AttributeOptions, Attributes } from \"../shared/attributes\";\nimport { Constructor } from \"../shared/helpers\";\nimport { warn } from \"../utils/console\";\nimport { JsonValue } from \"../utils/json\";\n\nexport type Attributable = {\n  get: (key: string) => JsonValue | undefined;\n  getAttribute: (key: string) => Attribute | undefined;\n  set: (key: string, value: JsonValue, ao?: Partial<AttributeOptions>) => void;\n  append: (\n    key: string,\n    value: JsonValue,\n    ao?: Partial<AttributeOptions>\n  ) => void;\n};\n\nexport interface ScopeIdent {\n  id: string;\n  kind: string;\n}\n\nexport interface ScopeUpdate {\n  scope: ScopeIdent;\n  removed: boolean;\n}\n\nexport type ScopeConstructor<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> = Constructor<Scope<Context, Kinds>>;\n\nexport class Scopes<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> },\n  Skope extends Scope<Context, Kinds> = Scope<Context, Kinds>\n> {\n  protected scopes = new Map<string, BehaviorSubject<Skope>>();\n  // newScopes is used to track scopes that have appeared for the first time.\n  protected newScopes = new Map<string, boolean>();\n  protected scopesByKind = new Map<keyof Kinds, Map<string, Skope>>();\n  protected kindUpdated = new Set<keyof Kinds>();\n\n  constructor(\n    scopesObs: Observable<ScopeUpdate>,\n    donesObs: Observable<string[]>,\n    protected ctx: Context,\n    protected kinds: Kinds,\n    protected attributes: Attributes\n  ) {\n    scopesObs.subscribe({\n      next: ({ scope, removed }) => {\n        this.update(scope, removed);\n      },\n    });\n\n    donesObs.subscribe({\n      next: (scopeIDs) => {\n        this.next(scopeIDs);\n      },\n    });\n  }\n\n  scope(id: string): Skope | undefined {\n    return this.scopes.get(id)?.getValue();\n  }\n\n  scopeObs(id: string): Observable<Skope> | undefined {\n    return this.scopes.get(id);\n  }\n\n  byKind<T extends Skope>(kind: keyof Kinds) {\n    let map = this.scopesByKind.get(kind);\n    if (!map) {\n      map = new Map();\n      this.scopesByKind.set(kind, map);\n    }\n\n    return map! as Map<string, T>;\n  }\n\n  kindWasUpdated(kind: keyof Kinds): boolean {\n    return this.kindUpdated.has(kind);\n  }\n\n  protected next(scopeIDs: string[]) {\n    this.kindUpdated.clear();\n    for (const [_, scopeSubject] of this.scopes) {\n      const scope = scopeSubject.getValue();\n      if (\n        (scope._updated || this.attributes.scopeWasUpdated(scope.id)) &&\n        scopeIDs.includes(scope.id)\n      ) {\n        scope._updated = false;\n        scopeSubject.next(scope);\n      }\n    }\n  }\n\n  protected update(scope: ScopeIdent, removed: boolean) {\n    const existing = this.scopes.get(scope.id)?.getValue();\n\n    if (removed) {\n      if (!existing) {\n        warn(\"scopes: missing scope on removal\", scope.id, scope.kind);\n\n        return;\n      }\n\n      existing._deleted = true;\n      existing._updated = true;\n      this.scopes.delete(scope.id);\n\n      if (!scope.kind) {\n        warn(\"scopes: scope missing kind on scope on removal\");\n\n        return;\n      }\n\n      const kind = scope.kind as keyof Kinds;\n\n      // Using ! because scopes by kind must exist, since this scope was found.\n      this.scopesByKind.get(kind)!.delete(scope.id);\n\n      this.kindUpdated.add(kind);\n\n      return;\n    }\n\n    if (existing) {\n      existing._deleted = false;\n      return;\n    }\n\n    if (!scope.kind) {\n      warn(\"scopes: scope missing kind on scope\");\n\n      return;\n    }\n\n    const kind = scope.kind as keyof Kinds;\n    const scopeClass = this.kinds[kind];\n    if (!scopeClass) {\n      warn(`scopes: unknown scope kind: ${scope.kind}`);\n\n      return;\n    }\n\n    const obj = this.create(scopeClass, scope);\n    const subj = new BehaviorSubject(obj);\n    this.scopes.set(scope.id, subj);\n    this.newScopes.set(scope.id, true);\n\n    let skm = this.scopesByKind.get(kind);\n    if (!skm) {\n      skm = new Map();\n      this.scopesByKind.set(kind, skm);\n    }\n\n    skm.set(scope.id, obj);\n\n    obj._updated = true;\n    this.kindUpdated.add(kind);\n  }\n\n  protected create(\n    scopeClass: ScopeConstructor<Context, Kinds>,\n    scope: ScopeIdent\n  ) {\n    return new scopeClass!(this.ctx, scope, this.attributes) as Skope;\n  }\n}\n\nexport type AttributeInput = {\n  key: string;\n  value: JsonValue;\n  ao?: Partial<AttributeOptions>;\n};\n\nexport class Scope<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> {\n  /**\n   * @internal\n   */\n  _deleted = false;\n\n  /**\n   * @internal\n   */\n  _updated = false;\n\n  constructor(\n    /**\n     * @internal\n     */\n    readonly ctx: Context,\n    /**\n     * @internal\n     */\n    readonly scope: ScopeIdent,\n    /**\n     * @internal\n     */\n    protected attributes: Attributes\n  ) {}\n\n  get id() {\n    return this.scope.id;\n  }\n\n  /**\n   * @internal\n   */\n  get kind() {\n    // Using ! because we don't allow scopes without kind\n    return this.scope.kind!;\n  }\n\n  get(key: string): JsonValue | undefined {\n    return this.attributes.attribute(this.scope.id, key).value;\n  }\n\n  getAttribute(key: string): Attribute | undefined {\n    return this.attributes.attribute(this.scope.id, key);\n  }\n\n  obs(key: string): Observable<JsonValue | undefined> {\n    return this.attributes.attribute(this.scope.id, key).obs;\n  }\n\n  set(values: AttributeInput[]): void;\n  set(key: string, value: JsonValue, ao?: Partial<AttributeOptions>): void;\n  set(\n    keyOrAttributes: string | AttributeInput[],\n    value?: JsonValue,\n    ao?: Partial<AttributeOptions>\n  ) {\n    if (typeof keyOrAttributes === \"string\") {\n      if (value === undefined) {\n        value = null;\n      }\n\n      return this.attributes\n        .attribute(this.scope.id, keyOrAttributes)\n        .set(value, ao);\n    }\n\n    const nextProps = [];\n    for (const attr of keyOrAttributes) {\n      const at = this.attributes\n        .attribute(this.scope.id, attr.key)\n        ._prepSet(attr.value, attr.ao);\n      if (!at) {\n        continue;\n      }\n\n      nextProps.push(at);\n    }\n\n    if (nextProps.length === 0) {\n      return;\n    }\n\n    this.attributes.setAttributes(nextProps);\n  }\n\n  append(key: string, value: JsonValue, ao?: Partial<AttributeOptions>) {\n    if (!ao) {\n      ao = {};\n    }\n    ao.append = true;\n\n    return this.attributes.attribute(this.scope.id, key).set(value, ao);\n  }\n\n  inspect() {\n    const attrs = this.attributes.attributes(this.scope.id);\n\n    const out: { [key: string]: JsonValue | undefined } = {};\n    for (const attr of attrs) {\n      out[attr.key] = attr.value;\n    }\n\n    return out;\n  }\n\n  /**\n   * @internal\n   */\n  hasUpdated() {\n    return this._updated || this.attributes.scopeWasUpdated(this.id);\n  }\n}\n","import { EventType, State, TajribaAdmin } from \"@empirica/tajriba\";\nimport { Subject } from \"rxjs\";\nimport { error } from \"../utils/console\";\n\nexport interface Step {\n  id: string;\n  state: State;\n  duration: number;\n  startedAt?: number;\n  endedAt?: number;\n}\n\nexport interface Transition {\n  id: string;\n  from: State;\n  to: State;\n  step: Step;\n}\n\nexport function transitionsSub(\n  taj: TajribaAdmin,\n  transitions: Subject<Transition>,\n  nodeID: string\n) {\n  taj.onEvent({ eventTypes: [EventType.TransitionAdd], nodeID }).subscribe({\n    next({ node }) {\n      if (!node) {\n        return;\n      }\n\n      if (node.__typename !== \"Transition\") {\n        error(`received non-transition`);\n\n        return;\n      }\n\n      if (node.node.__typename !== \"Step\") {\n        error(`received non-step transition`, node.node);\n\n        return;\n      }\n\n      transitions.next({\n        id: node.id,\n        to: node.to,\n        from: node.from,\n        step: {\n          id: node.node.id,\n          duration: node.node.duration,\n          state: node.node.state,\n        },\n      });\n    },\n  });\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { BehaviorSubject, merge, Observable, SubscriptionLike } from \"rxjs\";\nimport { TajribaConnection } from \"../shared/tajriba_connection\";\nimport { error } from \"../utils/console\";\nimport { bsu } from \"../utils/object\";\nimport { subscribeAsync } from \"./observables\";\n\nexport class TokenProvider {\n  private sub: SubscriptionLike | undefined;\n  readonly tokens = bsu<string | null>(undefined);\n\n  constructor(\n    taj: TajribaConnection,\n    storage: SavedTokenStorage,\n    serviceName: string,\n    serviceRegistrationToken: string\n  ) {\n    let connected = false;\n    let token: string | null | undefined;\n    this.sub = subscribeAsync(\n      merge(taj.connected, storage.tokens),\n      async (tokenOrConnected) => {\n        if (typeof tokenOrConnected === \"boolean\") {\n          connected = tokenOrConnected;\n        } else {\n          token = tokenOrConnected;\n        }\n\n        if (token) {\n          this.tokens.next(token);\n          return;\n        }\n\n        if (!connected) {\n          return;\n        }\n\n        if (token === undefined) {\n          return;\n        }\n\n        try {\n          const t = await taj.tajriba.registerService(\n            serviceName,\n            serviceRegistrationToken\n          );\n\n          if (t) {\n            storage.updateToken(t);\n          }\n        } catch (err) {\n          error(`token: register service ${(err as Error).message}`);\n          return;\n        }\n      }\n    );\n  }\n\n  get token() {\n    return this.tokens.getValue();\n  }\n\n  // When stopped, cannot be restarted\n  stop() {\n    this.sub?.unsubscribe();\n    this.sub = undefined;\n  }\n}\n\nexport interface SavedTokenStorage {\n  tokens: BehaviorSubject<string | null | undefined>;\n  updateToken: (token: string) => Promise<void>;\n  clearToken: () => Promise<void>;\n}\n\nexport class MemTokenStorage {\n  tokens = new BehaviorSubject<string | null | undefined>(null);\n\n  async updateToken(token: string) {\n    this.tokens.next(token);\n  }\n\n  async clearToken() {\n    this.tokens.next(undefined);\n  }\n}\n\nexport class FileTokenStorage {\n  private _tokens = bsu<string | null>(null);\n\n  private constructor(\n    protected serviceTokenFile: string,\n    resetToken: Observable<void>\n  ) {\n    resetToken.subscribe({\n      next: () => {\n        this.clearToken();\n      },\n    });\n  }\n\n  static async init(serviceTokenFile: string, resetToken: Observable<void>) {\n    const p = new this(serviceTokenFile, resetToken);\n\n    const token = await p.readToken();\n    if (token) {\n      p._tokens.next(token);\n    }\n\n    return p;\n  }\n\n  private async readToken() {\n    try {\n      const data = await fs.readFile(this.serviceTokenFile, {\n        encoding: \"utf8\",\n      });\n\n      if (data.length > 0) {\n        return data;\n      }\n    } catch (err) {\n      const e = err as NodeJS.ErrnoException;\n      if (e.code !== \"ENOENT\") {\n        error(`token: read token file ${e.message}`);\n      }\n    }\n\n    return;\n  }\n\n  private async writeToken(token: string) {\n    try {\n      // Ensure directory exists\n      const dir = path.dirname(this.serviceTokenFile);\n      await fs.mkdir(dir, { recursive: true });\n      await fs.writeFile(this.serviceTokenFile, token);\n    } catch (err) {\n      error(`token: write token file ${(err as Error).message}`);\n    }\n  }\n\n  private async deleteTokenFile() {\n    try {\n      await fs.unlink(this.serviceTokenFile);\n    } catch (err) {\n      error(`token: delete token file ${(err as Error).message}`);\n    }\n  }\n\n  get tokens() {\n    return this._tokens;\n  }\n\n  get token() {\n    return this._tokens.getValue();\n  }\n\n  async updateToken(token: string) {\n    if (token === this._tokens.getValue()) {\n      return;\n    }\n\n    this._tokens.next(token);\n    await this.writeToken(token);\n  }\n\n  async clearToken() {\n    await this.deleteTokenFile();\n\n    if (this.token) {\n      this._tokens.next(undefined);\n    }\n  }\n}\n","import { spawn } from \"child_process\";\nimport fs from \"fs\";\nimport readline from \"readline\";\nimport tmp from \"tmp\";\nimport { promiseHandle } from \"../../promises\";\n\nconst VERBOSE = false;\n\n// This cleans up the temporary files, beware.\ntmp.setGracefulCleanup();\n\nexport interface TajServer {\n  stop: () => void;\n  port: number;\n  url: string;\n  username: string;\n  password: string;\n  srtoken: string;\n}\n\nconst config = (\n  username = \"username\",\n  password = \"password\",\n  srtoken = \"0123456789123456\"\n) =>\n  `[tajriba.auth]\nsrtoken = \"` +\n  srtoken +\n  `\"\n\n[[tajriba.auth.users]]\nname = \"Nicolas\"\nusername = \"` +\n  username +\n  `\"\npassword = \"` +\n  password +\n  `\"\n`;\n\nfunction createTajribaConfigFile(config: string): string {\n  const { name } = tmp.fileSync({ discardDescriptor: true, postfix: \".toml\" });\n  fs.writeFileSync(name, config);\n  return name;\n}\n\nexport interface StartTajribaOptions {\n  configFile?: string;\n  tajFile?: string;\n  logLevel?: string;\n  printLogs?: boolean;\n  srtoken?: string;\n  username?: string;\n  password?: string;\n}\n\nexport async function startTajriba(\n  options: StartTajribaOptions = {}\n): Promise<TajServer> {\n  let port: number;\n  const logLevel = options.logLevel ?? \"trace\";\n\n  let configFile =\n    options.configFile ??\n    createTajribaConfigFile(\n      config(options.username, options.password, options.srtoken)\n    );\n\n  const args = [\n    \"tajriba\",\n    \"--config\",\n    configFile,\n    \"--log.level\",\n    logLevel,\n    \"--log.json\",\n    \"--tajriba.log.level\",\n    logLevel,\n    \"--tajriba.log.json\",\n    \"--tajriba.server.addr\",\n    \":0\",\n  ];\n\n  if (options.tajFile) {\n    args.push(\"--tajriba.store.file\", options.tajFile);\n  } else {\n    args.push(\"--tajriba.store.mem\");\n  }\n\n  // console.log(args);\n\n  let empiricaCmd = \"empirica\";\n\n  if (process.env.EMPIRICA_DEV) {\n    empiricaCmd = \"emp\";\n  }\n\n  console.info(\n    `Starting Tajriba server with: ${empiricaCmd} ${args.join(\" \")}`\n  );\n\n  const taj = spawn(empiricaCmd, args);\n\n  readline.createInterface({ input: taj.stdout! }).on(\"line\", (data) => {\n    console.log(`stdout: ${data}`);\n  });\n\n  const portProm = promiseHandle<number>();\n\n  readline.createInterface({ input: taj.stderr! }).on(\"line\", (data) => {\n    try {\n      const dat = JSON.parse(data);\n      if (dat[\"message\"] && dat[\"message\"] === \"Started Tajriba server\") {\n        portProm.result(dat[\"port\"] as number);\n      }\n\n      if (\n        VERBOSE ||\n        options.printLogs ||\n        (dat[\"level\"] && dat[\"level\"] === \"error\")\n      ) {\n        console.log(`stderr: ${data}`);\n      }\n    } catch (e) {\n      console.error(data.toString());\n    }\n  });\n\n  taj.on(\"error\", (error) => {\n    console.error(`error: ${error.message}`);\n  });\n\n  taj.on(\"close\", (code) => {\n    if (code) {\n      console.log(`child process exited with code ${code}`);\n    }\n  });\n\n  port = await portProm.promise;\n\n  // Wait to make sure HTTP server is ready with all endpoints.\n  await sleep(200);\n\n  let stopped = false;\n  return {\n    port,\n    get url() {\n      return `http://localhost:${port}/query`;\n    },\n    get username() {\n      return options.username || \"username\";\n    },\n    get password() {\n      return options.password || \"password\";\n    },\n    get srtoken() {\n      return options.srtoken || \"0123456789123456\";\n    },\n    stop: function stopTajriba() {\n      if (!stopped) {\n        // console.log(\"kill\", port);\n        taj.kill(\"SIGKILL\");\n        stopped = true;\n      }\n    },\n  };\n}\n\nexport async function withTajriba(\n  fn: (tajServer: TajServer) => void,\n  options: StartTajribaOptions = {}\n) {\n  const srv = await startTajriba(options);\n  try {\n    await fn(srv);\n  } catch (err) {\n    console.error(err);\n    process.exit(1);\n  } finally {\n    srv.stop();\n  }\n}\n\nexport function sleep(ms: number): Promise<void> {\n  return new Promise((r) => setTimeout(r, ms));\n}\n","import { State } from \"@empirica/tajriba\";\nimport { z } from \"zod\";\nimport { Attribute } from \"../../shared/attributes\";\nimport { debug, error, trace, warn } from \"../../utils/console\";\nimport { deepEqual } from \"../../utils/object\";\nimport { pickRandom, selectRandom } from \"../../utils/random\";\nimport { EventContext, ListenersCollector, TajribaEvent } from \"../events\";\nimport { Participant } from \"../participants\";\nimport { Step, Transition } from \"../transitions\";\nimport { attrs } from \"./helpers\";\nimport {\n  Batch,\n  ClassicKinds,\n  Context,\n  Game,\n  Player,\n  PlayerStage,\n  Round,\n  Stage,\n  evt,\n} from \"./models\";\nimport { batchConfigSchema, factorsSchema } from \"./schemas\";\n\n// const isBatch = z.instanceof(Batch).parse;\nconst isGame = z.instanceof(Game).parse;\nconst isRound = z.instanceof(Round).parse;\nconst isStage = z.instanceof(Stage).parse;\nconst isString = z.string().parse;\n\nexport type ClassicConfig = {\n  /**\n   * Disables automatic assignment of players on the connection of a new player.\n   * It is up to the developer to call `game.assignPlayer` when they want to\n   * assign a player to a game.\n   *\n   * @type {boolean}\n   */\n  disableAssignment?: boolean;\n\n  /**\n   * Disable the introDone check (when the players are done with intro steps),\n   * which normally will check if enough players are ready (done with intro\n   * steps) to start a game. This means that the game will not start on its own\n   * after intro steps. It is up to the developer to start the game manually\n   * with `game.start()`.\n   *\n   * This also disables playerCount checks and overflow from one game to the\n   * next available game with the same treatment.\n   *\n   * @type {boolean}\n   */\n  disableIntroCheck?: boolean;\n\n  /**\n   * Disable game creation on new batch.\n   *\n   * @type {boolean}\n   */\n  disableGameCreation?: boolean;\n\n  /**\n   * By default if all existing games are complete, the batch ends.\n   * This option disables this pattern so that we can leave a batch open\n   * indefinitely.\n   * It enables to spawn new games for people who arrive later, even if all\n   * previous games had already finished.\n   *\n   * @type {boolean}\n   */\n  disableBatchAutoend?: boolean;\n\n  /**\n   * If true, players will be assigned to games that still have open slots\n   * rather than pure random assignment.\n   *\n   * @type {boolean}\n   */\n  preferUnderassignedGames?: boolean;\n\n  /**\n   * If a game is full, don't assign more players to it.\n   * If there is a subsequent batch that still has open slots, it will still try\n   * to assign players to those games.\n   * If `preferUnderassignedGames` is also set, `neverOverbookGames` will take\n   * precedence.\n   *\n   * @type {boolean}\n   */\n  neverOverbookGames?: boolean;\n};\n\nexport function Classic({\n  disableAssignment,\n  disableIntroCheck,\n  disableGameCreation,\n  disableBatchAutoend = false,\n  preferUnderassignedGames,\n  neverOverbookGames,\n}: ClassicConfig = {}) {\n  return function (_: ListenersCollector<Context, ClassicKinds>) {\n    const online = new Map<string, Participant>();\n    const playersForParticipant = new Map<string, Player>();\n    const stageForStepID = new Map<string, Stage>();\n\n    async function assignplayer(\n      ctx: EventContext<Context, ClassicKinds>,\n      player: Player,\n      skipGameIDs?: string[]\n    ) {\n      if (disableAssignment) {\n        return;\n      }\n\n      if (player.get(\"gameID\")) {\n        return;\n      }\n\n      for (const batch of evt(ctx).batches) {\n        if (!batch.isRunning) {\n          continue;\n        }\n\n        let availableGames: Game[] = [];\n        for (const game of batch.games) {\n          if (\n            !game.isStarting &&\n            !game.hasStarted &&\n            // A game can be ended before it has started, in case of a lobby\n            // timeout for example\n            !game.hasEnded &&\n            (!skipGameIDs || !skipGameIDs?.includes(game.id))\n          ) {\n            availableGames.push(game);\n          }\n        }\n\n        if (availableGames.length === 0) {\n          continue;\n        }\n\n        if (player.get(\"treatment\")) {\n          availableGames = availableGames.filter((g) =>\n            deepEqual(g.get(\"treatment\"), player.get(\"treatment\"))\n          );\n        }\n\n        if (availableGames.length === 0) {\n          continue;\n        }\n\n        if (preferUnderassignedGames || neverOverbookGames) {\n          const filteredGames = availableGames.filter((g) => {\n            const treatment = factorsSchema.parse(g.get(\"treatment\"));\n            const playerCount = treatment[\"playerCount\"] as number;\n            if (!playerCount || typeof playerCount !== \"number\") {\n              warn(\n                \"preferUnderassignedGames|neverOverbookGames: no playerCount\",\n                g.id\n              );\n              return true;\n            }\n\n            trace(\n              \"playerAssignedCount|neverOverbookGames\",\n              g.players.length,\n              playerCount\n            );\n\n            return g.players.length < playerCount;\n          });\n\n          if (filteredGames.length === 0) {\n            if (neverOverbookGames) {\n              trace(\"neverOverbookGames: no games available in this batch\");\n              availableGames = [];\n            } else {\n              trace(\n                \"preferUnderassignedGames: no empty games in this batch, overbooking\"\n              );\n            }\n          } else {\n            trace(\n              \"preferUnderassignedGames|neverOverbookGames: filtered games:\",\n              filteredGames.length,\n              \"/\",\n              availableGames.length\n            );\n            availableGames = filteredGames;\n          }\n        }\n\n        const game = pickRandom(availableGames);\n        await game.assignPlayer(player);\n\n        return;\n      }\n\n      if (player.get(\"gameID\") !== undefined) {\n        player.set(\"ended\", \"no more games\");\n      }\n    }\n\n    function checkShouldOpenExperiment(\n      ctx: EventContext<Context, ClassicKinds>\n    ) {\n      let shouldOpenExperiment = false;\n\n      LOOP: for (const batch of evt(ctx).batches) {\n        if (!batch.isRunning) {\n          continue;\n        }\n\n        for (const game of batch.games) {\n          if (!game.hasStarted && !game.hasEnded) {\n            shouldOpenExperiment = true;\n            break LOOP;\n          }\n        }\n      }\n\n      ctx.globals.set(\"experimentOpen\", shouldOpenExperiment);\n    }\n\n    function tryToStartGame(\n      ctx: EventContext<Context, ClassicKinds>,\n      game: Game\n    ) {\n      if (game.get(\"stageID\")) return;\n\n      if (game.stages.length === 0) {\n        return;\n      }\n\n      if (game.rounds.length === 0) {\n        return;\n      }\n\n      const round = isRound(game.rounds[0]);\n\n      if (round.stages.length === 0) {\n        return;\n      }\n\n      const stage = isStage(round.stages[0]);\n\n      const groupID = isString(game.get(\"groupID\"));\n\n      const players = game.players.filter((p) => !p.get(\"ended\"));\n\n      const participantIDs: string[] = [];\n      const nodeIDs = [game.id, groupID];\n      for (const player of players) {\n        nodeIDs.push(player.id);\n        participantIDs.push(player.participantID!);\n        const playerGameID = player.get(`playerGameID-${game.id}`) as\n          | string\n          | undefined;\n\n        // NOTE: this is not right. This means we're aborting because we're not\n        // ready, but the trigger playerGameID-GAMEID is not a trigger to\n        // attempt starting the game again, so sometimes we might not start the\n        // game. I think. So far, it does not happen in the tests, but it seems\n        // like it could. TBD.\n        if (!playerGameID) {\n          return;\n        }\n        nodeIDs.push(playerGameID);\n      }\n\n      ctx.addLinks([{ link: true, participantIDs, nodeIDs }]);\n\n      game.set(\"stageID\", stage.id);\n\n      round.set(\"start\", true);\n    }\n\n    _.on(TajribaEvent.ParticipantConnect, async (ctx, { participant }) => {\n      online.set(participant.id, participant);\n\n      const player = playersForParticipant.get(participant.id);\n\n      if (!player) {\n        await ctx.addScopes([\n          {\n            attributes: attrs([\n              {\n                key: \"participantID\",\n                value: participant.id,\n                immutable: true,\n              },\n              {\n                key: \"participantIdentifier\",\n                value: participant.identifier,\n                immutable: true,\n              },\n            ]),\n            kind: \"player\",\n          },\n        ]);\n      } else {\n        await assignplayer(ctx, player);\n      }\n    });\n\n    _.on(TajribaEvent.ParticipantDisconnect, (_, { participant }) => {\n      online.delete(participant.id);\n    });\n\n    _.on(\"player\", async (ctx, { player }: { player: Player }) => {\n      const participantID = isString(player.get(\"participantID\"));\n\n      player.participantID = participantID;\n      playersForParticipant.set(participantID, player);\n\n      ctx.addLinks([\n        {\n          link: true,\n          participantIDs: [player.participantID!],\n          nodeIDs: [player.id],\n        },\n      ]);\n\n      if (online.has(participantID)) {\n        await assignplayer(ctx, player);\n      }\n    });\n\n    _.on(\"batch\", (_, { batch }: { batch: Batch }) => {\n      if (disableGameCreation || batch.get(\"initialized\")) {\n        return;\n      }\n\n      batch.set(\"initialized\", true);\n\n      const config = batchConfigSchema.parse(batch.get(\"config\"));\n\n      switch (config.kind) {\n        case \"simple\":\n          for (let i = 0; i < config.config.count; i++) {\n            const treatment = pickRandom(config.config.treatments);\n            batch.addGame([\n              {\n                key: \"treatment\",\n                value: treatment.factors,\n                immutable: true,\n              },\n              {\n                key: \"treatmentName\",\n                value: treatment.name || \"\",\n                immutable: true,\n              },\n            ]);\n          }\n\n          break;\n        case \"complete\":\n          for (const t of config.config.treatments) {\n            for (let i = 0; i < t.count; i++) {\n              batch.addGame([\n                {\n                  key: \"treatment\",\n                  value: t.treatment.factors,\n                  immutable: true,\n                },\n                {\n                  key: \"treatmentName\",\n                  value: t.treatment.name || \"\",\n                  immutable: true,\n                },\n              ]);\n            }\n          }\n\n          break;\n        default:\n          warn(\"callbacks: batch created without a config\");\n\n          return;\n      }\n    });\n\n    type BatchStatus = { batch: Batch; status: string };\n    _.unique.on(\n      \"batch\",\n      \"status\",\n      async (ctx, { batch, status }: BatchStatus) => {\n        switch (status) {\n          case \"running\": {\n            for (const [_, player] of playersForParticipant) {\n              if (player.participantID) {\n                await assignplayer(ctx, player);\n              }\n            }\n\n            checkShouldOpenExperiment(ctx);\n            break;\n          }\n          case \"terminated\":\n            for (const game of batch.games) {\n              game.end(status, \"batch ended\");\n            }\n\n            checkShouldOpenExperiment(ctx);\n\n            break;\n\n          case \"ended\":\n            checkShouldOpenExperiment(ctx);\n\n            break;\n          case \"created\":\n            // noop\n\n            break;\n          default:\n            warn(\"unknown batch status:\", status);\n\n            break;\n        }\n      }\n    );\n\n    type GameStatus = { game: Game; status: string };\n    _.unique.on(\"game\", \"status\", (ctx, { game, status }: GameStatus) => {\n      switch (status) {\n        case \"running\": {\n          tryToStartGame(ctx, game);\n          checkShouldOpenExperiment(ctx);\n\n          break;\n        }\n\n        case \"ended\":\n        case \"failed\":\n        case \"terminated\":\n          for (const player of game.players) {\n            player.set(\"ended\", `game ${status}`);\n          }\n\n          const finishedBatch =\n            !disableBatchAutoend && game.batch!.games.every((g) => g.hasEnded);\n\n          if (finishedBatch) {\n            game.batch!.end(\"all games finished\");\n          }\n\n          checkShouldOpenExperiment(ctx);\n\n          break;\n        default:\n          warn(`unkown game status: ${status}`);\n\n          break;\n      }\n    });\n\n    _.on(\"game\", async (ctx, { game }) => {\n      if (game.get(\"groupID\")) {\n        return;\n      }\n\n      // Create empty group for now, add players as assigned\n\n      let groups: { id: string }[];\n      try {\n        groups = await ctx.addGroups([{ participantIDs: [] }]);\n      } catch (err) {\n        error(`failed to create game group: ${err}`);\n\n        return;\n      }\n\n      if (groups.length < 1) {\n        error(`failed to create game groups`);\n\n        return;\n      }\n\n      const groupID = groups[0]!.id;\n\n      game.set(\"groupID\", groupID);\n    });\n\n    _.on(\"stage\", \"gameID\", async (ctx, { stage }: { stage: Stage }) => {\n      if (!stage.currentGame?.isRunning) {\n        return;\n      }\n\n      tryToStartGame(ctx, stage.currentGame);\n    });\n\n    type StageTimerID = { stage: Stage; timerID: string };\n    _.after(\"stage\", \"timerID\", (_, { stage, timerID }: StageTimerID) => {\n      stageForStepID.set(timerID, stage);\n    });\n\n    function getNextStage(\n      stage: Stage,\n      game: Game\n    ):\n      | { stop: true; nextStage: undefined; nextRound: undefined }\n      | { stop: false; nextStage: Stage; nextRound: Round } {\n      // Stop if we're at the end of the game\n      if (game.hasEnded) {\n        return { stop: true, nextStage: undefined, nextRound: undefined };\n      }\n\n      // Get the next stage in round\n      const currentRound = isRound(stage.round);\n      let nextRound: Round | undefined = currentRound;\n      const roundStages = currentRound.stages;\n      let nextStage: Stage | undefined =\n        roundStages[(stage.get(\"index\") as number) + 1];\n\n      // If no more stages in round, get next round\n      if (!nextStage) {\n        const gameRounds = game.rounds;\n        nextRound = gameRounds[(currentRound.get(\"index\") as number) + 1];\n\n        // If no more rounds in game, stop\n        if (!nextRound) {\n          return { stop: true, nextStage: undefined, nextRound: undefined };\n        }\n\n        // Get first stage in next round\n        nextStage = nextRound.stages[0];\n\n        // If next round is empty for whatever reason, stop\n        if (!nextStage) {\n          return { stop: true, nextStage: undefined, nextRound: undefined };\n        }\n      }\n\n      return { nextStage, nextRound, stop: false };\n    }\n\n    async function introDoneCheck(\n      ctx: EventContext<Context, ClassicKinds>,\n      player: Player\n    ) {\n      if (disableIntroCheck || !player.currentGame) {\n        return;\n      }\n\n      const game = isGame(player.currentGame);\n      const treatment = factorsSchema.parse(game.get(\"treatment\"));\n      const playerCount = treatment[\"playerCount\"] as number;\n      const readyPlayers = game.players.filter(\n        (p) => p.get(\"introDone\") && !p.get(\"ended\")\n      );\n\n      if (readyPlayers.length < playerCount) {\n        trace(\"introDone: not enough players ready yet\");\n\n        return;\n      }\n\n      if (game.hasStarted) {\n        trace(\"introDone: game already started\");\n\n        return;\n      }\n\n      game.set(\"starting\", true);\n\n      const players = selectRandom(readyPlayers, playerCount);\n\n      const playersIDS = players.map((p) => p.id);\n      for (const plyr of game.players) {\n        if (!playersIDS.includes(plyr.id)) {\n          plyr.set(\"gameID\", null);\n          trace(\"introDone: unassigning player - REASSIGNING\", plyr.id);\n          await assignplayer(ctx, plyr, [game.id]);\n        }\n      }\n\n      trace(\"introDone: starting game\");\n      game.start();\n    }\n\n    _.on(\"player\", \"introDone\", async (ctx, { player }: { player: Player }) => {\n      await introDoneCheck(ctx, player);\n    });\n\n    _.on(\n      \"player\",\n      \"replayGameReadyCheck\",\n      async (\n        ctx,\n        {\n          player,\n          replayGameReadyCheck,\n        }: { player: Player; replayGameReadyCheck: boolean }\n      ) => {\n        if (!replayGameReadyCheck) {\n          return;\n        }\n\n        player.set(\"replayGameReadyCheck\", false);\n        await introDoneCheck(ctx, player);\n      }\n    );\n\n    // If a player gets their ended state reset, try to reassign them.\n    _.on(\n      \"player\",\n      \"ended\",\n      async (\n        ctx,\n        { player, ended }: { player: Player; ended: string | undefined }\n      ) => {\n        const participantID = player.get(\"participantID\");\n        if (\n          player.currentGame ||\n          ended ||\n          !participantID ||\n          !online.has(participantID as string)\n        ) {\n          return;\n        }\n\n        await assignplayer(ctx, player);\n      }\n    );\n\n    type BeforeGameStart = { game: Game; start: boolean };\n    _.unique.before(\n      \"game\",\n      \"start\",\n      async (_, { game, start }: BeforeGameStart) => {\n        if (!start) {\n          return;\n        }\n\n        // await Promise.all(\n        //   game.players.map((player) => game.createPlayerGame(player))\n        // );\n        await game.createPlayerGames(game.players);\n      }\n    );\n\n    type AfterGameStart = { game: Game; start: boolean };\n    _.unique.after(\"game\", \"start\", (_, { game, start }: AfterGameStart) => {\n      if (!start) {\n        return;\n      }\n\n      game.set(\"status\", \"running\");\n    });\n\n    type BeforeRoundStart = { round: Round; start: boolean };\n    _.unique.before(\n      \"round\",\n      \"start\",\n      async (_, { round, start }: BeforeRoundStart) => {\n        if (!start) {\n          return;\n        }\n\n        const game = isGame(round.currentGame);\n\n        await Promise.all(\n          game.players.map((player) => round.createPlayerRound(player))\n        );\n      }\n    );\n\n    type AfterRoundStart = {\n      round: Round;\n      start: boolean;\n      attribute: Attribute;\n    };\n    _.unique.after(\n      \"round\",\n      \"start\",\n      (ctx, { round, start }: AfterRoundStart) => {\n        if (!start) return;\n\n        const game = isGame(round.currentGame);\n        const stageID = isString(game.get(\"stageID\"));\n\n        const stage = isStage(game.stages.find((s) => s.id === stageID));\n\n        if (stage.get(\"start\")) {\n          return;\n        }\n\n        const participantIDs: string[] = [];\n        const nodeIDs = [round.id];\n        for (const player of game.players) {\n          participantIDs.push(player.participantID!);\n          nodeIDs.push(isString(player.get(`playerRoundID-${round.id}`)));\n        }\n\n        ctx.addLinks([{ link: true, participantIDs, nodeIDs }]);\n\n        stage.set(\"start\", true);\n      }\n    );\n\n    type BeforeStageStart = { stage: Stage; start: boolean };\n    _.unique.before(\n      \"stage\",\n      \"start\",\n      async (_, { stage, start }: BeforeStageStart) => {\n        if (!start) return;\n\n        if (stage.get(\"initialized\")) {\n          return;\n        }\n\n        const game = isGame(stage.currentGame);\n\n        await Promise.all(\n          game.players.map((player) => stage.createPlayerStage(player))\n        );\n\n        stage.set(\"initialized\", true, { private: true, immutable: true });\n      }\n    );\n\n    type AfterStageStart = {\n      stage: Stage;\n      start: boolean;\n      attribute: Attribute;\n    };\n    _.unique.after(\n      \"stage\",\n      \"start\",\n      (ctx, { stage, start }: AfterStageStart) => {\n        if (!start) return;\n\n        if (stage.get(\"started\") || !stage.get(\"initialized\")) {\n          return;\n        }\n        stage.set(\"started\", true, { private: true, immutable: true });\n\n        const game = isGame(stage.currentGame);\n\n        const timerID = isString(stage.get(\"timerID\"));\n\n        const participantIDs: string[] = [];\n        const nodeIDs = [stage.id, timerID];\n        for (const player of game.players) {\n          participantIDs.push(player.participantID!);\n          nodeIDs.push(isString(player.get(`playerStageID-${stage.id}`)));\n        }\n\n        ctx.addLinks([{ link: true, participantIDs, nodeIDs }]);\n\n        ctx\n          .addTransitions([\n            {\n              from: State.Created,\n              to: State.Running,\n              nodeID: timerID,\n              cause: \"stage start\",\n            },\n          ])\n          .catch((err) => {\n            debug(`stage start: ${err}`);\n          })\n          .then(() => {\n            trace(`stage start, transitioned`);\n          });\n      }\n    );\n\n    type PlayerStageSubmit = { playerStage: PlayerStage; submit: boolean };\n    _.after(\n      \"playerStage\",\n      \"submit\",\n      (ctx, { playerStage, submit }: PlayerStageSubmit) => {\n        if (!submit) return;\n\n        if (!playerStage.stage || !playerStage.stage.isCurrent()) {\n          return;\n        }\n\n        const players = playerStage.player!.currentGame!.players;\n        if (players.length === 0) {\n          warn(\"callbacks: no players onSubmit\");\n          return;\n        }\n\n        const haveAllPlayersSubmitted = players.every(\n          (p) =>\n            p.get(\"ended\") ||\n            !online.has(p.get(\"participantID\")?.toString() as string) ||\n            p.stage?.get(\"submit\")\n        );\n\n        if (haveAllPlayersSubmitted) {\n          ctx\n            .addTransitions([\n              {\n                from: State.Running,\n                to: State.Ended,\n                nodeID: isString(playerStage.stage!.get(\"timerID\")),\n                cause: \"players submitted\",\n              },\n            ])\n            .catch((err) => {\n              debug(`players submitted: ${err}`);\n            })\n            .then(() => {\n              trace(`all player submitted, transitioned`);\n            });\n        } else {\n          trace(`not all player submitted`);\n        }\n      }\n    );\n\n    type AfterStageEnded = { stage: Stage; ended: boolean };\n    _.unique.after(\n      \"stage\",\n      \"ended\",\n      (ctx, { stage, ended }: AfterStageEnded) => {\n        if (!ended) return;\n\n        const game = isGame(stage.currentGame);\n        const timerID = isString(stage.get(\"timerID\"));\n        const round = isRound(stage.round);\n\n        const participantIDs: string[] = [];\n        const nodeIDs: string[] = [stage.id, timerID!];\n        for (const player of game.players) {\n          participantIDs.push(player.participantID!);\n          nodeIDs.push(isString(player.get(`playerStageID-${stage.id}`)));\n        }\n\n        ctx.addLinks([{ link: false, participantIDs, nodeIDs }]);\n\n        const { stop, nextRound, nextStage } = getNextStage(stage, game);\n\n        if (stop) {\n          round.set(\"ended\", true);\n\n          return;\n        }\n\n        if (round.id !== nextRound.id) {\n          round.set(\"ended\", true);\n        } else {\n          game.set(\"stageID\", nextStage.id);\n          nextStage.set(\"start\", true);\n        }\n      }\n    );\n\n    type AfterRoundEnded = { round: Round; ended: boolean };\n    _.unique.after(\n      \"round\",\n      \"ended\",\n      (ctx, { round, ended }: AfterRoundEnded) => {\n        if (!ended) return;\n\n        const game = isGame(round.currentGame);\n        const stage = isStage(game.currentStage);\n\n        const participantIDs: string[] = [];\n        const nodeIDs: string[] = [round.id];\n        for (const player of game.players) {\n          participantIDs.push(player.participantID!);\n          nodeIDs.push(isString(player.get(`playerRoundID-${round.id}`)));\n        }\n\n        ctx.addLinks([{ link: false, participantIDs, nodeIDs }]);\n\n        const { stop, nextRound, nextStage } = getNextStage(stage, game);\n\n        if (stop) {\n          game.set(\"stageID\", null);\n          game.set(\"ended\", true);\n\n          return;\n        }\n\n        game.set(\"stageID\", nextStage.id);\n        nextRound.set(\"start\", true);\n      }\n    );\n\n    type AfterGameEnded = { game: Game; ended: boolean };\n    _.unique.after(\"game\", \"ended\", (_, { game, ended }: AfterGameEnded) => {\n      if (!ended) return;\n\n      game.end(\"ended\", \"end of game\");\n    });\n\n    type TransitionAdd = { step: Step; transition: Transition };\n    _.on(\n      TajribaEvent.TransitionAdd,\n      (_, { step, transition: { from, to } }: TransitionAdd) => {\n        const stage = stageForStepID.get(step.id);\n        if (!stage) {\n          return;\n        }\n\n        debug(`transition stage: ${from} => ${to}`);\n\n        if (from === State.Running && to === State.Ended) {\n          const stage = isStage(stageForStepID.get(step.id));\n\n          if (!stage.get(\"ended\")) {\n            stage.set(\"ended\", true);\n          }\n        }\n      }\n    );\n  };\n}\n","export function pickRandom<T>(items: T[]): T {\n  const random = Math.floor(Math.random() * items.length);\n  return items[random] as T;\n}\n\nexport function shuffle(a: Array<any>) {\n  for (let i = a.length - 1; i > 0; i--) {\n    const j = Math.floor(Math.random() * (i + 1));\n    [a[i], a[j]] = [a[j], a[i]];\n  }\n  return a;\n}\n\nexport function selectRandom(arr: Array<any>, num: number) {\n  return shuffle(arr.slice()).slice(0, num);\n}\n","import { AddScopeInput, SetAttributeInput } from \"@empirica/tajriba\";\nimport { AttributeOptions } from \"../../shared/attributes\";\nimport { JsonValue } from \"../../utils/json\";\n\nexport function attribs(scopeID: string) {\n  const result: SetAttributeInput[] = [];\n\n  return {\n    set: (key: string, value: JsonValue, ao?: Partial<AttributeOptions>) => {\n      const props: SetAttributeInput = {\n        key: key,\n        nodeID: scopeID,\n        val: JSON.stringify(value),\n        ...ao,\n      };\n\n      result.push(props);\n    },\n    result,\n  };\n}\n\nexport function scopeConstructor(input: AddScopeInput) {\n  return [\n    input,\n    {\n      get(key: string) {\n        const attr = input.attributes?.find((a) => a.key === key);\n        if (!attr) {\n          return;\n        }\n\n        return attr.val ? JSON.parse(attr.val) : undefined;\n      },\n      set: (key: string, value: JsonValue, ao?: Partial<AttributeOptions>) => {\n        const attr = input.attributes?.find((a) => a.key === key);\n        if (attr) {\n          attr.val = JSON.stringify(value);\n\n          return;\n        }\n\n        const props: SetAttributeInput = {\n          key: key,\n          val: JSON.stringify(value),\n          ...ao,\n        };\n\n        if (!input.attributes) {\n          input.attributes = [];\n        }\n\n        input.attributes.push(props);\n      },\n    },\n  ] as const;\n}\n\nexport type AttrInput = {\n  append?: boolean;\n  immutable?: boolean;\n  ephemeral?: boolean;\n  index?: number;\n  key: string;\n  nodeID?: string;\n  private?: boolean;\n  protected?: boolean;\n  value: JsonValue;\n  vector?: boolean;\n};\n\nexport function attrs(attrs: AttrInput[]) {\n  const result: SetAttributeInput[] = [];\n\n  for (const attr of attrs) {\n    const {\n      append,\n      immutable,\n      ephemeral,\n      index,\n      key,\n      nodeID,\n      private: privat,\n      protected: protecte,\n      value,\n    } = attr;\n\n    result.push({\n      append,\n      immutable,\n      ephemeral,\n      index,\n      key,\n      nodeID,\n      private: privat,\n      protected: protecte,\n      val: JSON.stringify(value),\n    });\n  }\n\n  return result;\n}\n","import { AddScopeInput, State } from \"@empirica/tajriba\";\nimport { debug, trace } from \"console\";\nimport { z } from \"zod\";\nimport { Constructor } from \"../../shared/helpers\";\nimport { Attributable } from \"../../shared/scopes\";\nimport { error, warn } from \"../../utils/console\";\nimport { JsonValue } from \"../../utils/json\";\nimport { AddScopePayload, StepPayload } from \"../context\";\nimport { EventContext } from \"../events\";\nimport { Scope } from \"../scopes\";\nimport { AttrInput, attrs, scopeConstructor } from \"./helpers\";\n\nconst isString = z.string().parse;\nconst isOptionalNumber = z.number().optional().parse;\n\nexport const endedStatuses = [\"ended\", \"terminated\", \"failed\"];\nexport type EndedStatuses = typeof endedStatuses[number];\n\nconst reservedKeys = [\n  \"batchID\",\n  \"gameID\",\n  \"stageID\",\n  \"roundID\",\n  \"start\",\n  \"ended\",\n  \"timerID\",\n];\n\nexport const lobbyConfigSchema = z.object({\n  kind: z.union([z.literal(\"shared\"), z.literal(\"individual\")]),\n  duration: z.number().min(1),\n  strategy: z.union([z.literal(\"fail\"), z.literal(\"ignore\")]),\n  extensions: z.number().min(1).optional(),\n});\n\nconst indexSortable = (a: Attributable, b: Attributable) =>\n  (a.get(\"index\") as number) - (b.get(\"index\") as number);\n\nexport class Batch extends Scope<Context, ClassicKinds> {\n  get isRunning() {\n    return this.get(\"status\") === \"running\";\n  }\n\n  get games() {\n    return this.scopesByKindMatching<Game>(\"game\", \"batchID\", this.id);\n  }\n\n  addGame(attributes: { [key: string]: JsonValue } | AttrInput[]) {\n    if (!Array.isArray(attributes)) {\n      const newAttr: AttrInput[] = [];\n      for (const key in attributes) {\n        newAttr.push({\n          key,\n          value: attributes[key]!,\n        });\n      }\n\n      attributes = newAttr;\n    }\n\n    const [scope, accessors] = scopeConstructor({\n      kind: \"game\",\n      attributes: attrs([\n        ...attributes.filter((a) => !reservedKeys.includes(a.key)),\n        {\n          key: \"batchID\",\n          value: this.id,\n          immutable: true,\n        },\n        {\n          key: \"start\",\n          value: false,\n          protected: true,\n        },\n        {\n          key: \"ended\",\n          value: false,\n          protected: true,\n        },\n      ]),\n    });\n\n    this.addScopes([scope]);\n\n    return accessors;\n  }\n\n  end(reason: string) {\n    if (this.hasEnded) {\n      return;\n    }\n\n    this.set(\"status\", \"ended\");\n    this.set(\"endedReason\", reason);\n  }\n\n  get hasEnded() {\n    return endedStatuses.includes(this.get(\"status\") as EndedStatuses);\n  }\n\n  get lobbyConfig() {\n    return lobbyConfigSchema.parse(this.get(\"lobbyConfig\"));\n  }\n}\n\nexport class BatchOwned extends Scope<Context, ClassicKinds> {\n  get batch() {\n    return this.scopeByKey<Batch>(\"batchID\");\n  }\n}\n\nexport class Game extends BatchOwned {\n  // this._tmpRoundIndex is used to keep track of the round index when adding\n  // multiple rounds to a game within a callback, during which the game's\n  // roundIndex attribute is not saved yet.\n  // this._tmpRoundIndex is reset to undefined after the callback is called in\n  // the finalizer.\n  // This is ugly...\n  private _tmpRoundIndex: number | undefined;\n\n  get rounds() {\n    const rounds = this.scopesByKindMatching<Round>(\"round\", \"gameID\", this.id);\n    rounds.sort(indexSortable);\n    return rounds;\n  }\n\n  get stages() {\n    const stages = this.scopesByKindMatching<Stage>(\"stage\", \"gameID\", this.id);\n    stages.sort(indexSortable);\n    return stages;\n  }\n\n  get players() {\n    return this.scopesByKindMatching<Player>(\"player\", \"gameID\", this.id);\n  }\n\n  get currentStage() {\n    return this.scopeByKey<Stage>(\"stageID\");\n  }\n\n  get currentRound() {\n    return this.currentStage?.round;\n  }\n\n  get hasEnded() {\n    return endedStatuses.includes(this.get(\"status\") as EndedStatuses);\n  }\n\n  // The game has started, but it might not be running yet, it might still be in\n  // the gameStart callbacks.\n  // This will always be true once the game has started (even after the game\n  // ends).\n  get hasStarted() {\n    return Boolean(this.get(\"start\"));\n  }\n\n  get isStarting() {\n    return Boolean(this.get(\"starting\"));\n  }\n\n  get hasNotStarted() {\n    return !this.hasStarted;\n  }\n\n  // Game has passed the gameStart callbacks and is currently running. This will\n  // be true until the game ends.\n  get isRunning() {\n    return this.get(\"status\") === \"running\";\n  }\n\n  get lobbyConfig() {\n    return this.batch!.lobbyConfig;\n  }\n\n  // Starts the game if it is not already started.\n  start() {\n    if (!this.get(\"start\")) {\n      this.setActualPlayerCount();\n      this.set(\"start\", true);\n    }\n  }\n\n  private setActualPlayerCount() {\n    this.set(\"actualPlayerCount\", this.players.length);\n  }\n\n  async assignPlayer(player: Player) {\n    if (this.hasEnded) {\n      throw new Error(\"cannot assign player to ended Game\");\n    }\n\n    const previousGameID = player.get(\"gameID\");\n    const previousGameTreatment = player.get(\"treatment\");\n\n    const treatment = this.get(\"treatment\");\n    const treatmentName = this.get(\"treatmentName\");\n    if (!treatment) {\n      warn(`game without treatment: ${this.id}`);\n    }\n\n    player.set(\"ended\", null);\n    player.set(\"gameID\", this.id);\n    if (treatment) {\n      player.set(\"treatment\", treatment);\n    }\n    if (treatmentName) {\n      player.set(\"treatmentName\", treatmentName);\n    }\n\n    if (\n      previousGameTreatment &&\n      JSON.stringify(previousGameTreatment) !== JSON.stringify(treatment)\n    ) {\n      if (previousGameID) {\n        warn(\n          `reassigning player from ${previousGameID} to ${this.id} with different treatments`\n        );\n      } else {\n        warn(`reassigning player to ${this.id} with different treatment`);\n      }\n    }\n\n    // Remove player from previous Game.\n    // We do this after setting the new gameID on the player so we don't\n    // conflict with the other game concurrently starting. If the game is just\n    // starting and we change the gameID too late, we might allow that previous\n    // Game to start with this player.\n    if (previousGameID) {\n      await this.scopeByID<Game>(<string>previousGameID)?.removePlayer(player);\n    }\n\n    // Add player to running game.\n    await this.addPlayer(player);\n\n    if (!this.get(\"start\") && player.get(\"introDone\")) {\n      // Retrigger game ready check.\n      player.set(\"replayGameReadyCheck\", true);\n    }\n  }\n\n  // Add player to running game\n  private async addPlayer(player: Player) {\n    if (!this.isRunning) {\n      await this.addLinks([\n        {\n          link: true,\n          participantIDs: [player.participantID!],\n          nodeIDs: [this.id],\n        },\n      ]);\n\n      return;\n    }\n\n    const otherParticipantIDs = [];\n    const groupID = isString(this.get(\"groupID\"));\n    const newPlayerNodeIDs = [this.id, groupID];\n    const otherNodeIDs = [];\n\n    const stage = this.currentStage;\n    if (!stage) {\n      return;\n    }\n\n    const timerID = stage.get(\"timerID\") as string;\n    if (timerID) {\n      newPlayerNodeIDs.push(timerID);\n    }\n\n    newPlayerNodeIDs.push(stage.id);\n\n    const round = stage.round;\n    if (!round) {\n      return;\n    }\n\n    newPlayerNodeIDs.push(round.id);\n    const playerGameID = await this.createPlayerGame(player);\n    const playerRoundID = await round.createPlayerRound(player);\n    const playerStageID = await stage.createPlayerStage(player);\n\n    if (!playerGameID || !playerRoundID || !playerStageID) {\n      return;\n    }\n\n    newPlayerNodeIDs.push(player.id);\n    newPlayerNodeIDs.push(playerGameID!);\n    newPlayerNodeIDs.push(playerRoundID!);\n    newPlayerNodeIDs.push(playerStageID!);\n    otherNodeIDs.push(player.id);\n    otherNodeIDs.push(playerGameID!);\n    otherNodeIDs.push(playerRoundID!);\n    otherNodeIDs.push(playerStageID!);\n\n    // We assume the player has already added the gameID.\n    for (const plyr of this.players) {\n      if (player !== plyr) {\n        newPlayerNodeIDs.push(plyr.id);\n        newPlayerNodeIDs.push(isString(plyr.get(`playerGameID-${this.id}`)));\n        newPlayerNodeIDs.push(isString(plyr.get(`playerRoundID-${round.id}`)));\n        newPlayerNodeIDs.push(isString(plyr.get(`playerStageID-${stage.id}`)));\n        otherParticipantIDs.push(plyr.participantID!);\n      }\n    }\n\n    await this.addLinks([\n      // Add links for new player with games and other players.\n      {\n        link: true,\n        participantIDs: [player.participantID!],\n        nodeIDs: newPlayerNodeIDs,\n      },\n      // Add links for other players with new player.\n      {\n        link: true,\n        participantIDs: otherParticipantIDs,\n        nodeIDs: otherNodeIDs,\n      },\n    ]);\n\n    this.setActualPlayerCount();\n  }\n\n  // Remove player from running game\n  private async removePlayer(player: Player) {\n    if (!this.isRunning) {\n      const nodeIDs = [this.id];\n\n      for (const plyr of this.players) {\n        if (player !== plyr) {\n          nodeIDs.push(plyr.id);\n        }\n      }\n\n      await this.addLinks([\n        {\n          link: false,\n          participantIDs: [player.participantID!],\n          nodeIDs,\n        },\n      ]);\n\n      return;\n    }\n\n    const participantIDs = [player.participantID!];\n    const otherParticipantIDs = [];\n    const groupID = isString(this.get(\"groupID\"));\n    const nodeIDs = [this.id, groupID, player.id];\n    const otherNodeIDs = [player.id];\n\n    const stage = this.currentStage;\n    if (!stage) {\n      return;\n    }\n\n    const timerID = stage.get(\"timerID\") as string;\n    if (timerID) {\n      nodeIDs.push(timerID);\n    }\n\n    nodeIDs.push(stage.id);\n\n    const round = stage.round;\n    if (!round) {\n      return;\n    }\n\n    // Gotta inject player since it might have lost its gameID.\n    const players = [...this.players, player];\n    for (const plyr of players) {\n      nodeIDs.push(isString(plyr.get(`playerRoundID-${round.id}`)));\n      nodeIDs.push(isString(plyr.get(`playerStageID-${stage.id}`)));\n      nodeIDs.push(isString(plyr.get(`playerGameID-${this.id}`)));\n\n      if (player.id !== plyr.id) {\n        nodeIDs.push(plyr.id);\n        otherParticipantIDs.push(plyr.participantID!);\n      } else {\n        otherNodeIDs.push(isString(plyr.get(`playerRoundID-${round.id}`)));\n        otherNodeIDs.push(isString(plyr.get(`playerStageID-${stage.id}`)));\n        otherNodeIDs.push(isString(plyr.get(`playerGameID-${this.id}`)));\n      }\n    }\n\n    await this.addLinks([\n      { link: false, participantIDs, nodeIDs },\n      {\n        link: false,\n        participantIDs: otherParticipantIDs,\n        nodeIDs: otherNodeIDs,\n      },\n    ]);\n\n    this.setActualPlayerCount();\n  }\n\n  addRound(attributes: { [key: string]: JsonValue } | AttrInput[]) {\n    if (!Array.isArray(attributes)) {\n      const newAttr: AttrInput[] = [];\n      for (const key in attributes) {\n        newAttr.push({\n          key,\n          value: attributes[key]!,\n        });\n      }\n\n      attributes = newAttr;\n    }\n\n    const batchID = this.get(\"batchID\") as string;\n    if (!batchID) {\n      throw new Error(\"missing batch ID on game\");\n    }\n\n    const game = this;\n    const gameID = game.id;\n\n    let roundIndex = isOptionalNumber(this._tmpRoundIndex);\n    if (roundIndex === undefined) {\n      roundIndex = isOptionalNumber(game.get(\"roundIndex\"));\n    }\n    if (roundIndex === undefined) {\n      roundIndex = -1;\n    }\n\n    // New round index\n    roundIndex += 1;\n\n    this._tmpRoundIndex = roundIndex;\n    game.set(\"roundIndex\", this._tmpRoundIndex);\n\n    const [scope, accessors] = scopeConstructor({\n      kind: \"round\",\n      attributes: attrs([\n        ...attributes.filter((a) => !reservedKeys.includes(a.key)),\n        {\n          key: \"index\",\n          value: roundIndex,\n          immutable: true,\n        },\n        {\n          key: \"gameID\",\n          value: gameID,\n          immutable: true,\n        },\n        {\n          key: \"batchID\",\n          value: batchID,\n          immutable: true,\n        },\n        {\n          key: \"start\",\n          value: false,\n          protected: true,\n        },\n        {\n          key: \"ended\",\n          value: false,\n          protected: true,\n        },\n      ]),\n    });\n\n    const roundProm = this.addScopes([scope]);\n\n    const stageAdds: AddScopeInput[] = [];\n\n    const addStage = (\n      attributes: { [key: string]: JsonValue } | AttrInput[]\n    ) => {\n      if (!Array.isArray(attributes)) {\n        const newAttr: AttrInput[] = [];\n        for (const key in attributes) {\n          newAttr.push({\n            key,\n            value: attributes[key]!,\n          });\n        }\n\n        attributes = newAttr;\n      }\n\n      // Check duration is valid\n      const durAttr = attributes.find((a) => a.key === \"duration\");\n      const res = z.number().int().gte(1).safeParse(durAttr?.value);\n      if (!res.success) {\n        throw new Error(`stage duration invalid: ${res.error}`);\n      }\n\n      const [scope, accessors] = scopeConstructor({\n        kind: \"stage\",\n        attributes: attrs([\n          ...attributes.filter((a) => !reservedKeys.includes(a.key)),\n          {\n            key: \"gameID\",\n            value: gameID,\n            immutable: true,\n          },\n          {\n            key: \"batchID\",\n            value: batchID,\n            immutable: true,\n          },\n          {\n            key: \"start\",\n            value: false,\n            protected: true,\n          },\n          {\n            key: \"ended\",\n            value: false,\n            protected: true,\n          },\n        ]),\n      });\n\n      stageAdds.push(scope);\n\n      return accessors;\n    };\n\n    this.addFinalizer(async () => {\n      this._tmpRoundIndex = undefined;\n\n      let rounds: AddScopePayload[];\n      try {\n        rounds = await roundProm;\n      } catch (err) {\n        error(`failed to create round: ${err}`);\n\n        return;\n      }\n\n      if (rounds.length < 1) {\n        error(`failed to create round`);\n\n        return;\n      }\n\n      // Forced because tested for length > 0\n      const roundID = rounds[0]!.id;\n\n      const round = this.scopeByID<Round>(roundID);\n      if (!round) {\n        throw \"round not found in round finalizer\";\n      }\n\n      let stageIndex = isOptionalNumber(round.get(\"stageIndex\")) || 0;\n\n      for (const scope of stageAdds) {\n        const durAttr = scope.attributes!.find((a) => a.key === \"duration\");\n        if (!durAttr || !durAttr!.val) {\n          error(`stage duration not found`);\n\n          continue;\n        }\n\n        const res = z.number().int().gte(1).safeParse(JSON.parse(durAttr.val));\n        if (!res.success) {\n          throw new Error(`stage duration invalid: ${res.error}`);\n        }\n\n        const duration = res.data;\n\n        scope.attributes!.push({\n          key: \"roundID\",\n          val: JSON.stringify(roundID),\n          immutable: true,\n        });\n\n        let steps: StepPayload[];\n        try {\n          steps = await this.addSteps([{ duration }]);\n        } catch (err) {\n          error(`failed to create steps: ${err}`);\n\n          return;\n        }\n\n        if (steps.length < 1) {\n          error(`failed to create steps`);\n\n          return;\n        }\n\n        // Forced because tested for length > 0\n        const stepID = steps[0]!.id;\n\n        scope.attributes!.push({\n          key: \"timerID\",\n          val: JSON.stringify(stepID),\n          immutable: true,\n        });\n\n        scope.attributes!.push({\n          key: \"index\",\n          val: `${stageIndex}`,\n          immutable: true,\n        });\n\n        stageIndex++;\n      }\n\n      round.set(\"stageIndex\", stageIndex);\n\n      await this.addScopes(stageAdds);\n    });\n\n    return {\n      ...accessors,\n      addStage,\n    };\n  }\n\n  end(status: EndedStatuses, reason: string) {\n    if (this.hasEnded) {\n      return;\n    }\n\n    if (!endedStatuses.includes(status)) {\n      warn(`game: attempting to end game with wrong status`);\n\n      return;\n    }\n\n    this.set(\"status\", status);\n    this.set(\"endedReason\", reason);\n\n    const stage = this.currentStage;\n    if (!stage) {\n      return;\n    }\n\n    stage.end(\"ended\", reason);\n  }\n\n  async createPlayerGames(players: Player[]) {\n    const scopes = [];\n    const batchID = isString(this.get(\"batchID\"));\n\n    for (const player of players) {\n      const key = `playerGameID-${this.id}`;\n      if (player.get(key)) {\n        continue;\n      }\n\n      scopes.push({\n        kind: \"playerGame\",\n        attributes: attrs([\n          {\n            key: \"batchID\",\n            value: batchID,\n            immutable: true,\n          },\n          {\n            key: \"gameID\",\n            value: this.id,\n            immutable: true,\n          },\n          {\n            key: \"playerID\",\n            value: player.id,\n            immutable: true,\n          },\n        ]),\n      });\n    }\n\n    const playerGames = await this.addScopes(scopes);\n\n    if (playerGames.length < scopes.length) {\n      error(`failed to create playerGame`);\n\n      return;\n    }\n\n    for (let playerGame of playerGames) {\n      const playerIDEdge = playerGame.attributes.edges.find(\n        (e) => e.node.key === \"playerID\"\n      );\n\n      if (!playerIDEdge || !playerIDEdge.node.val) {\n        error(`failed to find playerID`);\n\n        continue;\n      }\n\n      const playerID = JSON.parse(playerIDEdge.node.val!);\n\n      const player = players.find((p) => p.id === playerID);\n\n      if (!player) {\n        error(`failed to find player`);\n\n        continue;\n      }\n\n      player.set(`playerGameID-${this.id}`, playerGame.id);\n    }\n  }\n\n  async createPlayerGame(player: Player) {\n    const key = `playerGameID-${this.id}`;\n    if (player.get(key)) {\n      return isString(player.get(key));\n    }\n\n    const batchID = isString(this.get(\"batchID\"));\n\n    const playerGames = await this.addScopes([\n      {\n        kind: \"playerGame\",\n        attributes: attrs([\n          {\n            key: \"batchID\",\n            value: batchID,\n            immutable: true,\n          },\n          {\n            key: \"gameID\",\n            value: this.id,\n            immutable: true,\n          },\n          {\n            key: \"playerID\",\n            value: player.id,\n            immutable: true,\n          },\n        ]),\n      },\n    ]);\n\n    if (playerGames.length < 1) {\n      error(`failed to create playerGame`);\n\n      return;\n    }\n\n    player.set(key, playerGames[0]!.id);\n\n    return playerGames[0]!.id;\n  }\n}\n\nexport class GameOwned extends BatchOwned {\n  get currentGame() {\n    return this.scopeByKey<Game>(\"gameID\");\n  }\n}\n\nexport class Player extends GameOwned {\n  participantID?: string;\n\n  get game() {\n    const game = this.currentGame;\n    if (!game) {\n      return;\n    }\n\n    const key = `playerGameID-${game.id}`;\n\n    return this.scopeByKey<PlayerGame>(key);\n  }\n\n  get currentRound() {\n    return this.currentStage?.round;\n  }\n\n  get round() {\n    const round = this.currentRound;\n    if (!round) {\n      return;\n    }\n\n    const key = `playerRoundID-${round.id}`;\n\n    return this.scopeByKey<PlayerRound>(key);\n  }\n\n  get currentStage() {\n    return this.currentGame?.currentStage;\n  }\n\n  get stage() {\n    const stage = this.currentStage;\n    if (!stage) {\n      return;\n    }\n\n    const key = `playerStageID-${stage.id}`;\n\n    return this.scopeByKey<PlayerStage>(key);\n  }\n\n  exit(reason: string) {\n    if (this.get(\"ended\")) {\n      return;\n    }\n\n    this.set(\"ended\", reason);\n  }\n\n  hasUpdated(): boolean {\n    if (super.hasUpdated()) {\n      return true;\n    }\n\n    return Boolean(\n      this.round?.hasUpdated() ||\n        this.stage?.hasUpdated() ||\n        this.game?.hasUpdated()\n    );\n  }\n}\n\nexport class PlayerGame extends GameOwned {}\n\nexport class PlayerRound extends GameOwned {}\n\nexport class PlayerStage extends GameOwned {\n  get stage() {\n    return this.scopeByKey<Stage>(\"stageID\");\n  }\n\n  get player() {\n    return this.scopeByKey<Player>(\"playerID\");\n  }\n}\n\n// We don't want stages that are too short since we're getting close to the\n// limits of the precision of loose distributed time synchronization.\nconst minStageDuration = 5;\n\n// This is about 31 years. I think that's enough. The main reason for this is to\n// prevent https://github.com/empiricaly/empirica/issues/319 where someone had\n// set the duration to 9999999999, which is >317 years, which is beyond what the\n// Go server time.Duration can handle, and it was exploding.\nconst maxStageDuration = 1_000_000_000;\n\nexport class Round extends GameOwned {\n  get stages() {\n    const stages = this.scopesByKindMatching<Stage>(\n      \"stage\",\n      \"roundID\",\n      this.id\n    );\n    stages.sort(indexSortable);\n    return stages;\n  }\n\n  addStage(attributes: { [key: string]: JsonValue } | AttrInput[]) {\n    if (!Array.isArray(attributes)) {\n      const newAttr: AttrInput[] = [];\n      for (const key in attributes) {\n        newAttr.push({\n          key,\n          value: attributes[key]!,\n        });\n      }\n\n      attributes = newAttr;\n    }\n\n    const durAttr = attributes.find((a) => a.key === \"duration\");\n    const res = z\n      .number()\n      .int()\n      .gte(minStageDuration)\n      .lte(maxStageDuration)\n      .safeParse(durAttr?.value);\n    if (!res.success) {\n      throw new Error(`stage duration invalid: ${res.error}`);\n    }\n\n    const duration = res.data;\n\n    const batchID = this.get(\"batchID\") as string;\n    if (!batchID) {\n      throw new Error(\"missing batch ID on round\");\n    }\n\n    const gameID = this.get(\"gameID\") as string;\n    if (!gameID) {\n      throw new Error(\"missing game ID on round\");\n    }\n\n    const stageIndex = isOptionalNumber(this.get(\"stageIndex\")) || 0;\n    this.set(\"stageIndex\", stageIndex + 1);\n\n    const [scope, accessors] = scopeConstructor({\n      kind: \"stage\",\n      attributes: attrs([\n        ...attributes.filter((a) => !reservedKeys.includes(a.key)),\n        {\n          key: \"index\",\n          value: stageIndex,\n          immutable: true,\n        },\n        {\n          key: \"roundID\",\n          value: this.id,\n          immutable: true,\n        },\n        {\n          key: \"gameID\",\n          value: gameID,\n          immutable: true,\n        },\n        {\n          key: \"batchID\",\n          value: batchID,\n          immutable: true,\n        },\n        {\n          key: \"start\",\n          value: false,\n          protected: true,\n        },\n        {\n          key: \"ended\",\n          value: false,\n          protected: true,\n        },\n      ]),\n    });\n\n    this.addFinalizer(async () => {\n      let steps: StepPayload[];\n      try {\n        steps = await this.addSteps([{ duration }]);\n      } catch (err) {\n        error(`failed to create steps: ${err}`);\n\n        return;\n      }\n\n      if (steps.length < 1) {\n        error(`failed to create steps`);\n\n        return;\n      }\n\n      // Forced because tested for length > 0\n      const stepID = steps[0]!.id;\n\n      scope.attributes!.push({\n        key: \"timerID\",\n        val: JSON.stringify(stepID),\n        immutable: true,\n      });\n\n      this.addScopes([scope]);\n    });\n\n    return accessors;\n  }\n\n  async createPlayerRound(player: Player) {\n    const key = `playerRoundID-${this.id}`;\n    if (player.get(key)) {\n      return isString(player.get(key));\n    }\n\n    const gameID = isString(this.get(\"gameID\"));\n    const batchID = isString(this.get(\"batchID\"));\n\n    const playerRounds = await this.addScopes([\n      {\n        kind: \"playerRound\",\n        attributes: attrs([\n          {\n            key: \"batchID\",\n            value: batchID,\n            immutable: true,\n          },\n          {\n            key: \"gameID\",\n            value: gameID,\n            immutable: true,\n          },\n          {\n            key: \"roundID\",\n            value: this.id,\n            immutable: true,\n          },\n          {\n            key: \"playerID\",\n            value: player.id,\n            immutable: true,\n          },\n        ]),\n      },\n    ]);\n\n    if (playerRounds.length < 1) {\n      error(`failed to create playerRound`);\n\n      return;\n    }\n\n    player.set(key, playerRounds[0]!.id);\n\n    return playerRounds[0]!.id;\n  }\n}\n\nexport class Stage extends GameOwned {\n  get round() {\n    return this.scopeByKey<Round>(\"roundID\");\n  }\n\n  isCurrent() {\n    return this.currentGame?.get(\"stageID\") === this.id;\n  }\n\n  end(status: EndedStatuses, reason: string) {\n    if (this.get(\"ended\")) {\n      return;\n    }\n\n    this.set(\"status\", status);\n    this.set(\"endedReason\", reason);\n\n    this.addTransitions([\n      {\n        from: State.Running,\n        to: State.Ended,\n        nodeID: this.get(\"timerID\") as string,\n        cause: reason,\n      },\n    ])\n      .catch((err) => {\n        debug(`stage end: ${err}`);\n      })\n      .then(() => {\n        trace(`stage end, transitioned`);\n      });\n  }\n\n  async createPlayerStage(player: Player) {\n    const key = `playerStageID-${this.id}`;\n    if (player.get(key)) {\n      return isString(player.get(key));\n    }\n\n    const roundID = isString(this.get(\"roundID\"));\n    const gameID = isString(this.get(\"gameID\"));\n    const batchID = isString(this.get(\"batchID\"));\n\n    const playerStages = await this.addScopes([\n      {\n        kind: \"playerStage\",\n        attributes: attrs([\n          {\n            key: \"batchID\",\n            value: batchID,\n            immutable: true,\n          },\n          {\n            key: \"gameID\",\n            value: gameID,\n            immutable: true,\n          },\n          {\n            key: \"roundID\",\n            value: roundID,\n            immutable: true,\n          },\n          {\n            key: \"stageID\",\n            value: this.id,\n            immutable: true,\n          },\n          {\n            key: \"playerID\",\n            value: player.id,\n            immutable: true,\n          },\n        ]),\n      },\n    ]);\n\n    if (playerStages.length < 1) {\n      error(`failed to create playerStage`);\n\n      return;\n    }\n\n    player.set(key, playerStages[0]!.id);\n\n    return playerStages[0]!.id;\n  }\n}\n\nexport class Context {}\n\nexport type ClassicKinds = {\n  batch: Constructor<Batch>;\n  game: Constructor<Game>;\n  player: Constructor<Player>;\n  playerGame: Constructor<PlayerGame>;\n  playerRound: Constructor<PlayerRound>;\n  playerStage: Constructor<PlayerStage>;\n  round: Constructor<Round>;\n  stage: Constructor<Stage>;\n};\n\nexport const classicKinds = {\n  batch: Batch,\n  game: Game,\n  player: Player,\n  playerGame: PlayerGame,\n  playerRound: PlayerRound,\n  playerStage: PlayerStage,\n  round: Round,\n  stage: Stage,\n};\n\nexport class EventProxy {\n  constructor(private ctx: EventContext<Context, ClassicKinds>) {}\n\n  // Returns all loaded Batches.\n  get batches() {\n    return Array.from(this.ctx.scopesByKind<Batch>(\"batch\").values());\n  }\n\n  // Returns all loaded Games accross Batches.\n  get games() {\n    return Array.from(this.ctx.scopesByKind<Game>(\"game\").values());\n  }\n\n  // Returns all loaded Players accross all Games.\n  get players() {\n    return Array.from(this.ctx.scopesByKind<Player>(\"player\").values());\n  }\n}\n\nexport function evt(ctx: EventContext<Context, ClassicKinds>) {\n  return new EventProxy(ctx);\n}\n","import { z } from \"zod\";\n\nexport const factorsSchema = z.record(z.string().min(1), z.any());\nexport const treatmentSchema = z.object({\n  factors: factorsSchema,\n  name: z.string().optional(),\n});\n\nexport const batchConfigSchema = z.discriminatedUnion(\"kind\", [\n  z.object({\n    kind: z.literal(\"custom\"),\n    config: z.any(),\n  }),\n  z.object({\n    kind: z.literal(\"simple\"),\n    config: z.object({\n      count: z.number().int().positive(),\n      treatments: treatmentSchema.array(),\n    }),\n  }),\n  z.object({\n    kind: z.literal(\"complete\"),\n    config: z.object({\n      treatments: z\n        .object({\n          count: z.number().int().positive(),\n          treatment: treatmentSchema,\n        })\n        .array(),\n    }),\n  }),\n]);\n","import {\n  InputMaybe,\n  ScopedAttributesInput,\n  ScopesQueryVariables,\n  Tajriba,\n  TajribaAdmin,\n} from \"@empirica/tajriba\";\nimport { Constructor } from \"../../../shared/helpers\";\nimport { JsonValue } from \"../../../utils/json\";\n\nexport class Scope {\n  private _attributes = new Map<string, Attribute>();\n  constructor(protected conn: Conn, private edge: ScopeEdge) {\n    for (const edge of this.edge.attributes.edges) {\n      let key = edge.node.key;\n      if (edge.node.vector) {\n        key = `${key}.${edge.node.index}`;\n      }\n\n      this._attributes.set(key, new Attribute(edge.node));\n    }\n  }\n\n  get id() {\n    return this.edge.id;\n  }\n\n  get attributes() {\n    return Array.from(this._attributes.values()).filter(\n      (a) =>\n        !a.key.startsWith(\"ran-\") &&\n        !a.key.startsWith(\"playerGameID\") &&\n        !a.key.startsWith(\"playerRoundID\") &&\n        !a.key.startsWith(\"playerStageID\")\n    );\n  }\n\n  allAttributes() {\n    return this._attributes;\n  }\n}\n\nexport class Attribute {\n  private _value?: JsonValue;\n  constructor(private edge: AttributeEdge) {\n    if (edge.val) {\n      this._value = JSON.parse(edge.val);\n    }\n  }\n\n  get createdAt() {\n    return this.edge.createdAt;\n  }\n\n  get index() {\n    return this.edge.index;\n  }\n\n  get vector() {\n    return this.edge.vector;\n  }\n\n  get id() {\n    return this.edge.id;\n  }\n\n  get key() {\n    return this.edge.key;\n  }\n\n  get value() {\n    return this._value;\n  }\n}\n\nexport class Player extends Scope {}\nexport class Batch extends Scope {}\nexport class Game extends Scope {}\nexport class PlayerGame extends Scope {}\nexport class Round extends Scope {}\nexport class PlayerRound extends Scope {}\nexport class Stage extends Scope {}\nexport class PlayerStage extends Scope {}\n\nexport class Conn {\n  constructor(private tajriba: TajribaAdmin) {}\n\n  stop() {\n    this.tajriba.stop();\n  }\n\n  players() {\n    return this.scopesByKind<Player>(\"player\", Player);\n  }\n\n  batches() {\n    return this.scopesByKind<Batch>(\"batch\", Batch);\n  }\n\n  games() {\n    return this.scopesByKind<Game>(\"game\", Game);\n  }\n\n  rounds() {\n    return this.scopesByKind<Round>(\"round\", Round);\n  }\n\n  stages() {\n    return this.scopesByKind<Stage>(\"stage\", Stage);\n  }\n\n  playerGames() {\n    return this.scopesByKind<PlayerGame>(\"playerGame\", PlayerGame);\n  }\n\n  playerRounds() {\n    return this.scopesByKind<PlayerRound>(\"playerRound\", PlayerRound);\n  }\n\n  playerStages() {\n    return this.scopesByKind<PlayerStage>(\"playerStage\", PlayerStage);\n  }\n\n  private scopesByKind<T extends Scope>(\n    kind: string,\n    cnstrctr: Constructor<T>\n  ) {\n    return this.filteredScopes({ kinds: [kind] }, cnstrctr);\n  }\n\n  private async *filteredScopes<T extends Scope>(\n    filter: InputMaybe<Array<ScopedAttributesInput> | ScopedAttributesInput>,\n    cnstrctr: Constructor<T>\n  ) {\n    const args: ScopesQueryVariables = {\n      first: 100,\n      filter,\n    };\n\n    while (true) {\n      const scopes = await this.tajriba.scopes(args);\n      for (const edge of scopes?.edges ?? []) {\n        yield new cnstrctr(this, edge.node);\n      }\n\n      if (!scopes?.pageInfo.hasNextPage) {\n        break;\n      } else {\n        args.after = scopes.pageInfo.endCursor;\n      }\n    }\n  }\n}\n\nexport async function connect(\n  tajURL: string,\n  token: string | null,\n  srtoken: string,\n  clientName: string = \"api\"\n): Promise<Conn> {\n  const tajriba = await Tajriba.createAndAwait(tajURL);\n  tajriba.useHTTP = true;\n\n  if (!token) {\n    token = await tajriba.registerService(clientName, srtoken);\n  }\n\n  return new Conn(await tajriba.sessionAdmin(token));\n}\n\ninterface AttributeEdge {\n  __typename: \"Attribute\";\n  id: string;\n  createdAt: any;\n  private: boolean;\n  protected: boolean;\n  immutable: boolean;\n  ephemeral: boolean;\n  deletedAt?: any;\n  key: string;\n  val?: string | null | undefined;\n  index?: number | null | undefined;\n  current: boolean;\n  version: number;\n  vector: boolean;\n  createdBy:\n    | {\n        __typename: \"Participant\";\n        id: string;\n        identifier: string;\n        createdAt: any;\n      }\n    | {\n        __typename: \"Service\";\n        id: string;\n        name: string;\n        createdAt: any;\n      }\n    | {\n        __typename: \"User\";\n        id: string;\n        username: string;\n        name: string;\n        createdAt: any;\n      };\n  node:\n    | {\n        __typename: \"Attribute\";\n        id: string;\n      }\n    | {\n        __typename: \"Group\";\n        id: string;\n      }\n    | {\n        __typename: \"Link\";\n        id: string;\n      }\n    | {\n        __typename: \"Participant\";\n        id: string;\n      }\n    | {\n        __typename: \"Scope\";\n        kind?: string | null | undefined;\n        name?: string | null | undefined;\n        id: string;\n      }\n    | {\n        __typename: \"Step\";\n        id: string;\n      }\n    | {\n        __typename: \"Transition\";\n        id: string;\n      }\n    | {\n        __typename: \"User\";\n        id: string;\n      };\n}\n\ninterface ScopeEdge {\n  id: string;\n  name?: string | null | undefined;\n  kind?: string | null | undefined;\n  createdBy:\n    | {\n        __typename: \"Participant\";\n        id: string;\n        identifier: string;\n        createdAt: any;\n      }\n    | {\n        __typename: \"Service\";\n        id: string;\n        name: string;\n        createdAt: any;\n      }\n    | {\n        __typename: \"User\";\n        id: string;\n        username: string;\n        name: string;\n        createdAt: any;\n      };\n  attributes: {\n    __typename: \"AttributeConnection\";\n    totalCount: number;\n    pageInfo: {\n      __typename: \"PageInfo\";\n      hasNextPage: boolean;\n      hasPreviousPage: boolean;\n      startCursor?: any;\n      endCursor?: any;\n    };\n    edges: {\n      __typename: \"AttributeEdge\";\n      cursor: any;\n      node: AttributeEdge;\n    }[];\n  };\n}\n","import archiver, { Archiver } from \"archiver\";\nimport fs from \"fs\";\nimport { Readable } from \"stream\";\nimport { promiseHandle } from \"../../promises\";\nimport { Conn, Scope } from \"../api/api\";\nimport { humanBytes } from \"./bytes\";\n\nexport const BOM = \"\\uFEFF\";\n\nexport async function exportCSV(conn: Conn, output: string) {\n  const archive = archiver(\"zip\");\n  const stream = fs.createWriteStream(output);\n\n  const prom = promiseHandle();\n  stream.on(\"close\", function () {\n    console.info(\n      \"Finalizing archive (\" + humanBytes(archive.pointer(), true, 2) + \")\"\n    );\n    prom.result();\n  });\n\n  archive.on(\"warning\", function (err) {\n    console.warn(err);\n  });\n\n  archive.on(\"error\", function (err) {\n    console.error(err);\n    throw err;\n  });\n\n  // pipe archive data to the file\n  archive.pipe(stream);\n\n  const a = archive;\n  await processType(a, \"batches\", conn.batches.bind(conn));\n  await processType(a, \"games\", conn.games.bind(conn));\n  await processType(a, \"playerGames\", conn.playerGames.bind(conn));\n  await processType(a, \"rounds\", conn.rounds.bind(conn));\n  await processType(a, \"playerRounds\", conn.playerRounds.bind(conn));\n  await processType(a, \"stages\", conn.stages.bind(conn));\n  await processType(a, \"playerStages\", conn.playerStages.bind(conn));\n  await processType(a, \"players\", conn.players.bind(conn));\n\n  archive.finalize();\n\n  await prom.promise;\n}\n\nconst changedAtSuffix = \"LastChangedAt\";\n\ntype Attr = {\n  isArray: boolean;\n  value: string;\n  values: any[];\n  createdAt: string;\n};\n\nasync function processType<T extends Scope>(\n  archive: Archiver,\n  fileName: string,\n  it: () => AsyncGenerator<T, void, unknown>\n) {\n  console.info(\"Processing\", fileName);\n  const file = newFile(archive, fileName, \"csv\");\n\n  const keys = new Set<string>();\n  const cols = new Set<string>();\n  for await (const record of it()) {\n    for (const attr of record.attributes) {\n      keys.add(attr.key);\n      cols.add(attr.key);\n      cols.add(attr.key + changedAtSuffix);\n    }\n  }\n\n  const keyArr = Array.from(keys.values());\n  keyArr.unshift(\"id\");\n\n  const colsArr = Array.from(cols.values());\n  colsArr.unshift(\"id\");\n\n  file.push(encodeCells(colsArr));\n\n  let counter = 0;\n  for await (const record of it()) {\n    counter++;\n\n    const attrMap = new Map<string, Attr>();\n\n    for (const attr of record.attributes) {\n      const { key, value, createdAt, vector, index } = attr;\n\n      if (vector && index === undefined) {\n        console.error(`Vector attribute ${key} has no index on ${record.id}`);\n\n        continue;\n      }\n\n      let existing = attrMap.get(key);\n      if (!existing) {\n        existing = {\n          isArray: vector,\n          value: \"\",\n          values: [],\n          createdAt,\n        };\n\n        attrMap.set(key, existing);\n      } else if (!vector) {\n        console.error(`Duplicate attribute ${key} on ${record.id}`);\n\n        continue;\n      }\n\n      if (vector) {\n        if (!existing.isArray) {\n          console.error(`Mixed vector/scalar attribute ${key} on ${record.id}`);\n\n          continue;\n        }\n\n        if (existing.values[index!] !== undefined) {\n          console.error(\n            `Duplicate vector attribute ${key} index ${index} on ${record.id}`\n          );\n        }\n\n        existing.values[index!] = value;\n\n        if (existing.createdAt < createdAt) {\n          existing.createdAt = createdAt;\n        }\n      } else {\n        existing.value = cast(value);\n      }\n    }\n\n    const line: (string | undefined)[] = [];\n    for (const key of keyArr) {\n      if (key === \"id\") {\n        line.push(record.id);\n        continue;\n      }\n\n      const attr = attrMap.get(key);\n\n      if (attr) {\n        if (attr.isArray) {\n          line.push(cast(attr.values));\n        } else {\n          line.push(attr.value);\n        }\n\n        line.push(attr.createdAt);\n      } else {\n        line.push(undefined);\n        line.push(undefined);\n      }\n    }\n\n    file.push(encodeCells(line));\n  }\n  console.info(` -> ${counter} ${counter === 1 ? \"record\" : \"records\"} found.`);\n\n  file.push(null);\n}\n\nclass FileReadable extends Readable {\n  _read() {}\n}\n\nfunction newFile(archive: Archiver, name: string, extension: string) {\n  const file = new FileReadable({});\n  archive.append(file, { name: `${name}.${extension}` });\n  file.push(BOM);\n  return file;\n}\n\nexport const quoteMark = '\"';\nexport const doubleQuoteMark = '\"\"';\nexport const quoteRegex = /\"/g;\n\nexport const encodeCells = (line: any[]) => {\n  const row = line.slice(0);\n\n  for (var i = 0, len = row.length; i < len; i++) {\n    if (row[i] === undefined) {\n      row[i] = \"\";\n      continue;\n    }\n\n    const shouldQuote =\n      row[i].indexOf(\",\") !== -1 || // Contains a comma\n      row[i].indexOf(\"\\r\\n\") !== -1 || // Contains a CRLF\n      row[i].indexOf(quoteMark) !== -1; // Contains a quote mark\n\n    row[i] = row[i].replace(quoteRegex, doubleQuoteMark);\n\n    if (shouldQuote) {\n      row[i] = quoteMark + row[i] + quoteMark;\n    }\n  }\n\n  return row.join(\",\") + \"\\r\\n\";\n};\n\nconst cast = (out: any): string => {\n  if (Array.isArray(out)) {\n    return JSON.stringify(out);\n  } else if (out instanceof Date) {\n    return out.toISOString();\n  } else if (typeof out === \"object\" && out !== null) {\n    return JSON.stringify(out);\n  } else if (typeof out === \"string\") {\n    return out.replace(/\\n/g, \"\\\\n\");\n  } else if (out === false || out === 0) {\n    return out.toString();\n  } else {\n    return (out || \"\").toString();\n  }\n};\n","import { z } from \"zod\";\nimport { ListenersCollector } from \"../events\";\nimport { ClassicKinds, Context } from \"./models\";\n\nconst string = z.string();\n\n/** ClassicLoader loads. */\nexport function ClassicLoader(\n  /** This is the listener */\n  _: ListenersCollector<Context, ClassicKinds>\n) {\n  _.on(\"start\", function (ctx) {\n    ctx.participantsSub();\n    ctx.scopeSub({ kinds: [\"batch\", \"player\"] });\n  });\n\n  _.on(\"batch\", \"status\", function (ctx, { batch, status }) {\n    if ([\"running\", \"created\"].includes(status)) {\n      ctx.scopeSub({\n        kvs: [{ key: \"batchID\", val: JSON.stringify(batch.id) }],\n      });\n    }\n  });\n\n  _.on(\"stage\", \"timerID\", function (ctx, { timerID }) {\n    ctx.transitionsSub(string.parse(timerID));\n  });\n}\n","import { AddStepInput, State, Step, Transition } from \"@empirica/tajriba\";\nimport { z } from \"zod\";\nimport { debug, error, trace } from \"../../utils/console\";\nimport { StepPayload } from \"../context\";\nimport { EventContext, ListenersCollector, TajribaEvent } from \"../events\";\nimport { ClassicKinds, Context, Game, Player } from \"./models\";\n\nconst nanosecond = 1;\nconst microsecond = 1000 * nanosecond;\nconst millisecond = 1000 * microsecond;\nconst second = 1000 * millisecond;\n\nconst lobbyTimerKey = \"lobbyTimerID\";\nconst individualTimerGameKey = \"lobbyTimerGameID\";\n// const individualTimerExtensionsKey = \"lobbyTimerExtensionsForGameID\";\n\nexport type LobbyConfig = {};\n\nexport function Lobby(_: LobbyConfig = {}) {\n  return function (_: ListenersCollector<Context, ClassicKinds>) {\n    _.on(\"player\", \"introDone\", async (ctx, { player }: { player: Player }) => {\n      const game = player.currentGame;\n      if (!game) {\n        return;\n      }\n\n      switch (game.lobbyConfig.kind) {\n        case \"shared\":\n          await setupSharedLobbyTimeout(ctx, game);\n\n          break;\n        case \"individual\":\n          await setupIndividualLobbyTimeout(ctx, game, player);\n\n          break;\n      }\n    });\n\n    const string = z.string();\n\n    _.on(\"game\", lobbyTimerKey, function (ctx, params) {\n      ctx.transitionsSub(string.parse(params[lobbyTimerKey]));\n    });\n\n    _.on(\"player\", lobbyTimerKey, function (ctx, params) {\n      ctx.transitionsSub(string.parse(params[lobbyTimerKey]));\n    });\n\n    type TransitionAdd = { step: Step; transition: Transition };\n    _.on(\n      TajribaEvent.TransitionAdd,\n      (ctx, { step, transition: { from, to } }: TransitionAdd) => {\n        debug(\"lobby: lobby transition check\");\n        if (from !== State.Running || to !== State.Ended) {\n          return;\n        }\n\n        expiredSharedLobbyTimeout(ctx, step);\n        expiredIndividualLobbyTimeout(ctx, step);\n      }\n    );\n  };\n}\n\n//\n// Individual lobby timer\n//\n\nasync function setupIndividualLobbyTimeout(\n  ctx: EventContext<Context, ClassicKinds>,\n  game: Game,\n  player: Player\n) {\n  // We check both whether there is a timer and if it was set for the current\n  // game. If the player switches games, the old timer should be ignored.\n  if (\n    player.get(lobbyTimerKey) &&\n    player.get(individualTimerGameKey) === game.id\n  ) {\n    trace(\"lobby: individual timer already set\", game.lobbyConfig);\n\n    return;\n  }\n\n  const stepID = await getTimer(ctx, game.lobbyConfig.duration);\n  if (!stepID) {\n    error(\"lobby: timer not created\");\n\n    return;\n  }\n\n  player.set(lobbyTimerKey, stepID);\n  player.set(individualTimerGameKey, game.id);\n\n  ctx\n    .addTransitions([\n      {\n        from: State.Created,\n        to: State.Running,\n        nodeID: stepID,\n        cause: \"individual lobby timer start\",\n      },\n    ])\n    .catch((err) => {\n      error(`individual lobby timer start: ${err}`);\n    })\n    .then(() => {\n      trace(`individual lobby timer start, transitioned`);\n    });\n}\n\nasync function expiredIndividualLobbyTimeout(\n  ctx: EventContext<Context, ClassicKinds>,\n  step: Step\n) {\n  const players = ctx.scopesByKindMatching<Player>(\n    \"player\",\n    lobbyTimerKey,\n    step.id\n  );\n\n  if (!players.length) {\n    return;\n  }\n\n  const player = players[0]!;\n  const game = player.currentGame;\n\n  if (\n    !game ||\n    game.hasStarted ||\n    player.get(individualTimerGameKey) !== game.id\n  ) {\n    return;\n  }\n\n  // For now, no extensions, so always exit after player timeout.\n  player.exit(\"lobby timed out\");\n\n  // if (!game.lobbyConfig.extensions || game.lobbyConfig.extensions === 0) {\n  //   player.exit(\"lobby timed out\");\n\n  //   return;\n  // }\n\n  // const extensionsKey = `${individualTimerExtensionsKey}-${game.id}`;\n  // const extensions = (player.get(extensionsKey) as number) || 0;\n\n  // if (extensions >= game.lobbyConfig.extensions) {\n  //   player.set(\"ended\", \"individual lobby timeout\");\n\n  //   return;\n  // }\n\n  // // Clear previous timeout\n  // player.set(lobbyTimerKey, null);\n\n  // player.set(extensionsKey, extensions + 1);\n\n  // setupIndividualLobbyTimeout(ctx, game, player);\n}\n\n//\n// Shared lobby timer\n//\n\nasync function setupSharedLobbyTimeout(\n  ctx: EventContext<Context, ClassicKinds>,\n  game: Game\n) {\n  if (game.get(lobbyTimerKey)) {\n    trace(\"lobby: lobby already exists\", game.lobbyConfig);\n\n    return;\n  }\n\n  const stepID = await getTimer(ctx, game.lobbyConfig.duration);\n  if (!stepID) {\n    error(\"lobby: timer not created\");\n\n    return;\n  }\n\n  debug(\"lobby: lobby created\", stepID);\n  game.set(lobbyTimerKey, stepID);\n\n  await ctx\n    .addTransitions([\n      {\n        from: State.Created,\n        to: State.Running,\n        nodeID: stepID,\n        cause: \"shared lobby timer start\",\n      },\n    ])\n    .catch((err) => {\n      debug(`shared lobby timer start: ${err}`);\n    })\n    .then(() => {\n      trace(`shared lobby timer start, transitioned`);\n    });\n}\n\nasync function expiredSharedLobbyTimeout(\n  ctx: EventContext<Context, ClassicKinds>,\n  step: Step\n) {\n  const games = ctx.scopesByKindMatching<Game>(\"game\", lobbyTimerKey, step.id);\n\n  if (!games.length) {\n    debug(\"lobby: game for lobby not found\");\n\n    return;\n  }\n\n  const game = games[0]!;\n  debug(\"lobby: lobby for game\", game.id);\n\n  if (game.hasStarted) {\n    debug(\"lobby: game for lobby started\");\n\n    return;\n  }\n\n  const readyPlayers = game.players.filter((p) => p.get(\"introDone\"));\n  if (readyPlayers.length === 0) {\n    game.set(lobbyTimerKey, null);\n\n    return;\n  }\n\n  switch (game.lobbyConfig.strategy) {\n    case \"fail\":\n      debug(\"lobby: failing game\");\n      game.end(\"failed\", \"shared lobby timeout\");\n\n      break;\n    case \"ignore\":\n      debug(\"lobby: starting game\");\n\n      for (const player of game.players) {\n        if (!player.get(\"introDone\")) {\n          player.exit(\"lobby timed out before reached intro\");\n        }\n      }\n\n      game.start();\n\n      break;\n  }\n}\n\ninterface stepper {\n  addSteps: (input: AddStepInput[]) => Promise<StepPayload[]>;\n}\n\nasync function getTimer(ctx: stepper, duration: number) {\n  try {\n    const dur = duration / second;\n    debug(\"lobby: creating lobby timeout for\", dur, \"seconds\");\n    const steps = await ctx.addSteps([{ duration: dur }]);\n    return steps[0]?.id;\n  } catch (err) {\n    return;\n  }\n}\n","import { EventContext, ListenersCollector } from \"../events\";\nimport { ClassicKinds, Context, Game, Round, Stage } from \"./models\";\n\n/** Collects event listeners. */\nexport class ClassicListenersCollector extends ListenersCollector<\n  Context,\n  ClassicKinds\n> {\n  /**\n   * onGameStart is triggered just before the game start. It is a great place to\n   * create rounds and stages and initialize values on the game, the players,\n   * the rounds, and the stages.\n   *\n   * Players are accessible on the game, `game.players`.\n   * You can add Rounds to a Game with `game.addRound({ some: \"attribute\" })`.\n   * `game.AddRound` returns a Round object. On the Round object, you can create\n   * Stages: `round.addStage({ some: \"value\" })`.\n   *\n   * @example\n   * ```js\n   * const round = game.addRound({\n   *   name: \"Round 1 - Jelly Beans\",\n   *   task: \"jellybeans\",\n   * });\n   * round.addStage({ name: \"Answer\", duration: 300 });\n   * round.addStage({ name: \"Result\", duration: 120 });\n   *\n   * game.players.forEach((player) => player.set(\"score\", 0));\n   * ```\n   * */\n  onGameStart(cb: (props: { game: Game }) => void) {\n    this.unique.on(\n      \"game\",\n      \"start\",\n      (\n        _: EventContext<Context, ClassicKinds>,\n        { game, start }: { game: Game; start: boolean }\n      ) => {\n        if (!start) return;\n        cb({ game });\n      }\n    );\n  }\n\n  onRoundStart(cb: (props: { round: Round }) => void) {\n    this.unique.on(\n      \"round\",\n      \"start\",\n      (\n        _: EventContext<Context, ClassicKinds>,\n        { round, start }: { round: Round; start: boolean }\n      ) => {\n        if (!start) return;\n        cb({ round });\n      }\n    );\n  }\n\n  onStageStart(cb: (props: { stage: Stage }) => void) {\n    this.unique.on(\n      \"stage\",\n      \"start\",\n      (\n        _: EventContext<Context, ClassicKinds>,\n        { stage, start }: { stage: Stage; start: boolean }\n      ) => {\n        if (!start) return;\n        cb({ stage });\n      }\n    );\n  }\n\n  onStageEnded(cb: (props: { stage: Stage }) => void) {\n    this.unique.on(\n      \"stage\",\n      \"ended\",\n      (\n        _: EventContext<Context, ClassicKinds>,\n        { stage, ended }: { stage: Stage; ended: boolean }\n      ) => {\n        if (!ended) return;\n        cb({ stage });\n      }\n    );\n  }\n\n  onRoundEnded(cb: (props: { round: Round }) => void) {\n    this.unique.on(\n      \"round\",\n      \"ended\",\n      (\n        _: EventContext<Context, ClassicKinds>,\n        { round, ended }: { round: Round; ended: boolean }\n      ) => {\n        if (!ended) return;\n        cb({ round });\n      }\n    );\n  }\n\n  onGameEnded(cb: (props: { game: Game }) => void) {\n    this.unique.on(\n      \"game\",\n      \"ended\",\n      (\n        _: EventContext<Context, ClassicKinds>,\n        { game, ended }: { game: Game; ended: boolean }\n      ) => {\n        if (!ended) return;\n        cb({ game });\n      }\n    );\n  }\n}\n","import {\n  ChangePayload,\n  ParticipantChange,\n  SetAttributeInput,\n  SubAttributesPayload,\n} from \"@empirica/tajriba\";\nimport { Observable, Subject, groupBy } from \"rxjs\";\nimport { AttributeChange, AttributeUpdate } from \"../shared/attributes\";\nimport { ScopeIdent, ScopeUpdate } from \"../shared/scopes\";\nimport { trace } from \"../utils/console\";\nimport { StepChange, StepUpdate } from \"./steps\";\n\nexport interface ParticipantUpdate {\n  participant: ParticipantChange;\n  removed: boolean;\n}\n\nexport class TajribaProvider {\n  public scopes = new Subject<ScopeUpdate>();\n  public attributes = new Subject<AttributeUpdate>();\n  public participants = new Subject<ParticipantUpdate>();\n  public steps = new Subject<StepUpdate>();\n  public dones = new Subject<string[]>();\n\n  constructor(\n    changes: Observable<ChangePayload>,\n    readonly globals: Observable<SubAttributesPayload>,\n    readonly setAttributes: (input: SetAttributeInput[]) => Promise<any>\n  ) {\n    let scopeIDs: string[] = [];\n    changes.pipe(groupBy((chg) => chg?.change?.__typename)).subscribe({\n      next: (group) => {\n        switch (group.key) {\n          case \"ScopeChange\":\n            group.subscribe({\n              next: (msg) => {\n                if (\n                  !msg.change ||\n                  msg.removed === null ||\n                  msg.removed === undefined\n                ) {\n                  trace(\"AttributeChange empty\");\n                } else {\n                  this.scopes.next({\n                    scope: <ScopeIdent>msg.change,\n                    removed: msg.removed,\n                  });\n                }\n\n                if (msg.done) {\n                  this.dones.next(scopeIDs);\n                }\n              },\n            });\n\n            break;\n          case \"AttributeChange\":\n            group.subscribe({\n              next: (msg) => {\n                if (\n                  !msg.change ||\n                  msg.removed === null ||\n                  msg.removed === undefined\n                ) {\n                  trace(\"AttributeChange empty\");\n                } else {\n                  const atChange = <AttributeChange>msg.change;\n                  scopeIDs.push(atChange.nodeID || atChange.node!.id);\n                  this.attributes.next({\n                    attribute: atChange,\n                    removed: msg.removed,\n                  });\n                }\n\n                if (msg.done) {\n                  this.dones.next(scopeIDs);\n                  scopeIDs = [];\n                }\n              },\n            });\n\n            break;\n          case \"ParticipantChange\":\n            group.subscribe({\n              next: (msg) => {\n                if (\n                  !msg.change ||\n                  msg.removed === null ||\n                  msg.removed === undefined\n                ) {\n                  trace(\"ParticipantChange empty\");\n                } else {\n                  this.participants.next({\n                    participant: <ParticipantChange>msg.change,\n                    removed: msg.removed,\n                  });\n                }\n\n                if (msg.done) {\n                  this.dones.next([]);\n                }\n              },\n            });\n\n            break;\n          case \"StepChange\":\n            group.subscribe({\n              next: (msg) => {\n                if (\n                  !msg.change ||\n                  msg.removed === null ||\n                  msg.removed === undefined\n                ) {\n                  trace(\"StepChange empty\");\n                } else {\n                  this.steps.next({\n                    step: <StepChange>msg.change,\n                    removed: msg.removed,\n                  });\n                }\n\n                if (msg.done) {\n                  this.dones.next([]);\n                }\n              },\n            });\n\n            break;\n          default:\n            group.subscribe({\n              next: (change) => {\n                if (change.done) {\n                  this.dones.next([]);\n                }\n              },\n            });\n\n            break;\n        }\n      },\n    });\n  }\n}\n","import { Observable } from \"rxjs\";\nimport { Attributes } from \"../shared/attributes\";\nimport {\n  Scope as SharedScope,\n  ScopeConstructor,\n  ScopeIdent,\n  Scopes as SharedScopes,\n  ScopeUpdate,\n} from \"../shared/scopes\";\nimport { Steps } from \"./steps\";\n\nexport class Scopes<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> extends SharedScopes<Context, Kinds, Scope<Context, Kinds>> {\n  constructor(\n    scopesObs: Observable<ScopeUpdate>,\n    donesObs: Observable<string[]>,\n    ctx: Context,\n    kinds: Kinds,\n    attributes: Attributes,\n    private steps: Steps\n  ) {\n    super(scopesObs, donesObs, ctx, kinds, attributes);\n  }\n\n  protected create(\n    scopeClass: ScopeConstructor<Context, Kinds>,\n    scope: ScopeIdent\n  ) {\n    return new scopeClass!(\n      this.ctx,\n      scope,\n      this,\n      this.attributes,\n      this.steps\n    ) as Scope<Context, Kinds>;\n  }\n}\n\nexport class Scope<\n  Context,\n  Kinds extends { [key: string]: ScopeConstructor<Context, Kinds> }\n> extends SharedScope<Context, Kinds> {\n  constructor(\n    ctx: Context,\n    scope: ScopeIdent,\n    readonly scopes: Scopes<Context, Kinds>,\n    attributes: Attributes,\n    private steps: Steps\n  ) {\n    super(ctx, scope, attributes);\n  }\n\n  scopeByKey(key: string) {\n    const id = this.get(key);\n    if (!id || typeof id !== \"string\") {\n      return;\n    }\n\n    return this.scopes.scope(id);\n  }\n\n  protected ticker(id: string) {\n    return this.steps.step(id);\n  }\n\n  protected tickerByKey(key: string) {\n    const id = this.get(key);\n    if (!id || typeof id !== \"string\") {\n      return;\n    }\n\n    return this.ticker(id);\n  }\n}\n","import { BehaviorSubject, map, Observable } from \"rxjs\";\n\nexport interface StepChange {\n  id: string;\n  running: boolean;\n  elapsed?: number;\n  remaining?: number;\n}\n\nexport interface StepUpdate {\n  step: StepChange;\n  removed: boolean;\n}\n\nexport interface StepTick {\n  started: boolean;\n  ended: boolean;\n  elapsed: number;\n  remaining: number;\n  duration: number;\n}\n\ntype schds = {\n  cb: (args: void) => void;\n  from: number;\n  dur: number;\n};\n\nlet scheduled: schds[] = [];\n\nexport let mockNow: number | null = null;\nexport function setNow(now: number) {\n  if (mockNow && mockNow > now) {\n    if (now === 0) {\n      // This is a reset scheduled should be empty\n      scheduled = [];\n      /* c8 ignore next 3 */\n    } else {\n      throw \"time must move forward\";\n    }\n  }\n\n  mockNow = now;\n\n  const rescheduled: schds[] = [];\n  for (const s of scheduled) {\n    if (mockNow >= s.from + s.dur) {\n      s.cb();\n    } else {\n      rescheduled.push(s);\n    }\n  }\n\n  scheduled = rescheduled;\n}\n\nfunction pnow() {\n  if (mockNow !== null) {\n    return mockNow;\n  } else {\n    // TODO sync time\n    return performance.now();\n  }\n}\n\nfunction timeout(callback: (args: void) => void, ms: number) {\n  if (mockNow !== null) {\n    const schd = {\n      cb: callback,\n      from: mockNow,\n      dur: ms,\n    };\n    scheduled.push(schd);\n  } else {\n    setTimeout(callback, ms);\n  }\n}\n\n// The number of milliseconds elapsed since January 1, 1970 00:00:00 UTC, with\n// leap seconds ignored.\nexport type Epoch = number;\n\nexport class Step {\n  private running = false;\n  private ticker = new BehaviorSubject<StepTick | undefined>(undefined);\n  private startAt: number = 0;\n  private endAt: number = 0;\n\n  constructor(step: StepChange, ticker: Observable<DOMHighResTimeStamp>) {\n    ticker.pipe(map(this.recalc.bind(this))).subscribe({\n      next: (val) => {\n        this.ticker.next(val);\n      },\n    });\n\n    this._update(step);\n  }\n\n  private recalc(t: DOMHighResTimeStamp) {\n    if (!this.running) {\n      return undefined;\n    }\n\n    return {\n      started: t >= this.startAt,\n      ended: t >= this.endAt,\n      elapsed: Math.round(t - this.startAt),\n      remaining: Math.round(this.endAt - t),\n      duration: this.endAt - this.startAt,\n    } as StepTick;\n  }\n\n  obs(): Observable<StepTick | undefined> {\n    return this.ticker;\n  }\n\n  get current() {\n    return this.recalc(pnow());\n  }\n\n  // internal only\n  _update(step: StepChange) {\n    if (!step.running) {\n      this.running = false;\n      this.ticker.next(undefined);\n\n      return;\n    }\n\n    if (\n      step.elapsed === null ||\n      step.remaining === null ||\n      step.elapsed === undefined ||\n      step.remaining === undefined\n    ) {\n      this.running = false;\n\n      return;\n    }\n\n    const now = pnow();\n\n    this.startAt = now - step.elapsed * 1000;\n    this.endAt = now + step.remaining * 1000;\n    this.running = step.elapsed >= 0 && step.remaining >= 0;\n\n    this.ticker.next(this.recalc(now));\n  }\n\n  // internal only\n  _stop() {\n    this.running = false;\n    this.ticker.next(undefined);\n  }\n}\n\nexport class Steps {\n  private steps = new Map<string, Step>();\n  private updates = new Map<string, StepChange | boolean>();\n  private _hadUpdates = false;\n\n  private ticker: BehaviorSubject<Epoch>;\n\n  constructor(stepsObs: Observable<StepUpdate>, donesObs: Observable<void>) {\n    stepsObs.subscribe({\n      next: ({ step, removed }) => {\n        this.update(step, removed);\n      },\n    });\n\n    donesObs.subscribe({\n      next: () => {\n        this.next();\n      },\n    });\n\n    this.ticker = new BehaviorSubject<Epoch>(Math.floor(pnow()));\n    const controller = new AbortController();\n    timerInterval(1000, controller.signal, (t) => {\n      this.ticker.next(t);\n    });\n  }\n\n  step(stepID: string): Step | undefined {\n    return this.steps.get(stepID);\n  }\n\n  hadUpdates() {\n    const hadUpdates = this._hadUpdates;\n    this._hadUpdates = false;\n\n    return hadUpdates;\n  }\n\n  private update(step: StepChange, removed: boolean) {\n    if (removed) {\n      this.updates.set(step.id, true);\n    } else {\n      this.updates.set(step.id, step);\n    }\n\n    this._hadUpdates = true;\n  }\n\n  private next() {\n    for (const [id, stepOrDel] of this.updates) {\n      let step = this.steps.get(id);\n      if (typeof stepOrDel === \"boolean\") {\n        if (step) {\n          step._stop();\n          this.steps.delete(id);\n        }\n      } else {\n        if (!step) {\n          step = new Step(stepOrDel, this.ticker);\n          this.steps.set(id, step);\n        }\n\n        step._update(stepOrDel);\n      }\n    }\n\n    this.updates.clear();\n  }\n}\n\n/* c8 ignore next 6 */\nexport const root: any =\n  typeof self === \"object\" && self.self == self\n    ? self\n    : typeof global === \"object\" && global.global == global\n    ? global\n    : {};\n\n// nodejs support\nif (!root[\"requestAnimationFrame\"]) {\n  type timecb = (t: DOMHighResTimeStamp) => void;\n  root[\"requestAnimationFrame\"] = (cb: timecb) => cb(pnow());\n}\n\n// Inspiration:\n// https://www.youtube.com/watch?v=MCi6AZMkxcU\n// https://gist.github.com/jakearchibald/cb03f15670817001b1157e62a076fe95\nfunction timerInterval(\n  ms: number = 1000,\n  signal: AbortSignal,\n  callback: (time: number) => void\n) {\n  // Performance should be available in Nodejs 10+.\n  // Get the last rounded second, which will go negative, but that's fine, since\n  // it will immediately send out its first tick, then be on the second.\n  const start = Math.floor(pnow() / 1000) * 1000;\n\n  function frame(time: number) {\n    /* c8 ignore next */\n    if (signal.aborted) return;\n    callback(time);\n    scheduleFrame(time);\n  }\n\n  function scheduleFrame(time: number) {\n    const elapsed = time - start;\n    const roundedElapsed = Math.round(elapsed / ms) * ms;\n    const targetNext = start + roundedElapsed + ms;\n    const delay = targetNext - pnow();\n    timeout(() => requestAnimationFrame(frame), delay);\n  }\n\n  scheduleFrame(start);\n}\n\n// export function useAnimationInterval(\n//   ms: number,\n//   callback: (time: number) => void\n// ) {\n//   const callbackRef = React.useRef(callback);\n//   React.useEffect(() => {\n//     callbackRef.current = callback;\n//   }, [callback]);\n\n//   React.useEffect(() => {\n//     const controller = new AbortController();\n//     animationInterval(ms, controller.signal, callbackRef.current);\n//     return () => controller.abort();\n//   }, [ms]);\n// }\n","export const isDevelopment = process.env.NODE_ENV === \"development\";\nexport const isProduction = process.env.NODE_ENV === \"production\";\nexport const isTest = process.env.NODE_ENV === \"test\";\n\nexport const createNewParticipant = (key = \"participantKey\") => {\n  const url = new URL(document.location.href);\n  url.searchParams.set(key, new Date().getTime().toString());\n  window.open(url.href, \"_blank\")?.focus();\n};\n","import { BehaviorSubject, Observable, Subject } from \"rxjs\";\nimport { Attributes } from \"../../shared/attributes\";\nimport { Globals } from \"../../shared/globals\";\nimport { Constructor } from \"../../shared/helpers\";\nimport { TajribaProvider } from \"../provider\";\nimport { Scope, Scopes } from \"../scopes\";\nimport { Steps } from \"../steps\";\n\nexport const endedStatuses = [\"ended\", \"terminated\", \"failed\"];\nexport type EndedStatuses = typeof endedStatuses[number];\n\nexport class Game extends Scope<Context, EmpiricaClassicKinds> {\n  get hasEnded() {\n    return endedStatuses.includes(this.get(\"status\") as EndedStatuses);\n  }\n\n  get stage() {\n    return this.scopeByKey(\"stageID\") as Stage | undefined;\n  }\n\n  get round() {\n    return this.stage?.round;\n  }\n}\n\nexport class Player extends Scope<Context, EmpiricaClassicKinds> {\n  get game() {\n    const { game } = this.ctx;\n    if (!game) {\n      return;\n    }\n\n    const key = `playerGameID-${game.id}`;\n    return this.scopeByKey(key) as PlayerGame | undefined;\n  }\n\n  get round() {\n    const { stage } = this.ctx;\n    if (!stage) {\n      return;\n    }\n\n    const { round } = stage;\n    if (!round) {\n      return;\n    }\n\n    const key = `playerRoundID-${round.id}`;\n    return this.scopeByKey(key) as PlayerRound | undefined;\n  }\n\n  get stage() {\n    const { stage } = this.ctx;\n    if (!stage) {\n      return;\n    }\n\n    const key = `playerStageID-${stage.id}`;\n    return this.scopeByKey(key) as PlayerStage | undefined;\n  }\n\n  hasUpdated() {\n    if (super.hasUpdated()) {\n      return true;\n    }\n\n    return Boolean(\n      this.round?.hasUpdated() ||\n        this.stage?.hasUpdated() ||\n        this.game?.hasUpdated()\n    );\n  }\n}\n\nexport class PlayerGame extends Scope<Context, EmpiricaClassicKinds> {}\n\nexport class PlayerRound extends Scope<Context, EmpiricaClassicKinds> {}\n\nexport class PlayerStage extends Scope<Context, EmpiricaClassicKinds> {}\n\nexport class Round extends Scope<Context, EmpiricaClassicKinds> {}\n\nexport class Stage extends Scope<Context, EmpiricaClassicKinds> {\n  get round() {\n    return this.scopeByKey(\"roundID\") as Round | undefined;\n  }\n\n  get timer() {\n    return this.tickerByKey(\"timerID\");\n  }\n}\n\n// TODO update context\nexport class Context {\n  public game?: Game | null;\n  public stage?: Stage | null;\n}\n\nexport type EmpiricaClassicKinds = {\n  game: Constructor<Game>;\n  player: Constructor<Player>;\n  playerGame: Constructor<PlayerGame>;\n  playerRound: Constructor<PlayerRound>;\n  playerStage: Constructor<PlayerStage>;\n  round: Constructor<Round>;\n  stage: Constructor<Stage>;\n};\n\nexport const kinds = {\n  game: Game,\n  player: Player,\n  playerGame: PlayerGame,\n  playerRound: PlayerRound,\n  playerStage: PlayerStage,\n  round: Round,\n  stage: Stage,\n};\n\nexport type EmpiricaClassicContext = {\n  game: BehaviorSubject<Game | null | undefined>;\n  player: BehaviorSubject<Player | null | undefined>;\n  players: BehaviorSubject<Player[] | undefined>;\n  round: BehaviorSubject<Round | null | undefined>;\n  stage: BehaviorSubject<Stage | null | undefined>;\n  globals: BehaviorSubject<Globals | undefined>;\n};\n\nexport function EmpiricaClassic(\n  participantID: string,\n  provider: TajribaProvider\n): EmpiricaClassicContext {\n  const attributesDones = new Subject<string[]>();\n  const scopesDones = new Subject<string[]>();\n\n  const ctx = new Context();\n  const attributes = new Attributes(\n    provider.attributes,\n    attributesDones,\n    provider.setAttributes\n  );\n  const steps = new Steps(\n    provider.steps,\n    provider.dones as unknown as Observable<void>\n  );\n  const scopes = new Scopes(\n    provider.scopes,\n    scopesDones,\n    ctx,\n    kinds,\n    attributes,\n    steps\n  );\n  const participantIDs = new Set<string>();\n\n  const glob = new Globals(provider.globals);\n\n  const ret = {\n    game: new BehaviorSubject<Game | null | undefined>(undefined),\n    player: new BehaviorSubject<Player | null | undefined>(undefined),\n    players: new BehaviorSubject<Player[] | undefined>(undefined),\n    round: new BehaviorSubject<Round | null | undefined>(undefined),\n    stage: new BehaviorSubject<Stage | null | undefined>(undefined),\n    globals: glob.self,\n  };\n\n  provider.participants.subscribe({\n    next: ({ participant, removed }) => {\n      if (removed) {\n        if (participantIDs.has(participant.id)) {\n          participantIDs.delete(participant.id);\n        }\n      } else {\n        if (!participantIDs.has(participant.id)) {\n          participantIDs.add(participant.id);\n        }\n      }\n    },\n  });\n\n  let scopesUpdated = new Set<string>();\n  provider.attributes.subscribe({\n    next: (attr) => {\n      const nodeID = attr.attribute.node?.id || attr.attribute.nodeID;\n      if (!nodeID) {\n        return;\n      }\n\n      scopesUpdated.add(nodeID);\n    },\n  });\n\n  provider.dones.subscribe({\n    next: () => {\n      const current = getCurrent(ret);\n      const updated = getMainObjects(participantID, scopes, attributes);\n      ctx.game = updated.game;\n      ctx.stage = updated.stage;\n\n      if (scopeChanged(current.game, updated.game)) {\n        ret.game.next(updated.game);\n      }\n\n      if (scopeChanged(current.player, updated.player)) {\n        ret.player.next(updated.player);\n      }\n\n      if (scopeChanged(current.round, updated.round)) {\n        ret.round.next(updated.round);\n      }\n\n      if (scopeChanged(current.stage, updated.stage) || steps.hadUpdates()) {\n        ret.stage.next(updated.stage);\n      }\n\n      let playersChanged = false;\n      const players: Player[] = [];\n      for (let i = 0; i < (updated.players || []).length; i++) {\n        let p = updated.players![i];\n\n        if (p) {\n          const partID = attributes.nextAttributeValue(\n            p.id,\n            \"participantID\"\n          ) as string;\n          if (!participantIDs.has(partID)) {\n            p = undefined;\n          }\n        }\n\n        if (!playersChanged && scopeChanged(p, (current.players || [])[i])) {\n          playersChanged = true;\n        }\n\n        if (\n          !playersChanged &&\n          scopeChanged(p?.stage, (current.players || [])[i]?.stage)\n        ) {\n          playersChanged = true;\n        }\n\n        if (\n          !playersChanged &&\n          scopeChanged(p?.round, (current.players || [])[i]?.round)\n        ) {\n          playersChanged = true;\n        }\n\n        if (\n          !playersChanged &&\n          scopeChanged(p?.game, (current.players || [])[i]?.game)\n        ) {\n          playersChanged = true;\n        }\n\n        if (p) {\n          players.push(p);\n        }\n      }\n\n      if (playersChanged) {\n        ret.players.next(players);\n      }\n\n      const scopeIDs = Array.from(scopesUpdated);\n      scopesDones.next(scopeIDs);\n      attributesDones.next(scopeIDs);\n      scopesUpdated.clear();\n    },\n  });\n\n  return ret;\n}\n\ntype mainObjects = {\n  game?: Game | null;\n  player?: Player | null;\n  round?: Round | null;\n  stage?: Stage | null;\n  players?: Player[];\n};\n\nfunction scopeChanged(\n  current?: Scope<Context, EmpiricaClassicKinds> | null,\n  updated?: Scope<Context, EmpiricaClassicKinds> | null\n): boolean {\n  if (!current && !updated) {\n    if (current === undefined && updated === null) {\n      return true;\n    }\n\n    return false;\n  }\n\n  if (!current || !updated) {\n    return true;\n  }\n\n  return current.id !== updated.id || updated.hasUpdated();\n}\n\nfunction getCurrent(ctx: EmpiricaClassicContext): mainObjects {\n  return {\n    game: ctx.game.getValue(),\n    player: ctx.player.getValue(),\n    round: ctx.round.getValue(),\n    stage: ctx.stage.getValue(),\n    players: ctx.players.getValue(),\n  };\n}\n\nfunction getMainObjects(\n  participantID: string,\n  scopes: Scopes<Context, EmpiricaClassicKinds>,\n  attributes: Attributes\n): mainObjects {\n  const players = Array.from(scopes.byKind(\"player\").values()) as Player[];\n  players.sort();\n\n  const res: mainObjects = {\n    players,\n    game: null,\n    player: null,\n    round: null,\n    stage: null,\n  };\n\n  if (players.length === 0) {\n    return res;\n  }\n\n  res.player = players.find((p) => {\n    const pID = attributes.nextAttributeValue(p.id, \"participantID\") as string;\n    return pID === participantID;\n  }) as Player;\n\n  if (!res.player) {\n    return res;\n  }\n\n  res.game = nextScopeByKey(scopes, attributes, res.player, \"gameID\") as Game;\n  if (!res.game) {\n    return res;\n  }\n\n  for (const player of players || []) {\n    const key = `playerGameID-${res.game.id}`;\n    if (!nextScopeByKey(scopes, attributes, player, key)) {\n      return res;\n    }\n  }\n\n  res.stage = nextScopeByKey(scopes, attributes, res.game, \"stageID\") as Stage;\n  if (!res.stage) {\n    return res;\n  }\n\n  for (const player of players || []) {\n    const key = `playerStageID-${res.stage.id}`;\n    if (!nextScopeByKey(scopes, attributes, player, key)) {\n      delete res.stage;\n      return res;\n    }\n  }\n\n  res.round = nextScopeByKey(scopes, attributes, res.stage, \"roundID\") as Round;\n  if (!res.round) {\n    return res;\n  }\n\n  for (const player of players || []) {\n    const key = `playerRoundID-${res.round.id}`;\n    if (!nextScopeByKey(scopes, attributes, player, key)) {\n      delete res.stage;\n      delete res.round;\n      return res;\n    }\n  }\n\n  return res;\n}\n\nfunction nextScopeByKey(\n  scopes: Scopes<Context, EmpiricaClassicKinds>,\n  attributes: Attributes,\n  scope: Scope<Context, EmpiricaClassicKinds>,\n  key: string\n) {\n  const id = attributes.nextAttributeValue(scope.id, key);\n  if (!id || typeof id !== \"string\") {\n    return null;\n  }\n\n  return scopes.scope(id) || null;\n}\n","import React from \"react\";\nimport { Consent, ConsentProps } from \"../../react/Consent\";\nimport { Finished } from \"../../react/Finished\";\nimport { Loading } from \"../../react/Loading\";\nimport { NoGames } from \"../../react/NoGames\";\nimport { PlayerCreate, PlayerCreateProps } from \"../../react/PlayerCreate\";\nimport {\n  useConsent,\n  useGlobal,\n  usePartConnected,\n  usePlayerID,\n  useTajribaConnected,\n} from \"../../react/hooks\";\nimport { Lobby as DefaultLobby } from \"./Lobby\";\nimport { Steps, StepsFunc } from \"./Steps\";\nimport { useGame, usePlayer, usePlayers, useRound, useStage } from \"./hooks\";\n\nexport interface EmpiricaContextProps {\n  children: React.ReactNode;\n  noGames?: React.ElementType;\n  consent?: React.ElementType<ConsentProps>;\n  playerCreate?: React.ElementType<PlayerCreateProps>;\n  lobby?: React.ElementType;\n  introSteps?: React.ElementType[] | StepsFunc;\n  exitSteps?: React.ElementType[] | StepsFunc;\n  finished?: React.ElementType;\n  loading?: React.ElementType;\n  connecting?: React.ElementType;\n\n  // An unmanaged game will render the children whether the game, round or stage\n  // are available or not. It is up to the developer to handle the presence of\n  // the game, round and stage. Other parts are still managed: the consent, the\n  // player creation, the intro and exit steps.\n  // This is not recommended for most games.\n  // This is useful for experiments that implement custom assignment and games\n  // that want to persist render state between rounds or stages. E.g.: keep a\n  // video chat up between stages.\n  unmanagedGame?: boolean;\n\n  // Unmanaged assignement will render the children as soon as the player is\n  // connected. It is up to the developer to handle everything after the player\n  // is connected: intro steps, lobby, game, round, stage and exit steps.\n  unmanagedAssignment?: boolean;\n\n  // Disable the consent screen. It is up to the developer to handle the consent\n  // screen.\n  disableConsent?: boolean;\n\n  // Disable the NoGames screen. It is up to the developer to handle the NoGames\n  // condition.\n  disableNoGames?: boolean;\n\n  // Disable capturing URL params (?what=hello&some=thing) onto the Player under\n  // the `urlParams` key.\n  disableURLParamsCapture?: boolean;\n}\n\nexport function EmpiricaContext({\n  noGames: NoGamesComp = NoGames,\n  consent: ConsentComp = Consent,\n  playerCreate: PlayerCreateForm = PlayerCreate,\n  introSteps = [],\n  lobby = DefaultLobby,\n  exitSteps = [],\n  finished = Finished,\n  loading: LoadingComp = Loading,\n  connecting: ConnectingComp = Loading,\n  unmanagedGame = false,\n  unmanagedAssignment = false,\n  disableConsent = false,\n  disableNoGames = false,\n  disableURLParamsCapture = false,\n  children,\n}: EmpiricaContextProps) {\n  const tajribaConnected = useTajribaConnected();\n  const participantConnected = usePartConnected();\n  const globals = useGlobal();\n  const player = usePlayer();\n  const game = useGame();\n  const [connecting, hasPlayer, onPlayerID] = usePlayerID();\n  const [consented, onConsent] = useConsent();\n\n  if (!tajribaConnected || connecting) {\n    return <ConnectingComp />;\n  }\n\n  if (player && player.get(\"ended\")) {\n    return <Exit exitSteps={exitSteps} finished={finished} />;\n  }\n\n  if (\n    !globals ||\n    (hasPlayer && (!participantConnected || !player || game === undefined))\n  ) {\n    return <LoadingComp />;\n  }\n\n  if (\n    !disableNoGames &&\n    !globals.get(\"experimentOpen\") &&\n    (!hasPlayer || !player?.get(\"gameID\"))\n  ) {\n    return <NoGamesComp />;\n  }\n\n  if (!disableConsent && !consented) {\n    return <ConsentComp onConsent={onConsent!} />;\n  }\n\n  if (!hasPlayer) {\n    return (\n      <PlayerCreateForm onPlayerID={onPlayerID!} connecting={connecting} />\n    );\n  }\n\n  if (!player || (!unmanagedGame && !game)) {\n    return <LoadingComp />;\n  }\n\n  // TODO Put in a useEffect, this is dirty.\n  if (!disableURLParamsCapture && !player.get(\"urlParams\")) {\n    const urlParams = new URLSearchParams(window.location.search);\n    player.set(\"urlParams\", Object.fromEntries(urlParams.entries()));\n  }\n\n  if (unmanagedAssignment) {\n    return <>{children}</>;\n  }\n\n  if (game && game.hasEnded) {\n    if (!player.get(\"ended\")) {\n      return <LoadingComp />;\n    }\n\n    return <Exit exitSteps={exitSteps} finished={finished} />;\n  }\n\n  return (\n    <Steps progressKey=\"intro\" doneKey=\"introDone\" steps={introSteps}>\n      <EmpiricaInnerContext\n        exitSteps={exitSteps}\n        lobby={lobby}\n        finished={finished}\n        loading={LoadingComp}\n        unmanagedGame={unmanagedGame}\n      >\n        {children}\n      </EmpiricaInnerContext>\n    </Steps>\n  );\n}\n\ninterface EmpiricaInnerContextProps {\n  children: React.ReactNode;\n  lobby: React.ElementType;\n  exitSteps: React.ElementType[] | StepsFunc;\n  finished: React.ElementType;\n  loading: React.ElementType;\n  unmanagedGame: boolean;\n}\n\nfunction EmpiricaInnerContext({\n  children,\n  lobby: Lobby,\n  finished,\n  exitSteps,\n  loading: LoadingComp,\n  unmanagedGame = false,\n}: EmpiricaInnerContextProps) {\n  const player = usePlayer();\n  const game = useGame();\n  const allReady = useAllReady();\n\n  if (!game) {\n    if (unmanagedGame) {\n      return <>{children}</>;\n    } else {\n      return <LoadingComp />;\n    }\n  }\n\n  if (!Boolean(game.get(\"status\"))) {\n    return <Lobby />;\n  }\n\n  if (game.hasEnded) {\n    if (!player?.get(\"ended\")) {\n      return <LoadingComp />;\n    }\n\n    return <Exit exitSteps={exitSteps} finished={finished} />;\n  }\n\n  if (unmanagedGame || allReady) {\n    return <>{children}</>;\n  }\n\n  return <LoadingComp />;\n}\n\nfunction Exit({\n  exitSteps,\n  finished: Finished,\n}: {\n  exitSteps: React.ElementType[] | StepsFunc;\n  finished: React.ElementType;\n}) {\n  const gameReady = useGameReady();\n\n  if (!gameReady) {\n    return <Loading />;\n  }\n\n  return (\n    <Steps progressKey=\"exitStep\" doneKey=\"exitStepDone\" steps={exitSteps}>\n      <Finished />\n    </Steps>\n  );\n}\n\nfunction useAllReady() {\n  const player = usePlayer();\n  const players = usePlayers();\n  const game = useGame();\n  const stage = useStage();\n  const round = useRound();\n\n  if (\n    !player ||\n    !players ||\n    !stage ||\n    !round ||\n    !game ||\n    !player.game ||\n    !player.round ||\n    !player.stage\n  ) {\n    return false;\n  }\n\n  const playerCount = game.get(\"actualPlayerCount\") as number | undefined;\n\n  if (playerCount !== undefined && players.length < playerCount) {\n    return false;\n  }\n\n  for (const p of players) {\n    if (!p.game || !p.round || !p.stage) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction useGameReady() {\n  const player = usePlayer();\n  const players = usePlayers();\n  const game = useGame();\n\n  // Player was never even assigned to a game, so no game.\n  if (player && !player.get(\"gameID\")) {\n    return true;\n  }\n\n  // Game never started, so no player.game.\n  if (player && game && !game.get(\"start\")) {\n    return true;\n  }\n\n  if (!player || !players || !game || !player.game) {\n    return false;\n  }\n\n  const playerCount = game.get(\"actualPlayerCount\") as number | undefined;\n\n  if (playerCount !== undefined && players.length < playerCount) {\n    return false;\n  }\n\n  for (const p of players) {\n    if (!p.game) {\n      return false;\n    }\n  }\n\n  return true;\n}\n","import React from \"react\";\n\nexport interface ConsentProps {\n  title?: string;\n  text?: string;\n  buttonText?: string;\n  onConsent: () => void;\n}\n\nconst defaultTitle = \"Do you consent to participate in this experiment?\";\n\nconst defaultText = `This experiment is part of a scientific project. Your decision\nto participate in this experiment is entirely voluntary. There\nare no known or anticipated risks to participating in this\nexperiment. There is no way for us to identify you. The only\ninformation we will have, in addition to your responses, is\nthe timestamps of your interactions with our site. The results\nof our research may be presented at scientific meetings or\npublished in scientific journals. Clicking on the \"I AGREE\"\nbutton indicates that you are at least 18 years of age, and\nagree to participate voluntary.`;\n\nconst defaultButtonText = \"I AGREE\";\n\nexport function Consent({\n  title = defaultTitle,\n  text = defaultText,\n  buttonText = defaultButtonText,\n  onConsent,\n}: ConsentProps) {\n  return (\n    <div\n      className=\"relative h-full z-10 overflow-y-auto\"\n      aria-labelledby=\"modal-title\"\n      role=\"dialog\"\n      aria-modal=\"true\"\n    >\n      <div className=\"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0\">\n        <div\n          className=\"absolute inset-0 bg-gray-500 bg-opacity-75 transition-opacity\"\n          aria-hidden=\"true\"\n        ></div>\n\n        <span\n          className=\"hidden sm:inline-block sm:align-middle sm:h-screen\"\n          aria-hidden=\"true\"\n        >\n          &#8203;\n        </span>\n\n        <div className=\"inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full sm:p-6\">\n          <div>\n            <div className=\"mx-auto flex items-center justify-center h-12 w-12 rounded-full bg-green-100\">\n              <svg\n                className=\"h-6 w-6 text-green-600\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n                fill=\"none\"\n                viewBox=\"0 0 24 24\"\n                stroke=\"currentColor\"\n                aria-hidden=\"true\"\n              >\n                <path\n                  strokeLinecap=\"round\"\n                  strokeLinejoin=\"round\"\n                  strokeWidth=\"2\"\n                  d=\"M5 13l4 4L19 7\"\n                />\n              </svg>\n            </div>\n            <div className=\"mt-3 sm:mt-5\">\n              <h3\n                className=\"text-lg text-center leading-6 font-medium text-gray-900\"\n                id=\"modal-title\"\n              >\n                {title}\n              </h3>\n              <div className=\"mt-2\">\n                <div className=\"text-sm text-gray-500 text-justify\">{text}</div>\n              </div>\n            </div>\n          </div>\n          <div className=\"mt-5 sm:mt-6\">\n            <button\n              type=\"button\"\n              className=\"inline-flex justify-center w-full rounded-md border border-transparent shadow-sm px-4 py-2 bg-empirica-600 text-base font-medium text-white hover:bg-empirica-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-empirica-500 sm:text-sm\"\n              onClick={onConsent}\n            >\n              {buttonText}\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n","import React from \"react\";\n\nexport function Finished() {\n  return (\n    <div className=\"h-full flex flex-col items-center justify-center\">\n      <h2 className=\"font-medium text-gray-700\">Finished</h2>\n      <p className=\"mt-2 text-gray-400\">Thank you for participating</p>\n    </div>\n  );\n}\n","import React from \"react\";\n\nexport function Loading() {\n  // <!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->\n  return (\n    <div className=\"h-full w-full flex items-center justify-center\">\n      <svg\n        width=\"44\"\n        height=\"44\"\n        viewBox=\"0 0 44 44\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        className=\"text-empirica-200 stroke-current\"\n      >\n        <g fill=\"none\" fillRule=\"evenodd\" strokeWidth=\"2\">\n          <circle cx=\"22\" cy=\"22\" r=\"1\">\n            <animate\n              attributeName=\"r\"\n              begin=\"0s\"\n              dur=\"1.8s\"\n              values=\"1; 20\"\n              calcMode=\"spline\"\n              keyTimes=\"0; 1\"\n              keySplines=\"0.165, 0.84, 0.44, 1\"\n              repeatCount=\"indefinite\"\n            />\n            <animate\n              attributeName=\"stroke-opacity\"\n              begin=\"0s\"\n              dur=\"1.8s\"\n              values=\"1; 0\"\n              calcMode=\"spline\"\n              keyTimes=\"0; 1\"\n              keySplines=\"0.3, 0.61, 0.355, 1\"\n              repeatCount=\"indefinite\"\n            />\n          </circle>\n          <circle cx=\"22\" cy=\"22\" r=\"1\">\n            <animate\n              attributeName=\"r\"\n              begin=\"-0.9s\"\n              dur=\"1.8s\"\n              values=\"1; 20\"\n              calcMode=\"spline\"\n              keyTimes=\"0; 1\"\n              keySplines=\"0.165, 0.84, 0.44, 1\"\n              repeatCount=\"indefinite\"\n            />\n            <animate\n              attributeName=\"stroke-opacity\"\n              begin=\"-0.9s\"\n              dur=\"1.8s\"\n              values=\"1; 0\"\n              calcMode=\"spline\"\n              keyTimes=\"0; 1\"\n              keySplines=\"0.3, 0.61, 0.355, 1\"\n              repeatCount=\"indefinite\"\n            />\n          </circle>\n        </g>\n      </svg>\n    </div>\n  );\n}\n","import React from \"react\";\nimport { isDevelopment } from \"../utils\";\n\nexport function NoGames() {\n  return (\n    <div className=\"h-screen flex items-center justify-center\">\n      <div className=\"w-92 flex flex-col items-center\">\n        <h2 className=\"text-gray-700 font-medium\">No experiments available</h2>\n        <p className=\"mt-2 text-gray-400 text-justify\">\n          There are currently no available experiments. Please wait until an\n          experiment becomes available or come back at a later date.\n        </p>\n        {isDevelopment ? (\n          <p className=\"mt-4 text-gray-700\">\n            Go to{\" \"}\n            <a\n              href=\"/admin\"\n              target=\"empirica-admin\"\n              className=\"text-empirica-500\"\n            >\n              Admin\n            </a>{\" \"}\n            to get started\n          </p>\n        ) : (\n          \"\"\n        )}\n      </div>\n    </div>\n  );\n}\n","import React, { FormEvent, useState } from \"react\";\n\nexport interface PlayerCreateProps {\n  onPlayerID: (playerID: string) => void;\n  connecting: boolean;\n}\n\nexport function PlayerCreate({ onPlayerID, connecting }: PlayerCreateProps) {\n  const [playerID, setPlayerID] = useState(\"\");\n\n  const handleSubmit = (evt: FormEvent) => {\n    evt.preventDefault();\n    if (!playerID || playerID.trim() === \"\") {\n      return;\n    }\n\n    onPlayerID(playerID);\n  };\n\n  return (\n    <div className=\"min-h-screen bg-empirica-50 flex flex-col justify-center py-12 sm:px-6 lg:px-8\">\n      <div className=\"sm:mx-auto sm:w-full sm:max-w-md\">\n        <h2 className=\"mt-6 text-center text-3xl font-extrabold text-gray-900\">\n          Enter your Player Identifier\n        </h2>\n      </div>\n\n      <div className=\"mt-8 sm:mx-auto sm:w-full sm:max-w-md\">\n        <div className=\"bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10\">\n          <form\n            className=\"space-y-6\"\n            action=\"#\"\n            method=\"POST\"\n            onSubmit={handleSubmit}\n          >\n            <fieldset disabled={connecting}>\n              <div>\n                <label\n                  htmlFor=\"email\"\n                  className=\"block text-sm font-medium text-gray-700\"\n                >\n                  Identifier\n                </label>\n                <div className=\"mt-1\">\n                  <input\n                    id=\"playerID\"\n                    name=\"playerID\"\n                    type=\"text\"\n                    autoComplete=\"off\"\n                    required\n                    autoFocus\n                    className=\"appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-empirica-500 focus:border-empirica-500 sm:text-sm\"\n                    value={playerID}\n                    onChange={(e) => setPlayerID(e.target.value)}\n                  />\n                  <p\n                    className=\"mt-2 text-sm text-gray-500\"\n                    id=\"playerID-description\"\n                  >\n                    This should be given to you. E.g. email, code...\n                  </p>\n                </div>\n              </div>\n\n              <div>\n                <button\n                  type=\"submit\"\n                  className=\"w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-empirica-600 hover:bg-empirica-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-empirica-500\"\n                >\n                  Enter\n                </button>\n              </div>\n            </fieldset>\n          </form>\n        </div>\n      </div>\n    </div>\n  );\n}\n","import { useContext, useEffect, useState } from \"react\";\nimport { Observable, merge } from \"rxjs\";\nimport { Globals } from \"../../shared/globals\";\nimport { TajribaConnection } from \"../../shared/tajriba_connection\";\nimport { Session } from \"../connection\";\nimport { ParticipantContext } from \"../context\";\nimport { ParticipantCtx } from \"./EmpiricaParticipant\";\n\nexport function useParticipantContext() {\n  return useContext(ParticipantCtx);\n}\n\nexport function useTajribaConnecting() {\n  return useTajribaCtxKey<boolean, \"connecting\">(\"connecting\");\n}\n\nexport function useTajribaConnected() {\n  return useTajribaCtxKey<boolean, \"connected\">(\"connected\");\n}\n\nexport function usePartConnecting() {\n  return usePartCtxKey<boolean, \"connecting\">(\"connecting\");\n}\n\nexport function usePartConnected() {\n  return usePartCtxKey<boolean, \"connected\">(\"connected\");\n}\n\nexport function useTajriba() {\n  const ctx = useParticipantContext();\n  return ctx?.tajriba;\n}\n\nexport function useGlobal() {\n  const ctx = usePartCtxKey<Globals, \"globals\">(\"globals\");\n  const [val, setVal] = useState<{ g: Globals | undefined }>({ g: undefined });\n\n  useEffect(() => {\n    if (!ctx || !ctx.self) {\n      return;\n    }\n\n    const sub = ctx.self.subscribe({\n      next(g) {\n        setVal({ g });\n      },\n    });\n\n    return sub.unsubscribe.bind(sub);\n  }, [ctx]);\n\n  return val.g;\n}\n\nconst defaultConsentKey = \"empirica:consent\";\n\nexport function useConsent(\n  ns: string = \"\"\n): [boolean, (() => void) | undefined] {\n  const key = `${defaultConsentKey}${ns ? `:${ns}` : \"\"}`;\n  const getConsented = () => Boolean(window.localStorage[key]);\n  const [consented, setConsented] = useState(getConsented());\n\n  function onConsent() {\n    window.localStorage[key] = true;\n    setConsented(true);\n  }\n\n  return [consented, consented ? undefined : onConsent];\n}\n\nexport function usePlayerID(): [\n  boolean,\n  string | undefined,\n  ((v: string) => void) | undefined\n] {\n  const ctx = useParticipantContext();\n  const [connecting, setConnecting] = useState<boolean>(true);\n  const [playerID, setPlayerID] = useState<string | undefined>(undefined);\n  const [changePlayerID, setChangePlayerID] = useState<\n    ((v: string) => void) | undefined\n  >(undefined);\n\n  useEffect(() => {\n    if (!ctx) {\n      return;\n    }\n\n    let _connecting = true;\n    let session: Session | undefined;\n    const sub = merge(\n      ctx.participant.connecting,\n      ctx.session.sessions\n    ).subscribe({\n      next(sessionOrConnecting) {\n        if (typeof sessionOrConnecting === \"boolean\") {\n          setConnecting(sessionOrConnecting);\n          _connecting = sessionOrConnecting;\n        } else {\n          session = sessionOrConnecting;\n        }\n\n        if (_connecting) {\n          setPlayerID(undefined);\n          setChangePlayerID(undefined);\n        } else if (!session) {\n          setPlayerID(undefined);\n          setChangePlayerID(() => async (playerIdentifier: string) => {\n            await ctx.register(playerIdentifier);\n          });\n        } else {\n          setPlayerID(session.participant.identifier);\n          setChangePlayerID(undefined);\n        }\n      },\n    });\n\n    return sub.unsubscribe.bind(sub);\n  }, [ctx]);\n\n  return [connecting, playerID, changePlayerID];\n}\n\nfunction useTajribaCtxKey<T, K extends keyof TajribaConnection>(name: K) {\n  return useCtxKey<T, TajribaConnection, K>(useTajriba, name);\n}\n\nfunction usePartCtxKey<T, K extends keyof ParticipantContext>(name: K) {\n  return useCtxKey<T, ParticipantContext, K>(useParticipantContext, name);\n}\n\nfunction useCtxKey<T, O extends {}, K extends keyof O>(\n  ctxFunc: () => O | undefined,\n  name: K\n) {\n  const ctx = ctxFunc();\n  const [val, setVal] = useState<T | undefined>(undefined);\n\n  useEffect(() => {\n    if (!ctx || !ctx[name]) {\n      return;\n    }\n\n    const obs = (<unknown>ctx[name]) as Observable<T>;\n\n    const sub = obs.subscribe({\n      next(g) {\n        setVal(g);\n      },\n    });\n\n    return sub.unsubscribe.bind(sub);\n  }, [ctx]);\n\n  return val;\n}\n","import React from \"react\";\nimport { Mode, ParticipantContext, ParticipantModeContext } from \"../context\";\nimport { WithChildren } from \"./helpers\";\n\nexport const ParticipantCtx = React.createContext<\n  ParticipantContext | undefined\n>(undefined);\n\nexport type EmpiricaParticipantProps = WithChildren<{\n  url: string;\n  ns: string;\n  modeFunc?: Mode<any>;\n}>;\n\n// We want to only initialize the connection once per namespace, so we keep\n// previously created connections.\n// TODO: cleanup old connections.\n// It's ok to just keep the previous connection for simple cases where we're\n// only using one connection, but if EmpiricaParticipant is used multiple times\n// on a page, and some are reset, we would be leaking connections.\nconst contexts: { [key: string]: ParticipantContext } = {};\n\nexport function EmpiricaParticipant({\n  url,\n  ns,\n  modeFunc,\n  children,\n}: EmpiricaParticipantProps) {\n  let partCtx: ParticipantContext;\n\n  if (ns in contexts) {\n    partCtx = contexts[ns]!;\n  } else {\n    if (modeFunc) {\n      partCtx = new ParticipantModeContext(url, ns, modeFunc);\n    } else {\n      partCtx = new ParticipantContext(url, ns);\n    }\n\n    contexts[ns] = partCtx;\n  }\n\n  return (\n    <ParticipantCtx.Provider value={partCtx}>\n      {children}\n    </ParticipantCtx.Provider>\n  );\n}\n","import { TajribaParticipant } from \"@empirica/tajriba\";\nimport { BehaviorSubject, Subject } from \"rxjs\";\nimport { subscribeAsync } from \"../admin/observables\";\nimport { Globals } from \"../shared/globals\";\nimport {\n  ErrNotConnected,\n  TajribaConnection,\n} from \"../shared/tajriba_connection\";\nimport { warn } from \"../utils/console\";\nimport { bsu } from \"../utils/object\";\nimport { ParticipantConnection, ParticipantSession } from \"./connection\";\nimport { TajribaProvider } from \"./provider\";\n\nexport class ParticipantContext {\n  /** @internal */\n  readonly tajriba: TajribaConnection;\n  /** @internal */\n  readonly participant: ParticipantConnection;\n  /** @internal */\n  readonly session: ParticipantSession;\n  /** @internal */\n  readonly resetSession: Subject<void>;\n  /** @internal */\n  readonly provider = bsu<TajribaProvider>();\n  /** @internal */\n  readonly globals = bsu<Globals>();\n\n  constructor(url: string, ns: string) {\n    this.tajriba = new TajribaConnection(url);\n    this.resetSession = new Subject<void>();\n    this.session = new ParticipantSession(ns, this.resetSession);\n    this.participant = new ParticipantConnection(\n      this.tajriba,\n      this.session.sessions,\n      this.resetSession.next.bind(this.resetSession)\n    );\n\n    subscribeAsync(this.participant.connected, async (connected) => {\n      const part = this.participant.participant.getValue();\n\n      if (connected && part) {\n        if (!this.provider.getValue()) {\n          this.provider.next(\n            new TajribaProvider(\n              part.changes(),\n              this.tajriba.tajriba.globalAttributes(),\n              part.setAttributes.bind(part)\n            )\n          );\n        }\n      } else {\n        const provider = this.provider.getValue();\n        if (provider) {\n          this.provider.next(undefined);\n        }\n      }\n    });\n\n    subscribeAsync(this.tajriba.connected, async (connected) => {\n      if (connected) {\n        this.globals.next(new Globals(this.tajriba.tajriba.globalAttributes()));\n      } else {\n        const glob = this.globals.getValue();\n        if (glob) {\n          this.globals.next(undefined);\n        }\n      }\n    });\n  }\n\n  get connecting() {\n    return this.participant.connecting;\n  }\n\n  get connected() {\n    return this.participant.connected;\n  }\n\n  async register(playerIdentifier: string) {\n    if (!this.tajriba.connected.getValue()) {\n      throw ErrNotConnected;\n    }\n\n    const [token, participant] = await this.tajriba.tajriba.registerParticipant(\n      playerIdentifier\n    );\n\n    if (!token) {\n      throw new Error(\"invalid registration\");\n    }\n\n    this.session.updateSession(token, participant);\n  }\n\n  stop() {\n    this.tajriba.stop();\n    this.participant.stop();\n  }\n}\n\nexport type Mode<T> = (participantID: string, provider: TajribaProvider) => T;\n\nexport class ParticipantMode<T> {\n  private _mode = new BehaviorSubject<T | undefined>(undefined);\n\n  constructor(\n    participant: BehaviorSubject<TajribaParticipant | undefined>,\n    provider: BehaviorSubject<TajribaProvider | undefined>,\n    modeFunc: Mode<T>\n  ) {\n    subscribeAsync(provider, async (provider) => {\n      const id = participant.getValue()?.id;\n\n      // TODO Fix! Hack. If we detect this condition, reload\n      // We are getting a new provider while we already had one. Presumably\n      // the player is gone (tajriba reset), but we're still getting a\n      // provider, while we shouldn't.\n      if (id && provider && this._mode.getValue()) {\n        warn(\"spurious provider condition\");\n        window.location.reload();\n      }\n\n      if (id && provider) {\n        this._mode.next(modeFunc(id, provider));\n      } else {\n        const mode = this._mode.getValue();\n        if (mode) {\n          this._mode.next(undefined);\n        }\n      }\n    });\n  }\n\n  get mode() {\n    return this._mode;\n  }\n}\n\nexport class ParticipantModeContext<T> extends ParticipantContext {\n  private _mode: ParticipantMode<T>;\n\n  constructor(url: string, ns: string, modeFunc: Mode<T>) {\n    super(url, ns);\n    this._mode = new ParticipantMode<T>(\n      this.participant.participant,\n      this.provider,\n      modeFunc\n    );\n  }\n\n  get mode() {\n    return this._mode.mode;\n  }\n}\n","import { ParticipantIdent, TajribaParticipant } from \"@empirica/tajriba\";\nimport { BehaviorSubject, merge, Observable, SubscriptionLike } from \"rxjs\";\nimport { subscribeAsync } from \"../admin/observables\";\nimport {\n  ErrNotConnected,\n  TajribaConnection,\n} from \"../shared/tajriba_connection\";\nimport { error } from \"../utils/console\";\nimport { bs, bsu } from \"../utils/object\";\n\nexport class ParticipantConnection {\n  private _tajribaPart = bsu<TajribaParticipant>();\n  private _connected = bs(false);\n  private _connecting = bs(false);\n  private _stopped = bs(false);\n  private _sessionsSub: SubscriptionLike;\n\n  constructor(\n    taj: TajribaConnection,\n    sessions: BehaviorSubject<Session | undefined>,\n    private resetSession: () => void\n  ) {\n    let session: Session | undefined;\n    let connected = false;\n    this._sessionsSub = subscribeAsync(\n      merge(taj.connected, sessions),\n      async (sessionOrConnected) => {\n        if (typeof sessionOrConnected === \"boolean\") {\n          connected = sessionOrConnected;\n        } else {\n          session = sessionOrConnected;\n        }\n\n        if (!session || !connected) {\n          return;\n        }\n\n        if (this._connected.getValue() || this._connecting.getValue()) {\n          return;\n        }\n\n        this._connecting.next(true);\n\n        try {\n          const tajPart = await taj.sessionParticipant(\n            session.token,\n            session.participant\n          );\n\n          this._tajribaPart.next(tajPart);\n          if (tajPart.connected) {\n            this._connected.next(true);\n            this._connecting.next(false);\n          }\n\n          tajPart.on(\"connected\", () => {\n            if (!this._connected.getValue()) {\n              this._connected.next(true);\n              this._connecting.next(false);\n            }\n          });\n          tajPart.on(\"disconnected\", () => {\n            if (this._connected.getValue()) {\n              this._connected.next(false);\n            }\n            if (this._connecting.getValue()) {\n              this._connecting.next(false);\n            }\n          });\n          tajPart.on(\"error\", (err) => {\n            error(\"connection error\", err);\n          });\n          tajPart.on(\"accessDenied\", () => {\n            if (this._connected.getValue()) {\n              this._connected.next(false);\n            }\n            if (this._connecting.getValue()) {\n              this._connecting.next(false);\n            }\n            console.log(\n              \"accessDenied\",\n              session?.participant.id,\n              session?.token\n            );\n            this.resetSession();\n          });\n        } catch (err) {\n          if (err !== ErrNotConnected) {\n            error(\"new conn error\", err);\n            this.resetSession();\n          }\n        }\n      }\n    );\n  }\n\n  stop() {\n    if (this._stopped.getValue()) {\n      return;\n    }\n\n    const taj = this._tajribaPart.getValue();\n    if (taj) {\n      taj.removeAllListeners(\"connected\");\n      taj.removeAllListeners(\"disconnected\");\n      taj.stop();\n      this._tajribaPart.next(undefined);\n    }\n\n    this._sessionsSub.unsubscribe();\n\n    this._connecting.next(false);\n    this._connected.next(false);\n    this._stopped.next(true);\n  }\n\n  get connecting() {\n    return this._connecting;\n  }\n\n  get connected() {\n    return this._connected;\n  }\n\n  get stopped() {\n    return this._stopped;\n  }\n\n  get participant() {\n    return this._tajribaPart;\n  }\n}\n\nexport interface Session {\n  token: string;\n  participant: ParticipantIdent;\n}\n\ninterface Storage {\n  clear(): void;\n  getItem(key: string): string | null;\n  removeItem(key: string): void;\n  setItem(key: string, value: string): void;\n}\n\nexport class MemStorage {\n  static vals: { [key: string]: any } = {};\n  static clear(): void {\n    this.vals = {};\n  }\n  static getItem(key: string): string | null {\n    return this.vals[key];\n  }\n  static removeItem(key: string): void {\n    delete this.vals[key];\n  }\n  static setItem(key: string, value: string): void {\n    this.vals[key] = value;\n  }\n}\n\nconst isBrowser =\n  typeof window !== \"undefined\" && typeof window.document !== \"undefined\";\n\nlet storage: Storage;\nif (isBrowser) {\n  storage = window.localStorage;\n}\n\nexport class ParticipantSession {\n  static tokenKey = \"empirica:token\";\n  static partKey = \"empirica:participant\";\n  static storage: Storage = storage;\n\n  private _sessions: BehaviorSubject<Session | undefined>;\n  private _token?: string;\n  protected _participant?: ParticipantIdent;\n\n  constructor(private ns: string, resetSession: Observable<void>) {\n    this._token = this.strg.getItem(this.tokenKey) || undefined;\n\n    const participantStr = this.strg.getItem(this.partKey) || undefined;\n\n    if (participantStr) {\n      this._participant = JSON.parse(participantStr);\n    }\n\n    const sess = this.calcSession();\n    this._sessions = bsu<Session>(sess);\n\n    resetSession.subscribe({\n      next: () => {\n        this.clearSession();\n      },\n    });\n  }\n\n  get sessions() {\n    return this._sessions;\n  }\n\n  get session() {\n    return this._sessions.getValue();\n  }\n\n  get token() {\n    return this._token;\n  }\n\n  get participant() {\n    return this._participant;\n  }\n\n  get tokenKey() {\n    return `${ParticipantSession.tokenKey}:${this.ns}`;\n  }\n\n  get partKey() {\n    return `${ParticipantSession.partKey}:${this.ns}`;\n  }\n\n  updateSession(token: string, participant: ParticipantIdent) {\n    this.strg.setItem(this.tokenKey, token);\n    this.strg.setItem(this.partKey, JSON.stringify(participant));\n    this._token = token;\n    this._participant = participant;\n    this._sessions.next(this.calcSession());\n  }\n\n  clearSession() {\n    delete this._token;\n    delete this._participant;\n    this.strg.removeItem(this.tokenKey);\n    this.strg.removeItem(this.partKey);\n    this._sessions.next(undefined);\n  }\n\n  private calcSession(): Session | undefined {\n    if (this._token && this._participant) {\n      return {\n        token: this._token,\n        participant: this._participant,\n      };\n    }\n\n    return undefined;\n  }\n\n  private get strg() {\n    return ParticipantSession.storage;\n  }\n}\n","import React from \"react\";\nimport { warn } from \"../../../utils/console\";\nimport { Loading } from \"../../react/Loading\";\nimport { usePlayer } from \"./hooks\";\n\nexport function Lobby() {\n  const player = usePlayer();\n\n  if (!player) {\n    return <Loading />;\n  }\n\n  const treatment = player.get(\"treatment\") as { playerCount: number };\n\n  if (!treatment || !treatment.playerCount) {\n    warn(\"lobby: no treatment found on player\");\n\n    return <Loading />;\n  }\n\n  return (\n    <div className=\"flex h-full items-center justify-center\">\n      <div className=\"text-center\">\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 640 512\"\n          className=\"mx-auto h-12 w-12 text-gray-400\"\n          stroke=\"none\"\n          fill=\"currentColor\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M544 224c44.2 0 80-35.8 80-80s-35.8-80-80-80-80 35.8-80 80 35.8 80 80 80zm0-128c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48 21.5-48 48-48zM320 256c61.9 0 112-50.1 112-112S381.9 32 320 32 208 82.1 208 144s50.1 112 112 112zm0-192c44.1 0 80 35.9 80 80s-35.9 80-80 80-80-35.9-80-80 35.9-80 80-80zm244 192h-40c-15.2 0-29.3 4.8-41.1 12.9 9.4 6.4 17.9 13.9 25.4 22.4 4.9-2.1 10.2-3.3 15.7-3.3h40c24.2 0 44 21.5 44 48 0 8.8 7.2 16 16 16s16-7.2 16-16c0-44.1-34.1-80-76-80zM96 224c44.2 0 80-35.8 80-80s-35.8-80-80-80-80 35.8-80 80 35.8 80 80 80zm0-128c26.5 0 48 21.5 48 48s-21.5 48-48 48-48-21.5-48-48 21.5-48 48-48zm304.1 180c-33.4 0-41.7 12-80.1 12-38.4 0-46.7-12-80.1-12-36.3 0-71.6 16.2-92.3 46.9-12.4 18.4-19.6 40.5-19.6 64.3V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-44.8c0-23.8-7.2-45.9-19.6-64.3-20.7-30.7-56-46.9-92.3-46.9zM480 432c0 8.8-7.2 16-16 16H176c-8.8 0-16-7.2-16-16v-44.8c0-16.6 4.9-32.7 14.1-46.4 13.8-20.5 38.4-32.8 65.7-32.8 27.4 0 37.2 12 80.2 12s52.8-12 80.1-12c27.3 0 51.9 12.3 65.7 32.8 9.2 13.7 14.1 29.8 14.1 46.4V432zM157.1 268.9c-11.9-8.1-26-12.9-41.1-12.9H76c-41.9 0-76 35.9-76 80 0 8.8 7.2 16 16 16s16-7.2 16-16c0-26.5 19.8-48 44-48h40c5.5 0 10.8 1.2 15.7 3.3 7.5-8.5 16.1-16 25.4-22.4z\" />\n        </svg>\n        <h3 className=\"mt-2 text-sm font-medium text-gray-900\">\n          {treatment.playerCount > 1\n            ? \"Waiting for other players\"\n            : \"Game loading\"}\n        </h3>\n        <p className=\"mt-1 text-sm text-gray-500\">\n          Please wait for the game to be ready.\n        </p>\n      </div>\n    </div>\n  );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { BehaviorSubject, Observable, Subscription } from \"rxjs\";\nimport { ParticipantModeContext } from \"../../context\";\nimport { useParticipantContext } from \"../../react/hooks\";\nimport type { StepTick } from \"../../steps\";\nimport { EmpiricaClassicContext, Game, Player, Round, Stage } from \"../classic\";\n\nexport function usePlayer() {\n  return usePartModeCtxKey<EmpiricaClassicContext, \"player\", Player | null>(\n    \"player\"\n  );\n}\n\nexport function useGame() {\n  return usePartModeCtxKey<EmpiricaClassicContext, \"game\", Game | null>(\"game\");\n}\n\nexport function useRound() {\n  return usePartModeCtxKey<EmpiricaClassicContext, \"round\", Round | null>(\n    \"round\"\n  );\n}\n\nexport function useStage() {\n  return usePartModeCtxKey<EmpiricaClassicContext, \"stage\", Stage | null>(\n    \"stage\"\n  );\n}\n\nexport function useStageTimer() {\n  const stage = useStage();\n\n  const [val, setVal] = useState<{ tick: StepTick | undefined }>({\n    tick: stage?.timer?.current,\n  });\n\n  const timerSubscription = useRef<Subscription | null>(null);\n\n  useEffect(() => {\n    if (!stage || !stage.timer) {\n      return;\n    }\n\n    if (timerSubscription.current === null) {\n      timerSubscription.current = stage.timer.obs().subscribe({\n        next(val) {\n          setVal({ tick: val });\n        },\n      });\n    }\n\n    return () => {\n      timerSubscription?.current?.unsubscribe.bind(timerSubscription.current);\n      timerSubscription.current = null;\n    };\n  }, [stage?.timer]);\n\n  return val.tick;\n}\n\nexport function usePlayers() {\n  return usePartModeCtxKey<EmpiricaClassicContext, \"players\", Player[]>(\n    \"players\"\n  );\n}\n\nexport function usePartModeCtx<M>() {\n  const ctx = useParticipantContext() as ParticipantModeContext<M>;\n  const [mode, setMode] = useState<{ data: M | undefined }>({\n    data: ctx?.mode?.getValue(),\n  });\n\n  useEffect(() => {\n    if (!ctx || !ctx.mode) {\n      return;\n    }\n\n    const sub = ctx.mode.subscribe({\n      next(m) {\n        setMode({ data: m });\n      },\n    });\n\n    return sub.unsubscribe.bind(sub);\n  }, [ctx]);\n\n  return mode.data;\n}\n\nexport function usePartModeCtxKey<M, K extends keyof M, R>(\n  name: K\n): R | undefined {\n  const mode = usePartModeCtx<M>();\n  const iniVal =\n    mode &&\n    ((<unknown>mode[name]) as BehaviorSubject<R | undefined> | undefined);\n  const [val, setVal] = useState<{ data: R | undefined }>({\n    data: iniVal?.getValue(),\n  });\n\n  useEffect(() => {\n    if (!mode) {\n      return;\n    }\n\n    const obs = (<unknown>mode[name]) as Observable<R>;\n\n    const sub = obs.subscribe({\n      next(val) {\n        setVal({ data: val });\n      },\n    });\n\n    return sub.unsubscribe.bind(sub);\n  }, [mode]);\n\n  return val.data;\n}\n","import React, { useEffect, useState } from \"react\";\nimport { Attributable } from \"../../../shared/scopes\";\nimport { error } from \"../../../utils/console\";\nimport { WithChildren } from \"../../react/helpers\";\nimport { Game, Player } from \"../classic\";\nimport { useGame, usePlayer } from \"./hooks\";\n\nexport type StepsFunc = (props: {\n  game?: Game | null;\n  player?: Player | null;\n}) => React.ElementType[] | undefined;\n\nexport type StepsProps = WithChildren<{\n  steps: React.ElementType[] | StepsFunc;\n  progressKey: string;\n  doneKey: string;\n  object?: Attributable;\n}>;\n\nexport function Steps({\n  steps,\n  progressKey,\n  doneKey,\n  object,\n  children,\n}: StepsProps) {\n  let obj: Attributable;\n  const game = useGame();\n  const player = usePlayer();\n  const [stps, setStps] = useState<React.ElementType[]>([]);\n  const [stpsSet, setStpsSet] = useState<boolean>(false);\n\n  useEffect(() => {\n    let s: React.ElementType[];\n    if (typeof steps === \"function\") {\n      s = steps({ game, player })!;\n    } else {\n      s = steps;\n    }\n    setStps(s);\n    setStpsSet(true);\n  }, [steps]);\n\n  useEffect(() => {\n    if (obj && !obj.get(doneKey) && stpsSet && (!stps || stps.length === 0)) {\n      obj.set(doneKey, true);\n    }\n  }, [stps]);\n\n  // Find state receiver\n  if (object) {\n    obj = object;\n  } else if (player) {\n    obj = player;\n  } else {\n    error(\"no receiver and no player in Steps\");\n    return <div>Missing attribute</div>;\n  }\n\n  // Are we already done\n  if (obj.get(doneKey)) {\n    return <>{children}</>;\n  }\n\n  const index = (obj.get(progressKey) as number) || 0;\n\n  const next = () => {\n    if (index + 1 >= stps.length) {\n      obj.set(doneKey, true);\n    } else {\n      obj.set(progressKey, index + 1);\n    }\n  };\n\n  const previous = () => {\n    if (index > 0) {\n      obj.set(progressKey, index - 1);\n    }\n  };\n\n  const Step = stps[index];\n  if (!Step) {\n    return <></>;\n  }\n\n  return <Step index={index} previous={previous} next={next}></Step>;\n}\n","import React, { FormEvent, useState } from \"react\";\n\nexport function Quiz({ next }: { next: () => void }) {\n  const labelClassName = \"block text-sm font-medium text-gray-700 mb-2\";\n  const inputClassName =\n    \"appearance-none block px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-empirica-500 focus:border-empirica-500 sm:text-sm\";\n\n  const [sum, setSum] = useState(\"\");\n  const [horse, setHorse] = useState(\"\");\n\n  function handleSubmit(e: FormEvent) {\n    e.preventDefault();\n\n    if (sum !== \"4\" || horse !== \"white\") {\n      alert(\"Incorrect! Read the instructions and please try again.\");\n    } else {\n      next();\n    }\n  }\n\n  return (\n    <div className=\"flex justify-center\">\n      <div className=\"mt-6 sm:mt-24\">\n        <h3 className=\"text-2xl font-semi-bold text-gray-900\">Quiz</h3>\n        <form className=\"mt-4\" onSubmit={handleSubmit}>\n          <p className=\"mb-5\">\n            <label className={labelClassName}>What is 2+2?</label>\n            <input\n              className={inputClassName}\n              type=\"text\"\n              dir=\"auto\"\n              id=\"sum\"\n              name=\"sum\"\n              placeholder=\"e.g. 3\"\n              value={sum}\n              onChange={(e) => setSum(e.target.value)}\n              autoComplete=\"off\"\n              autoFocus\n              required\n            />\n          </p>\n          <p className=\"mb-5\">\n            <label className={labelClassName}>\n              What color was Napoleon's white horse?\n            </label>\n            <input\n              className={inputClassName}\n              type=\"text\"\n              dir=\"auto\"\n              id=\"horse\"\n              name=\"horse\"\n              placeholder=\"brown\"\n              value={horse}\n              onChange={(e) => setHorse(e.target.value)}\n              autoComplete=\"off\"\n              required\n            />\n          </p>\n\n          <button\n            type=\"submit\"\n            className=\"inline-flex items-center px-4 py-2 border text-sm font-medium rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-empirica-500\"\n          >\n            Submit\n          </button>\n        </form>\n      </div>\n    </div>\n  );\n}\n","import React, { ChangeEventHandler, RefObject, useRef } from \"react\";\n\nexport interface SliderProps {\n  value: number;\n  onChange: ChangeEventHandler<HTMLInputElement>;\n  min?: number;\n  max?: number;\n  stepSize?: number;\n  disabled?: boolean;\n}\n\nexport function Slider({\n  value,\n  onChange,\n  min = 0,\n  max = 100,\n  stepSize = 1,\n  disabled = false,\n}: SliderProps) {\n  const noVal = value === null || value === undefined;\n  const val = noVal ? (max - min) / 2 : value;\n  const cls = noVal ? \"slider-thumb-zero\" : \"slider-thumb\";\n  const ref: RefObject<HTMLOutputElement> = useRef(null);\n\n  if (value !== null && ref.current) {\n    const nmin = min ? min : 0;\n    const nmax = max ? max : 100;\n    const newVal = Number(((value - nmin) * 100) / (nmax - nmin));\n\n    ref.current.style.left = `calc(${newVal}% + (${8 - newVal * 0.15}px))`;\n  }\n\n  return (\n    <div className=\"relative w-full\">\n      <input\n        className={cls}\n        type=\"range\"\n        min={min}\n        max={max}\n        step={stepSize}\n        value={val}\n        onChange={onChange}\n        disabled={disabled}\n      />\n      {noVal ? (\n        \"\"\n      ) : (\n        <output\n          ref={ref}\n          className=\"font-mono absolute w-12 h-7 flex items-center justify-center left-1/2 bottom-7 rounded transform -translate-x-1/2 bg-gray-200\"\n        >\n          {value}\n        </output>\n      )}\n    </div>\n  );\n}\n","import React, {\n  FormEvent,\n  KeyboardEvent,\n  MouseEvent,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport { Attribute } from \"../../../../shared/attributes\";\nimport { Attributable } from \"../../../../shared/scopes\";\nimport { Loading } from \"../../../react\";\nimport { WithChildren } from \"../../../react/helpers\";\nimport { usePlayer } from \"../hooks\";\n\nexport type ChatProps = WithChildren<{\n  scope: Attributable;\n  attribute: string;\n  loading?: React.ElementType;\n}>;\n\nexport type Message = {\n  text: string;\n  sender: {\n    id: string;\n    name: string;\n    avatar: string;\n  };\n};\n\nexport function Chat({\n  scope,\n  attribute = \"messages\",\n  loading: LoadingComp = Loading,\n}: ChatProps) {\n  const player = usePlayer();\n\n  if (!scope || !player) {\n    return <LoadingComp />;\n  }\n\n  const handleNewMessage = (text: string) => {\n    scope.append(attribute, {\n      text,\n      sender: {\n        id: player!.id,\n        name: player!.get(\"name\") || player!.id,\n        avatar: player!.get(\"avatar\"),\n      },\n    } as Message);\n  };\n\n  const msgs = scope.getAttribute(attribute)?.items || [];\n\n  return (\n    <div className=\"h-full w-full flex flex-col\">\n      <Messages msgs={msgs} />\n\n      <Input onNewMessage={handleNewMessage} />\n    </div>\n  );\n}\n\ntype MessagesProps = WithChildren<{\n  msgs: Attribute[];\n}>;\n\nfunction Messages(props: MessagesProps) {\n  const { msgs } = props;\n  const scroller = useRef<HTMLDivElement>(null);\n  const [msgCount, setMsgCount] = useState(0);\n\n  useEffect(() => {\n    if (!scroller.current) {\n      return;\n    }\n\n    if (msgCount !== msgs.length) {\n      setMsgCount(msgs.length);\n      scroller.current.scrollTop = scroller.current.scrollHeight;\n    }\n  }, [scroller, props, msgCount]);\n\n  if (msgs.length === 0) {\n    return (\n      <div className=\"h-full w-full flex justify-center items-center\">\n        <div className=\"flex flex-col justify-center items-center w-2/3 space-y-2\">\n          <div className=\"w-24 h-24 text-gray-200\">\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              className=\"h-full w-full fill-current\"\n              viewBox=\"0 0 512 512\"\n            >\n              <path d=\"M123.6 391.3c12.9-9.4 29.6-11.8 44.6-6.4c26.5 9.6 56.2 15.1 87.8 15.1c124.7 0 208-80.5 208-160s-83.3-160-208-160S48 160.5 48 240c0 32 12.4 62.8 35.7 89.2c8.6 9.7 12.8 22.5 11.8 35.5c-1.4 18.1-5.7 34.7-11.3 49.4c17-7.9 31.1-16.7 39.4-22.7zM21.2 431.9c1.8-2.7 3.5-5.4 5.1-8.1c10-16.6 19.5-38.4 21.4-62.9C17.7 326.8 0 285.1 0 240C0 125.1 114.6 32 256 32s256 93.1 256 208s-114.6 208-256 208c-37.1 0-72.3-6.4-104.1-17.9c-11.9 8.7-31.3 20.6-54.3 30.6c-15.1 6.6-32.3 12.6-50.1 16.1c-.8 .2-1.6 .3-2.4 .5c-4.4 .8-8.7 1.5-13.2 1.9c-.2 0-.5 .1-.7 .1c-5.1 .5-10.2 .8-15.3 .8c-6.5 0-12.3-3.9-14.8-9.9c-2.5-6-1.1-12.8 3.4-17.4c4.1-4.2 7.8-8.7 11.3-13.5c1.7-2.3 3.3-4.6 4.8-6.9c.1-.2 .2-.3 .3-.5z\" />\n            </svg>\n          </div>\n\n          <h4 className=\"text-gray-700 font-semibold\">No chat yet</h4>\n\n          <p className=\"text-gray-500 text-center\">\n            Send a message to start the conversation.\n          </p>\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"h-full overflow-auto pl-2 pr-4 pb-2\" ref={scroller}>\n      {msgs.map((msg) => (\n        <MessageComp key={msg.id} attribute={msg} />\n      ))}\n    </div>\n  );\n}\n\ntype MessageProps = WithChildren<{\n  attribute: Attribute;\n}>;\n\nfunction MessageComp({ attribute }: MessageProps) {\n  const msg = attribute.value as Message;\n  const ts = attribute.createdAt;\n\n  let avatar = msg.sender.avatar;\n  if (!avatar) {\n    avatar = `https://avatars.dicebear.com/api/identicon/${msg.sender.id}.svg`;\n  }\n\n  let avatarImage = (\n    <img\n      className=\"inline-block h-9 w-9 rounded-full\"\n      src={avatar}\n      alt={msg.sender.id}\n    />\n  );\n  if (!avatar.startsWith(\"http\")) {\n    avatarImage = (\n      <div className=\"inline-block h-9 w-9 rounded-full\">{avatar}</div>\n    );\n  }\n\n  return (\n    <div className=\"flex items-start my-2\">\n      <div className=\"flex-shrink-0\">{avatarImage}</div>\n      <div className=\"ml-3 text-sm\">\n        <p>\n          <span className=\"font-semibold text-gray-900 group-hover:text-gray-800\">\n            {msg.sender.name}\n          </span>\n\n          <span className=\"pl-2 text-gray-400\">{ts && relTime(ts)}</span>\n        </p>\n        <p className=\"text-gray-900 group-hover:text-gray-800\">{msg.text}</p>\n      </div>\n    </div>\n  );\n}\n\ntype InputProps = WithChildren<{\n  onNewMessage: (msg: string) => void;\n}>;\n\nfunction Input({ onNewMessage }: InputProps) {\n  const [text, setText] = useState(\"\");\n\n  const resize = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n    const target = e.target as HTMLTextAreaElement;\n    target.style.height = \"inherit\";\n    target.style.height = `${Math.min(target.scrollHeight, 200)}px`;\n  };\n\n  const handleSubmit = (\n    e:\n      | FormEvent<HTMLFormElement>\n      | KeyboardEvent<HTMLTextAreaElement>\n      | MouseEvent<HTMLButtonElement>\n  ) => {\n    e.preventDefault();\n\n    const txt = text.trim();\n    if (txt === \"\") {\n      return;\n    }\n\n    if (txt.length > 1024) {\n      e.preventDefault();\n\n      alert(\"Max message length is 1024\");\n\n      return;\n    }\n\n    onNewMessage(txt);\n    setText(\"\");\n  };\n\n  const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n    if (e.key === \"Enter\" && e.shiftKey === false) {\n      handleSubmit(e);\n      resize(e);\n    }\n  };\n\n  const handleKeyUp = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n    resize(e);\n  };\n\n  return (\n    <form\n      className=\"p-2 flex items-strech gap-2 border-t\"\n      onSubmit={handleSubmit}\n    >\n      <textarea\n        name=\"message\"\n        id=\"message\"\n        rows={1}\n        className=\"peer resize-none bg-transparent block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-200 placeholder:text-gray-300 focus:ring-2 focus:ring-inset focus:ring-empirica-500 sm:text-sm sm:leading-6\"\n        placeholder=\"Say something\"\n        onKeyDown={handleKeyDown}\n        onKeyUp={handleKeyUp}\n        value={text}\n        onChange={(e) => setText(e.target.value)}\n      />\n\n      <button\n        type=\"button\"\n        className=\"rounded-md bg-gray-100 w-9 h-9 p-2 text-sm font-semibold text-gray-500 shadow-sm hover:bg-gray-200 hover:text-empirica-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-empirica-500\"\n        onClick={handleSubmit}\n      >\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          className=\"h-full w-full fill-current\"\n          viewBox=\"0 0 512 512\"\n        >\n          <path d=\"M498.1 5.6c10.1 7 15.4 19.1 13.5 31.2l-64 416c-1.5 9.7-7.4 18.2-16 23s-18.9 5.4-28 1.6L284 427.7l-68.5 74.1c-8.9 9.7-22.9 12.9-35.2 8.1S160 493.2 160 480V396.4c0-4 1.5-7.8 4.2-10.7L331.8 202.8c5.8-6.3 5.6-16-.4-22s-15.7-6.4-22-.7L106 360.8 17.7 316.6C7.1 311.3 .3 300.7 0 288.9s5.9-22.8 16.1-28.7l448-256c10.7-6.1 23.9-5.5 34 1.4z\" />\n        </svg>\n      </button>\n    </form>\n  );\n}\n\nfunction relTime(date: Date) {\n  const difference = (new Date().getTime() - date.getTime()) / 1000;\n\n  if (difference < 60) {\n    return `now`;\n  } else if (difference < 3600) {\n    return `${Math.floor(difference / 60)}m`;\n  } else if (difference < 86400) {\n    return `${Math.floor(difference / 3600)}h`;\n  } else if (difference < 2620800) {\n    return `${Math.floor(difference / 86400)} days ago`;\n  } else if (difference < 31449600) {\n    return `${Math.floor(difference / 2620800)} months ago`;\n  } else {\n    return `${Math.floor(difference / 31449600)} years ago`;\n  }\n}\n\n// function getRelativeTimeString(\n//   date: Date | number,\n//   lang = navigator.language\n// ): string {\n//   // Allow dates or times to be passed\n//   const timeMs = typeof date === \"number\" ? date : date.getTime();\n\n//   // Get the amount of seconds between the given date and now\n//   const deltaSeconds = Math.round((timeMs - Date.now()) / 1000);\n\n//   // Array reprsenting one minute, hour, day, week, month, etc in seconds\n//   const cutoffs = [\n//     60,\n//     3600,\n//     86400,\n//     86400 * 7,\n//     86400 * 30,\n//     86400 * 365,\n//     Infinity,\n//   ];\n\n//   // Array equivalent to the above but in the string representation of the units\n//   const units: Intl.RelativeTimeFormatUnit[] = [\n//     \"second\",\n//     \"minute\",\n//     \"hour\",\n//     \"day\",\n//     \"week\",\n//     \"month\",\n//     \"year\",\n//   ];\n\n//   // Grab the ideal cutoff unit\n//   const unitIndex = cutoffs.findIndex(\n//     (cutoff) => cutoff > Math.abs(deltaSeconds)\n//   );\n\n//   // Get the divisor to divide from the seconds. E.g. if our unit is \"day\" our divisor\n//   // is one day in seconds, so we can divide our seconds by this to get the # of days\n//   const divisor = unitIndex ? cutoffs[unitIndex - 1] : 1;\n\n//   // Intl.RelativeTimeFormat do its magic\n//   const rtf = new Intl.RelativeTimeFormat(lang, { numeric: \"auto\" });\n//   return rtf.format(Math.floor(deltaSeconds / divisor!), units[unitIndex]!);\n// }\n","import React from \"react\";\nimport { createNewParticipant, isDevelopment } from \"../utils\";\nimport { Logo } from \"./Logo\";\nimport { useParticipantContext } from \"./hooks\";\n\nexport type EmpiricaMenuProps = {\n  position:\n    | \"top\"\n    | \"top-left\"\n    | \"top-right\"\n    | \"bottom\"\n    | \"bottom-left\"\n    | \"bottom-right\";\n};\n\nexport function EmpiricaMenu({ position = \"bottom-left\" }: EmpiricaMenuProps) {\n  const ctx = useParticipantContext();\n\n  if (!ctx) {\n    return null;\n  }\n\n  function resetSession() {\n    ctx!.session.clearSession();\n    window.location.reload();\n  }\n\n  let className =\n    \"backdrop-blur-md bg-gray-200/50 rounded fixed z-20 flex space-x-1 text-gray-500\";\n  switch (position) {\n    case \"top\":\n      className += \" top-0 mt-2 ml-1/2 -translate-x-1/2\";\n      break;\n    case \"top-left\":\n      className += \" top-0 left-0 mt-2 ml-2\";\n      break;\n    case \"top-right\":\n      className += \" top-0 right-0 mt-2 mr-2\";\n      break;\n    case \"bottom\":\n      className += \" bottom-0 mb-2 ml-1/2 -translate-x-1/2\";\n      break;\n    case \"bottom-right\":\n      className += \" bottom-0 right-0 mb-2 mr-2\";\n      break;\n    case \"bottom-left\":\n    default:\n      className += \" bottom-0 left-0 mb-2 ml-2\";\n      break;\n  }\n\n  const buttons = [\n    {\n      onClick: () => {\n        window.open(\"https://empirica.ly\", \"_blank\");\n      },\n      icon: <Logo />,\n      title: \"Empirica\",\n      inDevOnly: position === \"top\" || position === \"bottom\",\n    },\n    {\n      onClick: () => createNewParticipant(),\n      icon: (\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          strokeWidth=\"2\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          className=\"h-full w-full stroke-current\"\n        >\n          <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n          <circle cx=\"9\" cy=\"7\" r=\"4\" />\n          <line x1=\"19\" x2=\"19\" y1=\"8\" y2=\"14\" />\n          <line x1=\"22\" x2=\"16\" y1=\"11\" y2=\"11\" />\n        </svg>\n      ),\n      inDevOnly: true,\n      title: \"New Participant\",\n    },\n    {\n      onClick: resetSession,\n      icon: (\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          strokeWidth=\"2\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          className=\"h-full w-full stroke-current\"\n        >\n          <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n          <path d=\"M3 3v5h5\" />\n        </svg>\n      ),\n      inDevOnly: true,\n      title: \"Reset Session\",\n    },\n    {\n      onClick: () => {\n        window.open(\"/admin\", \"_blank\");\n      },\n      icon: (\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          strokeWidth=\"2\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          className=\"h-full w-full stroke-current\"\n        >\n          <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" />\n        </svg>\n      ),\n      inDevOnly: true,\n      title: \"Admin\",\n    },\n    {\n      onClick: () => {\n        window.open(\"https://docs.empirica.ly\", \"_blank\");\n      },\n      icon: (\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          strokeWidth=\"2\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          className=\"h-full w-full stroke-current\"\n        >\n          <path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\" />\n          <path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\" />\n        </svg>\n      ),\n      inDevOnly: true,\n      title: \"Documentation\",\n    },\n  ];\n\n  return (\n    <div className={className}>\n      {buttons.map((button, i) => {\n        let sizing = \"\";\n\n        // Logo needs to be a little larger to git visual scale of other icons.\n        if (i === 0) {\n          sizing = \"w-9 h-8 p-1.5 pl-2.5\";\n          if (buttons.length === 0) {\n            sizing += \" pr-2.5\";\n          }\n        } else if (i === buttons.length - 1) {\n          // Adding a little padding to the right of the last button for\n          // aesthetics.\n          sizing += \"w-8.5 h-8 p-2 pr-2.5\";\n        }\n\n        return <ToolButton key={i} {...button} sizing={sizing} />;\n      })}\n    </div>\n  );\n}\n\nexport type ToolButtonProps = {\n  onClick: () => void;\n  icon: React.ReactNode;\n  inDevOnly?: boolean;\n  sizing?: string;\n  title?: string;\n};\n\nfunction ToolButton({\n  onClick,\n  icon,\n  title,\n  sizing = \"\",\n  inDevOnly = false,\n}: ToolButtonProps) {\n  if (inDevOnly && !isDevelopment) {\n    return <></>;\n  }\n\n  let size = \"w-8 h-8 p-2\";\n\n  if (sizing) {\n    size = sizing;\n  }\n\n  let className =\n    \"block bg-transparent hover:text-empirica-600 hover:bg-gray-300 rounded \" +\n    size;\n\n  return (\n    <button onClick={onClick} className={className} title={title}>\n      {icon}\n    </button>\n  );\n}\n","import React from \"react\";\n\nexport function Logo() {\n  return (\n    <svg\n      className=\"h-full w-full fill-current\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox=\"0 0 195 185\"\n    >\n      <path d=\"M25.164 81.9737C22.31 81.9737 19.998 84.2877 20 87.1417L20.028 128.458C20.03 131.309 22.341 133.619 25.192 133.619C28.046 133.619 30.359 131.304 30.357 128.451L30.328 87.1347C30.326 84.2837 28.015 81.9737 25.164 81.9737Z\" />\n      <path d=\"M87.1367 61.3158C84.2837 61.3158 81.9707 63.6298 81.9727 66.4828L82.0017 118.128C82.0037 120.979 84.3147 123.29 87.1667 123.29C90.0197 123.29 92.3327 120.976 92.3307 118.122L92.3007 66.4778C92.2997 63.6258 89.9877 61.3158 87.1367 61.3158Z\" />\n      <path d=\"M107.793 20C104.94 20 102.628 22.313 102.629 25.166L102.661 159.442C102.662 162.294 104.974 164.605 107.826 164.605C110.679 164.605 112.991 162.293 112.99 159.44L112.957 25.163C112.957 22.311 110.645 20 107.793 20Z\" />\n      <path d=\"M128.451 20C125.598 20 123.286 22.313 123.287 25.166L123.319 159.442C123.32 162.294 125.632 164.605 128.484 164.605C131.337 164.605 133.649 162.293 133.648 159.44L133.615 25.163C133.615 22.311 131.303 20 128.451 20Z\" />\n      <path d=\"M149.11 20C146.257 20 143.944 22.313 143.946 25.167L143.977 102.634C143.978 105.485 146.29 107.796 149.141 107.796C151.994 107.796 154.307 105.483 154.306 102.63L154.274 25.162C154.273 22.311 151.961 20 149.11 20Z\" />\n      <path d=\"M169.75 40.6579C166.897 40.6579 164.585 42.9709 164.586 45.8239L164.617 138.785C164.618 141.637 166.93 143.948 169.782 143.948C172.635 143.948 174.947 141.634 174.946 138.781L174.914 45.8209C174.914 42.9689 172.602 40.6579 169.75 40.6579Z\" />\n      <path d=\"M45.8203 61.3158C42.9673 61.3158 40.6553 63.6288 40.6563 66.4818L40.6873 159.443C40.6883 162.295 43.0003 164.606 45.8523 164.606C48.7053 164.606 51.0173 162.292 51.0163 159.439L50.9843 66.4788C50.9843 63.6268 48.6723 61.3158 45.8203 61.3158Z\" />\n      <path d=\"M66.4785 61.3158C63.6255 61.3158 61.3135 63.6288 61.3145 66.4818L61.3455 159.443C61.3465 162.295 63.6585 164.606 66.5105 164.606C69.3635 164.606 71.6755 162.292 71.6745 159.439L71.6425 66.4788C71.6415 63.6268 69.3305 61.3158 66.4785 61.3158Z\" />\n    </svg>\n  );\n}\n\n// export function Logo() {\n//   return (\n//     <div className=\"absolute bottom-0 right-0 h-20 w-20\">\n//       <svg\n//         className=\"h-full w-full\"\n//         fill=\"none\"\n//         xmlns=\"http://www.w3.org/2000/svg\"\n//         viewBox=\"0 0 250 250\"\n//       >\n//         <circle cx=\"50\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"50\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"50\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"50\" cy=\"139\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"50\" cy=\"167\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"50\" cy=\"195\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"78\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"78\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"78\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"78\" cy=\"139\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"78\" cy=\"167\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"78\" cy=\"195\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"106\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"106\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"106\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"106\" cy=\"139\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"106\" cy=\"167\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"106\" cy=\"195\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"134\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"134\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"134\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"162\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"162\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"162\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"190\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"190\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle\n//           cx=\"78\"\n//           cy=\"167\"\n//           r=\"7\"\n//           fill=\"#838383\"\n//           stroke=\"#838383\"\n//           strokeWidth=\"4\"\n//         />\n//         <circle\n//           cx=\"106\"\n//           cy=\"111\"\n//           r=\"7\"\n//           fill=\"#838383\"\n//           stroke=\"#838383\"\n//           strokeWidth=\"4\"\n//         />\n//         <circle\n//           cx=\"190\"\n//           cy=\"83\"\n//           r=\"7\"\n//           fill=\"#838383\"\n//           stroke=\"#838383\"\n//           strokeWidth=\"4\"\n//         />\n//         <circle cx=\"190\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <rect x=\"127\" y=\"132\" width=\"71\" height=\"14\" fill=\"#838383\" />\n//         <rect x=\"127\" y=\"160\" width=\"71\" height=\"14\" fill=\"#838383\" />\n//         <rect x=\"127\" y=\"188\" width=\"71\" height=\"14\" fill=\"#838383\" />\n//       </svg>\n//     </div>\n//   );\n// }\n\n// export default function Logo() {\n//   return (\n//     <div className=\"absolute bottom-0 right-0 h-20 w-20\">\n//       <svg\n//         className=\"h-full w-full\"\n//         fill=\"none\"\n//         xmlns=\"http://www.w3.org/2000/svg\"\n//         viewBox=\"0 0 250 250\"\n//       >\n//         <circle cx=\"47\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"47\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"47\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"47\" cy=\"139\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"47\" cy=\"167\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"47\" cy=\"195\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"73\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"73\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"73\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"73\" cy=\"139\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"73\" cy=\"167\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"73\" cy=\"195\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"99\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"99\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"99\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"99\" cy=\"139\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"99\" cy=\"167\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"99\" cy=\"195\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"125\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"125\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"125\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"125\" cy=\"139\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"125\" cy=\"167\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"125\" cy=\"195\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"151\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"151\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"151\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"151\" cy=\"139\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"151\" cy=\"167\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"151\" cy=\"195\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"177\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"177\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"177\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"177\" cy=\"139\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"177\" cy=\"167\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"177\" cy=\"195\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"203\" cy=\"55\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"203\" cy=\"83\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle\n//           cx=\"47\"\n//           cy=\"55\"\n//           r=\"7\"\n//           fill=\"#838383\"\n//           stroke=\"#838383\"\n//           strokeWidth=\"4\"\n//         />\n//         <circle\n//           cx=\"99\"\n//           cy=\"167\"\n//           r=\"7\"\n//           fill=\"#838383\"\n//           stroke=\"#838383\"\n//           strokeWidth=\"4\"\n//         />\n//         <circle\n//           cx=\"125\"\n//           cy=\"111\"\n//           r=\"7\"\n//           fill=\"#838383\"\n//           stroke=\"#838383\"\n//           strokeWidth=\"4\"\n//         />\n//         <circle\n//           cx=\"177\"\n//           cy=\"139\"\n//           r=\"7\"\n//           fill=\"#838383\"\n//           stroke=\"#838383\"\n//           strokeWidth=\"4\"\n//         />\n//         <circle\n//           cx=\"203\"\n//           cy=\"83\"\n//           r=\"7\"\n//           fill=\"#838383\"\n//           stroke=\"#838383\"\n//           strokeWidth=\"4\"\n//         />\n//         <circle cx=\"203\" cy=\"111\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"203\" cy=\"139\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"203\" cy=\"167\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//         <circle cx=\"203\" cy=\"195\" r=\"7\" stroke=\"#838383\" strokeWidth=\"4\" />\n//       </svg>\n//     </div>\n//   );\n// }\n","import React, { useEffect } from \"react\";\nimport { usePlayer, useRound } from \"../hooks\";\n\nconst buttonStyle = {\n  width: 40,\n  height: 40,\n  backgroundColor: \"#888\",\n  color: \"black\",\n  verticalAlign: \"top\",\n  fontSize: \"32px\",\n  borderLeft: \"5px solid rgb(220,220,220)\",\n  borderTop: \"5px solid rgb(220,220,220)\",\n  borderBottom: \"5px solid #333\",\n  borderRight: \"5px solid #333\",\n  display: \"inline-block\",\n};\n\nconst visitStyle = {\n  width: 40,\n  height: 40,\n  itemsAlign: \"center\",\n  backgroundColor: \"#555\",\n  color: \"white\",\n  fontWeight: \"bold\",\n  border: \"1px solid black\",\n  verticalAlign: \"top\",\n  fontSize: \"24px\",\n  display: \"inline-block\",\n};\n\ntype cell = number | string;\ntype row = [cell, cell, cell, cell, cell, cell, cell, cell, cell, cell];\ntype grid = [row, row, row, row, row, row, row, row, row, row];\n\nexport function Sweeper() {\n  const round = useRound();\n  if (!round) {\n    return null;\n  }\n  const player = usePlayer();\n  if (!player) {\n    return null;\n  }\n\n  const visited = round.get(\"visited\") as Array<Array<number>>;\n  const bombs = round.get(\"bombs\") as Array<Array<number | \"X\">>;\n  const lost = round.get(\"lost\") as boolean;\n\n  useEffect(function () {\n    generateBombs();\n  }, []);\n\n  function generateBombs() {\n    if (bombs || !round) {\n      return;\n    }\n\n    let bombArr = new Array(10)\n      .fill(0)\n      .map(() => new Array(10).fill(0)) as grid;\n\n    for (let i = 0; i < bombArr.length; i++) {\n      let bombPos = Math.floor(Math.random() * 10);\n      bombArr[i]![bombPos] = \"X\";\n    }\n\n    for (let i = 0; i < bombArr.length; i++) {\n      for (let j = 0; j < bombArr[i]!.length; j++) {\n        if (bombArr[i]![j] !== \"X\") {\n          let sum = 0;\n\n          if (i > 0 && bombArr[i - 1]![j] == \"X\") sum++;\n          if (i < bombArr.length - 1 && bombArr[i + 1]![j] == \"X\") sum++;\n          if (j < bombArr.length - 1 && bombArr[i]![j + 1] == \"X\") sum++;\n          if (j > 0 && bombArr[i]![j - 1] == \"X\") sum++;\n          if (i < bombArr.length - 1 && j > 0 && bombArr[i + 1]![j - 1] == \"X\")\n            sum++;\n          if (\n            i < bombArr.length - 1 &&\n            j < bombArr.length - 1 &&\n            bombArr[i + 1]![j + 1] == \"X\"\n          )\n            sum++;\n          if (i > 0 && j > 0 && bombArr[i - 1]![j - 1] == \"X\") sum++;\n          if (i > 0 && j < bombArr.length - 1 && bombArr[i - 1]![j + 1] == \"X\")\n            sum++;\n\n          bombArr[i]![j] = sum;\n        }\n      }\n    }\n\n    round.set(\"bombs\", bombArr);\n\n    let cover = Array(10)\n      .fill(0)\n      .map(() => Array(10).fill(0));\n\n    round.set(\"visited\", cover);\n  }\n\n  const visitCell = (i: number, j: number) => {\n    if (lost || !bombs || !visited) {\n      return;\n    }\n\n    if (bombs[i]![j] === \"X\") {\n      round.set(\"lost\", true);\n    }\n\n    dfsCells(i, j);\n    visited[i]![j] = 1;\n    round.set(\"visited\", [...visited]);\n  };\n\n  function dfsCells(i: number, j: number) {\n    if (!round || !bombs || !visited) {\n      return;\n    }\n\n    if (\n      i < 0 ||\n      i > visited.length - 1 ||\n      j < 0 ||\n      j > visited[0]!.length - 1 ||\n      visited[i]![j] == 1 ||\n      bombs[i]![j] == \"X\"\n    )\n      return;\n\n    visited[i]![j] = 1;\n\n    round.set(\"visited\", [...visited]);\n\n    const cell = bombs[i]![j]!;\n    if (typeof cell === \"number\" && cell < 1) {\n      dfsCells(i + 1, j);\n      dfsCells(i - 1, j);\n      dfsCells(i, j + 1);\n      dfsCells(i, j - 1);\n    }\n  }\n\n  if (!bombs) {\n    return null;\n  }\n\n  return (\n    <div className=\"text-sm relative\">\n      {lost ? (\n        <>\n          <div className=\"absolute h-full w-full flex items-center justify-center text-6xl white font-black bg-opacity-50 bg-gray-300\">\n            YOU LOST\n          </div>\n          <div className=\"absolute h-full w-full flex items-center justify-center text-6xl white font-black mt-1 ml-1 text-white\">\n            YOU LOST\n          </div>\n        </>\n      ) : (\n        \"\"\n      )}\n\n      {bombs.map((arr, index) => (\n        <div key={index}>\n          {arr.map((_, i) => (\n            <div\n              key={i}\n              onClick={() => visitCell(index, i)}\n              style={visited[index]![i] == 0 ? buttonStyle : visitStyle}\n            >\n              <div className=\"h-full w-full flex items-center justify-center\">\n                {visited[index]![i] == 0\n                  ? null\n                  : bombs[index]![i] == 0\n                  ? \"\"\n                  : bombs[index]![i]}\n              </div>\n            </div>\n          ))}\n        </div>\n      ))}\n    </div>\n  );\n}\n"],"mappings":"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","names":["err","base","module","module","module","module","concatMap","z","module","minimatch","Minimatch","filter","makeRe","braceExpand","debug","set","self","module","module","module","self","m","path","module","self","error","module","cb","module","module","module","self","error","er","stat","module","timeout","p","er","module","err","error","Game","Lobby","Player","PlayerGame","PlayerRound","PlayerStage","Round","Scope","Scopes","Stage","Step","error","import_rxjs","import_rxjs","import_rxjs","attr","attrs","newAttr","value","import_rxjs","import_rxjs","import_rxjs","import_rxjs","import_async_mutex","TajribaEvent","import_tajriba","import_rxjs","import_rxjs","kinds","map","kind","attrs","Scope","import_tajriba","import_rxjs","tmp","import_tajriba","import_zod","attrs","import_tajriba","import_console","Scope","nodeIDs","attributes","scope","accessors","import_zod","isString","game","_","stage","import_tajriba","import_zod","import_tajriba","import_zod","import_rxjs","Scopes","kinds","Scope","import_rxjs","Step","import_rxjs","endedStatuses","Game","Scope","Player","PlayerGame","PlayerRound","PlayerStage","Round","Stage","Context","Scopes","import_react","React","import_react","React","import_react","React","import_react","React","import_react","evt","React","import_react","import_rxjs","import_react","import_rxjs","import_rxjs","isBrowser","provider","React","import_react","import_react","val","Lobby","React","import_react","Steps","React","Step","Lobby","React","Steps","Finished","import_react","React","import_react","React","import_react","import_react","import_react","React","React","React","import_react","React"]}