{"version":3,"sources":["../src/player/react/index.ts","../src/shared/globals.ts","../src/shared/tajriba_connection.ts","../src/utils/console.ts","../src/utils/object.ts","../src/player/context.ts","../src/admin/observables.ts","../src/player/connection.ts","../src/player/provider.ts","../src/player/react/Consent.tsx","../src/player/react/EmpiricaMenu.tsx","../src/player/utils.ts","../src/player/react/Logo.tsx","../src/player/react/hooks.ts","../src/player/react/EmpiricaParticipant.tsx","../src/player/react/Finished.tsx","../src/player/react/Loading.tsx","../src/player/react/NoGames.tsx","../src/player/react/PlayerCreate.tsx"],"sourcesContent":["export type {\n  Attribute,\n  AttributeChange,\n  AttributeOptions,\n  AttributeUpdate,\n} from \"../../shared/attributes\";\nexport { Globals } from \"../../shared/globals\";\nexport type { ScopeIdent, ScopeUpdate } from \"../../shared/scopes\";\nexport { TajribaConnection } from \"../../shared/tajriba_connection\";\nexport type { Json, JsonArray, JsonValue } from \"../../utils/json\";\nexport { ParticipantContext } from \"../context\";\nexport type { Mode } from \"../context\";\nexport { TajribaProvider } from \"../provider\";\nexport type { ParticipantUpdate } from \"../provider\";\nexport type { StepChange, StepUpdate } from \"../steps\";\nexport { Consent } from \"./Consent\";\nexport type { ConsentProps } from \"./Consent\";\nexport { EmpiricaMenu } from \"./EmpiricaMenu\";\nexport type { EmpiricaMenuProps } from \"./EmpiricaMenu\";\nexport { EmpiricaParticipant } from \"./EmpiricaParticipant\";\nexport type { EmpiricaParticipantProps } from \"./EmpiricaParticipant\";\nexport { Finished } from \"./Finished\";\nexport { Loading } from \"./Loading\";\nexport { Logo } from \"./Logo\";\nexport { NoGames } from \"./NoGames\";\nexport { PlayerCreate } from \"./PlayerCreate\";\nexport type { PlayerCreateProps } from \"./PlayerCreate\";\nexport type { WithChildren } from \"./helpers\";\nexport {\n  useConsent,\n  useGlobal,\n  useParticipantContext,\n  usePlayerID,\n  useTajriba,\n  useTajribaConnected,\n  useTajribaConnecting,\n} from \"./hooks\";\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 { 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 { 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 { 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 {\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 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\";\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","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 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 { 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 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"],"mappings":"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","names":["error","import_rxjs","import_rxjs","import_rxjs","import_rxjs","isBrowser","import_rxjs","provider","React","import_react","import_react","React","import_react","import_rxjs","import_react","React","React","import_react","React","import_react","React","import_react","React","import_react","React"]}