{"version":3,"sources":["../src/core/js/ciao-prolog.js","../src/controllers/ciao-prolog-interface.ts","../src/controllers/interface-builder.ts","../src/assets/builder_functions.json"],"sourcesContent":["/*\n *  ciao-prolog.js\n *\n *  Main JavaScript interface to Ciao Prolog compiled to WebAssembly.\n *\n *  Copyright (C) 2017-2023 Jose F. Morales\n */\n\n/**\n   The JS interface for Ciao is implemented in several layers.  See\n   the documentation of the following classes/objects for more\n   information:\n\n   - `ToplevelProc`\n   - `CiaoWorker`\n   - `LLCiao`\n   - `CIAOENGINE`\n*/\n\n/* =========================================================================== */\n/**\n * `CiaoPromiseProxy`: promise object used to store and communicate\n * results from `CiaoWorker` when using a Web Worker.\n */\n\nclass CiaoPromiseProxy {\n  /* TODO: similar to (:- block) implementation */\n  /* TODO: 'reject' not supported */\n  /* TODO: Make sure that this passes the Promises tests suite: https://github.com/promises-aplus/promises-tests */\n  constructor() {\n    this.hasValue = false; /* has a value */\n    this.value = null; /* value */\n    this.handler = null; /* 'then' handler */\n    this.next = null; /* temporary promise, when the handler is not yet there */\n  }\n  setValue(value) {\n    if (typeof this.handler === 'function') { /* we have both handler and value, call */\n      var ret = this.handler(value);\n      if (typeof ret === 'undefined') {\n        this.next.setValue(undefined); /* no value */\n      } else {\n        if (typeof ret.then === 'function') { /* assume some Thenable (a promise) */\n          var this_next = this.next;\n          ret.then(function (r) {\n            this_next.setValue(r); /* propagate value */\n          });\n        } else {\n          this.next.setValue(ret); /* just value (equivalent to a promise coercion) */\n        }\n      }\n    } else { /* otherwise save the value */\n      this.value = value;\n      this.hasValue = true;\n    }\n  }\n  /* Note: assume that handler returns undefined or a promise */\n  then(handler) {\n    if (this.hasValue === true) { /* have both! call handler */\n      var ret = handler(this.value);\n      if (typeof ret.then === 'function') { /* assume some Thenable (a promise) */\n        return ret;\n      } else { /* promise coercion */\n        return CiaoPromiseProxy.resolve(ret);\n      }\n    } else { /* otherwise save the handler */\n      var next = new CiaoPromiseProxy(); /* create temporary promise */\n      this.next = next;\n      this.handler = handler;\n      return next;\n    }\n  }\n\n  /* A promise with resolved value `v` */\n  static resolve(v) {\n    var p = new CiaoPromiseProxy();\n    p.setValue(v);\n    return p;\n  }\n}\n\n/* =========================================================================== */\n/**\n * `LLCiao`: Low level interface for CIAOENGINE. It implements\n * environment setup, loading of bundle data.\n *\n * This function should not have any dependency with the parent\n * code. It can be executed directly or captured as a string to be\n * loaded as a Web Worker.\n */\n\nfunction new_LLCiao() {\n  var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';\n  var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string';\n\n  if (ENVIRONMENT_IS_NODE) {\n    const fs = require('fs/promises');\n    const vm = require('vm');\n    var tryImportScript = async function (src) {\n      global.require = require; // TODO: why?\n      global.__dirname = __dirname; // TODO: why?\n      global.tryImportScript = tryImportScript; // TODO: why?\n      // TODO: better way?\n      var data = await fs.readFile(src);\n      // Note: emcc options \"-s NODEJS_CATCH_EXIT=0 -s\n      // NODEJS_CATCH_REJECTION=0\" are required to prevent nodejs from\n      // printing whole code on exceptions\n      vm.runInThisContext(data, { displayErrors: false, filename: src });\n    };\n    var tryFetchJSON = async function (src) {\n      var data = await fs.readFile(src);\n      return JSON.parse(data);\n    };\n  } else {\n    if (ENVIRONMENT_IS_WORKER) {\n      var tryImportScript = async function (src) {\n        importScripts(src); // async interface to importScripts from Web Worker\n      };\n    } else {\n      var tryImportScript = globalThis.tryImportScript;\n    }\n    var tryFetchJSON = async function (src) {\n      const response = await fetch(src);\n      return await response.json();\n    };\n  }\n\n  var EMCiao = {}; // Emscripten module for CIAOENGINE\n\n  var stdout = \"\";\n  var stderr = \"\";\n\n  var LLCiao = {};\n  LLCiao.emciao_initialized = false;\n  LLCiao.stats = {};   // Statistics\n  LLCiao.bundle = {};  // Bundle map\n  LLCiao.depends = []; // Bundle dependencies\n  LLCiao.root_URL = null; // URL for CIAOROOT (null when not initialized yet)\n\n  /* --------------------------------------------------------------------------- */\n\n  LLCiao.get_stats = function () { return LLCiao.stats; };\n\n  /* --------------------------------------------------------------------------- */\n\n  LLCiao.get_ciao_root = function () { return LLCiao.bundle['core'].wksp; };\n\n  function mkdir_noerr(path) {\n    let FS = LLCiao.getFS();\n    try { FS.mkdir(path); } catch (e) { /* ignore errors */ };\n  }\n\n  // Create directory path\n  function mkpath(path) {\n    var spath = path.split('/');\n    var len = spath.length;\n    var dir = \"\";\n    if (len > 0) {\n      dir += spath[0];\n      mkdir_noerr(dir);\n      for (var i = 1; i < len; i++) {\n        dir += \"/\" + spath[i];\n        mkdir_noerr(dir);\n      }\n    }\n  }\n\n  LLCiao.preload_file = function (dir, relpath) {\n    if (LLCiao.root_URL === null) throw new Error('null root_URL');\n    var srcurl = LLCiao.root_URL + relpath;\n    var srcdir = dir + '/' + relpath;\n    /* Split in dir and base */\n    var dirsplit = srcdir.split('/');\n    var base = dirsplit.pop();\n    var dir = dirsplit.join('/');\n    /* Create directory path for dir */\n    mkpath(dir);\n    /* Create preloaded file */\n    let FS = LLCiao.getFS();\n    //FS.createPreloadedFile(dir, base, srcurl, true, false);\n    FS.createPreloadedFile(dir, base, srcurl, true, true); // rw access\n    // TODO: only works in web workers, does not work in lpdoc example\n    // FS.createLazyFile(dir, base, srcurl, true, true); // rw access\n  };\n\n  async function maybeImportData(b_data, key) {\n    if (b_data.hasOwnProperty(key)) {\n      await tryImportScript(EMCiao.locateFile(b_data[key], ''));\n    }\n  }\n\n  LLCiao.preload_bundle = async function (b) {\n    // this loads *.mods.js\n    globalThis.__emciao = EMCiao;\n    const b_data = LLCiao.bundle[b];\n    if (b_data.hasOwnProperty('preload_files')) {\n      for (const rel_path of b_data.preload_files) {\n        LLCiao.preload_file(b_data.wksp, rel_path);\n      }\n    }\n    await Promise.all([maybeImportData(b_data, 'src_data'),\n    maybeImportData(b_data, 'mods_data')]);\n  };\n\n  LLCiao.collect_wksps = function () {\n    let wksps = [];\n    let seen = {};\n    for (const j of LLCiao.depends) {\n      var wksp = LLCiao.bundle[j].wksp;\n      if (!seen[wksp]) {\n        wksps.unshift(wksp); /* right order? */\n        seen[wksp] = true;\n      }\n    }\n    return wksps;\n  };\n\n  // Update timestamps of build/cache files\n  // TODO: needs around 8ms\n  // TODO: allow frozen workspaces in c_itf, inhibits recompilation!\n  // TODO: update needed for dynamic use_bundle?\n  LLCiao.update_timestamps = function (wksps) {\n    let FS = LLCiao.getFS();\n    var tsnow = Date.now();\n    for (const wksp of wksps) {\n      const dir = wksp + \"/build/cache\";\n      for (const f of FS.readdir(dir)) {\n        if (f.endsWith('.po') || f.endsWith('.itf')) {\n          const path = dir + \"/\" + f;\n          // const timestamp = FS.lookupPath(path).node.timestamp;\n          FS.utime(path, tsnow, tsnow);\n        }\n      }\n    }\n  };\n\n  // Mount a directory (only for NodeJS)\n  LLCiao.mount_dir = function (srcdir, dstdir) {\n    mkpath(dstdir);\n    var FS = LLCiao.getFS();\n    FS.mount(FS.filesystems.NODEFS, { root: srcdir }, dstdir);\n  };\n\n  // Pending loads\n  var pending_load = false;\n  var pending_load_resolve = undefined;\n\n  /* Suspend until all use_bundle has been completed */\n  LLCiao.wait_no_deps = function () {\n    return new Promise((resolve, reject) => { // TODO: 'reject' ignored\n      if (pending_load) {\n        if (pending_load_resolve !== undefined) { throw new Error('unresolved pending load'); };\n        pending_load_resolve = (function () { resolve(true); }); // called from monitor_deps when done\n      } else { /* there were no pending loads */\n        resolve(true);\n      }\n    });\n  };\n\n  function monitor_deps(numdeps) {\n    if (numdeps == 0) { // no more pending loads, notify if needed\n      if (pending_load_resolve !== undefined) {\n        pending_load_resolve();\n        pending_load_resolve = undefined;\n      }\n      pending_load = false; // no pending loads\n    }\n  }\n  LLCiao.use_bundle = async function (bundle) {\n    if (!ENVIRONMENT_IS_NODE) console.log(`{loading bundle '${bundle}'}`);\n    // Read and store .bundle.json metadata (see grade_wasm.pl)\n    const b_data = await tryFetchJSON(LLCiao.root_URL + \"build/dist/\" + bundle + \".bundle.json\");\n    if (!LLCiao.depends) LLCiao.depends = [];\n    LLCiao.depends.push(b_data.name);\n    LLCiao.bundle[b_data.name] = b_data;\n    // Initiate load if possible\n    if (LLCiao.emciao_initialized) { /* (preRun has already been called, preload here) */\n      pending_load = true; // at least one pending load\n      await LLCiao.preload_bundle(bundle);\n    }\n    return true;\n  }\n\n  /* --------------------------------------------------------------------------- */\n  /* Initialization */\n\n  /** \n   * `CIAOENGINE` is the Emscripten/WASM compiled engine (very low\n   * level). It is loaded dynamically from `eng` (e.g.,\n   * `ciaoengwasm`).\n   */\n\n  LLCiao.eng_load = async function (url, eng) {\n    LLCiao.root_URL = url;\n    /* Load CIAOENGINE (generated from emcc) */\n    if (!ENVIRONMENT_IS_NODE) console.log(`{loading engine '${eng}'}`);\n    await tryImportScript(LLCiao.root_URL + \"build/bin/\" + eng + \".js\");\n    return true;\n  };\n\n  LLCiao.init_emciao = function () {\n    return new Promise((resolve, reject) => { // TODO: 'reject' ignored\n      LLCiao.init_emciao_(resolve);\n    });\n  };\n  LLCiao.init_emciao_ = function (resolve) {\n    /* Start the engine with hooks for initialization */\n    EMCiao['locateFile'] = function (path, prefix) {\n      // custom dirs\n      let root_URL = LLCiao.root_URL;\n      if (root_URL === null) throw new Error('null root_URL');\n      if (path.endsWith(\".mem\")) return root_URL + \"build/bin/\" + path;\n      if (path.endsWith(\".wasm\")) return root_URL + \"build/bin/\" + path;\n      if (path.endsWith(\".src.data\")) return root_URL + \"build/dist/\" + path;\n      if (path.endsWith(\".src.js\")) return root_URL + \"build/dist/\" + path;\n      if (path.endsWith(\".mods.data\")) return root_URL + \"build/dist/\" + path;\n      if (path.endsWith(\".mods.js\")) return root_URL + \"build/dist/\" + path;\n      // otherwise, use the default, the prefix (JS file's dir) + the path\n      return prefix + path;\n    };\n    // Collect workspaces from dependencies\n    let wksps = LLCiao.collect_wksps();\n    // Capture stdout and stderr\n    EMCiao.print = function (out) {\n      stdout += out + \"\\n\";\n    };\n    EMCiao.printErr = function (err) {\n      stderr += err + \"\\n\";\n    };\n    // continue using code after run()\n    EMCiao.noExitRuntime = true;\n    // preRun (setup environment before run())\n    EMCiao.preRun = [];\n    EMCiao.preRun.push(function () {\n      // ('pre-js.js' intializes EMCiao['FS'] and EMCiao['getENV'])\n      // Monitor run dependencies\n      EMCiao['monitorRunDependencies'] = monitor_deps;\n      // Preload bundle files (if needed)\n      for (const b of LLCiao.depends) {\n        // annotate asynchronous preload_bundle termination as run dependencies for emscripten\n        var dep = \"preload bundle \" + b;\n        EMCiao['addRunDependency'](dep);\n        LLCiao.preload_bundle(b).then((result) => {\n          EMCiao['removeRunDependency'](dep);\n        });\n      }\n      // Preload bootfile so that it is accessible from the FS\n      LLCiao.preload_file(LLCiao.get_ciao_root(), \"build/bin/\" + LLCiao.bootfile); /* TODO: customize */\n      /* Set CIAOPATH from bundles */\n      (EMCiao.getENV())['CIAOPATH'] = wksps.join(\":\");\n    });\n    // \n    EMCiao.onRuntimeInitialized = function () {\n      LLCiao.update_timestamps(wksps);\n      //\n      var bootfile = LLCiao.get_ciao_root() + \"/build/bin/\" + LLCiao.bootfile;\n      let bootfile_ptr = EMCiao.stringToNewUTF8(bootfile);\n      EMCiao._ciaowasm_init(bootfile_ptr);\n      EMCiao._free(bootfile_ptr);\n      /* Boot the engine, which will execute main/0 and exit with a live runtime */\n      EMCiao._ciaowasm_boot();\n      /* (Continue) */\n      LLCiao.emciao_initialized = true;\n      resolve(null);\n    };\n    /* Begin execution of Emscripten (wasm) compiled engine */\n    if (!ENVIRONMENT_IS_NODE) console.log(`{booting engine}`);\n    globalThis.CIAOENGINE.run(EMCiao);\n  };\n\n  /* --------------------------------------------------------------------------- */\n\n  LLCiao.bootfile = 'ciaowasm';\n\n  /* Begin new query. See ciaowasm:query_one_fs/0 */\n  LLCiao.query_one_begin = function (goal) {\n    var query;\n    query = 'q((' + goal + ')).';\n    let FS = LLCiao.getFS();\n    FS.writeFile('/.q-i', query, { encoding: 'utf8' });\n    let q_ptr = EMCiao.stringToNewUTF8(\"ciaowasm:query_one_fs\");\n    EMCiao._ciaowasm_query_begin(q_ptr);\n    EMCiao._free(q_ptr);\n    return query_result();\n  };\n\n  /* Obtain next solution */\n  LLCiao.query_one_next = function () {\n    EMCiao._ciaowasm_query_next();\n    return query_result();\n  };\n\n  /* Resume query */\n  LLCiao.query_one_resume = function () {\n    EMCiao._ciaowasm_query_resume();\n    return query_result();\n  };\n\n  /* End query */\n  LLCiao.query_end = function () {\n    EMCiao._ciaowasm_query_end();\n  }\n\n  function recv_jscmd() {\n    let str;\n    let cmd;\n    let FS = LLCiao.getFS();\n    try {\n      str = FS.readFile('/.j-c', { encoding: 'utf8' });\n      FS.unlink('/.j-c');\n    } catch (err) {\n      return null;\n    }\n    return JSON.parse(str);\n  }\n\n  function query_result() {\n    let is_ok = EMCiao._ciaowasm_query_ok();\n    if (is_ok) {\n      let is_suspended = EMCiao._ciaowasm_query_suspended();\n      if (is_suspended) {\n        let cmd = recv_jscmd(); // null if none\n        // special case for debugger\n        if (cmd !== null && cmd.cmd === 'acall' && cmd.name === '$dbgtrace_get_line') {\n          return { cont: 'dbgtrace', arg: null };\n        }\n        return { cont: 'suspended', arg: cmd };\n      } else {\n        let FS = LLCiao.getFS();\n        let cont = FS.readFile('/.q-c', { encoding: 'utf8' });\n        let arg = FS.readFile('/.q-a', { encoding: 'utf8' });\n        return { cont: cont, arg: arg };\n      }\n    } else {\n      return { cont: 'failed', arg: '' };\n    }\n  }\n\n  /* --------------------------------------------------------------------------- */\n\n  /* Get Emscripten FS */\n  LLCiao.getFS = function () { return EMCiao['FS']; };\n\n  LLCiao.read_stdout = function () {\n    var out = stdout.replaceAll(\"\\n$$$fake_flush$$$\\n\", \"\"); /* TODO: see ciaowasm.pl for details about this horrible workaround */\n    stdout = \"\";\n    return out;\n  };\n  LLCiao.read_stderr = function () {\n    var err = stderr.replaceAll(\"\\n$$$fake_flush$$$\\n\", \"\"); /* TODO: see ciaowasm.pl for details about this horrible workaround */\n    stderr = \"\";\n    return err;\n  };\n\n  LLCiao.writeFile = function (a, b) {\n    try {\n      return LLCiao.getFS().writeFile(a, b, { encoding: 'utf8' });\n    } catch (err) {\n      return null;\n    }\n  };\n  LLCiao.readFile = function (a) {\n    try {\n      return LLCiao.getFS().readFile(a, { encoding: 'utf8' });\n    } catch (err) {\n      return null;\n    }\n  };\n\n  /* --------------------------------------------------------------------------- */\n\n  LLCiao.send_jsret = function (x) {\n    if (x === undefined) return true;\n    try {\n      let str = JSON.stringify(x);\n      return LLCiao.getFS().writeFile('/.j-o', str, { encoding: 'utf8' });\n    } catch (err) {\n      return null;\n    }\n  }\n\n  // sync\n  var f = {};\n  f['get_stats'] = true;\n  f['get_ciao_root'] = true;\n  f['writeFile'] = true;\n  f['readFile'] = true;\n  f['read_stdout'] = true;\n  f['read_stderr'] = true;\n  f['send_jsret'] = true;\n  f['query_one_begin'] = true;\n  f['query_one_resume'] = true;\n  f['query_one_next'] = true;\n  f['query_end'] = true;\n  // async\n  var af = {};\n  af['eng_load'] = true;\n  af['init_emciao'] = true;\n  af['wait_no_deps'] = true;\n  af['use_bundle'] = true;\n\n  LLCiao.run_cmd = async function (cmd, args) {\n    if (af.hasOwnProperty(cmd)) { // async\n      return LLCiao[cmd].apply(undefined, args);\n    } else if (f.hasOwnProperty(cmd)) { // sync\n      return new Promise((resolve, reject) => { // TODO: 'reject' ignored\n        resolve(LLCiao[cmd].apply(undefined, args));\n      });\n    } else {\n      throw new Error(\"unknown cmd \" + cmd);\n    }\n  };\n\n  /* --------------------------------------------------------------------------- */\n\n  return LLCiao;\n}\n\n// TODO: make Web Worker optional\nfunction ciao_worker_fun() {\n  var __ciao = new_LLCiao();\n  this.onmessage = function (event) {\n    var resolve = (function (x) { postMessage({ id: event.data.id, ret: x }); });\n    __ciao.run_cmd(event.data.cmd, event.data.args).then(resolve);\n  };\n  /* connect with browser console */\n  console = self.console; /* TODO: keep only in debug? */\n}\n// Note: use data-URI as an alternative \"data:application/x-javascript;base64,\"+...\nfunction ciao_worker_url() {\n  let code = new_LLCiao.toString();\n  let worker_code = ciao_worker_fun.toString();\n  worker_code = worker_code.slice(worker_code.indexOf(\"{\") + 1, worker_code.lastIndexOf(\"}\"));\n  code += \"\\n\" + worker_code; // get body (vars need to be global)\n  const blob = new Blob([code], { type: 'text/javascript' });\n  return URL.createObjectURL(blob);\n}\n\n/* =========================================================================== */\n\n//var use_webworker = false;\nvar use_webworker = true;\n\n/**\n * `CiaoWorker`: High level interface, schedules JS<->Prolog\n * interaction, has (optional) Web Worker support (CiaoPromiseProxy).\n */\nclass CiaoWorker {\n  constructor(root_URL) {\n    this.eng_loaded = false;\n    this.eng_booted = false;\n    this.root_URL = root_URL;\n    //\n    if (use_webworker) {\n      var listeners = [];\n      this.listeners = listeners;\n      this.w = new Worker(ciao_worker_url());\n      this.w.onmessage = function (event) {\n        listeners[event.data.id].setValue(event.data.ret);\n        delete listeners[event.data.id]; /* undefine this array element */\n      };\n    } else {\n      this.llciao = new_LLCiao();\n    }\n  }\n\n  /**\n   * Perform a request to `this.w` (the worker running the Ciao\n   * engine). It creates and returns a CiaoPromiseProxy, whose value\n   * is set on completion.\n   */\n  #async_(cmd, args) {\n    if (use_webworker) {\n      var proxy = new CiaoPromiseProxy();\n      /* set in listeners (get next free id or push) */\n      var id = 0;\n      for (var id = 0; id < this.listeners.length; id++) {\n        if (this.listeners[id] === undefined) break;\n      }\n      if (id === this.listeners.length) {\n        this.listeners.push(proxy);\n      } else {\n        this.listeners[id] = proxy;\n      }\n      this.w.postMessage({\n        id: id, /* id of message in listener array */\n        cmd: cmd,\n        args: args\n      });\n      return proxy;\n    } else {\n      return this.llciao.run_cmd(cmd, args);\n    }\n  }\n\n  /**\n   * Ensure that Ciao is initialized. Level can be:\n   *   1: engine loaded\n   *   2: engine loaded and booted\n   */\n  async ensure_init(level) {\n    if (this.pending_level >= level) return;\n    this.pending_level = level;\n    if (level >= 1 && !this.eng_loaded) {\n      this.eng_loaded = true;\n      var url = this.root_URL;\n      // (hack to get absolute url)\n      if (use_webworker) {\n        let a = document.createElement('a');\n        a.href = url;\n        url = a.href; // TODO: needs to be absolute due to importScripts from Web Worker\n      }\n      await this.#async_('eng_load', [url, \"ciaoengwasm\"]);\n    }\n    if (level >= 2 && !this.eng_booted) {\n      this.eng_booted = true;\n      await this.#async_('init_emciao', []);\n    }\n  }\n\n  /**\n   * Use the bundle passed as a parameter, loading the engine if needed.\n   * @param {string} name - Name of the bundle. \n   */\n  async use_bundle(name) {\n    await this.ensure_init(1);\n    return await this.#async_('use_bundle', [name]);\n  };\n\n  async wait_no_deps() {\n    await this.ensure_init(1);\n    return await this.#async_('wait_no_deps', []);\n  }\n\n  /**\n   * Get the stats of the latest call.\n   */\n  async get_stats() {\n    await this.ensure_init(1);\n    return await this.#async_('get_stats', []);\n  };\n\n  /**\n   * Get the Ciao root path.\n   */\n  async get_ciao_root() {\n    await this.ensure_init(1);\n    return await this.#async_('get_ciao_root', []);\n  };\n\n  /**\n   * Begins the query passed as parameter and obtains one solution. The\n   * decision tree stays awake and waits for user's input.\n   * @param {string} goal - Query to be launched.\n   */\n  async query_one_begin(goal) {\n    console.log('Query sent: ', goal);\n    await this.ensure_init(2);\n    let q_out = await this.#async_('query_one_begin', [goal]);\n    return await this.#query_complete(q_out);\n  }\n\n  /**\n   * Obtain the next solution for the query previously launched.\n   */\n  async query_one_next() {\n    let q_out = await this.#async_('query_one_next', []);\n    return await this.#query_complete(q_out);\n  }\n\n  /** Resume query until completed (not suspended). Process jscmd if needed\n   */\n  async #query_complete(q_out) {\n    while (q_out.cont === 'suspended') {\n      let cmd = q_out.arg;\n      if (cmd !== null) { /* run cmd if needed */\n        let ret = await jscmd_run(this, cmd);\n        await this.#async_('send_jsret', [ret]);\n      }\n      q_out = await this.#async_('query_one_resume', []);\n    }\n    return q_out;\n  }\n\n  /** Resume a query suspended in dbgtrace\n   */\n  async query_resume_dbgtrace(dbgcmd) {\n    /* pre: previous q_out.cont === 'dbgtrace' */\n    await this.#async_('send_jsret', [dbgcmd]);\n    let q_out = await this.#async_('query_one_resume', []);\n    return await this.#query_complete(q_out);\n  }\n\n  /**\n   * End the query.\n   */\n  async query_end() { return await this.#async_('query_end', []); }\n\n  /**\n   * Read file specified in path parameter.\n   * @param {string} path - Path of the file to read.\n   */\n  async readFile(path) {\n    await this.ensure_init(2);\n    return await this.#async_('readFile', [path]);\n  };\n\n  /**\n   * Write a string in a file.\n   * @param {string} path - Path of the file to write.\n   * @param {string} contents - String of the contents to write in the file.\n   */\n  async writeFile(path, contents) {\n    await this.ensure_init(2);\n    return await this.#async_('writeFile', [path, contents]);\n  };\n\n  /**\n   * Capture the stdout of the most recent query.\n   */\n  async read_stdout() { return await this.#async_('read_stdout', []); };\n\n  /**\n   * Capture the stderr of the most recent query.\n   */\n  async read_stderr() { return await this.#async_('read_stderr', []); };\n\n  /**\n   * Terminate the worker `w`\n   */\n  terminate() {\n    if (use_webworker) {\n      return this.w.terminate();\n    } else {\n      throw new Error('terminate needs Web Worker');\n    }\n  }\n}\n\n/* =========================================================================== */\n/* JS reference table */\n\n// This table is used to assign unique indices to JS objects passed to\n// a CiaoWorker.\n//\n// TODO:\n//  - indices are reused but the heap table is not compacted\n//  - use 'externref' [1] to simplify gluecode? (does it work from\n//    workers?)\n//  - foreign GC needed to do jsref_free automatically\n//\n// [1] https://github.com/WebAssembly/reference-types/blob/master/proposals/reference-types/Overview.md\n\n/* The index->obj table (global and shared) */\nvar jsref_heap = []; // index->obj table\nvar jsref_freeidx = []; // free indices in the heap table (holes)\n\n// Allocate a slot for `obj` and return its index\nfunction jsref_alloc(obj) {\n  if (jsref_freeidx.length != 0) { // reuse a free idx\n    let idx = jsref_freeidx.pop();\n    jsref_heap[idx] = obj;\n    return idx;\n  } else { // alloc a new idx\n    return jsref_heap.push(obj) - 1; // index\n  }\n}\n\n// Free the slot `idx`\nfunction jsref_free(idx) {\n  jsref_freeidx.push(idx); // add to the free pool\n  jsref_heap[idx] = null; // remove\n}\n\nfunction jsref_obj(idx) {\n  return jsref_heap[idx];\n}\n\n/* =========================================================================== */\n/* JS command buffer */\n\n// JS command buffer is a JSON encoded list of commands.\n//  \n// Instructions are objects such that:\n//\n//   i.cmd==\"def\": assigns code i.code for function i.name at jscmd_f\n//   i.cmd==\"call\": call function i.name with arguments i.args\n//   i.cmd==\"acall\": await call function i.name with arguments i.args\n\n// TODO: simplify this part using reference types\n//   https://github.com/WebAssembly/reference-types/blob/master/proposals/reference-types/Overview.md\n\n/* JS function table (global and shared) */\nvar jscmd_f = {};\n\n/* Execute jscmd */\nasync function jscmd_run(w, jscmd) {\n  let ret;\n  switch (jscmd.cmd) {\n    case 'def': /* define function */\n      jscmd_f[jscmd.name] = Function('\"use strict\";return (' + jscmd.code + ')')();\n      return null; /* TODO: provide id? */\n    case 'call':\n      jscmd.args.unshift(w); // worker as 1st argument\n      return jscmd_f[jscmd.name].apply(undefined, jscmd.args);\n    case 'acall':\n      jscmd.args.unshift(w); // worker as 1st argument\n      return await jscmd_f[jscmd.name].apply(undefined, jscmd.args);\n    default:\n      console.log('error: unknown jscmd: ' + jscmd);\n  }\n}\n\n/* =========================================================================== */\n/**\n * `ToplevelProc`: toplevel (REPL) process\n */\n\n// TODO: move more code to Prolog (this reimplements part of\n//   toplevel.pl due to problems with blocking IO in\n//   WASM/JS). Suspendable IO on wasm level would allow sharing more\n//   code here.\n\nconst toplevelCfg_defaults = {\n  // Show statistics (and some logging info) per query (in the JS console)\n  statistics: true,\n  // Query timeout (seconds) (0 to disable)\n  query_timeout: 200,\n  // Special queries // TODO: missing arity\n  special_query: {\n    \"use_module\": { read_code: true, mark_errs: true },\n    \"run_tests_in_module\": {\n      read_code: true,\n      mark_errs: true,\n      depends: ['ciaodbg'],\n      on_init: [\"use_module(library(unittest))\"]\n    },\n    //    \"clean_mods\": {\n    //      on_init: ['use_module(ciaobld(ciaoc_batch_call), [clean_mods/1])']\n    //    },\n    \"doc_cmd\": {\n      read_code: true,\n      mark_errs: true,\n      depends: ['lpdoc'],\n      on_init: ['use_module(lpdoc(docmaker))']\n    },\n    //\n    \"set_menu_flag\": { // arity {3}\n      read_code: false,\n      mark_errs: false,\n      depends: ['ciaopp', 'typeslib'],\n      on_init: [\"use_module(ciaopp(ciaopp))\"]\n    },\n    \"module\": {\n      read_code: true,\n      mark_errs: true,\n      depends: ['ciaopp', 'typeslib'],\n      on_init: [\"use_module(ciaopp(ciaopp))\"]\n    },\n    \"auto_analyze\": { // arity {1,2}\n      read_code: true,\n      mark_errs: true,\n      depends: ['ciaopp', 'typeslib'],\n      on_init: [\"use_module(ciaopp(ciaopp))\"]\n    },\n    \"auto_optimize\": { // arity {1,2}\n      read_code: true,\n      mark_errs: true,\n      depends: ['ciaopp', 'typeslib'],\n      on_init: [\"use_module(ciaopp(ciaopp))\"]\n    },\n    \"auto_check_assert\": { // arity {1,2}\n      read_code: true,\n      mark_errs: true,\n      depends: ['ciaopp', 'typeslib'],\n      on_init: [\"use_module(ciaopp(ciaopp))\"]\n    },\n    \"filter_analyze\": { // arity {1,2}\n      read_code: true,\n      mark_errs: true,\n      depends: ['ciaopp', 'typeslib', 'exfilter'],\n      on_init: [\"use_module(exfilter(exfilter))\"]\n    },\n    \"filter_analyze_exercise_mode\": { // arity {1,2}\n      read_code: true,\n      mark_errs: true,\n      depends: ['ciaopp', 'typeslib', 'exfilter'],\n      on_init: [\"use_module(exfilter(exfilter))\"]\n    }\n  },\n  // Default bundles and initialization queries\n  init_bundles: [\n    'ciaowasm', // (for foreign-js)\n    'core',\n    'builder'\n  ],\n  init_queries: [\n    'use_module(engine(internals), [reload_bundleregs/0])',\n    'use_module(library(classic/classic_predicates))'\n  ],\n  // Query for loading code\n  //   toplevelCfg.custom_load_query = ((m) => ...);\n  // Transformation for user queries\n  //   toplevelCfg.custom_run_query = ((q) => ... );\n  // Post-print code (before update_inner_layout()) \n  //   toplevelCfg.custom_postprint_sol = (async (pg) => ...);\n};\n\nif (typeof toplevelCfg === 'undefined') { var toplevelCfg = {}; }\ntoplevelCfg = Object.assign({ ...toplevelCfg_defaults }, toplevelCfg);\n\nvar QueryState = {\n  READY: 0, // ready for a query\n  RUNNING: 1, // query running\n  VALIDATING: 2, // prompt waiting for validating solution\n  DBGTRACE: 3 // prompt in a debugging state\n};\n\nclass ToplevelProc {\n  constructor(root_URL) {\n    this.root_URL = root_URL;\n    this.w = null;\n    this.comint = null; // associated comint ('null' to ignore)\n    this.muted = false; // temporarily ignore comint // TODO: change comint instead?\n    this.state = null;\n    this.q_opts = {}; // running/validating query opts\n    this.timer = undefined;\n  }\n\n  /* ---------------------------------------------------------------------- */\n\n  /* Is the worker started? */\n  is_started() {\n    return (this.w !== null);\n  }\n\n  /* Start the worker (and load defaults, show prompt, load program) */\n  async start() {\n    if (!this.muted) this.comint.set_log('Loading bundles and booting');\n    this.w = new CiaoWorker(this.root_URL); // create a Ciao worker\n    await this.load_ciao_defaults(); // TODO: check result?\n    if (!this.muted) this.comint.set_log('');\n    //\n    this.update_state(QueryState.READY);\n    this.q_opts = {};\n    if (!this.muted) this.comint.display_status_new_prompt('silent');\n    await this.comint.pg.on_cproc_start();\n  }\n\n  /* Restart the worker */\n  async restart() {\n    this.shutdown();\n    this.update_state(QueryState.READY);\n    this.q_opts = {};\n    const pmuted = this.set_muted(true); // TODO: mute on restart, make it optional?\n    await this.start();\n    this.muted = pmuted;\n  }\n\n  /* Terminate worker */\n  shutdown() {\n    if (!this.is_started()) return;\n    this.w.terminate();\n    this.w = null;\n  }\n\n  /* Make sure that worker is started */\n  async ensure_started(comint) {\n    if (this.is_started()) return;\n    this.comint = comint; // attach to this comint\n    await this.start();\n  }\n\n  // set muted and return previous value\n  set_muted(v) {\n    const prev = this.muted;\n    this.muted = v;\n    return prev;\n  }\n\n  /* ---------------------------------------------------------------------- */\n\n  // Load the default bundles and modules\n  async load_ciao_defaults() {\n    // Use default bundles and show boot info (this starts the engine)\n    for (const b of toplevelCfg.init_bundles) {\n      await this.w.use_bundle(b);\n    }\n    // // TODO: parallel load does not speed up load\n    // await Promise.all(toplevelCfg.init_bundles.map(async (b) => { await this.w.use_bundle(b); }));\n    // Boot and show system info\n    {\n      this.w.curr_cproc = this; // TODO: simplify\n      await this.w.query_one_begin(\"'$:'('internals:$bootversion')\"); // TODO: check errors!\n      let out = await this.w.read_stdout();\n      let err = await this.w.read_stderr();\n      await this.w.query_end();\n      this.comint.pg.show_version(out + err);\n    }\n    // Initialization queries on the toplevel\n    for (const q of toplevelCfg.init_queries) {\n      await this.muted_query_dumpout(q);\n    }\n    return true;\n  }\n\n  // Add (and execute) a new initialization query \n  async push_on_init(qs) {\n    const started = this.is_started();\n    for (const q of qs) {\n      if (!toplevelCfg.init_queries.includes(q)) {\n        toplevelCfg.init_queries.push(q);\n        if (started) await this.muted_query_dumpout(q);\n      }\n    }\n  }\n\n  // Add (and load) a new bundle dependency\n  async push_depends(bs) {\n    let updated = false;\n    const started = this.is_started();\n    for (const b of bs) {\n      if (!toplevelCfg.init_bundles.includes(b)) {\n        toplevelCfg.init_bundles.push(b);\n        if (started) await this.w.use_bundle(b); // load if already started\n        updated = true;\n      }\n    }\n    // if (started && updated) await this.restart(); // TODO: not needed now!\n    if (started && updated) {\n      await this.w.wait_no_deps(); /* wait until there are no pending loading deps */\n      await this.muted_query_dumpout('reload_bundleregs');\n    }\n  }\n\n  /* ---------------------------------------------------------------------- */\n\n  // Do a query, only one solution, dump stdout/stderr, \n  async muted_query_dumpout(q) {\n    if (toplevelCfg.statistics) console.log(`{implicit: ${q}}`);\n    this.w.curr_cproc = this; // TODO: simplify\n    await this.w.query_one_begin(q);\n    await this.dumpout(); // TODO: check errors!\n    await this.w.query_end();\n  }\n\n  // Dump last query stdout/stderr (ignore or show in console)\n  async dumpout() {\n    let out = await this.w.read_stdout();\n    let err = await this.w.read_stderr();\n    if (toplevelCfg.statistics) console.log(out + err);\n  }\n\n  /* ---------------------------------------------------------------------- */\n\n  set_query_timeout() {\n    if (toplevelCfg.query_timeout == 0) return; /* no timeout */\n    this.timer = setTimeout((async () => {\n      if (!this.muted) this.comint.print_msg('\\n{ABORTED: Time limit exceeded.}\\n');\n      await this.restart();\n      if (!this.muted) this.comint.display_status_new_prompt('silent'); /* amend prompt if needed */\n    }), toplevelCfg.query_timeout * 1000); /* set a timeout */\n  }\n  cancel_query_timeout() {\n    if (this.timer !== undefined) {\n      clearTimeout(this.timer);\n      this.timer = undefined;\n    }\n  }\n\n  /* ---------------------------------------------------------------------- */\n\n  // TODO: only works for single goal queries; this needs to be done\n  // at Prolog level with Prolog->JS communication\n\n  async trans_query(query) {\n    let treat_outerr = null;\n    // apply transformation if needed\n    if (toplevelCfg.custom_run_query !== undefined) {\n      query = toplevelCfg.custom_run_query(query);\n    }\n    // perform special query actions\n    let f_match = query.match(/([a-z][_a-zA-Z0-9]*)(?:\\(|$)/); // functor name // TODO: arity is missing, do from Prolog\n    if (f_match != null && f_match.length == 2) {\n      const special_query = toplevelCfg.special_query[f_match[1]];\n      if (special_query !== undefined) {\n        if (special_query.depends !== undefined) { // new (bundle) dependencies\n          await this.push_depends(special_query.depends);\n        }\n        if (special_query.on_init !== undefined) { // new initialization queries\n          await this.push_on_init(special_query.on_init);\n        }\n        if (special_query.read_code === true) { // the query may read the code, upload to worker\n          await this.comint.pg.upload_code_to_worker();\n        }\n        if (special_query.action !== undefined) { // replace auto_action\n          this.comint.pg.set_auto_action(special_query.action);\n        }\n        if (special_query.mark_errs === true) { // the query may show messages on the code, treat outerr\n          treat_outerr = async (out, err) => {\n            this.comint.pg.mark_errs(out, err); // TODO: missing matching file?\n          };\n        }\n      }\n    }\n    //\n    return { q: query, treat_outerr: treat_outerr };\n  }\n\n  /* ---------------------------------------------------------------------- */\n\n  update_state(state) {\n    this.state = state;\n    this.comint.update_inner_layout(); // (query state changed)\n  }\n\n  /* Alert if we are still running */\n  check_not_running() {\n    if (this.state === QueryState.RUNNING) {\n      alert('Already running a query');\n      return false;\n    }\n    return true;\n  }\n  /* Alert if we are locked validating/debugging in another comint */\n  check_not_locked(comint) {\n    if (this.comint !== comint) {\n      alert('Already validating/debugging a query in other comint');\n      return false;\n    }\n    return true;\n  }\n  /* Waiting for a line (validating query or debugging state) */\n  is_waiting_for_line() {\n    return (this.state === QueryState.VALIDATING || this.state === QueryState.DBGTRACE);\n  }\n\n  /**\n   * Execute a new query on the toplevel (Pre: this.state === QueryState.READY)\n   * @param {string} query - Query to be executed.\n   */\n  async run_query(comint, query, opts) {\n    if (this.state !== QueryState.READY) {\n      console.log('bug: already running or validating a query'); // TODO: treat_enter too fast?\n      return; // TODO: query is lost!\n    }\n    this.comint = comint; // attach to this comint\n    // ----\n    let tr = await this.trans_query(query);\n    query = tr.q;\n    // TODO: almost duplicated\n    this.update_state(QueryState.RUNNING);\n    this.q_opts = opts;\n    // begin a new query\n    if (!this.muted && opts.msg !== undefined) this.comint.set_log(opts.msg);\n    this.set_query_timeout();\n    this.w.curr_cproc = this; // TODO: simplify\n    let q_out = await this.w.query_one_begin(query);\n    this.cancel_query_timeout();\n    if (!this.muted && opts.msg !== undefined) this.comint.set_log('');\n    //\n    await this.treat_sol(q_out, tr.treat_outerr); // treat query result\n  }\n\n  /**\n   * Send a line command (`action`). This is used to validate\n   * solutions (if this.state === QueryState.VALIDATING) or send a\n   * debugger command (if this.state === QueryState.DBGTRACE)\n   */\n  async send_line(comint, action) {\n    this.comint = comint; // attach to this comint\n    if (this.state === QueryState.VALIDATING) {\n      if (action === '') { // accept solution, end query\n        this.w.curr_cproc = this; // TODO: simplify\n        await this.w.query_end();\n        this.update_state(QueryState.READY);\n        this.q_opts = {};\n        /*if (!this.muted)*/ this.comint.display_status_new_prompt('yes');\n      } else { // ask for the next solution\n        // TODO: almost duplicated\n        this.update_state(QueryState.RUNNING);\n        // next query solution\n        this.set_query_timeout();\n        this.w.curr_cproc = this; // TODO: simplify\n        let q_out = await this.w.query_one_next();\n        this.cancel_query_timeout();\n        //\n        await this.treat_sol(q_out, null); // treat query result\n      }\n    } else if (this.state === QueryState.DBGTRACE) {\n      this.update_state(QueryState.RUNNING);\n      // continue execution\n      this.set_query_timeout();\n      this.w.curr_cproc = this; // TODO: simplify\n      let q_out = await this.w.query_resume_dbgtrace(action);\n      this.cancel_query_timeout();\n      //\n      await this.treat_sol(q_out, null); // treat query result\n    } else {\n      console.log('bug: not in a validating/debugging solution state'); // TODO: treat_enter too fast?\n    }\n  }\n\n  /**\n   * If current query has a solution, print it and asks for more if\n   * there are more solutions available. If it has no solutions, finish\n   * the query.\n   * @param {Object} q_out - Object containing an array with the solution of a query.\n   */\n\n  async treat_sol(q_out, treat_outerr) {\n    let out = await this.w.read_stdout();\n    let err = await this.w.read_stderr();\n    /* print stdout and stderr output */\n    if (!this.muted) this.comint.print_out(out + err);\n    /* special case for debugger */\n    if (q_out.cont === 'dbgtrace') { // TODO: better way?\n      this.update_state(QueryState.DBGTRACE);\n      return;\n    }\n    /* print solution */\n    let solstatus;\n    if (q_out.cont === 'failed') { // no more solutions\n      solstatus = 'no';\n    } else {\n      // TODO: fixme, see toplevel.pl\n      /* Pretty print query results (solutions or errors) */\n      // (see ciaowasm.pl for possible cases)\n      if (q_out.cont === 'success') {\n        if (this.comint.with_prompt) { /* only if itr, otherwise ignore bindings and cut */\n          let prettysol = q_out.arg;\n          if (prettysol === '') { // (no bindings, cut)\n            solstatus = 'yes';\n          } else {\n            solstatus = '?'; // TODO: not always! detect when there are no choicepoints\n            if (!this.muted) this.comint.print_sol(prettysol); // print solution\n          }\n        }\n      } else if (q_out.cont === 'exception') { // TODO: horrible hack\n        let ball = q_out.arg;\n        if (!this.muted) this.comint.print_msg(`{ERROR: No handle found for thrown exception ${ball}}\\n`);\n        solstatus = 'aborted';\n      } else if (q_out.cont === 'malformed') {\n        solstatus = 'silent';\n        if (!this.muted) this.comint.print_msg('{SYNTAX ERROR: Malformed query}\\n');\n      } else {\n        solstatus = 'silent';\n        console.log(`bug: unrecognized query result cont: ${q_out.cont} ${q_out.arg}`);\n      }\n    }\n    const no_treat_outerr = this.q_opts.no_treat_outerr;\n    if (solstatus === '?') {\n      this.update_state(QueryState.VALIDATING);\n      if (!this.muted) this.comint.print_promptval();\n    } else {\n      await this.w.query_end();\n      this.update_state(QueryState.READY);\n      this.q_opts = {};\n      if (!this.muted) this.comint.display_status_new_prompt(solstatus);\n    }\n    if (treat_outerr !== null) {\n      if (no_treat_outerr !== true) {\n        await treat_outerr(out, err);\n      }\n    } else if (!this.muted) {\n      if (toplevelCfg.custom_postprint_sol !== undefined) {\n        // custom postprint if needed\n        await toplevelCfg.custom_postprint_sol(this.comint.pg);\n      }\n    }\n  }\n\n  /* ---------------------------------------------------------------------- */\n\n  /**\n   * Abort the execution of the current query (if inside of `run_query(query)`).\n   */\n  async abort() {\n    if (this.state === QueryState.RUNNING) {\n      this.cancel_query_timeout();\n      // print message\n      // if (!this.muted) this.comint.print_msg('\\n{ Execution aborted }\\n'); // (same text as Ciao)\n      if (!this.muted) this.comint.print_msg('\\n{ Execution aborted (resetting dynamic database) }\\n'); // TODO: remove note when preserving the database is working\n      // restart worker and update variables\n      // TODO: just abort query, not the worker\n      await this.restart();\n      if (!this.muted) this.comint.display_status_new_prompt('silent'); /* amend prompt if needed */\n    }\n  }\n}\n\n/* =========================================================================== */\n/**\n * Toplevel for execution under NodeJS\n */\n\n// TODO: with_prompt is not configurable yet\n// TODO: exit code is not returned\n\nvar ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string';\n\nif (ENVIRONMENT_IS_NODE) {\n  const path = require('path');\n  const process = require('process');\n\n  const printout = function (x) { process.stdout.write(x); };\n\n  // Locate site path relative to the script dir\n  var site_path = path.join(__dirname, '..');\n\n  // Simpler PGCell for RLComint\n  class RLPGCell {\n    constructor(cproc) {\n      this.cproc = cproc;\n    }\n    async setup(rl) {\n      // readline-based comint\n      this.comint = new RLComint(rl, this, {});\n      // start\n      await this.cproc.ensure_started(this.comint);\n    }\n    async on_cproc_start() {\n    }\n    show_version(str) {\n      this.cproc.comint.display(str);\n    }\n    async upload_code_to_worker() {\n    }\n    mark_errs(out, err) {\n    }\n    /* mark source debug info */\n    mark_srcdbg_info(info) {\n      this.comint.display(`         In ${info.src} (${info.ln0}-${info.ln1}) ${info.pred}-${info.num}\\n`);\n    }\n  }\n\n  class RLComint {\n    constructor(rl, pg, opts) {\n      this.prompt = '?- ';\n      this.promptval = ' ? ';\n\n      this.with_prompt = (opts.noprompt === true ? false : true); // interactive\n      this.pg = pg; // associated pgcell\n\n      this.rl = rl; // readline\n      this.next_prompt = ''; // prompt to be displayed (may contain solution)\n    }\n\n    update_inner_layout() { }\n    display(text) { process.stdout.write(text); }\n\n    print_out(str) { this.display(str); }\n    print_sol(str) { this.next_prompt = \"\\n\" + str; }\n    print_msg(str) { this.display(str); }\n\n    print_prompt() {\n      if (!this.with_prompt) return; /* (skip in non-interactive) */\n      this.next_prompt = this.prompt;\n    }\n    print_promptval() {\n      if (!this.with_prompt) return; /* (skip in non-interactive) */\n      this.next_prompt += this.promptval; // (assume that print_sol has been called)\n    }\n    display_status(str) { // toplevel:display_status/1\n      if (!this.with_prompt) return; /* (skip in non-interactive) */\n      if (str === 'silent') return; /* skip this status */\n      this.display('\\n');\n      this.display(str);\n      this.display('\\n');\n    }\n    display_status_new_prompt(str) { /* show status and a new prompt */\n      this.display_status(str);\n      this.print_prompt();\n    }\n    set_log(text) { }\n\n    // TODO: refactor with ciao_playground.js\n    async #treat_enter_(text) {\n      const cproc = this.pg.cproc;\n      if (cproc.is_waiting_for_line()) {\n        if (!cproc.check_not_locked(this)) return; // TODO: not possible?\n        await cproc.send_line(this, text);\n      } else {\n        // Perform query\n        if (text === '') {\n          this.print_prompt(); // show prompt again\n        } else {\n          if (text.slice(-1) !== '.') { // query is malformed\n            // TODO: accept multiline inputs?\n            this.display(`\\\n{SYNTAX ERROR: Malformed query. It must end with a period.}\n`);\n            this.display_status_new_prompt('silent');\n          } else {\n            let q = text.slice(0, -1);\n            await cproc.run_query(this, q, {});\n          }\n        }\n      }\n    }\n\n    /* Interaction loop */\n    async loop() {\n      const cproc = this.pg.cproc;\n      let q_prompt = this.prompt;\n      while (true) {\n        let text;\n        try {\n          text = await this.rl.question(q_prompt);\n        } catch (err) {\n          console.log('Err: ' + Err);\n          process.exit(1);\n        }\n        // TODO: do not capture 'halt.' here, set status from Prolog (so that exit code is properly notified)\n        if (text.slice(-1) === '.' && text.slice(0, -1) === \"halt\") {\n          break;\n        }\n        await this.#treat_enter_(text);\n        q_prompt = this.next_prompt;\n        this.next_prompt = \"\";\n      }\n    }\n  }\n\n  toplevelCfg.statistics = false;\n  use_webworker = false;\n\n  (async () => {\n    // Start a new toplevel and connect to a RLPGCell for interaction\n    const cproc = new ToplevelProc(site_path + '/ciao/');\n    var pg = new RLPGCell(cproc);\n    await pg.setup(rl);\n\n    // Mount current directory as /local\n    // TODO: customize\n    var currdir = process.cwd();\n    var dstdir = '/local';\n    cproc.w.llciao.mount_dir(currdir, dstdir);\n    // Change directory\n    // FS.chdir(dstdir); // TODO: FS.chdir does not seem to work, change from Prolog\n    await cproc.muted_query_dumpout(`working_directory(_,'${dstdir}')`);\n  });\n}\n\nexports.CiaoWorker = CiaoWorker;\n","import { CiaoWorker } from \"../core/js/ciao-prolog\";\n\nexport type cp_query = {\n    name: string,\n    args: cp_term[]\n}\n\nexport type QueryResponse = {\n    cont: string;\n    arg: string;\n}\n\n// Term - Atm, Num, String, Struct\nexport type cp_term =\n    | cp_atm\n    | cp_num\n    | cp_string\n    | cp_struct;\n\n// Integer\nexport type cp_int = {\n    tag: 'int';\n    value: number;\n};\n\n// Float\nexport type cp_flt = {\n    tag: 'flt';\n    value: number;\n};\n\n// Number\nexport type cp_num = cp_int | cp_flt;\n\n// Struct\nexport type cp_struct = {\n    tag: 'struct';\n    value: object;\n};\n\n// Atom\nexport type cp_atm = {\n    tag: 'atm';\n    value: string;\n};\n\n// String\nexport type cp_string = {\n    tag: 'string';\n    value: string;\n};\n\nexport type CiaoConfig = {\n    boot_path: string;\n    curr_dir: string;\n    init_bundles: string[];\n    cust_modules: string[];\n    cust_modules_path: string;\n    init_queries: string[];\n}\n\nexport class CiaoPrologInterface {\n    private c_config: CiaoConfig;\n    private c_worker: CiaoWorker;\n\n    constructor(curr_dir: string, bundles: string[], cust_modules: string[] = [], cust_modules_path?: string, boot_path?: string) {\n        this.c_config = {\n            boot_path: boot_path ?? './node_modules/@ciao-lang/ts-ciao-interface/dist/core/ciao/',\n            curr_dir: curr_dir,\n            init_bundles: bundles,\n            cust_modules: cust_modules,\n            cust_modules_path: cust_modules_path ?? 'src/ciao-modules/',\n            init_queries: [\n                'use_module(engine(internals), [reload_bundleregs/0])',\n                'use_module(library(classic/classic_predicates))'\n            ]\n        };\n\n        this.c_worker = new CiaoWorker(this.c_config.boot_path);\n    }\n\n    async ciao_init(dstdir: string): Promise<void> {\n        this.c_worker = new CiaoWorker(this.c_config.boot_path);\n        await this.c_worker.ensure_init(1); // ensure init\n        for (const bundle of this.c_config.init_bundles) await this.c_worker.use_bundle(bundle); // use bundles\n        for (const query of this.c_config.init_queries) await this.c_worker.query_one_begin(query); // init queries\n\n        // Mount current directory as dstdir\n        this.c_worker.llciao.mount_dir(this.c_config.curr_dir, dstdir);\n        await this.c_worker.query_one_begin(`working_directory(_,'${dstdir}')`);\n\n        // Use custom modules\n        for (const cust_module of this.c_config.cust_modules) await this.c_worker.query_one_begin(`use_module('${this.c_config.cust_modules_path}${cust_module}.pl')`); // use modules\n\n        console.log('Ciao worker initiated');\n    }\n\n    /* Helper functions for term creation */\n    ciao_mk_int(value: number): cp_int {\n        return this.ciao_term('int', value) as cp_int;\n    }\n    ciao_mk_flt(value: number): cp_flt {\n        return this.ciao_term('flt', value) as cp_flt;\n    }\n    ciao_mk_atm(value: string): cp_term {\n        return this.ciao_term('atm', value);\n    }\n    ciao_mk_string(value: string): cp_string {\n        return this.ciao_term('string', value) as cp_string;\n    }\n    ciao_mk_struct(name: string, args: cp_term[]): cp_term {\n        const value = { name: name }\n        for (let i = 0; i < args.length; i++) (value as any)[i] = args[i]\n        return this.ciao_term('struct', value);\n    }\n    ciao_mk_list<T>(items: T[]): cp_term {\n        return this.ciao_term('string', `[${items.toString()}]`);\n    }\n    ciao_mk_list_of_lists<T>(lists: T[][]): cp_term {\n        return this.ciao_term('string', `[${lists.map(list => this.ciao_mk_list<T>(list).value).toString()}]`);\n    }\n    ciao_mk_reg_type(type: cp_term['tag'], value: any): cp_term {\n        return this.ciao_term(type, value);\n    }\n    private ciao_term(type: cp_term['tag'], value: any): cp_term {\n        return { tag: type, value: value }\n    }\n\n    /* Term navigation */\n    ciao_get_int(term: cp_int): number {\n        return term.value;\n    }\n    ciao_get_flt(term: cp_flt): number {\n        return term.value;\n    }\n    ciao_get_atm(term: cp_atm): string {\n        return term.value;\n    }\n    ciao_get_string(term: cp_string): string {\n        return term.value;\n    }\n    ciao_get_struct(term: cp_struct): object {\n        return term.value;\n    }\n    ciao_get_list_from_string<T>(term: cp_string): T[] {\n        // TODO - Only works for number list - JSON communication\n        const array_start = term.value.indexOf('[');\n        const array = term.value.substring(array_start, term.value.length);\n        return JSON.parse(array);\n    }\n    ciao_get_list_of_lists_from_string<T>(term: cp_string): T[][] {\n        // TODO - Only works for number list - JSON communication\n        const array_start = term.value.indexOf('[');\n        const array = term.value.substring(array_start, term.value.length);\n        return JSON.parse(array);\n    }\n    ciao_get_reg_type(term: cp_term): any {\n        return term.value;\n    }\n\n    /* Term checks */\n    ciao_is_int(term: cp_term): boolean {\n        return this.ciao_is_type(term, 'int');\n    }\n    ciao_is_flt(term: cp_term): boolean {\n        return this.ciao_is_type(term, 'flt');\n    }\n    ciao_is_struct(term: cp_term): boolean {\n        return this.ciao_is_type(term, 'struct');\n    }\n    ciao_is_atm(term: cp_term): boolean {\n        return this.ciao_is_type(term, 'atm');\n    }\n    ciao_is_string(term: cp_term): boolean {\n        return this.ciao_is_type(term, 'string');\n    }\n    ciao_is_type(term: cp_term, type: string): boolean {\n        return term.tag === type;\n    }\n\n\n    /* Queries and calls */\n    async ciao_query_begin(query: cp_query): Promise<QueryResponse> {\n        const arg_values = query.args.map((term) => term.value); // getting values\n        const q: string = `${query.name}(${arg_values})`; // structuring query\n        return await this.c_worker.query_one_begin(q); // sending query\n    }\n\n    async ciao_query_next(): Promise<QueryResponse> {\n        return await this.c_worker.query_one_next(); // getting next solution\n    }\n\n    async ciao_query_end(): Promise<void> {\n        return await this.c_worker.query_end(); // ending query\n    }\n}","import * as fs from 'fs';\nimport BUILDER_FUNCTIONS from '../assets/builder_functions.json';\n\nexport type BuilderConfig = {\n    name: string,\n    input: {\n        name: string,\n        type: 'number' | 'number[]' | 'string'\n    }[],\n    output: {\n        type: string\n    }\n}\n\nexport class InterfaceBuilder {\n    constructor() { }\n\n    buildInterface(conf: BuilderConfig): void {\n        const filePath = `src/ciao-interfaces/${conf.name}.ts`;\n\n        // Create directory to hold interfaces\n        this.createDirectory();\n\n        // Import CiaoPrologInterface\n        fs.writeFileSync(filePath, `${BUILDER_FUNCTIONS[\"PLAIN-TEXT\"][\"IMPORT-CP\"]}\\n\\n`);\n\n        // Function declaration \n        fs.appendFileSync(filePath, `${this.formatHeader(conf)}\\n`);\n\n        // Input conversion from TypeScript to Ciao\n        fs.appendFileSync(filePath, `${this.formatInputs(conf.input)}\\n`);\n\n        // Build query\n        fs.appendFileSync(filePath, `${this.formatQuery(conf)}\\n`);\n\n        // Call Ciao\n        fs.appendFileSync(filePath, `\\t${BUILDER_FUNCTIONS[\"PLAIN-TEXT\"][\"CIAO-CALL\"]}\\n\\n`);\n\n        // Output conversion from Ciao to TypeScript\n        fs.appendFileSync(filePath, `${this.formatOutput(conf.output)}\\n`);\n\n        // Return result\n        fs.appendFileSync(filePath, `\\treturn res_ts;\\n}`);\n    }\n\n    private createDirectory() {\n        var dir = './src/ciao-interfaces';\n\n        if (!fs.existsSync(dir)) {\n            fs.mkdirSync(dir);\n        }\n    }\n\n    private formatHeader(conf: BuilderConfig): string {\n        let header = `export async function ${conf.name}(cp: CiaoPrologInterface`;\n        conf.input.forEach((param) => header = header.concat(`, ${param.name}: ${param.type}`));\n        header = header.concat(`): Promise<${conf.output.type}> {\\n`);\n        return header;\n    }\n\n    private formatInputs(input: BuilderConfig['input']): string {\n        let inputs = `\\t// Converting from TS to Prolog\\n`;\n\n        input.forEach(param => {\n            inputs = inputs.concat(`\\tconst ${param.name}_cp = cp.${BUILDER_FUNCTIONS[\"CIAO-TO-TS\"][param.type]}(${param.name});\\n`);\n        });\n        inputs = inputs.concat(`\\tconst varName_cp = cp.ciao_mk_string('Res');\\n`);\n\n        return inputs;\n    }\n\n    private formatQuery(conf: BuilderConfig): string {\n        const input = [...conf.input, { name: 'varName' }];\n\n        let query = `\\t// Building query\n        const query = {\n            name: '${conf.name}',\n            args: [${input.map(param => param.name + '_cp').toString()}]\n        };\\n`;\n\n        return query;\n    }\n\n    private formatOutput(output: BuilderConfig['output']): string {\n        let outputs =\n            `\\t// Converting from Prolog to TS \\n \\t${BUILDER_FUNCTIONS[\"PLAIN-TEXT\"][\"CIAO-GET-RESPONSE\"]}\\n`;\n\n        switch (output.type) {\n            case 'number[]':\n                outputs = outputs.concat(`\\tconst res_ts = cp.ciao_get_list_from_string<number>(res_cp);\\n`);\n                break;\n        }\n\n        return outputs;\n    }\n}\n\n","{\n    \"PLAIN-TEXT\": {\n        \"IMPORT-CP\": \"import { CiaoPrologInterface } from '@ciao-lang/ts-ciao-interface';\",\n        \"CIAO-CALL\": \"const res = await cp.ciao_query_begin(query);\",\n        \"CIAO-GET-RESPONSE\": \"const res_cp = cp.ciao_mk_string(res.arg);\"\n    },\n    \"CIAO-TO-TS\": {\n        \"number\": \"ciao_mk_flt\",\n        \"string\": \"ciao_mk_string\",\n        \"number[]\": \"ciao_mk_list\"\n    }\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAyBA,QAAM,mBAAN,MAAM,kBAAiB;AAAA;AAAA;AAAA;AAAA,MAIrB,cAAc;AACZ,aAAK,WAAW;AAChB,aAAK,QAAQ;AACb,aAAK,UAAU;AACf,aAAK,OAAO;AAAA,MACd;AAAA,MACA,SAAS,OAAO;AACd,YAAI,OAAO,KAAK,YAAY,YAAY;AACtC,cAAI,MAAM,KAAK,QAAQ,KAAK;AAC5B,cAAI,OAAO,QAAQ,aAAa;AAC9B,iBAAK,KAAK,SAAS,MAAS;AAAA,UAC9B,OAAO;AACL,gBAAI,OAAO,IAAI,SAAS,YAAY;AAClC,kBAAI,YAAY,KAAK;AACrB,kBAAI,KAAK,SAAU,GAAG;AACpB,0BAAU,SAAS,CAAC;AAAA,cACtB,CAAC;AAAA,YACH,OAAO;AACL,mBAAK,KAAK,SAAS,GAAG;AAAA,YACxB;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK,QAAQ;AACb,eAAK,WAAW;AAAA,QAClB;AAAA,MACF;AAAA;AAAA,MAEA,KAAK,SAAS;AACZ,YAAI,KAAK,aAAa,MAAM;AAC1B,cAAI,MAAM,QAAQ,KAAK,KAAK;AAC5B,cAAI,OAAO,IAAI,SAAS,YAAY;AAClC,mBAAO;AAAA,UACT,OAAO;AACL,mBAAO,kBAAiB,QAAQ,GAAG;AAAA,UACrC;AAAA,QACF,OAAO;AACL,cAAI,OAAO,IAAI,kBAAiB;AAChC,eAAK,OAAO;AACZ,eAAK,UAAU;AACf,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA,MAGA,OAAO,QAAQ,GAAG;AAChB,YAAI,IAAI,IAAI,kBAAiB;AAC7B,UAAE,SAAS,CAAC;AACZ,eAAO;AAAA,MACT;AAAA,IACF;AAYA,aAAS,aAAa;AACpB,UAAI,wBAAwB,OAAO,kBAAkB;AACrD,UAAIA,uBAAsB,OAAO,WAAW,YAAY,OAAO,QAAQ,YAAY,YAAY,OAAO,QAAQ,SAAS,QAAQ;AAE/H,UAAIA,sBAAqB;AACvB,cAAMC,MAAK,UAAQ,aAAa;AAChC,cAAM,KAAK,UAAQ,IAAI;AACvB,YAAI,kBAAkB,SAAgB,KAAK;AAAA;AACzC,mBAAO,UAAU;AACjB,mBAAO,YAAY;AACnB,mBAAO,kBAAkB;AAEzB,gBAAI,OAAO,MAAMA,IAAG,SAAS,GAAG;AAIhC,eAAG,iBAAiB,MAAM,EAAE,eAAe,OAAO,UAAU,IAAI,CAAC;AAAA,UACnE;AAAA;AACA,YAAI,eAAe,SAAgB,KAAK;AAAA;AACtC,gBAAI,OAAO,MAAMA,IAAG,SAAS,GAAG;AAChC,mBAAO,KAAK,MAAM,IAAI;AAAA,UACxB;AAAA;AAAA,MACF,OAAO;AACL,YAAI,uBAAuB;AACzB,cAAI,kBAAkB,SAAgB,KAAK;AAAA;AACzC,4BAAc,GAAG;AAAA,YACnB;AAAA;AAAA,QACF,OAAO;AACL,cAAI,kBAAkB,WAAW;AAAA,QACnC;AACA,YAAI,eAAe,SAAgB,KAAK;AAAA;AACtC,kBAAM,WAAW,MAAM,MAAM,GAAG;AAChC,mBAAO,MAAM,SAAS,KAAK;AAAA,UAC7B;AAAA;AAAA,MACF;AAEA,UAAI,SAAS,CAAC;AAEd,UAAI,SAAS;AACb,UAAI,SAAS;AAEb,UAAI,SAAS,CAAC;AACd,aAAO,qBAAqB;AAC5B,aAAO,QAAQ,CAAC;AAChB,aAAO,SAAS,CAAC;AACjB,aAAO,UAAU,CAAC;AAClB,aAAO,WAAW;AAIlB,aAAO,YAAY,WAAY;AAAE,eAAO,OAAO;AAAA,MAAO;AAItD,aAAO,gBAAgB,WAAY;AAAE,eAAO,OAAO,OAAO,MAAM,EAAE;AAAA,MAAM;AAExE,eAAS,YAAY,MAAM;AACzB,YAAI,KAAK,OAAO,MAAM;AACtB,YAAI;AAAE,aAAG,MAAM,IAAI;AAAA,QAAG,SAAS,GAAG;AAAA,QAAsB;AAAC;AAAA,MAC3D;AAGA,eAAS,OAAO,MAAM;AACpB,YAAI,QAAQ,KAAK,MAAM,GAAG;AAC1B,YAAI,MAAM,MAAM;AAChB,YAAI,MAAM;AACV,YAAI,MAAM,GAAG;AACX,iBAAO,MAAM,CAAC;AACd,sBAAY,GAAG;AACf,mBAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,mBAAO,MAAM,MAAM,CAAC;AACpB,wBAAY,GAAG;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAEA,aAAO,eAAe,SAAU,KAAK,SAAS;AAC5C,YAAI,OAAO,aAAa;AAAM,gBAAM,IAAI,MAAM,eAAe;AAC7D,YAAI,SAAS,OAAO,WAAW;AAC/B,YAAI,SAAS,MAAM,MAAM;AAEzB,YAAI,WAAW,OAAO,MAAM,GAAG;AAC/B,YAAI,OAAO,SAAS,IAAI;AACxB,YAAI,MAAM,SAAS,KAAK,GAAG;AAE3B,eAAO,GAAG;AAEV,YAAI,KAAK,OAAO,MAAM;AAEtB,WAAG,oBAAoB,KAAK,MAAM,QAAQ,MAAM,IAAI;AAAA,MAGtD;AAEA,eAAe,gBAAgB,QAAQ,KAAK;AAAA;AAC1C,cAAI,OAAO,eAAe,GAAG,GAAG;AAC9B,kBAAM,gBAAgB,OAAO,WAAW,OAAO,GAAG,GAAG,EAAE,CAAC;AAAA,UAC1D;AAAA,QACF;AAAA;AAEA,aAAO,iBAAiB,SAAgB,GAAG;AAAA;AAEzC,qBAAW,WAAW;AACtB,gBAAM,SAAS,OAAO,OAAO,CAAC;AAC9B,cAAI,OAAO,eAAe,eAAe,GAAG;AAC1C,uBAAW,YAAY,OAAO,eAAe;AAC3C,qBAAO,aAAa,OAAO,MAAM,QAAQ;AAAA,YAC3C;AAAA,UACF;AACA,gBAAM,QAAQ,IAAI;AAAA,YAAC,gBAAgB,QAAQ,UAAU;AAAA,YACrD,gBAAgB,QAAQ,WAAW;AAAA,UAAC,CAAC;AAAA,QACvC;AAAA;AAEA,aAAO,gBAAgB,WAAY;AACjC,YAAI,QAAQ,CAAC;AACb,YAAI,OAAO,CAAC;AACZ,mBAAW,KAAK,OAAO,SAAS;AAC9B,cAAI,OAAO,OAAO,OAAO,CAAC,EAAE;AAC5B,cAAI,CAAC,KAAK,IAAI,GAAG;AACf,kBAAM,QAAQ,IAAI;AAClB,iBAAK,IAAI,IAAI;AAAA,UACf;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAMA,aAAO,oBAAoB,SAAU,OAAO;AAC1C,YAAI,KAAK,OAAO,MAAM;AACtB,YAAI,QAAQ,KAAK,IAAI;AACrB,mBAAW,QAAQ,OAAO;AACxB,gBAAM,MAAM,OAAO;AACnB,qBAAWC,MAAK,GAAG,QAAQ,GAAG,GAAG;AAC/B,gBAAIA,GAAE,SAAS,KAAK,KAAKA,GAAE,SAAS,MAAM,GAAG;AAC3C,oBAAM,OAAO,MAAM,MAAMA;AAEzB,iBAAG,MAAM,MAAM,OAAO,KAAK;AAAA,YAC7B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,aAAO,YAAY,SAAU,QAAQ,QAAQ;AAC3C,eAAO,MAAM;AACb,YAAI,KAAK,OAAO,MAAM;AACtB,WAAG,MAAM,GAAG,YAAY,QAAQ,EAAE,MAAM,OAAO,GAAG,MAAM;AAAA,MAC1D;AAGA,UAAI,eAAe;AACnB,UAAI,uBAAuB;AAG3B,aAAO,eAAe,WAAY;AAChC,eAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,cAAI,cAAc;AAChB,gBAAI,yBAAyB,QAAW;AAAE,oBAAM,IAAI,MAAM,yBAAyB;AAAA,YAAG;AAAC;AACvF,mCAAwB,WAAY;AAAE,sBAAQ,IAAI;AAAA,YAAG;AAAA,UACvD,OAAO;AACL,oBAAQ,IAAI;AAAA,UACd;AAAA,QACF,CAAC;AAAA,MACH;AAEA,eAAS,aAAa,SAAS;AAC7B,YAAI,WAAW,GAAG;AAChB,cAAI,yBAAyB,QAAW;AACtC,iCAAqB;AACrB,mCAAuB;AAAA,UACzB;AACA,yBAAe;AAAA,QACjB;AAAA,MACF;AACA,aAAO,aAAa,SAAgB,QAAQ;AAAA;AAC1C,cAAI,CAACF;AAAqB,oBAAQ,IAAI,oBAAoB,MAAM,IAAI;AAEpE,gBAAM,SAAS,MAAM,aAAa,OAAO,WAAW,gBAAgB,SAAS,cAAc;AAC3F,cAAI,CAAC,OAAO;AAAS,mBAAO,UAAU,CAAC;AACvC,iBAAO,QAAQ,KAAK,OAAO,IAAI;AAC/B,iBAAO,OAAO,OAAO,IAAI,IAAI;AAE7B,cAAI,OAAO,oBAAoB;AAC7B,2BAAe;AACf,kBAAM,OAAO,eAAe,MAAM;AAAA,UACpC;AACA,iBAAO;AAAA,QACT;AAAA;AAWA,aAAO,WAAW,SAAgB,KAAK,KAAK;AAAA;AAC1C,iBAAO,WAAW;AAElB,cAAI,CAACA;AAAqB,oBAAQ,IAAI,oBAAoB,GAAG,IAAI;AACjE,gBAAM,gBAAgB,OAAO,WAAW,eAAe,MAAM,KAAK;AAClE,iBAAO;AAAA,QACT;AAAA;AAEA,aAAO,cAAc,WAAY;AAC/B,eAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,iBAAO,aAAa,OAAO;AAAA,QAC7B,CAAC;AAAA,MACH;AACA,aAAO,eAAe,SAAU,SAAS;AAEvC,eAAO,YAAY,IAAI,SAAU,MAAM,QAAQ;AAE7C,cAAI,WAAW,OAAO;AACtB,cAAI,aAAa;AAAM,kBAAM,IAAI,MAAM,eAAe;AACtD,cAAI,KAAK,SAAS,MAAM;AAAG,mBAAO,WAAW,eAAe;AAC5D,cAAI,KAAK,SAAS,OAAO;AAAG,mBAAO,WAAW,eAAe;AAC7D,cAAI,KAAK,SAAS,WAAW;AAAG,mBAAO,WAAW,gBAAgB;AAClE,cAAI,KAAK,SAAS,SAAS;AAAG,mBAAO,WAAW,gBAAgB;AAChE,cAAI,KAAK,SAAS,YAAY;AAAG,mBAAO,WAAW,gBAAgB;AACnE,cAAI,KAAK,SAAS,UAAU;AAAG,mBAAO,WAAW,gBAAgB;AAEjE,iBAAO,SAAS;AAAA,QAClB;AAEA,YAAI,QAAQ,OAAO,cAAc;AAEjC,eAAO,QAAQ,SAAU,KAAK;AAC5B,oBAAU,MAAM;AAAA,QAClB;AACA,eAAO,WAAW,SAAU,KAAK;AAC/B,oBAAU,MAAM;AAAA,QAClB;AAEA,eAAO,gBAAgB;AAEvB,eAAO,SAAS,CAAC;AACjB,eAAO,OAAO,KAAK,WAAY;AAG7B,iBAAO,wBAAwB,IAAI;AAEnC,qBAAW,KAAK,OAAO,SAAS;AAE9B,gBAAI,MAAM,oBAAoB;AAC9B,mBAAO,kBAAkB,EAAE,GAAG;AAC9B,mBAAO,eAAe,CAAC,EAAE,KAAK,CAAC,WAAW;AACxC,qBAAO,qBAAqB,EAAE,GAAG;AAAA,YACnC,CAAC;AAAA,UACH;AAEA,iBAAO,aAAa,OAAO,cAAc,GAAG,eAAe,OAAO,QAAQ;AAE1E,UAAC,OAAO,OAAO,EAAG,UAAU,IAAI,MAAM,KAAK,GAAG;AAAA,QAChD,CAAC;AAED,eAAO,uBAAuB,WAAY;AACxC,iBAAO,kBAAkB,KAAK;AAE9B,cAAI,WAAW,OAAO,cAAc,IAAI,gBAAgB,OAAO;AAC/D,cAAI,eAAe,OAAO,gBAAgB,QAAQ;AAClD,iBAAO,eAAe,YAAY;AAClC,iBAAO,MAAM,YAAY;AAEzB,iBAAO,eAAe;AAEtB,iBAAO,qBAAqB;AAC5B,kBAAQ,IAAI;AAAA,QACd;AAEA,YAAI,CAACA;AAAqB,kBAAQ,IAAI,kBAAkB;AACxD,mBAAW,WAAW,IAAI,MAAM;AAAA,MAClC;AAIA,aAAO,WAAW;AAGlB,aAAO,kBAAkB,SAAU,MAAM;AACvC,YAAI;AACJ,gBAAQ,QAAQ,OAAO;AACvB,YAAI,KAAK,OAAO,MAAM;AACtB,WAAG,UAAU,SAAS,OAAO,EAAE,UAAU,OAAO,CAAC;AACjD,YAAI,QAAQ,OAAO,gBAAgB,uBAAuB;AAC1D,eAAO,sBAAsB,KAAK;AAClC,eAAO,MAAM,KAAK;AAClB,eAAO,aAAa;AAAA,MACtB;AAGA,aAAO,iBAAiB,WAAY;AAClC,eAAO,qBAAqB;AAC5B,eAAO,aAAa;AAAA,MACtB;AAGA,aAAO,mBAAmB,WAAY;AACpC,eAAO,uBAAuB;AAC9B,eAAO,aAAa;AAAA,MACtB;AAGA,aAAO,YAAY,WAAY;AAC7B,eAAO,oBAAoB;AAAA,MAC7B;AAEA,eAAS,aAAa;AACpB,YAAI;AACJ,YAAI;AACJ,YAAI,KAAK,OAAO,MAAM;AACtB,YAAI;AACF,gBAAM,GAAG,SAAS,SAAS,EAAE,UAAU,OAAO,CAAC;AAC/C,aAAG,OAAO,OAAO;AAAA,QACnB,SAAS,KAAK;AACZ,iBAAO;AAAA,QACT;AACA,eAAO,KAAK,MAAM,GAAG;AAAA,MACvB;AAEA,eAAS,eAAe;AACtB,YAAI,QAAQ,OAAO,mBAAmB;AACtC,YAAI,OAAO;AACT,cAAI,eAAe,OAAO,0BAA0B;AACpD,cAAI,cAAc;AAChB,gBAAI,MAAM,WAAW;AAErB,gBAAI,QAAQ,QAAQ,IAAI,QAAQ,WAAW,IAAI,SAAS,sBAAsB;AAC5E,qBAAO,EAAE,MAAM,YAAY,KAAK,KAAK;AAAA,YACvC;AACA,mBAAO,EAAE,MAAM,aAAa,KAAK,IAAI;AAAA,UACvC,OAAO;AACL,gBAAI,KAAK,OAAO,MAAM;AACtB,gBAAI,OAAO,GAAG,SAAS,SAAS,EAAE,UAAU,OAAO,CAAC;AACpD,gBAAI,MAAM,GAAG,SAAS,SAAS,EAAE,UAAU,OAAO,CAAC;AACnD,mBAAO,EAAE,MAAY,IAAS;AAAA,UAChC;AAAA,QACF,OAAO;AACL,iBAAO,EAAE,MAAM,UAAU,KAAK,GAAG;AAAA,QACnC;AAAA,MACF;AAKA,aAAO,QAAQ,WAAY;AAAE,eAAO,OAAO,IAAI;AAAA,MAAG;AAElD,aAAO,cAAc,WAAY;AAC/B,YAAI,MAAM,OAAO,WAAW,wBAAwB,EAAE;AACtD,iBAAS;AACT,eAAO;AAAA,MACT;AACA,aAAO,cAAc,WAAY;AAC/B,YAAI,MAAM,OAAO,WAAW,wBAAwB,EAAE;AACtD,iBAAS;AACT,eAAO;AAAA,MACT;AAEA,aAAO,YAAY,SAAU,GAAG,GAAG;AACjC,YAAI;AACF,iBAAO,OAAO,MAAM,EAAE,UAAU,GAAG,GAAG,EAAE,UAAU,OAAO,CAAC;AAAA,QAC5D,SAAS,KAAK;AACZ,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,WAAW,SAAU,GAAG;AAC7B,YAAI;AACF,iBAAO,OAAO,MAAM,EAAE,SAAS,GAAG,EAAE,UAAU,OAAO,CAAC;AAAA,QACxD,SAAS,KAAK;AACZ,iBAAO;AAAA,QACT;AAAA,MACF;AAIA,aAAO,aAAa,SAAU,GAAG;AAC/B,YAAI,MAAM;AAAW,iBAAO;AAC5B,YAAI;AACF,cAAI,MAAM,KAAK,UAAU,CAAC;AAC1B,iBAAO,OAAO,MAAM,EAAE,UAAU,SAAS,KAAK,EAAE,UAAU,OAAO,CAAC;AAAA,QACpE,SAAS,KAAK;AACZ,iBAAO;AAAA,QACT;AAAA,MACF;AAGA,UAAI,IAAI,CAAC;AACT,QAAE,WAAW,IAAI;AACjB,QAAE,eAAe,IAAI;AACrB,QAAE,WAAW,IAAI;AACjB,QAAE,UAAU,IAAI;AAChB,QAAE,aAAa,IAAI;AACnB,QAAE,aAAa,IAAI;AACnB,QAAE,YAAY,IAAI;AAClB,QAAE,iBAAiB,IAAI;AACvB,QAAE,kBAAkB,IAAI;AACxB,QAAE,gBAAgB,IAAI;AACtB,QAAE,WAAW,IAAI;AAEjB,UAAI,KAAK,CAAC;AACV,SAAG,UAAU,IAAI;AACjB,SAAG,aAAa,IAAI;AACpB,SAAG,cAAc,IAAI;AACrB,SAAG,YAAY,IAAI;AAEnB,aAAO,UAAU,SAAgB,KAAK,MAAM;AAAA;AAC1C,cAAI,GAAG,eAAe,GAAG,GAAG;AAC1B,mBAAO,OAAO,GAAG,EAAE,MAAM,QAAW,IAAI;AAAA,UAC1C,WAAW,EAAE,eAAe,GAAG,GAAG;AAChC,mBAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,sBAAQ,OAAO,GAAG,EAAE,MAAM,QAAW,IAAI,CAAC;AAAA,YAC5C,CAAC;AAAA,UACH,OAAO;AACL,kBAAM,IAAI,MAAM,iBAAiB,GAAG;AAAA,UACtC;AAAA,QACF;AAAA;AAIA,aAAO;AAAA,IACT;AAGA,aAAS,kBAAkB;AACzB,UAAI,SAAS,WAAW;AACxB,WAAK,YAAY,SAAU,OAAO;AAChC,YAAI,UAAW,SAAU,GAAG;AAAE,sBAAY,EAAE,IAAI,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;AAAA,QAAG;AAC1E,eAAO,QAAQ,MAAM,KAAK,KAAK,MAAM,KAAK,IAAI,EAAE,KAAK,OAAO;AAAA,MAC9D;AAEA,gBAAU,KAAK;AAAA,IACjB;AAEA,aAAS,kBAAkB;AACzB,UAAI,OAAO,WAAW,SAAS;AAC/B,UAAI,cAAc,gBAAgB,SAAS;AAC3C,oBAAc,YAAY,MAAM,YAAY,QAAQ,GAAG,IAAI,GAAG,YAAY,YAAY,GAAG,CAAC;AAC1F,cAAQ,OAAO;AACf,YAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACzD,aAAO,IAAI,gBAAgB,IAAI;AAAA,IACjC;AAKA,QAAI,gBAAgB;AA5hBpB;AAkiBA,QAAMG,cAAN,MAAiB;AAAA,MACf,YAAY,UAAU;AAuBtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAqGA;AAAA;AAAA,2BAAM;AA3HJ,aAAK,aAAa;AAClB,aAAK,aAAa;AAClB,aAAK,WAAW;AAEhB,YAAI,eAAe;AACjB,cAAI,YAAY,CAAC;AACjB,eAAK,YAAY;AACjB,eAAK,IAAI,IAAI,OAAO,gBAAgB,CAAC;AACrC,eAAK,EAAE,YAAY,SAAU,OAAO;AAClC,sBAAU,MAAM,KAAK,EAAE,EAAE,SAAS,MAAM,KAAK,GAAG;AAChD,mBAAO,UAAU,MAAM,KAAK,EAAE;AAAA,UAChC;AAAA,QACF,OAAO;AACL,eAAK,SAAS,WAAW;AAAA,QAC3B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAoCM,YAAY,OAAO;AAAA;AACvB,cAAI,KAAK,iBAAiB;AAAO;AACjC,eAAK,gBAAgB;AACrB,cAAI,SAAS,KAAK,CAAC,KAAK,YAAY;AAClC,iBAAK,aAAa;AAClB,gBAAI,MAAM,KAAK;AAEf,gBAAI,eAAe;AACjB,kBAAI,IAAI,SAAS,cAAc,GAAG;AAClC,gBAAE,OAAO;AACT,oBAAM,EAAE;AAAA,YACV;AACA,kBAAM,sBAAK,oBAAL,WAAa,YAAY,CAAC,KAAK,aAAa;AAAA,UACpD;AACA,cAAI,SAAS,KAAK,CAAC,KAAK,YAAY;AAClC,iBAAK,aAAa;AAClB,kBAAM,sBAAK,oBAAL,WAAa,eAAe,CAAC;AAAA,UACrC;AAAA,QACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMM,WAAW,MAAM;AAAA;AACrB,gBAAM,KAAK,YAAY,CAAC;AACxB,iBAAO,MAAM,sBAAK,oBAAL,WAAa,cAAc,CAAC,IAAI;AAAA,QAC/C;AAAA;AAAA,MAEM,eAAe;AAAA;AACnB,gBAAM,KAAK,YAAY,CAAC;AACxB,iBAAO,MAAM,sBAAK,oBAAL,WAAa,gBAAgB,CAAC;AAAA,QAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,MAKM,YAAY;AAAA;AAChB,gBAAM,KAAK,YAAY,CAAC;AACxB,iBAAO,MAAM,sBAAK,oBAAL,WAAa,aAAa,CAAC;AAAA,QAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,MAKM,gBAAgB;AAAA;AACpB,gBAAM,KAAK,YAAY,CAAC;AACxB,iBAAO,MAAM,sBAAK,oBAAL,WAAa,iBAAiB,CAAC;AAAA,QAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOM,gBAAgB,MAAM;AAAA;AAC1B,kBAAQ,IAAI,gBAAgB,IAAI;AAChC,gBAAM,KAAK,YAAY,CAAC;AACxB,cAAI,QAAQ,MAAM,sBAAK,oBAAL,WAAa,mBAAmB,CAAC,IAAI;AACvD,iBAAO,MAAM,sBAAK,oCAAL,WAAqB;AAAA,QACpC;AAAA;AAAA;AAAA;AAAA;AAAA,MAKM,iBAAiB;AAAA;AACrB,cAAI,QAAQ,MAAM,sBAAK,oBAAL,WAAa,kBAAkB,CAAC;AAClD,iBAAO,MAAM,sBAAK,oCAAL,WAAqB;AAAA,QACpC;AAAA;AAAA;AAAA;AAAA,MAkBM,sBAAsB,QAAQ;AAAA;AAElC,gBAAM,sBAAK,oBAAL,WAAa,cAAc,CAAC,MAAM;AACxC,cAAI,QAAQ,MAAM,sBAAK,oBAAL,WAAa,oBAAoB,CAAC;AACpD,iBAAO,MAAM,sBAAK,oCAAL,WAAqB;AAAA,QACpC;AAAA;AAAA;AAAA;AAAA;AAAA,MAKM,YAAY;AAAA;AAAE,iBAAO,MAAM,sBAAK,oBAAL,WAAa,aAAa,CAAC;AAAA,QAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAM1D,SAAS,MAAM;AAAA;AACnB,gBAAM,KAAK,YAAY,CAAC;AACxB,iBAAO,MAAM,sBAAK,oBAAL,WAAa,YAAY,CAAC,IAAI;AAAA,QAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOM,UAAU,MAAM,UAAU;AAAA;AAC9B,gBAAM,KAAK,YAAY,CAAC;AACxB,iBAAO,MAAM,sBAAK,oBAAL,WAAa,aAAa,CAAC,MAAM,QAAQ;AAAA,QACxD;AAAA;AAAA;AAAA;AAAA;AAAA,MAKM,cAAc;AAAA;AAAE,iBAAO,MAAM,sBAAK,oBAAL,WAAa,eAAe,CAAC;AAAA,QAAI;AAAA;AAAA;AAAA;AAAA;AAAA,MAK9D,cAAc;AAAA;AAAE,iBAAO,MAAM,sBAAK,oBAAL,WAAa,eAAe,CAAC;AAAA,QAAI;AAAA;AAAA;AAAA;AAAA;AAAA,MAKpE,YAAY;AACV,YAAI,eAAe;AACjB,iBAAO,KAAK,EAAE,UAAU;AAAA,QAC1B,OAAO;AACL,gBAAM,IAAI,MAAM,4BAA4B;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAtKE;AAAA,gBAAO,SAAC,KAAK,MAAM;AACjB,UAAI,eAAe;AACjB,YAAI,QAAQ,IAAI,iBAAiB;AAEjC,YAAI,KAAK;AACT,iBAAS,KAAK,GAAG,KAAK,KAAK,UAAU,QAAQ,MAAM;AACjD,cAAI,KAAK,UAAU,EAAE,MAAM;AAAW;AAAA,QACxC;AACA,YAAI,OAAO,KAAK,UAAU,QAAQ;AAChC,eAAK,UAAU,KAAK,KAAK;AAAA,QAC3B,OAAO;AACL,eAAK,UAAU,EAAE,IAAI;AAAA,QACvB;AACA,aAAK,EAAE,YAAY;AAAA,UACjB;AAAA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT,OAAO;AACL,eAAO,KAAK,OAAO,QAAQ,KAAK,IAAI;AAAA,MACtC;AAAA,IACF;AA+EM;AAAA,wBAAe,SAAC,OAAO;AAAA;AAC3B,eAAO,MAAM,SAAS,aAAa;AACjC,cAAI,MAAM,MAAM;AAChB,cAAI,QAAQ,MAAM;AAChB,gBAAI,MAAM,MAAM,UAAU,MAAM,GAAG;AACnC,kBAAM,sBAAK,oBAAL,WAAa,cAAc,CAAC,GAAG;AAAA,UACvC;AACA,kBAAQ,MAAM,sBAAK,oBAAL,WAAa,oBAAoB,CAAC;AAAA,QAClD;AACA,eAAO;AAAA,MACT;AAAA;AA+GF,QAAI,UAAU,CAAC;AAGf,aAAe,UAAU,GAAG,OAAO;AAAA;AACjC,YAAI;AACJ,gBAAQ,MAAM,KAAK;AAAA,UACjB,KAAK;AACH,oBAAQ,MAAM,IAAI,IAAI,SAAS,0BAA0B,MAAM,OAAO,GAAG,EAAE;AAC3E,mBAAO;AAAA,UACT,KAAK;AACH,kBAAM,KAAK,QAAQ,CAAC;AACpB,mBAAO,QAAQ,MAAM,IAAI,EAAE,MAAM,QAAW,MAAM,IAAI;AAAA,UACxD,KAAK;AACH,kBAAM,KAAK,QAAQ,CAAC;AACpB,mBAAO,MAAM,QAAQ,MAAM,IAAI,EAAE,MAAM,QAAW,MAAM,IAAI;AAAA,UAC9D;AACE,oBAAQ,IAAI,2BAA2B,KAAK;AAAA,QAChD;AAAA,MACF;AAAA;AAYA,QAAM,uBAAuB;AAAA;AAAA,MAE3B,YAAY;AAAA;AAAA,MAEZ,eAAe;AAAA;AAAA,MAEf,eAAe;AAAA,QACb,cAAc,EAAE,WAAW,MAAM,WAAW,KAAK;AAAA,QACjD,uBAAuB;AAAA,UACrB,WAAW;AAAA,UACX,WAAW;AAAA,UACX,SAAS,CAAC,SAAS;AAAA,UACnB,SAAS,CAAC,+BAA+B;AAAA,QAC3C;AAAA;AAAA;AAAA;AAAA,QAIA,WAAW;AAAA,UACT,WAAW;AAAA,UACX,WAAW;AAAA,UACX,SAAS,CAAC,OAAO;AAAA,UACjB,SAAS,CAAC,6BAA6B;AAAA,QACzC;AAAA;AAAA,QAEA,iBAAiB;AAAA;AAAA,UACf,WAAW;AAAA,UACX,WAAW;AAAA,UACX,SAAS,CAAC,UAAU,UAAU;AAAA,UAC9B,SAAS,CAAC,4BAA4B;AAAA,QACxC;AAAA,QACA,UAAU;AAAA,UACR,WAAW;AAAA,UACX,WAAW;AAAA,UACX,SAAS,CAAC,UAAU,UAAU;AAAA,UAC9B,SAAS,CAAC,4BAA4B;AAAA,QACxC;AAAA,QACA,gBAAgB;AAAA;AAAA,UACd,WAAW;AAAA,UACX,WAAW;AAAA,UACX,SAAS,CAAC,UAAU,UAAU;AAAA,UAC9B,SAAS,CAAC,4BAA4B;AAAA,QACxC;AAAA,QACA,iBAAiB;AAAA;AAAA,UACf,WAAW;AAAA,UACX,WAAW;AAAA,UACX,SAAS,CAAC,UAAU,UAAU;AAAA,UAC9B,SAAS,CAAC,4BAA4B;AAAA,QACxC;AAAA,QACA,qBAAqB;AAAA;AAAA,UACnB,WAAW;AAAA,UACX,WAAW;AAAA,UACX,SAAS,CAAC,UAAU,UAAU;AAAA,UAC9B,SAAS,CAAC,4BAA4B;AAAA,QACxC;AAAA,QACA,kBAAkB;AAAA;AAAA,UAChB,WAAW;AAAA,UACX,WAAW;AAAA,UACX,SAAS,CAAC,UAAU,YAAY,UAAU;AAAA,UAC1C,SAAS,CAAC,gCAAgC;AAAA,QAC5C;AAAA,QACA,gCAAgC;AAAA;AAAA,UAC9B,WAAW;AAAA,UACX,WAAW;AAAA,UACX,SAAS,CAAC,UAAU,YAAY,UAAU;AAAA,UAC1C,SAAS,CAAC,gCAAgC;AAAA,QAC5C;AAAA,MACF;AAAA;AAAA,MAEA,cAAc;AAAA,QACZ;AAAA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOF;AAEA,QAAI,OAAO,gBAAgB,aAAa;AAAM,oBAAc,CAAC;AAAA,IAAG;AAAlB;AAC9C,kBAAc,OAAO,OAAO,mBAAK,uBAAwB,WAAW;AAEpE,QAAI,aAAa;AAAA,MACf,OAAO;AAAA;AAAA,MACP,SAAS;AAAA;AAAA,MACT,YAAY;AAAA;AAAA,MACZ,UAAU;AAAA;AAAA,IACZ;AAEA,QAAM,eAAN,MAAmB;AAAA,MACjB,YAAY,UAAU;AACpB,aAAK,WAAW;AAChB,aAAK,IAAI;AACT,aAAK,SAAS;AACd,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb,aAAK,SAAS,CAAC;AACf,aAAK,QAAQ;AAAA,MACf;AAAA;AAAA;AAAA,MAKA,aAAa;AACX,eAAQ,KAAK,MAAM;AAAA,MACrB;AAAA;AAAA,MAGM,QAAQ;AAAA;AACZ,cAAI,CAAC,KAAK;AAAO,iBAAK,OAAO,QAAQ,6BAA6B;AAClE,eAAK,IAAI,IAAIA,YAAW,KAAK,QAAQ;AACrC,gBAAM,KAAK,mBAAmB;AAC9B,cAAI,CAAC,KAAK;AAAO,iBAAK,OAAO,QAAQ,EAAE;AAEvC,eAAK,aAAa,WAAW,KAAK;AAClC,eAAK,SAAS,CAAC;AACf,cAAI,CAAC,KAAK;AAAO,iBAAK,OAAO,0BAA0B,QAAQ;AAC/D,gBAAM,KAAK,OAAO,GAAG,eAAe;AAAA,QACtC;AAAA;AAAA;AAAA,MAGM,UAAU;AAAA;AACd,eAAK,SAAS;AACd,eAAK,aAAa,WAAW,KAAK;AAClC,eAAK,SAAS,CAAC;AACf,gBAAM,SAAS,KAAK,UAAU,IAAI;AAClC,gBAAM,KAAK,MAAM;AACjB,eAAK,QAAQ;AAAA,QACf;AAAA;AAAA;AAAA,MAGA,WAAW;AACT,YAAI,CAAC,KAAK,WAAW;AAAG;AACxB,aAAK,EAAE,UAAU;AACjB,aAAK,IAAI;AAAA,MACX;AAAA;AAAA,MAGM,eAAe,QAAQ;AAAA;AAC3B,cAAI,KAAK,WAAW;AAAG;AACvB,eAAK,SAAS;AACd,gBAAM,KAAK,MAAM;AAAA,QACnB;AAAA;AAAA;AAAA,MAGA,UAAU,GAAG;AACX,cAAM,OAAO,KAAK;AAClB,aAAK,QAAQ;AACb,eAAO;AAAA,MACT;AAAA;AAAA;AAAA,MAKM,qBAAqB;AAAA;AAEzB,qBAAW,KAAK,YAAY,cAAc;AACxC,kBAAM,KAAK,EAAE,WAAW,CAAC;AAAA,UAC3B;AAIA;AACE,iBAAK,EAAE,aAAa;AACpB,kBAAM,KAAK,EAAE,gBAAgB,gCAAgC;AAC7D,gBAAI,MAAM,MAAM,KAAK,EAAE,YAAY;AACnC,gBAAI,MAAM,MAAM,KAAK,EAAE,YAAY;AACnC,kBAAM,KAAK,EAAE,UAAU;AACvB,iBAAK,OAAO,GAAG,aAAa,MAAM,GAAG;AAAA,UACvC;AAEA,qBAAW,KAAK,YAAY,cAAc;AACxC,kBAAM,KAAK,oBAAoB,CAAC;AAAA,UAClC;AACA,iBAAO;AAAA,QACT;AAAA;AAAA;AAAA,MAGM,aAAa,IAAI;AAAA;AACrB,gBAAM,UAAU,KAAK,WAAW;AAChC,qBAAW,KAAK,IAAI;AAClB,gBAAI,CAAC,YAAY,aAAa,SAAS,CAAC,GAAG;AACzC,0BAAY,aAAa,KAAK,CAAC;AAC/B,kBAAI;AAAS,sBAAM,KAAK,oBAAoB,CAAC;AAAA,YAC/C;AAAA,UACF;AAAA,QACF;AAAA;AAAA;AAAA,MAGM,aAAa,IAAI;AAAA;AACrB,cAAI,UAAU;AACd,gBAAM,UAAU,KAAK,WAAW;AAChC,qBAAW,KAAK,IAAI;AAClB,gBAAI,CAAC,YAAY,aAAa,SAAS,CAAC,GAAG;AACzC,0BAAY,aAAa,KAAK,CAAC;AAC/B,kBAAI;AAAS,sBAAM,KAAK,EAAE,WAAW,CAAC;AACtC,wBAAU;AAAA,YACZ;AAAA,UACF;AAEA,cAAI,WAAW,SAAS;AACtB,kBAAM,KAAK,EAAE,aAAa;AAC1B,kBAAM,KAAK,oBAAoB,mBAAmB;AAAA,UACpD;AAAA,QACF;AAAA;AAAA;AAAA;AAAA,MAKM,oBAAoB,GAAG;AAAA;AAC3B,cAAI,YAAY;AAAY,oBAAQ,IAAI,cAAc,CAAC,GAAG;AAC1D,eAAK,EAAE,aAAa;AACpB,gBAAM,KAAK,EAAE,gBAAgB,CAAC;AAC9B,gBAAM,KAAK,QAAQ;AACnB,gBAAM,KAAK,EAAE,UAAU;AAAA,QACzB;AAAA;AAAA;AAAA,MAGM,UAAU;AAAA;AACd,cAAI,MAAM,MAAM,KAAK,EAAE,YAAY;AACnC,cAAI,MAAM,MAAM,KAAK,EAAE,YAAY;AACnC,cAAI,YAAY;AAAY,oBAAQ,IAAI,MAAM,GAAG;AAAA,QACnD;AAAA;AAAA;AAAA,MAIA,oBAAoB;AAClB,YAAI,YAAY,iBAAiB;AAAG;AACpC,aAAK,QAAQ,WAAY,MAAY;AACnC,cAAI,CAAC,KAAK;AAAO,iBAAK,OAAO,UAAU,qCAAqC;AAC5E,gBAAM,KAAK,QAAQ;AACnB,cAAI,CAAC,KAAK;AAAO,iBAAK,OAAO,0BAA0B,QAAQ;AAAA,QACjE,IAAI,YAAY,gBAAgB,GAAI;AAAA,MACtC;AAAA,MACA,uBAAuB;AACrB,YAAI,KAAK,UAAU,QAAW;AAC5B,uBAAa,KAAK,KAAK;AACvB,eAAK,QAAQ;AAAA,QACf;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAOM,YAAY,OAAO;AAAA;AACvB,cAAI,eAAe;AAEnB,cAAI,YAAY,qBAAqB,QAAW;AAC9C,oBAAQ,YAAY,iBAAiB,KAAK;AAAA,UAC5C;AAEA,cAAI,UAAU,MAAM,MAAM,8BAA8B;AACxD,cAAI,WAAW,QAAQ,QAAQ,UAAU,GAAG;AAC1C,kBAAM,gBAAgB,YAAY,cAAc,QAAQ,CAAC,CAAC;AAC1D,gBAAI,kBAAkB,QAAW;AAC/B,kBAAI,cAAc,YAAY,QAAW;AACvC,sBAAM,KAAK,aAAa,cAAc,OAAO;AAAA,cAC/C;AACA,kBAAI,cAAc,YAAY,QAAW;AACvC,sBAAM,KAAK,aAAa,cAAc,OAAO;AAAA,cAC/C;AACA,kBAAI,cAAc,cAAc,MAAM;AACpC,sBAAM,KAAK,OAAO,GAAG,sBAAsB;AAAA,cAC7C;AACA,kBAAI,cAAc,WAAW,QAAW;AACtC,qBAAK,OAAO,GAAG,gBAAgB,cAAc,MAAM;AAAA,cACrD;AACA,kBAAI,cAAc,cAAc,MAAM;AACpC,+BAAe,CAAO,KAAK,QAAQ;AACjC,uBAAK,OAAO,GAAG,UAAU,KAAK,GAAG;AAAA,gBACnC;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,iBAAO,EAAE,GAAG,OAAO,aAA2B;AAAA,QAChD;AAAA;AAAA;AAAA,MAIA,aAAa,OAAO;AAClB,aAAK,QAAQ;AACb,aAAK,OAAO,oBAAoB;AAAA,MAClC;AAAA;AAAA,MAGA,oBAAoB;AAClB,YAAI,KAAK,UAAU,WAAW,SAAS;AACrC,gBAAM,yBAAyB;AAC/B,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA;AAAA,MAEA,iBAAiB,QAAQ;AACvB,YAAI,KAAK,WAAW,QAAQ;AAC1B,gBAAM,sDAAsD;AAC5D,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA;AAAA,MAEA,sBAAsB;AACpB,eAAQ,KAAK,UAAU,WAAW,cAAc,KAAK,UAAU,WAAW;AAAA,MAC5E;AAAA;AAAA;AAAA;AAAA;AAAA,MAMM,UAAU,QAAQ,OAAO,MAAM;AAAA;AACnC,cAAI,KAAK,UAAU,WAAW,OAAO;AACnC,oBAAQ,IAAI,4CAA4C;AACxD;AAAA,UACF;AACA,eAAK,SAAS;AAEd,cAAI,KAAK,MAAM,KAAK,YAAY,KAAK;AACrC,kBAAQ,GAAG;AAEX,eAAK,aAAa,WAAW,OAAO;AACpC,eAAK,SAAS;AAEd,cAAI,CAAC,KAAK,SAAS,KAAK,QAAQ;AAAW,iBAAK,OAAO,QAAQ,KAAK,GAAG;AACvE,eAAK,kBAAkB;AACvB,eAAK,EAAE,aAAa;AACpB,cAAI,QAAQ,MAAM,KAAK,EAAE,gBAAgB,KAAK;AAC9C,eAAK,qBAAqB;AAC1B,cAAI,CAAC,KAAK,SAAS,KAAK,QAAQ;AAAW,iBAAK,OAAO,QAAQ,EAAE;AAEjE,gBAAM,KAAK,UAAU,OAAO,GAAG,YAAY;AAAA,QAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOM,UAAU,QAAQ,QAAQ;AAAA;AAC9B,eAAK,SAAS;AACd,cAAI,KAAK,UAAU,WAAW,YAAY;AACxC,gBAAI,WAAW,IAAI;AACjB,mBAAK,EAAE,aAAa;AACpB,oBAAM,KAAK,EAAE,UAAU;AACvB,mBAAK,aAAa,WAAW,KAAK;AAClC,mBAAK,SAAS,CAAC;AACM,mBAAK,OAAO,0BAA0B,KAAK;AAAA,YAClE,OAAO;AAEL,mBAAK,aAAa,WAAW,OAAO;AAEpC,mBAAK,kBAAkB;AACvB,mBAAK,EAAE,aAAa;AACpB,kBAAI,QAAQ,MAAM,KAAK,EAAE,eAAe;AACxC,mBAAK,qBAAqB;AAE1B,oBAAM,KAAK,UAAU,OAAO,IAAI;AAAA,YAClC;AAAA,UACF,WAAW,KAAK,UAAU,WAAW,UAAU;AAC7C,iBAAK,aAAa,WAAW,OAAO;AAEpC,iBAAK,kBAAkB;AACvB,iBAAK,EAAE,aAAa;AACpB,gBAAI,QAAQ,MAAM,KAAK,EAAE,sBAAsB,MAAM;AACrD,iBAAK,qBAAqB;AAE1B,kBAAM,KAAK,UAAU,OAAO,IAAI;AAAA,UAClC,OAAO;AACL,oBAAQ,IAAI,mDAAmD;AAAA,UACjE;AAAA,QACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASM,UAAU,OAAO,cAAc;AAAA;AACnC,cAAI,MAAM,MAAM,KAAK,EAAE,YAAY;AACnC,cAAI,MAAM,MAAM,KAAK,EAAE,YAAY;AAEnC,cAAI,CAAC,KAAK;AAAO,iBAAK,OAAO,UAAU,MAAM,GAAG;AAEhD,cAAI,MAAM,SAAS,YAAY;AAC7B,iBAAK,aAAa,WAAW,QAAQ;AACrC;AAAA,UACF;AAEA,cAAI;AACJ,cAAI,MAAM,SAAS,UAAU;AAC3B,wBAAY;AAAA,UACd,OAAO;AAIL,gBAAI,MAAM,SAAS,WAAW;AAC5B,kBAAI,KAAK,OAAO,aAAa;AAC3B,oBAAI,YAAY,MAAM;AACtB,oBAAI,cAAc,IAAI;AACpB,8BAAY;AAAA,gBACd,OAAO;AACL,8BAAY;AACZ,sBAAI,CAAC,KAAK;AAAO,yBAAK,OAAO,UAAU,SAAS;AAAA,gBAClD;AAAA,cACF;AAAA,YACF,WAAW,MAAM,SAAS,aAAa;AACrC,kBAAI,OAAO,MAAM;AACjB,kBAAI,CAAC,KAAK;AAAO,qBAAK,OAAO,UAAU,gDAAgD,IAAI;AAAA,CAAK;AAChG,0BAAY;AAAA,YACd,WAAW,MAAM,SAAS,aAAa;AACrC,0BAAY;AACZ,kBAAI,CAAC,KAAK;AAAO,qBAAK,OAAO,UAAU,mCAAmC;AAAA,YAC5E,OAAO;AACL,0BAAY;AACZ,sBAAQ,IAAI,wCAAwC,MAAM,IAAI,IAAI,MAAM,GAAG,EAAE;AAAA,YAC/E;AAAA,UACF;AACA,gBAAM,kBAAkB,KAAK,OAAO;AACpC,cAAI,cAAc,KAAK;AACrB,iBAAK,aAAa,WAAW,UAAU;AACvC,gBAAI,CAAC,KAAK;AAAO,mBAAK,OAAO,gBAAgB;AAAA,UAC/C,OAAO;AACL,kBAAM,KAAK,EAAE,UAAU;AACvB,iBAAK,aAAa,WAAW,KAAK;AAClC,iBAAK,SAAS,CAAC;AACf,gBAAI,CAAC,KAAK;AAAO,mBAAK,OAAO,0BAA0B,SAAS;AAAA,UAClE;AACA,cAAI,iBAAiB,MAAM;AACzB,gBAAI,oBAAoB,MAAM;AAC5B,oBAAM,aAAa,KAAK,GAAG;AAAA,YAC7B;AAAA,UACF,WAAW,CAAC,KAAK,OAAO;AACtB,gBAAI,YAAY,yBAAyB,QAAW;AAElD,oBAAM,YAAY,qBAAqB,KAAK,OAAO,EAAE;AAAA,YACvD;AAAA,UACF;AAAA,QACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOM,QAAQ;AAAA;AACZ,cAAI,KAAK,UAAU,WAAW,SAAS;AACrC,iBAAK,qBAAqB;AAG1B,gBAAI,CAAC,KAAK;AAAO,mBAAK,OAAO,UAAU,wDAAwD;AAG/F,kBAAM,KAAK,QAAQ;AACnB,gBAAI,CAAC,KAAK;AAAO,mBAAK,OAAO,0BAA0B,QAAQ;AAAA,UACjE;AAAA,QACF;AAAA;AAAA,IACF;AAUA,QAAI,sBAAsB,OAAO,WAAW,YAAY,OAAO,QAAQ,YAAY,YAAY,OAAO,QAAQ,SAAS,QAAQ;AAlxC/H;AAoxCA,QAAI,qBAAqB;AACvB,YAAM,OAAO,UAAQ,MAAM;AAC3B,YAAMC,WAAU,UAAQ,SAAS;AAEjC,YAAM,WAAW,SAAU,GAAG;AAAE,QAAAA,SAAQ,OAAO,MAAM,CAAC;AAAA,MAAG;AAGrD,kBAAY,KAAK,KAAK,WAAW,IAAI;AAAA,MAGzC,MAAM,SAAS;AAAA,QACb,YAAY,OAAO;AACjB,eAAK,QAAQ;AAAA,QACf;AAAA,QACM,MAAMC,KAAI;AAAA;AAEd,iBAAK,SAAS,IAAI,SAASA,KAAI,MAAM,CAAC,CAAC;AAEvC,kBAAM,KAAK,MAAM,eAAe,KAAK,MAAM;AAAA,UAC7C;AAAA;AAAA,QACM,iBAAiB;AAAA;AAAA,UACvB;AAAA;AAAA,QACA,aAAa,KAAK;AAChB,eAAK,MAAM,OAAO,QAAQ,GAAG;AAAA,QAC/B;AAAA,QACM,wBAAwB;AAAA;AAAA,UAC9B;AAAA;AAAA,QACA,UAAU,KAAK,KAAK;AAAA,QACpB;AAAA;AAAA,QAEA,iBAAiB,MAAM;AACrB,eAAK,OAAO,QAAQ,eAAe,KAAK,GAAG,KAAK,KAAK,GAAG,IAAI,KAAK,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG;AAAA,CAAI;AAAA,QACpG;AAAA,MACF;AAAA,MAEA,MAAM,SAAS;AAAA,QACb,YAAYA,KAAI,IAAI,MAAM;AAwC1B;AAAA,6BAAM;AAvCJ,eAAK,SAAS;AACd,eAAK,YAAY;AAEjB,eAAK,cAAe,KAAK,aAAa,OAAO,QAAQ;AACrD,eAAK,KAAK;AAEV,eAAK,KAAKA;AACV,eAAK,cAAc;AAAA,QACrB;AAAA,QAEA,sBAAsB;AAAA,QAAE;AAAA,QACxB,QAAQ,MAAM;AAAE,UAAAD,SAAQ,OAAO,MAAM,IAAI;AAAA,QAAG;AAAA,QAE5C,UAAU,KAAK;AAAE,eAAK,QAAQ,GAAG;AAAA,QAAG;AAAA,QACpC,UAAU,KAAK;AAAE,eAAK,cAAc,OAAO;AAAA,QAAK;AAAA,QAChD,UAAU,KAAK;AAAE,eAAK,QAAQ,GAAG;AAAA,QAAG;AAAA,QAEpC,eAAe;AACb,cAAI,CAAC,KAAK;AAAa;AACvB,eAAK,cAAc,KAAK;AAAA,QAC1B;AAAA,QACA,kBAAkB;AAChB,cAAI,CAAC,KAAK;AAAa;AACvB,eAAK,eAAe,KAAK;AAAA,QAC3B;AAAA,QACA,eAAe,KAAK;AAClB,cAAI,CAAC,KAAK;AAAa;AACvB,cAAI,QAAQ;AAAU;AACtB,eAAK,QAAQ,IAAI;AACjB,eAAK,QAAQ,GAAG;AAChB,eAAK,QAAQ,IAAI;AAAA,QACnB;AAAA,QACA,0BAA0B,KAAK;AAC7B,eAAK,eAAe,GAAG;AACvB,eAAK,aAAa;AAAA,QACpB;AAAA,QACA,QAAQ,MAAM;AAAA,QAAE;AAAA;AAAA,QA4BV,OAAO;AAAA;AACX,kBAAM,QAAQ,KAAK,GAAG;AACtB,gBAAI,WAAW,KAAK;AACpB,mBAAO,MAAM;AACX,kBAAI;AACJ,kBAAI;AACF,uBAAO,MAAM,KAAK,GAAG,SAAS,QAAQ;AAAA,cACxC,SAAS,KAAK;AACZ,wBAAQ,IAAI,UAAU,GAAG;AACzB,gBAAAA,SAAQ,KAAK,CAAC;AAAA,cAChB;AAEA,kBAAI,KAAK,MAAM,EAAE,MAAM,OAAO,KAAK,MAAM,GAAG,EAAE,MAAM,QAAQ;AAC1D;AAAA,cACF;AACA,oBAAM,sBAAK,gCAAL,WAAmB;AACzB,yBAAW,KAAK;AAChB,mBAAK,cAAc;AAAA,YACrB;AAAA,UACF;AAAA;AAAA,MACF;AA7CQ;AAAA,wBAAa,SAAC,MAAM;AAAA;AACxB,gBAAM,QAAQ,KAAK,GAAG;AACtB,cAAI,MAAM,oBAAoB,GAAG;AAC/B,gBAAI,CAAC,MAAM,iBAAiB,IAAI;AAAG;AACnC,kBAAM,MAAM,UAAU,MAAM,IAAI;AAAA,UAClC,OAAO;AAEL,gBAAI,SAAS,IAAI;AACf,mBAAK,aAAa;AAAA,YACpB,OAAO;AACL,kBAAI,KAAK,MAAM,EAAE,MAAM,KAAK;AAE1B,qBAAK,QAAQ;AAAA,CAExB;AACW,qBAAK,0BAA0B,QAAQ;AAAA,cACzC,OAAO;AACL,oBAAI,IAAI,KAAK,MAAM,GAAG,EAAE;AACxB,sBAAM,MAAM,UAAU,MAAM,GAAG,CAAC,CAAC;AAAA,cACnC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA;AAyBF,kBAAY,aAAa;AACzB,sBAAgB;AAEhB,MAAC,MAAY;AAEX,cAAM,QAAQ,IAAI,aAAa,YAAY,QAAQ;AACnD,YAAI,KAAK,IAAI,SAAS,KAAK;AAC3B,cAAM,GAAG,MAAM,EAAE;AAIjB,YAAI,UAAUA,SAAQ,IAAI;AAC1B,YAAI,SAAS;AACb,cAAM,EAAE,OAAO,UAAU,SAAS,MAAM;AAGxC,cAAM,MAAM,oBAAoB,wBAAwB,MAAM,IAAI;AAAA,MACpE;AAAA,IACF;AAtIM;AAwIN,YAAQ,aAAaD;AAAA;AAAA;;;ACn6CrB,yBAA2B;AA6DpB,IAAM,sBAAN,MAA0B;AAAA,EAI7B,YAAY,UAAkB,SAAmB,eAAyB,CAAC,GAAG,mBAA4B,WAAoB;AAC1H,SAAK,WAAW;AAAA,MACZ,WAAW,gCAAa;AAAA,MACxB;AAAA,MACA,cAAc;AAAA,MACd;AAAA,MACA,mBAAmB,gDAAqB;AAAA,MACxC,cAAc;AAAA,QACV;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAEA,SAAK,WAAW,IAAI,8BAAW,KAAK,SAAS,SAAS;AAAA,EAC1D;AAAA,EAEM,UAAU,QAA+B;AAAA;AAC3C,WAAK,WAAW,IAAI,8BAAW,KAAK,SAAS,SAAS;AACtD,YAAM,KAAK,SAAS,YAAY,CAAC;AACjC,iBAAW,UAAU,KAAK,SAAS;AAAc,cAAM,KAAK,SAAS,WAAW,MAAM;AACtF,iBAAW,SAAS,KAAK,SAAS;AAAc,cAAM,KAAK,SAAS,gBAAgB,KAAK;AAGzF,WAAK,SAAS,OAAO,UAAU,KAAK,SAAS,UAAU,MAAM;AAC7D,YAAM,KAAK,SAAS,gBAAgB,wBAAwB,MAAM,IAAI;AAGtE,iBAAW,eAAe,KAAK,SAAS;AAAc,cAAM,KAAK,SAAS,gBAAgB,eAAe,KAAK,SAAS,iBAAiB,GAAG,WAAW,OAAO;AAE7J,cAAQ,IAAI,uBAAuB;AAAA,IACvC;AAAA;AAAA;AAAA,EAGA,YAAY,OAAuB;AAC/B,WAAO,KAAK,UAAU,OAAO,KAAK;AAAA,EACtC;AAAA,EACA,YAAY,OAAuB;AAC/B,WAAO,KAAK,UAAU,OAAO,KAAK;AAAA,EACtC;AAAA,EACA,YAAY,OAAwB;AAChC,WAAO,KAAK,UAAU,OAAO,KAAK;AAAA,EACtC;AAAA,EACA,eAAe,OAA0B;AACrC,WAAO,KAAK,UAAU,UAAU,KAAK;AAAA,EACzC;AAAA,EACA,eAAe,MAAc,MAA0B;AACnD,UAAM,QAAQ,EAAE,KAAW;AAC3B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ;AAAK,MAAC,MAAc,CAAC,IAAI,KAAK,CAAC;AAChE,WAAO,KAAK,UAAU,UAAU,KAAK;AAAA,EACzC;AAAA,EACA,aAAgB,OAAqB;AACjC,WAAO,KAAK,UAAU,UAAU,IAAI,MAAM,SAAS,CAAC,GAAG;AAAA,EAC3D;AAAA,EACA,sBAAyB,OAAuB;AAC5C,WAAO,KAAK,UAAU,UAAU,IAAI,MAAM,IAAI,UAAQ,KAAK,aAAgB,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG;AAAA,EACzG;AAAA,EACA,iBAAiB,MAAsB,OAAqB;AACxD,WAAO,KAAK,UAAU,MAAM,KAAK;AAAA,EACrC;AAAA,EACQ,UAAU,MAAsB,OAAqB;AACzD,WAAO,EAAE,KAAK,MAAM,MAAa;AAAA,EACrC;AAAA;AAAA,EAGA,aAAa,MAAsB;AAC/B,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,aAAa,MAAsB;AAC/B,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,aAAa,MAAsB;AAC/B,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,gBAAgB,MAAyB;AACrC,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,gBAAgB,MAAyB;AACrC,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,0BAA6B,MAAsB;AAE/C,UAAM,cAAc,KAAK,MAAM,QAAQ,GAAG;AAC1C,UAAM,QAAQ,KAAK,MAAM,UAAU,aAAa,KAAK,MAAM,MAAM;AACjE,WAAO,KAAK,MAAM,KAAK;AAAA,EAC3B;AAAA,EACA,mCAAsC,MAAwB;AAE1D,UAAM,cAAc,KAAK,MAAM,QAAQ,GAAG;AAC1C,UAAM,QAAQ,KAAK,MAAM,UAAU,aAAa,KAAK,MAAM,MAAM;AACjE,WAAO,KAAK,MAAM,KAAK;AAAA,EAC3B;AAAA,EACA,kBAAkB,MAAoB;AAClC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,YAAY,MAAwB;AAChC,WAAO,KAAK,aAAa,MAAM,KAAK;AAAA,EACxC;AAAA,EACA,YAAY,MAAwB;AAChC,WAAO,KAAK,aAAa,MAAM,KAAK;AAAA,EACxC;AAAA,EACA,eAAe,MAAwB;AACnC,WAAO,KAAK,aAAa,MAAM,QAAQ;AAAA,EAC3C;AAAA,EACA,YAAY,MAAwB;AAChC,WAAO,KAAK,aAAa,MAAM,KAAK;AAAA,EACxC;AAAA,EACA,eAAe,MAAwB;AACnC,WAAO,KAAK,aAAa,MAAM,QAAQ;AAAA,EAC3C;AAAA,EACA,aAAa,MAAe,MAAuB;AAC/C,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA;AAAA,EAIM,iBAAiB,OAAyC;AAAA;AAC5D,YAAM,aAAa,MAAM,KAAK,IAAI,CAAC,SAAS,KAAK,KAAK;AACtD,YAAM,IAAY,GAAG,MAAM,IAAI,IAAI,UAAU;AAC7C,aAAO,MAAM,KAAK,SAAS,gBAAgB,CAAC;AAAA,IAChD;AAAA;AAAA,EAEM,kBAA0C;AAAA;AAC5C,aAAO,MAAM,KAAK,SAAS,eAAe;AAAA,IAC9C;AAAA;AAAA,EAEM,iBAAgC;AAAA;AAClC,aAAO,MAAM,KAAK,SAAS,UAAU;AAAA,IACzC;AAAA;AACJ;;;ACnMA,YAAY,QAAQ;;;ACApB;AAAA,EACI,cAAc;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,qBAAqB;AAAA,EACzB;AAAA,EACA,cAAc;AAAA,IACV,QAAU;AAAA,IACV,QAAU;AAAA,IACV,YAAY;AAAA,EAChB;AACJ;;;ADGO,IAAM,mBAAN,MAAuB;AAAA,EAC1B,cAAc;AAAA,EAAE;AAAA,EAEhB,eAAe,MAA2B;AACtC,UAAM,WAAW,uBAAuB,KAAK,IAAI;AAGjD,SAAK,gBAAgB;AAGrB,IAAG,iBAAc,UAAU,GAAG,0BAAkB,YAAY,EAAE,WAAW,CAAC;AAAA;AAAA,CAAM;AAGhF,IAAG,kBAAe,UAAU,GAAG,KAAK,aAAa,IAAI,CAAC;AAAA,CAAI;AAG1D,IAAG,kBAAe,UAAU,GAAG,KAAK,aAAa,KAAK,KAAK,CAAC;AAAA,CAAI;AAGhE,IAAG,kBAAe,UAAU,GAAG,KAAK,YAAY,IAAI,CAAC;AAAA,CAAI;AAGzD,IAAG,kBAAe,UAAU,IAAK,0BAAkB,YAAY,EAAE,WAAW,CAAC;AAAA;AAAA,CAAM;AAGnF,IAAG,kBAAe,UAAU,GAAG,KAAK,aAAa,KAAK,MAAM,CAAC;AAAA,CAAI;AAGjE,IAAG,kBAAe,UAAU;AAAA,EAAqB;AAAA,EACrD;AAAA,EAEQ,kBAAkB;AACtB,QAAI,MAAM;AAEV,QAAI,CAAI,cAAW,GAAG,GAAG;AACrB,MAAG,aAAU,GAAG;AAAA,IACpB;AAAA,EACJ;AAAA,EAEQ,aAAa,MAA6B;AAC9C,QAAI,SAAS,yBAAyB,KAAK,IAAI;AAC/C,SAAK,MAAM,QAAQ,CAAC,UAAU,SAAS,OAAO,OAAO,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC;AACtF,aAAS,OAAO,OAAO,cAAc,KAAK,OAAO,IAAI;AAAA,CAAO;AAC5D,WAAO;AAAA,EACX;AAAA,EAEQ,aAAa,OAAuC;AACxD,QAAI,SAAS;AAAA;AAEb,UAAM,QAAQ,WAAS;AACnB,eAAS,OAAO,OAAO,UAAW,MAAM,IAAI,YAAY,0BAAkB,YAAY,EAAE,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI;AAAA,CAAM;AAAA,IAC3H,CAAC;AACD,aAAS,OAAO,OAAO;AAAA,CAAkD;AAEzE,WAAO;AAAA,EACX;AAAA,EAEQ,YAAY,MAA6B;AAC7C,UAAM,QAAQ,CAAC,GAAG,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAEjD,QAAI,QAAQ;AAAA;AAAA,qBAEC,KAAK,IAAI;AAAA,qBACT,MAAM,IAAI,WAAS,MAAM,OAAO,KAAK,EAAE,SAAS,CAAC;AAAA;AAAA;AAG9D,WAAO;AAAA,EACX;AAAA,EAEQ,aAAa,QAAyC;AAC1D,QAAI,UACA;AAAA,IAA0C,0BAAkB,YAAY,EAAE,mBAAmB,CAAC;AAAA;AAElG,YAAQ,OAAO,MAAM;AAAA,MACjB,KAAK;AACD,kBAAU,QAAQ,OAAO;AAAA,CAAkE;AAC3F;AAAA,IACR;AAEA,WAAO;AAAA,EACX;AACJ;","names":["ENVIRONMENT_IS_NODE","fs","f","CiaoWorker","process","rl"]}