Snow преди 1 месец
родител
ревизия
1d0b9c5323
променени са 100 файла, в които са добавени 55933 реда и са изтрити 0 реда
  1. 1 0
      node_modules/.bin/asciidoctor
  2. 1 0
      node_modules/.bin/asciidoctorjs
  3. 1 0
      node_modules/.bin/cpr
  4. 1 0
      node_modules/.bin/direction
  5. 1 0
      node_modules/.bin/esparse
  6. 1 0
      node_modules/.bin/esvalidate
  7. 1 0
      node_modules/.bin/honkit
  8. 1 0
      node_modules/.bin/is-docker
  9. 1 0
      node_modules/.bin/js-yaml
  10. 1 0
      node_modules/.bin/juice
  11. 1 0
      node_modules/.bin/kramed
  12. 1 0
      node_modules/.bin/mime
  13. 1 0
      node_modules/.bin/mkdirp
  14. 1 0
      node_modules/.bin/nunjucks-precompile
  15. 1 0
      node_modules/.bin/resolve
  16. 1 0
      node_modules/.bin/rimraf
  17. 1 0
      node_modules/.bin/semver
  18. 2856 0
      node_modules/.package-lock.json
  19. 22 0
      node_modules/@asciidoctor/cli/LICENSE
  20. 12 0
      node_modules/@asciidoctor/cli/README.md
  21. 9 0
      node_modules/@asciidoctor/cli/bin/asciidoctor
  22. 289 0
      node_modules/@asciidoctor/cli/data/reference/syntax.adoc
  23. 10 0
      node_modules/@asciidoctor/cli/lib/cli.js
  24. 151 0
      node_modules/@asciidoctor/cli/lib/invoker.js
  25. 278 0
      node_modules/@asciidoctor/cli/lib/options.js
  26. 24 0
      node_modules/@asciidoctor/cli/lib/stdin.js
  27. 66 0
      node_modules/@asciidoctor/cli/package.json
  28. 21 0
      node_modules/@asciidoctor/core/LICENSE
  29. 47 0
      node_modules/@asciidoctor/core/README.md
  30. 21379 0
      node_modules/@asciidoctor/core/dist/browser/asciidoctor.js
  31. 579 0
      node_modules/@asciidoctor/core/dist/browser/asciidoctor.min.js
  32. 424 0
      node_modules/@asciidoctor/core/dist/css/asciidoctor.css
  33. 21109 0
      node_modules/@asciidoctor/core/dist/graalvm/asciidoctor.js
  34. 1495 0
      node_modules/@asciidoctor/core/dist/node/asciidoctor.js
  35. 105 0
      node_modules/@asciidoctor/core/package.json
  36. 3622 0
      node_modules/@asciidoctor/core/types/index.d.ts
  37. 202 0
      node_modules/@honkit/asciidoc/LICENSE
  38. 3 0
      node_modules/@honkit/asciidoc/README.md
  39. 3 0
      node_modules/@honkit/asciidoc/lib/index.d.ts
  40. 1 0
      node_modules/@honkit/asciidoc/lib/index.d.ts.map
  41. 9 0
      node_modules/@honkit/asciidoc/lib/index.js
  42. 15 0
      node_modules/@honkit/asciidoc/lib/toAsciidoc.d.ts
  43. 1 0
      node_modules/@honkit/asciidoc/lib/toAsciidoc.d.ts.map
  44. 41 0
      node_modules/@honkit/asciidoc/lib/toAsciidoc.js
  45. 7 0
      node_modules/@honkit/asciidoc/lib/toHTML.d.ts
  46. 1 0
      node_modules/@honkit/asciidoc/lib/toHTML.d.ts.map
  47. 23 0
      node_modules/@honkit/asciidoc/lib/toHTML.js
  48. 53 0
      node_modules/@honkit/asciidoc/package.json
  49. 202 0
      node_modules/@honkit/honkit-plugin-fontsettings/LICENSE
  50. 298 0
      node_modules/@honkit/honkit-plugin-fontsettings/README.md
  51. 238 0
      node_modules/@honkit/honkit-plugin-fontsettings/assets/fontsettings.js
  52. 309 0
      node_modules/@honkit/honkit-plugin-fontsettings/assets/website.css
  53. 4 0
      node_modules/@honkit/honkit-plugin-fontsettings/eslint.config.mjs
  54. 7 0
      node_modules/@honkit/honkit-plugin-fontsettings/index.js
  55. 63 0
      node_modules/@honkit/honkit-plugin-fontsettings/package.json
  56. 202 0
      node_modules/@honkit/honkit-plugin-highlight/LICENSE
  57. 30 0
      node_modules/@honkit/honkit-plugin-highlight/README.md
  58. 215 0
      node_modules/@honkit/honkit-plugin-highlight/css/ebook.css
  59. 533 0
      node_modules/@honkit/honkit-plugin-highlight/css/website.css
  60. 63 0
      node_modules/@honkit/honkit-plugin-highlight/index.js
  61. 38 0
      node_modules/@honkit/honkit-plugin-highlight/package.json
  62. 201 0
      node_modules/@honkit/honkit-plugin-theme-default/LICENSE
  63. 18 0
      node_modules/@honkit/honkit-plugin-theme-default/README.md
  64. 0 0
      node_modules/@honkit/honkit-plugin-theme-default/_assets/ebook/ebook.css
  65. 0 0
      node_modules/@honkit/honkit-plugin-theme-default/_assets/ebook/epub.css
  66. 0 0
      node_modules/@honkit/honkit-plugin-theme-default/_assets/ebook/mobi.css
  67. 0 0
      node_modules/@honkit/honkit-plugin-theme-default/_assets/ebook/pdf.css
  68. BIN
      node_modules/@honkit/honkit-plugin-theme-default/_assets/website/fonts/fontawesome/FontAwesome.otf
  69. BIN
      node_modules/@honkit/honkit-plugin-theme-default/_assets/website/fonts/fontawesome/fontawesome-webfont.eot
  70. 196 0
      node_modules/@honkit/honkit-plugin-theme-default/_assets/website/fonts/fontawesome/fontawesome-webfont.svg
  71. BIN
      node_modules/@honkit/honkit-plugin-theme-default/_assets/website/fonts/fontawesome/fontawesome-webfont.ttf
  72. BIN
      node_modules/@honkit/honkit-plugin-theme-default/_assets/website/fonts/fontawesome/fontawesome-webfont.woff
  73. BIN
      node_modules/@honkit/honkit-plugin-theme-default/_assets/website/fonts/fontawesome/fontawesome-webfont.woff2
  74. 0 0
      node_modules/@honkit/honkit-plugin-theme-default/_assets/website/gitbook.js
  75. BIN
      node_modules/@honkit/honkit-plugin-theme-default/_assets/website/images/apple-touch-icon-precomposed-152.png
  76. BIN
      node_modules/@honkit/honkit-plugin-theme-default/_assets/website/images/favicon.ico
  77. 0 0
      node_modules/@honkit/honkit-plugin-theme-default/_assets/website/style.css
  78. 0 0
      node_modules/@honkit/honkit-plugin-theme-default/_assets/website/theme.js
  79. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/ar.json
  80. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/bn.json
  81. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/ca.json
  82. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/cs.json
  83. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/de.json
  84. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/el.json
  85. 22 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/en.json
  86. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/es.json
  87. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/fa.json
  88. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/fi.json
  89. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/fr.json
  90. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/he.json
  91. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/it.json
  92. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/ja.json
  93. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/ko.json
  94. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/nl.json
  95. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/no.json
  96. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/pl.json
  97. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/pt.json
  98. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/ro.json
  99. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/ru.json
  100. 20 0
      node_modules/@honkit/honkit-plugin-theme-default/_i18n/sv.json

+ 1 - 0
node_modules/.bin/asciidoctor

@@ -0,0 +1 @@
+../@asciidoctor/cli/bin/asciidoctor

+ 1 - 0
node_modules/.bin/asciidoctorjs

@@ -0,0 +1 @@
+../@asciidoctor/cli/bin/asciidoctor

+ 1 - 0
node_modules/.bin/cpr

@@ -0,0 +1 @@
+../cpr/bin/cpr

+ 1 - 0
node_modules/.bin/direction

@@ -0,0 +1 @@
+../direction/cli.js

+ 1 - 0
node_modules/.bin/esparse

@@ -0,0 +1 @@
+../esprima/bin/esparse.js

+ 1 - 0
node_modules/.bin/esvalidate

@@ -0,0 +1 @@
+../esprima/bin/esvalidate.js

+ 1 - 0
node_modules/.bin/honkit

@@ -0,0 +1 @@
+../honkit/bin/honkit.js

+ 1 - 0
node_modules/.bin/is-docker

@@ -0,0 +1 @@
+../is-docker/cli.js

+ 1 - 0
node_modules/.bin/js-yaml

@@ -0,0 +1 @@
+../js-yaml/bin/js-yaml.js

+ 1 - 0
node_modules/.bin/juice

@@ -0,0 +1 @@
+../juice/bin/juice

+ 1 - 0
node_modules/.bin/kramed

@@ -0,0 +1 @@
+../kramed/bin/kramed

+ 1 - 0
node_modules/.bin/mime

@@ -0,0 +1 @@
+../mime/cli.js

+ 1 - 0
node_modules/.bin/mkdirp

@@ -0,0 +1 @@
+../mkdirp/bin/cmd.js

+ 1 - 0
node_modules/.bin/nunjucks-precompile

@@ -0,0 +1 @@
+../nunjucks/bin/precompile

+ 1 - 0
node_modules/.bin/resolve

@@ -0,0 +1 @@
+../resolve/bin/resolve

+ 1 - 0
node_modules/.bin/rimraf

@@ -0,0 +1 @@
+../rimraf/bin.js

+ 1 - 0
node_modules/.bin/semver

@@ -0,0 +1 @@
+../semver/bin/semver.js

+ 2856 - 0
node_modules/.package-lock.json

@@ -0,0 +1,2856 @@
+{
+  "name": "test",
+  "version": "1.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "node_modules/@asciidoctor/cli": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmmirror.com/@asciidoctor/cli/-/cli-3.5.0.tgz",
+      "integrity": "sha512-/VMHXcZBnZ9vgWfmqk9Hu0x0gMjPLup0YGq/xA8qCQuk11kUIZNMVQwgSsIUzOEwJqIUD7CgncJdtfwv1Ndxuw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "yargs": "16.2.0"
+      },
+      "bin": {
+        "asciidoctor": "bin/asciidoctor",
+        "asciidoctorjs": "bin/asciidoctor"
+      },
+      "engines": {
+        "node": ">=8.11",
+        "npm": ">=5.0.0"
+      },
+      "peerDependencies": {
+        "@asciidoctor/core": "^2.0.0-rc.1"
+      }
+    },
+    "node_modules/@asciidoctor/core": {
+      "version": "2.2.8",
+      "resolved": "https://registry.npmmirror.com/@asciidoctor/core/-/core-2.2.8.tgz",
+      "integrity": "sha512-oozXk7ZO1RAd/KLFLkKOhqTcG4GO3CV44WwOFg2gMcCsqCUTarvMT7xERIoWW2WurKbB0/ce+98r01p8xPOlBw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "asciidoctor-opal-runtime": "0.3.3",
+        "unxhr": "1.0.1"
+      },
+      "engines": {
+        "node": ">=8.11",
+        "npm": ">=5.0.0",
+        "yarn": ">=1.1.0"
+      }
+    },
+    "node_modules/@honkit/asciidoc": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmmirror.com/@honkit/asciidoc/-/asciidoc-6.0.2.tgz",
+      "integrity": "sha512-6lo5fhJUOQx7bRvfVZj4So8JTJeQR2a8rL5rQ1iozvkDe9/JFbpyV72wZxWDd9b/yaK0/5yflZUe0UNENQz9rg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@honkit/html": "6.0.2",
+        "asciidoctor": "^2.2.8",
+        "lodash": "^4.17.21"
+      }
+    },
+    "node_modules/@honkit/honkit-plugin-fontsettings": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmmirror.com/@honkit/honkit-plugin-fontsettings/-/honkit-plugin-fontsettings-6.0.2.tgz",
+      "integrity": "sha512-P2mj7/cDAIRkZCwFKhe3JNJw0rvcH6XKdc9xihKDJEI+w01fGT5ox/jnkY4UNz6kVfjDpriEr96e/OU2OCxNJQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "gitbook": ">=2.4.0"
+      }
+    },
+    "node_modules/@honkit/honkit-plugin-highlight": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmmirror.com/@honkit/honkit-plugin-highlight/-/honkit-plugin-highlight-6.0.2.tgz",
+      "integrity": "sha512-/9+Lkj8yLstTtZrwbjq530q2KZCRQZT6KWEI8d63vHnczuj6Mb6RmPXEeT4m4slxYgCdYn52ZskRMg9NKK+IlA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "highlight.js": "^11.10.0"
+      },
+      "engines": {
+        "gitbook": ">=2.4.0"
+      }
+    },
+    "node_modules/@honkit/honkit-plugin-theme-default": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmmirror.com/@honkit/honkit-plugin-theme-default/-/honkit-plugin-theme-default-6.0.2.tgz",
+      "integrity": "sha512-7qxJQDO+MA+tvJvQOexe00m1jMQ4U3dKXYPI1beetZCXV951NTQjKqKr4vCWLbOYXTdu4DALNrOg3+OyTvACeQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "gitbook": ">=3.0.0"
+      }
+    },
+    "node_modules/@honkit/html": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmmirror.com/@honkit/html/-/html-6.0.2.tgz",
+      "integrity": "sha512-28GlMEvBex9kfcqhKCDNJcBY+DV3XW2FLAJlcjuZO99SMktQe+4LDLNuoSi9mY+Z120Xwl92h7VBrXFJIY2bmA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "cheerio": "^1.0.0",
+        "lodash": "^4.17.21",
+        "q": "^1.5.1"
+      }
+    },
+    "node_modules/@honkit/markdown-legacy": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmmirror.com/@honkit/markdown-legacy/-/markdown-legacy-6.0.2.tgz",
+      "integrity": "sha512-Fvn794bf0cA20dKHGzdLkYiT1PXPZKdrZGXRMroXtToSbE5iM+eZ5QDBPD197gMTDlpo7HHChoxRMo1aReUikQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@honkit/html": "6.0.2",
+        "kramed": "0.5.6",
+        "lodash": "^4.17.21"
+      }
+    },
+    "node_modules/a-sync-waterfall": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz",
+      "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/ansi-colors": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz",
+      "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "node_modules/array-difference": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/array-difference/-/array-difference-0.0.1.tgz",
+      "integrity": "sha512-LMXXDKmRSsO+d7N73LyTBWlT+GiLfNUCWeeWmZivzJ1NxSPOobS+w8bIAAfGEV35oVBsk9u9cXii8dDceU5NPw==",
+      "dev": true,
+      "license": "MIT Expat"
+    },
+    "node_modules/asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/asciidoctor": {
+      "version": "2.2.8",
+      "resolved": "https://registry.npmmirror.com/asciidoctor/-/asciidoctor-2.2.8.tgz",
+      "integrity": "sha512-G+sDYWnNo+QHRkIvN5k7ASbvrd2bHuNXHlZ83+PjVFYtl0//as5iebq+Bdf3aSwXrkM7akcEJPUpdTjjP0MgYw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@asciidoctor/cli": "3.5.0",
+        "@asciidoctor/core": "2.2.8"
+      },
+      "bin": {
+        "asciidoctor": "bin/asciidoctor",
+        "asciidoctorjs": "bin/asciidoctor"
+      },
+      "engines": {
+        "node": ">=8.11",
+        "npm": ">=5.0.0",
+        "yarn": ">=1.1.0"
+      }
+    },
+    "node_modules/asciidoctor-opal-runtime": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmmirror.com/asciidoctor-opal-runtime/-/asciidoctor-opal-runtime-0.3.3.tgz",
+      "integrity": "sha512-/CEVNiOia8E5BMO9FLooo+Kv18K4+4JBFRJp8vUy/N5dMRAg+fRNV4HA+o6aoSC79jVU/aT5XvUpxSxSsTS8FQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "glob": "7.1.3",
+        "unxhr": "1.0.1"
+      },
+      "engines": {
+        "node": ">=8.11"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/bash-color": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmmirror.com/bash-color/-/bash-color-0.0.4.tgz",
+      "integrity": "sha512-ZNB4525U7BxT6v9C8LEtywyCgB4Pjnm7/bh+ru/Z9Ecxvg3fDjaJ6z305z9a61orQdbB1zqYHh5JbUqx4s4K0g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/body": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmmirror.com/body/-/body-5.1.0.tgz",
+      "integrity": "sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==",
+      "dev": true,
+      "dependencies": {
+        "continuable-cache": "^0.3.1",
+        "error": "^7.0.0",
+        "raw-body": "~1.1.0",
+        "safe-json-parse": "~1.0.1"
+      }
+    },
+    "node_modules/boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
+      }
+    },
+    "node_modules/bytes": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/bytes/-/bytes-1.0.0.tgz",
+      "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==",
+      "dev": true
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz",
+      "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.0",
+        "es-define-property": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
+      "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/cheerio": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/cheerio/-/cheerio-1.0.0.tgz",
+      "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cheerio-select": "^2.1.0",
+        "dom-serializer": "^2.0.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.1.0",
+        "encoding-sniffer": "^0.2.0",
+        "htmlparser2": "^9.1.0",
+        "parse5": "^7.1.2",
+        "parse5-htmlparser2-tree-adapter": "^7.0.0",
+        "parse5-parser-stream": "^7.1.2",
+        "undici": "^6.19.5",
+        "whatwg-mimetype": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=18.17"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+      }
+    },
+    "node_modules/cheerio-select": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz",
+      "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-select": "^5.1.0",
+        "css-what": "^6.1.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/cheerio/node_modules/dom-serializer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz",
+      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "entities": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/cheerio/node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/cliui": {
+      "version": "7.0.4",
+      "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/commander": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz",
+      "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/continuable-cache": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmmirror.com/continuable-cache/-/continuable-cache-0.3.1.tgz",
+      "integrity": "sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==",
+      "dev": true
+    },
+    "node_modules/cp": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/cp/-/cp-0.2.0.tgz",
+      "integrity": "sha512-4ftCvShHjIZG/zzomHyunNpBof3sOFTTmU6s6q9DdqAL/ANqrKV3pr6Z6kVfBI4hjn59DFLImrBqn7GuuMqSZA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/cpr": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/cpr/-/cpr-3.0.1.tgz",
+      "integrity": "sha512-Xch4PXQ/KC8lJ+KfJ9JI6eG/nmppLrPPWg5Q+vh65Qr9EjuJEubxh/H/Le1TmCZ7+Xv7iJuNRqapyOFZB+wsxA==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "graceful-fs": "^4.1.5",
+        "minimist": "^1.2.0",
+        "mkdirp": "~0.5.1",
+        "rimraf": "^2.5.4"
+      },
+      "bin": {
+        "cpr": "bin/cpr"
+      }
+    },
+    "node_modules/cpr/node_modules/mkdirp": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.6"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      }
+    },
+    "node_modules/crc": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz",
+      "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "buffer": "^5.1.0"
+      }
+    },
+    "node_modules/css-select": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmmirror.com/css-select/-/css-select-5.1.0.tgz",
+      "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-what": "^6.1.0",
+        "domhandler": "^5.0.2",
+        "domutils": "^3.0.1",
+        "nth-check": "^2.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/css-what": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz",
+      "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">= 6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/debug/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/destroy": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz",
+      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
+      }
+    },
+    "node_modules/direction": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmmirror.com/direction/-/direction-0.1.5.tgz",
+      "integrity": "sha512-HceXsAluGbXKCz2qCVbXFUH4Vn4eNMWxY5gzydMFMnS1zKSwvDASqLwcrYLIFDpwuZ63FUAqjDLEP1eicHt8DQ==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "direction": "cli.js"
+      }
+    },
+    "node_modules/dom-serializer": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.1.1.tgz",
+      "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^1.3.0",
+        "entities": "^1.1.1"
+      }
+    },
+    "node_modules/dom-serializer/node_modules/domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "dev": true,
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/domelementtype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz",
+      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/domhandler": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz",
+      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "domelementtype": "^2.3.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/domutils": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.1.0.tgz",
+      "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "dom-serializer": "^2.0.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
+    "node_modules/domutils/node_modules/dom-serializer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz",
+      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "entities": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/domutils/node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/dunder-proto": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.0.tgz",
+      "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/encoding-sniffer": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz",
+      "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "iconv-lite": "^0.6.3",
+        "whatwg-encoding": "^3.1.1"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
+      }
+    },
+    "node_modules/entities": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz",
+      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+      "dev": true,
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/error": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmmirror.com/error/-/error-7.0.2.tgz",
+      "integrity": "sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw==",
+      "dev": true,
+      "dependencies": {
+        "string-template": "~0.2.1",
+        "xtend": "~4.0.0"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-goat": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/escape-goat/-/escape-goat-3.0.0.tgz",
+      "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/faye-websocket": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.10.0.tgz",
+      "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "websocket-driver": ">=0.5.1"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/flat-cache": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-2.0.1.tgz",
+      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flatted": "^2.0.0",
+        "rimraf": "2.6.3",
+        "write": "1.0.3"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/flat-cache/node_modules/rimraf": {
+      "version": "2.6.3",
+      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz",
+      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/flatted/-/flatted-2.0.2.tgz",
+      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/front-matter": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/front-matter/-/front-matter-2.3.0.tgz",
+      "integrity": "sha512-+gOIDsGWHVAiWSDfg3vpiHwkOrwO4XNS3YQH5DMmneLEPWzdCAnbSQCtxReF4yPK1nszLvAmLeR2SprnDQDnyQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "js-yaml": "^3.10.0"
+      }
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.5.tgz",
+      "integrity": "sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.0",
+        "dunder-proto": "^1.0.0",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/gitbook-plugin-livereload": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/gitbook-plugin-livereload/-/gitbook-plugin-livereload-0.0.1.tgz",
+      "integrity": "sha512-+5xinicId2ZcbP6jBTFfQBnjz8nhoBgcOuQfKTEM6Yg9fBsmo2mxY6ubrx1b5ozuIMyfDLkSihx97A7+X+EtQQ==",
+      "dev": true,
+      "license": "Apache 2",
+      "engines": {
+        "gitbook": "*"
+      }
+    },
+    "node_modules/gitbook-plugin-lunr": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/gitbook-plugin-lunr/-/gitbook-plugin-lunr-1.2.0.tgz",
+      "integrity": "sha512-QBfFLMZmoyOfLzc5aZrlRCkmzb9YcSjzdnyJFiRI/nX+Nd6kK1XyN4DLGnNSMHkRcJchcpWiQ6XGqSqo7e+d+g==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "gitbook-plugin-search": "*",
+        "html-entities": "1.2.0",
+        "lunr": "0.5.12"
+      },
+      "engines": {
+        "gitbook": ">=3.0.0-pre.0"
+      }
+    },
+    "node_modules/gitbook-plugin-search": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmmirror.com/gitbook-plugin-search/-/gitbook-plugin-search-2.2.1.tgz",
+      "integrity": "sha512-oP9jhaKFUVPo756G9ywuuI43YdkZClSjfpFzNKe/a/Rcn3oVsrAM/PjdQ+dt65KfZVo3iW1LY4WdiZnNqzRP8g==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "gitbook": ">=3.0.0-pre.0"
+      }
+    },
+    "node_modules/github-slugid": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/github-slugid/-/github-slugid-1.0.1.tgz",
+      "integrity": "sha512-L5uVRzSM8jyWTgHUtaHwmymZW8S234JrIaOGotPK+0emNz9XsO6qqgw1KiI5YfP1SyBjG0ApNYU0vpb01teM9Q==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/glob": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmmirror.com/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-define-property": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/highlight.js": {
+      "version": "11.10.0",
+      "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.10.0.tgz",
+      "integrity": "sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/honkit": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmmirror.com/honkit/-/honkit-6.0.2.tgz",
+      "integrity": "sha512-5vV0jIyRHCigmvq0AVlgNenfNHdtOiaPK3L8N22NywBXNdrqszCEikhROKMWlqMB9CjpONXNcPu8Fj9tdnlYtQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@honkit/asciidoc": "6.0.2",
+        "@honkit/honkit-plugin-fontsettings": "6.0.2",
+        "@honkit/honkit-plugin-highlight": "6.0.2",
+        "@honkit/honkit-plugin-theme-default": "6.0.2",
+        "@honkit/html": "6.0.2",
+        "@honkit/markdown-legacy": "6.0.2",
+        "bash-color": "^0.0.4",
+        "cheerio": "^1.0.0",
+        "chokidar": "^3.6.0",
+        "commander": "^5.1.0",
+        "cp": "^0.2.0",
+        "cpr": "^3.0.1",
+        "crc": "^3.8.0",
+        "destroy": "^1.2.0",
+        "direction": "^0.1.5",
+        "dom-serializer": "^0.1.1",
+        "error": "7.0.2",
+        "escape-html": "^1.0.3",
+        "escape-string-regexp": "^4.0.0",
+        "extend": "^3.0.2",
+        "flat-cache": "^2.0.1",
+        "front-matter": "^2.3.0",
+        "gitbook-plugin-livereload": "^0.0.1",
+        "gitbook-plugin-lunr": "^1.2.0",
+        "gitbook-plugin-search": "^2.2.1",
+        "github-slugid": "^1.0.1",
+        "i18n-t": "^1.0.1",
+        "ignore": "^5.3.2",
+        "immutable": "^3.8.2",
+        "is": "^3.3.0",
+        "js-yaml": "^3.14.1",
+        "json-schema-defaults": "^0.1.1",
+        "jsonschema": "1.1.0",
+        "juice": "^8.1.0",
+        "lru_map": "^0.4.1",
+        "memoize-one": "^5.2.1",
+        "mkdirp": "^1.0.4",
+        "moment": "^2.30.1",
+        "nunjucks": "^3.2.4",
+        "nunjucks-do": "^1.0.0",
+        "object-path": "^0.11.8",
+        "omit-keys": "^0.1.0",
+        "open": "^7.4.2",
+        "q": "^1.5.1",
+        "resolve": "^1.22.8",
+        "semver": "^7.6.3",
+        "send": "^0.17.2",
+        "tiny-lr": "^1.1.1",
+        "tmp": "0.0.28",
+        "try-resolve": "^1.0.1",
+        "urijs": "^1.19.11"
+      },
+      "bin": {
+        "honkit": "bin/honkit.js"
+      }
+    },
+    "node_modules/html-entities": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/html-entities/-/html-entities-1.2.0.tgz",
+      "integrity": "sha512-0md7tlUUyb0BEQGsZzbqty1CgV6RESOoxdivt94AScqhBhYsPCCQCOaGvur/RospMjYpPJ7iFe3zw4Bu4SVA8g==",
+      "dev": true,
+      "engines": [
+        "node >= 0.4.0"
+      ],
+      "license": "MIT"
+    },
+    "node_modules/htmlparser2": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-9.1.0.tgz",
+      "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==",
+      "dev": true,
+      "funding": [
+        "https://github.com/fb55/htmlparser2?sponsor=1",
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.1.0",
+        "entities": "^4.5.0"
+      }
+    },
+    "node_modules/htmlparser2/node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/http-errors": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.8.1.tgz",
+      "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/http-parser-js": {
+      "version": "0.5.8",
+      "resolved": "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.8.tgz",
+      "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/i18n-t": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/i18n-t/-/i18n-t-1.0.1.tgz",
+      "integrity": "sha512-2NmZwpsnRTzpZfIP6Rcic16m5QBNVaIwVyU182+iatd6RNbWmGi74LTA/R/oDa58RZ87bHChLgWpmulEAoEruQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "lodash": "^4.13.1"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/ignore": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz",
+      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/immutable": {
+      "version": "3.8.2",
+      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-3.8.2.tgz",
+      "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/is": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/is/-/is-3.3.0.tgz",
+      "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.15.1",
+      "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.15.1.tgz",
+      "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-docker": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz",
+      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "is-docker": "cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-docker": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/isobject": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-0.2.0.tgz",
+      "integrity": "sha512-VaWq6XYAsbvM0wf4dyBO7WH9D7GosB7ZZlqrawI9BBiTMINBeCyqSKBa35m870MY3O4aM31pYyZi9DfGrYMJrQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/json-schema-defaults": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/json-schema-defaults/-/json-schema-defaults-0.1.1.tgz",
+      "integrity": "sha512-6Q5YS7pSDCXUbtS9uAFE+uUgvE45dBHCMyhqe6liJmL+oIa4zbACSS6nr6Lh+73mN+MnWBCExtN3C14S7Jrm7w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/jsonschema": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/jsonschema/-/jsonschema-1.1.0.tgz",
+      "integrity": "sha512-nQhT+ioA1XM8CpxJYlBfcUj6HF3f3f2KbLgV3tcxOt85RKpk2b0Do/C5BnCCCfdAarAjWRSFlln0Uanl4tBCHA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/juice": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmmirror.com/juice/-/juice-8.1.0.tgz",
+      "integrity": "sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cheerio": "1.0.0-rc.10",
+        "commander": "^6.1.0",
+        "mensch": "^0.3.4",
+        "slick": "^1.12.2",
+        "web-resource-inliner": "^6.0.1"
+      },
+      "bin": {
+        "juice": "bin/juice"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/juice/node_modules/cheerio": {
+      "version": "1.0.0-rc.10",
+      "resolved": "https://registry.npmmirror.com/cheerio/-/cheerio-1.0.0-rc.10.tgz",
+      "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cheerio-select": "^1.5.0",
+        "dom-serializer": "^1.3.2",
+        "domhandler": "^4.2.0",
+        "htmlparser2": "^6.1.0",
+        "parse5": "^6.0.1",
+        "parse5-htmlparser2-tree-adapter": "^6.0.1",
+        "tslib": "^2.2.0"
+      },
+      "engines": {
+        "node": ">= 6"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+      }
+    },
+    "node_modules/juice/node_modules/cheerio-select": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-1.6.0.tgz",
+      "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "css-select": "^4.3.0",
+        "css-what": "^6.0.1",
+        "domelementtype": "^2.2.0",
+        "domhandler": "^4.3.1",
+        "domutils": "^2.8.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/juice/node_modules/commander": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmmirror.com/commander/-/commander-6.2.1.tgz",
+      "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/juice/node_modules/css-select": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz",
+      "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-what": "^6.0.1",
+        "domhandler": "^4.3.1",
+        "domutils": "^2.8.0",
+        "nth-check": "^2.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/juice/node_modules/dom-serializer": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz",
+      "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.2.0",
+        "entities": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/juice/node_modules/domhandler": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz",
+      "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "domelementtype": "^2.2.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/juice/node_modules/domutils": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz",
+      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "dom-serializer": "^1.0.1",
+        "domelementtype": "^2.2.0",
+        "domhandler": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
+    "node_modules/juice/node_modules/entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/juice/node_modules/htmlparser2": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz",
+      "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+      "dev": true,
+      "funding": [
+        "https://github.com/fb55/htmlparser2?sponsor=1",
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.0.0",
+        "domutils": "^2.5.2",
+        "entities": "^2.0.0"
+      }
+    },
+    "node_modules/juice/node_modules/parse5": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz",
+      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/juice/node_modules/parse5-htmlparser2-tree-adapter": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+      "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "parse5": "^6.0.1"
+      }
+    },
+    "node_modules/kramed": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmmirror.com/kramed/-/kramed-0.5.6.tgz",
+      "integrity": "sha512-V4qwQAp8HPQPU6Ph9Q4bc+P+nKQWEGlWYLRDkK7n+CPaMi8/VRm9/R710tRmag4whLsnKR91CO9Ras/Rnff9bw==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "kramed": "bin/kramed"
+      }
+    },
+    "node_modules/livereload-js": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmmirror.com/livereload-js/-/livereload-js-2.4.0.tgz",
+      "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/lru_map": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/lru_map/-/lru_map-0.4.1.tgz",
+      "integrity": "sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/lunr": {
+      "version": "0.5.12",
+      "resolved": "https://registry.npmmirror.com/lunr/-/lunr-0.5.12.tgz",
+      "integrity": "sha512-/EtfOyuNP7BLVKhDvLyKJkFvCup2vwcIwQXCuasZEFk7XUJ4/blztVuefeLapUb1I5uMGsosN9A8J9Mu9A6yBg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/memoize-one": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-5.2.1.tgz",
+      "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/mensch": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmmirror.com/mensch/-/mensch-0.3.4.tgz",
+      "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/moment": {
+      "version": "2.30.1",
+      "resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz",
+      "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/node-fetch": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz",
+      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "whatwg-url": "^5.0.0"
+      },
+      "engines": {
+        "node": "4.x || >=6.0.0"
+      },
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/nth-check": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz",
+      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boolbase": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/nth-check?sponsor=1"
+      }
+    },
+    "node_modules/nunjucks": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmmirror.com/nunjucks/-/nunjucks-3.2.4.tgz",
+      "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "a-sync-waterfall": "^1.0.0",
+        "asap": "^2.0.3",
+        "commander": "^5.1.0"
+      },
+      "bin": {
+        "nunjucks-precompile": "bin/precompile"
+      },
+      "engines": {
+        "node": ">= 6.9.0"
+      },
+      "peerDependencies": {
+        "chokidar": "^3.3.0"
+      },
+      "peerDependenciesMeta": {
+        "chokidar": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/nunjucks-do": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/nunjucks-do/-/nunjucks-do-1.0.0.tgz",
+      "integrity": "sha512-GQwENqZdcSbni0iYfEiNi3hs634JBSQdxnbnd9CetGkMYPnpjG1Jn5DT/qgAaC/STwMc7C4MSIJvLSNertclSg==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.3",
+      "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.3.tgz",
+      "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-path": {
+      "version": "0.11.8",
+      "resolved": "https://registry.npmmirror.com/object-path/-/object-path-0.11.8.tgz",
+      "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10.12.0"
+      }
+    },
+    "node_modules/omit-keys": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/omit-keys/-/omit-keys-0.1.0.tgz",
+      "integrity": "sha512-JfTw3lVL54592o0Vb1frMN6DpS/wT8Uz/IWg1e0w2ZkjF4yyPYHGJAtdcBcUbp/RMf/LbdMzIz6QZ6ycaRCFUA==",
+      "dev": true,
+      "dependencies": {
+        "array-difference": "0.0.1",
+        "isobject": "^0.2.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/open": {
+      "version": "7.4.2",
+      "resolved": "https://registry.npmmirror.com/open/-/open-7.4.2.tgz",
+      "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-docker": "^2.0.0",
+        "is-wsl": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/parse5": {
+      "version": "7.2.1",
+      "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.2.1.tgz",
+      "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "entities": "^4.5.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/parse5-htmlparser2-tree-adapter": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+      "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "domhandler": "^5.0.3",
+        "parse5": "^7.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/parse5-parser-stream": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmmirror.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
+      "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "parse5": "^7.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/parse5/node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/q": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/q/-/q-1.5.1.tgz",
+      "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+      "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.6.0",
+        "teleport": ">=0.2.0"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.13.1",
+      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.1.tgz",
+      "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "side-channel": "^1.0.6"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/raw-body": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-1.1.7.tgz",
+      "integrity": "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "bytes": "1",
+        "string_decoder": "0.10"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/resolve": {
+      "version": "1.22.8",
+      "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz",
+      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-core-module": "^2.13.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      }
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/safe-json-parse": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz",
+      "integrity": "sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==",
+      "dev": true
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/semver": {
+      "version": "7.6.3",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz",
+      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/send": {
+      "version": "0.17.2",
+      "resolved": "https://registry.npmmirror.com/send/-/send-0.17.2.tgz",
+      "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "1.8.1",
+        "mime": "1.6.0",
+        "ms": "2.1.3",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/send/node_modules/destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/side-channel": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz",
+      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/slick": {
+      "version": "1.12.2",
+      "resolved": "https://registry.npmmirror.com/slick/-/slick-1.12.2.tgz",
+      "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==",
+      "dev": true,
+      "license": "MIT (http://mootools.net/license.txt)",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+      "dev": true,
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/statuses": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz",
+      "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/string_decoder": {
+      "version": "0.10.31",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz",
+      "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/string-template": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmmirror.com/string-template/-/string-template-0.2.1.tgz",
+      "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==",
+      "dev": true
+    },
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/tiny-lr": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/tiny-lr/-/tiny-lr-1.1.1.tgz",
+      "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "body": "^5.1.0",
+        "debug": "^3.1.0",
+        "faye-websocket": "~0.10.0",
+        "livereload-js": "^2.3.0",
+        "object-assign": "^4.1.0",
+        "qs": "^6.4.0"
+      }
+    },
+    "node_modules/tiny-lr/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/tmp": {
+      "version": "0.0.28",
+      "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.28.tgz",
+      "integrity": "sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "os-tmpdir": "~1.0.1"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/try-resolve": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/try-resolve/-/try-resolve-1.0.1.tgz",
+      "integrity": "sha512-yHeaPjCBzVaXwWl5IMUapTaTC2rn/eBYg2fsG2L+CvJd+ttFbk0ylDnpTO3wVhosmE1tQEvcebbBeKLCwScQSQ==",
+      "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "dev": true,
+      "license": "0BSD"
+    },
+    "node_modules/undici": {
+      "version": "6.21.0",
+      "resolved": "https://registry.npmmirror.com/undici/-/undici-6.21.0.tgz",
+      "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.17"
+      }
+    },
+    "node_modules/unxhr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/unxhr/-/unxhr-1.0.1.tgz",
+      "integrity": "sha512-MAhukhVHyaLGDjyDYhy8gVjWJyhTECCdNsLwlMoGFoNJ3o79fpQhtQuzmAE4IxCMDwraF4cW8ZjpAV0m9CRQbg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.11"
+      }
+    },
+    "node_modules/urijs": {
+      "version": "1.19.11",
+      "resolved": "https://registry.npmmirror.com/urijs/-/urijs-1.19.11.tgz",
+      "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/valid-data-url": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/valid-data-url/-/valid-data-url-3.0.1.tgz",
+      "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/web-resource-inliner": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmmirror.com/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz",
+      "integrity": "sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-colors": "^4.1.1",
+        "escape-goat": "^3.0.0",
+        "htmlparser2": "^5.0.0",
+        "mime": "^2.4.6",
+        "node-fetch": "^2.6.0",
+        "valid-data-url": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/web-resource-inliner/node_modules/dom-serializer": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz",
+      "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.2.0",
+        "entities": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/web-resource-inliner/node_modules/dom-serializer/node_modules/domhandler": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz",
+      "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "domelementtype": "^2.2.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/web-resource-inliner/node_modules/domhandler": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-3.3.0.tgz",
+      "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "domelementtype": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/web-resource-inliner/node_modules/domutils": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz",
+      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "dom-serializer": "^1.0.1",
+        "domelementtype": "^2.2.0",
+        "domhandler": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
+    "node_modules/web-resource-inliner/node_modules/domutils/node_modules/domhandler": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz",
+      "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "domelementtype": "^2.2.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/web-resource-inliner/node_modules/entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/web-resource-inliner/node_modules/htmlparser2": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-5.0.1.tgz",
+      "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^3.3.0",
+        "domutils": "^2.4.2",
+        "entities": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/htmlparser2?sponsor=1"
+      }
+    },
+    "node_modules/web-resource-inliner/node_modules/mime": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz",
+      "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+      "dev": true,
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/websocket-driver": {
+      "version": "0.7.4",
+      "resolved": "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz",
+      "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "http-parser-js": ">=0.5.1",
+        "safe-buffer": ">=5.1.0",
+        "websocket-extensions": ">=0.1.1"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/websocket-extensions": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/whatwg-encoding": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+      "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "iconv-lite": "0.6.3"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/whatwg-mimetype": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+      "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
+    "node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/write": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/write/-/write-1.0.3.tgz",
+      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "mkdirp": "^0.5.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/write/node_modules/mkdirp": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.6"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      }
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4"
+      }
+    },
+    "node_modules/y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/yargs": {
+      "version": "16.2.0",
+      "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/yargs-parser": {
+      "version": "20.2.9",
+      "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz",
+      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=10"
+      }
+    }
+  }
+}

+ 22 - 0
node_modules/@asciidoctor/cli/LICENSE

@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-2018 Asciidoctor
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+

+ 12 - 0
node_modules/@asciidoctor/cli/README.md

@@ -0,0 +1,12 @@
+# Asciidoctor.js CLI
+
+[![GitHub Actions Status](https://github.com/asciidoctor/asciidoctor-cli.js/actions/workflows/build.yml/badge.svg)](https://github.com/asciidoctor/asciidoctor-cli.js/actions/workflows/build.yml)
+[![npm version](https://img.shields.io/npm/v/@asciidoctor/cli.svg)](https://www.npmjs.org/package/@asciidoctor/cli)
+
+The Command Line Interface (CLI) for Asciidoctor.js.
+
+Install Asciidoctor.js globally, and you'll have access to the `asciidoctor` command anywhere on your system:
+
+    $ npm i -g asciidoctor
+
+Type `asciidoctor --help` for more information.

+ 9 - 0
node_modules/@asciidoctor/cli/bin/asciidoctor

@@ -0,0 +1,9 @@
+#!/usr/bin/env node
+
+'use strict'
+
+process.title = 'asciidoctor'
+const { Options, Invoker } = require('../lib/cli.js')
+
+const options = new Options().parse(process.argv)
+new Invoker(options).invoke()

+ 289 - 0
node_modules/@asciidoctor/cli/data/reference/syntax.adoc

@@ -0,0 +1,289 @@
+= AsciiDoc Syntax
+:icons: font
+:stem:
+:toc: left
+:url-docs: https://asciidoctor.org/docs
+:url-gem: https://rubygems.org/gems/asciidoctor
+
+A brief reference of the most commonly used AsciiDoc syntax.
+You can find the full documentation for the AsciiDoc syntax at {url-docs}.
+
+== Paragraphs
+
+A normal paragraph.
+Line breaks are not preserved.
+// line comments, which are lines that start with //, are skipped
+
+A blank line separates paragraphs.
+
+[%hardbreaks]
+This paragraph carries the `hardbreaks` option.
+Notice how line breaks are now preserved.
+
+ An indented (literal) paragraph disables text formatting,
+ preserves spaces and line breaks, and is displayed in a
+ monospaced font.
+
+[sidebar#id.role]
+A style, ID, and/or role gives a paragraph (or block) special meaning, like this sidebar.
+
+NOTE: An admonition paragraph, like this note, grabs the reader's attention.
+
+TIP: Convert this document using the `asciidoctor` command to see the output produced from it.
+
+== Text Formatting
+:hardbreaks:
+
+.Constrained (applied at word boundaries)
+*strong importance* (aka bold)
+_stress emphasis_ (aka italic)
+`monospaced` (aka typewriter text)
+"`double`" and '`single`' typographic quotes
++passthrough text+ (substitutions disabled)
+`+literal text+` (monospaced with substitutions disabled)
+
+.Unconstrained (applied anywhere)
+**C**reate+**R**ead+**U**pdate+**D**elete
+fan__freakin__tastic
+``mono``culture
+
+.Replacements
+A long time ago in a galaxy far, far away...
+(C) 1976 Arty Artisan
+I believe I shall--no, actually I won't.
+
+.Macros
+// where c=specialchars, q=quotes, a=attributes, r=replacements, m=macros, p=post_replacements, etc.
+The European icon:flag[role=blue] is blue & contains pass:[************] arranged in a icon:circle-o[role=yellow].
+The pass:c[->] operator is often referred to as the stabby lambda.
+Since `pass:[++]` has strong priority in AsciiDoc, you can rewrite pass:c,a,r[C++ => C{pp}].
+// activate stem support by adding `:stem:` to the document header
+stem:[sqrt(4) = 2]
+
+:!hardbreaks:
+== Attributes
+
+ // define attributes in the document header; must be flush with left margin
+ :name: value
+
+You can download and install Asciidoctor {asciidoctor-version} from {url-gem}.
+C{pp} is not required, only Ruby.
+Use a leading backslash to output a word enclosed in curly braces, like \{name}.
+
+== Links
+
+[%hardbreaks]
+https://example.org/page[A webpage]
+link:../path/to/file.txt[A local file]
+xref:document.adoc[A sibling document]
+mailto:hello@example.org[Email to say hello!]
+
+== Anchors
+
+[[idname,reference text]]
+// or written using normal block attributes as `[#idname,reftext=reference text]`
+A paragraph (or any block) with an anchor (aka ID) and reftext.
+
+See <<idname>> or <<idname,optional text of internal link>>.
+
+xref:document.adoc#idname[Jumps to anchor in another document].
+
+This paragraph has a footnote.footnote:[This is the text of the footnote.]
+
+== Lists
+
+=== Unordered
+
+* level 1
+** level 2
+*** level 3
+**** level 4
+***** etc.
+* back at level 1
++
+Attach a block or paragraph to a list item using a list continuation (which you can enclose in an open block).
+
+.Some Authors
+[circle]
+- Edgar Allen Poe
+- Sheri S. Tepper
+- Bill Bryson
+
+=== Ordered
+
+. Step 1
+. Step 2
+.. Step 2a
+.. Step 2b
+. Step 3
+
+.Remember your Roman numerals?
+[upperroman]
+. is one
+. is two
+. is three
+
+=== Checklist
+
+* [x] checked
+* [ ] not checked
+
+=== Callout
+
+// enable callout bubbles by adding `:icons: font` to the document header
+[,ruby]
+----
+puts 'Hello, World!' # <1>
+----
+<1> Prints `Hello, World!` to the console.
+
+=== Description
+
+first term:: description of first term
+second term::
+description of second term
+
+== Document Structure
+
+=== Header
+
+ // header must be flush with left margin
+ = Document Title
+ Author Name <author@example.org>
+ v1.0, 2019-01-01
+
+=== Sections
+
+ // must be flush with left margin
+ = Document Title (Level 0)
+ == Level 1
+ === Level 2
+ ==== Level 3
+ ===== Level 4
+ ====== Level 5
+ == Back at Level 1
+
+=== Includes
+
+ // must be flush with left margin
+ include::basics.adoc[]
+
+ // define -a allow-uri-read to allow content to be read from URI
+ include::https://example.org/installation.adoc[]
+
+== Blocks
+
+--
+open - a general-purpose content wrapper; useful for enclosing content to attach to a list item
+--
+
+// recognized types include CAUTION, IMPORTANT, NOTE, TIP, and WARNING
+// enable admonition icons by setting `:icons: font` in the document header
+[NOTE]
+====
+admonition - a notice for the reader, ranging in severity from a tip to an alert
+====
+
+====
+example - a demonstration of the concept being documented
+====
+
+.Toggle Me
+[%collapsible]
+====
+collapsible - these details are revealed by clicking the title
+====
+
+****
+sidebar - auxiliary content that can be read independently of the main content
+****
+
+....
+literal - an exhibit that features program output
+....
+
+----
+listing - an exhibit that features program input, source code, or the contents of a file
+----
+
+[,language]
+----
+source - a listing that is embellished with (colorized) syntax highlighting
+----
+
+```language
+fenced code - a shorthand syntax for the source block
+```
+
+[,attribution,citetitle]
+____
+quote - a quotation or excerpt; attribution with title of source are optional
+____
+
+[verse,attribution,citetitle]
+____
+verse - a literary excerpt, often a poem; attribution with title of source are optional
+____
+
+++++
+pass - content passed directly to the output document; often raw HTML
+++++
+
+// activate stem support by adding `:stem:` to the document header
+[stem]
+++++
+x = y^2
+++++
+
+////
+comment - content which is not included in the output document
+////
+
+== Tables
+
+.Table Attributes
+[cols=>1h;2d,width=50%,frame=topbot]
+|===
+| Attribute Name | Values
+
+| options
+| header,footer,autowidth
+
+| cols
+| colspec[;colspec;...]
+
+| grid
+| all \| cols \| rows \| none
+
+| frame
+| all \| sides \| topbot \| none
+
+| stripes
+| all \| even \| odd \| none
+
+| width
+| (0%..100%)
+
+| format
+| psv {vbar} csv {vbar} dsv
+|===
+
+== Multimedia
+
+image::screenshot.png[block image,800,450]
+
+Press image:reload.svg[reload,16,opts=interactive] to reload the page.
+
+video::movie.mp4[width=640,start=60,end=140,options=autoplay]
+
+video::aHjpOzsQ9YI[youtube]
+
+video::300817511[vimeo]
+
+== Breaks
+
+// thematic break (aka horizontal rule)
+---
+
+// page break
+<<<

+ 10 - 0
node_modules/@asciidoctor/cli/lib/cli.js

@@ -0,0 +1,10 @@
+'use strict'
+
+const Options = require('./options')
+const Invoker = require('./invoker')
+
+module.exports = {
+  processor: Invoker.asciidoctor,
+  Options,
+  Invoker
+}

+ 151 - 0
node_modules/@asciidoctor/cli/lib/invoker.js

@@ -0,0 +1,151 @@
+const fs = require('fs')
+const ospath = require('path')
+const asciidoctor = require('@asciidoctor/core')()
+const pkg = require('../package.json')
+const stdin = require('./stdin')
+
+const DOT_RELATIVE_RX = new RegExp(`^\\.{1,2}[/${ospath.sep.replace('/', '').replace('\\', '\\\\')}]`)
+
+class Invoker {
+  constructor (options) {
+    this.options = options
+  }
+
+  async invoke () {
+    const processArgs = this.options.argv.slice(2)
+    const { args } = this.options
+    const { verbose, version, files } = args
+    if (version || (verbose && processArgs.length === 1)) {
+      this.showVersion()
+      process.exit(0)
+    }
+    Invoker.prepareProcessor(args, asciidoctor)
+    const options = this.options.options
+    const failureLevel = options.failure_level
+    if (this.options.stdin) {
+      await Invoker.convertFromStdin(options, args)
+      Invoker.exit(failureLevel)
+    } else if (files && files.length > 0) {
+      Invoker.processFiles(files, verbose, args.timings, options)
+      Invoker.exit(failureLevel)
+    } else {
+      this.showHelp()
+      process.exit(0)
+    }
+  }
+
+  showHelp () {
+    if (this.options.args.help === 'syntax') {
+      console.log(fs.readFileSync(ospath.join(__dirname, '..', 'data', 'reference', 'syntax.adoc'), 'utf8'))
+    } else {
+      this.options.yargs.showHelp()
+    }
+  }
+
+  showVersion () {
+    console.log(this.version())
+  }
+
+  version () {
+    const releaseName = process.release ? process.release.name : 'node'
+    return `Asciidoctor.js ${asciidoctor.getVersion()} (Asciidoctor ${asciidoctor.getCoreVersion()}) [https://asciidoctor.org]
+Runtime Environment (${releaseName} ${process.version} on ${process.platform})
+CLI version ${pkg.version}`
+  }
+
+  /**
+   * @deprecated Use {#showVersion}. Will be removed in version 4.0.
+   */
+  static printVersion () {
+    console.log(new Invoker().version())
+  }
+
+  static async readFromStdin () {
+    return stdin.read()
+  }
+
+  static async convertFromStdin (options, args) {
+    const data = await Invoker.readFromStdin()
+    if (args.timings) {
+      const timings = asciidoctor.Timings.create()
+      const instanceOptions = Object.assign({}, options, { timings })
+      Invoker.convert(asciidoctor.convert, data, instanceOptions)
+      timings.printReport(process.stderr, '-')
+    } else {
+      Invoker.convert(asciidoctor.convert, data, options)
+    }
+  }
+
+  static convert (processorFn, input, options) {
+    try {
+      processorFn.apply(asciidoctor, [input, options])
+    } catch (e) {
+      if (e && e.name === 'NotImplementedError' && e.message === `asciidoctor: FAILED: missing converter for backend '${options.backend}'. Processing aborted.`) {
+        console.error(`> Error: missing converter for backend '${options.backend}'. Processing aborted.`)
+        console.error('> You might want to require a Node.js package with --require option to support this backend.')
+        process.exit(1)
+      }
+      throw e
+    }
+  }
+
+  static convertFile (file, options) {
+    Invoker.convert(asciidoctor.convertFile, file, options)
+  }
+
+  static processFiles (files, verbose, timings, options) {
+    files.forEach((file) => {
+      if (verbose) {
+        console.log(`converting file ${file}`)
+      }
+      if (timings) {
+        const timings = asciidoctor.Timings.create()
+        const instanceOptions = Object.assign({}, options, { timings })
+        Invoker.convertFile(file, instanceOptions)
+        timings.printReport(process.stderr, file)
+      } else {
+        Invoker.convertFile(file, options)
+      }
+    })
+  }
+
+  static requireLibrary (requirePath, cwd = process.cwd()) {
+    if (requirePath.charAt(0) === '.' && DOT_RELATIVE_RX.test(requirePath)) {
+      // NOTE require resolves a dot-relative path relative to current file; resolve relative to cwd instead
+      requirePath = ospath.resolve(requirePath)
+    } else if (!ospath.isAbsolute(requirePath)) {
+      // NOTE appending node_modules prevents require from looking elsewhere before looking in these paths
+      const paths = [cwd, ospath.dirname(__dirname)].map((start) => ospath.join(start, 'node_modules'))
+      requirePath = require.resolve(requirePath, { paths })
+    }
+    return require(requirePath)
+  }
+
+  static prepareProcessor (argv, asciidoctor) {
+    const requirePaths = argv.require
+    if (requirePaths) {
+      requirePaths.forEach((requirePath) => {
+        const lib = Invoker.requireLibrary(requirePath)
+        if (lib && typeof lib.register === 'function') {
+          // REMIND: it could be an extension or a converter.
+          // the register function on a converter does not take any argument
+          // but the register function on an extension expects one argument (the extension registry)
+          // Until we revisit the API for extension and converter, we pass the registry as the first argument
+          lib.register(asciidoctor.Extensions)
+        }
+      })
+    }
+  }
+
+  static exit (failureLevel) {
+    let code = 0
+    const logger = asciidoctor.LoggerManager.getLogger()
+    if (logger && typeof logger.getMaxSeverity === 'function' && logger.getMaxSeverity() && logger.getMaxSeverity() >= failureLevel) {
+      code = 1
+    }
+    process.exit(code)
+  }
+}
+
+module.exports = Invoker
+module.exports.asciidoctor = asciidoctor

+ 278 - 0
node_modules/@asciidoctor/cli/lib/options.js

@@ -0,0 +1,278 @@
+/* global Opal */
+const yargs = require('yargs')
+const asciidoctor = require('@asciidoctor/core')()
+
+const convertOptions = (args, attrs) => {
+  const attributes = attrs || []
+  const backend = args.backend
+  const doctype = args.doctype
+  const safeMode = args['safe-mode']
+  const embedded = args.embedded === true || args['no-header-footer'] === true || args.standalone === false
+  const standalone = !embedded
+  const sectionNumbers = args['section-numbers']
+  const baseDir = args['base-dir']
+  const destinationDir = args['destination-dir']
+  const outFile = args['out-file']
+  const templateDir = args['template-dir']
+  const templateEngine = args['template-engine']
+  const quiet = args.quiet
+  const verbose = args.verbose
+  const timings = args.timings
+  const trace = args.trace
+  const requireLib = args.require
+  let level = args['failure-level'].toUpperCase()
+  if (level === 'WARNING') {
+    level = 'WARN'
+  }
+  const failureLevel = asciidoctor.LoggerSeverity[level]
+  const debug = verbose && args['verbose-sole-argument'] !== true
+  if (debug) {
+    console.log('require ' + requireLib)
+    console.log('backend ' + backend)
+    console.log('doctype ' + doctype)
+    console.log('standalone ' + standalone)
+    console.log('section-numbers ' + sectionNumbers)
+    console.log('failure-level ' + level)
+    console.log('quiet ' + quiet)
+    console.log('verbose ' + verbose)
+    console.log('timings ' + timings)
+    console.log('trace ' + trace)
+    console.log('base-dir ' + baseDir)
+    console.log('destination-dir ' + destinationDir)
+    console.log('template-dir ' + templateDir)
+    console.log('template-engine ' + templateEngine)
+  }
+  const verboseMode = quiet ? 0 : verbose ? 2 : 1
+  if (sectionNumbers) {
+    attributes.push('sectnums')
+  }
+  const cliAttributes = args.attribute
+  if (cliAttributes) {
+    attributes.push(...cliAttributes)
+  }
+  if (debug) {
+    console.log('verbose-mode ' + verboseMode)
+    console.log('attributes ' + attributes)
+  }
+  const options = {
+    doctype: doctype,
+    safe: safeMode,
+    standalone: standalone,
+    failure_level: failureLevel,
+    verbose: verboseMode,
+    timings: timings,
+    trace: trace
+  }
+  if (backend) {
+    options.backend = backend
+  }
+  if (baseDir != null) {
+    options.base_dir = baseDir
+  }
+  if (destinationDir != null) {
+    options.to_dir = destinationDir
+  }
+  if (templateDir) {
+    options.template_dirs = templateDir
+  }
+  if (templateEngine) {
+    options.template_engine = templateEngine
+  }
+  if (typeof outFile !== 'undefined') {
+    if (outFile === '') {
+      options.to_file = '-'
+    } else {
+      options.to_file = outFile
+      options.mkdirs = true
+    }
+  } else {
+    options.mkdirs = true
+  }
+  options.attributes = attributes
+  if (debug) {
+    console.log('options ' + JSON.stringify(options))
+  }
+  if (options.to_file === '-') {
+    options.to_file = Opal.gvars.stdout
+  }
+  return options
+}
+
+class Options {
+  constructor (options) {
+    this.options = options || {}
+    this.args = {
+      standalone: typeof this.options.standalone !== 'undefined' ? this.options.standalone : true,
+      backend: this.options.backend,
+      'safe-mode': typeof this.options.safe !== 'undefined' ? this.options.safe : 'unsafe'
+    }
+    if (Array.isArray(this.options.attributes)) {
+      this.attributes = options.attributes
+    } else if (typeof this.options.attributes === 'object') {
+      const attrs = this.options.attributes
+      const attributes = []
+      Object.keys(attrs).forEach((key) => {
+        attributes.push(`${key}=${attrs[key]}`)
+      })
+      this.attributes = attributes
+    } else {
+      this.attributes = []
+    }
+    this.cmd = yargs
+      .option('backend', {
+        alias: 'b',
+        describe: 'set output format backend',
+        type: 'string'
+      })
+      .option('doctype', {
+        alias: 'd',
+        describe: 'document type to use when converting document',
+        choices: ['article', 'book', 'manpage', 'inline']
+      })
+      .option('out-file', {
+        alias: 'o',
+        describe: 'output file (default: based on path of input file) use \'\' to output to STDOUT',
+        type: 'string'
+      })
+      .option('safe-mode', {
+        alias: 'S',
+        describe: 'set safe mode level explicitly, disables potentially dangerous macros in source files, such as include::[]',
+        choices: ['unsafe', 'safe', 'server', 'secure']
+      })
+      .option('embedded', {
+        alias: 'e',
+        describe: 'suppress enclosing document structure and output an embedded document',
+        type: 'boolean'
+      })
+      .option('no-header-footer', {
+        alias: 's',
+        describe: 'suppress enclosing document structure and output an embedded document',
+        type: 'boolean'
+      })
+      .option('section-numbers', {
+        alias: 'n',
+        default: false,
+        describe: 'auto-number section titles in the HTML backend disabled by default',
+        type: 'boolean'
+      })
+      .option('base-dir', {
+        // QUESTION: should we check that the directory exists ? coerce to a directory ?
+        alias: 'B',
+        describe: 'base directory containing the document and resources (default: directory of source file)',
+        type: 'string'
+      })
+      .option('destination-dir', {
+        // QUESTION: should we check that the directory exists ? coerce to a directory ?
+        alias: 'D',
+        describe: 'destination output directory (default: directory of source file)',
+        type: 'string'
+      })
+      .option('failure-level', {
+        default: 'FATAL',
+        describe: 'set minimum logging level that triggers non-zero exit code',
+        choices: ['info', 'INFO', 'warn', 'WARN', 'warning', 'WARNING', 'error', 'ERROR', 'fatal', 'FATAL']
+      })
+      .option('quiet', {
+        alias: 'q',
+        default: false,
+        describe: 'suppress warnings',
+        type: 'boolean'
+      })
+      .option('trace', {
+        default: false,
+        describe: 'include backtrace information on errors',
+        type: 'boolean'
+      })
+      .option('verbose', {
+        alias: 'v',
+        default: false,
+        describe: 'enable verbose mode',
+        type: 'boolean'
+      })
+      .option('timings', {
+        alias: 't',
+        default: false,
+        describe: 'enable timings mode',
+        type: 'boolean'
+      })
+      .option('template-dir', {
+        alias: 'T',
+        array: true,
+        describe: 'a directory containing custom converter templates that override the built-in converter (may be specified multiple times)',
+        type: 'string'
+      })
+      .option('template-engine', {
+        alias: 'E',
+        describe: 'template engine to use for the custom converter templates',
+        type: 'string'
+      })
+      .option('attribute', {
+        alias: 'a',
+        array: true,
+        describe: 'a document attribute to set in the form of key, key! or key=value pair',
+        type: 'string'
+      })
+      .option('require', {
+        alias: 'r',
+        array: true,
+        describe: 'require the specified library before executing the processor, using the standard Node require',
+        type: 'string'
+      })
+      .version(false)
+      .option('version', {
+        alias: 'V',
+        default: false,
+        describe: 'display the version and runtime environment (or -v if no other flags or arguments)',
+        type: 'boolean'
+      })
+      .help(false)
+      .option('help', {
+        describe: `print a help message
+show this usage if TOPIC is not specified or recognized
+show an overview of the AsciiDoc syntax if TOPIC is syntax`,
+        type: 'string'
+      })
+      .nargs('template-dir', 1)
+      .nargs('attribute', 1)
+      .nargs('require', 1)
+      .usage(`$0 [options...] files...
+Translate the AsciiDoc source file or file(s) into the backend output format (e.g., HTML 5, DocBook 5, etc.)
+By default, the output is written to a file with the basename of the source file and the appropriate extension`)
+      .example('$0 -b html5 doc.asciidoc', 'convert an AsciiDoc file to HTML5; result will be written in a file named doc.html')
+      .epilogue('For more information, please visit https://asciidoctor.org/docs')
+    this.yargs = yargs
+  }
+
+  parse (argv) {
+    const processArgs = argv.slice(2)
+    this.argv = argv
+    const args = this.argsParser().parse(processArgs)
+    Object.assign(this.args, args)
+    const files = this.args.files
+    this.stdin = files && files.length === 0 && processArgs[processArgs.length - 1] === '-'
+    if (this.stdin) {
+      this.args['out-file'] = this.args['out-file'] || '-'
+    }
+    this.args['verbose-sole-argument'] = this.args.verbose && processArgs.length === 1
+    const options = convertOptions(this.args, this.attributes)
+    Object.assign(this.options, options)
+    return this
+  }
+
+  addOption (key, opt) {
+    this.cmd.option(key, opt)
+    return this
+  }
+
+  argsParser () {
+    return this.yargs
+      .detectLocale(false)
+      .wrap(Math.min(120, this.yargs.terminalWidth()))
+      .command('$0 [files...]', '', () => this.cmd)
+      .parserConfiguration({
+        'boolean-negation': false
+      })
+  }
+}
+
+module.exports = Options

+ 24 - 0
node_modules/@asciidoctor/cli/lib/stdin.js

@@ -0,0 +1,24 @@
+const readFromStdin = async () => new Promise((resolve, reject) => {
+  const encoding = 'utf-8'
+  let data
+  data = ''
+  process.stdin.setEncoding(encoding)
+  process.stdin.on('readable', function () {
+    const chunk = process.stdin.read()
+    if (chunk !== null) {
+      data += chunk
+    }
+  })
+  process.stdin.on('error', (error) => {
+    reject(error)
+  })
+  process.stdin.on('end', function () {
+    // There will be a trailing \n from the user hitting enter. Get rid of it.
+    data = data.replace(/\n$/, '')
+    resolve(data)
+  })
+})
+
+module.exports = {
+  read: readFromStdin
+}

+ 66 - 0
node_modules/@asciidoctor/cli/package.json

@@ -0,0 +1,66 @@
+{
+  "name": "@asciidoctor/cli",
+  "version": "3.5.0",
+  "description": "The Command Line Interface (CLI) for Asciidoctor.js",
+  "main": "lib/cli.js",
+  "engines": {
+    "node": ">=8.11",
+    "npm": ">=5.0.0"
+  },
+  "files": [
+    "bin",
+    "lib",
+    "data"
+  ],
+  "bin": {
+    "asciidoctor": "bin/asciidoctor",
+    "asciidoctorjs": "bin/asciidoctor"
+  },
+  "preferGlobal": true,
+  "scripts": {
+    "test": "./bin/asciidoctor --version && mocha",
+    "lint": "standard bin/* lib/*.js test/*.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/asciidoctor/asciidoctor-cli.js.git"
+  },
+  "publishConfig": {
+    "access": "public"
+  },
+  "keywords": [
+    "asciidoc",
+    "asciidoctor",
+    "asciidoctor-cli",
+    "opal",
+    "javascript",
+    "library"
+  ],
+  "authors": [
+    "Dan Allen (https://github.com/mojavelinux)",
+    "Guillaume Grossetie (https://github.com/mogztter)",
+    "Anthonny Quérouil (https://github.com/anthonny)"
+  ],
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/asciidoctor/asciidoctor-cli.js/issues"
+  },
+  "homepage": "https://github.com/asciidoctor/asciidoctor-cli.js",
+  "dependencies": {
+    "yargs": "16.2.0"
+  },
+  "devDependencies": {
+    "@asciidoctor/core": "^2.0.0-rc.1",
+    "chai": "^4.2.0",
+    "dirty-chai": "^2.0.1",
+    "mocha": "8.4.0",
+    "sinon": "^10.0.0",
+    "standard": "16.0.3"
+  },
+  "peerDependencies": {
+    "@asciidoctor/core": "^2.0.0-rc.1"
+  },
+  "standard": {
+    "env": "mocha"
+  }
+}

+ 21 - 0
node_modules/@asciidoctor/core/LICENSE

@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (C) 2019 Dan Allen, Guillaume Grossetie, Anthonny Quérouil and the Asciidoctor Project
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 47 - 0
node_modules/@asciidoctor/core/README.md

@@ -0,0 +1,47 @@
+# Asciidoctor core
+
+This package provides Asciidoctor core functionality:
+
+- parser
+- built-in converters
+- extensions
+
+## Install
+
+    $ npm i @asciidoctor/core --save
+
+## Usage
+
+Here is a simple example that converts AsciiDoc to HTML5:
+
+**sample.js**
+
+```javascript
+const asciidoctor = require('@asciidoctor/core')() // <1>
+const content = 'http://asciidoctor.org[*Asciidoctor*] ' +
+  'running on https://opalrb.com[_Opal_] ' +
+  'brings AsciiDoc to Node.js!'
+const html = asciidoctor.convert(content) // <2>
+console.log(html) // <3>
+```
+- <1> Instantiate the Asciidoctor.js library
+- <2> Convert AsciiDoc content to HTML5 using Asciidoctor.js
+- <3> Print the HTML5 output to the console
+
+Save the file as _sample.js_ and run it using the `node` command:
+
+    $ node sample.js
+
+You should see the following output in your terminal:
+
+```html
+<div class="paragraph">
+<p><a href="http://asciidoctor.org"><strong>Asciidoctor</strong></a> running on <a href="http://opalrb.com"><em>Opal</em></a> brings AsciiDoc to Node.js!</p>
+</div>
+```
+
+If you want to know more about Asciidoctor.js, please read the [User Manual](https://asciidoctor-docs.netlify.com/asciidoctor.js/).
+
+## Changelog
+
+Refer to the [CHANGELOG](https://github.com/asciidoctor/asciidoctor.js/blob/master/CHANGELOG.adoc) for a complete list of changes.

Файловите разлики са ограничени, защото са твърде много
+ 21379 - 0
node_modules/@asciidoctor/core/dist/browser/asciidoctor.js


Файловите разлики са ограничени, защото са твърде много
+ 579 - 0
node_modules/@asciidoctor/core/dist/browser/asciidoctor.min.js


+ 424 - 0
node_modules/@asciidoctor/core/dist/css/asciidoctor.css

@@ -0,0 +1,424 @@
+/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
+/* Uncomment the following line when using as a custom stylesheet */
+/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
+html{font-family:sans-serif;-webkit-text-size-adjust:100%}
+a{background:none}
+a:focus{outline:thin dotted}
+a:active,a:hover{outline:0}
+h1{font-size:2em;margin:.67em 0}
+b,strong{font-weight:bold}
+abbr{font-size:.9em}
+abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
+dfn{font-style:italic}
+hr{height:0}
+mark{background:#ff0;color:#000}
+code,kbd,pre,samp{font-family:monospace;font-size:1em}
+pre{white-space:pre-wrap}
+q{quotes:"\201C" "\201D" "\2018" "\2019"}
+small{font-size:80%}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+sup{top:-.5em}
+sub{bottom:-.25em}
+img{border:0}
+svg:not(:root){overflow:hidden}
+figure{margin:0}
+audio,video{display:inline-block}
+audio:not([controls]){display:none;height:0}
+fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
+legend{border:0;padding:0}
+button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
+button,input{line-height:normal}
+button,select{text-transform:none}
+button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
+button[disabled],html input[disabled]{cursor:default}
+input[type=checkbox],input[type=radio]{padding:0}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
+textarea{overflow:auto;vertical-align:top}
+table{border-collapse:collapse;border-spacing:0}
+*,::before,::after{box-sizing:border-box}
+html,body{font-size:100%}
+body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
+a:hover{cursor:pointer}
+img,object,embed{max-width:100%;height:auto}
+object,embed{height:100%}
+img{-ms-interpolation-mode:bicubic}
+.left{float:left!important}
+.right{float:right!important}
+.text-left{text-align:left!important}
+.text-right{text-align:right!important}
+.text-center{text-align:center!important}
+.text-justify{text-align:justify!important}
+.hide{display:none}
+img,object,svg{display:inline-block;vertical-align:middle}
+textarea{height:auto;min-height:50px}
+select{width:100%}
+.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
+div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
+a{color:#2156a5;text-decoration:underline;line-height:inherit}
+a:hover,a:focus{color:#1d4b8f}
+a img{border:0}
+p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
+p aside{font-size:.875em;line-height:1.35;font-style:italic}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
+h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
+h1{font-size:2.125em}
+h2{font-size:1.6875em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
+h4,h5{font-size:1.125em}
+h6{font-size:1em}
+hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
+em,i{font-style:italic;line-height:inherit}
+strong,b{font-weight:bold;line-height:inherit}
+small{font-size:60%;line-height:inherit}
+code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
+ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
+ul,ol{margin-left:1.5em}
+ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
+ul.circle{list-style-type:circle}
+ul.disc{list-style-type:disc}
+ul.square{list-style-type:square}
+ul.circle ul:not([class]),ul.disc ul:not([class]),ul.square ul:not([class]){list-style:inherit}
+ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
+dl dt{margin-bottom:.3125em;font-weight:bold}
+dl dd{margin-bottom:1.25em}
+blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
+blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
+@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
+h1{font-size:2.75em}
+h2{font-size:2.3125em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
+h4{font-size:1.4375em}}
+table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
+table thead,table tfoot{background:#f7f8f7}
+table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
+table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
+table tr.even,table tr.alt{background:#f8f8f7}
+table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
+h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
+.center{margin-left:auto;margin-right:auto}
+.stretch{width:100%}
+.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
+.clearfix::after,.float-group::after{clear:both}
+:not(pre).nobreak{word-wrap:normal}
+:not(pre).nowrap{white-space:nowrap}
+:not(pre).pre-wrap{white-space:pre-wrap}
+:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
+pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
+pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
+pre>code{display:block}
+pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
+em em{font-style:normal}
+strong strong{font-weight:400}
+.keyseq{color:rgba(51,51,51,.8)}
+kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
+.keyseq kbd:first-child{margin-left:0}
+.keyseq kbd:last-child{margin-right:0}
+.menuseq,.menuref{color:#000}
+.menuseq b:not(.caret),.menuref{font-weight:inherit}
+.menuseq{word-spacing:-.02em}
+.menuseq b.caret{font-size:1.25em;line-height:.8}
+.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
+b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
+b.button::before{content:"[";padding:0 3px 0 2px}
+b.button::after{content:"]";padding:0 2px 0 3px}
+p a>code:hover{color:rgba(0,0,0,.9)}
+#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
+#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
+#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
+#content{margin-top:1.25em}
+#content::before{content:none}
+#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
+#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
+#header>h1:only-child{border-bottom:1px solid #dddddf;padding-bottom:8px}
+#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
+#header .details span:first-child{margin-left:-.125em}
+#header .details span.email a{color:rgba(0,0,0,.85)}
+#header .details br{display:none}
+#header .details br+span::before{content:"\00a0\2013\00a0"}
+#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
+#header .details br+span#revremark::before{content:"\00a0|\00a0"}
+#header #revnumber{text-transform:capitalize}
+#header #revnumber::after{content:"\00a0"}
+#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
+#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
+#toc>ul{margin-left:.125em}
+#toc ul.sectlevel0>li>a{font-style:italic}
+#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
+#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
+#toc li{line-height:1.3334;margin-top:.3334em}
+#toc a{text-decoration:none}
+#toc a:active{text-decoration:underline}
+#toctitle{color:#7a2518;font-size:1.2em}
+@media screen and (min-width:768px){#toctitle{font-size:1.375em}
+body.toc2{padding-left:15em;padding-right:0}
+body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
+#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
+#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
+#toc.toc2>ul{font-size:.9em;margin-bottom:0}
+#toc.toc2 ul ul{margin-left:0;padding-left:1em}
+#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
+body.toc2.toc-right{padding-left:0;padding-right:15em}
+body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
+@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
+#toc.toc2{width:20em}
+#toc.toc2 #toctitle{font-size:1.375em}
+#toc.toc2>ul{font-size:.95em}
+#toc.toc2 ul ul{padding-left:1.25em}
+body.toc2.toc-right{padding-left:0;padding-right:20em}}
+#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
+#content #toc>:first-child{margin-top:0}
+#content #toc>:last-child{margin-bottom:0}
+#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
+#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
+#content{margin-bottom:.625em}
+.sect1{padding-bottom:.625em}
+@media screen and (min-width:768px){#content{margin-bottom:1.25em}
+.sect1{padding-bottom:1.25em}}
+.sect1:last-child{padding-bottom:0}
+.sect1+.sect1{border-top:1px solid #e7e7e9}
+#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
+#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
+#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
+#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
+#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
+details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+details{margin-left:1.25rem}
+details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
+details>summary::-webkit-details-marker{display:none}
+details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
+details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
+details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
+.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
+table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
+.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
+.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
+.admonitionblock>table td.icon{text-align:center;width:80px}
+.admonitionblock>table td.icon img{max-width:none}
+.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
+.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
+.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
+.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
+.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
+.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
+.exampleblock>.content>:first-child,.sidebarblock>.content>:first-child{margin-top:0}
+.exampleblock>.content>:last-child,.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
+.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
+@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
+@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
+.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
+.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
+.listingblock>.content{position:relative}
+.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
+.listingblock:hover code[data-lang]::before{display:block}
+.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
+.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
+.listingblock pre.highlightjs{padding:0}
+.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
+.listingblock pre.prettyprint{border-width:0}
+.prettyprint{background:#f7f7f8}
+pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
+pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
+pre.prettyprint li code[data-lang]::before{opacity:1}
+pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
+table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
+table.linenotable td.code{padding-left:.75em}
+table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
+pre.pygments span.linenos{display:inline-block;margin-right:.75em}
+.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
+.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
+.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
+.quoteblock blockquote{margin:0;padding:0;border:0}
+.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
+.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
+.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
+.verseblock{margin:0 1em 1.25em}
+.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
+.verseblock pre strong{font-weight:400}
+.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
+.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
+.quoteblock .attribution br,.verseblock .attribution br{display:none}
+.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
+.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
+.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
+.quoteblock.abstract{margin:0 1em 1.25em;display:block}
+.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
+.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
+.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
+.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
+.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
+p.tableblock:last-child{margin-bottom:0}
+td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
+td.tableblock>.content>:last-child{margin-bottom:-1.25em}
+table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
+table.grid-all>*>tr>*{border-width:1px}
+table.grid-cols>*>tr>*{border-width:0 1px}
+table.grid-rows>*>tr>*{border-width:1px 0}
+table.frame-all{border-width:1px}
+table.frame-ends{border-width:1px 0}
+table.frame-sides{border-width:0 1px}
+table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
+table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
+table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
+table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
+table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
+th.halign-left,td.halign-left{text-align:left}
+th.halign-right,td.halign-right{text-align:right}
+th.halign-center,td.halign-center{text-align:center}
+th.valign-top,td.valign-top{vertical-align:top}
+th.valign-bottom,td.valign-bottom{vertical-align:bottom}
+th.valign-middle,td.valign-middle{vertical-align:middle}
+table thead th,table tfoot th{font-weight:bold}
+tbody tr th{background:#f7f8f7}
+tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
+p.tableblock>code:only-child{background:none;padding:0}
+p.tableblock{font-size:1em}
+ol{margin-left:1.75em}
+ul li ol{margin-left:1.5em}
+dl dd{margin-left:1.125em}
+dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
+li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
+ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
+ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
+ul.unstyled,ol.unstyled{margin-left:0}
+li>p:empty:only-child::before{content:"";display:inline-block}
+ul.checklist>li>p:first-child{margin-left:-1em}
+ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
+ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
+ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
+ul.inline>li{margin-left:1.25em}
+.unstyled dl dt{font-weight:400;font-style:normal}
+ol.arabic{list-style-type:decimal}
+ol.decimal{list-style-type:decimal-leading-zero}
+ol.loweralpha{list-style-type:lower-alpha}
+ol.upperalpha{list-style-type:upper-alpha}
+ol.lowerroman{list-style-type:lower-roman}
+ol.upperroman{list-style-type:upper-roman}
+ol.lowergreek{list-style-type:lower-greek}
+.hdlist>table,.colist>table{border:0;background:none}
+.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
+td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
+td.hdlist1{font-weight:bold;padding-bottom:1.25em}
+td.hdlist2{word-wrap:anywhere}
+.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
+.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
+.colist td:not([class]):first-child img{max-width:none}
+.colist td:not([class]):last-child{padding:.25em 0}
+.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
+.imageblock.left{margin:.25em .625em 1.25em 0}
+.imageblock.right{margin:.25em 0 1.25em .625em}
+.imageblock>.title{margin-bottom:0}
+.imageblock.thumb,.imageblock.th{border-width:6px}
+.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
+.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
+.image.left{margin-right:.625em}
+.image.right{margin-left:.625em}
+a.image{text-decoration:none;display:inline-block}
+a.image object{pointer-events:none}
+sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
+sup.footnote a,sup.footnoteref a{text-decoration:none}
+sup.footnote a:active,sup.footnoteref a:active,#footnotes .footnote a:first-of-type:active{text-decoration:underline}
+#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
+#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
+#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
+#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
+#footnotes .footnote:last-of-type{margin-bottom:0}
+#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
+div.unbreakable{page-break-inside:avoid}
+.big{font-size:larger}
+.small{font-size:smaller}
+.underline{text-decoration:underline}
+.overline{text-decoration:overline}
+.line-through{text-decoration:line-through}
+.aqua{color:#00bfbf}
+.aqua-background{background:#00fafa}
+.black{color:#000}
+.black-background{background:#000}
+.blue{color:#0000bf}
+.blue-background{background:#0000fa}
+.fuchsia{color:#bf00bf}
+.fuchsia-background{background:#fa00fa}
+.gray{color:#606060}
+.gray-background{background:#7d7d7d}
+.green{color:#006000}
+.green-background{background:#007d00}
+.lime{color:#00bf00}
+.lime-background{background:#00fa00}
+.maroon{color:#600000}
+.maroon-background{background:#7d0000}
+.navy{color:#000060}
+.navy-background{background:#00007d}
+.olive{color:#606000}
+.olive-background{background:#7d7d00}
+.purple{color:#600060}
+.purple-background{background:#7d007d}
+.red{color:#bf0000}
+.red-background{background:#fa0000}
+.silver{color:#909090}
+.silver-background{background:#bcbcbc}
+.teal{color:#006060}
+.teal-background{background:#007d7d}
+.white{color:#bfbfbf}
+.white-background{background:#fafafa}
+.yellow{color:#bfbf00}
+.yellow-background{background:#fafa00}
+span.icon>.fa{cursor:default}
+a span.icon>.fa{cursor:inherit}
+.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
+.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
+.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
+.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
+.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
+.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
+.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
+.conum[data-value] *{color:#fff!important}
+.conum[data-value]+b{display:none}
+.conum[data-value]::after{content:attr(data-value)}
+pre .conum[data-value]{position:relative;top:-.125em}
+b.conum *{color:inherit!important}
+.conum:not([data-value]):empty{display:none}
+dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
+h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
+p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
+p,blockquote,dt,td.content,td.hdlist1,span.alt,summary{font-size:1.0625rem}
+p{margin-bottom:1.25rem}
+.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
+.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
+.print-only{display:none!important}
+@page{margin:1.25cm .75cm}
+@media print{*{box-shadow:none!important;text-shadow:none!important}
+html{font-size:80%}
+a{color:inherit!important;text-decoration:underline!important}
+a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
+a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
+abbr[title]{border-bottom:1px dotted}
+abbr[title]::after{content:" (" attr(title) ")"}
+pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
+thead{display:table-header-group}
+svg{max-width:100%}
+p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
+h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
+#header,#content,#footnotes,#footer{max-width:none}
+#toc,.sidebarblock,.exampleblock>.content{background:none!important}
+#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
+body.book #header{text-align:center}
+body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
+body.book #header .details{border:0!important;display:block;padding:0!important}
+body.book #header .details span:first-child{margin-left:0!important}
+body.book #header .details br{display:block}
+body.book #header .details br+span::before{content:none!important}
+body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
+body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
+.listingblock code[data-lang]::before{display:block}
+#footer{padding:0 .9375em}
+.hide-on-print{display:none!important}
+.print-only{display:block!important}
+.hide-for-print{display:none!important}
+.show-for-print{display:inherit!important}}
+@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
+.sect1{padding:0!important}
+.sect1+.sect1{border:0}
+#footer{background:none}
+#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
+@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}

Файловите разлики са ограничени, защото са твърде много
+ 21109 - 0
node_modules/@asciidoctor/core/dist/graalvm/asciidoctor.js


Файловите разлики са ограничени, защото са твърде много
+ 1495 - 0
node_modules/@asciidoctor/core/dist/node/asciidoctor.js


+ 105 - 0
node_modules/@asciidoctor/core/package.json

@@ -0,0 +1,105 @@
+{
+  "name": "@asciidoctor/core",
+  "version": "2.2.8",
+  "description": "Asciidoctor - the core library",
+  "main": "dist/node/asciidoctor.js",
+  "browser": "dist/browser/asciidoctor.js",
+  "types": "types",
+  "engines": {
+    "node": ">=8.11",
+    "npm": ">=5.0.0",
+    "yarn": ">=1.1.0"
+  },
+  "files": [
+    "dist",
+    "types/index.d.ts",
+    "LICENSE",
+    "README.adoc"
+  ],
+  "scripts": {
+    "test:graalvm": "node tasks/graalvm.js",
+    "test:node": "mocha spec/*/*.spec.js",
+    "test:browser": "node spec/browser/run.js",
+    "test:types": "rm -f types/tests.js && eslint types --ext .ts && tsc --build types/tsconfig.json && node types/tests.js",
+    "test": "node tasks/test/unsupported-features.js && npm run test:node && npm run test:browser && npm run test:types",
+    "build": "node tasks/build.js && npm run test && npm run lint",
+    "build:quick": "node tasks/build.js && npm run test:node && npm run code:lint",
+    "clean": "npm run clean:all",
+    "clean:all": "node tasks/clean.js",
+    "clean:core": "node tasks/clean.js core",
+    "clean:patch": "node tasks/clean.js patch",
+    "clean:js": "node tasks/clean.js js",
+    "dist": "cross-env MINIFY=1 node tasks/dist.js",
+    "lint": "npm run code:lint && npm run docs:lint",
+    "code:lint": "eslint 'src/**/*.js' 'spec/**/*.js' 'spec/**/*.js' 'tasks/**/*.js' 'benchmark/**/*.js'",
+    "package": "cross-env MINIFY=1 COPY_DIST=1 node tasks/build.js && cross-env MINIFY=1 npm run test",
+    "examples": "node tasks/examples.js",
+    "server": "node tasks/server.js",
+    "benchmark": "node tasks/benchmark.js",
+    "docs:lint": "documentation lint src/**",
+    "docs:build": "documentation build src/** -f html -o build/docs -g",
+    "docs:serve": "documentation serve src/** -g -w",
+    "docs": "npm run docs:lint && npm run docs:build",
+    "travis": "npm run lint && npm run package && npm run docs && npm run examples && npm run test:graalvm"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/asciidoctor/asciidoctor.js.git"
+  },
+  "publishConfig": {
+    "access": "public"
+  },
+  "keywords": [
+    "asciidoc",
+    "asciidoctor",
+    "opal",
+    "javascript",
+    "library"
+  ],
+  "authors": [
+    "Dan Allen (https://github.com/mojavelinux)",
+    "Guillaume Grossetie (https://github.com/mogztter)",
+    "Anthonny Quérouil (https://github.com/anthonny)"
+  ],
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/asciidoctor/asciidoctor.js/issues"
+  },
+  "homepage": "https://github.com/asciidoctor/asciidoctor.js",
+  "dependencies": {
+    "asciidoctor-opal-runtime": "0.3.3",
+    "unxhr": "1.0.1"
+  },
+  "devDependencies": {
+    "@types/node": "17.0.10",
+    "@types/nunjucks": "3.2.1",
+    "@typescript-eslint/eslint-plugin": "5.9.1",
+    "@typescript-eslint/parser": "5.9.1",
+    "bestikk-download": "1.0.0",
+    "bestikk-fs": "1.0.0",
+    "bestikk-log": "0.1.0",
+    "bestikk-uglify": "3.0.0",
+    "chai": "4.3.4",
+    "cross-env": "7.0.3",
+    "dirty-chai": "2.0.1",
+    "documentation": "13.2.5",
+    "dot": "1.1.3",
+    "ejs": "3.1.6",
+    "eslint": "8.7.0",
+    "eslint-config-standard": "^16.0.3",
+    "eslint-plugin-import": "^2.25.4",
+    "handlebars": "4.7.7",
+    "http-server": "14.1.0",
+    "mocha": "9.1.4",
+    "module-alias": "2.2.2",
+    "nunjucks": "3.2.3",
+    "opal-compiler": "1.0.13",
+    "pug": "3.0.2",
+    "puppeteer": "13.1.1",
+    "sinon": "12.0.1",
+    "typescript": "4.5.4"
+  },
+  "_moduleAliases": {
+    "@asciidoctor/core": "build/asciidoctor-node.js"
+  }
+}

+ 3622 - 0
node_modules/@asciidoctor/core/types/index.d.ts

@@ -0,0 +1,3622 @@
+/// <reference types="node" />
+// TypeScript Version: 3.7
+export namespace Asciidoctor {
+  import Author = Document.Author;
+  import Title = Document.Title;
+  import Registry = Extensions.Registry;
+  import Cursor = Reader.Cursor;
+
+  class OpalKlass<T> {
+    $new(...params: any[]): T;
+  }
+
+  interface Runtime {
+    ioModule: string | 'node';
+    platform: string | 'node';
+    engine: string | 'v8';
+    framework: string;
+  }
+
+  class Reader implements Logging {
+    /**
+     * Push source onto the front of the reader and switch the context based on the file, document-relative path and line information given.
+     *
+     * This method is typically used in an IncludeProcessor to add source read from the target specified.
+     *
+     * @param data - data
+     * @param file - file
+     * @param path - path
+     * @param lineno - line number
+     * @param attributes - a JSON of attributes
+     * @returns this {Reader} object.
+     */
+    pushInclude(data: string | string[], file?: string, path?: string, lineno?: number, attributes?: object): Reader;
+
+    /**
+     * Get the current location of the reader's cursor, which encapsulates the file, dir, path, and lineno of the file being read.
+     */
+    getCursor(): Cursor;
+
+    /**
+     * Get the remaining unprocessed lines, without consuming them, as an {Array} of {string}.
+     *
+     * Lines will not be consumed from the Reader (ie. you will be able to read these lines again).
+     *
+     * @returns the remaining unprocessed lines as an Array of String.
+     */
+    getLines(): string[];
+
+    /**
+     * Get the remaining unprocessed lines, without consuming them, as a String.
+     *
+     * Lines will not be consumed from the Reader (ie. you will be able to read these lines again).
+     *
+     * @returns the remaining unprocessed lines as a String (joined by linefeed characters).
+     */
+    getString(): string;
+
+    /**
+     * Check whether there are any lines left to read.
+     * If a previous call to this method resulted in a value of false, immediately returned the cached value.
+     * Otherwise, delegate to peekLine to determine if there is a next line available.
+     *
+     * @returns true if there are more lines, false if there are not.
+     */
+    hasMoreLines(): boolean;
+
+    /**
+     * Check whether this reader is empty (contains no lines).
+     *
+     * @returns true if there are no more lines to peek, otherwise false.
+     */
+    isEmpty(): boolean;
+
+    /**
+     * Peek at the next line.
+     * Processes the line if not already marked as processed, but does not consume it (ie. you will be able to read this line again).
+     *
+     * This method will probe the reader for more lines.
+     * If there is a next line that has not previously been visited, the line is passed to the Reader#processLine method to be initialized.
+     * This call gives sub-classes the opportunity to do preprocessing.
+     * If the return value of the Reader#processLine is undefined, the data is assumed to be changed and Reader#peekLine is invoked again to perform further processing.
+     *
+     * If hasMoreLines is called immediately before peekLine, the direct flag is implicitly true (since the line is flagged as visited).
+     *
+     * @param direct - A {boolean} flag to bypasses the check for more lines and immediately returns the first element of the internal lines {Array}. (default: false)
+     * @returns the next line as a {string} if there are lines remaining.
+     */
+    peekLine(direct: boolean): string;
+
+    /**
+     * Consume, preprocess, and return the next line.
+     *
+     * Line will be consumed from the Reader (ie. you won't be able to read this line again).
+     *
+     * @returns the next line as a {string} if data is present.
+     */
+    readLine(): string;
+
+    /**
+     * Consume, preprocess, and return the remaining lines.
+     *
+     * This method calls Reader#readLine repeatedly until all lines are consumed and returns the lines as an {Array} of {string}.
+     * This method differs from Reader#getLines in that it processes each line in turn, hence triggering any preprocessors implemented in sub-classes.
+     *
+     * Lines will be consumed from the Reader (ie. you won't be able to read these lines again).
+     *
+     * @returns the lines read as an {Array} of {string}.
+     */
+    readLines(): string[];
+
+    /**
+     * Consume, preprocess, and return the remaining lines joined as a {string}.
+     *
+     * Delegates to Reader#readLines, then joins the result.
+     *
+     * Lines will be consumed from the Reader (ie. you won't be able to read these lines again).
+     *
+     * @returns the lines read joined as a {string}
+     */
+    read(): string;
+
+    /**
+     * Advance to the next line by discarding the line at the front of the stack.
+     * @returns a Boolean indicating whether there was a line to discard.
+     */
+    advance(): boolean;
+
+    getLogger(): Logger;
+
+    createLogMessage(text: string, context: any): LoggerMessage;
+  }
+
+  namespace Reader {
+    /**
+     *
+     */
+    class Cursor {
+      /**
+       * @returns the file associated to the cursor
+       */
+      getFile(): string | undefined;
+
+      /**
+       * @returns the directory associated to the cursor
+       */
+      getDirectory(): string | undefined;
+
+      /**
+       * @returns the path associated to the cursor (or '<stdin>')
+       */
+      getPath(): string | undefined;
+
+      /**
+       * Get the line number of the cursor.
+       * @returns the line number of the cursor
+       */
+      getLineNumber(): number | undefined;
+    }
+  }
+
+  namespace SafeMode {
+    /**
+     * A safe mode level that disables any of the security features enforced by Asciidoctor.
+     */
+    const UNSAFE: number;
+
+    /**
+     * A safe mode level that closely parallels safe mode in AsciiDoc.
+     * This value prevents access to files which reside outside of the parent directory of the source file and disables any macro other than the include::[] directive.
+     */
+    const SAFE: number;
+
+    /**
+     * A safe mode level that disallows the document from setting attributes that would affect the conversion of the document,
+     * in addition to all the security features of {SafeMode.SAFE}.
+     * For instance, this level forbids changing the backend or source-highlighter using an attribute defined in the source document header.
+     * This is the most fundamental level of security for server deployments (hence the name).
+     */
+    const SERVER: number;
+
+    /**
+     * A safe mode level that disallows the document from attempting to read files from the file system and including the contents of them into the document,
+     *  in additional to all the security features of SafeMode.SERVER}.
+     *  For instance, this level disallows use of the include::[] directive and the embedding of binary content (data uri), stylesheets and JavaScripts referenced by the document.
+     *  (Asciidoctor and trusted extensions may still be allowed to embed trusted content into the document).
+     *  Since Asciidoctor is aiming for wide adoption, this level is the default and is recommended for server deployments.
+     */
+    const SECURE: number;
+
+    /**
+     * @param name - the name of the security level
+     * @returns the integer value of the corresponding security level.
+     */
+    function getValueForName(name: string): number;
+
+    /**
+     * @param value - the integer value of the security level
+     * @returns the name of the corresponding security level.
+     */
+    function getNameForValue(value: number): string | undefined;
+
+    /**
+     * @returns the String {Array} of security levels.
+     */
+    function getNames(): string[];
+  }
+
+  interface Callout {
+    [key: string]: any;
+
+    id?: string;
+    ordinal?: number;
+  }
+
+  /**
+   * Maintains a catalog of callouts and their associations.
+   */
+  class Callouts {
+    /**
+     * Create a new Callouts.
+     * @returns a new Callouts
+     */
+    static create(): Callouts;
+
+    /**
+     * Register a new callout for the given list item ordinal.
+     * Generates a unique id for this callout based on the index of the next callout list in the document and the index of this callout since the end of the last callout list.
+     *
+     * @param ordinal - the Integer ordinal (1-based) of the list item to which this callout is to be associated
+     * @returns The unique String id of this callout
+     * @example
+     *  callouts = asciidoctor.Callouts.create()
+     *  callouts.register(1)
+     *  // => "CO1-1"
+     *  callouts.nextList()
+     *  callouts.register(2)
+     *  // => "CO2-1"
+     */
+    register(ordinal: number): string;
+
+    /**
+     * Get the next callout index in the document.
+     *
+     * Reads the next callout index in the document and advances the pointer.
+     * This method is used during conversion to retrieve the unique id of the callout that was generated during parsing.
+     *
+     * @returns The unique String id of the next callout in the document
+     */
+    readNextId(): string;
+
+    /**
+     *
+     */
+    getLists(): Callout[][];
+
+    /**
+     *
+     */
+    getListIndex(): number;
+
+    /**
+     * et a space-separated list of callout ids for the specified list item.
+     * @param ordinal - the Integer ordinal (1-based) of the list item for which to retrieve the callouts
+     * @returns a space-separated String of callout ids associated with the specified list item
+     */
+    getCalloutIds(ordinal: number): string;
+
+    /**
+     * The current list for which callouts are being collected.
+     * @returns The Array of callouts at the position of the list index pointer
+     */
+    getCurrentList(): any[];
+
+    /**
+     * Advance to the next callout list in the document.
+     */
+    nextList(): void;
+
+    /**
+     * Rewind the list index pointer, intended to be used when switching from the parsing to conversion phase.
+     */
+    rewind(): void;
+  }
+
+  /**
+   * Logger
+   */
+  interface LoggerFormatterFunction {
+    postConstruct?: (this: LoggerFormatter) => any;
+    call?: (this: LoggerFormatter, severity: string, time: Date, programName: string, message: string | RubyLoggerMessage) => string;
+  }
+
+  interface LoggerFunction {
+    postConstruct?: (this: Logger) => any;
+    add?: (this: Logger, severity: string, message: string | RubyLoggerMessage | undefined, programName: string) => void;
+  }
+
+  namespace LoggerManager {
+    function getLogger(): Logger;
+
+    function setLogger(logger: Logger): void;
+
+    function newLogger(name: string, functions: LoggerFunction): Logger;
+
+    function newFormatter(name: string, functions: LoggerFormatterFunction): LoggerFormatter;
+  }
+
+  interface Writer {
+    write(message: string | LoggerMessage): void;
+  }
+
+  interface BasicLogger {
+    log(message: string | LoggerMessage): void;
+  }
+
+  class RubyLogger {
+    $add(severity: string | number, message: string | LoggerMessage, programName?: string): any;
+
+    add(severity: string | number, message: string | LoggerMessage, programName?: string): any;
+
+    log(severity: string | number, message: string | LoggerMessage, programName?: string): any;
+
+    debug(message: string): any;
+
+    info(message: string): any;
+
+    warn(message: string): any;
+
+    error(message: string): any;
+
+    fatal(message: string): any;
+
+    isDebugEnabled(): boolean;
+
+    isInfoEnabled(): boolean;
+
+    isWarnEnabled(): boolean;
+
+    isErrorEnabled(): boolean;
+
+    isFatalEnabled(): boolean;
+  }
+
+  class Logger extends RubyLogger {
+    [key: string]: any;
+
+    formatter: LoggerFormatter;
+
+    getMaxSeverity(): undefined | number;
+
+    getFormatter(): LoggerFormatter;
+
+    setFormatter(formatter: LoggerFormatter): any;
+
+    getLevel(): number;
+
+    setLevel(level: number): any;
+
+    getProgramName(): string;
+
+    setProgramName(programName: string): any;
+  }
+
+  class MemoryLogger extends Logger {
+    /**
+     * Create a new MemoryLogger.
+     * @returns a new MemoryLogger
+     */
+    static create(): MemoryLogger;
+
+    getMessages(): LoggerMessage[];
+  }
+
+  class NullLogger extends Logger {
+    /**
+     * Create a new NullLogger.
+     * @returns a new NullLogger
+     */
+    static create(): NullLogger;
+
+    getMaxSeverity(): undefined | number;
+  }
+
+  class LoggerFormatter {
+    call(severity: string, time: Date, programName: string, message: string): string;
+  }
+
+  interface Logging {
+    getLogger(): Logger;
+
+    createLogMessage(text: string, context: any): LoggerMessage;
+  }
+
+  namespace LoggerSeverity {
+    function get(severity: string): number;
+  }
+
+  interface RubyLoggerMessage {
+    message: string;
+    source_location: SourceLocation;
+    text: string;
+  }
+
+  class LoggerMessage implements RubyLoggerMessage {
+    message: string;
+    source_location: SourceLocation;
+    text: string;
+
+    getText(): string;
+
+    getSeverity(): string;
+
+    getSourceLocation(): SourceLocation;
+  }
+
+  interface SourceLocation {
+    getLineNumber(): number;
+
+    getFile(): undefined | string;
+
+    getDirectory(): string;
+
+    getPath(): string;
+  }
+
+  class Timings {
+    /**
+     * Create a new Timings.
+     * @returns a Timings
+     */
+    static create(): Timings;
+
+    /**
+     * Print a report to the specified output.
+     * The report will include:
+     * - the time to read and parse source
+     * - the time to convert document
+     * - the total time (read, parse and convert)
+     * @param to - an optional output (by default stdout)
+     * @param subject - an optional subject (usually the file name)
+     */
+    printReport(to?: Writer | BasicLogger | RubyLogger, subject?: string): void;
+  }
+
+  namespace Document {
+    /**
+     * The Author class represents information about an author extracted from document attributes.
+     */
+    class Author {
+      /**
+       * @returns the author's full name
+       */
+      getName(): string | undefined;
+
+      /**
+       * @returns the author's first name
+       */
+      getFirstName(): string | undefined;
+
+      /**
+       * @returns the author's middle name (or undefined if the author has no middle name)
+       */
+      getMiddleName(): string | undefined;
+
+      /**
+       * @returns the author's last name
+       */
+      getLastName(): string | undefined;
+
+      /**
+       * @returns the author's initials (by default based on the author's name)
+       */
+      getInitials(): string | undefined;
+
+      /**
+       * @returns the author's email
+       */
+      getEmail(): string | undefined;
+    }
+
+    namespace Title {
+      interface Options {
+        partition?: boolean;
+        sanitize?: boolean;
+        use_fallback?: boolean;
+      }
+    }
+
+    /**
+     *
+     */
+    class Footnote {
+      /**
+       * @returns the footnote's index
+       */
+      getIndex(): number | undefined;
+
+      /**
+       * @returns the footnote's id
+       */
+      getId(): number | undefined;
+
+      /**
+       * @returns the footnote's text
+       */
+      getText(): string | undefined;
+    }
+
+    interface AttributeEntry {
+      name: string;
+      value: string;
+      negate: boolean;
+    }
+
+    /**
+     *
+     */
+    class ImageReference {
+      /**
+       * @returns the image's target
+       */
+      getTarget(): string;
+
+      /**
+       * @returns the image's directory (imagesdir attribute)
+       */
+      getImagesDirectory(): string | undefined;
+    }
+
+    /**
+     * The Title class represents a partitioned title (i.e., title & subtitle).
+     */
+    class Title {
+      getMain(): string;
+
+      getCombined(): string;
+
+      getSubtitle(): string;
+
+      isSanitized(): boolean;
+
+      hasSubtitle(): boolean;
+    }
+
+    class RevisionInfo {
+      /**
+       * Get the document revision date from document header (document attribute <code>revdate</code>).
+       */
+      getDate(): string;
+
+      /**
+       * Get the document revision number from document header (document attribute <code>revnumber</code>).
+       */
+      getNumber(): string;
+
+      /**
+       * Get the document revision remark from document header (document attribute <code>revremark</code>).
+       * A short summary of changes in this document revision.
+       */
+      getRemark(): string;
+
+      /**
+       * @returns true if the revision info is empty (ie. not defined), otherwise false
+       */
+      isEmpty(): boolean;
+    }
+  }
+
+  namespace Image {
+    interface Attributes {
+      [key: string]: any;
+
+      target: string;
+      alt?: string;
+      title?: string;
+      caption?: string;
+    }
+  }
+
+  interface Attributes {
+    [key: string]: any;
+  }
+
+  namespace Inline {
+    interface Options {
+      [key: string]: any;
+
+      id?: string;
+      type?: string;
+      target?: string;
+      attributes?: Attributes;
+    }
+  }
+
+  namespace Block {
+    interface Options {
+      [key: string]: any;
+
+      content_model?: string;
+      subs?: string | string[];
+    }
+
+    interface Attributes {
+      attribute_entries?: Document.AttributeEntry[];
+    }
+  }
+
+  interface Selector {
+    [key: string]: any;
+  }
+
+  interface ParseAttributesOptions {
+    [key: string]: any;
+
+    positional_attributes?: string | string[];
+    sub_attributes?: boolean;
+  }
+
+  interface Options {
+    [key: string]: any;
+  }
+
+  interface ProcessorOptions {
+    [key: string]: any;
+
+    /**
+     * Sets additional document attributes, which override equivalently-named attributes defined in the document unless the value ends with @.
+     * Any number of built-in or user-defined attributes in one of the following formats:
+     * - JSON: {'name': 'value'}
+     * - Array:['name=value']
+     * - String: 'name=value'
+     */
+    attributes?: Attributes | string[] | string;
+    /**
+     * Selects the converter to use (as registered with this keyword).
+     */
+    backend?: string;
+    /**
+     * Sets the base (aka working) directory containing the document and resources.
+     */
+    base_dir?: string;
+    /**
+     * If true, tells the parser to capture images and links in the reference table.
+     * (Normally only IDs, footnotes and indexterms are included).
+     * The reference table is available via the references property on the document AST object.
+     * (Experimental).
+     */
+    catalog_assets?: boolean;
+    /**
+     * Sets the document type.
+     */
+    doctype?: string;
+    /**
+     * Overrides the extensions registry instance.
+     * Instead of providing a JavaScript function containing extensions to register,
+     * this option lets you replace the extension registry itself,
+     * giving you complete control over how extensions are registered for this processor.
+     */
+    extension_registry?: Registry;
+    /**
+     * @deprecated Please use {@link ProcessorOptions#standalone}
+     */
+    header_footer?: boolean;
+    /**
+     * If true, add the document header and footer (i.e., framing) around the body content in the output.
+     */
+    standalone?: boolean;
+    /**
+     * If true, the processor will create the necessary output directories if they don’t yet exist.
+     */
+    mkdirs?: boolean;
+    /**
+     * If true, the source is parsed eagerly (i.e., as soon as the source is passed to the load or loadFile API).
+     * If false, parsing is deferred until the parse method is explicitly invoked.
+     */
+    parse?: boolean;
+    /**
+     * Sets the safe mode.
+     */
+    safe?: string | number;
+    /**
+     * Keeps track of the file and line number for each parsed block.
+     * (Useful for tooling applications where the association between the converted output and the source file is important).
+     */
+    sourcemap?: boolean;
+    /**
+     * An array of directories containing templates to be used instead of the default built-in templates.
+     */
+    template_dirs?: string[];
+    /**
+     * Capture time taken to read, parse, and convert document. Internal use only.
+     */
+    timings?: Timings;
+    /**
+     * Destination directory for output file(s), relative to base_dir.
+     */
+    to_dir?: string;
+    /**
+     * The name of the output file to write, or true to use the default output file (docname + outfilesuffix).
+     */
+    to_file?: boolean | string;
+  }
+
+  /**
+   * @description
+   * Extensions provide a way to participate in the parsing and converting
+   * phases of the AsciiDoc processor or extend the AsciiDoc syntax.
+   *
+   * The various extensions participate in AsciiDoc processing as follows:
+   *
+   * 1. After the source lines are normalized, {{@link Extensions/Preprocessor}}s modify or replace
+   *    the source lines before parsing begins. {{@link Extensions/IncludeProcessor}}s are used to
+   *    process include directives for targets which they claim to handle.
+   * 2. The Parser parses the block-level content into an abstract syntax tree.
+   *    Custom blocks and block macros are processed by associated {{@link Extensions/BlockProcessor}}s
+   *    and {{@link Extensions/BlockMacroProcessor}}s, respectively.
+   * 3. {{@link Extensions/TreeProcessor}}s are run on the abstract syntax tree.
+   * 4. Conversion of the document begins, at which point inline markup is processed
+   *    and converted. Custom inline macros are processed by associated {InlineMacroProcessor}s.
+   * 5. {{@link Extensions/Postprocessor}}s modify or replace the converted document.
+   * 6. The output is written to the output stream.
+   *
+   * Extensions may be registered globally using the {Extensions.register} method
+   * or added to a custom {Registry} instance and passed as an option to a single
+   * Asciidoctor processor.
+   *
+   * @example
+   * asciidoctor.Extensions.register(function () {
+   *   this.block(function () {
+   *     var self = this;
+   *     self.named('shout');
+   *     self.onContext('paragraph');
+   *     self.process(function (parent, reader) {
+   *       var lines = reader.getLines().map(function (l) { return l.toUpperCase(); });
+   *       return this.createBlock(parent, 'paragraph', lines);
+   *     });
+   *   });
+   * });
+   */
+  namespace Extensions {
+    /**
+     * Tree processor functions
+     */
+    interface TreeProcessorFunctions {
+      postConstruct?: (this: TreeProcessorInstance) => any;
+      initialize?: (this: TreeProcessorInstance, name: string, config: any) => void;
+      process: (this: TreeProcessorInstance, parent: Document) => any;
+    }
+
+    interface TreeProcessorInstance extends TreeProcessor {
+      [key: string]: any;
+
+      super: (...params: any[]) => void;
+    }
+
+    /**
+     * Include processor functions
+     */
+    interface IncludeProcessorFunctions {
+      postConstruct?: (this: IncludeProcessorInstance) => any;
+      initialize?: (this: IncludeProcessorInstance, name: string, config: any) => void;
+      process: (this: IncludeProcessorInstance, document: Document, reader: Reader, target: string, attributes: any) => void;
+    }
+
+    interface IncludeProcessorInstance extends IncludeProcessor {
+      [key: string]: any;
+
+      super: (...params: any[]) => void;
+    }
+
+    /**
+     * Postprocessor functions
+     */
+    interface PostprocessorFunctions {
+      postConstruct?: (this: PostprocessorInstance) => any;
+      initialize?: (this: PostprocessorInstance, name: string, config: any) => void;
+      process: (this: PostprocessorInstance, document: Document, output: string) => any;
+    }
+
+    interface PostprocessorInstance extends Postprocessor {
+      [key: string]: any;
+
+      super: (...params: any[]) => void;
+    }
+
+    /**
+     * Preprocessor functions
+     */
+    interface PreprocessorFunctions {
+      postConstruct?: (this: PreprocessorInstance) => any;
+      initialize?: (this: PreprocessorInstance, name: string, config: any) => void;
+      process: (this: PreprocessorInstance, document: Document, reader: Reader) => any;
+    }
+
+    interface PreprocessorInstance extends Preprocessor {
+      [key: string]: any;
+
+      super: (...params: any[]) => void;
+    }
+
+    /**
+     * Docinfo processor functions
+     */
+    interface DocinfoProcessorFunctions {
+      postConstruct?: (this: DocinfoProcessorInstance) => any;
+      initialize?: (this: DocinfoProcessorInstance, name: string, config: any) => void;
+      process: (this: DocinfoProcessorInstance, parent: Document, reader: Reader) => any;
+    }
+
+    interface DocinfoProcessorInstance extends DocinfoProcessor {
+      [key: string]: any;
+
+      super: (...params: any[]) => void;
+    }
+
+    /**
+     * Block processor functions
+     */
+    interface BlockProcessorFunctions {
+      postConstruct?: (this: BlockProcessorInstance) => any;
+      initialize?: (this: BlockProcessorInstance, name: string, config: any) => void;
+      process: (this: BlockProcessorInstance, parent: Document, reader: Reader, attributes?: any) => any;
+    }
+
+    interface BlockProcessorInstance extends BlockProcessor {
+      [key: string]: any;
+
+      super: (...params: any[]) => void;
+    }
+
+    /**
+     * Block macro functions
+     */
+    interface BlockMacroFunctions {
+      postConstruct?: (this: BlockMacroProcessorInstance) => any;
+      initialize?: (this: BlockMacroProcessorInstance, name: string, config: any) => void;
+      process: (this: BlockMacroProcessorInstance, parent: Document, target: string, attributes?: any) => any;
+    }
+
+    interface BlockMacroProcessorInstance extends BlockMacroProcessor {
+      [key: string]: any;
+
+      super: (...params: any[]) => void;
+    }
+
+    /**
+     * Inline macro functions
+     */
+    interface InlineMacroFunctions {
+      postConstruct?: (this: InlineMacroProcessorInstance) => any;
+      initialize?: (this: InlineMacroProcessorInstance, name: string, config: any) => void;
+      process: (this: InlineMacroProcessorInstance, parent: Document, target: string, attributes?: any) => any;
+    }
+
+    interface InlineMacroProcessorInstance extends InlineMacroProcessor {
+      [key: string]: any;
+
+      super: (...params: any[]) => void;
+    }
+
+    /**
+     * Create a new {@link Registry}.
+     * @param [name] - An optional name
+     * @param [block] - An optional block
+     * @returns a {@link Registry}
+     */
+    function create(name?: string, block?: (this: Registry) => any): Registry;
+
+    /**
+     */
+    function register(block?: (this: Registry) => any): void;
+
+    /**
+     * Get statically-registered extension groups.
+     */
+    function getGroups(): object;
+
+    /**
+     * Unregister all statically-registered extension groups.
+     */
+    function unregisterAll(): void;
+
+    /**
+     * Unregister the specified statically-registered extension groups.
+     *
+     * NOTE Opal cannot delete an entry from a Hash that is indexed by symbol, so
+     * we have to resort to using low-level operations in this method.
+     */
+    function unregister(...names: string[]): void;
+
+    /**
+     * Create a postprocessor
+     * @description this API is experimental and subject to change
+     */
+    function createPostprocessor(arg: string | PostprocessorFunctions): PostprocessorKlass;
+
+    /**
+     * Create a postprocessor
+     * @description this API is experimental and subject to change
+     */
+    function createPostprocessor(name: string, functions: PostprocessorFunctions): PostprocessorKlass;
+
+    /**
+     * Create and instantiate a postprocessor
+     * @description this API is experimental and subject to change
+     */
+    function newPostprocessor(arg: string | PostprocessorFunctions): Postprocessor;
+    /**
+     * Create and instantiate a postprocessor
+     * @description this API is experimental and subject to change
+     */
+    function newPostprocessor(name: string, functions: PostprocessorFunctions): Postprocessor;
+
+    /**
+     * Create a preprocessor
+     * @description this API is experimental and subject to change
+     */
+    function createPreprocessor(arg: string | PreprocessorFunctions): PreprocessorKlass;
+
+    /**
+     * Create a preprocessor
+     * @description this API is experimental and subject to change
+     */
+    function createPreprocessor(name: string, functions: PreprocessorFunctions): PreprocessorKlass;
+
+    /**
+     * Create and instantiate a preprocessor
+     * @description this API is experimental and subject to change
+     */
+    function newPreprocessor(arg: string | PreprocessorFunctions): Preprocessor;
+
+    /**
+     * Create and instantiate a preprocessor
+     * @description this API is experimental and subject to change
+     */
+    function newPreprocessor(name: string, functions: PreprocessorFunctions): Preprocessor;
+
+    /**
+     * Create a tree processor
+     * @description this API is experimental and subject to change
+     */
+    function createTreeProcessor(arg: string | TreeProcessorFunctions): TreeProcessorKlass;
+
+    /**
+     * Create a tree processor
+     * @description this API is experimental and subject to change
+     */
+    function createTreeProcessor(name: string, functions: TreeProcessorFunctions): TreeProcessorKlass;
+
+    /**
+     * Create and instantiate a tree processor
+     * @description this API is experimental and subject to change
+     */
+    function newTreeProcessor(arg: string | TreeProcessorFunctions): TreeProcessor;
+
+    /**
+     * Create and instantiate a tree processor
+     * @description this API is experimental and subject to change
+     */
+    function newTreeProcessor(name: string, functions: TreeProcessorFunctions): TreeProcessor;
+
+    /**
+     * Create an include processor
+     * @description this API is experimental and subject to change
+     */
+    function createIncludeProcessor(arg: string | IncludeProcessorFunctions): IncludeProcessorKlass;
+
+    /**
+     * Create an include processor
+     * @description this API is experimental and subject to change
+     */
+    function createIncludeProcessor(name: string, functions: IncludeProcessorFunctions): IncludeProcessorKlass;
+
+    /**
+     * Create and instantiate an include processor
+     * @description this API is experimental and subject to change
+     */
+    function newIncludeProcessor(arg: string | IncludeProcessorFunctions): IncludeProcessor;
+
+    /**
+     * Create and instantiate an include processor
+     * @description this API is experimental and subject to change
+     */
+    function newIncludeProcessor(name: string, functions: IncludeProcessorFunctions): IncludeProcessor;
+
+    /**
+     * Create a Docinfo processor
+     * @description this API is experimental and subject to change
+     */
+    function createDocinfoProcessor(arg: string | DocinfoProcessorFunctions): DocinfoProcessorKlass;
+
+    /**
+     * Create a Docinfo processor
+     * @description this API is experimental and subject to change
+     */
+    function createDocinfoProcessor(name: string, functions: DocinfoProcessorFunctions): DocinfoProcessorKlass;
+
+    /**
+     * Create and instantiate a Docinfo processor
+     * @description this API is experimental and subject to change
+     */
+    function newDocinfoProcessor(arg: string | DocinfoProcessorFunctions): DocinfoProcessor;
+
+    /**
+     * Create and instantiate a Docinfo processor
+     * @description this API is experimental and subject to change
+     */
+    function newDocinfoProcessor(name: string, functions: DocinfoProcessorFunctions): DocinfoProcessor;
+
+    /**
+     * Create a block processor
+     * @description this API is experimental and subject to change
+     */
+    function createBlockProcessor(arg: string | BlockProcessorFunctions): BlockProcessorKlass;
+
+    /**
+     * Create a block processor
+     * @description this API is experimental and subject to change
+     */
+    function createBlockProcessor(name: string, functions: BlockProcessorFunctions): BlockProcessorKlass;
+
+    /**
+     * Create and instantiate a block processor
+     * @description this API is experimental and subject to change
+     */
+    function newBlockProcessor(arg: string | BlockProcessorFunctions): BlockProcessor;
+
+    /**
+     * Create and instantiate a block processor
+     * @description this API is experimental and subject to change
+     */
+    function newBlockProcessor(name: string, functions: BlockProcessorFunctions): BlockProcessor;
+
+    /**
+     * Create an inline macro processor
+     * @description this API is experimental and subject to change
+     */
+    function createInlineMacroProcessor(arg: string | InlineMacroFunctions): InlineMacroProcessorKlass;
+
+    /**
+     * Create an inline macro processor
+     * @description this API is experimental and subject to change
+     */
+    function createInlineMacroProcessor(name: string, functions: InlineMacroFunctions): InlineMacroProcessorKlass;
+
+    /**
+     * Create and instantiate an inline macro processor
+     * @description this API is experimental and subject to change
+     */
+    function newInlineMacroProcessor(arg: string | InlineMacroFunctions): InlineMacroProcessor;
+
+    /**
+     * Create and instantiate an inline macro processor
+     * @description this API is experimental and subject to change
+     */
+    function newInlineMacroProcessor(name: string, functions: InlineMacroFunctions): InlineMacroProcessor;
+
+    /**
+     * Create a block macro processor
+     * @description this API is experimental and subject to change
+     */
+    function createBlockMacroProcessor(arg: string | BlockMacroFunctions): BlockMacroProcessorKlass;
+
+    /**
+     * Create a block macro processor
+     * @description this API is experimental and subject to change
+     */
+    function createBlockMacroProcessor(name: string, functions: BlockMacroFunctions): BlockMacroProcessorKlass;
+
+    /**
+     * Create and instantiate a block macro processor
+     * @description this API is experimental and subject to change
+     */
+    function newBlockMacroProcessor(arg: string | BlockMacroFunctions): BlockMacroProcessor;
+
+    /**
+     * Create and instantiate a block macro processor
+     * @description this API is experimental and subject to change
+     */
+    function newBlockMacroProcessor(name: string, functions: BlockMacroFunctions): BlockMacroProcessor;
+
+    class Registry {
+      /**
+       * Get extension groups.
+       */
+      getGroups(): any;
+
+      unregisterAll(): void;
+
+      unregister(...names: string[]): void;
+
+      prefer(name: string, processor: any): void;
+
+      block(name: string, processor: ((this: BlockProcessorDsl) => void | typeof BlockProcessorKlass | BlockProcessor)): void;
+      block(processor: ((this: BlockProcessorDsl) => void) | typeof BlockProcessorKlass | BlockProcessor): void;
+
+      inlineMacro(name: string, processor: ((this: InlineMacroProcessorDsl) => void) | typeof InlineMacroProcessorKlass | InlineMacroProcessor): void;
+      inlineMacro(processor: ((this: InlineMacroProcessorDsl) => void) | typeof InlineMacroProcessorKlass | InlineMacroProcessor): void;
+
+      blockMacro(name: string, processor: ((this: BlockMacroProcessorDsl) => void) | typeof BlockMacroProcessorKlass | BlockMacroProcessor): void;
+      blockMacro(processor: ((this: BlockMacroProcessorDsl) => void) | typeof BlockMacroProcessorKlass | BlockMacroProcessor): void;
+
+      includeProcessor(processor: ((this: IncludeProcessorDsl) => void) | typeof IncludeProcessorKlass | IncludeProcessor): void;
+
+      treeProcessor(processor: ((this: TreeProcessorDsl) => void) | typeof TreeProcessorKlass | TreeProcessor): void;
+
+      postprocessor(processor: ((this: PostprocessorDsl) => void) | typeof PostprocessorKlass | Postprocessor): void;
+
+      preprocessor(processor: ((this: PreprocessorDsl) => void) | typeof PreprocessorKlass | Preprocessor): void;
+
+      docinfoProcessor(processor: ((this: DocinfoProcessorDsl) => void) | typeof DocinfoProcessorKlass | DocinfoProcessor): void;
+
+      /**
+       * Checks whether any {{@link Extensions/Preprocessor}} extensions have been registered.
+       *
+       * @returns a {boolean} indicating whether any {{@link Extensions/Preprocessor}} extensions are registered.
+       */
+      hasPreprocessors(): boolean;
+
+      /**
+       * Checks whether any {{@link Extensions/TreeProcessor}} extensions have been registered.
+       *
+       * @returns a {boolean} indicating whether any {{@link Extensions/TreeProcessor}} extensions are registered.
+       */
+      hasTreeProcessors(): boolean;
+
+      /**
+       * Checks whether any {{@link Extensions/IncludeProcessor}} extensions have been registered.
+       *
+       * @returns a {boolean} indicating whether any {{@link Extensions/IncludeProcessor}} extensions are registered.
+       */
+      hasIncludeProcessors(): boolean;
+
+      /**
+       * Checks whether any {{@link Extensions/Postprocessor}} extensions have been registered.
+       *
+       * @returns a {boolean} indicating whether any {{@link Extensions/Postprocessor}} extensions are registered.
+       */
+      hasPostprocessors(): boolean;
+
+      /**
+       * Checks whether any {{@link Extensions/DocinfoProcessor}} extensions have been registered.
+       *
+       * @param location - A for selecting docinfo extensions at a given location (head or footer) (default: undefined)
+       * @returns a {boolean} indicating whether any {{@link Extensions/DocinfoProcessor}} extensions are registered.
+       */
+      hasDocinfoProcessors(location?: string): boolean;
+
+      /**
+       * Checks whether any {{@link Extensions/BlockProcessor}} extensions have been registered.
+       *
+       * @returns a {boolean} indicating whether any {{@link Extensions/BlockProcessor}} extensions are registered.
+       */
+      hasBlocks(): boolean;
+
+      /**
+       * Checks whether any {{@link Extensions/BlockMacroProcessor}} extensions have been registered.
+       *
+       * @returns a {boolean} indicating whether any {{@link Extensions/BlockMacroProcessor}} extensions are registered.
+       */
+      hasBlockMacros(): boolean;
+
+      /**
+       * Checks whether any {{@link Extensions/InlineMacroProcessor}} extensions have been registered.
+       *
+       * @returns a {boolean} indicating whether any {{@link Extensions/InlineMacroProcessor}} extensions are registered.
+       */
+      hasInlineMacros(): boolean;
+
+      /**
+       * Retrieves the Extension proxy objects for all the {{@link Extensions/Preprocessor}} instances stored in this registry.
+       *
+       * @returns an {array} of Extension proxy objects.
+       */
+      getPreprocessors(): Preprocessor[];
+
+      /**
+       * Retrieves the Extension proxy objects for all the {{@link Extensions/TreeProcessor}} instances stored in this registry.
+       *
+       * @returns an {array} of Extension proxy objects.
+       */
+      getTreeProcessors(): TreeProcessor[];
+
+      /**
+       * Retrieves the Extension proxy objects for all the {{@link Extensions/IncludeProcessor}} instances stored in this registry.
+       *
+       * @returns an {array} of Extension proxy objects.
+       */
+      getIncludeProcessors(): IncludeProcessor[];
+
+      /**
+       * Retrieves the Extension proxy objects for all the {{@link Extensions/Postprocessor}} instances stored in this registry.
+       *
+       * @returns an {array} of Extension proxy objects.
+       */
+      getPostprocessors(): Postprocessor[];
+
+      /**
+       * Retrieves the Extension proxy objects for all the {{@link Extensions/DocinfoProcessor}} instances stored in this registry.
+       *
+       * @param location - A {string} for selecting docinfo extensions at a given location (head or footer) (default: undefined)
+       * @returns an {array} of Extension proxy objects.
+       */
+      getDocinfoProcessors(location?: string): DocinfoProcessor[];
+
+      /**
+       * Retrieves the Extension proxy objects for all the {{@link Extensions/BlockProcessor}} instances stored in this registry.
+       *
+       * @returns an {array} of Extension proxy objects.
+       */
+      getBlocks(): BlockProcessor[];
+
+      /**
+       * Retrieves the Extension proxy objects for all the {{@link Extensions/BlockMacroProcessor}} instances stored in this registry.
+       *
+       * @returns an {array} of Extension proxy objects.
+       */
+      getBlockMacros(): BlockMacroProcessor[];
+
+      /**
+       * Retrieves the Extension proxy objects for all the {{@link Extensions/InlineMacroProcessor}} instances stored in this registry.
+       *
+       * @returns an {array} of Extension proxy objects.
+       */
+      getInlineMacros(): InlineMacroProcessor[];
+
+      /**
+       * Get any {{@link Extensions/InlineMacroProcessor}} extensions are registered to handle the specified inline macro name.
+       *
+       * @param name - the {string} inline macro name
+       * @returns the Extension proxy object for the {{@link Extensions/InlineMacroProcessor}} that matches the inline macro name or undefined if no match is found.
+       */
+      getInlineMacroFor(name: string): InlineMacroProcessor | undefined;
+
+      /**
+       * Get any {{@link Extensions/BlockProcessor}} extensions are registered to handle the specified block name appearing on the specified context.
+       * @param name - the {string} block name
+       * @param context - the context of the block: paragraph, open... (optional)
+       * @returns the Extension proxy object for the {{@link Extensions/BlockProcessor}} that matches the block name and context or undefined if no match is found.
+       */
+      getBlockFor(name: string, context?: string): BlockProcessor | undefined;
+
+      /**
+       * Get any {{@link Extensions/BlockMacroProcessor}} extensions are registered to handle the specified macro name.
+       *
+       * @param name - the {string} macro name
+       * @returns the Extension proxy object for the {{@link Extensions/BlockMacroProcessor}} that matches the macro name or undefined if no match is found.
+       */
+      getBlockMacroFor(name: string): BlockMacroProcessor | undefined;
+    }
+
+    class Processor {
+      constructor(config?: any);
+
+      /**
+       * Creates a list block node and links it to the specified parent.
+       * @param parent - The parent Block (Block, Section, or Document) of this new list block.
+       * @param context - The list context (e.g., ulist, olist, colist, dlist)
+       * @param attrs - An object of attributes to set on this list block
+       * @returns a {List}
+       */
+      createList(parent: AbstractBlock, context: string, attrs?: any): List;
+
+      /**
+       * Creates a list item node and links it to the specified parent.
+       * @param parent - The parent {List} of this new list item block.
+       * @param text - The text of the list item.
+       * @returns a {ListItem}
+       */
+      createListItem(parent: List, text?: string): ListItem;
+
+      /**
+       * Creates an image block node and links it to the specified parent.
+       * @param parent - The parent Block of this new image block.
+       * @param attrs - A JSON of attributes
+       * @param attrs.target - the target attribute to set the source of the image.
+       * @param attrs.alt - the alt attribute to specify an alternative text for the image.
+       * @param opts - A JSON of options
+       * @returns an image {Block}
+       */
+      createImageBlock(parent: AbstractBlock, attrs: Image.Attributes, opts?: Block.Options): Block;
+
+      /**
+       * Creates a paragraph block and links it to the specified parent.
+       * @param parent - The parent Block (Block, Section, or Document) of this new block.
+       * @param source - The source
+       * @param attrs - An object of attributes to set on this block
+       * @param opts - An object of options to set on this block
+       */
+      createParagraph(parent: AbstractBlock, source: string | string[], attrs?: any, opts?: Block.Options): Block;
+
+      /**
+       * Creates an open block and links it to the specified parent.
+       * @param parent - The parent Block (Block, Section, or Document) of this new block.
+       * @param source - The source
+       * @param attrs - An object of attributes to set on this block
+       * @param opts - An object of options to set on this block
+       */
+      createOpenBlock(parent: AbstractBlock, source?: string | string[], attrs?: any, opts?: Block.Options): Block;
+
+      /**
+       * Creates an example block and links it to the specified parent.
+       * @param parent - The parent Block (Block, Section, or Document) of this new block.
+       * @param source - The source
+       * @param attrs - An object of attributes to set on this block
+       * @param opts - An object of options to set on this block
+       */
+      createExampleBlock(parent: AbstractBlock, source: string | string[], attrs?: any, opts?: Block.Options): Block;
+
+      /**
+       * Creates a pass block and links it to the specified parent.
+       * @param parent - The parent Block (Block, Section, or Document) of this new block.
+       * @param source - The source
+       * @param attrs - An object of attributes to set on this block
+       * @param opts - An object of options to set on this block
+       */
+      createPassBlock(parent: AbstractBlock, source: string | string[], attrs?: any, opts?: Block.Options): Block;
+
+      /**
+       * Creates a listing block and links it to the specified parent.
+       * @param parent - The parent Block (Block, Section, or Document) of this new block.
+       * @param source - The source
+       * @param attrs - An object of attributes to set on this block
+       * @param opts - An object of options to set on this block
+       */
+      createListingBlock(parent: AbstractBlock, source: string | string[], attrs?: any, opts?: Block.Options): Block;
+
+      /**
+       * Creates a literal block and links it to the specified parent.
+       * @param parent - The parent Block (Block, Section, or Document) of this new block.
+       * @param source - The source
+       * @param attrs - An object of attributes to set on this block
+       * @param opts - An object of options to set on this block
+       */
+      createLiteralBlock(parent: AbstractBlock, source: string | string[], attrs?: any, opts?: Block.Options): Block;
+
+      /**
+       * Creates a block and links it to the specified parent.
+       * @param parent - The parent Block (Block, Section, or Document) of this new block.
+       * @param context - The context name
+       * @param source - The source
+       * @param attrs - An object of attributes to set on this block
+       * @param opts - An object of options to set on this block
+       */
+      createBlock(parent: AbstractBlock, context: string, source: string | string[], attrs?: any, opts?: Block.Options): Block;
+
+      /**
+       * Creates an inline anchor and links it to the specified parent.
+       * @param parent - The parent Block (Block, Section, or Document) of this new block.
+       * @param text - The text
+       * @param opts - An object of options to set on this block
+       * @returns an {Inline} anchor
+       */
+      createAnchor(parent: AbstractBlock, text: string, opts?: Inline.Options): Inline;
+
+      /**
+       * Creates an inline pass and links it to the specified parent.
+       * @param parent - The parent Block (Block, Section, or Document) of this new block.
+       * @param text - The text
+       * @param opts - An object of options to set on this block
+       * @returns an {Inline} pass
+       */
+      createInlinePass(parent: AbstractBlock, text: string, opts?: Inline.Options): Inline;
+
+      /**
+       * Creates an inline node and links it to the specified parent.
+       * @param parent - The parent Block of this new inline node.
+       * @param context - The context name
+       * @param text - The text
+       * @param opts - A JSON of options
+       * @returns an {Inline} node
+       */
+      createInline(parent: AbstractBlock, context: string, text: string, opts?: Inline.Options): Inline;
+
+      /**
+       * Parses blocks in the content and attaches the block to the parent.
+       * @param parent - the parent block
+       * @param content - the content
+       * @param attrs - an object of attributes
+       * @returns The parent node into which the blocks are parsed.
+       */
+      parseContent(parent: AbstractBlock, content: string | string[], attrs?: any): AbstractNode;
+
+      /**
+       * Parses the attrlist String into a JSON of attributes
+       * @param block - the current AbstractBlock or the parent AbstractBlock if there is no current block (used for applying subs)
+       * @param attrlist - the list of attributes as a String
+       * @param opts - an optional JSON of options to control processing:
+       * - positional_attributes: an Array of attribute names to map positional arguments to (optional, default: [])
+       * - sub_attributes: enables attribute substitution on the attrlist argument (optional, default: false)
+       * @returns a JSON of parsed attributes
+       */
+      parseAttributes(block: AbstractBlock, attrlist: string, opts?: ParseAttributesOptions): Attributes;
+
+      /**
+       * Get the configuration JSON for this processor instance.
+       */
+      getConfig(): Options;
+    }
+
+    class ProcessorDsl {
+      option(key: string, value: any): void;
+    }
+
+    class MacroProcessor extends Processor {
+      constructor(name?: string, config?: any);
+
+      getName(): string;
+
+      process(parent: Document, target: string, attributes?: any): any;
+    }
+
+    class BlockProcessor extends Processor {
+      constructor(name?: string, config?: any);
+
+      getName(): string;
+
+      process(parent: Document, reader: Reader, attributes?: any): any;
+    }
+
+    class BlockMacroProcessor extends MacroProcessor {
+    }
+
+    class InlineMacroProcessor extends MacroProcessor {
+    }
+
+    class InlineMacroProcessorDsl extends MacroProcessorDsl {
+      parseContentAs(value: string): void;
+
+      matchFormat(value: string): void;
+
+      match(value: RegExp): void;
+
+      process(block: (this: InlineMacroProcessor, parent: Document, target: string, attributes: any) => void): void;
+    }
+
+    class IncludeProcessor {
+      process(this: IncludeProcessor, document: Document, reader: Reader, target: string, attributes: any): void;
+    }
+
+    class TreeProcessor extends Processor {
+      process(this: TreeProcessor, document: Document): any;
+    }
+
+    class Postprocessor extends Processor {
+      process(this: Postprocessor, document: Document, output: string): any;
+    }
+
+    class Preprocessor extends Processor {
+      process(this: Preprocessor, document: Document, reader: Reader): any;
+    }
+
+    class DocinfoProcessor extends Processor {
+      process(this: DocinfoProcessor, document: Document): any;
+    }
+
+    // OpalKlass
+    class BlockProcessorKlass extends OpalKlass<BlockProcessor> {
+    }
+
+    class BlockMacroProcessorKlass extends OpalKlass<BlockMacroProcessor> {
+    }
+
+    class InlineMacroProcessorKlass extends OpalKlass<InlineMacroProcessor> {
+    }
+
+    class TreeProcessorKlass extends OpalKlass<TreeProcessor> {
+    }
+
+    class IncludeProcessorKlass extends OpalKlass<IncludeProcessor> {
+    }
+
+    class PostprocessorKlass extends OpalKlass<Postprocessor> {
+    }
+
+    class PreprocessorKlass extends OpalKlass<Preprocessor> {
+    }
+
+    class DocinfoProcessorKlass extends OpalKlass<DocinfoProcessor> {
+    }
+
+    // DSL
+    abstract class SyntaxProcessorDsl extends ProcessorDsl {
+      named(name: string): void;
+
+      defaultAttributes(value: any): void;
+
+      positionalAttributes(value: string[]): void;
+
+      positionalAttributes(...value: string[]): void;
+
+      /**
+       * Specify how to resolve attributes.
+       * @param [value] - A specification to resolve attributes.
+       */
+      resolveAttributes(value?: string | string[] | object | boolean): void;
+    }
+
+    class MacroProcessorDsl extends SyntaxProcessorDsl {
+      /**
+       * Specify how to resolve attributes.
+       * @param [value] - A specification to resolve attributes.
+       */
+      resolveAttributes(value?: string | string[] | object | boolean): void;
+    }
+
+    class BlockProcessorDsl extends SyntaxProcessorDsl {
+      onContext(context: string | string[]): void;
+
+      onContexts(...contexts: string[]): void;
+
+      parseContentAs(value: string): void;
+
+      process(block: (this: BlockProcessor, parent: Document, reader: Reader, attributes: any) => void): void;
+    }
+
+    class BlockMacroProcessorDsl extends MacroProcessorDsl {
+      parseContentAs(value: string): void;
+
+      process(block: (this: BlockMacroProcessor, parent: Document, target: string, attributes: any) => void): void;
+    }
+
+    class IncludeProcessorDsl {
+      process(block: (this: IncludeProcessor, document: Document, reader: Reader, target: string, attributes: any) => void): void;
+
+      handles(block: (target: string) => boolean): void;
+
+      prefer(): void;
+    }
+
+    class DocumentProcessorDsl {
+      prefer(): void;
+    }
+
+    class TreeProcessorDsl extends DocumentProcessorDsl {
+      process(block: (this: TreeProcessor, document: Document) => void): void;
+    }
+
+    class PostprocessorDsl extends DocumentProcessorDsl {
+      process(block: (this: Postprocessor, document: Document, output: string) => void): void;
+    }
+
+    class PreprocessorDsl extends DocumentProcessorDsl {
+      process(block: (this: Preprocessor, document: Document, reader: Reader) => void): void;
+    }
+
+    class DocinfoProcessorDsl extends DocumentProcessorDsl {
+      atLocation(location: string): void;
+
+      process(block: (this: DocinfoProcessor, document: Document) => void): void;
+    }
+  }
+
+  /**
+   * The {@link Document} class represents a parsed AsciiDoc document.
+   *
+   * Document is the root node of a parsed AsciiDoc document.<br/>
+   * It provides an abstract syntax tree (AST) that represents the structure of the AsciiDoc document
+   * from which the Document object was parsed.
+   *
+   * Although the constructor can be used to create an empty document object,
+   * more commonly, you'll load the document object from AsciiDoc source
+   * using the primary API methods on {@link Asciidoctor}.
+   * When using one of these APIs, you almost always want to set the safe mode to 'safe' (or 'unsafe')
+   * to enable all of Asciidoctor's features.
+   *
+   * <pre>
+   *   var doc = Asciidoctor.load('= Hello, AsciiDoc!', { 'safe': 'safe' })
+   *   // => Asciidoctor::Document { doctype: "article", doctitle: "Hello, AsciiDoc!", blocks: 0 }
+   * </pre>
+   *
+   * Instances of this class can be used to extract information from the document or alter its structure.
+   * As such, the Document object is most often used in extensions and by integrations.
+   *
+   * The most basic usage of the Document object is to retrieve the document's title.
+   *
+   * <pre>
+   *  var source = '= Document Title'
+   *  var doc = asciidoctor.load(source, { 'safe': 'safe' })
+   *  console.log(doc.getTitle()) // 'Document Title'
+   * </pre>
+   *
+   * You can also use the Document object to access document attributes defined in the header, such as the author and doctype.
+   */
+  class Document extends AbstractBlock {
+    /**
+     * Returns a JSON {Object} of references captured by the processor.
+     *
+     * @returns a JSON object of {Asciidoctor/AbstractNode} in the document.
+     */
+    getRefs(): any;
+
+    /**
+     * Returns an {Array} of {Document/ImageReference} captured by the processor.
+     *
+     * @returns an {Array} of {Document/ImageReference} in the document.
+     * Will return an empty array if the option "catalog_assets: true" was not defined on the processor.
+     */
+    getImages(): Document.ImageReference[];
+
+    /**
+     * Returns an {Array} of links captured by the processor.
+     *
+     * @returns an {Array} of links in the document.
+     * Will return an empty array if:
+     * - the function was called before the document was converted
+     * - the option "catalog_assets: true" was not defined on the processor
+     */
+    getLinks(): any[];
+
+    /**
+     * @returns true if the document has footnotes otherwise false
+     */
+    hasFootnotes(): boolean;
+
+    /**
+     * Returns an {Array} of {Document/Footnote} captured by the processor.
+     *
+     * @returns an {Array} of {Document/Footnote} in the document.
+     * Will return an empty array if the function was called before the document was converted.
+     */
+    getFootnotes(): Document.Footnote[];
+
+    /**
+     * Returns the level-0 {Section} (i.e. the document title).
+     * Only stores the title, not the header attributes.
+     *
+     * @returns the level-0 {Section}.
+     */
+    getHeader(): string;
+
+    /**
+     * @param [options] - a JSON of options to control processing (default: {})
+     */
+    convert(options?: object): string;
+
+    /**
+     * Write the output to the specified file.
+     *
+     * If the converter responds to "write", delegate the work of writing the file to that method.
+     * Otherwise, write the output the specified file.
+     */
+    write(output: string, target: string): void;
+
+    /**
+     * @returns the full name of the author as a String
+     */
+    getAuthor(): string;
+
+    getSource(): string;
+
+    getSourceLines(): string[];
+
+    isNested(): boolean;
+
+    isEmbedded(): boolean;
+
+    hasExtensions(): boolean;
+
+    getDoctype(): string;
+
+    getBackend(): string;
+
+    isBasebackend(): boolean;
+
+    /**
+     * Return the document title as a {string}
+     *
+     * @returns the resolved document title as a {string} or undefined if a document title cannot be resolved
+     */
+    getTitle(): string | undefined;
+
+    /**
+     * Set the title on the document header
+     *
+     * Set the title of the document header to the specified value.
+     * If the header does not exist, it is first created.
+     *
+     * @param title - the String title to assign as the title of the document header
+     *
+     * @returns the new String title assigned to the document header
+     */
+    setTitle(title: string): string;
+
+    /**
+     * Resolves the primary title for the document
+     *
+     * Searches the locations to find the first non-empty value:
+     *
+     * - document-level attribute named title
+     * - header title (known as the document title)
+     * - title of the first section
+     * - document-level attribute named untitled-label (if use_fallback option is set)
+     *
+     * If no value can be resolved, undefined is returned.
+     *
+     * If the partition attribute is specified, the value is parsed into an {@link Asciidoctor/Document/Title} object.
+     * If the sanitize attribute is specified, XML elements are removed from the value.
+     *
+     *
+     * @returns the resolved title as a {@link Asciidoctor/Document/Title} if the partition option is passed
+     * or a {string} if not or undefined if no value can be resolved.
+     */
+    getDocumentTitle(options?: Title.Options): string | Title | undefined;
+
+    /**
+     * @see {@link Asciidoctor/Document#getDocumentTitle}
+     */
+    getDoctitle(options: Title.Options): string | Title;
+
+    /**
+     * Get the document catalog JSON object.
+     */
+    getCatalog(): object;
+
+    /**
+     * @see Document#getCatalog
+     */
+    getReferences(): object;
+
+    /**
+     * Get the document revision date from document header (document attribute <code>revdate</code>).
+     */
+    getRevisionDate(): string | undefined;
+
+    /**
+     * @see Document#getRevisionDate
+     */
+    getRevdate(): string | undefined;
+
+    /**
+     * Get the document revision number from document header (document attribute <code>revnumber</code>).
+     */
+    getRevisionNumber(): string | undefined;
+
+    /**
+     * Get the document revision remark from document header (document attribute <code>revremark</code>).
+     */
+    getRevisionRemark(): string | undefined;
+
+    /**
+     *  Assign a value to the specified attribute in the document header.
+     *
+     *  The assignment will be visible when the header attributes are restored,
+     *  typically between processor phases (e.g., between parse and convert).
+     *
+     * @param name - The attribute name to assign
+     * @param value - The value to assign to the attribute (default: '')
+     * @param overwrite - A {boolean} indicating whether to assign the attribute
+     * if already present in the attributes Hash (default: true)
+     *
+     * @returns true if the assignment was performed otherwise false
+     */
+    setHeaderAttribute(name: string, value: any, overwrite: boolean): boolean;
+
+    /**
+     * Convenience method to retrieve the authors of this document as an {Array} of {Document/Author} objects.
+     *
+     * This method is backed by the author-related attributes on the document.
+     *
+     * @returns an {Array} of {Document/Author} objects.
+     */
+    getAuthors(): Author[];
+
+    /**
+     * @returns a {@link Document/RevisionInfo}
+     */
+    getRevisionInfo(): Document.RevisionInfo;
+
+    /**
+     * @returns true if the document contains revision info, otherwise false
+     */
+    hasRevisionInfo(): boolean;
+
+    /**
+     */
+    getNotitle(): boolean;
+
+    /**
+     */
+    getNoheader(): boolean;
+
+    /**
+     */
+    getNofooter(): boolean;
+
+    /**
+     */
+    hasHeader(): boolean;
+
+    /**
+     * Replay attribute assignments at the block level
+     *
+     * <i>This method belongs to an internal API that deals with how attributes are managed by the processor.</i>
+     * If you understand why this group of methods are necessary, and what they do, feel free to use them.
+     * <strong>However, keep in mind they are subject to change at any time.</strong>
+     *
+     * @param blockAttributes - a JSON of attributes
+     */
+    playbackAttributes(blockAttributes: Block.Attributes): void;
+
+    /**
+     * Delete the specified attribute from the document if the name is not locked.
+     * If the attribute is locked, false is returned.
+     * Otherwise, the attribute is deleted.
+     *
+     * @param name - the String attribute name
+     *
+     * @returns true if the attribute was deleted, false if it was not because it's locked
+     */
+    deleteAttribute(name: string): boolean;
+
+    /**
+     * Restore the attributes to the previously saved state (attributes in header).
+     */
+    restoreAttributes(): void;
+
+    /**
+     * Determine if the attribute has been locked by being assigned in document options.
+     *
+     * @param key - The attribute key to check
+     *
+     * @returns true if the attribute is locked, false otherwise
+     */
+    isAttributeLocked(key: string): boolean;
+
+    /**
+     * Parse the AsciiDoc source stored in the {Reader} into an abstract syntax tree.
+     *
+     * If the data parameter is not nil, create a new {PreprocessorReader} and assigned it to the reader property of this object.
+     * Otherwise, continue with the reader that was created when the {Document} was instantiated.
+     * Pass the reader to {Parser.parse} to parse the source data into an abstract syntax tree.
+     *
+     * If parsing has already been performed, this method returns without performing any processing.
+     *
+     * @param [data] - The optional replacement AsciiDoc source data as a String or String Array. (default: undefined)
+     *
+     * @returns this {Document}
+     */
+    parse(data?: string | string[]): Document;
+
+    /**
+     */
+    getDocinfo(): void;
+
+    /**
+     * @param [docinfoLocation] - A {string} for checking docinfo extensions at a given location (head or footer) (default: head)
+     */
+    hasDocinfoProcessors(docinfoLocation?: string): boolean;
+
+    /**
+     * Increment the specified counter and store it in the block's attributes.
+     *
+     * @param counterName - the String name of the counter attribute
+     * @param block - the {Block} on which to save the counter
+     *
+     * @returns the next number in the sequence for the specified counter
+     */
+    incrementAndStoreCounter(counterName: string, block: Block): number;
+
+    /**
+     * Get the named counter and take the next number in the sequence.
+     *
+     * @param name - the String name of the counter
+     * @param seed - the initial value as a String or Integer
+     *
+     * @returns the next number in the sequence for the specified counter
+     */
+    counter(name: string, seed: string | number): number;
+
+    /**
+     * A read-only integer value indicating the level of security that should be enforced while processing this document.
+     * The value must be set in the Document constructor using the "safe" option.
+     *
+     * A value of 0 (UNSAFE) disables any of the security features enforced by Asciidoctor.
+     *
+     * A value of 1 (SAFE) closely parallels safe mode in AsciiDoc.
+     * In particular, it prevents access to files which reside outside of the parent directory of the source file and disables any macro other than the include directive.
+     *
+     * A value of 10 (SERVER) disallows the document from setting attributes that would affect the conversion of the document,
+     * in addition to all the security features of SafeMode.SAFE.
+     * For instance, this level forbids changing the backend or source-highlighter using an attribute defined in the source document header.
+     * This is the most fundamental level of security for server deployments (hence the name).
+     *
+     * A value of 20 (SECURE) disallows the document from attempting to read files from the file system and including the contents of them into the document,
+     * in addition to all the security features of SafeMode.SECURE.
+     * In particular, it disallows use of the include::[] directive and the embedding of binary content (data uri), stylesheets and JavaScripts referenced by the document.
+     * (Asciidoctor and trusted extensions may still be allowed to embed trusted content into the document).
+     *
+     * Since Asciidoctor is aiming for wide adoption, 20 (SECURE) is the default value and is recommended for server deployments.
+     *
+     * A value of 100 (PARANOID) is planned to disallow the use of passthrough macros and prevents the document from setting any known attributes,
+     * in addition to all the security features of SafeMode.SECURE.
+     * Please note that this level is not currently implemented (and therefore not enforced)!
+     *
+     * @returns An integer value indicating the level of security
+     */
+    getSafe(): number;
+
+    /**
+     * Get the Boolean AsciiDoc compatibility mode.
+     * Enabling this attribute activates the following syntax changes:
+     *
+     *   * single quotes as constrained emphasis formatting marks
+     *   * single backticks parsed as inline literal, formatted as monospace
+     *   * single plus parsed as constrained, monospaced inline formatting
+     *   * double plus parsed as constrained, monospaced inline formatting
+     */
+    getCompatMode(): boolean;
+
+    /**
+     * Get the Boolean flag that indicates whether source map information should be tracked by the parser.
+     */
+    getSourcemap(): boolean;
+
+    /**
+     * Set the Boolean flag that indicates whether source map information should be tracked by the parser.
+     */
+    setSourcemap(value: boolean): void;
+
+    /**
+     * Get the JSON of document counters.
+     */
+    getCounters(): object;
+
+    /**
+     */
+    getCallouts(): Callouts;
+
+    /**
+     * Get the String base directory for converting this document.
+     *
+     * Defaults to directory of the source file.
+     * If the source is a string, defaults to the current directory.
+     */
+    getBaseDir(): string;
+
+    /**
+     * Get the JSON of resolved options used to initialize this {Document}.
+     */
+    getOptions(): any;
+
+    /**
+     * Get the outfilesuffix defined at the end of the header.
+     */
+    getOutfilesuffix(): string;
+
+    /**
+     * Get a reference to the parent {Document} of this nested document.
+     */
+    getParentDocument(): Document | undefined;
+
+    /**
+     * Get the {Reader} associated with this document.
+     */
+    getReader(): Reader;
+
+    /**
+     * Get the {Converter} instance being used to convert the current {Document}.
+     */
+    getConverter(): AbstractConverter;
+
+    /**
+     * Get the activated {Extensions.Registry} associated with this document.
+     */
+    getExtensions(): Registry;
+  }
+
+  /**
+   */
+  class AbstractBlock extends AbstractNode {
+    /**
+     * Append a block to this block's list of child blocks.
+     * @param block - the block to append
+     * @returns the parent block to which this block was appended.
+     */
+    append(block: AbstractBlock): AbstractBlock;
+
+    /**
+     * Get the String title of this Block with title substitions applied
+     *
+     * The following substitutions are applied to block and section titles:
+     *
+     * <code>specialcharacters</code>, <code>quotes</code>, <code>replacements</code>, <code>macros</code>, <code>attributes</code> and <code>post_replacements</code>
+     *
+     * @returns the converted String title for this Block, or undefined if the title is not set.
+     * @example
+     * block.title // "Foo 3^ # {two-colons} Bar(1)"
+     * block.getTitle(); // "Foo 3^ # :: Bar(1)"
+     */
+    getTitle(): string|undefined;
+
+    /**
+     * Set the String block title.
+     * @param title - The document title
+     * @returns returns the new String title assigned to this Block.
+     */
+    setTitle(title: string|undefined): string;
+
+    /**
+     * Generate and assign caption to block if not already assigned.
+     *
+     * If the block has a title and a caption prefix is available for this block,
+     * then build a caption from this information, assign it a number and store it
+     * to the caption attribute on the block.
+     *
+     * If a caption has already been assigned to this block, do nothing.
+     *
+     * The parts of a complete caption are: `<prefix> <number>. <title>`
+     * This partial caption represents the part the precedes the title.
+     *
+     * @param value - the String caption to assign to this block or nil to use document attribute.
+     * @param captionContext - the String context to use when resolving caption-related attributes.
+     * If not provided, the name of the context for this block is used. Only certain contexts allow the caption to be looked up.
+     */
+    assignCaption(value?: string, captionContext?: string): void;
+
+    /**
+     * Convenience method that returns the interpreted title of the Block
+     * with the caption prepended.
+     * Concatenates the value of this Block's caption instance variable and the
+     * return value of this Block's title method. No space is added between the
+     * two values. If the Block does not have a caption, the interpreted title is
+     * returned.
+     *
+     * @returns the converted String title prefixed with the caption, or just the
+     * converted String title if no caption is set
+     */
+    getCaptionedTitle(): string;
+
+    /**
+     * Get the style (block type qualifier) for this block.
+     * @returns the style for this block
+     */
+    getStyle(): string;
+
+    /**
+     * Set the style for this block.
+     * @param style - Style
+     */
+    setStyle(style: string): void;
+
+    /**
+     * Get the location in the AsciiDoc source where this block begins.
+     * @returns the style for this block
+     */
+    getSourceLocation(): Cursor;
+
+    /**
+     * Get the caption for this block.
+     * @returns the caption for this block
+     */
+    getCaption(): string | undefined;
+
+    /**
+     * Set the caption for this block.
+     * @param caption - Caption
+     */
+    setCaption(caption: string): void;
+
+    /**
+     * Get the level of this section or the section level in which this block resides.
+     * @returns he level (Integer) of this section
+     */
+    getLevel(): number;
+
+    /**
+     * Get the substitution keywords to be applied to the contents of this block.
+     *
+     * @returns the list of {string} substitution keywords associated with this block.
+     */
+    getSubstitutions(): string[];
+
+    /**
+     * Check whether a given substitution keyword is present in the substitutions for this block.
+     *
+     * @returns whether the substitution is present on this block.
+     */
+    hasSubstitution(): boolean;
+
+    /**
+     * Remove the specified substitution keyword from the list of substitutions for this block.
+     *
+     * @returns undefined
+     */
+    removeSubstitution(): any;
+
+    /**
+     * Checks if the {@link AbstractBlock} contains any child blocks.
+     * @returns whether the {@link AbstractBlock} has child blocks.
+     */
+    hasBlocks(): boolean;
+
+    /**
+     * Get the list of {@link AbstractBlock} sub-blocks for this block.
+     * @returns a list of {@link AbstractBlock} sub-blocks
+     */
+    getBlocks(): any[];
+
+    /**
+     * Get the converted result of the child blocks by converting the children appropriate to content model that this block supports.
+     * @returns the converted result of the child blocks
+     */
+    getContent(): string;
+
+    /**
+     * Get the converted content for this block.
+     * If the block has child blocks, the content method should cause them to be converted
+     * and returned as content that can be included in the parent block's template.
+     * @returns the converted String content for this block
+     */
+    convert(): string;
+
+    /**
+     * Query for all descendant block-level nodes in the document tree
+     * that match the specified selector (context, style, id, and/or role).
+     * If a function block is given, it's used as an additional filter.
+     * If no selector or function block is supplied, all block-level nodes in the tree are returned.
+     * @example
+     * doc.findBy({'context': 'section'});
+     * // => { level: 0, title: "Hello, AsciiDoc!", blocks: 0 }
+     * // => { level: 1, title: "First Section", blocks: 1 }
+     *
+     * doc.findBy({'context': 'section'}, function (section) { return section.getLevel() === 1; });
+     * // => { level: 1, title: "First Section", blocks: 1 }
+     *
+     * doc.findBy({'context': 'listing', 'style': 'source'});
+     * // => { context: :listing, content_model: :verbatim, style: "source", lines: 1 }
+     *
+     * @returns a list of block-level nodes that match the filter or an empty list if no matches are found
+     */
+    findBy(selector: Selector | ((block: AbstractBlock) => boolean | string)): AbstractBlock[];
+
+    /**
+     * Get the source line number where this block started.
+     * @returns the source line number where this block started
+     */
+    getLineNumber(): number;
+
+    /**
+     * Check whether this block has any child Section objects.
+     * Only applies to Document and Section instances.
+     * @returns true if this block has child Section objects, otherwise false
+     */
+    hasSections(): boolean;
+
+    /**
+     * Get the Array of child Section objects.
+     * Only applies to Document and Section instances.
+     * @returns an {Array} of {@link Section} objects
+     */
+    getSections(): Section[];
+
+    /**
+     * Get the numeral of this block (if section, relative to parent, otherwise absolute).
+     * Only assigned to section if automatic section numbering is enabled.
+     * Only assigned to formal block (block with title) if corresponding caption attribute is present.
+     * If the section is an appendix, the numeral is a letter (starting with A).
+     * @returns the numeral
+     */
+    getNumeral(): string;
+
+    /**
+     * Set the numeral of this block.
+     * @param value - The numeral value
+     */
+    setNumeral(value: string): void;
+
+    /**
+     * A convenience method that checks whether the title of this block is defined.
+     *
+     * @returns a {boolean} indicating whether this block has a title.
+     */
+    hasTitle(): boolean;
+
+    /**
+     * Returns the converted alt text for this block image.
+     *
+     * @returns the {string} value of the alt attribute with XML special character and replacement substitutions applied.
+     */
+    getAlt(): string;
+  }
+
+  /**
+   * @description
+   * Methods for managing sections of AsciiDoc content in a document.
+   *
+   * @example
+   * <pre>
+   *   section = asciidoctor.Section.create()
+   *   section.setTitle('Section 1')
+   *   section.setId('sect1')
+   *   section.getBlocks().length // 0
+   *   section.getId() // "sect1"
+   *   section.append(newBlock)
+   *   section.getBlocks().length // 1
+   * </pre>
+   */
+  class Section extends AbstractBlock {
+    /**
+     * Create a {Section} object.
+     * @param [parent] - The parent AbstractBlock. If set, must be a Document or Section object (default: undefined)
+     * @param [level] - The Integer level of this section (default: 1 more than parent level or 1 if parent not defined)
+     * @param [numbered] - A Boolean indicating whether numbering is enabled for this Section (default: false)
+     * @param [opts] - An optional JSON of options (default: {})
+     *
+     * @returns a new {Section} object
+     */
+    static create(parent?: AbstractBlock, level?: number, numbered?: boolean, opts?: object): Section;
+
+    /**
+     * Set the level of this section or the section level in which this block resides.
+     * @param level - Level (Integer)
+     */
+    setLevel(level: number): void;
+
+    /**
+     * Get the 0-based index order of this section within the parent block.
+     */
+    getIndex(): number;
+
+    /**
+     * Set the 0-based index order of this section within the parent block.
+     * @param index - The index order of this section
+     */
+    setIndex(index: number): void;
+
+    /**
+     * Get the section name of this section.
+     */
+    getSectionName(): string;
+
+    /**
+     * Set the section name of this section.
+     * @param value - The section name
+     */
+    setSectionName(value: string): void;
+
+    /**
+     * Get the flag to indicate whether this is a special section or a child of one.
+     */
+    isSpecial(): boolean;
+
+    /**
+     * Set the flag to indicate whether this is a special section or a child of one.
+     * @param value - A flag to indicated if this is a special section
+     */
+    setSpecial(value: boolean): void;
+
+    /**
+     * Get the state of the numbered attribute at this section (need to preserve for creating TOC).
+     */
+    isNumbered(): boolean;
+
+    /**
+     * Get the caption for this section (only relevant for appendices).
+     */
+    getCaption(): string | undefined;
+
+    /**
+     * Get the name of the Section (title)
+     * @see {@link AbstractBlock#getTitle}
+     */
+    getName(): string;
+  }
+
+  /**
+   * Methods for managing inline elements in AsciiDoc block.
+   */
+  class Inline extends AbstractNode {
+    /**
+     * Create a new Inline element.
+     * @returns a new Inline element
+     */
+    static create(parent: AbstractBlock, context: string, text?: string, opts?: Record<string, unknown>): Inline;
+
+    /**
+     * Get the converted content for this inline node.
+     * @returns the converted String content for this inline node
+     */
+    convert(): string;
+
+    /**
+     * Get the converted String text of this Inline node, if applicable.
+     * @returns the converted String text for this Inline node, or undefined if not applicable for this node.
+     */
+    getText(): string;
+
+    /**
+     * Get the String sub-type (aka qualifier) of this Inline node.
+     *
+     * This value is used to distinguish different variations of the same node
+     * category, such as different types of anchors.
+     *
+     * @returns the string sub-type of this Inline node.
+     */
+    getType(): string;
+
+    /**
+     * Get the primary String target of this Inline node.
+     *
+     * @returns the string target of this Inline node.
+     */
+    getTarget(): string | undefined;
+
+    /**
+     * Returns the converted alt text for this inline image.
+     *
+     * @returns the {string} value of the alt attribute.
+     */
+    getAlt(): string;
+  }
+
+  /**
+   * Methods for managing AsciiDoc content blocks.
+   *
+   * @example
+   * block = Asciidoctor::Block.new(parent, :paragraph, source: '_This_ is a <test>')
+   * block.content
+   * => "<em>This</em> is a &lt;test&gt;"
+   */
+  class Block extends AbstractBlock {
+    /**
+     * Create a {Block} object.
+     * @param parent - The parent {AbstractBlock} with a compound content model to which this {Block} will be appended.
+     * @param context - The context name for the type of content (e.g., "paragraph").
+     * @param [opts] - a JSON of options to customize block initialization: (default: {})
+     * @param opts.content_model - indicates whether blocks can be nested in this {Block} ("compound"),
+     * otherwise how the lines should be processed ("simple", "verbatim", "raw", "empty"). (default: "simple")
+     * @param opts.attributes - a JSON of attributes (key/value pairs) to assign to this {Block}. (default: {})
+     * @param opts.source - a String or {Array} of raw source for this {Block}. (default: undefined)
+     *
+     * IMPORTANT: If you don't specify the `subs` option, you must explicitly call the `commit_subs` method to resolve and assign the substitutions
+     * to this block (which are resolved from the `subs` attribute, if specified, or the default substitutions based on this block's context).
+     * If you want to use the default subs for a block, pass the option `subs: "default"`.
+     * You can override the default subs using the `default_subs` option.
+     *
+     * @returns a new {Block} object
+     */
+    static create(parent: AbstractBlock, context: string, opts?: object): Block;
+
+    /**
+     * Get the source of this block.
+     * @returns the String source of this block.
+     */
+    getSource(): string;
+
+    /**
+     * Get the source lines of this block.
+     * @returns the String {Array} of source lines for this block.
+     */
+    getSourceLines(): string[];
+  }
+
+  /** Methods for managing AsciiDoc tables. */
+  class Table extends AbstractBlock {
+    /**
+     * Create a new Table element.
+     * @param parent - The parent {AbstractBlock}.
+     * @param attributes - a JSON of attributes
+     * @returns a new {Table} object
+     */
+    static create(parent: AbstractBlock, attributes: Attributes): Table;
+
+    /**
+     * Get the caption of the table.
+     * @returns the String caption
+     */
+    getCaption(): string;
+
+    /**
+     * Get the rows of this table.
+     * @returns an {Table.Rows} object with the members "head", "body" and "foot"
+     */
+    getRows(): Table.Rows;
+
+    /**
+     * Get the columns of this table.
+     * @returns an {Array} of {Table.Column}
+     */
+    getColumns(): Table.Column[];
+
+    /**
+     * Get the head rows of this table.
+     * @returns an {Array} of {Array} of {Table.Cell}.
+     */
+    getHeadRows(): Table.Cell[][];
+
+    /**
+     * Check if the table has a head rows.
+     * @returns true if the table has head rows, false otherwise.
+     */
+    hasHeadRows(): boolean;
+
+    /**
+     * Get the body rows of this table.
+     * @returns an {Array} of {Array} of {Table.Cell}.
+     */
+    getBodyRows(): Table.Cell[][];
+
+    /**
+     * Check if the table has a body rows.
+     * @returns true if the table has body rows, false otherwise.
+     */
+    hasBodyRows(): boolean;
+
+    /**
+     * Get the foot rows of this table.
+     * @returns an {Array} of {Array} of {Table.Cell}.
+     */
+    getFootRows(): Table.Cell[][];
+
+    /**
+     * Check if the table has a foot rows.
+     * @returns true if the table has foot rows, false otherwise.
+     */
+    hasFootRows(): boolean;
+
+    /**
+     * Check if the table has a header option set.
+     * @returns true if the header option is set, false otherwise.
+     */
+    hasHeaderOption(): boolean;
+
+    /**
+     * Check if the table has the footer option set.
+     * @returns true if the footer option is set, false otherwise.
+     */
+    hasFooterOption(): boolean;
+
+    /**
+     * Check if the table has the autowidth option set.
+     * @returns true if the autowidth option is set, false otherwise.
+     */
+    hasAutowidthOption(): boolean;
+
+    /**
+     * Get the number of rows in the table.
+     * Please note that the header and footer rows are also counted.
+     * @returns the number of rows in the table.
+     */
+    getRowCount(): number;
+
+    /**
+     * Set the number of rows in the table.
+     * Please note that the header and footer rows are also counted.
+     * @param value - the value
+     */
+    setRowCount(value: number): void;
+
+    /**
+     * Get the number of columns in the table.
+     * @returns the number of columns in the table.
+     */
+    getColumnCount(): number;
+
+    /**
+     * Set the number of columns in the table.
+     * @param value - the value
+     */
+    setColumnCount(value: number): void;
+  }
+
+  /**
+   * Methods for managing AsciiDoc tables.
+   */
+  namespace Table {
+    class Rows {
+      /**
+       * head rows.
+       */
+      head: Cell[][];
+      /**
+       * body rows.
+       */
+      body: Cell[][];
+      /**
+       * foot rows.
+       */
+      foot: Cell[][];
+
+      /**
+       * Create a new {Rows} object.
+       * @param head - head rows
+       * @param foot - foot rows
+       * @param body - body rows
+       * @returns a new {Rows} object.
+       */
+      static create(head: Cell[][], foot: Cell[][], body: Cell[][]): Rows;
+
+      /**
+       * Get head rows.
+       * @returns head rows.
+       */
+      getHead(): Cell[][];
+
+      /**
+       * Get body rows.
+       * @returns body rows.
+       */
+      getBody(): Cell[][];
+
+      /**
+       * Get foot rows.
+       * @returns foot rows.
+       */
+      getFoot(): Cell[][];
+
+      /**
+       * Retrieve the rows grouped by section as a nested {Array}.
+       * Creates a 2-dimensional array of two element entries.
+       * The first element is the section name as a String.
+       * The second element is the Array of rows in that section.
+       * The entries are in document order (head, foot, body).
+       * @returns a 2-dimensional {Array} two element entries
+       */
+      bySection(): Array<[string, Cell[][]]>;
+    }
+
+    /**
+     * Methods to manage the columns of an AsciiDoc table.
+     * In particular, it keeps track of the column specs.
+     */
+    class Column {
+      static create(table: Table, index: number, attributes: Attributes): Column;
+
+      /**
+       * Get the column number of this cell.
+       * @returns the column number.
+       */
+      getColumnNumber(): number;
+
+      /**
+       * Get the width of this cell.
+       * @returns the width of this cell.
+       */
+      getWidth(): string | undefined;
+
+      /**
+       * Get the horizontal align of this cell.
+       * @returns the horizontal align of this cell.
+       */
+      getHorizontalAlign(): string | undefined;
+
+      /**
+       * Get the vertical align of this cell.
+       * @returns the vertical align of this cell.
+       */
+      getVerticalAlign(): string | undefined;
+
+      /**
+       * Get the style of this cell.
+       * @returns the style of this cell.
+       */
+      getStyle(): string | undefined;
+    }
+
+    /**
+     * Methods for managing the cells in an AsciiDoc table.
+     */
+    class Cell {
+      /**
+       * Get the column span of this {@link Cell} node.
+       * @returns a {number} of the number of columns this cell will span (default: undefined).
+       */
+      getColumnSpan(): number | undefined;
+
+      /**
+       * Set the column span of this {@link Cell} node.
+       * @param value - the value
+       * @returns the new colspan value.
+       */
+      setColumnSpan(value: number): number;
+
+      /**
+       * Get the row span of this {@link Cell} node
+       * @returns a {number} of the number of rows this cell will span (default: undefined).
+       */
+      getRowSpan(): number | undefined;
+
+      /**
+       * Set the row span of this {@link Cell} node
+       * @param value - the value
+       * @returns the new rowspan value.
+       */
+      setRowSpan(value: number): number;
+
+      /**
+       * Get the content of the cell.
+       * This method should not be used for cells in the head row or that have the literal style.
+       * @returns the String content of the cell.
+       */
+      getContent(): string;
+
+      /**
+       * Get the text of the cell.
+       * @returns the text of the cell.
+       */
+      getText(): string;
+
+      /**
+       * Get the source of the cell.
+       * @returns the source of the cell.
+       */
+      getSource(): string;
+
+      /**
+       * Get the lines of the cell.
+       * @returns the lines of the cell.
+       */
+      getLines(): string[];
+
+      /**
+       * Get the line number of the cell.
+       * @returns the line number of the cell.
+       */
+      getLineNumber(): number | undefined;
+
+      /**
+       * Get the source file of the cell.
+       * @returns the file of the cell.
+       */
+      getFile(): string | undefined;
+
+      /**
+       * Get the style of the cell.
+       * @returns the style of the cell.
+       */
+      getStyle(): string | undefined;
+
+      /**
+       * Get the column of this cell.
+       * @returns the column of this cell.
+       */
+      getColumn(): Column | undefined;
+
+      /**
+       * Get the width of this cell.
+       * @returns the width of this cell.
+       */
+      getWidth(): string | undefined;
+
+      /**
+       * Get the column width in percentage of this cell.
+       * @returns the column width in percentage of this cell.
+       */
+      getColumnPercentageWidth(): string | undefined;
+
+      /**
+       * Get the nested {Document} of this cell when style is 'asciidoc'.
+       * @returns the nested {Document}
+       */
+      getInnerDocument(): Document | undefined;
+    }
+  }
+
+  /**
+   * @description
+   * An abstract base class that provides state and methods for managing a node of AsciiDoc content.
+   * The state and methods on this class are common to all content segments in an AsciiDoc document.
+   */
+  class AbstractNode implements Logging {
+    /**
+     * Resolve the list of comma-delimited subs against the possible options.
+     *
+     * @param subs - The comma-delimited String of substitution names or aliases.
+     * @param [type] - A String representing the context for which the subs are being resolved (default: 'block').
+     * @param [defaults] - An Array of substitutions to start with when computing incremental substitutions (default: undefined).
+     * @param [subject] - The String to use in log messages to communicate the subject for which subs are being resolved (default: undefined)
+     *
+     * @returns An Array of Strings representing the substitution operation or nothing if no subs are found.
+     */
+    resolveSubstitutions(subs: string, type?: string, defaults?: string[], subject?: string): string[] | undefined;
+
+    /**
+     * Call {@link AbstractNode#resolveSubstitutions} for the 'block' type.
+     *
+     * @see {@link AbstractNode#resolveSubstitutions}
+     */
+    resolveBlockSubstitutions(subs: string, defaults?: string[], subject?: string): string[] | undefined;
+
+    /**
+     * Call {@link AbstractNode#resolveSubstitutions} for the 'inline' type with the subject set as passthrough macro.
+     *
+     * @see {@link AbstractNode#resolveSubstitutions}
+     */
+    resolvePassSubstitutions(subs: string): string[] | undefined;
+
+    /**
+     * Apply the specified substitutions to the text.
+     *
+     * @param text - The String or String Array of text to process; must not be undefined.
+     * @param [subs] - The substitutions to perform; must be a String, an Array or undefined (default: NORMAL_SUBS).
+     *
+     * @returns a String or String Array to match the type of the text argument with substitutions applied.
+     */
+    applySubstitutions(text: string, subs?: string | string[]): string | string[];
+
+    /**
+     * @returns the String name of this node
+     */
+    getNodeName(): string;
+
+    /**
+     * @returns the JSON of attributes for this node
+     */
+    getAttributes(): any;
+
+    /**
+     * Get the value of the specified attribute.
+     * If the attribute is not found on this node, fallback_name is set, and this node is not the Document node, get the value of the specified attribute from the Document node.
+     *
+     * Look for the specified attribute in the attributes on this node and return the value of the attribute, if found.
+     * Otherwise, if fallback_name is set (default: same as name) and this node is not the Document node, look for that attribute on the Document node and return its value, if found.
+     * Otherwise, return the default value (default: undefined).
+     *
+     * @param name - The String of the attribute to resolve.
+     * @param [defaultValue] - The {Object} value to return if the attribute is not found (default: undefined).
+     * @param [fallbackName] - The String of the attribute to resolve on the Document if the attribute is not found on this node (default: same as name).
+     *
+     * @returns the {Object} value (typically a String) of the attribute or defaultValue if the attribute is not found.
+     */
+    getAttribute(name: string, defaultValue?: any, fallbackName?: string): any;
+
+    /**
+     * Check whether the specified attribute is present on this node.
+     *
+     * @param name - The String of the attribute to resolve.
+     * @returns true if the attribute is present, otherwise false
+     */
+    hasAttribute(name: string): boolean;
+
+    /**
+     * Check if the specified attribute is defined using the same logic as {AbstractNode#getAttribute}, optionally performing acomparison with the expected value if specified.
+     *
+     * Look for the specified attribute in the attributes on this node.
+     * If not found, fallback_name is specified (default: same as name), and this node is not the Document node, look for that attribute on the Document node.
+     * In either case, if the attribute is found, and the comparison value is truthy, return whether the two values match.
+     * Otherwise, return whether the attribute was found.
+     *
+     * @param name - The String name of the attribute to resolve.
+     * @param [expectedValue] - The expected Object value of the attribute (default: undefined).
+     * @param fallbackName - The String of the attribute to resolve on the Document if the attribute is not found on this node (default: same as name).
+     *
+     * @returns a Boolean indicating whether the attribute exists and, if a truthy comparison value is specified, whether the value of the attribute matches the comparison value.
+     */
+    isAttribute(name: string, expectedValue?: any, fallbackName?: string): boolean;
+
+    /**
+     * Assign the value to the attribute name for the current node.
+     *
+     * @param name - The String attribute name to assign
+     * @param value - The Object value to assign to the attribute (default: '')
+     * @param overwrite - A Boolean indicating whether to assign the attribute if currently present in the attributes JSON (default: true)
+     *
+     * @returns a Boolean indicating whether the assignment was performed
+     */
+    setAttribute(name: string, value: any, overwrite?: boolean): boolean;
+
+    /**
+     * Remove the attribute from the current node.
+     * @param name - The String attribute name to remove
+     * @returns the previous {string} value, or undefined if the attribute was not present.
+     */
+    removeAttribute(name: string): string | undefined;
+
+    /**
+     * Get the {@link Document} to which this node belongs.
+     *
+     * @returns the {@link Document} object to which this node belongs.
+     */
+    getDocument(): Document;
+
+    /**
+     * Get the {@link AbstractNode} to which this node is attached.
+     *
+     * @returns the {@link AbstractNode} object to which this node is attached,
+     * or undefined if this node has no parent.
+     */
+    getParent(): AbstractNode | undefined;
+
+    /**
+     * @returns true if this {AbstractNode} is an instance of {Inline}
+     */
+    isInline(): boolean;
+
+    /**
+     * @returns true if this {AbstractNode} is an instance of {Block}
+     */
+    isBlock(): boolean;
+
+    /**
+     * Checks if the role attribute is set on this node and, if an expected value is given, whether the space-separated role matches that value.
+     *
+     * @param expectedValue - The expected String value of the role (optional, default: undefined)
+     *
+     * @returns a Boolean indicating whether the role attribute is set on this node and, if an expected value is given, whether the space-separated role matches that value.
+     */
+    isRole(expectedValue?: string): boolean;
+
+    /**
+     * Retrieves the space-separated String role for this node.
+     *
+     * @returns the role as a space-separated String.
+     */
+    getRole(): string;
+
+    /**
+     * Checks if the specified role is present in the list of roles for this node.
+     *
+     * @param name - The String name of the role to find.
+     *
+     * @returns a Boolean indicating whether this node has the specified role.
+     */
+    hasRole(name: string): boolean;
+
+    /**
+     * Retrieves the String role names for this node as an Array.
+     *
+     * @returns the role names as a String {Array}, which is empty if the role attribute is absent on this node.
+     */
+    getRoles(): string[];
+
+    /**
+     * Adds the given role directly to this node.
+     *
+     * @param name - The name of the role to add
+     *
+     * @returns a Boolean indicating whether the role was added.
+     */
+    addRole(name: string): boolean;
+
+    /**
+     * Public: Removes the given role directly from this node.
+     *
+     * @param name - The name of the role to remove
+     *
+     * @returns a Boolean indicating whether the role was removed.
+     */
+    removeRole(name: string): boolean;
+
+    /**
+     * A convenience method that checks if the reftext attribute is defined.
+     * @returns A Boolean indicating whether the reftext attribute is defined
+     */
+    isReftext(): boolean;
+
+    /**
+     * A convenience method that returns the value of the reftext attribute with substitutions applied.
+     * @returns the value of the reftext attribute with substitutions applied.
+     */
+    getReftext(): string | undefined;
+
+    /**
+     * @returns the context name for this node
+     */
+    getContext(): string;
+
+    /**
+     * @returns the String id of this node
+     */
+    getId(): string;
+
+    /**
+     * @param id - the String id of this node
+     */
+    setId(id: string): void;
+
+    /**
+     * A convenience method to check if the specified option attribute is enabled on the current node.
+     * Check if the option is enabled. This method simply checks to see if the <name>-option attribute is defined on the current node.
+     *
+     * @param name - the String name of the option
+     *
+     * @return a Boolean indicating whether the option has been specified
+     */
+    isOption(name: string): boolean;
+
+    /**
+     * Set the specified option on this node.
+     * This method sets the specified option on this node by setting the <name>-option attribute.
+     *
+     * @param name - the String name of the option
+     */
+    setOption(name: string): void;
+
+    /**
+     * Construct a reference or data URI to an icon image for the specified icon name.
+     *
+     * If the 'icon' attribute is set on this block, the name is ignored and the value of this attribute is used as the target image path.
+     * Otherwise, construct a target image path by concatenating the value of the 'iconsdir' attribute,
+     * the icon name, and the value of the 'icontype' attribute (defaulting to 'png').
+     *
+     * The target image path is then passed through the {@link AbstractNode#getImageUri} method.
+     * If the 'data-uri' attribute is set on the document, the image will be safely converted to a data URI.
+     *
+     * The return value of this method can be safely used in an image tag.
+     *
+     * @param name - the String name of the icon
+     *
+     * @returns A String reference or data URI for an icon image
+     */
+    getIconUri(name: string): string;
+
+    /**
+     * Construct a URI reference to the target media.
+     *
+     * If the target media is a URI reference, then leave it untouched.
+     *
+     * The target media is resolved relative to the directory retrieved from the specified attribute key, if provided.
+     *
+     * The return value can be safely used in a media tag (img, audio, video).
+     *
+     * @param target - A String reference to the target media
+     * @param assetDirKey - The String attribute key used to lookup the directory where the media is located (default: 'imagesdir')
+     *
+     * @returns A String reference for the target media
+     */
+    getMediaUri(target: string, assetDirKey?: string): string;
+
+    /**
+     * Construct a URI reference or data URI to the target image.
+     *
+     * If the target image is a URI reference, then leave it untouched.
+     *
+     * The target image is resolved relative to the directory retrieved from the specified attribute key, if provided.
+     *
+     * If the 'data-uri' attribute is set on the document, and the safe mode level is less than SafeMode.SECURE,
+     * the image will be safely converted to a data URI by reading it from the same directory.
+     * If neither of these conditions are satisfied, a relative path (i.e., URL) will be returned.
+     *
+     * The return value of this method can be safely used in an image tag.
+     *
+     * @param targetImage - A String path to the target image
+     * @param assetDirKey - The String attribute key used to lookup the directory where the image is located (default: 'imagesdir')
+     *
+     * @returns A String reference or data URI for the target image
+     */
+    getImageUri(targetImage: string, assetDirKey?: string): string;
+
+    /**
+     * Get the {Converter} instance being used to convert the current {Document}.
+     */
+    getConverter(): object;
+
+    /**
+     */
+    readContents(): void;
+
+    /**
+     * Read the contents of the file at the specified path.
+     * This method assumes that the path is safe to read.
+     * It checks that the file is readable before attempting to read it
+     * @param path - the {string} path from which to read the contents
+     * @param options - a JSON of options to control processing (default: {})
+     * - warn_on_failure a {boolean} that controls whether a warning is issued if the file cannot be read (default: false)
+     * - normalize a {boolean} that controls whether the lines are normalized and coerced to UTF-8 (default: false)
+     * @returns the {string} content of the file at the specified path, or undefined if the file does not exist.
+     */
+    readAsset(path: string, options: any): string;
+
+    /**
+     */
+    normalizeWebPath(): void;
+
+    /**
+     */
+    normalizeSystemPath(): void;
+
+    /**
+     */
+    normalizeAssetPath(): void;
+
+    // alias
+    getLogger(): Logger;
+
+    createLogMessage(text: string, context: any): LoggerMessage;
+  }
+
+  /**
+   * Methods for managing AsciiDoc lists (ordered, unordered and description lists).
+   */
+  class List extends AbstractBlock {
+    /**
+     * Checks if the {@link List} contains any child {@link ListItem}.
+     * @returns whether the {@link List} has child {@link ListItem}.
+     */
+    hasItems(): boolean;
+
+    /**
+     * Get the Array of {@link ListItem} nodes for this {@link List}.
+     * @returns an Array of {@link ListItem} nodes.
+     */
+    getItems(): ListItem[];
+  }
+
+  /**
+   * Methods for managing items for AsciiDoc olists, ulist, and dlists.
+   *
+   * In a description list (dlist), each item is a tuple that consists of a 2-item Array of ListItem terms and a ListItem description (i.e., [[term, term, ...], desc].
+   * If a description is not set, then the second entry in the tuple is nil.
+   */
+  class ListItem extends AbstractBlock {
+    /**
+     * Get the converted String text of this {@link ListItem} node.
+     * @returns the converted String text for this {@link ListItem} node.
+     */
+    getText(): string;
+
+    /**
+     * Set the String source text of this {@link ListItem} node.
+     * @returns the new String text assigned to this {@link ListItem}
+     */
+    setText(text: string): string;
+
+    /**
+     * A convenience method that checks whether the text of this {@link ListItem} is not blank (i.e. not undefined or empty string).
+     * @returns whether the text is not blank
+     */
+    hasText(): boolean;
+
+    /**
+     * Get the {string} used to mark this {@link ListItem}.
+     */
+    getMarker(): string;
+
+    /**
+     * Set the {string} used to mark this {@link ListItem}.
+     *
+     * @param marker - the {string} used to mark this {@link ListItem}
+     */
+    setMarker(marker: string): void;
+
+    /**
+     * Get the {@link List} to which this {@link ListItem} is attached.
+     *
+     * @returns the {@link List} object to which this {@link ListItem} is attached,
+     * or undefined if this node has no parent.
+     */
+    getList(): List;
+
+    /**
+     * @see {@link ListItem#getList}
+     */
+    getParent(): List;
+  }
+
+  namespace Html5Converter {
+    /**
+     * Create a new {@link Html5Converter}.
+     * @returns a {@link Html5Converter}
+     */
+    function create(): Html5Converter;
+  }
+
+  interface AbstractConverter {
+    /**
+     * Converts an {AbstractNode} using the given transform.
+     * This method must be implemented by a concrete converter class.
+     *
+     * @param node - The concrete instance of AbstractNode to convert.
+     * @param [transform] - An optional String transform that hints at which transformation should be applied to this node.
+     * If a transform is not given, the transform is often derived from the value of the {AbstractNode#getNodeName} property. (optional, default: undefined)
+     * @param [opts]- An optional JSON of options hints about how to convert the node. (optional, default: undefined)
+     *
+     * @returns the {String} result.
+     */
+    convert(node: AbstractNode, transform?: string, opts?: unknown): string;
+  }
+
+  interface ConverterConstructor {
+    new(backend?: string, opts?: unknown): AbstractConverter;
+  }
+
+  class Converter implements AbstractConverter {
+    /**
+     * Converts an {AbstractNode} using the given transform.
+     * This method must be implemented by a concrete converter class.
+     *
+     * @param node - The concrete instance of AbstractNode to convert.
+     * @param [transform] - An optional String transform that hints at which transformation should be applied to this node.
+     * If a transform is not given, the transform is often derived from the value of the {AbstractNode#getNodeName} property. (optional, default: undefined)
+     * @param [opts]- An optional JSON of options hints about how to convert the node. (optional, default: undefined)
+     *
+     * @returns the {String} result.
+     */
+    convert(node: AbstractNode, transform?: string, opts?: any): string;
+  }
+
+  /**
+   * A built-in {Converter} implementation that generates HTML 5 output.
+   */
+  class Html5Converter extends Converter {
+  }
+
+  namespace ConverterFactory {
+    /**
+     * Create an instance of the converter bound to the specified backend.
+     *
+     * @param backend - look for a converter bound to this keyword.
+     * @param opts - a JSON of options to pass to the converter (default: {})
+     * @returns a {Converter} instance for converting nodes in an Asciidoctor AST.
+     */
+    function create(backend: string, opts?: unknown): Converter;
+  }
+
+  /**
+   * A registry of {Converter} instances or classes keyed by backend name.
+   */
+  interface ConverterRegistry {
+    [key: string]: typeof Converter|Converter;
+  }
+
+  class ConverterFactory {
+    /**
+     * Register a custom converter in the global converter factory to handle conversion to the specified backends.
+     * If the backend value is an asterisk, the converter is used to handle any backend that does not have an explicit converter.
+     *
+     * @param converter - The {Converter} instance to register
+     * @param backends- A {string} {Array} of backend names that this converter should be registered to handle (optional, default: ['*'])
+     */
+    register(converter: AbstractConverter | ConverterConstructor, backends?: string[]): void;
+
+    /**
+     * Retrieves the singleton instance of the converter factory.
+     *
+     * @param initialize - instantiate the singleton if it has not yet been instantiated.
+     * If this value is false and the singleton has not yet been instantiated, this method returns a fresh instance.
+     * @returns an instance of the {ConverterFactory}.
+     */
+    getDefault(initialize: boolean): ConverterFactory;
+
+    /**
+     * Get the converter registry.
+     * @returns the registry
+     */
+    getRegistry(): ConverterRegistry;
+
+    /**
+     * Lookup the custom converter registered with this factory to handle the specified backend.
+     * @param backend - The {string} backend name.
+     * @returns the {Converter} class or instance registered to convert the specified backend or undefined if no match is found.
+     */
+    for(backend: string): typeof Converter|Converter|undefined;
+  }
+
+  interface SyntaxHighlighterHighlightOptions {
+    [key: string]: any;
+
+    /**
+     * An Object of callouts extracted from the source, indexed by line number (1-based) (optional).
+     */
+    callouts?: any;
+    /**
+     * The String CSS mode ("class" or "inline").
+     */
+    css_mode?: string;
+    /**
+     * A 1-based Array of Integer line numbers to highlight (aka emphasize) (optional).
+     */
+    highlight_lines?: number[];
+    /**
+     * A String indicating whether lines should be numbered ("table" or "inline") (optional).
+     */
+    number_lines?: string;
+    /**
+     * The starting Integer (1-based) line number (optional, default: 1).
+     */
+    start_line_number?: number;
+    /**
+     * The String style (aka theme) to use for colorizing the code (optional).
+     */
+    style?: string;
+  }
+
+  interface SyntaxHighlighterDocinfoOptions {
+    [key: string]: any;
+
+    /**
+     * A Boolean indicating whether the stylesheet should be linked instead of embedded (optional).
+     */
+    linkcss?: boolean;
+    /**
+     * The String base URL for assets loaded from the CDN.
+     */
+    cdn_base_url?: string;
+    /**
+     * The String '/' if the converter calling this method emits self-closing tags.
+     */
+    self_closing_tag_slash?: string;
+  }
+
+  interface SyntaxHighlighterFormatOptions {
+    [key: string]: any;
+
+    /**
+     * A Boolean that indicates whether wrapping should be disabled (optional).
+     */
+    nowrap?: boolean;
+  }
+
+  /**
+   * Syntax highlighter functions
+   */
+  interface SyntaxHighlighterFunctions {
+    postConstruct?: (this: SyntaxHighlighter) => any;
+    initialize?: (this: SyntaxHighlighter, name: string, backend: string, opts: any) => void;
+    format?: (this: SyntaxHighlighter, parent: Document, target: string, attributes?: any) => string;
+    highlight?: (this: SyntaxHighlighter, node: Block, source: string, lang: string, opts: SyntaxHighlighterHighlightOptions) => any;
+    handlesHighlighting?: (this: SyntaxHighlighter) => boolean;
+    hasDocinfo?: (this: SyntaxHighlighter, location: string) => boolean;
+    docinfo?: (this: SyntaxHighlighter, location: string, doc: Document, opts: SyntaxHighlighterDocinfoOptions) => string;
+  }
+
+  /**
+   * @description
+   * This API is experimental and subject to change.
+   *
+   * A pluggable adapter for integrating a syntax (aka code) highlighter into AsciiDoc processing.
+   *
+   * There are two types of syntax highlighter adapters. The first performs syntax highlighting during the convert phase.
+   * This adapter type must define a "handlesHighlighting" method that returns true.
+   * The companion "highlight" method will then be called to handle the "specialcharacters" substitution for source blocks.
+   *
+   * The second assumes syntax highlighting is performed on the client (e.g., when the HTML document is loaded).
+   * This adapter type must define a "hasDocinfo" method that returns true.
+   * The companion "docinfo" method will then be called to insert markup into the output document.
+   * The docinfo functionality is available to both adapter types.
+   *
+   * Asciidoctor.js provides several a built-in adapter for highlight.js.
+   * Additional adapters can be registered using SyntaxHighlighter.register.
+   */
+  namespace SyntaxHighlighter {
+    /**
+     * Associates the syntax highlighter class or object with the specified names.
+     *
+     * @description This API is experimental and subject to change.
+     *
+     * @param names - A {string} name or an {Array} of {string} names
+     * @param functions - A list of functions representing a {SyntaxHighlighter} or a {SyntaxHighlighter} class to instantiate
+     */
+    function register(names: string | string[], functions: SyntaxHighlighterFunctions | object): void;
+
+    // SyntaxHighlighter.for can be defined because "for" is a reserved keyword :|
+
+    /**
+     * Retrieves the syntax highlighter class or object registered for the specified name.
+     *
+     * @description This API is experimental and subject to change.
+     *
+     * @param name - The {string} name of the syntax highlighter to retrieve.
+     * @returns the {SyntaxHighlighter} registered for this name.
+     */
+    function get(name: string): SyntaxHighlighter | undefined;
+  }
+
+  class SyntaxHighlighter {
+    $$name: string;
+
+    [key: string]: any;
+
+    super: (...params: any[]) => void;
+
+    /**
+     * Format the highlighted source for inclusion in an HTML document.
+     *
+     * @param node - The source Block being processed.
+     * @param lang - The source language String for this Block (e.g., ruby).
+     * @param opts - An object of options that control syntax highlighting.
+     *
+     * @returns the highlighted source String wrapped in preformatted tags (e.g., pre and code)
+     */
+    format(node: Block, lang: string, opts?: SyntaxHighlighterFormatOptions): string;
+
+    /**
+     * Highlights the specified source when this source block is being converted.
+     *
+     * If the source contains callout marks, the caller assumes the source remains on the same lines and no closing tags are added to the end of each line.
+     * If the source gets shifted by one or more lines, this method must return a tuple containing the highlighted source and the number of lines by which the source was shifted.
+     *
+     * @param node - The source Block to syntax highlight.
+     * @param source - The raw source text String of this source block (after preprocessing).
+     * @param lang - The source language String specified on this block (e.g., ruby).
+     * @param opts - An object of options that configure the syntax highlighting.
+     *
+     * @returns the highlighted source String or a tuple of the highlighted source String and an Integer line offset.
+     */
+    highlight(node: Block, source: string, lang: string, opts: SyntaxHighlighterHighlightOptions): any;
+
+    /**
+     * Indicates whether highlighting is handled by this syntax highlighter or by the client.
+     *
+     * @returns a Boolean indicating whether the highlight method should be used to handle the "specialchars" substitution.
+     */
+    handlesHighlighting(): boolean;
+
+    /**
+     * Indicates whether this syntax highlighter has docinfo (i.e., markup) to insert into the output document at the specified location.
+     * Should be called by converter after main content has been converted.
+     *
+     * @param location - The String representing the location slot ("head" or "footer").
+     *
+     * @returns a Boolean indicating whether the docinfo method should be called for this location.
+     */
+    hasDocinfo(location: string): boolean;
+
+    /**
+     * Generates docinfo markup for this syntax highlighter to insert at the specified location in the output document.
+     * Should be called by converter after main content has been converted.
+     *
+     * @param location - The String representing the location slot ("head" or "footer").
+     * @param doc - The Document in which this syntax highlighter is being used.
+     * @param opts - A Object of options that configure the syntax highlighting
+     * @returns the String markup to insert.
+     */
+    docinfo(location: string, doc: Document, opts: SyntaxHighlighterDocinfoOptions): string;
+  }
+
+  /**
+   * @description
+   * This API is experimental and subject to change.
+   *
+   * Please note that this API is currently only available in a Node environment.
+   * We recommend to use a custom converter if you are running in the browser.
+   */
+  namespace TemplateConverter {
+    interface CreateOptions {
+      [key: string]: any;
+
+      template_engine?: string;
+      template_cache?: TemplateCache;
+    }
+
+    interface TemplateCache {
+      [key: string]: any;
+
+      /**
+       * a JSON of template objects keyed by template name keyed by path patterns
+       */
+      scans?: TemplatesIndexed;
+      /**
+       * a JSON of template objects keyed by file paths
+       */
+      templates?: TemplateIndexed;
+    }
+
+    interface TemplatesIndexed {
+      [key: string]: TemplateIndexed;
+    }
+
+    interface TemplateIndexed {
+      [key: string]: Template;
+    }
+
+    /**
+     * Create a new {@link TemplateConverter}.
+     * @param backend - the backend name
+     * @param templateDirectories - a list of template directories
+     * @param [opts] - a JSON of options
+     * @param [opts.template_engine] - the name of the template engine
+     * @param [opts.template_cache] - a template cache
+     * @param [opts.template_cache.scans] - a JSON of template objects keyed by template name keyed by path patterns
+     * @param [opts.template_cache.templates] - a JSON of template objects keyed by file paths
+     * @returns a {@link TemplateConverter}
+     */
+    function create(backend: string, templateDirectories: string[], opts?: CreateOptions): TemplateConverter;
+  }
+
+  /**
+   * A built-in {Converter} implementation that uses templates composed in template languages
+   * to convert {AbstractNode} objects from a parsed AsciiDoc document tree to the backend format.
+   */
+  class TemplateConverter extends Converter {
+    /**
+     * @returns the global cache
+     */
+    static getCache(): TemplateConverter.TemplateCache;
+
+    /**
+     * Clear the global cache.
+     */
+    static clearCache(): void;
+
+    /**
+     * Convert an {AbstractNode} to the backend format using the named template.
+     *
+     * Looks for a template that matches the value of the template name or,
+     * if the template name is not specified, the value of the {@see AbstractNode.getNodeName} function.
+     *
+     * @param node - the AbstractNode to convert
+     * @param [templateName] - the {string} name of the template to use, or the node name of the node if a template name is not specified. (optional, default: undefined)
+     * @param [opts] - an optional JSON that is passed as local variables to the template. (optional, default: undefined)
+     * @returns The {string} result from rendering the template
+     */
+    convert(node: AbstractNode, templateName?: string, opts?: any): string;
+
+    /**
+     * Checks whether there is a template registered with the specified name.
+     *
+     * @param name - the {string} template name
+     * @returns a {boolean} that indicates whether a template is registered for the specified template name.
+     */
+    handles(name: string): boolean;
+
+    /**
+     * Retrieves the templates that this converter manages.
+     *
+     * @returns a JSON of template objects keyed by template name
+     */
+    getTemplates(): TemplateConverter.TemplateIndexed;
+
+    /**
+     * Registers a template with this converter.
+     *
+     * @param name - the {string} template name
+     * @param template - the template object to register
+     * @returns the template object
+     */
+    register(name: string, template: Template): TemplateConverter.TemplateIndexed;
+  }
+
+  namespace Template {
+    interface Context {
+      node: AbstractNode;
+      opts?: Options;
+      helpers?: any;
+    }
+  }
+
+  /**
+   * Handles template rendering.
+   */
+  interface Template {
+    [key: string]: any;
+
+    /**
+     * Render the template with a given context.
+     * @param context - A context that contains the {AbstractNode}
+     * @returns The resulting {string}
+     */
+    render: (context: Template.Context) => string;
+  }
+
+  namespace TemplateEngine {
+    interface Registry {
+      [key: string]: Adapter;
+    }
+    /**
+     * Handles template compilation.
+     */
+    interface Adapter {
+      /**
+       * Compile a file to a {Template}.
+       * @param file - The file path
+       * @param nodeName - The node name
+       */
+      compile: (file: string, nodeName: string) => Template;
+    }
+  }
+
+  /**
+   * @description
+   * This API is experimental and subject to change.
+   *
+   * A global registry for integrating a template engine into the built-in template converter.
+   */
+  class TemplateEngine {
+    /**
+     * The template engine registry.
+     */
+    registry: TemplateEngine.Registry;
+
+    /**
+     * Register a template engine adapter for the given names.
+     * @param names - a {string} name or an {Array} of {string} names
+     * @param templateEngineAdapter - a template engine adapter instance
+     * @example
+     * import fs from 'fs';
+     * class DotTemplateEngineAdapter implements Asciidoctor.TemplateEngine.Adapter {
+     *   private readonly doT: any;
+     *   constructor() {
+     *     this.doT = require('dot');
+     *   }
+     *   compile file: string) {
+     *     const templateFn = this.doT.template(fs.readFileSync(file, 'utf8'));
+     *     return {
+     *       render: templateFn
+     *     };
+     *   }
+     * }
+     * processor.TemplateEngine.register('dot', new DotTemplateEngineAdapter());
+     */
+    static register(names: string | string[], templateEngineAdapter: TemplateEngine.Adapter): void;
+  }
+}
+
+/**
+ * @description
+ * The main application interface (API) for Asciidoctor.
+ * This API provides methods to parse AsciiDoc content and convert it to various output formats using built-in or third-party converters.
+ *
+ * An AsciiDoc document can be as simple as a single line of content,
+ * though it more commonly starts with a document header that declares the document title and document attribute definitions.
+ * The document header is then followed by zero or more section titles, optionally nested, to organize the paragraphs, blocks, lists, etc. of the document.
+ *
+ * By default, the processor converts the AsciiDoc document to HTML 5 using a built-in converter.
+ * However, this behavior can be changed by specifying a different backend (e.g., +docbook+).
+ * A backend is a keyword for an output format (e.g., DocBook).
+ * That keyword, in turn, is used to select a converter, which carries out the request to convert the document to that format.
+ *
+ * @example
+ * asciidoctor.convertFile('document.adoc', { 'safe': 'safe' }) // Convert an AsciiDoc file
+ *
+ * asciidoctor.convert("I'm using *Asciidoctor* version {asciidoctor-version}.", { 'safe': 'safe' }) // Convert an AsciiDoc string
+ *
+ * const doc = asciidoctor.loadFile('document.adoc', { 'safe': 'safe' }) // Parse an AsciiDoc file into a document object
+ *
+ * const doc = asciidoctor.load("= Document Title\n\nfirst paragraph\n\nsecond paragraph", { 'safe': 'safe' }) // Parse an AsciiDoc string into a document object
+ */
+export class Asciidoctor {
+  /**
+   * Get Asciidoctor core version number.
+   *
+   * @returns the version number of Asciidoctor core.
+   */
+  getCoreVersion(): string;
+
+  /**
+   * Get Asciidoctor.js runtime environment information.
+   *
+   * @returns the runtime environment including the ioModule, the platform, the engine and the framework.
+   */
+  getRuntime(): Asciidoctor.Runtime;
+
+  /**
+   * Parse the AsciiDoc source input into an {@link Asciidoctor/Document} and convert it to the specified backend format.
+   *
+   * Accepts input as a Buffer or String.
+   *
+   * @param input - AsciiDoc input as String or Buffer
+   * @param options - a JSON of options to control processing (default: {})
+   * @returns the {@link Asciidoctor/Document} object if the converted String is written to a file,
+   * otherwise the converted String
+   * @example
+   * var input = '= Hello, AsciiDoc!\n' +
+   *   'Guillaume Grossetie <ggrossetie@example.com>\n\n' +
+   *   'An introduction to http://asciidoc.org[AsciiDoc].\n\n' +
+   *   '== First Section\n\n' +
+   *   '* item 1\n' +
+   *   '* item 2\n';
+   *
+   * var html = asciidoctor.convert(input);
+   */
+  convert(input: string | Buffer, options?: Asciidoctor.ProcessorOptions): string | Asciidoctor.Document;
+
+  /**
+   * Parse the AsciiDoc source input into an {@link Asciidoctor/Document} and convert it to the specified backend format.
+   *
+   * @param filename - source filename
+   * @param options - a JSON of options to control processing (default: {})
+   * @returns the {@link Asciidoctor/Document} object if the converted String is written to a file,
+   * otherwise the converted String
+   * @example
+   * var html = asciidoctor.convertFile('./document.adoc');
+   */
+  convertFile(filename: string, options?: Asciidoctor.ProcessorOptions): string | Asciidoctor.Document;
+
+  /**
+   * Parse the AsciiDoc source input into an {@link Asciidoctor/Document}
+   *
+   * Accepts input as a Buffer or String.
+   *
+   * @param input - AsciiDoc input as String or Buffer
+   * @param options - a JSON of options to control processing (default: {})
+   * @returns the {@link Asciidoctor/Document} object
+   */
+  load(input: string | Buffer, options?: Asciidoctor.ProcessorOptions): Asciidoctor.Document;
+
+  /**
+   * Parse the contents of the AsciiDoc source file into an {@link Asciidoctor/Document}
+   *
+   * @param filename - source filename
+   * @param options - a JSON of options to control processing (default: {})
+   * @returns the {@link Asciidoctor/Document} object
+   */
+  loadFile(filename: string, options?: Asciidoctor.ProcessorOptions): Asciidoctor.Document;
+
+  /**
+   * Get Asciidoctor.js version number.
+   *
+   * @returns the version number of Asciidoctor.js.
+   */
+  getVersion(): string;
+
+  Block: typeof Asciidoctor.Block;
+
+  Section: typeof Asciidoctor.Section;
+
+  SafeMode: typeof Asciidoctor.SafeMode;
+
+  Extensions: typeof Asciidoctor.Extensions;
+
+  Html5Converter: typeof Asciidoctor.Html5Converter;
+
+  TemplateConverter: typeof Asciidoctor.TemplateConverter;
+
+  ConverterFactory: Asciidoctor.ConverterFactory;
+
+  MemoryLogger: typeof Asciidoctor.MemoryLogger;
+
+  NullLogger: typeof Asciidoctor.MemoryLogger;
+
+  Timings: typeof Asciidoctor.Timings;
+
+  LoggerManager: typeof Asciidoctor.LoggerManager;
+
+  SyntaxHighlighter: typeof Asciidoctor.SyntaxHighlighter;
+
+  TemplateEngine: typeof Asciidoctor.TemplateEngine;
+}
+
+export default function asciidoctor(): Asciidoctor;

+ 202 - 0
node_modules/@honkit/asciidoc/LICENSE

@@ -0,0 +1,202 @@
+Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2020-present azu.
+   Copyright 2014 FriendCode Inc.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 3 - 0
node_modules/@honkit/asciidoc/README.md

@@ -0,0 +1,3 @@
+# HonKit AsciiDoc Parser
+
+This node module uses AsciiDoctor to parse AsciiDoc for gitbook (SUMMARY.adoc, README.adoc).

+ 3 - 0
node_modules/@honkit/asciidoc/lib/index.d.ts

@@ -0,0 +1,3 @@
+declare const _default: import("@honkit/html").Parsers;
+export default _default;
+//# sourceMappingURL=index.d.ts.map

+ 1 - 0
node_modules/@honkit/asciidoc/lib/index.d.ts.map

@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAIA,wBAAgD"}

+ 9 - 0
node_modules/@honkit/asciidoc/lib/index.js

@@ -0,0 +1,9 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const html_1 = require("@honkit/html");
+const toHTML_1 = __importDefault(require("./toHTML"));
+const toAsciidoc_1 = __importDefault(require("./toAsciidoc"));
+exports.default = (0, html_1.createParser)(toHTML_1.default, toAsciidoc_1.default);

+ 15 - 0
node_modules/@honkit/asciidoc/lib/toAsciidoc.d.ts

@@ -0,0 +1,15 @@
+declare const _default: {
+    onTitleStart: (level: any) => string;
+    onTitleEnd: (level: any) => any;
+    onParagraphStart: () => any;
+    onParagraphEnd: () => any;
+    onLinkStart: (href: any) => string;
+    onLinkEnd: () => string;
+    onListStart: (level: any) => string;
+    onListEnd: () => string;
+    onListItemStart: (level: any) => string;
+    onListItemEnd: () => string;
+    onHR: () => string;
+};
+export default _default;
+//# sourceMappingURL=toAsciidoc.d.ts.map

+ 1 - 0
node_modules/@honkit/asciidoc/lib/toAsciidoc.d.ts.map

@@ -0,0 +1 @@
+{"version":3,"file":"toAsciidoc.d.ts","sourceRoot":"","sources":["../src/toAsciidoc.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAKA,wBAuCE"}

+ 41 - 0
node_modules/@honkit/asciidoc/lib/toAsciidoc.js

@@ -0,0 +1,41 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+// Return N time a string
+function ns(s, n) {
+    return Array(n + 1).join(s);
+}
+exports.default = {
+    onTitleStart: function (level) {
+        return `${ns("=", level)} `;
+    },
+    onTitleEnd: function (level) {
+        return this.onBL();
+    },
+    onParagraphStart: function () {
+        return this.onSection();
+    },
+    onParagraphEnd: function () {
+        return this.onSection();
+    },
+    onLinkStart: function (href) {
+        return `link:${href}[`;
+    },
+    onLinkEnd: function () {
+        return "]";
+    },
+    onListStart: function (level) {
+        return "";
+    },
+    onListEnd: function () {
+        return "";
+    },
+    onListItemStart: function (level) {
+        return `${ns(".", level + 1)} `;
+    },
+    onListItemEnd: function () {
+        return "";
+    },
+    onHR: function () {
+        return "'''";
+    }
+};

+ 7 - 0
node_modules/@honkit/asciidoc/lib/toHTML.d.ts

@@ -0,0 +1,7 @@
+import { ToHTMLFunction } from "@honkit/html";
+declare const _default: {
+    block: ToHTMLFunction;
+    inline: ToHTMLFunction;
+};
+export default _default;
+//# sourceMappingURL=toHTML.d.ts.map

+ 1 - 0
node_modules/@honkit/asciidoc/lib/toHTML.d.ts.map

@@ -0,0 +1 @@
+{"version":3,"file":"toHTML.d.ts","sourceRoot":"","sources":["../src/toHTML.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;;;;;AAkB9C,wBAGE"}

+ 23 - 0
node_modules/@honkit/asciidoc/lib/toHTML.js

@@ -0,0 +1,23 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const asciidoctor_1 = __importDefault(require("asciidoctor"));
+const asciidoctor = (0, asciidoctor_1.default)();
+// Render Asciidoc to HTML (block)
+const asciidocToHTML = (content, options) => {
+    return asciidoctor.convert(content, {
+        safe: "server",
+        attributes: { showtitle: "", icons: "font@" },
+        base_dir: options?.baseDirectory
+    });
+};
+// Render Asciidoc to HTML (inline)
+const asciidocToHTMLInline = (content, options) => {
+    return asciidoctor.convert(content, { doctype: "inline", base_dir: options?.baseDirectory });
+};
+exports.default = {
+    block: asciidocToHTML,
+    inline: asciidocToHTMLInline
+};

+ 53 - 0
node_modules/@honkit/asciidoc/package.json

@@ -0,0 +1,53 @@
+{
+  "name": "@honkit/asciidoc",
+  "version": "6.0.2",
+  "description": "Parse AsciiDoc content for gitbook",
+  "homepage": "https://github.com/honkit/honkit",
+  "bugs": {
+    "url": "https://github.com/honkit/honkit/issues"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/honkit/honkit.git"
+  },
+  "license": "Apache-2.0",
+  "contributors": [
+    {
+      "name": "FriendCode Inc.",
+      "email": "contact@gitbook.com"
+    },
+    {
+      "name": "Aaron O'Mullan",
+      "email": "aaron@gitbook.com"
+    },
+    {
+      "name": "Samy Pessé",
+      "email": "samy@gitbook.com"
+    }
+  ],
+  "main": "lib/index.js",
+  "files": [
+    "lib",
+    "!__tests__"
+  ],
+  "scripts": {
+    "build": "tsc -p .",
+    "test": "jest src",
+    "prepublish": "npm run --if-present build"
+  },
+  "dependencies": {
+    "@honkit/html": "6.0.2",
+    "asciidoctor": "^2.2.8",
+    "lodash": "^4.17.21"
+  },
+  "devDependencies": {
+    "@types/jest": "^29.5.13",
+    "jest": "^29.7.0",
+    "ts-jest": "^29.2.5"
+  },
+  "publishConfig": {
+    "access": "public"
+  },
+  "authors": "azu <azuciao@gmail.com>",
+  "gitHead": "9dcd51c588177ee3a684788c633a67b82dea82a5"
+}

+ 202 - 0
node_modules/@honkit/honkit-plugin-fontsettings/LICENSE

@@ -0,0 +1,202 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+

+ 298 - 0
node_modules/@honkit/honkit-plugin-fontsettings/README.md

@@ -0,0 +1,298 @@
+# @honkit-plugin-fontsettings
+
+`@honkit/honkit-plugin-fontsettings` is a fork of [Gitbook/plugin-fontsettings]@2.0.0.
+
+This plugin adds font settings button in the HonKit website.
+
+### Disable this plugin
+
+This is a default plugin and it can be disabled using a `book.json` configuration:
+
+```
+{
+    plugins: ["-fontsettings"]
+}
+```
+
+### Configuration
+
+This plugin can be configured in the `book.json`:
+
+Default configuration is:
+
+```js
+{
+    "pluginsConfig": {
+        "fontsettings": {
+            "theme": 'white', // 'sepia', 'night' or 'white',
+            "family": 'sans', // 'serif' or 'sans',
+            "size": 2         // 1 - 4
+        }
+    }
+}
+```
+
+### Plugin API
+
+This plugin exposes the following API to easily allow new themes to manage the plugin behavior.
+
+All API functions are called using the prefix `gitbook.fontsettings.`, for instance `gitbook.fontsettings.enlargeFontSize()`.
+
+#### Font manipulation
+
+##### `gitbook.fontsettings.enlargeFontSize()`
+
+Increases the font size of the document by one. Max value is `4`.
+
+##### `gitbook.fontsettings.reduceFontSize()`
+
+Decreases the font size of the document by one. Min value is `1`.
+
+#### Font families
+
+Each font family should be described as:
+
+```js
+var fontFamily = {
+    config: 'sans',  // name of the font family in book.json for your theme
+    text: 'Sans',    // display name of the font family in menu
+    id: 0            // the id appended to the CSS class for this font-family
+};
+```
+
+The `text` property will be used to display the font-family name in the fontsettings dropdown menu.
+
+The `config` property allows you to let the users of your theme choose a default font family in their `book.json`. You will have to handle setting the chosen font family in your theme's frontend JavaScript.
+
+For instance:
+
+```json
+// book.json
+{
+    plugins: ["my-theme"],
+    pluginsConfig: {
+        "my-theme": {
+            "font-family": "sans"
+        }
+    }
+}
+```
+
+```js
+// my-theme.js
+require('gitbook', function(gitbook) {
+    var FONT_FAMILIES = [
+        {
+            config: 'sans',
+            text: 'Sans',
+            id: 0
+        },
+        {
+            config: 'serif',
+            text: 'Serif',
+            id: 1
+        }
+    ];
+
+    gitbook.events.on('start', function(e, config) {
+        // Read configuration
+        var themeConfig = config['my-theme'],
+            defaultFont = themeConfig['font-family'];
+
+        // Initialize new font families
+        gitbook.fontsettings.setFamilies(FONT_FAMILIES);
+        // Set to configured font-family
+        gitbook.fontsettings.setFamily(defaultFont);
+    });
+});
+```
+
+The `id` property lets you define a specific id to use for your CSS rules as explained below.
+
+##### CSS rules
+
+The CSS class `font-family-<id>` will be applied to the theme book's root element `<div class="book">` when a font family is selected in the menu.
+
+The CSS rules for the font-family can then easily be defined using the parent selector `.book.font-family-<id>`:
+
+```CSS
+.book.font-family-<id> {
+  font-family: 'My Awesome Font';
+}
+```
+
+##### Managing the font families
+
+##### `gitbook.fontsettings.getFamilies()`
+
+Returns the currently set font families.
+
+By default, the font families are:
+
+```js
+// Default font families
+var FAMILIES = [
+    {
+        config: 'serif',
+        text: 'Serif',
+        id: 0
+    },
+    {
+        config: 'sans',
+        text: 'Sans',
+        id: 1
+    }
+];
+```
+
+##### `gitbook.fontsettings.setFamilies()`
+
+Set the new font families configuration, as an array of font family objects, used by the `plugin-fontsettings` in the form:
+
+```js
+var FONT_FAMILIES = [
+    {
+        config: 'sans',
+        text: 'Sans',
+        id: 0
+    },
+    {
+        config: 'serif',
+        text: 'Serif',
+        id: 1
+    }
+];
+
+gitbook.fontsettings.setFamilies(FONT_FAMILIES);
+```
+
+This will recreate the fontsettings menu to reflect the changes.
+
+##### `gitbook.fontsettings.setFamily()`
+
+Takes a font-family `config` key as an argument and updates the font-family used for this book.
+
+This will basically apply the CSS class with the corresponding family `id`: `.font-family-<id>`.
+
+#### Color themes
+
+Setting and manipulating color themes follow the exact same rules as font families.
+
+Here are the default value for the color themes in the plugin:
+
+```js
+// Default themes
+var THEMES = [
+    {
+        config: 'white',
+        text: 'White',
+        id: 0
+    },
+    {
+        config: 'sepia',
+        text: 'Sepia',
+        id: 1
+    },
+    {
+        config: 'night',
+        text: 'Night',
+        id: 2
+    }
+];
+```
+
+##### CSS rules
+
+The applied CSS classes for color themes will be in the form: `.color-theme-<id>`.
+
+**Caution**: No CSS class for color theme with `id: 0` will be applied. Basically, the first color theme corresponds to your default theme's colors.
+
+For instance, using the default color themes:
+
+```js
+gitbook.fontsettings.setTheme('night');
+```
+
+will result in the following HTML state for the root element:
+
+```HTML
+<div class="book color-theme-2">
+```
+
+While:
+
+```js
+gitbook.fontsettings.setTheme('white');
+```
+
+will reset the HTML state for the root element:
+
+```HTML
+<div class="book">
+```
+
+##### Managing the color themes
+
+##### `gitbook.fontsettings.getFamilies()`
+
+Returns the currently set color themes.
+
+By default, the font families are:
+
+```js
+// Default themes
+var THEMES = [
+    {
+        config: 'white',
+        text: 'White',
+        id: 0
+    },
+    {
+        config: 'sepia',
+        text: 'Sepia',
+        id: 1
+    },
+    {
+        config: 'night',
+        text: 'Night',
+        id: 2
+    }
+];
+```
+
+##### `gitbook.fontsettings.setThemes()`
+
+Set the new color themes configuration, as an array of font family objects, used by the `plugin-fontsettings` in the form:
+
+```js
+var COLOR_THEMES = [
+    {
+        config: 'light',
+        text: 'Light',
+        id: 0
+    },
+    {
+        config: 'dark',
+        text: 'Dark',
+        id: 1
+    }
+];
+
+gitbook.fontsettings.setThemes(COLOR_THEMES);
+```
+
+This will recreate the fontsettings menu to reflect the changes.
+
+##### `gitbook.fontsettings.setTheme()`
+
+Takes a color theme `config` key as an argument and updates the color theme used for this book.
+
+This will basically apply the CSS class with the corresponding theme `id`: `.color-theme-<id>`, or remove the applied CSS class if the selected theme `id` is `0`.
+
+## License
+
+Apache-2.0 (same as [Gitbook/plugin-fontsettings])
+
+[Gitbook/plugin-fontsettings]: https://github.com/GitbookIO/plugin-fontsettings
+[gitbook-tester]: https://github.com/todvora/gitbook-tester
+[honkit-tester]: https://github.com/vowstar/honkit-tester

+ 238 - 0
node_modules/@honkit/honkit-plugin-fontsettings/assets/fontsettings.js

@@ -0,0 +1,238 @@
+require(["gitbook", "jquery"], (gitbook, $) => {
+    // Configuration
+    const MAX_SIZE = 4;
+    const MIN_SIZE = 0;
+    let BUTTON_ID;
+
+    // Current fontsettings state
+    let fontState;
+
+    // Default themes
+    let THEMES = [
+        {
+            config: "white",
+            text: "White",
+            id: 0
+        },
+        {
+            config: "sepia",
+            text: "Sepia",
+            id: 1
+        },
+        {
+            config: "night",
+            text: "Night",
+            id: 2
+        }
+    ];
+
+    // Default font families
+    let FAMILIES = [
+        {
+            config: "serif",
+            text: "Serif",
+            id: 0
+        },
+        {
+            config: "sans",
+            text: "Sans",
+            id: 1
+        }
+    ];
+
+    // Return configured themes
+    function getThemes() {
+        return THEMES;
+    }
+
+    // Modify configured themes
+    function setThemes(themes) {
+        THEMES = themes;
+        updateButtons();
+    }
+
+    // Return configured font families
+    function getFamilies() {
+        return FAMILIES;
+    }
+
+    // Modify configured font families
+    function setFamilies(families) {
+        FAMILIES = families;
+        updateButtons();
+    }
+
+    // Save current font settings
+    function saveFontSettings() {
+        gitbook.storage.set("fontState", fontState);
+        update();
+    }
+
+    // Increase font size
+    function enlargeFontSize(e) {
+        e.preventDefault();
+        if (fontState.size >= MAX_SIZE) return;
+
+        fontState.size++;
+        saveFontSettings();
+    }
+
+    // Decrease font size
+    function reduceFontSize(e) {
+        e.preventDefault();
+        if (fontState.size <= MIN_SIZE) return;
+
+        fontState.size--;
+        saveFontSettings();
+    }
+
+    // Change font family
+    function changeFontFamily(configName, e) {
+        if (e && e instanceof Event) {
+            e.preventDefault();
+        }
+
+        const familyId = getFontFamilyId(configName);
+        fontState.family = familyId;
+        saveFontSettings();
+    }
+
+    // Change type of color theme
+    function changeColorTheme(configName, e) {
+        if (e && e instanceof Event) {
+            e.preventDefault();
+        }
+
+        const $book = gitbook.state.$book;
+
+        // Remove currently applied color theme
+        if (fontState.theme !== 0) $book.removeClass(`color-theme-${fontState.theme}`);
+
+        // Set new color theme
+        const themeId = getThemeId(configName);
+        fontState.theme = themeId;
+        if (fontState.theme !== 0) $book.addClass(`color-theme-${fontState.theme}`);
+
+        saveFontSettings();
+    }
+
+    // Return the correct id for a font-family config key
+    // Default to first font-family
+    function getFontFamilyId(configName) {
+        // Search for plugin configured font family
+        const configFamily = $.grep(FAMILIES, (family) => {
+            return family.config == configName;
+        })[0];
+
+        // Fallback to default font family
+        return (configFamily && configFamily.id) || 0;
+    }
+
+    // Return the correct id for a theme config key
+    // Default to first theme
+    function getThemeId(configName) {
+        // Search for plugin configured theme
+        const configTheme = $.grep(THEMES, (theme) => {
+            return theme.config == configName;
+        })[0];
+
+        // Fallback to default theme
+        return (configTheme && configTheme.id) || 0;
+    }
+
+    function update() {
+        const $book = gitbook.state.$book;
+
+        $(".font-settings .font-family-list li").removeClass("active");
+        $(`.font-settings .font-family-list li:nth-child(${fontState.family + 1})`).addClass("active");
+
+        $book[0].className = $book[0].className.replace(/\bfont-\S+/g, "");
+        $book.addClass(`font-size-${fontState.size}`);
+        $book.addClass(`font-family-${fontState.family}`);
+
+        if (fontState.theme !== 0) {
+            $book[0].className = $book[0].className.replace(/\bcolor-theme-\S+/g, "");
+            $book.addClass(`color-theme-${fontState.theme}`);
+        }
+    }
+
+    function init(config) {
+        // Search for plugin configured font family
+        const configFamily = getFontFamilyId(config.family);
+        const configTheme = getThemeId(config.theme);
+
+        // Instantiate font state object
+        fontState = gitbook.storage.get("fontState", {
+            size: config.size || 2,
+            family: configFamily,
+            theme: configTheme
+        });
+
+        update();
+    }
+
+    function updateButtons() {
+        // Remove existing fontsettings buttons
+        if (BUTTON_ID) {
+            gitbook.toolbar.removeButton(BUTTON_ID);
+        }
+
+        // Create buttons in toolbar
+        BUTTON_ID = gitbook.toolbar.createButton({
+            icon: "fa fa-font",
+            label: "Font Settings",
+            className: "font-settings",
+            dropdown: [
+                [
+                    {
+                        text: "A",
+                        className: "font-reduce",
+                        onClick: reduceFontSize
+                    },
+                    {
+                        text: "A",
+                        className: "font-enlarge",
+                        onClick: enlargeFontSize
+                    }
+                ],
+                $.map(FAMILIES, (family) => {
+                    family.onClick = function (e) {
+                        return changeFontFamily(family.config, e);
+                    };
+
+                    return family;
+                }),
+                $.map(THEMES, (theme) => {
+                    theme.onClick = function (e) {
+                        return changeColorTheme(theme.config, e);
+                    };
+
+                    return theme;
+                })
+            ]
+        });
+    }
+
+    // Init configuration at start
+    gitbook.events.bind("start", (e, config) => {
+        const opts = config.fontsettings;
+
+        // Generate buttons at start
+        updateButtons();
+
+        // Init current settings
+        init(opts);
+    });
+
+    // Expose API
+    gitbook.fontsettings = {
+        enlargeFontSize: enlargeFontSize,
+        reduceFontSize: reduceFontSize,
+        setTheme: changeColorTheme,
+        setFamily: changeFontFamily,
+        getThemes: getThemes,
+        setThemes: setThemes,
+        getFamilies: getFamilies,
+        setFamilies: setFamilies
+    };
+});

+ 309 - 0
node_modules/@honkit/honkit-plugin-fontsettings/assets/website.css

@@ -0,0 +1,309 @@
+/*
+ * Theme 1
+ */
+.color-theme-1 .dropdown-menu {
+  background-color: #111;
+  border-color: hsl(194, 5%, 52%);
+}
+.color-theme-1 .dropdown-menu .dropdown-caret .caret-inner {
+  border-bottom: 9px solid #111;
+}
+.color-theme-1 .dropdown-menu .buttons {
+  border-color: hsl(194, 5%, 52%);
+}
+.color-theme-1 .dropdown-menu .button {
+  color: #AFA790;
+}
+.color-theme-1 .dropdown-menu .button:hover {
+  color: #73553C;
+}
+/*
+ * Theme 2
+ */
+.color-theme-2 .dropdown-menu {
+  background-color: hsl(229, 20%, 22%);
+  border-color: hsl(230, 19%, 19%);
+}
+.color-theme-2 .dropdown-menu .dropdown-caret .caret-inner {
+  border-bottom: 9px solid hsl(229, 20%, 22%);
+}
+.color-theme-2 .dropdown-menu .buttons {
+  border-color: hsl(230, 19%, 19%);
+}
+.color-theme-2 .dropdown-menu .button {
+  color: hsl(228, 13%, 44%);
+}
+.color-theme-2 .dropdown-menu .button:hover {
+  color: hsl(240, 5%, 96%);
+}
+.book .book-header .font-settings .font-enlarge {
+  line-height: 30px;
+  font-size: 1.4em;
+}
+.book .book-header .font-settings .font-reduce {
+  line-height: 30px;
+  font-size: 1em;
+}
+.book.color-theme-1 .book-body {
+  color: #704214;
+  background: #F3EACB;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section {
+  background: #F3EACB;
+}
+.book.color-theme-1 #book-search-input {
+  background: transparent;
+}
+.book.color-theme-1 #book-search-results .search-results .has-results .search-results-item {
+  color: #b16820;
+}
+.book.color-theme-2 .book-body {
+  color: hsl(214, 29%, 80%);
+  background: hsl(228, 21%, 14%);
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section {
+  background: hsl(228, 21%, 14%);
+}
+.book.color-theme-2 #book-search-input {
+  background: transparent;
+}
+.book.color-theme-2 #book-search-results .search-results .has-results .search-results-item {
+  color: hsl(214, 29%, 65%);
+}
+.book.font-size-0 .book-body .page-inner section {
+  font-size: 1.2rem;
+}
+.book.font-size-1 .book-body .page-inner section {
+  font-size: 1.4rem;
+}
+.book.font-size-2 .book-body .page-inner section {
+  font-size: 1.6rem;
+}
+.book.font-size-3 .book-body .page-inner section {
+  font-size: 2.2rem;
+}
+.book.font-size-4 .book-body .page-inner section {
+  font-size: 4rem;
+}
+.book.font-family-0 {
+  font-family: Georgia, serif;
+}
+.book.font-family-1 {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal {
+  color: #704214;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal a {
+  color: inherit;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h3,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h4,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h5,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 {
+  color: inherit;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2 {
+  border-color: inherit;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 {
+  color: inherit;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal hr {
+  background-color: inherit;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal blockquote {
+  border-color: inherit;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code {
+  background: #fdf6e3;
+  color: #657b83;
+  border-color: #f8df9c;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal .highlight {
+  background-color: inherit;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table th,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table td {
+  border-color: #f5d06c;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr {
+  color: inherit;
+  background-color: #fdf6e3;
+  border-color: #444;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) {
+  background-color: #fbeecb;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal {
+  color: hsl(214, 29%, 80%);
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal a {
+  color: hsl(193, 61%, 53%);
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h3,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h4,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h5,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 {
+  color: hsl(60, 100%, 99%);
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2 {
+  border-color: hsl(230, 17%, 26%);
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 {
+  color: hsl(230, 17%, 26%);
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal hr {
+  background-color: hsl(230, 17%, 26%);
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal blockquote {
+  border-color: hsl(230, 17%, 26%);
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code {
+  color: hsl(206, 43%, 73%);
+  background: hsl(229, 20%, 22%);
+  border-color: hsl(229, 20%, 22%);
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal .highlight {
+  background-color: hsl(233, 18%, 19%);
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table th,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table td {
+  border-color: hsl(230, 17%, 28%);
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr {
+  color: hsl(216, 24%, 77%);
+  background-color: hsl(229, 19%, 22%);
+  border-color: hsl(230, 17%, 28%);
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) {
+  background-color: hsl(229, 17%, 25%);
+}
+.book.color-theme-1 .book-header {
+  color: #AFA790;
+  background: transparent;
+}
+.book.color-theme-1 .book-header .btn {
+  color: #AFA790;
+}
+.book.color-theme-1 .book-header .btn:hover {
+  color: #73553C;
+  background: none;
+}
+.book.color-theme-1 .book-header h1 {
+  color: #704214;
+}
+.book.color-theme-2 .book-header {
+  color: #7e888b;
+  background: transparent;
+}
+.book.color-theme-2 .book-header .btn {
+  color: hsl(230, 17%, 28%);
+}
+.book.color-theme-2 .book-header .btn:hover {
+  color: hsl(60, 100%, 98%);
+  background: none;
+}
+.book.color-theme-2 .book-header h1 {
+  color: hsl(214, 29%, 80%);
+}
+.book.color-theme-1 .book-body .navigation {
+  color: #AFA790;
+}
+.book.color-theme-1 .book-body .navigation:hover {
+  color: #73553C;
+}
+.book.color-theme-2 .book-body .navigation {
+  color: hsl(224, 19%, 27%);
+}
+.book.color-theme-2 .book-body .navigation:hover {
+  color: hsl(60, 100%, 98%);
+}
+/*
+ * Theme 1
+ */
+.book.color-theme-1 .book-summary {
+  color: #AFA790;
+  background: #111;
+  border-right: 1px solid rgba(0, 0, 0, 0.07);
+}
+.book.color-theme-1 .book-summary .book-search,
+.book.color-theme-1 .book-summary #book-search-input {
+  background: transparent;
+}
+.book.color-theme-1 .book-summary .book-search input,
+.book.color-theme-1 .book-summary #book-search-input input,
+.book.color-theme-1 .book-summary .book-search input:focus,
+.book.color-theme-1 .book-summary #book-search-input input:focus {
+  border: 1px solid transparent;
+}
+.book.color-theme-1 .book-summary ul.summary li.divider {
+  background: hsl(194, 5%, 52%);
+  box-shadow: none;
+}
+.book.color-theme-1 .book-summary ul.summary li i.fa-check {
+  color: hsl(120, 60%, 50%);
+}
+.book.color-theme-1 .book-summary ul.summary li.done > a {
+  color: #877F6A;
+}
+.book.color-theme-1 .book-summary ul.summary li a,
+.book.color-theme-1 .book-summary ul.summary li span {
+  color: #877F6A;
+  background: transparent;
+  font-weight: normal;
+}
+.book.color-theme-1 .book-summary ul.summary li.active > a,
+.book.color-theme-1 .book-summary ul.summary li a:hover {
+  color: #704214;
+  background: transparent;
+  font-weight: normal;
+}
+/*
+ * Theme 2
+ */
+.book.color-theme-2 .book-summary {
+  color: hsl(226, 20%, 78%);
+  background: hsl(229, 20%, 22%);
+  border-right: none;
+}
+.book.color-theme-2 .book-summary .book-search,
+.book.color-theme-2 .book-summary #book-search-input {
+  background: transparent;
+}
+.book.color-theme-2 .book-summary .book-search input,
+.book.color-theme-2 .book-summary #book-search-input input,
+.book.color-theme-2 .book-summary .book-search input:focus,
+.book.color-theme-2 .book-summary #book-search-input input:focus {
+  border: 1px solid transparent;
+}
+.book.color-theme-2 .book-summary ul.summary li.divider {
+  background: hsl(230, 19%, 19%);
+  box-shadow: none;
+}
+.book.color-theme-2 .book-summary ul.summary li i.fa-check {
+  color: hsl(120, 60%, 50%);
+}
+.book.color-theme-2 .book-summary ul.summary li.done > a {
+  color: hsl(227, 13%, 44%);
+}
+.book.color-theme-2 .book-summary ul.summary li a,
+.book.color-theme-2 .book-summary ul.summary li span {
+  color: hsl(226, 22%, 80%);
+  background: transparent;
+  font-weight: 600;
+}
+.book.color-theme-2 .book-summary ul.summary li.active > a,
+.book.color-theme-2 .book-summary ul.summary li a:hover {
+  color: hsl(240, 5%, 96%);
+  background: hsl(233, 19%, 18%);
+  font-weight: 600;
+}

+ 4 - 0
node_modules/@honkit/honkit-plugin-fontsettings/eslint.config.mjs

@@ -0,0 +1,4 @@
+// eslint.config.mjs
+import { eslintConfig } from "@honkit/cleaning-tools";
+
+export default [...eslintConfig];

+ 7 - 0
node_modules/@honkit/honkit-plugin-fontsettings/index.js

@@ -0,0 +1,7 @@
+module.exports = {
+    book: {
+        assets: "./assets",
+        js: ["fontsettings.js"],
+        css: ["website.css"]
+    }
+};

+ 63 - 0
node_modules/@honkit/honkit-plugin-fontsettings/package.json

@@ -0,0 +1,63 @@
+{
+  "name": "@honkit/honkit-plugin-fontsettings",
+  "description": "Fonts and colors themes settings the website for a better reading experience",
+  "main": "index.js",
+  "version": "6.0.2",
+  "license": "Apache-2.0",
+  "homepage": "https://github.com/honkit/honkit",
+  "engines": {
+    "gitbook": ">=2.4.0"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/honkit/honkit.git"
+  },
+  "bugs": {
+    "url": "https://github.com/honkit/honkit/issues"
+  },
+  "publishConfig": {
+    "access": "public"
+  },
+  "devDependencies": {
+    "@honkit/cleaning-tools": "6.0.2",
+    "eslint": "^9.12.0",
+    "less": "^4.2.0"
+  },
+  "scripts": {
+    "build": "npm run build:css --scripts-prepend-node-path",
+    "build:css": "lessc ./less/website.less ./assets/website.css",
+    "prepublish": "npm run build",
+    "lint": "eslint ."
+  },
+  "gitbook": {
+    "properties": {
+      "theme": {
+        "type": "string",
+        "default": "white",
+        "title": "Default theme",
+        "enum": [
+          "white",
+          "sepia",
+          "night"
+        ]
+      },
+      "family": {
+        "type": "string",
+        "default": "sans",
+        "title": "Default font family",
+        "enum": [
+          "sans",
+          "serif"
+        ]
+      },
+      "size": {
+        "type": "number",
+        "default": 2,
+        "title": "Default font size",
+        "min": 1,
+        "max": 4
+      }
+    }
+  },
+  "gitHead": "9dcd51c588177ee3a684788c633a67b82dea82a5"
+}

+ 202 - 0
node_modules/@honkit/honkit-plugin-highlight/LICENSE

@@ -0,0 +1,202 @@
+Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2020-present azu.
+   Copyright 2014 FriendCode Inc.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 30 - 0
node_modules/@honkit/honkit-plugin-highlight/README.md

@@ -0,0 +1,30 @@
+# @honkit/honkit-plugin-highlight
+
+`@honkit/honkit-plugin-highlight` is a fork of [Gitbook/plugin-highlight]@2.0.3.
+
+## Code highlighting in HonKit
+
+This plugin is the default HonKit plugin used to highlight code blocks.
+
+You can remove it using:
+
+```
+{
+    plugins: ["-highlight"]
+}
+```
+
+## TODO
+
+Currently, tests have been disabled due to issues regarding [gitbook-tester] which is used in the tests.
+
+Replacing [gitbook-tester] with [honkit-tester] can solve the issues, but introduces other issues which block to enable the tests.
+That requires additional effort.
+
+## License
+
+Apache-2.0 (same as [Gitbook/plugin-highlight])
+
+[Gitbook/plugin-highlight]: https://github.com/GitbookIO/plugin-highlight
+[gitbook-tester]: https://github.com/todvora/gitbook-tester
+[honkit-tester]: https://github.com/vowstar/honkit-tester

+ 215 - 0
node_modules/@honkit/honkit-plugin-highlight/css/ebook.css

@@ -0,0 +1,215 @@
+pre,
+code {
+  /* From highlight.js@11.10.0/styles/tomorrow.css */
+  /*!
+  Theme: Tomorrow
+  Author: Chris Kempson (http://chriskempson.com)
+  License: ~ MIT (or more permissive) [via base16-schemes-source]
+  Maintainer: @highlightjs/core-team
+  Version: 2021.09.0
+*/
+  /*
+  WARNING: DO NOT EDIT THIS FILE DIRECTLY.
+
+  This theme file was auto-generated from the Base16 scheme tomorrow
+  by the Highlight.js Base16 template builder.
+
+  - https://github.com/highlightjs/base16-highlightjs
+*/
+  /*
+base00  #ffffff  Default Background
+base01  #e0e0e0  Lighter Background (Used for status bars, line number and folding marks)
+base02  #d6d6d6  Selection Background
+base03  #8e908c  Comments, Invisibles, Line Highlighting
+base04  #969896  Dark Foreground (Used for status bars)
+base05  #4d4d4c  Default Foreground, Caret, Delimiters, Operators
+base06  #282a2e  Light Foreground (Not often used)
+base07  #1d1f21  Light Background (Not often used)
+base08  #c82829  Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted
+base09  #f5871f  Integers, Boolean, Constants, XML Attributes, Markup Link Url
+base0A  #eab700  Classes, Markup Bold, Search Text Background
+base0B  #718c00  Strings, Inherited Class, Markup Code, Diff Inserted
+base0C  #3e999f  Support, Regular Expressions, Escape Characters, Markup Quotes
+base0D  #4271ae  Functions, Methods, Attribute IDs, Headings
+base0E  #8959a8  Keywords, Storage, Selector, Markup Italic, Diff Changed
+base0F  #a3685a  Deprecated, Opening/Closing Embedded Language Tags, e.g. <?php ?>
+*/
+  /* purposely do not highlight these things */
+  /* base03 - #8e908c -  Comments, Invisibles, Line Highlighting */
+  /* base04 - #969896 -  Dark Foreground (Used for status bars) */
+  /* base05 - #4d4d4c -  Default Foreground, Caret, Delimiters, Operators */
+  /* base08 - Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted */
+  /* base09 - Integers, Boolean, Constants, XML Attributes, Markup Link Url */
+  /* base0A - Classes, Markup Bold, Search Text Background */
+  /* base0B - Strings, Inherited Class, Markup Code, Diff Inserted */
+  /* base0C - Support, Regular Expressions, Escape Characters, Markup Quotes */
+  /* guessing */
+  /* base0D - Functions, Methods, Attribute IDs, Headings */
+  /* base0E - Keywords, Storage, Selector, Markup Italic, Diff Changed */
+  /* .hljs-selector-id, */
+  /* .hljs-selector-class, */
+  /* .hljs-selector-attr, */
+  /* .hljs-selector-pseudo, */
+  /* base0F - Deprecated, Opening/Closing Embedded Language Tags, e.g. <?php ?> */
+  /*
+  prevent top level .keyword and .string scopes
+  from leaking into meta by accident
+*/
+  /* for v10 compatible themes */
+}
+pre pre code.hljs,
+code pre code.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 1em;
+}
+pre code.hljs,
+code code.hljs {
+  padding: 3px 5px;
+}
+pre pre code.hljs,
+code pre code.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 1em;
+}
+pre code.hljs,
+code code.hljs {
+  padding: 3px 5px;
+}
+pre .hljs,
+code .hljs {
+  color: #4d4d4c;
+  background: #ffffff;
+}
+pre .hljs::selection,
+code .hljs::selection,
+pre .hljs ::selection,
+code .hljs ::selection {
+  background-color: #d6d6d6;
+  color: #4d4d4c;
+}
+pre .hljs-comment,
+code .hljs-comment {
+  color: #8e908c;
+}
+pre .hljs-tag,
+code .hljs-tag {
+  color: #969896;
+}
+pre .hljs-subst,
+code .hljs-subst,
+pre .hljs-punctuation,
+code .hljs-punctuation,
+pre .hljs-operator,
+code .hljs-operator {
+  color: #4d4d4c;
+}
+pre .hljs-operator,
+code .hljs-operator {
+  opacity: 0.7;
+}
+pre .hljs-bullet,
+code .hljs-bullet,
+pre .hljs-variable,
+code .hljs-variable,
+pre .hljs-template-variable,
+code .hljs-template-variable,
+pre .hljs-selector-tag,
+code .hljs-selector-tag,
+pre .hljs-name,
+code .hljs-name,
+pre .hljs-deletion,
+code .hljs-deletion {
+  color: #c82829;
+}
+pre .hljs-symbol,
+code .hljs-symbol,
+pre .hljs-number,
+code .hljs-number,
+pre .hljs-link,
+code .hljs-link,
+pre .hljs-attr,
+code .hljs-attr,
+pre .hljs-variable.constant_,
+code .hljs-variable.constant_,
+pre .hljs-literal,
+code .hljs-literal {
+  color: #f5871f;
+}
+pre .hljs-title,
+code .hljs-title,
+pre .hljs-class .hljs-title,
+code .hljs-class .hljs-title,
+pre .hljs-title.class_,
+code .hljs-title.class_ {
+  color: #eab700;
+}
+pre .hljs-strong,
+code .hljs-strong {
+  font-weight: bold;
+  color: #eab700;
+}
+pre .hljs-code,
+code .hljs-code,
+pre .hljs-addition,
+code .hljs-addition,
+pre .hljs-title.class_.inherited__,
+code .hljs-title.class_.inherited__,
+pre .hljs-string,
+code .hljs-string {
+  color: #718c00;
+}
+pre .hljs-built_in,
+code .hljs-built_in,
+pre .hljs-doctag,
+code .hljs-doctag,
+pre .hljs-quote,
+code .hljs-quote,
+pre .hljs-keyword.hljs-atrule,
+code .hljs-keyword.hljs-atrule,
+pre .hljs-regexp,
+code .hljs-regexp {
+  color: #3e999f;
+}
+pre .hljs-function .hljs-title,
+code .hljs-function .hljs-title,
+pre .hljs-attribute,
+code .hljs-attribute,
+pre .ruby .hljs-property,
+code .ruby .hljs-property,
+pre .hljs-title.function_,
+code .hljs-title.function_,
+pre .hljs-section,
+code .hljs-section {
+  color: #4271ae;
+}
+pre .hljs-type,
+code .hljs-type,
+pre .hljs-template-tag,
+code .hljs-template-tag,
+pre .diff .hljs-meta,
+code .diff .hljs-meta,
+pre .hljs-keyword,
+code .hljs-keyword {
+  color: #8959a8;
+}
+pre .hljs-emphasis,
+code .hljs-emphasis {
+  color: #8959a8;
+  font-style: italic;
+}
+pre .hljs-meta,
+code .hljs-meta,
+pre .hljs-meta .hljs-keyword,
+code .hljs-meta .hljs-keyword,
+pre .hljs-meta .hljs-string,
+code .hljs-meta .hljs-string {
+  color: #a3685a;
+}
+pre .hljs-meta .hljs-keyword,
+code .hljs-meta .hljs-keyword,
+pre .hljs-meta-keyword,
+code .hljs-meta-keyword {
+  font-weight: bold;
+}

+ 533 - 0
node_modules/@honkit/honkit-plugin-highlight/css/website.css

@@ -0,0 +1,533 @@
+.book .book-body .page-wrapper .page-inner section.normal pre,
+.book .book-body .page-wrapper .page-inner section.normal code {
+  /* From highlight.js@11.10.0/styles/tomorrow.css */
+  /*!
+  Theme: Tomorrow
+  Author: Chris Kempson (http://chriskempson.com)
+  License: ~ MIT (or more permissive) [via base16-schemes-source]
+  Maintainer: @highlightjs/core-team
+  Version: 2021.09.0
+*/
+  /*
+  WARNING: DO NOT EDIT THIS FILE DIRECTLY.
+
+  This theme file was auto-generated from the Base16 scheme tomorrow
+  by the Highlight.js Base16 template builder.
+
+  - https://github.com/highlightjs/base16-highlightjs
+*/
+  /*
+base00  #ffffff  Default Background
+base01  #e0e0e0  Lighter Background (Used for status bars, line number and folding marks)
+base02  #d6d6d6  Selection Background
+base03  #8e908c  Comments, Invisibles, Line Highlighting
+base04  #969896  Dark Foreground (Used for status bars)
+base05  #4d4d4c  Default Foreground, Caret, Delimiters, Operators
+base06  #282a2e  Light Foreground (Not often used)
+base07  #1d1f21  Light Background (Not often used)
+base08  #c82829  Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted
+base09  #f5871f  Integers, Boolean, Constants, XML Attributes, Markup Link Url
+base0A  #eab700  Classes, Markup Bold, Search Text Background
+base0B  #718c00  Strings, Inherited Class, Markup Code, Diff Inserted
+base0C  #3e999f  Support, Regular Expressions, Escape Characters, Markup Quotes
+base0D  #4271ae  Functions, Methods, Attribute IDs, Headings
+base0E  #8959a8  Keywords, Storage, Selector, Markup Italic, Diff Changed
+base0F  #a3685a  Deprecated, Opening/Closing Embedded Language Tags, e.g. <?php ?>
+*/
+  /* purposely do not highlight these things */
+  /* base03 - #8e908c -  Comments, Invisibles, Line Highlighting */
+  /* base04 - #969896 -  Dark Foreground (Used for status bars) */
+  /* base05 - #4d4d4c -  Default Foreground, Caret, Delimiters, Operators */
+  /* base08 - Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted */
+  /* base09 - Integers, Boolean, Constants, XML Attributes, Markup Link Url */
+  /* base0A - Classes, Markup Bold, Search Text Background */
+  /* base0B - Strings, Inherited Class, Markup Code, Diff Inserted */
+  /* base0C - Support, Regular Expressions, Escape Characters, Markup Quotes */
+  /* guessing */
+  /* base0D - Functions, Methods, Attribute IDs, Headings */
+  /* base0E - Keywords, Storage, Selector, Markup Italic, Diff Changed */
+  /* .hljs-selector-id, */
+  /* .hljs-selector-class, */
+  /* .hljs-selector-attr, */
+  /* .hljs-selector-pseudo, */
+  /* base0F - Deprecated, Opening/Closing Embedded Language Tags, e.g. <?php ?> */
+  /*
+  prevent top level .keyword and .string scopes
+  from leaking into meta by accident
+*/
+  /* for v10 compatible themes */
+}
+.book .book-body .page-wrapper .page-inner section.normal pre pre code.hljs,
+.book .book-body .page-wrapper .page-inner section.normal code pre code.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 1em;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre code.hljs,
+.book .book-body .page-wrapper .page-inner section.normal code code.hljs {
+  padding: 3px 5px;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre pre code.hljs,
+.book .book-body .page-wrapper .page-inner section.normal code pre code.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 1em;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre code.hljs,
+.book .book-body .page-wrapper .page-inner section.normal code code.hljs {
+  padding: 3px 5px;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs {
+  color: #4d4d4c;
+  background: #ffffff;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs::selection,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs::selection,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs ::selection,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs ::selection {
+  background-color: #d6d6d6;
+  color: #4d4d4c;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-comment,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-comment {
+  color: #8e908c;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-tag,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-tag {
+  color: #969896;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-subst,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-subst,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-punctuation,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-punctuation,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-operator,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-operator {
+  color: #4d4d4c;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-operator,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-operator {
+  opacity: 0.7;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-bullet,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-bullet,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-variable,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-variable,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-template-variable,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-template-variable,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-tag,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-selector-tag,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-name,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-name,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-deletion {
+  color: #c82829;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-symbol,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-number,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-number,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-link,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-link,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-attr,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-attr,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-variable.constant_,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-variable.constant_,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-literal,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-literal {
+  color: #f5871f;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-title,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-title,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-class .hljs-title,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-class .hljs-title,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-title.class_,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-title.class_ {
+  color: #eab700;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-strong,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-strong {
+  font-weight: bold;
+  color: #eab700;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-code,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-code,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-addition,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-addition,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-title.class_.inherited__,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-title.class_.inherited__,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-string,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-string {
+  color: #718c00;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-built_in,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-doctag,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-doctag,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-quote,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-quote,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword.hljs-atrule,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-keyword.hljs-atrule,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-regexp {
+  color: #3e999f;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-function .hljs-title,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-function .hljs-title,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-attribute,
+.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-property,
+.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-property,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-title.function_,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-title.function_,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-section,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-section {
+  color: #4271ae;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-type,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-type,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-template-tag,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-template-tag,
+.book .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-meta,
+.book .book-body .page-wrapper .page-inner section.normal code .diff .hljs-meta,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-keyword {
+  color: #8959a8;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-emphasis,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-emphasis {
+  color: #8959a8;
+  font-style: italic;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-meta,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-meta,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-meta .hljs-keyword,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-meta .hljs-keyword,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-meta .hljs-string,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-meta .hljs-string {
+  color: #a3685a;
+}
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-meta .hljs-keyword,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-meta .hljs-keyword,
+.book .book-body .page-wrapper .page-inner section.normal pre .hljs-meta-keyword,
+.book .book-body .page-wrapper .page-inner section.normal code .hljs-meta-keyword {
+  font-weight: bold;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code {
+  /* From highlight.js@11.10.0/styles/solarized-light.css */
+  /*!
+  Theme: Solarized Light
+  Author: Ethan Schoonover (modified by aramisgithub)
+  License: ~ MIT (or more permissive) [via base16-schemes-source]
+  Maintainer: @highlightjs/core-team
+  Version: 2021.09.0
+*/
+  /*
+  WARNING: DO NOT EDIT THIS FILE DIRECTLY.
+
+  This theme file was auto-generated from the Base16 scheme solarized-light
+  by the Highlight.js Base16 template builder.
+
+  - https://github.com/highlightjs/base16-highlightjs
+*/
+  /*
+base00  #fdf6e3  Default Background
+base01  #eee8d5  Lighter Background (Used for status bars, line number and folding marks)
+base02  #93a1a1  Selection Background
+base03  #839496  Comments, Invisibles, Line Highlighting
+base04  #657b83  Dark Foreground (Used for status bars)
+base05  #586e75  Default Foreground, Caret, Delimiters, Operators
+base06  #073642  Light Foreground (Not often used)
+base07  #002b36  Light Background (Not often used)
+base08  #dc322f  Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted
+base09  #cb4b16  Integers, Boolean, Constants, XML Attributes, Markup Link Url
+base0A  #b58900  Classes, Markup Bold, Search Text Background
+base0B  #859900  Strings, Inherited Class, Markup Code, Diff Inserted
+base0C  #2aa198  Support, Regular Expressions, Escape Characters, Markup Quotes
+base0D  #268bd2  Functions, Methods, Attribute IDs, Headings
+base0E  #6c71c4  Keywords, Storage, Selector, Markup Italic, Diff Changed
+base0F  #d33682  Deprecated, Opening/Closing Embedded Language Tags, e.g. <?php ?>
+*/
+  /* purposely do not highlight these things */
+  /* base03 - #839496 -  Comments, Invisibles, Line Highlighting */
+  /* base04 - #657b83 -  Dark Foreground (Used for status bars) */
+  /* base05 - #586e75 -  Default Foreground, Caret, Delimiters, Operators */
+  /* base08 - Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted */
+  /* base09 - Integers, Boolean, Constants, XML Attributes, Markup Link Url */
+  /* base0A - Classes, Markup Bold, Search Text Background */
+  /* base0B - Strings, Inherited Class, Markup Code, Diff Inserted */
+  /* base0C - Support, Regular Expressions, Escape Characters, Markup Quotes */
+  /* guessing */
+  /* base0D - Functions, Methods, Attribute IDs, Headings */
+  /* base0E - Keywords, Storage, Selector, Markup Italic, Diff Changed */
+  /* .hljs-selector-id, */
+  /* .hljs-selector-class, */
+  /* .hljs-selector-attr, */
+  /* .hljs-selector-pseudo, */
+  /* base0F - Deprecated, Opening/Closing Embedded Language Tags, e.g. <?php ?> */
+  /*
+  prevent top level .keyword and .string scopes
+  from leaking into meta by accident
+*/
+  /* for v10 compatible themes */
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre pre code.hljs,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code pre code.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 1em;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre code.hljs,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code code.hljs {
+  padding: 3px 5px;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre pre code.hljs,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code pre code.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 1em;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre code.hljs,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code code.hljs {
+  padding: 3px 5px;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs {
+  color: #586e75;
+  background: #fdf6e3;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs::selection,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs::selection,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs ::selection,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs ::selection {
+  background-color: #93a1a1;
+  color: #586e75;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-comment {
+  color: #839496;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-tag {
+  color: #657b83;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-subst,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-subst,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-punctuation,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-punctuation,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-operator,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-operator {
+  color: #586e75;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-operator,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-operator {
+  opacity: 0.7;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-bullet,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-bullet,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-variable,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-template-variable,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template-variable,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-tag,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-tag,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-name,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-name,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion {
+  color: #dc322f;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-number,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-number,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attr,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attr,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable.constant_,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-variable.constant_,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-literal {
+  color: #cb4b16;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-class .hljs-title,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-class .hljs-title,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title.class_,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title.class_ {
+  color: #b58900;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-strong,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-strong {
+  font-weight: bold;
+  color: #b58900;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-code,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-code,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-addition,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title.class_.inherited__,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title.class_.inherited__,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-string,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-string {
+  color: #859900;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-doctag,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-doctag,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-quote,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-quote,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword.hljs-atrule,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword.hljs-atrule,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp {
+  color: #2aa198;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-function .hljs-title,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-function .hljs-title,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-property,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-property,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title.function_,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title.function_,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-section,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-section {
+  color: #268bd2;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-type,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-type,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-template-tag,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template-tag,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-meta,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-meta,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword {
+  color: #6c71c4;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-emphasis,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-emphasis {
+  color: #6c71c4;
+  font-style: italic;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta .hljs-keyword,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta .hljs-keyword,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta .hljs-string,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta .hljs-string {
+  color: #d33682;
+}
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta .hljs-keyword,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta .hljs-keyword,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta-keyword,
+.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta-keyword {
+  font-weight: bold;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code {
+  /* From highlight.js@11.10.0/styles/tomorrow-night-bright.css */
+  /* Tomorrow Night Bright Theme */
+  /* Original theme - https://github.com/chriskempson/tomorrow-theme */
+  /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+  /* Tomorrow Comment */
+  /* Tomorrow Red */
+  /* Tomorrow Orange */
+  /* Tomorrow Yellow */
+  /* Tomorrow Green */
+  /* Tomorrow Blue */
+  /* Tomorrow Purple */
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre pre code.hljs,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code pre code.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 1em;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre code.hljs,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code code.hljs {
+  padding: 3px 5px;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-comment,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-quote,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-quote {
+  color: #969896;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-variable,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-template-variable,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-template-variable,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-tag,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-name,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-name,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-id,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-id,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-class,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-class,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion {
+  color: #d54e53;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-number,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-number,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-literal,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-type,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-type,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-params,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-params,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-meta,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-link,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-link {
+  color: #e78c45;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute {
+  color: #e7c547;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-string,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-string,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-bullet,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-bullet,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-addition {
+  color: #b9ca4a;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-title,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-title,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-section,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-section {
+  color: #7aa6da;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-tag,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-tag {
+  color: #c397d8;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs {
+  background: black;
+  color: #eaeaea;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-emphasis,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-emphasis {
+  font-style: italic;
+}
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-strong,
+.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-strong {
+  font-weight: bold;
+}

+ 63 - 0
node_modules/@honkit/honkit-plugin-highlight/index.js

@@ -0,0 +1,63 @@
+const hljs = require("highlight.js");
+
+const MAP = {
+    py: "python",
+    js: "javascript",
+    json: "javascript",
+    rb: "ruby",
+    csharp: "cs"
+};
+
+function normalize(lang) {
+    if (!lang) {
+        return null;
+    }
+
+    const lower = lang.toLowerCase();
+    return MAP[lower] || lower;
+}
+
+/**
+ * @param {string} lang
+ * @param {string} code
+ * @returns {string|{html: boolean, body}}
+ */
+function highlight(lang, code) {
+    if (!lang)
+        return {
+            body: code,
+            html: false
+        };
+
+    // Normalize lang
+    lang = normalize(lang);
+
+    try {
+        return hljs.highlight(code, {
+            language: lang
+        }).value;
+    } catch (e) {
+        console.error(e);
+    }
+
+    return {
+        body: code,
+        html: false
+    };
+}
+
+module.exports = {
+    book: {
+        assets: "./css",
+        css: ["website.css"]
+    },
+    ebook: {
+        assets: "./css",
+        css: ["ebook.css"]
+    },
+    blocks: {
+        code: function (block) {
+            return highlight(block.kwargs.language, block.body);
+        }
+    }
+};

+ 38 - 0
node_modules/@honkit/honkit-plugin-highlight/package.json

@@ -0,0 +1,38 @@
+{
+  "name": "@honkit/honkit-plugin-highlight",
+  "description": "Default code highlighter for HonKit",
+  "version": "6.0.2",
+  "homepage": "https://github.com/honkit/honkit",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/honkit/honkit.git"
+  },
+  "license": "Apache-2.0",
+  "bugs": {
+    "url": "https://github.com/honkit/honkit/issues"
+  },
+  "main": "index.js",
+  "files": [
+    "index.js",
+    "css"
+  ],
+  "dependencies": {
+    "highlight.js": "^11.10.0"
+  },
+  "devDependencies": {
+    "less": "^3.13.1"
+  },
+  "scripts": {
+    "build": "npm run build:less --scripts-prepend-node-path && npm run build:css --scripts-prepend-node-path",
+    "build:less": "node ./scripts/build-less.js",
+    "build:css": "lessc ./less/website.less ./css/website.css && lessc ./less/ebook.less ./css/ebook.css",
+    "prepublish": "npm run build"
+  },
+  "engines": {
+    "gitbook": ">=2.4.0"
+  },
+  "publishConfig": {
+    "access": "public"
+  },
+  "gitHead": "9dcd51c588177ee3a684788c633a67b82dea82a5"
+}

+ 201 - 0
node_modules/@honkit/honkit-plugin-theme-default/LICENSE

@@ -0,0 +1,201 @@
+Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2014 FriendCode Inc.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 18 - 0
node_modules/@honkit/honkit-plugin-theme-default/README.md

@@ -0,0 +1,18 @@
+# HonKit Default Theme (Legacy)
+
+This is the default theme for HonKit.
+
+It can be used as a template for theming books or can be extended.
+
+![Image](./preview.png)
+
+It is based on the GitBook theme.
+
+## License
+
+Apache License
+
+Also, This theme includes GitBook default theme codes.
+These are also Apache License.
+
+- https://github.com/GitbookIO/theme-default

Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
node_modules/@honkit/honkit-plugin-theme-default/_assets/ebook/ebook.css


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
node_modules/@honkit/honkit-plugin-theme-default/_assets/ebook/epub.css


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
node_modules/@honkit/honkit-plugin-theme-default/_assets/ebook/mobi.css


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
node_modules/@honkit/honkit-plugin-theme-default/_assets/ebook/pdf.css


BIN
node_modules/@honkit/honkit-plugin-theme-default/_assets/website/fonts/fontawesome/FontAwesome.otf


BIN
node_modules/@honkit/honkit-plugin-theme-default/_assets/website/fonts/fontawesome/fontawesome-webfont.eot


Файловите разлики са ограничени, защото са твърде много
+ 196 - 0
node_modules/@honkit/honkit-plugin-theme-default/_assets/website/fonts/fontawesome/fontawesome-webfont.svg


BIN
node_modules/@honkit/honkit-plugin-theme-default/_assets/website/fonts/fontawesome/fontawesome-webfont.ttf


BIN
node_modules/@honkit/honkit-plugin-theme-default/_assets/website/fonts/fontawesome/fontawesome-webfont.woff


BIN
node_modules/@honkit/honkit-plugin-theme-default/_assets/website/fonts/fontawesome/fontawesome-webfont.woff2


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
node_modules/@honkit/honkit-plugin-theme-default/_assets/website/gitbook.js


BIN
node_modules/@honkit/honkit-plugin-theme-default/_assets/website/images/apple-touch-icon-precomposed-152.png


BIN
node_modules/@honkit/honkit-plugin-theme-default/_assets/website/images/favicon.ico


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
node_modules/@honkit/honkit-plugin-theme-default/_assets/website/style.css


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
node_modules/@honkit/honkit-plugin-theme-default/_assets/website/theme.js


+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/ar.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "اختيار اللغة",
+    "GLOSSARY": "قاموس مصطلحات",
+    "GLOSSARY_INDEX": "مؤشر المصطلحات",
+    "GLOSSARY_OPEN": "قاموس مصطلحات",
+    "GITBOOK_LINK": "نشرت مع HonKit",
+    "SUMMARY": "جدول المحتويات",
+    "SUMMARY_INTRODUCTION": "مقدمة",
+    "SUMMARY_TOGGLE": "جدول المحتويات",
+    "SEARCH_TOGGLE": "بحث",
+    "SEARCH_PLACEHOLDER": "اكتب للبحث",
+    "FONTSETTINGS_TOGGLE": "إعدادات الخط",
+    "SHARE_TOGGLE": "حصة",
+    "SHARE_ON": "على {{platform}} حصة",
+    "FONTSETTINGS_WHITE": "أبيض",
+    "FONTSETTINGS_SEPIA": "بني داكن",
+    "FONTSETTINGS_NIGHT": "ليل",
+    "FONTSETTINGS_SANS": "بلا",
+    "FONTSETTINGS_SERIF": "الرقيق"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/bn.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "ভাষা নির্বাচন করুন",
+    "GLOSSARY": "গ্লোসারি",
+    "GLOSSARY_INDEX": "ইন্ডেক্স",
+    "GLOSSARY_OPEN": "গ্লোসারি",
+    "GITBOOK_LINK": "গিটবুকের মাধ্যমে প্রকাশিত",
+    "SUMMARY": "সূচিপত্র",
+    "SUMMARY_INTRODUCTION": "সূচনা",
+    "SUMMARY_TOGGLE": "সূচিপত্র",
+    "SEARCH_TOGGLE": "অনুসন্ধান",
+    "SEARCH_PLACEHOLDER": "অনুসন্ধান",
+    "FONTSETTINGS_TOGGLE": "ফন্ট সেটিংস",
+    "SHARE_TOGGLE": "শেয়ার",
+    "SHARE_ON": "{{platform}}-এ শেয়ার",
+    "FONTSETTINGS_WHITE": "সাদা",
+    "FONTSETTINGS_SEPIA": "সেপিয়া",
+    "FONTSETTINGS_NIGHT": "রাত",
+    "FONTSETTINGS_SANS": "স্যান্স",
+    "FONTSETTINGS_SERIF": "শেরিফ"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/ca.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Selecciona un idioma",
+    "GLOSSARY": "Glossari",
+    "GLOSSARY_INDEX": "Índex",
+    "GLOSSARY_OPEN": "Glossari",
+    "GITBOOK_LINK": "Publicat amb HonKit",
+    "SUMMARY": "Taula de contingut",
+    "SUMMARY_INTRODUCTION": "Introducció",
+    "SUMMARY_TOGGLE": "Taula de contingut",
+    "SEARCH_TOGGLE": "Cercar",
+    "SEARCH_PLACEHOLDER": "Escriu per cercar",
+    "FONTSETTINGS_TOGGLE": "Configuració de font",
+    "SHARE_TOGGLE": "Compartir",
+    "SHARE_ON": "Compartir en {{platform}}",
+    "FONTSETTINGS_WHITE": "Clar",
+    "FONTSETTINGS_SEPIA": "Sèpia",
+    "FONTSETTINGS_NIGHT": "Nit",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/cs.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Zvolte jazyk",
+    "GLOSSARY": "Slovníček",
+    "GLOSSARY_INDEX": "Rejstřík",
+    "GLOSSARY_OPEN": "Slovníček",
+    "GITBOOK_LINK": "Publikováno pomocí HonKit",
+    "SUMMARY": "Obsah",
+    "SUMMARY_INTRODUCTION": "Úvod",
+    "SUMMARY_TOGGLE": "Obsah",
+    "SEARCH_TOGGLE": "Hledání",
+    "SEARCH_PLACEHOLDER": "Vyhledat",
+    "FONTSETTINGS_TOGGLE": "Nastavení písma",
+    "SHARE_TOGGLE": "Sdílet",
+    "SHARE_ON": "Sdílet na {{platform}}",
+    "FONTSETTINGS_WHITE": "Bílá",
+    "FONTSETTINGS_SEPIA": "Sépie",
+    "FONTSETTINGS_NIGHT": "Noc",
+    "FONTSETTINGS_SANS": "Bezpatkové",
+    "FONTSETTINGS_SERIF": "Patkové"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/de.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Sprache auswählen",
+    "GLOSSARY": "Glossar",
+    "GLOSSARY_INDEX": "Index",
+    "GLOSSARY_OPEN": "Glossar",
+    "GITBOOK_LINK": "Veröffentlicht mit HonKit",
+    "SUMMARY": "Inhaltsverzeichnis",
+    "SUMMARY_INTRODUCTION": "Einleitung",
+    "SUMMARY_TOGGLE": "Inhaltsverzeichnis",
+    "SEARCH_TOGGLE": "Suche",
+    "SEARCH_PLACEHOLDER": "Suchbegriff eingeben",
+    "FONTSETTINGS_TOGGLE": "Schrifteinstellungen",
+    "SHARE_TOGGLE": "Teilen",
+    "SHARE_ON": "Auf {{platform}} teilen",
+    "FONTSETTINGS_WHITE": "Hell",
+    "FONTSETTINGS_SEPIA": "Sepia",
+    "FONTSETTINGS_NIGHT": "Nacht",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/el.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Επιλογή γλώσσας",
+    "GLOSSARY": "Γλωσσάρι",
+    "GLOSSARY_INDEX": "Ευρετήριο",
+    "GLOSSARY_OPEN": "Γλωσσάρι",
+    "GITBOOK_LINK": "Δημοσιεύτηκε με το HonKit",
+    "SUMMARY": "Πίνακας Περιεχομένων",
+    "SUMMARY_INTRODUCTION": "Εισαγωγή",
+    "SUMMARY_TOGGLE": "Πίνακας Περιεχομένων",
+    "SEARCH_TOGGLE": "Αναζήτηση",
+    "SEARCH_PLACEHOLDER": "Αναζήτηση για ...",
+    "FONTSETTINGS_TOGGLE": "Επιλογές γραμματοσειράς",
+    "SHARE_TOGGLE": "Κοινοποίηση",
+    "SHARE_ON": "Κοινοποίηση σε {{platform}}",
+    "FONTSETTINGS_WHITE": "Λευκό",
+    "FONTSETTINGS_SEPIA": "Καστανόχρους",
+    "FONTSETTINGS_NIGHT": "Βραδινό",
+    "FONTSETTINGS_SANS": "Χωρίς πατούρες",
+    "FONTSETTINGS_SERIF": "Με πατούρες"
+}

+ 22 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/en.json

@@ -0,0 +1,22 @@
+{
+    "LANGS_CHOOSE": "Choose a language",
+    "GLOSSARY": "Glossary",
+    "GLOSSARY_INDEX": "Index",
+    "GLOSSARY_OPEN": "Glossary",
+    "GITBOOK_LINK": "Published with HonKit",
+    "SUMMARY": "Table of Contents",
+    "SUMMARY_INTRODUCTION": "Introduction",
+    "SUMMARY_TOGGLE": "Table of Contents",
+    "SEARCH_TOGGLE": "Search",
+    "SEARCH_PLACEHOLDER": "Type to search",
+    "SEARCH_RESULTS_TITLE": "<span class='search-results-count'></span> results matching \"<span class='search-query'></span>\"",
+    "SEARCH_NO_RESULTS_TITLE": "No results matching \"<span class='search-query'></span>\"",
+    "FONTSETTINGS_TOGGLE": "Font Settings",
+    "SHARE_TOGGLE": "Share",
+    "SHARE_ON": "Share on {{platform}}",
+    "FONTSETTINGS_WHITE": "White",
+    "FONTSETTINGS_SEPIA": "Sepia",
+    "FONTSETTINGS_NIGHT": "Night",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/es.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Selecciona un idioma",
+    "GLOSSARY": "Glosario",
+    "GLOSSARY_INDEX": "Índice",
+    "GLOSSARY_OPEN": "Glosario",
+    "GITBOOK_LINK": "Publicado con HonKit",
+    "SUMMARY": "Tabla de contenido",
+    "SUMMARY_INTRODUCTION": "Introducción",
+    "SUMMARY_TOGGLE": "Tabla de contenido",
+    "SEARCH_TOGGLE": "Buscar",
+    "SEARCH_PLACEHOLDER": "Escribe para buscar",
+    "FONTSETTINGS_TOGGLE": "Configuración de fuente",
+    "SHARE_TOGGLE": "Compartir",
+    "SHARE_ON": "Compartir en {{platform}}",
+    "FONTSETTINGS_WHITE": "Claro",
+    "FONTSETTINGS_SEPIA": "Sépia",
+    "FONTSETTINGS_NIGHT": "Noche",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/fa.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "انتخاب زبان",
+    "GLOSSARY": "واژه‌نامه",
+    "GLOSSARY_INDEX": "فهرست واژه‌ها",
+    "GLOSSARY_OPEN": "واژه‌نامه",
+    "GITBOOK_LINK": "انتشار یافته توسط HonKit",
+    "SUMMARY": "فهرست مطالب",
+    "SUMMARY_INTRODUCTION": "مقدمه",
+    "SUMMARY_TOGGLE": "فهرست مطالب",
+    "SEARCH_TOGGLE": "جستجو",
+    "SEARCH_PLACEHOLDER": "چیزی برای جستجو بنویسید",
+    "FONTSETTINGS_TOGGLE": "تنظیمات فونت",
+    "SHARE_TOGGLE": "اشتراک",
+    "SHARE_ON": "در {{platform}} به اشتراک بگذارید",
+    "FONTSETTINGS_WHITE": "سفید",
+    "FONTSETTINGS_SEPIA": "سپیا",
+    "FONTSETTINGS_NIGHT": "شب",
+    "FONTSETTINGS_SANS": "سنس",
+    "FONTSETTINGS_SERIF": "سریف"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/fi.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Valitse kieli",
+    "GLOSSARY": "Sanasto",
+    "GLOSSARY_INDEX": "Hakemisto",
+    "GLOSSARY_OPEN": "Sanasto",
+    "GITBOOK_LINK": "Julkaistu HonKitilla",
+    "SUMMARY": "Sisällysluettelo",
+    "SUMMARY_INTRODUCTION": "Johdanto",
+    "SUMMARY_TOGGLE": "Sisällysluettelu",
+    "SEARCH_TOGGLE": "Etsi",
+    "SEARCH_PLACEHOLDER": "Kirjoita hakusana",
+    "FONTSETTINGS_TOGGLE": "Fonttivalinnat",
+    "SHARE_TOGGLE": "Jaa",
+    "SHARE_ON": "Jaa {{platform}}ssa",
+    "FONTSETTINGS_WHITE": "Valkoinen",
+    "FONTSETTINGS_SEPIA": "Seepia",
+    "FONTSETTINGS_NIGHT": "Yö",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/fr.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Choisissez une langue",
+    "GLOSSARY": "Glossaire",
+    "GLOSSARY_INDEX": "Index",
+    "GLOSSARY_OPEN": "Glossaire",
+    "GITBOOK_LINK": "Publié avec HonKit",
+    "SUMMARY": "Table des matières",
+    "SUMMARY_INTRODUCTION": "Introduction",
+    "SUMMARY_TOGGLE": "Table des matières",
+    "SEARCH_TOGGLE": "Recherche",
+    "SEARCH_PLACEHOLDER": "Tapez pour rechercher",
+    "FONTSETTINGS_TOGGLE": "Paramètres de Police",
+    "SHARE_TOGGLE": "Partage",
+    "SHARE_ON": "Partager sur {{platform}}",
+    "FONTSETTINGS_WHITE": "Clair",
+    "FONTSETTINGS_SEPIA": "Sépia",
+    "FONTSETTINGS_NIGHT": "Nuit",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/he.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "בחר שפה",
+    "GLOSSARY": "מונחים",
+    "GLOSSARY_INDEX": "מפתח",
+    "GLOSSARY_OPEN": "מונחים",
+    "GITBOOK_LINK": "הוצאה לאור באמצעות גיט-בוק GITBOOK",
+    "SUMMARY": "תוכן העניינים",
+    "SUMMARY_INTRODUCTION": "הוראות",
+    "SUMMARY_TOGGLE": "תקציר",
+    "SEARCH_TOGGLE": "חיפוש",
+    "SEARCH_PLACEHOLDER": "סוג החיפוש",
+    "FONTSETTINGS_TOGGLE": "הגדרת אותיות",
+    "SHARE_TOGGLE": "שתף",
+    "SHARE_ON": "{{platform}} שתף ב",
+    "FONTSETTINGS_WHITE": "בהיר",
+    "FONTSETTINGS_SEPIA": "חום כהה",
+    "FONTSETTINGS_NIGHT": "מצב לילה",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/it.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Scegli una lingua",
+    "GLOSSARY": "Glossario",
+    "GLOSSARY_INDEX": "Indice",
+    "GLOSSARY_OPEN": "Glossario",
+    "GITBOOK_LINK": "Pubblicato con HonKit",
+    "SUMMARY": "Sommario",
+    "SUMMARY_INTRODUCTION": "Introduzione",
+    "SUMMARY_TOGGLE": "Sommario",
+    "SEARCH_TOGGLE": "Cerca",
+    "SEARCH_PLACEHOLDER": "Scrivi per cercare",
+    "FONTSETTINGS_TOGGLE": "Impostazioni dei caratteri",
+    "SHARE_TOGGLE": "Condividi",
+    "SHARE_ON": "Condividi su {{platform}}",
+    "FONTSETTINGS_WHITE": "Bianco",
+    "FONTSETTINGS_SEPIA": "Seppia",
+    "FONTSETTINGS_NIGHT": "Notte",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/ja.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "言語を選択",
+    "GLOSSARY": "用語集",
+    "GLOSSARY_INDEX": "索引",
+    "GLOSSARY_OPEN": "用語集",
+    "GITBOOK_LINK": "HonKitで公開 ",
+    "SUMMARY": "目次",
+    "SUMMARY_INTRODUCTION": "はじめに",
+    "SUMMARY_TOGGLE": "目次",
+    "SEARCH_TOGGLE": "検索",
+    "SEARCH_PLACEHOLDER": "検索ワードを入力",
+    "FONTSETTINGS_TOGGLE": "フォント設定",
+    "SHARE_TOGGLE": "シェア",
+    "SHARE_ON": "{{platform}}でシェア",
+    "FONTSETTINGS_WHITE": "白",
+    "FONTSETTINGS_SEPIA": "セピア",
+    "FONTSETTINGS_NIGHT": "夜",
+    "FONTSETTINGS_SANS": "ゴシック体",
+    "FONTSETTINGS_SERIF": "明朝体"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/ko.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "언어를 선택하세요",
+    "GLOSSARY": "어휘",
+    "GLOSSARY_INDEX": "색인",
+    "GLOSSARY_OPEN": "어휘",
+    "GITBOOK_LINK": "HonKit에 게시",
+    "SUMMARY": "차례",
+    "SUMMARY_INTRODUCTION": "소개",
+    "SUMMARY_TOGGLE": "차례",
+    "SEARCH_TOGGLE": "검색",
+    "SEARCH_PLACEHOLDER": "검색어 입력",
+    "FONTSETTINGS_TOGGLE": "글꼴 설정",
+    "SHARE_TOGGLE": "공유",
+    "SHARE_ON": "{{platform}}에 공유",
+    "FONTSETTINGS_WHITE": "화이트",
+    "FONTSETTINGS_SEPIA": "세피아",
+    "FONTSETTINGS_NIGHT": "나이트",
+    "FONTSETTINGS_SANS": "고딕",
+    "FONTSETTINGS_SERIF": "명조"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/nl.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Kies een taal",
+    "GLOSSARY": "Begrippenlijst",
+    "GLOSSARY_INDEX": "Index",
+    "GLOSSARY_OPEN": "Begrippenlijst",
+    "GITBOOK_LINK": "Gepubliceerd met HonKit",
+    "SUMMARY": "Inhoudsopgave",
+    "SUMMARY_INTRODUCTION": "Inleiding",
+    "SUMMARY_TOGGLE": "Inhoudsopgave",
+    "SEARCH_TOGGLE": "Zoeken",
+    "SEARCH_PLACEHOLDER": "Zoeken",
+    "FONTSETTINGS_TOGGLE": "Lettertype instellingen",
+    "SHARE_TOGGLE": "Delen",
+    "SHARE_ON": "Delen op {{platform}}",
+    "FONTSETTINGS_WHITE": "Wit",
+    "FONTSETTINGS_SEPIA": "Sepia",
+    "FONTSETTINGS_NIGHT": "Zwart",
+    "FONTSETTINGS_SANS": "Schreefloos",
+    "FONTSETTINGS_SERIF": "Schreef"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/no.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Velg språk",
+    "GLOSSARY": "Register",
+    "GLOSSARY_INDEX": "Indeks",
+    "GLOSSARY_OPEN": "Register",
+    "GITBOOK_LINK": "Publisert med HonKit",
+    "SUMMARY": "Innholdsfortegnelse",
+    "SUMMARY_INTRODUCTION": "Innledning",
+    "SUMMARY_TOGGLE": "Innholdsfortegnelse",
+    "SEARCH_TOGGLE": "Søk",
+    "SEARCH_PLACEHOLDER": "Skriv inn søkeord",
+    "FONTSETTINGS_TOGGLE": "Tekstinnstillinger",
+    "SHARE_TOGGLE": "Del",
+    "SHARE_ON": "Del på {{platform}}",
+    "FONTSETTINGS_WHITE": "Lys",
+    "FONTSETTINGS_SEPIA": "Sepia",
+    "FONTSETTINGS_NIGHT": "Mørk",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/pl.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Wybierz język",
+    "GLOSSARY": "Glosariusz",
+    "GLOSSARY_INDEX": "Indeks",
+    "GLOSSARY_OPEN": "Glosariusz",
+    "GITBOOK_LINK": "Opublikowano dzięki HonKit",
+    "SUMMARY": "Spis treści",
+    "SUMMARY_INTRODUCTION": "Wstęp",
+    "SUMMARY_TOGGLE": "Spis treści",
+    "SEARCH_TOGGLE": "Szukaj",
+    "SEARCH_PLACEHOLDER": "Wpisz szukaną frazę",
+    "FONTSETTINGS_TOGGLE": "Ustawienia czcionki",
+    "SHARE_TOGGLE": "Udostępnij",
+    "SHARE_ON": "Udostępnij na {{platform}}",
+    "FONTSETTINGS_WHITE": "Jasny",
+    "FONTSETTINGS_SEPIA": "Sepia",
+    "FONTSETTINGS_NIGHT": "Noc",
+    "FONTSETTINGS_SANS": "Bezszeryfowa",
+    "FONTSETTINGS_SERIF": "Szeryfowa"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/pt.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Escolher sua língua",
+    "GLOSSARY": "Glossário",
+    "GLOSSARY_INDEX": "Índice",
+    "GLOSSARY_OPEN": "Glossário",
+    "GITBOOK_LINK": "Publicado com HonKit",
+    "SUMMARY": "Tabela de conteúdos",
+    "SUMMARY_INTRODUCTION": "Introdução",
+    "SUMMARY_TOGGLE": "Tabela de conteúdos",
+    "SEARCH_TOGGLE": "Pesquise",
+    "SEARCH_PLACEHOLDER": "Escreva para pesquisar",
+    "FONTSETTINGS_TOGGLE": "Configurações de fonte",
+    "SHARE_TOGGLE": "Compartilhar",
+    "SHARE_ON": "Compartilhar no {{platform}}",
+    "FONTSETTINGS_WHITE": "Claro",
+    "FONTSETTINGS_SEPIA": "Sépia",
+    "FONTSETTINGS_NIGHT": "Noite",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/ro.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Alege o limba",
+    "GLOSSARY": "Glosar",
+    "GLOSSARY_INDEX": "Index",
+    "GLOSSARY_OPEN": "Glosar",
+    "GITBOOK_LINK": "Publicata cu HonKit",
+    "SUMMARY": "Cuprins",
+    "SUMMARY_INTRODUCTION": "Introducere",
+    "SUMMARY_TOGGLE": "Cuprins",
+    "SEARCH_TOGGLE": "Cauta",
+    "SEARCH_PLACEHOLDER": "Ce cauti",
+    "FONTSETTINGS_TOGGLE": "Setari de font",
+    "SHARE_TOGGLE": "Distribuie",
+    "SHARE_ON": "Distribuie pe {{platform}}",
+    "FONTSETTINGS_WHITE": "Alb",
+    "FONTSETTINGS_SEPIA": "Sepia",
+    "FONTSETTINGS_NIGHT": "Noapte",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/ru.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Выберите язык",
+    "GLOSSARY": "Алфавитный указатель",
+    "GLOSSARY_INDEX": "Алфавитный указатель",
+    "GLOSSARY_OPEN": "Алфавитный указатель",
+    "GITBOOK_LINK": "Опубликовано с помощью HonKit",
+    "SUMMARY": "Содержание",
+    "SUMMARY_INTRODUCTION": "Введение",
+    "SUMMARY_TOGGLE": "Содержание",
+    "SEARCH_TOGGLE": "Поиск",
+    "SEARCH_PLACEHOLDER": "Введите условия поиска",
+    "FONTSETTINGS_TOGGLE": "Шрифт",
+    "SHARE_TOGGLE": "Поделиться",
+    "SHARE_ON": "Поделиться в {{platform}}",
+    "FONTSETTINGS_WHITE": "Светлый",
+    "FONTSETTINGS_SEPIA": "Сепия",
+    "FONTSETTINGS_NIGHT": "Тёмный",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

+ 20 - 0
node_modules/@honkit/honkit-plugin-theme-default/_i18n/sv.json

@@ -0,0 +1,20 @@
+{
+    "LANGS_CHOOSE": "Välj språk",
+    "GLOSSARY": "Gloslista",
+    "GLOSSARY_INDEX": "Index",
+    "GLOSSARY_OPEN": "Gloslista",
+    "GITBOOK_LINK": "Publicera med HonKit",
+    "SUMMARY": "Innehållsförteckning",
+    "SUMMARY_INTRODUCTION": "Inledning",
+    "SUMMARY_TOGGLE": "Innehållsförteckning",
+    "SEARCH_TOGGLE": "Sök",
+    "SEARCH_PLACEHOLDER": "Skriv sökord",
+    "FONTSETTINGS_TOGGLE": "Textinställningar",
+    "SHARE_TOGGLE": "Dela",
+    "SHARE_ON": "Dela på {{platform}}",
+    "FONTSETTINGS_WHITE": "Ljus",
+    "FONTSETTINGS_SEPIA": "Sepia",
+    "FONTSETTINGS_NIGHT": "Mörk",
+    "FONTSETTINGS_SANS": "Sans",
+    "FONTSETTINGS_SERIF": "Serif"
+}

Някои файлове не бяха показани, защото твърде много файлове са промени