diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..809ba837 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,24 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/charts +**/docker-compose* +**/compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md diff --git a/.vale/thothtech/MeaningfulLinkWords.yml b/.vale/thothtech/MeaningfulLinkWords.yml index 74aa60a9..209e6885 100644 --- a/.vale/thothtech/MeaningfulLinkWords.yml +++ b/.vale/thothtech/MeaningfulLinkWords.yml @@ -7,7 +7,7 @@ extends: existence message: 'Improve SEO and accessibility by rewriting "%s" in the link text.' level: warning -scope: link +scope: raw ignorecase: true link: TBA tokens: diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..0216455f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "configurations": [ + { + "name": "Docker Node.js Launch", + "type": "docker", + "request": "launch", + "preLaunchTask": "docker-run: debug", + "platform": "node" + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..c8441424 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,39 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "docker-build", + "label": "docker-build", + "platform": "node", + "dockerBuild": { + "dockerfile": "${workspaceFolder}/Dockerfile", + "context": "${workspaceFolder}", + "pull": true + } + }, + { + "type": "docker-run", + "label": "docker-run: release", + "dependsOn": [ + "docker-build" + ], + "platform": "node" + }, + { + "type": "docker-run", + "label": "docker-run: debug", + "dependsOn": [ + "docker-build" + ], + "dockerRun": { + "env": { + "DEBUG": "*", + "NODE_ENV": "development" + } + }, + "node": { + "enableDebugging": true + } + } + ] +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..1a9bd81a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM node:lts-alpine +ENV NODE_ENV=production +WORKDIR /usr/src/app +COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"] +RUN npm install --production --silent && mv node_modules ../ +COPY . . +EXPOSE 4321 +RUN chown -R node /usr/src/app +USER node +CMD ["npm", "start"] diff --git a/astro.config.mjs b/astro.config.mjs index 4647f73d..76f6732f 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,19 +1,31 @@ import { defineConfig } from "astro/config"; import starlight from "@astrojs/starlight"; +import starlightBlog from "starlight-blog"; // https://astro.build/config export default defineConfig({ - integrations: [ + integrations: [ + starlightBlog(), starlight({ title: "Thoth Tech", customCss: ["./src/styles/custom.css"], social: { github: "https://github.com/thoth-tech", }, + components: { + MarkdownContent: "starlight-blog/overrides/MarkdownContent.astro", + Sidebar: "starlight-blog/overrides/Sidebar.astro", + ThemeSelect: "starlight-blog/overrides/ThemeSelect.astro", + }, sidebar: [ { label: "Processes", items: [ + { + label: "Thoth Tech Technology Stack Document", + link: "processes/thoth-tech-technology-stack", + }, + { label: "Introduction", link: "/processes/introduction" }, { label: "Cyber Security Guidelines", @@ -56,6 +68,12 @@ export default defineConfig({ directory: "teams-and-leadership", }, }, + { + label: "Company Wide Submissions", + autogenerate: { + directory: "companywidesubmissions", + }, + }, { label: "Reference", autogenerate: { @@ -85,19 +103,65 @@ export default defineConfig({ { label: "Projects", autogenerate: { - directory: "products/art-gallery/projects", + directory: "products/art-gallery/Projects", }, + items: [ + { + label: "Lighthouse", + autogenerate: { + directory: "products/art-gallery/Projects/Lighthouse", + }, + }, + { + label: "Testing Project", + autogenerate: { + directory: "products/art-gallery/Projects/Testing Project", + }, + }, + ], }, { label: "Documentation", autogenerate: { - directory: "products/art-gallery/documentation", + directory: "products/art-gallery/Documentation", }, + items: [ + { + label: "BackendUpgrades", + autogenerate: { + directory: "products/art-gallery/Documentation/BackendUpgrades", + }, + }, + { + label: "Deployment", + autogenerate: { + directory: "products/art-gallery/Documentation/Deployment", + }, + }, + { + label: "Dockerization", + autogenerate: { + directory: "products/art-gallery/Documentation/Dockerization", + }, + }, + { + label: "Documentation Project", + autogenerate: { + directory: "products/art-gallery/Documentation/Documentation Project", + }, + }, + { + label: "Guidance", + autogenerate: { + directory: "products/art-gallery/Documentation/Guidance", + }, + }, + ], }, { label: "Issues and Resolutions", autogenerate: { - directory: "products/art-gallery/issues-and-resolution", + directory: "products/art-gallery/Issues-and-Resolutions", }, }, ], @@ -124,7 +188,13 @@ export default defineConfig({ { label: "Thoth Tech Website", autogenerate: { - directory: "products/company-operations/projects/thoth-tech-website", + directory: "products/company-operations/projects/Thoth-Tech-Website", + }, + }, + { + label:"Onboarding Tool", + autogenerate: { + directory: "products/company-operations/projects/onboaring-tool", }, }, ], @@ -155,17 +225,19 @@ export default defineConfig({ autogenerate: { directory: "products/courseflow/projects", }, - }, - { - label: "Documentation", - autogenerate: { - directory: "products/courseflow/documentation", - }, + items: [ + { + label: "2FA - Documentation", + autogenerate: { + directory: "products/courseflow/Projects/2FA - Documentation", + }, + }, + ] }, { label: "Issues and Resolutions", autogenerate: { - directory: "products/courseflow/issues-and-resolution", + directory: "products/courseflow/issues-and-resolutions", }, }, ], @@ -180,72 +252,222 @@ export default defineConfig({ { label: "Projects", autogenerate: { - directory: "products/ontrack/projects", + directory: "products/ontrack/Projects", }, + items: [ + { + label: "Group_Task_Submission", + autogenerate: { + directory: "products/ontrack/Projects/Group_Task_Submission", + }, + }, + { + label: "Numbas", + autogenerate: { + directory: "products/ontrack/Projects/Numbas", + }, + }, + { + label: "Staff Grant Extension", + autogenerate: { + directory: "products/ontrack/Projects/Staff Grant Extension", + }, + }, + { + label: "Task Submission & Redesign", + autogenerate: { + directory: "products/ontrack/Projects/Task Submission & Redesign", + }, + }, + { + label: "Tutor Times", + autogenerate: { + directory: "products/ontrack/Projects/Tutor Times", + }, + items: [ + { + label: "Documentation", + autogenerate: { + directory: "products/ontrack/Projects/Tutor Times/Documentation", + }, + }, + { + label: "UML Diagrams", + autogenerate: { + directory: "products/ontrack/Projects/Tutor Times/UML Diagrams", + }, + }, + ] + }, + ] }, { label: "Documentation", autogenerate: { - directory: "products/ontrack/documentation", + directory: "products/ontrack/Documentation", }, items: [ { - label: "Front End Migration", + label: "Deployment", autogenerate: { - directory: "products/ontrack/documentation/front-end-migration", + directory: "products/ontrack/Documentation/Deployment", }, + items: [ + { + label: "Enhanced_Authentication", + autogenerate: { + directory: "products/ontrack/Documentation/Deployment/Enhanced_Authentication", + } + }, + { + label: "Google_Cloud", + autogenerate: { + directory: "products/ontrack/Documentation/Deployment/Google_Cloud", + } + }, + ] }, { - label: "Numbas", + label: "Documentation", + autogenerate: { + directory: "products/ontrack/Documentation/Documentation", + }, + }, + { + label: "File Submission Enhancements", + autogenerate: { + directory: "products/ontrack/Documentation/File Submission Enhancements", + }, + }, + { + label: "Front-End-Migration", + autogenerate: { + directory: "products/ontrack/Documentation/Front-End-Migration", + }, + }, + { + label: "Incorporate Content Ontrack", + autogenerate: { + directory: "products/ontrack/Documentation/Incorporate Content Ontrack", + }, + }, + { + label: "Jupyter Notebook", + autogenerate: { + directory: "products/ontrack/Documentation/Jupyter Notebook", + }, + }, + { + label: "Multiple Organisations", + autogenerate: { + directory: "products/ontrack/Documentation/Multiple Organisations", + }, + }, + { + label: "Voice Verification", autogenerate: { - directory: "products/ontrack/documentation/numbas", + directory: "products/ontrack/Documentation/Voice Verification", }, }, ], }, { - label: "Issues and Resolutions", + label: "Issues-and-resolutions", autogenerate: { - directory: "products/ontrack/issues-and-resolution", + directory: "products/ontrack/Issues-and-resolutions", + }, + }, + { + label: "Ontrack-setup", + autogenerate: { + directory: "products/ontrack/Ontrack-setup", }, }, ], }, + ], + }, + { + label: "SplashKit", + items: [ { - label: "SplashKit", + label: "Get to Know Us", + link: "/products/splashkit/example", + }, + { + label: "Projects", + autogenerate: { + directory: "products/splashkit/projects", + }, + }, + { + label: "Documentation", + autogenerate: { + directory: "products/splashkit/documentation", + }, + // items: [ + // { + // label: "Applications", + // autogenerate: { + // directory: "products/splashkit/documentation/applications", + // }, + // }, + // ], items: [ { - label: "Get to Know Us", - link: "/products/splashkit/example", + label: "Tutorials", + autogenerate: { + directory: "products/splashkit/documentation/tutorials", + }, }, { - label: "Projects", + label: "Expansions", autogenerate: { - directory: "products/splashkit/projects", + directory: "products/splashkit/documentation/expansions", }, }, { - label: "Documentation", + label: "SplashKit Online", autogenerate: { - directory: "products/splashkit/documentation", + directory: "products/splashkit/documentation/splashkit-online", }, items: [ { - label: "Applications", + label: "Code Documentation", autogenerate: { - directory: "products/splashkit/documentation/applications", + directory: "products/splashkit/documentation/splashkit-online/code-documentation", }, + items: [ + { + label: "Classes", + autogenerate: { + directory: "products/splashkit/documentation/splashkit-online/code-documentation/classes", + }, + }, + { + label: "Processes", + autogenerate: { + directory: "products/splashkit/documentation/splashkit-online/code-documentation/processes", + }, + }, + { + label: "Other", + autogenerate: { + directory: "products/splashkit/documentation/splashkit-online/code-documentation/other", + }, + }, + ] }, - ], - }, - { - label: "Issues and Resolutions", - autogenerate: { - directory: "products/splashkit/issues-and-resolution", - }, + ] }, ], }, + { + label: "Issues and Resolutions", + autogenerate: { + directory: "products/splashkit/issues-and-resolutions", + }, + }, ], }, { diff --git a/docker-compose.debug.yml b/docker-compose.debug.yml new file mode 100644 index 00000000..2f6ded0e --- /dev/null +++ b/docker-compose.debug.yml @@ -0,0 +1,14 @@ +version: '3.4' + +services: + starlightdocumentationwebsite: + image: starlightdocumentationwebsite + build: + context: . + dockerfile: ./Dockerfile + environment: + NODE_ENV: development + ports: + - 4321:4321 + - 9229:9229 + command: ["node", "--inspect=0.0.0.0:9229", "index.js"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..a6d33294 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +version: '3.4' + +services: + starlightdocumentationwebsite: + image: starlightdocumentationwebsite + build: + context: . + dockerfile: ./Dockerfile + environment: + NODE_ENV: production + ports: + - 4321:4321 diff --git a/package-lock.json b/package-lock.json index 334647ca..8e0a9e47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,15 @@ "version": "0.0.1", "dependencies": { "@astrojs/netlify": "^3.0.0", - "@astrojs/starlight": "^0.9.0", - "astro": "^3.0.7", - "prettier": "^3.2.5", - "sharp": "^0.32.3" + "@astrojs/starlight": "^0.13.0", + "astro": "^3.6.0", + "sharp": "^0.32.3", + "starlight": "^0.3.9", + "starlight-blog": "^0.4.0" }, "devDependencies": { - "markdownlint": "^0.31.0" + "markdownlint": "^0.31.1", + "prettier": "^3.2.5" } }, "node_modules/@ampproject/remapping": { @@ -31,30 +33,31 @@ } }, "node_modules/@astrojs/compiler": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.0.1.tgz", - "integrity": "sha512-DfBR7Cf+tOgQ4n7TIgTtU5x5SEA/08DNshpEPcT+91A0KbBlmUOYMBM/O6qAaHkmVo1KIoXQYhAmfdTT1zx9PQ==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.3.2.tgz", + "integrity": "sha512-jkY7bCVxl27KeZsSxIZ+pqACe+g8VQUdTiSJRj/sXYdIaZlW3ZMq4qF2M17P/oDt3LBq0zLNwQr4Cb7fSpRGxQ==" }, "node_modules/@astrojs/internal-helpers": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.2.0.tgz", - "integrity": "sha512-NQ4ppp1CM0HNkKbJNM4saVSfmUYzGlRalF6wx7F6T/MYHYSWGuojY89/oFTy4t8VlOGUCUijlsVNNeziWaUo5g==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.2.1.tgz", + "integrity": "sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==" }, "node_modules/@astrojs/markdown-remark": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-3.0.0.tgz", - "integrity": "sha512-s8I49Je4++ImgYAgwL32HgN8m6we2qz3RtBpN4AjObMODPwDylmzUHZksD8Toy31q/P59ED3MuwphqOGm9l03w==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-3.5.0.tgz", + "integrity": "sha512-q7vdIqzYhxpsfghg2YmkmSXCfp4w7lBTYP+SSHw89wVhC5Riltr3u8w2otBRxNLSByNi+ht/gGkFC23Shetytw==", "dependencies": { "@astrojs/prism": "^3.0.0", "github-slugger": "^2.0.0", "import-meta-resolve": "^3.0.0", + "mdast-util-definitions": "^6.0.0", "rehype-raw": "^6.1.1", "rehype-stringify": "^9.0.4", "remark-gfm": "^3.0.1", "remark-parse": "^10.0.2", "remark-rehype": "^10.1.0", "remark-smartypants": "^2.0.0", - "shiki": "^0.14.3", + "shikiji": "^0.6.8", "unified": "^10.1.2", "unist-util-visit": "^4.1.2", "vfile": "^5.3.7" @@ -63,13 +66,78 @@ "astro": "^3.0.0" } }, + "node_modules/@astrojs/markdown-remark/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@astrojs/markdown-remark/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/@astrojs/markdown-remark/node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@astrojs/markdown-remark/node_modules/mdast-util-definitions/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@astrojs/markdown-remark/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@astrojs/markdown-remark/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/@astrojs/mdx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-1.0.0.tgz", - "integrity": "sha512-Gmeleci8o4X7dST9E85c1+k273zcKW8cSFgZLTwU5K4dC0qHfY/EaDKHWrtzOB2wjZlT1JDRzTJ68LJYGrF2OA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-1.1.5.tgz", + "integrity": "sha512-4bveyB1Lb1vWo2kdHJjQYoCytWlrIjAxHATHUTuYnBPmdPjsfy9wuCnb9rozwyyarDABx87CzG5gotBNYd+dVA==", "dependencies": { - "@astrojs/markdown-remark": "3.0.0", - "@astrojs/prism": "3.0.0", + "@astrojs/markdown-remark": "3.5.0", "@mdx-js/mdx": "^2.3.0", "acorn": "^8.10.0", "es-module-lexer": "^1.3.0", @@ -79,10 +147,8 @@ "hast-util-to-html": "^8.0.4", "kleur": "^4.1.4", "rehype-raw": "^6.1.1", - "remark-frontmatter": "^4.0.1", "remark-gfm": "^3.0.1", "remark-smartypants": "^2.0.0", - "shiki": "^0.14.3", "source-map": "^0.7.4", "unist-util-visit": "^4.1.2", "vfile": "^5.3.7" @@ -128,19 +194,20 @@ } }, "node_modules/@astrojs/starlight": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.9.0.tgz", - "integrity": "sha512-RK1QGfcU7bCxiOaGhVwJiA2NojswFq39v675IqS1/P97S0uHHQEtPHyiOd3vS2N/fAhwE78Vru9ykeB29BQlxw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.13.0.tgz", + "integrity": "sha512-3SVWGP9Qze3UkM5Wozpx+5v9dh75ZFPSHRqzeuXNtctn5nHjlzvOgIIQnuyyNhIEQMfml1lo83jL3Vsf7Qk7Iw==", "dependencies": { - "@astrojs/mdx": "^1.0.0", + "@astrojs/mdx": "^1.1.0", "@astrojs/sitemap": "^3.0.0", - "@pagefind/default-ui": "^1.0.0-alpha.5", + "@pagefind/default-ui": "^1.0.3", "@types/mdast": "^3.0.11", + "astro-expressive-code": "^0.29.0", "bcp-47": "^2.1.0", - "execa": "^7.1.1", + "execa": "^8.0.1", "hast-util-select": "^5.0.5", "hastscript": "^7.2.0", - "pagefind": "^1.0.0-alpha.5", + "pagefind": "^1.0.3", "rehype": "^12.0.1", "remark-directive": "^2.0.1", "unified": "^10.1.2", @@ -149,13 +216,13 @@ "vfile": "^5.3.7" }, "peerDependencies": { - "astro": "^3.0.0" + "astro": "^3.2.0" } }, "node_modules/@astrojs/telemetry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.0.1.tgz", - "integrity": "sha512-7zJMuikRDQ0LLLivteu0+y4pqdgznrChFiRrY3qmKlOEkLWD1T3u1a5M970lvpErP7Vgh4P298JBPjv8LTj+sw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.0.4.tgz", + "integrity": "sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==", "dependencies": { "ci-info": "^3.8.0", "debug": "^4.3.4", @@ -163,7 +230,6 @@ "dset": "^3.1.2", "is-docker": "^3.0.0", "is-wsl": "^3.0.0", - "undici": "^5.23.0", "which-pm-runs": "^1.1.0" }, "engines": { @@ -509,6 +575,14 @@ "node": ">=6.9.0" } }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", @@ -839,6 +913,46 @@ "node": ">=12" } }, + "node_modules/@expressive-code/core": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.29.1.tgz", + "integrity": "sha512-gz7K1r/S12vYPVUvhAdFcr+zdMbMhi7fPO2iTEEUCIhFUgOoUpOVjupFL+5q46URBGvoZTfmUJge1FBQmGstfA==", + "dependencies": { + "@ctrl/tinycolor": "^3.6.0", + "hast-util-to-html": "^8.0.4", + "hastscript": "^7.2.0", + "postcss": "^8.4.21", + "postcss-nested": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.29.1.tgz", + "integrity": "sha512-nnukQNBBpCSIZITBlFkxJ+4Eh+Hkmix6Db7k5lCBb6Qd/nXeodXFKWROvhtOzH6Jp1UWcpkNtBh3HVmATQRUzA==", + "dependencies": { + "@expressive-code/core": "^0.29.1", + "hastscript": "^7.2.0" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.29.1.tgz", + "integrity": "sha512-4TOJzC8Y4fvLeM7PslH990j3x7luRCkXAWTm4L45ZrBLrU2+7SKn436/mM9k8G+Z1189+e9rSAUFwn1h/VY6QA==", + "dependencies": { + "@expressive-code/core": "^0.29.1", + "shiki": "^0.14.1" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.29.1.tgz", + "integrity": "sha512-fEsI1n1IEisJl+M2ayHy0AbsHIynnpq1yzc4qJk/0sXpouLOMSgw5dKftSmPio+9fXQoNfmYKmJz+OkuPmdy0A==", + "dependencies": { + "@expressive-code/core": "^0.29.1", + "hastscript": "^7.2.0", + "unist-util-visit-parents": "^5.1.3" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -975,9 +1089,9 @@ } }, "node_modules/@pagefind/darwin-arm64": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.0.0-alpha.10.tgz", - "integrity": "sha512-npjow0ZhicK47KqPcS4qtlWft2kV0jClyEh0iuumdzJstt4PTacapuyxUAIm5NRR0GH2XoLyaH+TZzaaOmMuJw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.0.4.tgz", + "integrity": "sha512-2OcthvceX2xhm5XbgOmW+lT45oLuHqCmvFeFtxh1gsuP5cO8vcD8ZH8Laj4pXQFCcK6eAdSShx+Ztx/LsQWZFQ==", "cpu": [ "arm64" ], @@ -987,9 +1101,9 @@ ] }, "node_modules/@pagefind/darwin-x64": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.0.0-alpha.10.tgz", - "integrity": "sha512-WYik242Lz0Qv+eTD0brqkE6kndHMDoG7kD8WvdJPKzCSA3MHXVCYm9OyG8EWAWLYxSaDCI+Dx5+NZ1crcQ3Hbw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.0.4.tgz", + "integrity": "sha512-xkdvp0D9Ld/ZKsjo/y1bgfhTEU72ITimd2PMMQtts7jf6JPIOJbsiErCvm37m/qMFuPGEq/8d+fZ4pydOj08HQ==", "cpu": [ "x64" ], @@ -999,14 +1113,14 @@ ] }, "node_modules/@pagefind/default-ui": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.0.0-alpha.10.tgz", - "integrity": "sha512-BHuRcd3ycJw2oEXxO8SARbWwLp7UP2f3Cv/PhvFh9opLvs0Cf+b/rqo8M7Rm3ldFTPxQuASvY4tt4leIX4DWDg==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.0.4.tgz", + "integrity": "sha512-edkcaPSKq67C49Vehjo+LQCpT615v4d7JRhfGzFPccePvdklaL+VXrfghN/uIfsdoG+HoLI1PcYy2iFcB9CTkw==" }, "node_modules/@pagefind/linux-arm64": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.0.0-alpha.10.tgz", - "integrity": "sha512-puc21zq/AsQAqAKKqaBsS7lWy16XYjNt2qssTIfhWXmzVQ1jl3wbUK5jm1rvjco5CQAq5cH+y0QdOwrFeuGo3w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.0.4.tgz", + "integrity": "sha512-jGBrcCzIrMnNxLKVtogaQyajVfTAXM59KlBEwg6vTn8NW4fQ6nuFbbhlG4dTIsaamjEM5e8ZBEAKZfTB/qd9xw==", "cpu": [ "arm64" ], @@ -1016,9 +1130,9 @@ ] }, "node_modules/@pagefind/linux-x64": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.0.0-alpha.10.tgz", - "integrity": "sha512-SfTd1ABl4otyEiu8rXqLY+tF78yUcfhNW7h4TsgJW8smIKgLJu0CO3YGBze+ddmHGU3dLDCJ5Z+AgHc//VUGfg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.0.4.tgz", + "integrity": "sha512-LIn/QcvcEtLEBqKe5vpSbSC2O3fvqbRCWOTIklslqSORisCsvzsWbP6j+LYxE9q0oWIfkdMoWV1vrE/oCKRxHg==", "cpu": [ "x64" ], @@ -1028,9 +1142,9 @@ ] }, "node_modules/@pagefind/windows-x64": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.0.0-alpha.10.tgz", - "integrity": "sha512-GevBJZ+O0V/2VcNNaBrdWa1NFf6hg2mREhaj3o35WBYCOMSoZmofKuKdLI/w5X0v2AiMbM7CRhOlLwqqW4gKuQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.0.4.tgz", + "integrity": "sha512-QlBCVeZfj9fc9sbUgdOz76ZDbeK4xZihOBAFqGuRJeChfM8pnVeH9iqSnXgO3+m9oITugTf7PicyRUFAG76xeQ==", "cpu": [ "x64" ], @@ -1098,9 +1212,9 @@ "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "node_modules/@types/estree-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", - "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz", + "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==", "dependencies": { "@types/estree": "*" } @@ -1113,11 +1227,6 @@ "@types/unist": "^2" } }, - "node_modules/@types/json5": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz", - "integrity": "sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==" - }, "node_modules/@types/mdast": { "version": "3.0.12", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", @@ -1127,9 +1236,9 @@ } }, "node_modules/@types/mdx": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.7.tgz", - "integrity": "sha512-BG4tyr+4amr3WsSEmHn/fXPqaCba/AYZ7dsaQTiavihQunHSIxk+uAtqsjvicNpyHN6cm+B9RVrUOtW9VzIKHw==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.10.tgz", + "integrity": "sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==" }, "node_modules/@types/ms": { "version": "0.7.31", @@ -1154,11 +1263,6 @@ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" - }, "node_modules/@types/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", @@ -1172,6 +1276,11 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", "integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==" }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, "node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -1303,14 +1412,14 @@ } }, "node_modules/astro": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/astro/-/astro-3.0.7.tgz", - "integrity": "sha512-slUnDBXfxMzq5abE4svcKbaeYC/tHZsJYOrzwDNU9lLye3/4cqYP7OuHMTXiRlx7LSpHQlUhwbMe2HqCv2GKag==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/astro/-/astro-3.6.0.tgz", + "integrity": "sha512-mRDzWXsaSBaN+juvunO4Ukq8HQ1WqrULlcZfKzaKEZEXvxiWmMKN9tH0onQH0EaQ7+f4nNR4VN9kYTM26uMrXQ==", "dependencies": { - "@astrojs/compiler": "^2.0.1", - "@astrojs/internal-helpers": "0.2.0", - "@astrojs/markdown-remark": "3.0.0", - "@astrojs/telemetry": "3.0.1", + "@astrojs/compiler": "^2.3.0", + "@astrojs/internal-helpers": "0.2.1", + "@astrojs/markdown-remark": "3.5.0", + "@astrojs/telemetry": "3.0.4", "@babel/core": "^7.22.10", "@babel/generator": "^7.22.10", "@babel/parser": "^7.22.10", @@ -1326,6 +1435,7 @@ "common-ancestor-path": "^1.0.1", "cookie": "^0.5.0", "debug": "^4.3.4", + "deterministic-object-hash": "^1.3.1", "devalue": "^4.3.2", "diff": "^5.1.0", "es-module-lexer": "^1.3.0", @@ -1340,29 +1450,30 @@ "js-yaml": "^4.1.0", "kleur": "^4.1.4", "magic-string": "^0.30.3", + "mdast-util-to-hast": "12.3.0", "mime": "^3.0.0", "ora": "^7.0.1", "p-limit": "^4.0.0", + "p-queue": "^7.4.1", "path-to-regexp": "^6.2.1", - "preferred-pm": "^3.0.3", + "preferred-pm": "^3.1.2", + "probe-image-size": "^7.2.3", "prompts": "^2.4.2", "rehype": "^12.0.1", "resolve": "^1.22.4", "semver": "^7.5.4", "server-destroy": "^1.0.1", - "sharp": "^0.32.5", - "shiki": "^0.14.3", + "shikiji": "^0.6.8", "string-width": "^6.1.0", "strip-ansi": "^7.1.0", - "tsconfig-resolver": "^3.0.1", - "undici": "^5.23.0", + "tsconfck": "^3.0.0", "unist-util-visit": "^4.1.2", "vfile": "^5.3.7", "vite": "^4.4.9", "vitefu": "^0.2.4", - "which-pm": "^2.0.0", + "which-pm": "^2.1.1", "yargs-parser": "^21.1.1", - "zod": "3.21.1" + "zod": "^3.22.4" }, "bin": { "astro": "astro.js" @@ -1370,58 +1481,28 @@ "engines": { "node": ">=18.14.1", "npm": ">=6.14.0" - } - }, - "node_modules/astro/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "optionalDependencies": { + "sharp": "^0.32.5" } }, - "node_modules/astro/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" + "node_modules/astro-expressive-code": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.29.1.tgz", + "integrity": "sha512-hvu8kDMr3KD3vqAyJj6KdTDLuebsgnFQdw6V8myJRj464BUMiqPgmufvkuxLrqDCTJvfARJdwf/Q/H3Rqu3mhQ==", + "dependencies": { + "remark-expressive-code": "^0.29.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/astro/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" + "peerDependencies": { + "astro": "^3.0.0-beta" } }, - "node_modules/astro/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, + "node_modules/astro/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/b4a": { @@ -1621,17 +1702,6 @@ "ieee754": "^1.2.1" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/camelcase": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", @@ -1752,9 +1822,9 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "funding": [ { "type": "github", @@ -1904,6 +1974,17 @@ "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1970,11 +2051,28 @@ "node": ">=8" } }, + "node_modules/deterministic-object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-1.3.1.tgz", + "integrity": "sha512-kQDIieBUreEgY+akq0N7o4FzZCr27dPG1xr3wq267vPwDlSXQ3UMcBXHqTGUBaM/5WDS1jwTYjxRhUzHeuiAvw==" + }, "node_modules/devalue": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==" }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", @@ -2001,9 +2099,9 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/dset": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", - "integrity": "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", + "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", "engines": { "node": ">=4" } @@ -2182,28 +2280,44 @@ "@types/estree": "^1.0.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, "node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -2212,6 +2326,17 @@ "node": ">=6" } }, + "node_modules/expressive-code": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.29.1.tgz", + "integrity": "sha512-KyEkbSRz2+2gbgtYviOb8xr+QhoAfRQe1VxLAmeZ99c57KAleBpfZHU7JeHj84vputFK6Ge6P87ou9ijD1DXbw==", + "dependencies": { + "@expressive-code/core": "^0.29.1", + "@expressive-code/plugin-frames": "^0.29.1", + "@expressive-code/plugin-shiki": "^0.29.1", + "@expressive-code/plugin-text-markers": "^0.29.1" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2256,18 +2381,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2303,14 +2416,6 @@ "pkg-dir": "^4.2.0" } }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -2330,9 +2435,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -2343,11 +2451,11 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2421,17 +2529,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -2440,6 +2537,17 @@ "node": ">=4" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hast-util-from-parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", @@ -2649,11 +2757,22 @@ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { - "node": ">=14.18.0" + "node": ">=0.10.0" } }, "node_modules/ieee754": { @@ -2760,11 +2879,11 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2837,6 +2956,23 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", @@ -2873,9 +3009,9 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" }, "node_modules/is-reference": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.1.tgz", - "integrity": "sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", "dependencies": { "@types/estree": "*" } @@ -2903,11 +3039,11 @@ } }, "node_modules/is-wsl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.0.0.tgz", - "integrity": "sha512-TQ7xXW/fTBaz/HhGSV779AC99ocpvb9qJPuPwyIea+F+Z+htcQ1wouAA0xEQaa4saVqyP8mwkoYp5efeM/4Gbg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dependencies": { - "is-docker": "^3.0.0" + "is-inside-container": "^1.0.0" }, "engines": { "node": ">=16" @@ -2959,6 +3095,11 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3018,14 +3159,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/load-yaml-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3040,6 +3173,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "node_modules/log-symbols": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", @@ -3230,20 +3368,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-frontmatter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz", - "integrity": "sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-extension-frontmatter": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-gfm": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", @@ -3570,21 +3694,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-frontmatter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-1.1.1.tgz", - "integrity": "sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/micromark-extension-gfm": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", @@ -4293,6 +4402,30 @@ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/nlcst-to-string": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz", @@ -4483,6 +4616,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-queue": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", + "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^5.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -4492,18 +4651,18 @@ } }, "node_modules/pagefind": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.0.0-alpha.10.tgz", - "integrity": "sha512-ewzRIDzU4HsAaca9rzOFaipMctEoA0XIFyNIDfy1mPM98HCEeTFcZ3Lp4+KcPHZLadsdjLbFLcBFBIAeWisbQw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.0.4.tgz", + "integrity": "sha512-oRIizYe+zSI2Jw4zcMU0ebDZm27751hRFiSOBLwc1OIYMrsZKk+3m8p9EVaOmc6zZdtqwwdilNUNxXvBeHcP9w==", "bin": { "pagefind": "lib/runner/bin.cjs" }, "optionalDependencies": { - "@pagefind/darwin-arm64": "1.0.0-alpha.10", - "@pagefind/darwin-x64": "1.0.0-alpha.10", - "@pagefind/linux-arm64": "1.0.0-alpha.10", - "@pagefind/linux-x64": "1.0.0-alpha.10", - "@pagefind/windows-x64": "1.0.0-alpha.10" + "@pagefind/darwin-arm64": "1.0.4", + "@pagefind/darwin-x64": "1.0.4", + "@pagefind/linux-arm64": "1.0.4", + "@pagefind/linux-x64": "1.0.4", + "@pagefind/windows-x64": "1.0.4" } }, "node_modules/parse-entities": { @@ -4690,6 +4849,36 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -4775,9 +4964,9 @@ } }, "node_modules/preferred-pm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", - "integrity": "sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.2.tgz", + "integrity": "sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==", "dependencies": { "find-up": "^5.0.0", "find-yarn-workspace-root2": "1.2.16", @@ -4788,10 +4977,23 @@ "node": ">=10" } }, + "node_modules/preferred-pm/node_modules/which-pm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", + "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "dependencies": { + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8.15" + } + }, "node_modules/prettier": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==" + "dev": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -4810,6 +5012,16 @@ "node": ">=6" } }, + "node_modules/probe-image-size": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", + "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", + "dependencies": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -4983,19 +5195,14 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-frontmatter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-4.0.1.tgz", - "integrity": "sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==", + "node_modules/remark-expressive-code": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/remark-expressive-code/-/remark-expressive-code-0.29.1.tgz", + "integrity": "sha512-iRdN3XLEFLlUNqUCeBPlLgaZROI5lAM3OK7bnwrmQ0ubXJTfV3oET6WL0c5QGijoCZzzDapNiRlRZPrNDoL+5Q==", "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-frontmatter": "^1.0.0", - "micromark-extension-frontmatter": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "expressive-code": "^0.29.1", + "hast-util-to-html": "^8.0.4", + "unist-util-visit": "^4.1.2" } }, "node_modules/remark-gfm": { @@ -5069,9 +5276,9 @@ } }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -5256,6 +5463,11 @@ } ] }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -5350,9 +5562,9 @@ } }, "node_modules/shiki": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", - "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz", + "integrity": "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==", "dependencies": { "ansi-sequence-parser": "^1.1.0", "jsonc-parser": "^3.2.0", @@ -5360,10 +5572,395 @@ "vscode-textmate": "^8.0.0" } }, - "node_modules/shiki/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + "node_modules/shikiji": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/shikiji/-/shikiji-0.6.13.tgz", + "integrity": "sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA==", + "dependencies": { + "hast-util-to-html": "^9.0.0" + } + }, + "node_modules/shikiji/node_modules/@types/hast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", + "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/shikiji/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/shikiji/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/shikiji/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/shikiji/node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/hast-util-raw": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz", + "integrity": "sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/hast-util-to-html": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz", + "integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^9.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/shikiji/node_modules/mdast-util-to-hast": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", + "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/shikiji/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/shikiji/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/shikiji/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/shikiji/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/shikiji/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/shikiji/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/shikiji/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, "node_modules/signal-exit": { "version": "3.0.7", @@ -5474,6 +6071,26 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/starlight": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/starlight/-/starlight-0.3.9.tgz", + "integrity": "sha512-pOZUSpeLrUi891CI6z6OD0vJrG9Ue0B8CSn4vIl/rKgFV9V9xPBDob1AIaE2baLxxkYtJx+djUOCiXnrekeegg==" + }, + "node_modules/starlight-blog": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/starlight-blog/-/starlight-blog-0.4.0.tgz", + "integrity": "sha512-3mVQ0hwH1XDews/EaG+rN1RA+7yqa7LTqBtTVfjiODC6IL1MRspKqe3MgEU4QFksh9/hEnk5jxC4GPAp2mUFPA==", + "dependencies": { + "github-slugger": "2.0.0" + }, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.11.0", + "astro": ">=3.2.0" + } + }, "node_modules/stdin-discarder": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", @@ -5488,14 +6105,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" + "node_modules/stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", + "dependencies": { + "debug": "2" } }, + "node_modules/stream-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stream-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/streamx": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", @@ -5557,11 +6187,11 @@ } }, "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/strip-bom-string": { @@ -5592,9 +6222,9 @@ } }, "node_modules/style-to-object": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.2.tgz", - "integrity": "sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", "dependencies": { "inline-style-parser": "0.1.1" } @@ -5678,31 +6308,23 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/tsconfig-resolver": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tsconfig-resolver/-/tsconfig-resolver-3.0.1.tgz", - "integrity": "sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==", - "dependencies": { - "@types/json5": "^0.0.30", - "@types/resolve": "^1.17.0", - "json5": "^2.1.3", - "resolve": "^1.17.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.13.1" + "node_modules/tsconfck": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.0.tgz", + "integrity": "sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A==", + "bin": { + "tsconfck": "bin/tsconfck.js" }, - "funding": { - "url": "https://github.com/sponsors/ifiokjr" - } - }, - "node_modules/tsconfig-resolver/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "engines": { - "node": ">=10" + "node": "^18 || >=20" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/tunnel-agent": { @@ -5732,7 +6354,6 @@ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true - }, "node_modules/undici": { "version": "5.23.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz", @@ -6471,9 +7092,9 @@ } }, "node_modules/which-pm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", - "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.1.1.tgz", + "integrity": "sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==", "dependencies": { "load-yaml-file": "^0.2.0", "path-exists": "^4.0.0" @@ -6631,42 +7252,96 @@ } }, "@astrojs/compiler": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.0.1.tgz", - "integrity": "sha512-DfBR7Cf+tOgQ4n7TIgTtU5x5SEA/08DNshpEPcT+91A0KbBlmUOYMBM/O6qAaHkmVo1KIoXQYhAmfdTT1zx9PQ==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.3.2.tgz", + "integrity": "sha512-jkY7bCVxl27KeZsSxIZ+pqACe+g8VQUdTiSJRj/sXYdIaZlW3ZMq4qF2M17P/oDt3LBq0zLNwQr4Cb7fSpRGxQ==" }, "@astrojs/internal-helpers": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.2.0.tgz", - "integrity": "sha512-NQ4ppp1CM0HNkKbJNM4saVSfmUYzGlRalF6wx7F6T/MYHYSWGuojY89/oFTy4t8VlOGUCUijlsVNNeziWaUo5g==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.2.1.tgz", + "integrity": "sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==" }, "@astrojs/markdown-remark": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-3.0.0.tgz", - "integrity": "sha512-s8I49Je4++ImgYAgwL32HgN8m6we2qz3RtBpN4AjObMODPwDylmzUHZksD8Toy31q/P59ED3MuwphqOGm9l03w==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-3.5.0.tgz", + "integrity": "sha512-q7vdIqzYhxpsfghg2YmkmSXCfp4w7lBTYP+SSHw89wVhC5Riltr3u8w2otBRxNLSByNi+ht/gGkFC23Shetytw==", "requires": { "@astrojs/prism": "^3.0.0", "github-slugger": "^2.0.0", "import-meta-resolve": "^3.0.0", + "mdast-util-definitions": "^6.0.0", "rehype-raw": "^6.1.1", "rehype-stringify": "^9.0.4", "remark-gfm": "^3.0.1", "remark-parse": "^10.0.2", "remark-rehype": "^10.1.0", "remark-smartypants": "^2.0.0", - "shiki": "^0.14.3", + "shikiji": "^0.6.8", "unified": "^10.1.2", "unist-util-visit": "^4.1.2", "vfile": "^5.3.7" + }, + "dependencies": { + "@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "requires": { + "@types/unist": "*" + } + }, + "@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "requires": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "dependencies": { + "unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "requires": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + } + } + } + }, + "unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "requires": { + "@types/unist": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "requires": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + } + } } }, "@astrojs/mdx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-1.0.0.tgz", - "integrity": "sha512-Gmeleci8o4X7dST9E85c1+k273zcKW8cSFgZLTwU5K4dC0qHfY/EaDKHWrtzOB2wjZlT1JDRzTJ68LJYGrF2OA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-1.1.5.tgz", + "integrity": "sha512-4bveyB1Lb1vWo2kdHJjQYoCytWlrIjAxHATHUTuYnBPmdPjsfy9wuCnb9rozwyyarDABx87CzG5gotBNYd+dVA==", "requires": { - "@astrojs/markdown-remark": "3.0.0", - "@astrojs/prism": "3.0.0", + "@astrojs/markdown-remark": "3.5.0", "@mdx-js/mdx": "^2.3.0", "acorn": "^8.10.0", "es-module-lexer": "^1.3.0", @@ -6676,10 +7351,8 @@ "hast-util-to-html": "^8.0.4", "kleur": "^4.1.4", "rehype-raw": "^6.1.1", - "remark-frontmatter": "^4.0.1", "remark-gfm": "^3.0.1", "remark-smartypants": "^2.0.0", - "shiki": "^0.14.3", "source-map": "^0.7.4", "unist-util-visit": "^4.1.2", "vfile": "^5.3.7" @@ -6713,19 +7386,20 @@ } }, "@astrojs/starlight": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.9.0.tgz", - "integrity": "sha512-RK1QGfcU7bCxiOaGhVwJiA2NojswFq39v675IqS1/P97S0uHHQEtPHyiOd3vS2N/fAhwE78Vru9ykeB29BQlxw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.13.0.tgz", + "integrity": "sha512-3SVWGP9Qze3UkM5Wozpx+5v9dh75ZFPSHRqzeuXNtctn5nHjlzvOgIIQnuyyNhIEQMfml1lo83jL3Vsf7Qk7Iw==", "requires": { - "@astrojs/mdx": "^1.0.0", + "@astrojs/mdx": "^1.1.0", "@astrojs/sitemap": "^3.0.0", - "@pagefind/default-ui": "^1.0.0-alpha.5", + "@pagefind/default-ui": "^1.0.3", "@types/mdast": "^3.0.11", + "astro-expressive-code": "^0.29.0", "bcp-47": "^2.1.0", - "execa": "^7.1.1", + "execa": "^8.0.1", "hast-util-select": "^5.0.5", "hastscript": "^7.2.0", - "pagefind": "^1.0.0-alpha.5", + "pagefind": "^1.0.3", "rehype": "^12.0.1", "remark-directive": "^2.0.1", "unified": "^10.1.2", @@ -6735,9 +7409,9 @@ } }, "@astrojs/telemetry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.0.1.tgz", - "integrity": "sha512-7zJMuikRDQ0LLLivteu0+y4pqdgznrChFiRrY3qmKlOEkLWD1T3u1a5M970lvpErP7Vgh4P298JBPjv8LTj+sw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.0.4.tgz", + "integrity": "sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==", "requires": { "ci-info": "^3.8.0", "debug": "^4.3.4", @@ -6745,7 +7419,6 @@ "dset": "^3.1.2", "is-docker": "^3.0.0", "is-wsl": "^3.0.0", - "undici": "^5.23.0", "which-pm-runs": "^1.1.0" } }, @@ -6995,6 +7668,11 @@ "to-fast-properties": "^2.0.0" } }, + "@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==" + }, "@esbuild/android-arm": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", @@ -7127,6 +7805,46 @@ "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", "optional": true }, + "@expressive-code/core": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.29.1.tgz", + "integrity": "sha512-gz7K1r/S12vYPVUvhAdFcr+zdMbMhi7fPO2iTEEUCIhFUgOoUpOVjupFL+5q46URBGvoZTfmUJge1FBQmGstfA==", + "requires": { + "@ctrl/tinycolor": "^3.6.0", + "hast-util-to-html": "^8.0.4", + "hastscript": "^7.2.0", + "postcss": "^8.4.21", + "postcss-nested": "^6.0.1" + } + }, + "@expressive-code/plugin-frames": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.29.1.tgz", + "integrity": "sha512-nnukQNBBpCSIZITBlFkxJ+4Eh+Hkmix6Db7k5lCBb6Qd/nXeodXFKWROvhtOzH6Jp1UWcpkNtBh3HVmATQRUzA==", + "requires": { + "@expressive-code/core": "^0.29.1", + "hastscript": "^7.2.0" + } + }, + "@expressive-code/plugin-shiki": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.29.1.tgz", + "integrity": "sha512-4TOJzC8Y4fvLeM7PslH990j3x7luRCkXAWTm4L45ZrBLrU2+7SKn436/mM9k8G+Z1189+e9rSAUFwn1h/VY6QA==", + "requires": { + "@expressive-code/core": "^0.29.1", + "shiki": "^0.14.1" + } + }, + "@expressive-code/plugin-text-markers": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.29.1.tgz", + "integrity": "sha512-fEsI1n1IEisJl+M2ayHy0AbsHIynnpq1yzc4qJk/0sXpouLOMSgw5dKftSmPio+9fXQoNfmYKmJz+OkuPmdy0A==", + "requires": { + "@expressive-code/core": "^0.29.1", + "hastscript": "^7.2.0", + "unist-util-visit-parents": "^5.1.3" + } + }, "@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -7232,38 +7950,38 @@ } }, "@pagefind/darwin-arm64": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.0.0-alpha.10.tgz", - "integrity": "sha512-npjow0ZhicK47KqPcS4qtlWft2kV0jClyEh0iuumdzJstt4PTacapuyxUAIm5NRR0GH2XoLyaH+TZzaaOmMuJw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.0.4.tgz", + "integrity": "sha512-2OcthvceX2xhm5XbgOmW+lT45oLuHqCmvFeFtxh1gsuP5cO8vcD8ZH8Laj4pXQFCcK6eAdSShx+Ztx/LsQWZFQ==", "optional": true }, "@pagefind/darwin-x64": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.0.0-alpha.10.tgz", - "integrity": "sha512-WYik242Lz0Qv+eTD0brqkE6kndHMDoG7kD8WvdJPKzCSA3MHXVCYm9OyG8EWAWLYxSaDCI+Dx5+NZ1crcQ3Hbw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.0.4.tgz", + "integrity": "sha512-xkdvp0D9Ld/ZKsjo/y1bgfhTEU72ITimd2PMMQtts7jf6JPIOJbsiErCvm37m/qMFuPGEq/8d+fZ4pydOj08HQ==", "optional": true }, "@pagefind/default-ui": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.0.0-alpha.10.tgz", - "integrity": "sha512-BHuRcd3ycJw2oEXxO8SARbWwLp7UP2f3Cv/PhvFh9opLvs0Cf+b/rqo8M7Rm3ldFTPxQuASvY4tt4leIX4DWDg==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.0.4.tgz", + "integrity": "sha512-edkcaPSKq67C49Vehjo+LQCpT615v4d7JRhfGzFPccePvdklaL+VXrfghN/uIfsdoG+HoLI1PcYy2iFcB9CTkw==" }, "@pagefind/linux-arm64": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.0.0-alpha.10.tgz", - "integrity": "sha512-puc21zq/AsQAqAKKqaBsS7lWy16XYjNt2qssTIfhWXmzVQ1jl3wbUK5jm1rvjco5CQAq5cH+y0QdOwrFeuGo3w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.0.4.tgz", + "integrity": "sha512-jGBrcCzIrMnNxLKVtogaQyajVfTAXM59KlBEwg6vTn8NW4fQ6nuFbbhlG4dTIsaamjEM5e8ZBEAKZfTB/qd9xw==", "optional": true }, "@pagefind/linux-x64": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.0.0-alpha.10.tgz", - "integrity": "sha512-SfTd1ABl4otyEiu8rXqLY+tF78yUcfhNW7h4TsgJW8smIKgLJu0CO3YGBze+ddmHGU3dLDCJ5Z+AgHc//VUGfg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.0.4.tgz", + "integrity": "sha512-LIn/QcvcEtLEBqKe5vpSbSC2O3fvqbRCWOTIklslqSORisCsvzsWbP6j+LYxE9q0oWIfkdMoWV1vrE/oCKRxHg==", "optional": true }, "@pagefind/windows-x64": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.0.0-alpha.10.tgz", - "integrity": "sha512-GevBJZ+O0V/2VcNNaBrdWa1NFf6hg2mREhaj3o35WBYCOMSoZmofKuKdLI/w5X0v2AiMbM7CRhOlLwqqW4gKuQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.0.4.tgz", + "integrity": "sha512-QlBCVeZfj9fc9sbUgdOz76ZDbeK4xZihOBAFqGuRJeChfM8pnVeH9iqSnXgO3+m9oITugTf7PicyRUFAG76xeQ==", "optional": true }, "@types/acorn": { @@ -7325,9 +8043,9 @@ "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "@types/estree-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", - "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz", + "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==", "requires": { "@types/estree": "*" } @@ -7340,11 +8058,6 @@ "@types/unist": "^2" } }, - "@types/json5": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz", - "integrity": "sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==" - }, "@types/mdast": { "version": "3.0.12", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", @@ -7354,9 +8067,9 @@ } }, "@types/mdx": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.7.tgz", - "integrity": "sha512-BG4tyr+4amr3WsSEmHn/fXPqaCba/AYZ7dsaQTiavihQunHSIxk+uAtqsjvicNpyHN6cm+B9RVrUOtW9VzIKHw==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.10.tgz", + "integrity": "sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==" }, "@types/ms": { "version": "0.7.31", @@ -7381,11 +8094,6 @@ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" }, - "@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" - }, "@types/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", @@ -7399,6 +8107,11 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", "integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==" }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, "acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -7496,14 +8209,14 @@ "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==" }, "astro": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/astro/-/astro-3.0.7.tgz", - "integrity": "sha512-slUnDBXfxMzq5abE4svcKbaeYC/tHZsJYOrzwDNU9lLye3/4cqYP7OuHMTXiRlx7LSpHQlUhwbMe2HqCv2GKag==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/astro/-/astro-3.6.0.tgz", + "integrity": "sha512-mRDzWXsaSBaN+juvunO4Ukq8HQ1WqrULlcZfKzaKEZEXvxiWmMKN9tH0onQH0EaQ7+f4nNR4VN9kYTM26uMrXQ==", "requires": { - "@astrojs/compiler": "^2.0.1", - "@astrojs/internal-helpers": "0.2.0", - "@astrojs/markdown-remark": "3.0.0", - "@astrojs/telemetry": "3.0.1", + "@astrojs/compiler": "^2.3.0", + "@astrojs/internal-helpers": "0.2.1", + "@astrojs/markdown-remark": "3.5.0", + "@astrojs/telemetry": "3.0.4", "@babel/core": "^7.22.10", "@babel/generator": "^7.22.10", "@babel/parser": "^7.22.10", @@ -7519,6 +8232,7 @@ "common-ancestor-path": "^1.0.1", "cookie": "^0.5.0", "debug": "^4.3.4", + "deterministic-object-hash": "^1.3.1", "devalue": "^4.3.2", "diff": "^5.1.0", "es-module-lexer": "^1.3.0", @@ -7533,64 +8247,48 @@ "js-yaml": "^4.1.0", "kleur": "^4.1.4", "magic-string": "^0.30.3", + "mdast-util-to-hast": "12.3.0", "mime": "^3.0.0", "ora": "^7.0.1", "p-limit": "^4.0.0", + "p-queue": "^7.4.1", "path-to-regexp": "^6.2.1", - "preferred-pm": "^3.0.3", + "preferred-pm": "^3.1.2", + "probe-image-size": "^7.2.3", "prompts": "^2.4.2", "rehype": "^12.0.1", "resolve": "^1.22.4", "semver": "^7.5.4", "server-destroy": "^1.0.1", "sharp": "^0.32.5", - "shiki": "^0.14.3", + "shikiji": "^0.6.8", "string-width": "^6.1.0", "strip-ansi": "^7.1.0", - "tsconfig-resolver": "^3.0.1", - "undici": "^5.23.0", + "tsconfck": "^3.0.0", "unist-util-visit": "^4.1.2", "vfile": "^5.3.7", "vite": "^4.4.9", - "vitefu": "^0.2.4", - "which-pm": "^2.0.0", - "yargs-parser": "^21.1.1", - "zod": "3.21.1" - }, - "dependencies": { - "execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - } - }, - "get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==" - }, - "human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==" - }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + "vitefu": "^0.2.4", + "which-pm": "^2.1.1", + "yargs-parser": "^21.1.1", + "zod": "^3.22.4" + }, + "dependencies": { + "zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==" } } }, + "astro-expressive-code": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.29.1.tgz", + "integrity": "sha512-hvu8kDMr3KD3vqAyJj6KdTDLuebsgnFQdw6V8myJRj464BUMiqPgmufvkuxLrqDCTJvfARJdwf/Q/H3Rqu3mhQ==", + "requires": { + "remark-expressive-code": "^0.29.1" + } + }, "b4a": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", @@ -7706,14 +8404,6 @@ "ieee754": "^1.2.1" } }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "requires": { - "streamsearch": "^1.1.0" - } - }, "camelcase": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", @@ -7780,9 +8470,9 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" }, "cli-boxes": { "version": "3.0.0", @@ -7888,6 +8578,11 @@ "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -7927,11 +8622,24 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" }, + "deterministic-object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-1.3.1.tgz", + "integrity": "sha512-kQDIieBUreEgY+akq0N7o4FzZCr27dPG1xr3wq267vPwDlSXQ3UMcBXHqTGUBaM/5WDS1jwTYjxRhUzHeuiAvw==" + }, "devalue": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==" }, + "devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "requires": { + "dequal": "^2.0.0" + } + }, "diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", @@ -7948,9 +8656,9 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "dset": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", - "integrity": "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", + "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==" }, "eastasianwidth": { "version": "0.2.0", @@ -8080,20 +8788,32 @@ "@types/estree": "^1.0.0" } }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, "execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "requires": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + } } }, "expand-template": { @@ -8101,6 +8821,17 @@ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" }, + "expressive-code": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.29.1.tgz", + "integrity": "sha512-KyEkbSRz2+2gbgtYviOb8xr+QhoAfRQe1VxLAmeZ99c57KAleBpfZHU7JeHj84vputFK6Ge6P87ou9ijD1DXbw==", + "requires": { + "@expressive-code/core": "^0.29.1", + "@expressive-code/plugin-frames": "^0.29.1", + "@expressive-code/plugin-shiki": "^0.29.1", + "@expressive-code/plugin-text-markers": "^0.29.1" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -8139,14 +8870,6 @@ "reusify": "^1.0.4" } }, - "fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "requires": { - "format": "^0.2.0" - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -8173,11 +8896,6 @@ "pkg-dir": "^4.2.0" } }, - "format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" - }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -8190,9 +8908,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "gensync": { "version": "1.0.0-beta.2", @@ -8200,9 +8918,9 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==" }, "github-from-package": { "version": "0.0.0", @@ -8262,19 +8980,19 @@ } } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.2" + } + }, "hast-util-from-parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", @@ -8436,9 +9154,17 @@ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, "ieee754": { "version": "1.2.1", @@ -8498,11 +9224,11 @@ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" }, "is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "is-decimal": { @@ -8543,6 +9269,14 @@ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==" }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "requires": { + "is-docker": "^3.0.0" + } + }, "is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", @@ -8564,9 +9298,9 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" }, "is-reference": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.1.tgz", - "integrity": "sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", "requires": { "@types/estree": "*" } @@ -8582,11 +9316,11 @@ "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==" }, "is-wsl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.0.0.tgz", - "integrity": "sha512-TQ7xXW/fTBaz/HhGSV779AC99ocpvb9qJPuPwyIea+F+Z+htcQ1wouAA0xEQaa4saVqyP8mwkoYp5efeM/4Gbg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "requires": { - "is-docker": "^3.0.0" + "is-inside-container": "^1.0.0" } }, "isexe": { @@ -8617,6 +9351,11 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -8663,11 +9402,6 @@ "argparse": "^1.0.7", "esprima": "^4.0.0" } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" } } }, @@ -8679,6 +9413,11 @@ "p-locate": "^5.0.0" } }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "log-symbols": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", @@ -8816,16 +9555,6 @@ "uvu": "^0.5.0" } }, - "mdast-util-frontmatter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz", - "integrity": "sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==", - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-extension-frontmatter": "^1.0.0" - } - }, "mdast-util-gfm": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", @@ -9069,17 +9798,6 @@ "uvu": "^0.5.0" } }, - "micromark-extension-frontmatter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-1.1.1.tgz", - "integrity": "sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==", - "requires": { - "fault": "^2.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, "micromark-extension-gfm": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", @@ -9485,6 +10203,26 @@ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, "nlcst-to-string": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz", @@ -9614,21 +10352,35 @@ } } }, + "p-queue": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", + "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", + "requires": { + "eventemitter3": "^5.0.1", + "p-timeout": "^5.0.2" + } + }, + "p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==" + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pagefind": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.0.0-alpha.10.tgz", - "integrity": "sha512-ewzRIDzU4HsAaca9rzOFaipMctEoA0XIFyNIDfy1mPM98HCEeTFcZ3Lp4+KcPHZLadsdjLbFLcBFBIAeWisbQw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.0.4.tgz", + "integrity": "sha512-oRIizYe+zSI2Jw4zcMU0ebDZm27751hRFiSOBLwc1OIYMrsZKk+3m8p9EVaOmc6zZdtqwwdilNUNxXvBeHcP9w==", "requires": { - "@pagefind/darwin-arm64": "1.0.0-alpha.10", - "@pagefind/darwin-x64": "1.0.0-alpha.10", - "@pagefind/linux-arm64": "1.0.0-alpha.10", - "@pagefind/linux-x64": "1.0.0-alpha.10", - "@pagefind/windows-x64": "1.0.0-alpha.10" + "@pagefind/darwin-arm64": "1.0.4", + "@pagefind/darwin-x64": "1.0.4", + "@pagefind/linux-arm64": "1.0.4", + "@pagefind/linux-x64": "1.0.4", + "@pagefind/windows-x64": "1.0.4" } }, "parse-entities": { @@ -9759,6 +10511,23 @@ "source-map-js": "^1.0.2" } }, + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, "prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -9823,26 +10592,49 @@ } }, "preferred-pm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", - "integrity": "sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.2.tgz", + "integrity": "sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==", "requires": { "find-up": "^5.0.0", "find-yarn-workspace-root2": "1.2.16", "path-exists": "^4.0.0", "which-pm": "2.0.0" + }, + "dependencies": { + "which-pm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", + "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "requires": { + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" + } + } } }, "prettier": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==" + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true }, "prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" }, + "probe-image-size": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", + "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", + "requires": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -9965,15 +10757,14 @@ "unified": "^10.0.0" } }, - "remark-frontmatter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-4.0.1.tgz", - "integrity": "sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==", + "remark-expressive-code": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/remark-expressive-code/-/remark-expressive-code-0.29.1.tgz", + "integrity": "sha512-iRdN3XLEFLlUNqUCeBPlLgaZROI5lAM3OK7bnwrmQ0ubXJTfV3oET6WL0c5QGijoCZzzDapNiRlRZPrNDoL+5Q==", "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-frontmatter": "^1.0.0", - "micromark-extension-frontmatter": "^1.0.0", - "unified": "^10.0.0" + "expressive-code": "^0.29.1", + "hast-util-to-html": "^8.0.4", + "unist-util-visit": "^4.1.2" } }, "remark-gfm": { @@ -10028,9 +10819,9 @@ } }, "resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "requires": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -10138,6 +10929,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -10209,20 +11005,278 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "shiki": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", - "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz", + "integrity": "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==", "requires": { "ansi-sequence-parser": "^1.1.0", "jsonc-parser": "^3.2.0", "vscode-oniguruma": "^1.7.0", "vscode-textmate": "^8.0.0" + } + }, + "shikiji": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/shikiji/-/shikiji-0.6.13.tgz", + "integrity": "sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA==", + "requires": { + "hast-util-to-html": "^9.0.0" }, "dependencies": { - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + "@types/hast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", + "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "requires": { + "@types/unist": "*" + } + }, + "@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "requires": { + "@types/unist": "*" + } + }, + "@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "requires": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + } + }, + "hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "requires": { + "@types/hast": "^3.0.0" + } + }, + "hast-util-raw": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz", + "integrity": "sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==", + "requires": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + } + }, + "hast-util-to-html": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz", + "integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==", + "requires": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^9.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + } + }, + "hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "requires": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + } + }, + "hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "requires": { + "@types/hast": "^3.0.0" + } + }, + "hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "requires": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + } + }, + "html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==" + }, + "mdast-util-to-hast": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", + "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", + "requires": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" + } + }, + "micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "requires": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==" + }, + "micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + }, + "micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==" + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + }, + "unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "requires": { + "@types/unist": "^3.0.0" + } + }, + "unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "requires": { + "@types/unist": "^3.0.0" + } + }, + "unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "requires": { + "@types/unist": "^3.0.0" + } + }, + "unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "requires": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + } + }, + "unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "requires": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + } + }, + "vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "requires": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + } + }, + "vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "requires": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + } + }, + "vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "requires": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + } } } }, @@ -10290,6 +11344,19 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "starlight": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/starlight/-/starlight-0.3.9.tgz", + "integrity": "sha512-pOZUSpeLrUi891CI6z6OD0vJrG9Ue0B8CSn4vIl/rKgFV9V9xPBDob1AIaE2baLxxkYtJx+djUOCiXnrekeegg==" + }, + "starlight-blog": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/starlight-blog/-/starlight-blog-0.4.0.tgz", + "integrity": "sha512-3mVQ0hwH1XDews/EaG+rN1RA+7yqa7LTqBtTVfjiODC6IL1MRspKqe3MgEU4QFksh9/hEnk5jxC4GPAp2mUFPA==", + "requires": { + "github-slugger": "2.0.0" + } + }, "stdin-discarder": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", @@ -10298,10 +11365,28 @@ "bl": "^5.0.0" } }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + "stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", + "requires": { + "debug": "2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } }, "streamx": { "version": "2.15.1", @@ -10348,9 +11433,9 @@ } }, "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" }, "strip-bom-string": { "version": "1.0.0", @@ -10368,9 +11453,9 @@ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" }, "style-to-object": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.2.tgz", - "integrity": "sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", "requires": { "inline-style-parser": "0.1.1" } @@ -10431,25 +11516,11 @@ "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==" }, - "tsconfig-resolver": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tsconfig-resolver/-/tsconfig-resolver-3.0.1.tgz", - "integrity": "sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==", - "requires": { - "@types/json5": "^0.0.30", - "@types/resolve": "^1.17.0", - "json5": "^2.1.3", - "resolve": "^1.17.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.13.1" - }, - "dependencies": { - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" - } - } + "tsconfck": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.0.tgz", + "integrity": "sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A==", + "requires": {} }, "tunnel-agent": { "version": "0.6.0", @@ -10470,14 +11541,6 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, - "undici": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz", - "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==", - "requires": { - "busboy": "^1.6.0" - } - }, "unherit": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/unherit/-/unherit-3.0.1.tgz", @@ -10852,9 +11915,9 @@ } }, "which-pm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", - "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.1.1.tgz", + "integrity": "sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==", "requires": { "load-yaml-file": "^0.2.0", "path-exists": "^4.0.0" diff --git a/package.json b/package.json index 9c20316e..b23feabb 100644 --- a/package.json +++ b/package.json @@ -15,12 +15,14 @@ }, "dependencies": { "@astrojs/netlify": "^3.0.0", - "@astrojs/starlight": "^0.9.0", - "astro": "^3.0.7", - "prettier": "^3.2.5", - "sharp": "^0.32.3" + "@astrojs/starlight": "^0.13.0", + "astro": "^3.6.0", + "sharp": "^0.32.3", + "starlight": "^0.3.9", + "starlight-blog": "^0.4.0" }, "devDependencies": { - "markdownlint": "^0.31.0" + "markdownlint": "^0.31.1", + "prettier": "^3.2.5" } } diff --git a/public/Architecture Diagram.png b/public/Architecture Diagram.png new file mode 100644 index 00000000..8b67497d Binary files /dev/null and b/public/Architecture Diagram.png differ diff --git a/public/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.001.png b/public/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.001.png new file mode 100644 index 00000000..c5c8b33a Binary files /dev/null and b/public/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.001.png differ diff --git a/public/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.002.png b/public/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.002.png new file mode 100644 index 00000000..79b07cc6 Binary files /dev/null and b/public/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.002.png differ diff --git a/public/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.003.jpeg b/public/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.003.jpeg new file mode 100644 index 00000000..68373944 Binary files /dev/null and b/public/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.003.jpeg differ diff --git a/public/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.004.jpeg b/public/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.004.jpeg new file mode 100644 index 00000000..de86c1d5 Binary files /dev/null and b/public/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.004.jpeg differ diff --git a/public/CourseFlow ERD.png b/public/CourseFlow ERD.png new file mode 100644 index 00000000..2cf9b6c8 Binary files /dev/null and b/public/CourseFlow ERD.png differ diff --git a/public/CourseFlow-AnalyticPage-Figma.PNG b/public/CourseFlow-AnalyticPage-Figma.PNG new file mode 100644 index 00000000..26815345 Binary files /dev/null and b/public/CourseFlow-AnalyticPage-Figma.PNG differ diff --git a/public/CourseFlow-DFD-0.png b/public/CourseFlow-DFD-0.png new file mode 100644 index 00000000..7a9596c9 Binary files /dev/null and b/public/CourseFlow-DFD-0.png differ diff --git a/public/CourseFlow-DFD-1.png b/public/CourseFlow-DFD-1.png new file mode 100644 index 00000000..c5bb3056 Binary files /dev/null and b/public/CourseFlow-DFD-1.png differ diff --git a/public/CourseFlow-PopUpUI-Figma.PNG b/public/CourseFlow-PopUpUI-Figma.PNG new file mode 100644 index 00000000..65d5ec90 Binary files /dev/null and b/public/CourseFlow-PopUpUI-Figma.PNG differ diff --git a/public/CourseFlow-SAD.png b/public/CourseFlow-SAD.png new file mode 100644 index 00000000..6a8a0c1e Binary files /dev/null and b/public/CourseFlow-SAD.png differ diff --git a/public/CourseFlow_Analytics_Page.png b/public/CourseFlow_Analytics_Page.png new file mode 100644 index 00000000..23ce1174 Binary files /dev/null and b/public/CourseFlow_Analytics_Page.png differ diff --git a/public/CourseFlow_SideBar.png b/public/CourseFlow_SideBar.png new file mode 100644 index 00000000..d5b1877a Binary files /dev/null and b/public/CourseFlow_SideBar.png differ diff --git a/public/CourseFlow_Timetable_View.png b/public/CourseFlow_Timetable_View.png new file mode 100644 index 00000000..03c6b363 Binary files /dev/null and b/public/CourseFlow_Timetable_View.png differ diff --git a/public/DataFlow.jpg b/public/DataFlow.jpg new file mode 100644 index 00000000..5003621d Binary files /dev/null and b/public/DataFlow.jpg differ diff --git a/public/Dependency_Injection.png b/public/Dependency_Injection.png new file mode 100644 index 00000000..3e7e6265 Binary files /dev/null and b/public/Dependency_Injection.png differ diff --git a/public/Flow Diagram.png b/public/Flow Diagram.png new file mode 100644 index 00000000..0cc1841d Binary files /dev/null and b/public/Flow Diagram.png differ diff --git a/public/GoogleCloud_CICD.jpg b/public/GoogleCloud_CICD.jpg new file mode 100644 index 00000000..b8d2cb24 Binary files /dev/null and b/public/GoogleCloud_CICD.jpg differ diff --git a/public/GoogleCloud_Doubtfire.jpg b/public/GoogleCloud_Doubtfire.jpg new file mode 100644 index 00000000..b0bd8f26 Binary files /dev/null and b/public/GoogleCloud_Doubtfire.jpg differ diff --git a/public/Import_TS_component.png b/public/Import_TS_component.png new file mode 100644 index 00000000..2a16f676 Binary files /dev/null and b/public/Import_TS_component.png differ diff --git a/public/InitialDesign1.png b/public/InitialDesign1.png new file mode 100644 index 00000000..9b4e6201 Binary files /dev/null and b/public/InitialDesign1.png differ diff --git a/public/InitialDesign2.png b/public/InitialDesign2.png new file mode 100644 index 00000000..6b592555 Binary files /dev/null and b/public/InitialDesign2.png differ diff --git a/public/InitialDesign3.png b/public/InitialDesign3.png new file mode 100644 index 00000000..8121aeb4 Binary files /dev/null and b/public/InitialDesign3.png differ diff --git a/public/InitialDesign4.png b/public/InitialDesign4.png new file mode 100644 index 00000000..6732aa2f Binary files /dev/null and b/public/InitialDesign4.png differ diff --git a/public/InitialDesign5.png b/public/InitialDesign5.png new file mode 100644 index 00000000..03cab6df Binary files /dev/null and b/public/InitialDesign5.png differ diff --git a/public/Orgchart_t3.png b/public/Orgchart_t3.png new file mode 100644 index 00000000..0d84e953 Binary files /dev/null and b/public/Orgchart_t3.png differ diff --git a/public/Section 1.jpg b/public/Section 1.jpg new file mode 100644 index 00000000..e67264a4 Binary files /dev/null and b/public/Section 1.jpg differ diff --git a/public/Section 2.jpg b/public/Section 2.jpg new file mode 100644 index 00000000..2ae7f703 Binary files /dev/null and b/public/Section 2.jpg differ diff --git a/public/Section 3.jpg b/public/Section 3.jpg new file mode 100644 index 00000000..06e1070d Binary files /dev/null and b/public/Section 3.jpg differ diff --git a/public/Section 5.jpg b/public/Section 5.jpg new file mode 100644 index 00000000..461ac50c Binary files /dev/null and b/public/Section 5.jpg differ diff --git a/public/Section 6.jpg b/public/Section 6.jpg new file mode 100644 index 00000000..b70f18a7 Binary files /dev/null and b/public/Section 6.jpg differ diff --git a/public/Section_1.png b/public/Section_1.png new file mode 100644 index 00000000..b3da99c6 Binary files /dev/null and b/public/Section_1.png differ diff --git a/public/Section_2.png b/public/Section_2.png new file mode 100644 index 00000000..80d9558c Binary files /dev/null and b/public/Section_2.png differ diff --git a/public/Section_3.png b/public/Section_3.png new file mode 100644 index 00000000..482b9b1a Binary files /dev/null and b/public/Section_3.png differ diff --git a/public/Section_4.png b/public/Section_4.png new file mode 100644 index 00000000..81732431 Binary files /dev/null and b/public/Section_4.png differ diff --git a/public/Section_5.png b/public/Section_5.png new file mode 100644 index 00000000..4c364e55 Binary files /dev/null and b/public/Section_5.png differ diff --git a/public/StudentView.jpg b/public/StudentView.jpg new file mode 100644 index 00000000..8fc003b1 Binary files /dev/null and b/public/StudentView.jpg differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-10.png b/public/TutorViewDesigns-T1-2023-Designs-10.png new file mode 100644 index 00000000..e121e363 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-10.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-11.png b/public/TutorViewDesigns-T1-2023-Designs-11.png new file mode 100644 index 00000000..e7ddbb37 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-11.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-12.png b/public/TutorViewDesigns-T1-2023-Designs-12.png new file mode 100644 index 00000000..86cae0d4 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-12.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-13.png b/public/TutorViewDesigns-T1-2023-Designs-13.png new file mode 100644 index 00000000..210971c8 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-13.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-14.png b/public/TutorViewDesigns-T1-2023-Designs-14.png new file mode 100644 index 00000000..4a5b9518 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-14.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-15.png b/public/TutorViewDesigns-T1-2023-Designs-15.png new file mode 100644 index 00000000..7fdb91f4 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-15.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-16.png b/public/TutorViewDesigns-T1-2023-Designs-16.png new file mode 100644 index 00000000..5f23b557 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-16.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-17.png b/public/TutorViewDesigns-T1-2023-Designs-17.png new file mode 100644 index 00000000..eb0136b0 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-17.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-18.png b/public/TutorViewDesigns-T1-2023-Designs-18.png new file mode 100644 index 00000000..bceee11f Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-18.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-19.png b/public/TutorViewDesigns-T1-2023-Designs-19.png new file mode 100644 index 00000000..ac18a667 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-19.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-2.png b/public/TutorViewDesigns-T1-2023-Designs-2.png new file mode 100644 index 00000000..487979ea Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-2.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-20.png b/public/TutorViewDesigns-T1-2023-Designs-20.png new file mode 100644 index 00000000..23bb32f2 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-20.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-24.png b/public/TutorViewDesigns-T1-2023-Designs-24.png new file mode 100644 index 00000000..76556486 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-24.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-25.png b/public/TutorViewDesigns-T1-2023-Designs-25.png new file mode 100644 index 00000000..1f432c9b Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-25.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-26.png b/public/TutorViewDesigns-T1-2023-Designs-26.png new file mode 100644 index 00000000..c600fbf7 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-26.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-27.png b/public/TutorViewDesigns-T1-2023-Designs-27.png new file mode 100644 index 00000000..70c1766c Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-27.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-3.png b/public/TutorViewDesigns-T1-2023-Designs-3.png new file mode 100644 index 00000000..e26cf31f Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-3.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-4.png b/public/TutorViewDesigns-T1-2023-Designs-4.png new file mode 100644 index 00000000..21767f9e Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-4.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-5.png b/public/TutorViewDesigns-T1-2023-Designs-5.png new file mode 100644 index 00000000..2ae0518a Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-5.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-6.png b/public/TutorViewDesigns-T1-2023-Designs-6.png new file mode 100644 index 00000000..5e1a6c5a Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-6.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-7.png b/public/TutorViewDesigns-T1-2023-Designs-7.png new file mode 100644 index 00000000..3a3070bd Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-7.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-8.png b/public/TutorViewDesigns-T1-2023-Designs-8.png new file mode 100644 index 00000000..9688dda3 Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-8.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs-9.png b/public/TutorViewDesigns-T1-2023-Designs-9.png new file mode 100644 index 00000000..e32133cc Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs-9.png differ diff --git a/public/TutorViewDesigns-T1-2023-Designs.png b/public/TutorViewDesigns-T1-2023-Designs.png new file mode 100644 index 00000000..446d47fb Binary files /dev/null and b/public/TutorViewDesigns-T1-2023-Designs.png differ diff --git a/public/UML Class Diagram - Staff Grant Extension.jpeg b/public/UML Class Diagram - Staff Grant Extension.jpeg new file mode 100644 index 00000000..3bd5faf0 Binary files /dev/null and b/public/UML Class Diagram - Staff Grant Extension.jpeg differ diff --git a/public/UML Use Case Diagram - Staff Grant Extension.jpeg b/public/UML Use Case Diagram - Staff Grant Extension.jpeg new file mode 100644 index 00000000..596c722d Binary files /dev/null and b/public/UML Use Case Diagram - Staff Grant Extension.jpeg differ diff --git a/public/UnitChair.jpg b/public/UnitChair.jpg new file mode 100644 index 00000000..222acc6a Binary files /dev/null and b/public/UnitChair.jpg differ diff --git a/public/Use Cases.png b/public/Use Cases.png new file mode 100644 index 00000000..0573b73e Binary files /dev/null and b/public/Use Cases.png differ diff --git a/public/VideoShowcase-TutorViewDesignPrototype copy 2.mp4 b/public/VideoShowcase-TutorViewDesignPrototype copy 2.mp4 new file mode 100644 index 00000000..e2ea8fe6 Binary files /dev/null and b/public/VideoShowcase-TutorViewDesignPrototype copy 2.mp4 differ diff --git a/public/VideoShowcase-TutorViewDesignPrototype copy.mp4 b/public/VideoShowcase-TutorViewDesignPrototype copy.mp4 new file mode 100644 index 00000000..e2ea8fe6 Binary files /dev/null and b/public/VideoShowcase-TutorViewDesignPrototype copy.mp4 differ diff --git a/public/VideoShowcase-TutorViewDesignPrototype.mp4 b/public/VideoShowcase-TutorViewDesignPrototype.mp4 new file mode 100644 index 00000000..e2ea8fe6 Binary files /dev/null and b/public/VideoShowcase-TutorViewDesignPrototype.mp4 differ diff --git a/public/Voice Enrolment Process Flow.png b/public/Voice Enrolment Process Flow.png new file mode 100644 index 00000000..c57bc2c2 Binary files /dev/null and b/public/Voice Enrolment Process Flow.png differ diff --git a/public/Voice Verification Main Process.png b/public/Voice Verification Main Process.png new file mode 100644 index 00000000..746a13a7 Binary files /dev/null and b/public/Voice Verification Main Process.png differ diff --git a/public/Voice-Verification-Architecture-Diagram.png b/public/Voice-Verification-Architecture-Diagram.png new file mode 100644 index 00000000..e3bcbfeb Binary files /dev/null and b/public/Voice-Verification-Architecture-Diagram.png differ diff --git a/public/Voiceprint Enrolment GUI.png b/public/Voiceprint Enrolment GUI.png new file mode 100644 index 00000000..58cfc34f Binary files /dev/null and b/public/Voiceprint Enrolment GUI.png differ diff --git a/public/Wireframes.png b/public/Wireframes.png new file mode 100644 index 00000000..c06bb905 Binary files /dev/null and b/public/Wireframes.png differ diff --git a/public/bootkeys.png b/public/bootkeys.png new file mode 100644 index 00000000..34ba7d85 Binary files /dev/null and b/public/bootkeys.png differ diff --git a/public/chathistorydisplayer-proposition.png b/public/chathistorydisplayer-proposition.png new file mode 100644 index 00000000..8d8e2ab9 Binary files /dev/null and b/public/chathistorydisplayer-proposition.png differ diff --git a/public/codespaces-1.png b/public/codespaces-1.png new file mode 100644 index 00000000..88c64cd5 Binary files /dev/null and b/public/codespaces-1.png differ diff --git a/public/codespaces-2.png b/public/codespaces-2.png new file mode 100644 index 00000000..bed59b68 Binary files /dev/null and b/public/codespaces-2.png differ diff --git a/public/codespaces-3.png b/public/codespaces-3.png new file mode 100644 index 00000000..2e3663b7 Binary files /dev/null and b/public/codespaces-3.png differ diff --git a/public/codespaces-4.png b/public/codespaces-4.png new file mode 100644 index 00000000..f579377c Binary files /dev/null and b/public/codespaces-4.png differ diff --git a/public/codespaces-5.png b/public/codespaces-5.png new file mode 100644 index 00000000..32cce4f5 Binary files /dev/null and b/public/codespaces-5.png differ diff --git a/public/codespaces-6.png b/public/codespaces-6.png new file mode 100644 index 00000000..4d31f956 Binary files /dev/null and b/public/codespaces-6.png differ diff --git a/public/codespaces-7.png b/public/codespaces-7.png new file mode 100644 index 00000000..6494c87f Binary files /dev/null and b/public/codespaces-7.png differ diff --git a/public/codespaces-8.png b/public/codespaces-8.png new file mode 100644 index 00000000..e64fd43a Binary files /dev/null and b/public/codespaces-8.png differ diff --git a/public/codespaces-9.png b/public/codespaces-9.png new file mode 100644 index 00000000..ee8b18fc Binary files /dev/null and b/public/codespaces-9.png differ diff --git a/public/course-flow-course-map-1.png b/public/course-flow-course-map-1.png new file mode 100644 index 00000000..8f16c23f Binary files /dev/null and b/public/course-flow-course-map-1.png differ diff --git a/public/course-flow-course-map-2.png b/public/course-flow-course-map-2.png new file mode 100644 index 00000000..eb857977 Binary files /dev/null and b/public/course-flow-course-map-2.png differ diff --git a/public/course-flow-detailed-unit.png b/public/course-flow-detailed-unit.png new file mode 100644 index 00000000..fc07332b Binary files /dev/null and b/public/course-flow-detailed-unit.png differ diff --git a/public/course-flow-entry.png b/public/course-flow-entry.png new file mode 100644 index 00000000..e7eb0b8f Binary files /dev/null and b/public/course-flow-entry.png differ diff --git a/public/course-flow-erd.png b/public/course-flow-erd.png new file mode 100644 index 00000000..32674324 Binary files /dev/null and b/public/course-flow-erd.png differ diff --git a/public/courseflow-dfd-level-0.png b/public/courseflow-dfd-level-0.png new file mode 100644 index 00000000..852aae5d Binary files /dev/null and b/public/courseflow-dfd-level-0.png differ diff --git a/public/courseflow-enhanced-erd.png b/public/courseflow-enhanced-erd.png new file mode 100644 index 00000000..edf280f5 Binary files /dev/null and b/public/courseflow-enhanced-erd.png differ diff --git a/public/courseflow-high-level-entity-relationship.png b/public/courseflow-high-level-entity-relationship.png new file mode 100644 index 00000000..c729ef3e Binary files /dev/null and b/public/courseflow-high-level-entity-relationship.png differ diff --git a/public/courseflow-system-architecture.png b/public/courseflow-system-architecture.png new file mode 100644 index 00000000..a596e437 Binary files /dev/null and b/public/courseflow-system-architecture.png differ diff --git a/public/create_branch.png b/public/create_branch.png new file mode 100644 index 00000000..786cc93c Binary files /dev/null and b/public/create_branch.png differ diff --git a/public/custom-layout.png b/public/custom-layout.png new file mode 100644 index 00000000..c61dfba6 Binary files /dev/null and b/public/custom-layout.png differ diff --git a/public/deakin_setup_page.png b/public/deakin_setup_page.png new file mode 100644 index 00000000..f5890eb7 Binary files /dev/null and b/public/deakin_setup_page.png differ diff --git a/public/deakin_setup_terminal.png b/public/deakin_setup_terminal.png new file mode 100644 index 00000000..a6abce54 Binary files /dev/null and b/public/deakin_setup_terminal.png differ diff --git a/public/delete_import.png b/public/delete_import.png new file mode 100644 index 00000000..7b04d406 Binary files /dev/null and b/public/delete_import.png differ diff --git a/public/delete_injection.png b/public/delete_injection.png new file mode 100644 index 00000000..5c4a778f Binary files /dev/null and b/public/delete_injection.png differ diff --git a/public/demonstration.mp4 b/public/demonstration.mp4 new file mode 100644 index 00000000..eb5d54df Binary files /dev/null and b/public/demonstration.mp4 differ diff --git a/public/dockerimage.png b/public/dockerimage.png new file mode 100644 index 00000000..c28a7f7a Binary files /dev/null and b/public/dockerimage.png differ diff --git a/public/doubtfire-localhost-compose.png b/public/doubtfire-localhost-compose.png new file mode 100644 index 00000000..5ca7e3dc Binary files /dev/null and b/public/doubtfire-localhost-compose.png differ diff --git a/public/doubtfire-localhost-docker.png b/public/doubtfire-localhost-docker.png new file mode 100644 index 00000000..8a584770 Binary files /dev/null and b/public/doubtfire-localhost-docker.png differ diff --git a/public/doubtfire-localhost.png b/public/doubtfire-localhost.png new file mode 100644 index 00000000..5b34e403 Binary files /dev/null and b/public/doubtfire-localhost.png differ diff --git a/public/downgrade.png b/public/downgrade.png new file mode 100644 index 00000000..7c03a16b Binary files /dev/null and b/public/downgrade.png differ diff --git a/public/edit-profile-form.png b/public/edit-profile-form.png new file mode 100644 index 00000000..ec6f329a Binary files /dev/null and b/public/edit-profile-form.png differ diff --git a/public/fetch_thoth.png b/public/fetch_thoth.png new file mode 100644 index 00000000..737297c8 Binary files /dev/null and b/public/fetch_thoth.png differ diff --git a/public/figure1.PNG b/public/figure1.PNG new file mode 100644 index 00000000..c920c54b Binary files /dev/null and b/public/figure1.PNG differ diff --git a/public/figure1.jpeg b/public/figure1.jpeg new file mode 100644 index 00000000..8f161569 Binary files /dev/null and b/public/figure1.jpeg differ diff --git a/public/figure2 copy.PNG b/public/figure2 copy.PNG new file mode 100644 index 00000000..6c964fad Binary files /dev/null and b/public/figure2 copy.PNG differ diff --git a/public/figure2.PNG b/public/figure2.PNG new file mode 100644 index 00000000..0d762a0d Binary files /dev/null and b/public/figure2.PNG differ diff --git a/public/figure3 copy.PNG b/public/figure3 copy.PNG new file mode 100644 index 00000000..df60b675 Binary files /dev/null and b/public/figure3 copy.PNG differ diff --git a/public/figure3.png b/public/figure3.png new file mode 100644 index 00000000..6014a2f8 Binary files /dev/null and b/public/figure3.png differ diff --git a/public/figure4.PNG b/public/figure4.PNG new file mode 100644 index 00000000..614204dd Binary files /dev/null and b/public/figure4.PNG differ diff --git a/public/figure5.PNG b/public/figure5.PNG new file mode 100644 index 00000000..abf1c216 Binary files /dev/null and b/public/figure5.PNG differ diff --git a/public/figure6.PNG b/public/figure6.PNG new file mode 100644 index 00000000..e23c4c76 Binary files /dev/null and b/public/figure6.PNG differ diff --git a/public/figure7.PNG b/public/figure7.PNG new file mode 100644 index 00000000..2a0dcd3c Binary files /dev/null and b/public/figure7.PNG differ diff --git a/public/figure8.PNG b/public/figure8.PNG new file mode 100644 index 00000000..7476a159 Binary files /dev/null and b/public/figure8.PNG differ diff --git a/public/final-iteration-1-and-2-wireframes.png b/public/final-iteration-1-and-2-wireframes.png new file mode 100644 index 00000000..28e3a96e Binary files /dev/null and b/public/final-iteration-1-and-2-wireframes.png differ diff --git a/public/force-directed-graph.png b/public/force-directed-graph.png new file mode 100644 index 00000000..6cb0d23e Binary files /dev/null and b/public/force-directed-graph.png differ diff --git a/public/gcp-instance-connect.png b/public/gcp-instance-connect.png new file mode 100644 index 00000000..d32199d1 Binary files /dev/null and b/public/gcp-instance-connect.png differ diff --git a/public/gcp-instance-docker.png b/public/gcp-instance-docker.png new file mode 100644 index 00000000..c2a2438a Binary files /dev/null and b/public/gcp-instance-docker.png differ diff --git a/public/git_checkout.png b/public/git_checkout.png new file mode 100644 index 00000000..5b10144a Binary files /dev/null and b/public/git_checkout.png differ diff --git a/public/git_remote.png b/public/git_remote.png new file mode 100644 index 00000000..8b640ebf Binary files /dev/null and b/public/git_remote.png differ diff --git a/public/import_to_angular.png b/public/import_to_angular.png new file mode 100644 index 00000000..85d036f7 Binary files /dev/null and b/public/import_to_angular.png differ diff --git a/public/import_to_ng_module.png b/public/import_to_ng_module.png new file mode 100644 index 00000000..e00579e1 Binary files /dev/null and b/public/import_to_ng_module.png differ diff --git a/public/install_ubuntu.png b/public/install_ubuntu.png new file mode 100644 index 00000000..2aa41d30 Binary files /dev/null and b/public/install_ubuntu.png differ diff --git a/public/installation_type.png b/public/installation_type.png new file mode 100644 index 00000000..2922a4b1 Binary files /dev/null and b/public/installation_type.png differ diff --git a/public/iteration-3-design-1.png b/public/iteration-3-design-1.png new file mode 100644 index 00000000..f88da9c8 Binary files /dev/null and b/public/iteration-3-design-1.png differ diff --git a/public/iteration-3-design-2.png b/public/iteration-3-design-2.png new file mode 100644 index 00000000..4a73a102 Binary files /dev/null and b/public/iteration-3-design-2.png differ diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 00000000..9723b00c Binary files /dev/null and b/public/logo.png differ diff --git a/public/onboardingDemo.png b/public/onboardingDemo.png new file mode 100644 index 00000000..42c77d53 Binary files /dev/null and b/public/onboardingDemo.png differ diff --git a/public/onboardingDesign.png b/public/onboardingDesign.png new file mode 100644 index 00000000..5d3d9f63 Binary files /dev/null and b/public/onboardingDesign.png differ diff --git a/public/ontrack-login.png b/public/ontrack-login.png new file mode 100644 index 00000000..9ad66986 Binary files /dev/null and b/public/ontrack-login.png differ diff --git a/public/picture.png b/public/picture.png new file mode 100644 index 00000000..0d84e953 Binary files /dev/null and b/public/picture.png differ diff --git a/public/push_to_origin.png b/public/push_to_origin.png new file mode 100644 index 00000000..78904c8a Binary files /dev/null and b/public/push_to_origin.png differ diff --git a/public/root_partition.png b/public/root_partition.png new file mode 100644 index 00000000..0f1850d3 Binary files /dev/null and b/public/root_partition.png differ diff --git a/public/rufus_screenshot.png b/public/rufus_screenshot.png new file mode 100644 index 00000000..1b95f6fa Binary files /dev/null and b/public/rufus_screenshot.png differ diff --git a/public/section_1 copy.png b/public/section_1 copy.png new file mode 100644 index 00000000..9e11cac8 Binary files /dev/null and b/public/section_1 copy.png differ diff --git a/public/section_2 copy.png b/public/section_2 copy.png new file mode 100644 index 00000000..db508a11 Binary files /dev/null and b/public/section_2 copy.png differ diff --git a/public/section_3 copy.png b/public/section_3 copy.png new file mode 100644 index 00000000..073ca8c3 Binary files /dev/null and b/public/section_3 copy.png differ diff --git a/public/spike-cover-1.jpg b/public/spike-cover-1.jpg new file mode 100644 index 00000000..514e6592 Binary files /dev/null and b/public/spike-cover-1.jpg differ diff --git a/public/start_typescript.png b/public/start_typescript.png new file mode 100644 index 00000000..8d6bda19 Binary files /dev/null and b/public/start_typescript.png differ diff --git a/public/still-image-prototype.png b/public/still-image-prototype.png new file mode 100644 index 00000000..82a43d16 Binary files /dev/null and b/public/still-image-prototype.png differ diff --git a/public/teaching-period-breaks-migrated.png b/public/teaching-period-breaks-migrated.png new file mode 100644 index 00000000..f625b989 Binary files /dev/null and b/public/teaching-period-breaks-migrated.png differ diff --git a/public/teaching-period-breaks.png b/public/teaching-period-breaks.png new file mode 100644 index 00000000..f350dafc Binary files /dev/null and b/public/teaching-period-breaks.png differ diff --git a/public/teaching-period-details-editor-migrated.png b/public/teaching-period-details-editor-migrated.png new file mode 100644 index 00000000..86d70c00 Binary files /dev/null and b/public/teaching-period-details-editor-migrated.png differ diff --git a/public/teaching-period-details-editor.png b/public/teaching-period-details-editor.png new file mode 100644 index 00000000..b85dab70 Binary files /dev/null and b/public/teaching-period-details-editor.png differ diff --git a/public/teaching-period-units-migrated.png b/public/teaching-period-units-migrated.png new file mode 100644 index 00000000..4e63a48d Binary files /dev/null and b/public/teaching-period-units-migrated.png differ diff --git a/public/teaching-period-units.png b/public/teaching-period-units.png new file mode 100644 index 00000000..70681055 Binary files /dev/null and b/public/teaching-period-units.png differ diff --git a/public/ubuntu_desktop.png b/public/ubuntu_desktop.png new file mode 100644 index 00000000..9b4d807f Binary files /dev/null and b/public/ubuntu_desktop.png differ diff --git a/public/ubuntu_options.png b/public/ubuntu_options.png new file mode 100644 index 00000000..f6250942 Binary files /dev/null and b/public/ubuntu_options.png differ diff --git a/public/uml.png b/public/uml.png new file mode 100644 index 00000000..1e850668 Binary files /dev/null and b/public/uml.png differ diff --git a/public/unit-students-editor.png b/public/unit-students-editor.png new file mode 100644 index 00000000..353e9c5b Binary files /dev/null and b/public/unit-students-editor.png differ diff --git a/public/unit_test_terminal_output.png b/public/unit_test_terminal_output.png new file mode 100644 index 00000000..baea36ad Binary files /dev/null and b/public/unit_test_terminal_output.png differ diff --git a/public/use_case_diagram.png b/public/use_case_diagram.png new file mode 100644 index 00000000..56430c92 Binary files /dev/null and b/public/use_case_diagram.png differ diff --git a/public/vau-c-1.png b/public/vau-c-1.png new file mode 100644 index 00000000..9fbb943f Binary files /dev/null and b/public/vau-c-1.png differ diff --git a/public/vau-c-2.png b/public/vau-c-2.png new file mode 100644 index 00000000..10d56378 Binary files /dev/null and b/public/vau-c-2.png differ diff --git a/public/vscode_change_branch_1.png b/public/vscode_change_branch_1.png new file mode 100644 index 00000000..9a63e5a9 Binary files /dev/null and b/public/vscode_change_branch_1.png differ diff --git a/public/vscode_change_branch_2.png b/public/vscode_change_branch_2.png new file mode 100644 index 00000000..ef1fe032 Binary files /dev/null and b/public/vscode_change_branch_2.png differ diff --git a/public/website-img1.png b/public/website-img1.png new file mode 100644 index 00000000..1b9304e5 Binary files /dev/null and b/public/website-img1.png differ diff --git a/public/website-img2.png b/public/website-img2.png new file mode 100644 index 00000000..335b193f Binary files /dev/null and b/public/website-img2.png differ diff --git a/src/content/config.ts b/src/content/config.ts index 9df91b60..c00ca6b7 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -1,7 +1,10 @@ -import { defineCollection } from 'astro:content'; -import { docsSchema, i18nSchema } from '@astrojs/starlight/schema'; +import { defineCollection } from "astro:content"; +import { docsSchema, i18nSchema } from "@astrojs/starlight/schema"; +import { docsAndBlogSchema } from "starlight-blog/schema"; export const collections = { - docs: defineCollection({ schema: docsSchema() }), - i18n: defineCollection({ type: 'data', schema: i18nSchema() }), + //og schema replaced with blog support one + //docs: defineCollection({ schema: docsSchema() }), + docs: defineCollection({ schema: docsAndBlogSchema }), + i18n: defineCollection({ type: "data", schema: i18nSchema() }), }; diff --git a/src/content/docs/.markdownlint.json b/src/content/docs/.markdownlint.json new file mode 100644 index 00000000..7cd6bc1e --- /dev/null +++ b/src/content/docs/.markdownlint.json @@ -0,0 +1,9 @@ +{ + "MD033": { + "allowed_elements": ["ul", "li", "img", "details", "summary"] + }, + "MD013": { + "line_length": 100, + "tables": false + } +} diff --git a/src/content/docs/blog/test.md b/src/content/docs/blog/test.md new file mode 100644 index 00000000..d39eb09d --- /dev/null +++ b/src/content/docs/blog/test.md @@ -0,0 +1,40 @@ +--- +title: Introducing the Thoth Tech Blog! +date: 2023-11-21 +authors: + - name: Quinn Curtis + title: Senior Company Operations Member + picture: https://avatars.githubusercontent.com/u/139825230 +--- + +Welcome to our brand new blog! On this page, you will be able to find all the latest in Thoth Tech +news and updates! + +#### How do we use it? + +To create a post on the blog, just create a markdown file and add it to the blog folder under +`/src/content/docs/blog/` and add the following items to the header: + +- Title (just a basic overview of the post) +- Date (the date of your post. It needs to be formatted YYYY-MM-DD) +- Author / Authors (some basic information about you) + +##### Here is an example header, taken straight from this post + +```markdown +--- +title: Introducing the Thoth Tech Blog! +date: 2023-11-21 +authors: + - name: Quinn Curtis + title: Senior Company Operations Member + picture: https://avatars.githubusercontent.com/u/139825230 +--- +``` + +As you can see, under authors there are a few subheadings. Name is the only mandatory field, but to +keep things clear and easy for everyone, please at least add your title, but feel free to add in a +picture as well. Your GitHub profile picture is probably the easiest option. Just drag it from your +profile to another tab and copy the URL. + +Still having issues? Check out this handy video tutorial I've made to get you started: diff --git a/src/content/docs/companywidesubmissions/Company Structure and Objectives T2 2023.md b/src/content/docs/companywidesubmissions/Company Structure and Objectives T2 2023.md new file mode 100644 index 00000000..e09e647e --- /dev/null +++ b/src/content/docs/companywidesubmissions/Company Structure and Objectives T2 2023.md @@ -0,0 +1,71 @@ +--- +title: Company Structure and Objectives for 2023 TRIMESTER 2 +description: 2.1P Task, T2 2023 +--- + +## Executive Summary + +Thoth Tech is a software development company currently building from the ground up in Melbourne, +Australia. Thoth Tech’s mission is to build, operate, and deploy education technologies creating +tools that enhance education outcomes by empowering students, connecting them with tutors, and +facilitating personalised learning experiences. + +We value our people, and we value excellence. We are people-focused, aiming to produce sustainable +products of excellent quality, and provide frameworks that supply a safe environment for learning +and support of our team. This report is for stakeholders and investors, and will outline the company +structure, charter, objectives–both short and long term, and explore each product’s goals. + +Thoth Tech has recruited approximately 63 employees with 5 product leads. Thoth Tech currently runs +with five products OnTrack, Courseflow, Splash Kit Courseflow, and Company Operations. The +additional projects give a bit more variety to the technology stacks currently in use and ties in +nicely with some existing units that students are working on. + +Company Operations oversees the entire affairs of Thoth Tech and strives to make things easier. +Effective operations are important for maintaining a successful business. As other product teams +focus to develop new features and upgrade existing products, we would be working to ensure that +appropriate industry guidelines and standards are followed to produce world class products. We +document the tools and processes that Thoth tech uses in its daily operations and research new +options that could serve the company better. + +OnTrack is one of the bigger projects in the company and is a live production system that is in use +at Deakin University, it has been consistently improved and built upon to provide an exceptional +learning tool for students and staff at Deakin. Its technology stack consists of a Ruby on Rails +back end and an Angular JS / Angular 15 front end. There are a variety of projects to enhance and +upgrade this product that students can work on. + +CourseFlow is a Thoth Tech product that was founded in T1 2023. It aims to assist students and +course directors in course planning and in comprehending the requirements of certain courses. It +does this by giving users a way to generate a personalized course map that meets the requirements of +their course and by providing a tool that allows users to view the requirements of all units (such +as prerequisite units) visually. + +SplashKit is currently a 2D game development Software Development Kit used to teach object-oriented +coding to beginners. It has been identified that SplashKit can be expanded to explore other areas +and languages. + +The Art Gallery Project is a new project that has been added in T1 2023, it is a web-based API back +end written in .NET 7 and C# on a PostgreSQL database and a Vue front end that was developed by +several students and a lecturer. The aim is to provide a system to track and sell Art works in +smaller communities. + +## Leadership Team + +### Company Directors + +- Andrew Cain, Managing Director +- Glory Lee, Managing Director + +### Student Leadership + +- Daniel Maddern – Product Lead for OnTrack +- Daniel Maddern & Chloe Hulme – Product Lead for Art Gallery +- Mel David Bugay & Kieron Anthony Boyle – Product Leads for Courseflow +- Phil Williams – Product Lead for Splash Kit +- Onyedikachi Okorie - Product Lead for Company Operations + +## Roles and Responsibilities + +| Roles | Description | Responsibilities | Skills | +| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Managing Director | The role of the managing director is to oversee the Thoth Tech company executive leadership team to ensure they are running the company effectively and value is being added to the Thoth Tech products by the projects they are supporting. | | | +| Product Lead | The role of the Product lead is to lead and support delivery leads in projects related to their product to ensure ongoing success. | | | diff --git a/src/content/docs/companywidesubmissions/company-progress-report.md b/src/content/docs/companywidesubmissions/company-progress-report.md new file mode 100644 index 00000000..d5843d38 --- /dev/null +++ b/src/content/docs/companywidesubmissions/company-progress-report.md @@ -0,0 +1,553 @@ +--- +title: Thoth Tech - Company Progress Report 2023 TRIMESTER 3 +description: 4.1P Task, T3 2023 +--- + +## Executive Summary + +Thoth Tech is a software development company currently building from the ground up in Melbourne, +Australia. + +Thoth Tech’s mission is to build, operate, and deploy education technologies, creating tools that +enhance education outcomes by empowering students, connecting them with tutors, and facilitating +personalised learning experiences. + +We value our people, and we value excellence. We are people-focused, aiming to produce sustainable +products of excellent quality, and provide frameworks that supply a safe environment for learning +and support of our team. + +This report will outline the company structure, charter, objectives–both short and long term, and +explore each product’s goals. + +In trimester 3, Thoth Tech would be running three products namely: OnTrack, Splash Kit, and Company +Operations. In addition to the three main products, the Courseflow project would undergo a rigorous +planning phase were the benefits, aims, and solution design would be generated to create a structure +for the project in subsequent trimesters. Students would be allocated to any of the three products +and would be required to contribute to achieve the objectives of the product. + +Company Operations oversees the entire affairs of Thoth Tech and strives to make things easier. +Effective operations are important for maintaining a successful business. As other product teams +focus to develop new features and upgrade existing products, we would be working to ensure that +appropriate industry guidelines and standards are followed to produce world class products. We +document the tools and processes that Thoth tech uses in its daily operations and research new +options that could serve the company better. + +OnTrack is one of the bigger projects in the company and is a live production system that is in use +at Deakin University, it has been consistently improved and built upon to provide an exceptional +learning tool for students and staff at Deakin. Its technology stack consists of a Ruby on Rails +back end and an Angular JS / Angular 15 front end. There are a variety of projects to enhance and +upgrade this product that students can work on. + +SplashKit is currently a 2D game development Software Development Kit used to teach object-oriented +coding to beginners. It has been identified that SplashKit can be expanded to explore other areas +and languages. + +## Leadership Team + +### Company Directors + +- Andrew Cain, Managing Director + +### Mentors + +- OnTrack & Courseflow - Daniel Maddern +- SplashKit – Olivia McKeon +- Company Operations – Amin Abken + +## Trimester Goals and Objectives + +Thoth Tech will aim to achieve the goals listed below: + +### Goal 1: Foster employees' growth in a safe and supportive environment to equip them with the soft and technical skills needed upon graduation + +- Create an environment where the amount of work is distrusted evenly amongst roles and + contributors. +- Utilise processes and tools that require collaboration and fosters growth such as Google Suite or + Pull Reviews. +- Educate and Empower skill growth and knowledge sharing. +- Enhance onboarding experience for future employees. +- Ensure a supportive environment is provided for all employees regardless of race, gender or other + differences to allow every employee to thrive. + +### Goal 2: Extend the Existing Thoth Tech Applications based on the Director’s Visions + +- Improve existing features of the Thoth Tech applications and extend the platforms. +- Have a mentality of self-improvement and find/squash bugs related to non-technical and technical + issues. +- Maintain security guidelines and industry best standards. +- Embrace an ethic of communicating with non-technical stakeholders through diagrams and other + methods of documentation to help future employees and investors. + +### Goal 3: Revise and Maintain Company Operations + +- Improve existing company policies based on employee feedback and director advice +- Educate future employees and develop a process to consider the bus factory +- Allow company operations to be a smooth process for nurturing new company operation members. +- Establish documentation and guidelines to allow anyone to understand the company operation. + +### Company Charter + +The Thoth Tech charter is a crucial tool for guiding our team, navigating decisions, establishing +boundaries, and aligning the team on how we work together. It defines how as a company we work +together to achieve success. + +Our charter comprises of the following: + +1. Mission: As a team, what are we trying to achieve? +2. Values: What do we care about? +3. Team Culture: How will we work together, what do we expect? +4. Roles: What roles do we need and what are the responsibilities of each role? +5. Metrics of Success: What does success look like to us? +6. Standards of Quality: What are our standards for high quality work? Mission To build, operate and + deploy world class education technologies. + +This is achieved by creating tools that enhance education outcomes by empowering students, +connecting them with tutors and facilitating personalised learning experiences. Values Our values +describe how we work, what we represent, and guide us to be the kind of company and team members we +want to be. + +When we live up to these values we will: Be people-focused We expect the best from each other, give +each other the benefit of the doubt, encourage each other to take initiative to improve ourselves +and the company, and provide direct and constructive help to each other. We collaborate with +kindness while being respectful of each other. Uphold sustainable excellence We create working, +maintainable, and understandable software that is enjoyable and easy to use. + +We strive to do it in a way that is sustainable for our team members and for our environment. Be +inclusive and supportive We celebrate diverse perspectives and embrace uncomfortable ideas and +conversations. We facilitate an environment in which all team members feel psychologically safe +enough to make requests for what they need to do their job. We learn through failures while +continually working to make things better. + +## Company Structure and Projects Overview + +### Company Structure + +![org chart](/picture.png) + +### Projects Overview + +#### Company Operations + +#### Overview, Goals, and Objectives + +This team oversees the entire operations of Thoth Tech and strives to make things easier. We aim to +make the onboarding process as smooth and clear as possible, as well as increase the knowledge of +our seniors in meaningful ways while creating policies to improve the wellbeing of all company +employees. In the short term, we would like to create documentations, policies, workflows, and +processes that are relevant to improve the company’s outlook and overall productivity. In the long +term, we aim to ensure that all policies created are being adhered to and the Documentation website +is being utilized to store all project documentation. + +#### Aims for Trimester + +- Enforce created policies. +- Migrate all project documentation to the Documentation website. +- Dockerize the Documentation website +- Create a website to showcase Thoth Tech products and projects. +- Oversee the entire operations of the company. + +#### Deliverables + +- Design document for Thoth Tech company website. +- Published company website +- Docker image for documentation website published to GitHub. +- Students completely adhere to created policies and guidelines + +#### Description of Progress + +- Building of the Thoth Tech Website is in progress. +- Students have begun the migration of documents from GitHub to the Documentation Website. +- We are currently working on a solution that takes input from users (regarding their skills, career + prospects, degree specialization) and suggest what Thoth Tech product would be beneficial to them. + This is basically for new students joining Thoth Tech. +- Successfully compiled 2.1P task and submitted. +- Redesigned the news page in the Documentation website. It now has a blog outlook. +- Held help hub sessions for new and returning students in Thoth Tech. +- Created a Committed Participant Agreement contract for students willing to develop something + valuable in Thoth Tech. + +#### Team Members and Contributions + +| Full Name | Trello Card Name | Evidence | +| :-------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +|

QUINN CURTIS

|

create blog page for the documentation website

|

[https://github.com/thoth-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/17) [tech/ThothTech-Documentation-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/17)

[Website/pull/17](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/17)

| +|

QUINN CURTIS

|

create written tutorial for the blog

|

[https://github.com/thoth-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/17) [tech/ThothTech-Documentation-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/17)

[Website/pull/17](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/17)

| +|

QUINN CURTIS

|

created video tutorial for the blog

|

[https://github.com/thoth-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/17) [tech/ThothTech-Documentation-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/17)

[Website/pull/17](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/17)

| +|

Karl Ivan Aquino

|

Create a Documentation on How to

Publish an Astro Website to Netlify

| | +|

Karl Ivan Aquino

|

Testing the Documentation on How

to Publish an Astro Website to Netlify

| | +|

Karl Ivan Aquino

|

Create a Netlify Account Using

Andrews Details

| | +|

Karl Ivan Aquino

|

Create a Worklog to be adopted by the Company

|

[https://github.com/thoth-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/16) [tech/ThothTech-Documentation-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/16)

[Website/pull/16](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/16)

| +|

Onyedikachi

Okorie

|

Populate Trello board with tasks to

be done in Sprint 1

|

[https://github.com/thoth-tech/Company-](https://github.com/thoth-tech/Company-Operations/pull/26)

[Operations/pull/26](https://github.com/thoth-tech/Company-Operations/pull/26)

| +|

Onyedikachi Okorie

|

Help Hub Session to answer questions and direct teammates on

how to Contribute effectively

|

[https://github.com/thoth-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/15) [tech/ThothTech-Documentation-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/15)

[Website/pull/15](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/15)

| +|

Onyedikachi Okorie

|

Create a Spike Plan for the Thoth Website

|

[https://github.com/thoth-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/9)

[tech/ThothTech-Documentation-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/9) [Website/pull/9](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/9)

| +|

Onyedikachi Okorie

|

Create "Contributing to Thoth Tech in T3" document.

|

[https://github.com/thoth-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/8) [tech/ThothTech-Documentation-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/8)

[Website/pull/8](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/8)

| +| Onyedikachi Okorie | Company Wide Meeting to Inform Students of our Processes, Policies, etc. |

Recording Link: https://deakin365- my.sharepoint.com/:v:/g/personal/s22146 0489_deakin_edu_au/EcIf- j14U_tEoNb7gBdoeKsBBSB_tAY2HNTFSjQ

NkIi5mQ

| +| Onyedikachi Okorie | Create a Welcome Message for the start of Trimester 3 | Message link: ONYEDIKACHI OKORIE: Welcome to Thoth tech | +|

Onyedikachi Okorie

|

Create a Commitment Participant Contract for Thoth Tech

|

[https://github.com/thoth-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/10) [tech/ThothTech-Documentation-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/10)

[Website/pull/10](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/10)

| +|

Onyedikachi Okorie

|

Compile and Submit 2.1P Task for Company Wide Submission

|

Teams link: Thoth Tech Company

Objectives and Structure T32023 -Task 2.1P.pdf

| +|

Onyedikachi

Okorie

|

Build the Company Website Home

Page, Nav Bar and Footer

|

[https://github.com/thoth-tech/Company-](https://github.com/thoth-tech/Company-Website/pull/1)

[Website/pull/1](https://github.com/thoth-tech/Company-Website/pull/1)

| +|

Onyedikachi

Okorie

|

Build the Blog Pages of the

Company Website

|

[https://github.com/thoth-tech/Company-](https://github.com/thoth-tech/Company-Website/pull/2)

[Website/pull/2](https://github.com/thoth-tech/Company-Website/pull/2)

| +|

Onyedikachi

Okorie

|

Build the OnTrack Page of the

Company Website

|

[https://github.com/thoth-tech/Company-](https://github.com/thoth-tech/Company-Website/pull/2)

[Website/pull/2](https://github.com/thoth-tech/Company-Website/pull/2)

| +|

Onyedikachi

Okorie

|

Generate an astro template for the

creation of the company website

|

[https://github.com/thoth-tech/Company-](https://github.com/thoth-tech/Company-Website/pull/1)

[Website/pull/1](https://github.com/thoth-tech/Company-Website/pull/1)

| +|

Onyedikachi Okorie

|

Create a Low-level Prototype Design for Thoth Tech Website

|

[https://github.com/thoth-](https://github.com/thoth-tech/ThothTech-Documentation-Website/commit/b392f554a2780c786f111b7b93313a7c9b297619) [tech/ThothTech-Documentation-](https://github.com/thoth-tech/ThothTech-Documentation-Website/commit/b392f554a2780c786f111b7b93313a7c9b297619)

[Website/commit/b392f554a2780c786f111](https://github.com/thoth-tech/ThothTech-Documentation-Website/commit/b392f554a2780c786f111b7b93313a7c9b297619) [b7b93313a7c9b297619](https://github.com/thoth-tech/ThothTech-Documentation-Website/commit/b392f554a2780c786f111b7b93313a7c9b297619)

| +|

Devanshi Patel

|

Compile a list all Technology Stacks for Thoth Tech

|

[https://github.com/thoth-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/21) [tech/ThothTech-Documentation-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/21)

[Website/pull/21](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/21)

| +|

SHIYU CHEN

|

Create an Org Chart for T3

|

[https://github.com/thoth-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/11) [tech/ThothTech-Documentation-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/11)

[Website/pull/11](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/11)

| +|

SHIYU CHEN

|

Migrate all Coursefow documentation to the

Documentation Website

|

[https://github.com/thoth-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/11) [tech/ThothTech-Documentation-](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/11)

[Website/pull/11](https://github.com/thoth-tech/ThothTech-Documentation-Website/pull/11)

| +|

SHIYU CHEN

|

Review the folders in Courseflow determine which folder they fall under (Projects, Documentation,

Issues and Resolution)

| | +|

ZHENJIE LAI

|

Migrate all Art Gallery documentation to the Documentation Website

|

[https://github.com/Eisen666/ThothTech-](https://github.com/Eisen666/ThothTech-Documentation-Website/tree/upstream/Eisen-new-artgallery) [Documentation-](https://github.com/Eisen666/ThothTech-Documentation-Website/tree/upstream/Eisen-new-artgallery) [Website/tree/upstream/Eisen-new-](https://github.com/Eisen666/ThothTech-Documentation-Website/tree/upstream/Eisen-new-artgallery)

[artgallery](https://github.com/Eisen666/ThothTech-Documentation-Website/tree/upstream/Eisen-new-artgallery)

| +|

ZHENJIE LAI

|

Review the folders in Art Gallery determine which folder they fall under (Projects, Documentation,

Issues and Resolution)

|

[https://github.com/Eisen666/ThothTech-](https://github.com/Eisen666/ThothTech-Documentation-Website/tree/upstream/Eisen-new-artgallery) [Documentation-](https://github.com/Eisen666/ThothTech-Documentation-Website/tree/upstream/Eisen-new-artgallery) [Website/tree/upstream/Eisen-new-](https://github.com/Eisen666/ThothTech-Documentation-Website/tree/upstream/Eisen-new-artgallery)

[artgallery](https://github.com/Eisen666/ThothTech-Documentation-Website/tree/upstream/Eisen-new-artgallery)

| + +### OnTrack + +#### Ontrack Overview, Goals, and Objectives + +This trimester Ontrack will be working dynamically across a variety of projects. We will be working +based on a priority system to get as many useful changes implemented as possible in the trimester. + +We will be breaking each project into smaller subcomponents to allow people to work across projects +in areas that are strong at or interested in. Everything should be completable in a 2- week sprint. + +#### OnTrack Aims for Trimester + +The Key projects we would like to see movement on this trimester would be: + +1. Improvements Backlog – This backlog has core improvements to the system we want to see. +2. Ontrack Bugs Backlog – These are bugs that are found and added to this backlog. +3. New Feature – Incorporate Content – Ideally, we have an additional 2 designs of how this would + work. It's not ready to code just yet. +4. New Feature – Staff Grant Extensions – Ideally, we have an additional 2 designs of how this would + work. It's not ready to code just yet. + +5. New Feature – Tutor Times – Ideally, we have 2 additional designs on how this would work. It's + not ready to code just yet. +6. Backlog Urgent Enhancements – These are important changes we are looking to get done as soon as + possible. +7. Documentation – We want to focus on updating the Front and Backend Documentation and testing in + this trimester. This will help students and other users better understand the system and how it + works. + +#### OnTrack Deliverables + +Our main deliverables will be based on story points completed in the Trello tasks; we are aiming for +students to complete between 5-6 Story points every 2-week sprint. + +### OnTrack Description of Progress + +#### Front end migration + +- 2 migrations in final review +- 6 in first stage review +- 1 major component being migrated + +#### Urgent Enhancements + +- codespace investgiation complete +- Sidekick investigation + +#### Numbas + +- group formed to progress Numbas +- Meeting to plan remaining work + +#### OnTrack Team Members and Contributions + +| Full Name | Trello Card Name | Evidence | +| :-------------------------------------- | :--------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +|

Brian Caldera

|

Replace fx-layout with tailwind equivalent -

hero-sidebar

|

| +|

Brian Caldera

|

Replace fx-layout with tailwind equivalent -

welcome

|

| +|

William Lowe

| Replace fx-layout with tailwind equivalent - hero-sidebar |

| +|

William Lowe

|

Replace fx-layout with

tailwind equivalent - welcome

|

| +|

William Lowe

|

Replace fx-layout with tailwind equivalent -

unit-dropdown

|

| +|

MINH THO DUONG

|

Replace fx-layout with tailwind equivalent -

footer

|

[https://github.com/thoth-tech/doubtfire-web/pull/107](https://github.com/thoth-tech/doubtfire-web/pull/107)

| +|

MINH THO DUONG

|

Replace fx-layout with tailwind equivalent -

inbox-comment

|

[https://github.com/s223749059/doubtfire-](https://github.com/s223749059/doubtfire-web/commit/f0c132a9b416e8b04f4573740190e5f47b9bd6c5) [web/commit/f0c132a9b416e8b04f4573740190e5f47b9bd6c5](https://github.com/s223749059/doubtfire-web/commit/f0c132a9b416e8b04f4573740190e5f47b9bd6c5)

| +|

MINH THO DUONG

|

Replace fx-layout with tailwind equivalent -

user-badge

|

[https://github.com/thoth-tech/doubtfire-web/pull/109](https://github.com/thoth-tech/doubtfire-web/pull/109)

| +|

MINH THO DUONG

|

Replace fx-layout with tailwind equivalent -

staff-task-list

|

[https://github.com/s223749059/doubtfire-](https://github.com/s223749059/doubtfire-web/commit/0c1ad0e7a5321c078f5ef44c32908d2363d08df8) [web/commit/0c1ad0e7a5321c078f5ef44c32908d2363d08df8](https://github.com/s223749059/doubtfire-web/commit/0c1ad0e7a5321c078f5ef44c32908d2363d08df8)

| +|

Satika Jayawardena

|

Replace fx-layout with tailwind equivalent -

footer

|

[https://github.com/thoth-tech/doubtfire-web/pull/107](https://github.com/thoth-tech/doubtfire-web/pull/107)

| +|

Satika Jayawardena

|

Replace fx-layout with tailwind equivalent -

unit-dropdown

|

[https://github.com/thoth-tech/doubtfire-web/pull/108](https://github.com/thoth-tech/doubtfire-web/pull/108)

| +|

Satika Jayawardena

|

Replace fx-layout with tailwind equivalent -

task-comment- composer

|

[https://github.com/thoth-tech/doubtfire-web/pull/120](https://github.com/thoth-tech/doubtfire-web/pull/120)

| +|

Satika Jayawardena

|

Replace fx-layout with tailwind equivalent -

user-badge

|

[https://github.com/thoth-tech/doubtfire-web/pull/109](https://github.com/thoth-tech/doubtfire-web/pull/109)

| +|

Katrine Chan

|

Update Contract for

doing more

|

[https://github.com/Katrine-Chan/ThothTech-Documentation-](https://github.com/Katrine-Chan/ThothTech-Documentation-Website/commit/03b6d791d4dac3943167d4dc5fbace4fe43eba90)

[Website/commit/03b6d791d4dac3943167d4dc5fbace4fe43eba90](https://github.com/Katrine-Chan/ThothTech-Documentation-Website/commit/03b6d791d4dac3943167d4dc5fbace4fe43eba90)

| +|

Syed Yahyya Hashmi

|

Replace fx-layout with tailwind equivalent - task-comment-

composer

|

[https://github.com/thoth-tech/doubtfire-web/pull/120](https://github.com/thoth-tech/doubtfire-web/pull/120)

| +|

YUHENG WANG

|

Replace fx-layout with tailwind equivalent -

calendar-modal

|

[https://github.com/AusBruce/doubtfire-](https://github.com/AusBruce/doubtfire-web/commit/6cb60744135dda3d5deda9ee159a6348adfc001a) [web/commit/6cb60744135dda3d5deda9ee159a6348adfc001a](https://github.com/AusBruce/doubtfire-web/commit/6cb60744135dda3d5deda9ee159a6348adfc001a)

| +|

Aidan Debernardi

|

Replace fx-layout with tailwind equivalent - task-assessment-

comment

|

[https://github.com/thoth-tech/doubtfire-web/pull/119](https://github.com/thoth-tech/doubtfire-web/pull/119)

| + +### Courseflow + +#### Courseflow Overview, Goals, and Objectives + +CourseFlow aims to assist students in planning and comprehending the requirements and structuring of +university courses. Users can generate and adjust their CourseMap to account for changes. For +instance, a student will be able to see their expected graduation date or complications that may +arise if they complete units in a particular order or study load. + +#### Courseflow Aims for Trimester + +- Create a detailed design for the project. +- Create a document that justifies the need for the Courseflow product. +- Generate a project roadmap +- Begin implementation on approved designs. + +#### Courseflow Deliverables + +The main deliverable is to produce a detailed design and structured roadmap for Courseflow by the +end of trimester 3. + +#### Courseflow Description of Progress + +1. **CourseFlow Software Design Document** + + - Analysed previous work done for CourseFlow. + - Re-designed CourseFlow based on analysis and re-established requirements and created a software + design document. + - After first review, updated software design document to treat CourseFlow as a new feature of + OnTrack. + - Added an ERD to model the data and their relationships with each other and OnTrack as part of + this new update. + +2. **University of Melbourne Course Planner Research Document** + + - Explored the UoM course planner to look at their features. + - Analysed data retrieved to see how it is structured for inspiration in CourseFlow's data + modelling. + +3. Enhancement of the current ERD with further breakdown of the data models. + +#### Courseflow Team Members and Contributions + +| **Full Name** | **Trello Card Name** | **Evidence** | +| :------------ | :----------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Mark Enriquez | Create Software Design Documentation Draft |

[cmarktopher/ThothTech-Documentation-](https://github.com/cmarktopher/ThothTech-Documentation-Website/tree/CourseFlow-Software-Design-Documentation)

[Website at CourseFlow-Software-Design-](https://github.com/cmarktopher/ThothTech-Documentation-Website/tree/CourseFlow-Software-Design-Documentation) [Documentation (github.com)](https://github.com/cmarktopher/ThothTech-Documentation-Website/tree/CourseFlow-Software-Design-Documentation)

| + +### Splash Kit + +#### Splash Kit Overview, Goals, and Objectives + +Splashkit is an all-purpose toolkit for beginners built in C++ and can be used with C++ and C#. +Deakin University uses it to introduce students to programming through its easy-to-use functions. + +As part of the Splashkit team, you will be responsible for expanding the toolkit functions, +developing improved and innovative ways of working with Splashkit and creating educational documents +and videos for students. + +#### Splash Kit Aims for Trimester + +See Card Status in Backlog for Additional details and Completed Research Cards. The following +projects and tasks stated below are what we aim to work on this trimester. + +#### SplashKit Arcade + +- Create an automated game download system for Arcade Machines + + - The proposed system will use the Arcade-games Repo to check for updates in the game version and + download the latest version + - Games should have a Publish tag or similar to be loaded to the main menu. + - Have a secondary game menu for test games/non-published. + +- Updates to Arcade Menu + + - Presently the Arcade machine uses Emulation Station forked from the RetorPI project version. + + - Create a new system for test games + - See if we can modify the EM menu for the following + - Trigger Game download scripts + - Additional modes + - Kiosk – Only show Published Games (for Events) + - Normal – Has Published and Test Systems + - Via script or other method have games exit after 10 min's if there's been no key Input + +- Stretch Goals/Interesting ideas + + - Consider a local Test Mode – Arcade Switches to AP mode displays connection info (random + password) and has a web server student can drop new game build on and tests. The machine Would + delete the game and reset after a period of time. + - Security would be a big consideration on this idea as it would be easy to abuse and not much + in the way of logging vs official upload via Git Hub. + - Implement a voting system on the Arcade Machine to give meaning to the star ranking. + + - Arcade Games – GitHub Actions + + - Correct C# for Arm (this should be done; see [trello card](https://trello.com/c/qeYlMImY) for + Status) + - Dotnet does not run correctly in the Emulated PI environment used for C++ games. New Action + was created for compiling dotnet vs Arm games small bug in checking logic to be fixed before + merge. + - Update Arcade – Games Readme + - Updated Controle to correctly reflect the Arcade machine + - Updated on new Compiling Process + - Instruct that All Game Assets must go into the Resources Folder (Action does try to capture + root directories like images, sound, etc.) This includes level maps etc., or they won't + upload to Arcade Machines + - Implement Versioning for compiled games. + - A simple version file in the games directory receives an incremental bump every time the + game is updated so the Arcade knows to get the latest version. + - This file can also contain additional information for the Arcade Menu. (Author, Publisher, + other) + - Retrieve and Compile Games from SubModules + - Formalise Process with Deakin Staff on how Students from Classes like SIT102 or SIT771 can + upload games to the Arcade Machine + - Barrier will be using GitHub for new students, especially as this will use submodules. + - Consider creating scripts to automate the linking of sub-modules + + - Move All games to Sub-Modules + - Games made by Toth-Tech should be moved to their own repo, (or we can consider a separate + Company if we don't want to crowd the Githubn too Much) + - This will potentially allow Linking to Other Student Repos. + +#### Splashkit Expansion + +- Priority Items Deployment Packages + + - Debian Package. + - Nuget Package. + - Brew Package. + +- Check for Further Functions from [Swin games](https://github.com/macite/swingame)to port into + splashkit. +- Fix Python Compatibility + + - Python can no longer be used to code games with SplashKit. Previous research indicates a change + with v3.8; see + [here](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Extensions/Python%20Compatibality/Research%20%26%20Findings/Python%20Changelog.md). + +- Look at Adding AI function to SplashKit + + - Can look at LLMs like ChatGPT + - Similar Functions to + +- Dev Container Mac + + - As most SplashKit Programs have a visual component and not browser-based based, we need a way to + view the program's window output. This is normally accomplished by xserver forwarding and sound + via pulse audio. + - Mac xquartz is a xserver compatible with Mac Instaitl Tests container that can be setup and run + x based programs e.g. xeyes but there is a compatibility issue with the graphics system in + SplashKit. Further investigation is needed. + +- SplashKit.io + + - Publish Astro Starlight site + - The Aim will be to convert Splashkit.io to our new webpage platform. + - Advise getting a subdomain like new.splashkit.io (or similar) setup for testing, and + Transition will just be a DNS change then + - Thorough documentation of the new site is needed + - The Existing SplashKit.io may have a function to auto-update the API pages based on functions + added to SplashKit. This should be investigated and replicated in the new site. + +- Game Engine + + - Project Setup: Create a streamlined project setup process for easier onboarding and development. + - Camera System: Implement a flexible and efficient camera system to handle different views and + perspectives. + - Transforms: Develop a system for handling object transformations like translation, rotation, and + scaling. + - Event System: Design an event system for handling game events in an extensible manner. + - Input Handling System: Implement a robust input handling system to manage user interactions. + +- Documentation Migration + - As the company is moving to a new documentation repository a data Migration will need to occur + between the existing documentation repo and the new one. + - Work with company operations to plan the migration, but the SplashKit team needs to move the + existing document over (also consider it a good opportunity to clean house and archive older + information) + +#### SplashKit Tutorials + +#### Backlog + +- Game Development + + - High Level Design + - Complete Demo Game + - 8. Creating a 2D "Metroidvania" Game - Enemies and Combat + - 10. Creating a 2D "Metroidvania" Game - Level Design and Progression + - 13. Creating a 2D "Metroidvania" Game - Polishing and Finalization + - 7. Creating a 2D "Metroidvania" Game - Camera Movement, Parallax and Depth + +- Tutorials and Documentation + + - Understanding SplashKit Manager - (SKM) Shell Commands - Tutorial + - Project Structure and Initialization + +- Roadmap (Future Plans) + - Integrate different stages of "Creating a 2D 'Metroidvania' Game" for cohesiveness and + consistency. + - Complete remaining tutorials + - Plans for new tutorials, ensuring total Splashkit Functionality + +#### SplashKit Deliverables + +Our main deliverables will be based on story points completed in the Trello tasks; we are aiming for +students to complete between 5-6 Story points every 2-week sprint. + +#### SplashKit Description of Progress + +##### Arcade + +- New game "Single Combat" (tetris style game) started with completed Design Proposal. +- Current arcade games being tested for bugs and potential improvements. +- Changes in progress for Runner Dash and Asteroids. +- Video created for a tutorial on setting up environment for contributing (SplashKit specific) - + currently awaiting mentor review. + +##### Tutorials + +- Master list of tutorials (created/proposed/needed) created. +- 1 tutorial awaiting mentor review. +- 4 tutorials currently in peer review. +- 3 tutorials in progress. + +##### Starlight SplashKit Website + +- Emoji's removed (although this was made redundant from upstream changes later on) +- 3 updates to graphics/functionality/layout awaiting mentor review. +- Backlog tasks created from pdf provided by upstream development team +- 3 updates to graphics/functionality/layout in progress. + +##### SplashKit Online IDE + +- Spike reports on Viability of continuing this project have been completed and approved. +- 9 updates currently in peer review. +- 5 updates in progress. + +#### **Team Members and Contributions** + +| **Full Name** | **Trello Card Name** | **Evidence** | +| :----------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +|

BRYAN

TAING

| Create an video ( or series of gifs) to make a tutorial of how to set up git environment for students wishing to contribute to Splash Kit. | | +|

BRYAN

TAING

|

Create backlog tasks

| | +|

BRYAN TAING

|

Create Design Proposal for Single Combat (tetris

style game)

|

| +|

BRYAN TAING

|

Asteroids: Add a sound effect when the ship

crashed into the Asteroid

| | +|

BRYAN TAING

|

7\. Creating a 2D "Metroidvania" Game - Camera Movement,

Parallax and Depth

|

| +|

BRYAN

TAING

|

Build an initial list of

tutorials

|

| +|

BRYAN TAING

|

Move Installation Guides

section to just above Troubleshooting

|

| +|

BRYAN TAING

|

Update Landing Page

Footer and Add Facebook Icon

|

| +|

BRYAN

TAING

|

Update some graphics

on the landing page

|

| +|

BRYAN

TAING

|

Remove Emoji's from all

parts that have them

|

| +|

Frankie Veri

|

Create an video (or series of gifs) to make a tutorial of how to set up git environment for

students wishing to contribute to Splash Kit.

| | +|

Frankie Veri

|

Asteroids: Add a sound effect when the ship

crashed into the Asteroid

| | +|

Frankie Veri

|

Move Installation Guides

section to just above Troubleshooting

|

| +| Frankie Veri | Create Backlog tasks | | +|

CASTIEL

MORDRED MCINTOSH

|

Develop basic art for Single Combat Game

|

| +|

CASTIEL

MORDRED MCINTOSH

|

Create Design Proposal

for Single Combat (tetris style game)

|

| +|

Jaron Chen

|

Adding Difficulty settings

to Runner Dash

|

| +|

Jaron Chen

|

Test the arcade games for bugs/issues and

potential improvements

|

| +|

Georgie

O'Malley

|

Sprite Animation -

Tutorial

|

| +|

Wenzong Xuan

|

2\. Creating a 2D "Metroidvania" Game - Project Structure and

Initialization

|

| +|

Wenzong

Xuan

|

Using JSON Files -

Tutorial Proposal

|

| +|

Wenzong Xuan

|

10\. Creating a 2D "Metroidvania" Game - Level Design and

Progression

|

| +|

Wenzong Xuan

|

7\. Creating a 2D "Metroidvania" Game - Camera Movement,

Parallax and Depth

|

| +|

Sean Boettger

|

2\. Creating a 2D "Metroidvania" Game - Project Structure and

Initialization

|

| +|

Sean

Boettger

|

Build an initial list of

tutorials

|

| +|

Sean

Boettger

|

Add full project

download/upload

|

| +|

Sean

Boettger

|

Update SplashKitOnline

Repository Readme

|

| +|

Sean

Boettger

|

Fix polling based input

|

[https://github.com/WhyPenguins/splashkit-core/tree/fix-](https://github.com/WhyPenguins/splashkit-core/tree/fix-initialization-and-input)

[initialization-and-input](https://github.com/WhyPenguins/splashkit-core/tree/fix-initialization-and-input)

| +|

Sean Boettger

|

Add file management/browser

for internal FS

|

| +|

Sean

Boettger

|

Formalize make process

for Emscripten port

|

[https://github.com/WhyPenguins/splashkit-](https://github.com/WhyPenguins/splashkit-core/tree/emscripten-cmake)

[core/tree/emscripten-cmake](https://github.com/WhyPenguins/splashkit-core/tree/emscripten-cmake)

| +|

Sean

Boettger

|

Setup WebIDL binding

|

[https://github.com/WhyPenguins/splashkit-](https://github.com/WhyPenguins/splashkit-core/tree/emscripten-webidllibrary)

[core/tree/emscripten-webidllibrary](https://github.com/WhyPenguins/splashkit-core/tree/emscripten-webidllibrary)

| +|

Sean Boettger

|

Automate WebIDL binding generation

(prototype level)

|

[https://github.com/WhyPenguins/splashkit-](https://github.com/WhyPenguins/splashkit-core/tree/webidlbinding-generation) [core/tree/webidlbinding-generation](https://github.com/WhyPenguins/splashkit-core/tree/webidlbinding-generation)

| +|

Sean Boettger

|

Incorporate SplashKit WASM build into

SplashKitOnline

|

| +|

Sean

Boettger

|

Add Javascript execution

to SplashKitOnline

|

| +|

Sean Boettger

|

Spike Report - Viability of continuing with SplashKit

Online

|

| +|

TAIMING XU

|

Update Landing Page Footer and Add

Facebook Icon

|

| +|

TED WANG

|

Update some graphics

on the landing page

|

| +|

Ayan

Masood

|

Remove Emoji's from all

parts that have them

|

| diff --git a/src/content/docs/companywidesubmissions/company-structure-and-objectives-for-2023-TRIMESTER-3.md b/src/content/docs/companywidesubmissions/company-structure-and-objectives-for-2023-TRIMESTER-3.md new file mode 100644 index 00000000..78e0f699 --- /dev/null +++ b/src/content/docs/companywidesubmissions/company-structure-and-objectives-for-2023-TRIMESTER-3.md @@ -0,0 +1,424 @@ +--- +title: Thoth Tech - Company Structure and Objectives for 2023 TRIMESTER 3 +description: 2.1P Task, T3 2023 +--- + +## Executive Summary + +Thoth Tech is a software development company currently building from the ground up in Melbourne, +Australia. + +Thoth Tech’s mission is to build, operate, and deploy education technologies, creating tools that +enhance education outcomes by empowering students, connecting them with tutors, and facilitating +personalised learning experiences. + +We value our people, and we value excellence. We are people-focused, aiming to produce sustainable +products of excellent quality, and provide frameworks that supply a safe environment for learning +and support of our team. + +This report will outline the company structure, charter, objectives–both short and long term, and +explore each product’s goals. + +In trimester 3, Thoth Tech would be running three products namely: OnTrack, Splash Kit, and Company +Operations. In addition to the three main products, the Courseflow project would undergo a rigorous +planning phase were the benefits, aims, and solution design would be generated to create a structure +for the project in subsequent trimesters. Students would be allocated to any of the three products +and would be required to contribute to achieve the objectives of the product. + +Company Operations oversees the entire affairs of Thoth Tech and strives to make things easier. +Effective operations are important for maintaining a successful business. As other product teams +focus to develop new features and upgrade existing products, we would be working to ensure that +appropriate industry guidelines and standards are followed to produce world class products. We +document the tools and processes that Thoth tech uses in its daily operations and research new +options that could serve the company better. + +OnTrack is one of the bigger projects in the company and is a live production system that is in use +at Deakin University, it has been consistently improved and built upon to provide an exceptional +learning tool for students and staff at Deakin. Its technology stack consists of a Ruby on Rails +back end and an Angular JS / Angular 15 front end. There are a variety of projects to enhance and +upgrade this product that students can work on. + +SplashKit is currently a 2D game development Software Development Kit used to teach object-oriented +coding to beginners. It has been identified that SplashKit can be expanded to explore other areas +and languages. + +## Leadership Team + +### Company Directors + +- Andrew Cain, Managing Director + +### Mentors + +- OnTrack & Courseflow - Daniel Maddern +- SplashKit – Olivia McKeon +- Company Operations – Amin Abken + +## Trimester Goals and Objectives + +Thoth Tech will aim to achieve the goals listed below: + +### Goal 1: Foster employees' growth in a safe and supportive environment to equip them with the soft and technical skills needed upon graduation + +- Create an environment where the amount of work is distrusted evenly amongst roles and + contributors. +- Utilise processes and tools that require collaboration and fosters growth such as Google Suite or + Pull Reviews. +- Educate and Empower skill growth and knowledge sharing. +- Enhance onboarding experience for future employees. +- Ensure a supportive environment is provided for all employees regardless of race, gender or other + differences to allow every employee to thrive. + +### Goal 2: Extend the Existing Thoth Tech Applications based on the Director’s Visions + +- Improve existing features of the Thoth Tech applications and extend the platforms. +- Have a mentality of self-improvement and find/squash bugs related to non-technical and technical + issues. +- Maintain security guidelines and industry best standards. +- Embrace an ethic of communicating with non-technical stakeholders through diagrams and other + methods of documentation to help future employees and investors. + +### Goal 3: Revise and Maintain Company Operations + +- Improve existing company policies based on employee feedback and director advice +- Educate future employees and develop a process to consider the bus factory +- Allow company operations to be a smooth process for nurturing new company operation members. +- Establish documentation and guidelines to allow anyone to understand the company operation. + +### Company Charter + +The Thoth Tech charter is a crucial tool for guiding our team, navigating decisions, establishing +boundaries, and aligning the team on how we work together. It defines how as a company we work +together to achieve success. + +Our charter comprises of the following: + +1. Mission: As a team, what are we trying to achieve? +2. Values: What do we care about? +3. Team Culture: How will we work together, what do we expect? +4. Roles: What roles do we need and what are the responsibilities of each role? +5. Metrics of Success: What does success look like to us? +6. Standards of Quality: What are our standards for high quality work? Mission To build, operate and + deploy world class education technologies. + +This is achieved by creating tools that enhance education outcomes by empowering students, +connecting them with tutors and facilitating personalised learning experiences. Values Our values +describe how we work, what we represent, and guide us to be the kind of company and team members we +want to be. + +When we live up to these values we will: Be people-focused We expect the best from each other, give +each other the benefit of the doubt, encourage each other to take initiative to improve ourselves +and the company, and provide direct and constructive help to each other. We collaborate with +kindness while being respectful of each other. Uphold sustainable excellence We create working, +maintainable, and understandable software that is enjoyable and easy to use. + +We strive to do it in a way that is sustainable for our team members and for our environment. Be +inclusive and supportive We celebrate diverse perspectives and embrace uncomfortable ideas and +conversations. We facilitate an environment in which all team members feel psychologically safe +enough to make requests for what they need to do their job. We learn through failures while +continually working to make things better. + +## Company Structure and Projects Overview + +### Company Structure + +![org chart](/picture.png) + +### Projects Overview + +#### Company Operations + +#### Overview, Goals, and Objectives + +This team oversees the entire operations of Thoth Tech and strives to make things easier. We aim to +make the onboarding process as smooth and clear as possible, as well as increase the knowledge of +our seniors in meaningful ways while creating policies to improve the wellbeing of all company +employees. In the short term, we would like to create documentations, policies, workflows, and +processes that are relevant to improve the company’s outlook and overall productivity. In the long +term, we aim to ensure that all policies created are being adhered to and the Documentation website +is being utilized to store all project documentation. + +#### Aims for Trimester + +- Enforce created policies. +- Migrate all project documentation to the Documentation website. +- Dockerize the Documentation website +- Create a website to showcase Thoth Tech products and projects. +- Oversee the entire operations of the company. + +#### Deliverables + +- Design document for Thoth Tech company website. +- Published company website +- Docker image for documentation website published to GitHub. +- Students completely adhere to created policies and guidelines + +#### Team Members + +| Student Name | Role | +| -------------------- | ----------- | +| Jason Galleti | Team Member | +| Chinonyerem Victoria | Team Member | +| Shiyu Chen | Team Member | +| Eisen Lai | Team Member | +| Frankie Veri | Team Member | +| Onyedikachi Okorie | Team Member | +| Quinn Curtis | Team Member | +| Ivan Aquino | Team Member | +| Devanshi Patel | Team Member | +| Ted Wang | Team Member | + +### OnTrack + +#### Ontrack Overview, Goals, and Objectives + +This trimester Ontrack will be working dynamically across a variety of projects. We will be working +based on a priority system to get as many useful changes implemented as possible in the trimester. + +We will be breaking each project into smaller subcomponents to allow people to work across projects +in areas that are strong at or interested in. Everything should be completable in a 2- week sprint. + +#### OnTrack Aims for Trimester + +The Key projects we would like to see movement on this trimester would be: + +1. Improvements Backlog – This backlog has core improvements to the system we want to see. +2. Ontrack Bugs Backlog – These are bugs that are found and added to this backlog. +3. New Feature – Incorporate Content – Ideally, we have an additional 2 designs of how this would + work. It's not ready to code just yet. +4. New Feature – Staff Grant Extensions – Ideally, we have an additional 2 designs of how this would + work. It's not ready to code just yet. + +5. New Feature – Tutor Times – Ideally, we have 2 additional designs on how this would work. It's + not ready to code just yet. +6. Backlog Urgent Enhancements – These are important changes we are looking to get done as soon as + possible. +7. Documentation – We want to focus on updating the Front and Backend Documentation and testing in + this trimester. This will help students and other users better understand the system and how it + works. + +#### OnTrack Deliverables + +Our main deliverables will be based on story points completed in the Trello tasks; we are aiming for +students to complete between 5-6 Story points every 2-week sprint. + +#### OnTrack Team Members + +| Student Name | Role | +| --------------------------- | ----------- | +| Aidan Debernardi | Team Member | +| Katrine Kit Chan | Team Member | +| Minh Tho Duong (Minh Tho) | Team Member | +| Samadhi Weerasingha (Sam) | Team Member | +| Brian Caldera | Team Member | +| Mark Enriquez | Team Member | +| Syed Yahyya Hashmi (HASHMI) | Team Member | +| William Lowe (Will) | Team Member | +| Satika Jayawardena | Team Member | +| Jayani Vimukthaika | Team Member | +| Bruce Wang | Team Member | + +### Courseflow + +#### Courseflow Overview, Goals, and Objectives + +CourseFlow aims to assist students in planning and comprehending the requirements and structuring of +university courses. Users can generate and adjust their CourseMap to account for changes. For +instance, a student will be able to see their expected graduation date or complications that may +arise if they complete units in a particular order or study load. + +#### Courseflow Aims for Trimester + +- Create a detailed design for the project. +- Create a document that justifies the need for the Courseflow product. +- Generate a project roadmap +- Begin implementation on approved designs. + +#### Courseflow Deliverables + +The main deliverable is to produce a detailed design and structured roadmap for Courseflow by the +end of trimester 3. + +#### Courseflow Team Members + +| Student Name | Role | +| ------------- | ----------- | +| Mark Enriquez | Team Member | + +### Splash Kit + +#### Splash Kit Overview, Goals, and Objectives + +Splashkit is an all-purpose toolkit for beginners built in C++ and can be used with C++ and C#. +Deakin University uses it to introduce students to programming through its easy-to-use functions. + +As part of the Splashkit team, you will be responsible for expanding the toolkit functions, +developing improved and innovative ways of working with Splashkit and creating educational documents +and videos for students. + +#### Splash Kit Aims for Trimester + +See Card Status in Backlog for Additional details and Completed Research Cards. The following +projects and tasks stated below are what we aim to work on this trimester. + +#### SplashKit Arcade + +- Create an automated game download system for Arcade Machines + + - The proposed system will use the Arcade-games Repo to check for updates in the game version and + download the latest version + - Games should have a Publish tag or similar to be loaded to the main menu. + - Have a secondary game menu for test games/non-published. + +- Updates to Arcade Menu + + - Presently the Arcade machine uses Emulation Station forked from the RetorPI project version. + + - Create a new system for test games + - See if we can modify the EM menu for the following + - Trigger Game download scripts + - Additional modes + - Kiosk – Only show Published Games (for Events) + - Normal – Has Published and Test Systems + - Via script or other method have games exit after 10 min's if there's been no key Input + +- Stretch Goals/Interesting ideas + + - Consider a local Test Mode – Arcade Switches to AP mode displays connection info (random + password) and has a web server student can drop new game build on and tests. The machine Would + delete the game and reset after a period of time. + - Security would be a big consideration on this idea as it would be easy to abuse and not much + in the way of logging vs official upload via Git Hub. + - Implement a voting system on the Arcade Machine to give meaning to the star ranking. + + - Arcade Games – GitHub Actions + + - Correct C# for Arm (this should be done; see [trello card](https://trello.com/c/qeYlMImY) for + Status) + - Dotnet does not run correctly in the Emulated PI environment used for C++ games. New Action + was created for compiling dotnet vs Arm games small bug in checking logic to be fixed before + merge. + - Update Arcade – Games Readme + - Updated Controle to correctly reflect the Arcade machine + - Updated on new Compiling Process + - Instruct that All Game Assets must go into the Resources Folder (Action does try to capture + root directories like images, sound, etc.) This includes level maps etc., or they won't + upload to Arcade Machines + - Implement Versioning for compiled games. + - A simple version file in the games directory receives an incremental bump every time the + game is updated so the Arcade knows to get the latest version. + - This file can also contain additional information for the Arcade Menu. (Author, Publisher, + other) + - Retrieve and Compile Games from SubModules + - Formalise Process with Deakin Staff on how Students from Classes like SIT102 or SIT771 can + upload games to the Arcade Machine + - Barrier will be using GitHub for new students, especially as this will use submodules. + - Consider creating scripts to automate the linking of sub-modules + + - Move All games to Sub-Modules + - Games made by Toth-Tech should be moved to their own repo, (or we can consider a separate + Company if we don't want to crowd the Githubn too Much) + - This will potentially allow Linking to Other Student Repos. + +#### Splashkit Expansion + +- Priority Items Deployment Packages + + - Debian Package. + - Nuget Package. + - Brew Package. + +- Check for Further Functions from [Swin games](https://github.com/macite/swingame)to port into + splashkit. +- Fix Python Compatibility + + - Python can no longer be used to code games with SplashKit. Previous research indicates a change + with v3.8; see + [here](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Extensions/Python%20Compatibality/Research%20%26%20Findings/Python%20Changelog.md). + +- Look at Adding AI function to SplashKit + + - Can look at LLMs like ChatGPT + - Similar Functions to + +- Dev Container Mac + + - As most SplashKit Programs have a visual component and not browser-based based, we need a way to + view the program's window output. This is normally accomplished by xserver forwarding and sound + via pulse audio. + - Mac xquartz is a xserver compatible with Mac Instaitl Tests container that can be setup and run + x based programs e.g. xeyes but there is a compatibility issue with the graphics system in + SplashKit. Further investigation is needed. + +- SplashKit.io + + - Publish Astro Starlight site + - The Aim will be to convert Splashkit.io to our new webpage platform. + - Advise getting a subdomain like new.splashkit.io (or similar) setup for testing, and + Transition will just be a DNS change then + - Thorough documentation of the new site is needed + - The Existing SplashKit.io may have a function to auto-update the API pages based on functions + added to SplashKit. This should be investigated and replicated in the new site. + +- Game Engine + + - Project Setup: Create a streamlined project setup process for easier onboarding and development. + - Camera System: Implement a flexible and efficient camera system to handle different views and + perspectives. + - Transforms: Develop a system for handling object transformations like translation, rotation, and + scaling. + - Event System: Design an event system for handling game events in an extensible manner. + - Input Handling System: Implement a robust input handling system to manage user interactions. + +- Documentation Migration + - As the company is moving to a new documentation repository a data Migration will need to occur + between the existing documentation repo and the new one. + - Work with company operations to plan the migration, but the SplashKit team needs to move the + existing document over (also consider it a good opportunity to clean house and archive older + information) + +#### SplashKit Tutorials + +#### Backlog + +- Game Development + + - High Level Design + - Complete Demo Game + - 8. Creating a 2D "Metroidvania" Game - Enemies and Combat + - 10. Creating a 2D "Metroidvania" Game - Level Design and Progression + - 13. Creating a 2D "Metroidvania" Game - Polishing and Finalization + - 7. Creating a 2D "Metroidvania" Game - Camera Movement, Parallax and Depth + +- Tutorials and Documentation + + - Understanding SplashKit Manager - (SKM) Shell Commands - Tutorial + - Project Structure and Initialization + +- Roadmap (Future Plans) + - Integrate different stages of "Creating a 2D 'Metroidvania' Game" for cohesiveness and + consistency. + - Complete remaining tutorials + - Plans for new tutorials, ensuring total Splashkit Functionality + +#### SplashKit Deliverables + +Our main deliverables will be based on story points completed in the Trello tasks; we are aiming for +students to complete between 5-6 Story points every 2-week sprint. + +#### SplashKit Team Members + +| Student Name | Role | +| -------------------------- | ----------- | +| Ayan Masood | Team Member | +| Georgie O'Malley | Team Member | +| Jaron Chen | Team Member | +| Pratham Gupta | Team Member | +| Samnang (Bryan) Taking | Team Member | +| Castiel Mcintosh | Team Member | +| Franco John (Frankie) Veri | Team Member | +| Jinwen (Leo) Liu | Team Member | +| Sean Boettger | Team Member | +| Taiming Xu | Team Member | +| Wenzong Xuan | Team Member | +| Yuheng (Bruce) Wang | | diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index 1e45871c..4ac90a4c 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -9,8 +9,8 @@ hero: link: /products/products/ icon: right-arrow variant: primary - - text: How to Use Starlight - link: https://deakin365.sharepoint.com/:v:/r/sites/ThothTech2/Shared%20Documents/General/Instructional%20Video%20-%20How%20To%20Upload%20Documents%20to%20Starlight.mp4?csf=1&web=1&e=s26lMo + - text: FAQ + link: /reference/faq/ icon: right-arrow variant: primary --- @@ -20,19 +20,17 @@ import { Card, LinkCard, CardGrid } from "@astrojs/starlight/components"; ## About Us: - Thoth tech creates tools that enhance education outcomes by empowering - students, connecting them with tutors and facilitating personalised learning - experiences. Values Our values describe how we work, what we represent, and - guide us to be the kind of company and team members we want to be. When we - live up to these values we will: Be people-focused We expect the best from - each other, give each other the benefit of the doubt, encourage each other to - take initiative to improve ourselves and the company, and provide direct and - constructive help to each other. We collaborate with kindness while being - respectful of each other. Uphold sustainable excellence We create working, - maintainable, and understandable software that is enjoyable and easy to use. 8 - We strive to do it in a way that is sustainable for our team members and for - our environment. Be inclusive and supportive We celebrate diverse perspectives - and embrace uncomfortable ideas and conversations. + Thoth tech creates tools that enhance education outcomes by empowering students, connecting them + with tutors and facilitating personalised learning experiences. Values Our values describe how we + work, what we represent, and guide us to be the kind of company and team members we want to be. + When we live up to these values we will: Be people-focused We expect the best from each other, + give each other the benefit of the doubt, encourage each other to take initiative to improve + ourselves and the company, and provide direct and constructive help to each other. We collaborate + with kindness while being respectful of each other. Uphold sustainable excellence We create + working, maintainable, and understandable software that is enjoyable and easy to use. 8 We strive + to do it in a way that is sustainable for our team members and for our environment. Be inclusive + and supportive We celebrate diverse perspectives and embrace uncomfortable ideas and + conversations. @@ -46,11 +44,7 @@ import { Card, LinkCard, CardGrid } from "@astrojs/starlight/components"; description="Learn how Thoth Tech functions." href="/processes/introduction/" /> - + + +## Thoth Tech Products and Mentors + +By the end of week 1, it is expected that everyone has been assigned to a team and has engaged with +the product leads and mentors. In any product/team you find yourself ensure that you follow the +rules and guidelines of the team. Only 3 Thoth Tech products would be worked on this trimester. The +products and respective mentors are listed below. + +1. Ontrack: Daniel Maddern +2. SplashKit: Olivia McKeon +3. Company Operations: Amin Abken + +For every product, the mentors would hold at least 2 weekly meetings, and this would also serve as +the products weekly meetings where every member of the team converges to discuss the product +objective, populate Trello board, assign tasks, and discuss any roadblocks or impediments. + +## Contributing and Producing Acceptable Evidence + +Useful tips to contributing in your assigned teams + +- The outcome of every task assigned to you would be required to be published to your teams GitHub + repo. The GitHub link for every product can be found by clicking the product + [here](https://main--strong-fairy-c1bde1.netlify.app/products/products/). +- To ensure you are accurately publishing to GitHub, review the GitHub policy + [here](https://main--strong-fairy-c1bde1.netlify.app/policies/github-management-policy/). +- All documents are written in Markdown. +- Tasks would be assigned to you via the Trello board. + +**Important!!** + +- When you raise a Pull request, it needs to be reviewed by another student after which the student + who reviewed would leave a comment on the PR stating if it can be progressed to be approved by the + mentor. +- Watch the video provided in this + [link](https://deakin365.sharepoint.com/sites/ThothTech2/_layouts/15/stream.aspx?id=%2Fsites%2FThothTech2%2FShared%20Documents%2FOnTrack%2Fpull%2Drequest%2Ddemo%2Emov&nav=eyJwbGF5YmFja09wdGlvbnMiOnsic3RhcnRUaW1lSW5TZWNvbmRzIjo1LjQyNzM2OH19&referrer=StreamWebApp%2EWeb&referrerScenario=AddressBarCopied%2Eview) + to make Pull Requests and Peer Review fellow students work + +## Providing acceptable evidence + +This trimester every evidence provided must have an associated Pull Request. Some ways to ensure you +can produce acceptable evidence are. + +1. Any research work should be documented using our Spike template and published to your products + GitHub repo. The Spike Plan Template can be found + [here](https://github.com/thoth-tech/documentation/blob/main/docs/Templates/SpikePlan-Template.md) +2. Any solution testing performed (whether successful or not) should be documented using our Spike + template. The Spike Outcome Template can be found + [here](https://github.com/thoth-tech/documentation/blob/main/docs/Templates/SpikeOutcome-Template.md) +3. Any change to a product in development or production stage should be pushed to the relevant + GitHub repo. +4. Document all hours in your personal/team worklog. Every student must complete a minimum of 120 + hours to pass the unit. diff --git a/src/content/docs/policies/Enthusiastic Participant Agreement.md b/src/content/docs/policies/Enthusiastic Participant Agreement.md new file mode 100644 index 00000000..b8145fa9 --- /dev/null +++ b/src/content/docs/policies/Enthusiastic Participant Agreement.md @@ -0,0 +1,41 @@ +--- +title: Enthusiastic Participant Agreement +--- + +### Welcome aboard! + +We're thrilled to have you on this journey. This agreement marks the collaborative spirit between +you - our enthusiastic participant – and Thoth Tech. + +### Our Objective: + +Our aim is to create an environment where enthusiastic participants can invest extra hours, blending +creativity and expertise to craft something truly exceptional. This project isn't just about grades; +it's an opportunity to create something you will be proud of long after your studies. + +### Commitments: + +1. Time Commitment: We agree to dedicating additional time, bringing our best efforts to the + table each week. +2. Regular Meetings: We’ll meet consistently and promptly to discuss progress, address + challenges, and plan our collective next steps. +3. Task Allocation: Leveraging our unique strengths, we'll assign roles that match our skills + and trust each other to effectively fulfill these roles within set timelines. +4. Open Communication: Transparent and responsive communication remains essential. We’ll stay + in touch regularly through our preferred channels. +5. Documenting the Journey: Maintaining a record of our project’s journey is vital. We'll + document requirements, track progress, and shares updates along the way. +6. Quality Assurance: Quality is non-negotiable. Regular checks and reviews will ensure our + work meets Thoth Tech’s high standards. +7. Duration: This agreement is effective from the moment we sign it and will go on until the + end of trimester 3. If needed, extensions may be discussed depending on project’s requirements. + +### If Things Don't Go as Planned: + +We understand that life happens. If sticking to these commitments becomes challenging, let’s talk +and find a solution together. No penalties – just support. + +### Let's Get Started! + +This isn't just an agreement; it’s our commitment to collaborate and create something phenomenal. +Let’s kick-start this journey together! diff --git a/src/content/docs/processes/thoth-tech-technology-stack.md b/src/content/docs/processes/thoth-tech-technology-stack.md new file mode 100644 index 00000000..d4addcb5 --- /dev/null +++ b/src/content/docs/processes/thoth-tech-technology-stack.md @@ -0,0 +1,155 @@ +--- +title: Thoth Tech Technology Stack Document +--- + +This document outlines the technology stack used across all products at Thoth Tech Company. The +primary reason for creating this document was to showcase the various kinds of technologies being +used across different products, along with the skills required for those who are interested in +joining a product. + +### Company Operations + +#### Tools used in Company Operations + +- GitHub +- Trello Board + +#### Languages used in Company Operations + +- Markdown +- Typescript +- Tailwind CSS +- Python +- Astro + +#### Software used in Company Operations + +- Microsoft Teams +- Visual Studio Code +- Astro Starlight +- Netlify + +#### Skills required to work within Company Operations product + +- Having leadership skills will be necessary for collaboration within team and providing support to + other team members. +- Being creative and innovative in contributing to the product by generating new ideas to improve + the overall product. +- Proficiency in TypeScript, Tailwind CSS and python will be beneficial. +- Being creative and innovative when it comes to the development of the product. +- Having strong project management skills is required for better planning, organisation, and + completion of tasks. +- Knowledge and skills in data science will be helpful. + +### OnTrack + +#### Tools used in OnTrack + +- GitHub +- Git +- Trello Board + +#### Languages used in OnTrack + +- Markdown +- Angular JS +- Angular 17 with Angular JS using coffee script +- Angular 17 using Typescript +- HTML +- SCSS +- Ruby on Rails Grape +- Tailwind CSS +- TypeScript + +#### Software used in OnTrack + +- Microsoft Teams +- Visual Studio Code +- Docker Desktop +- MariaDB Database + +#### Skills required to work within Ontrack product + +- Having solid understanding of frontend and backend. +- Being familiar with GitHub, will ensure smooth onboarding within the product. +- Proficiency in using Visual Studio tool for coding. +- Having knowledge about range of Angular will be beneficial in terms of doing Trello board tasks. +- Understanding of TypeScript for Angular 17 is required. +- Strong knowledge in HTML and SCSS is required for wed applications. +- Understanding or experience is necessary when it comes to working with Ruby on Rails Grape + framework for building APIs in the backend. +- Having knowledge about MariaDB database for storing data will be beneficial. +- Willing to adapt new technologies and tools over time. +- Positive attitude toward learning range of new skills such as Angular/ Typescript and Ruby. + +### SplashKit + +#### Tools used in SplashKit + +- GitHub +- Git +- GitHub Actions +- Trello Board +- Raspberry Pi + +#### Languages used in SplashKit + +- Markdown +- C++ +- C# +- Bash Scripts + +#### Software used in SplashKit + +- Microsoft Teams +- Visual Studio Code +- Docker Desktop +- WSL +- SharePoint +- Clockify +- Astro Starlight + +#### Skills required to work within SplashKit product + +- Having solid understanding of C++ and C# is required. +- Having the ability to figure out syntax of the other programming languages, even if not confident + in C++ and C#. +- When it comes to working with arcade machine, having knowledge of Linux based systems is + beneficial for Raspberry Pi work. +- For starlight version of splashkit.io having basic web development experience and understanding of + website design is useful. But it is not mandatory to have such experience since individual can put + extra effort to learn the basic. +- In terms of the SplashKit expansion, the ability to update the SplashKit library and functionality + is important. + +### CourseFlow + +#### Tools used in CourseFlow + +- GitHub +- Trello Board +- Figma +- Draw.io (now integrated into diagrams.net) + +#### Languages used in CourseFlow + +- Markdown +- Ruby on Rails +- TypeScript (for creating frontend web applications using Angular) + +#### Software used in CourseFlow + +- Microsoft Teams +- Visual Studio Code +- Docker + +#### Skills required to work within CourseFlow product + +- CourseFlow uses Angular for the frontend, so having knowledge in that area would be beneficial. + For example, if a person has skills in web technologies, picking up Angular wouldn’t be hard. +- Having skills in creating backend APIs in any language is valuable. For example, if a person + hasn’t used ruby on rails before but have experience in using ASP.net and Express.js for backend + development, they would manage to pick it up. +- Having machine learning skills is important as it helps with categorizing courses and units based + on their description. +- From non-technical perspective, self-management, and desire to learn is very important. diff --git a/src/content/docs/products/art-gallery/Documentation/BackendUpgrades/AsynchronyProposal.md b/src/content/docs/products/art-gallery/Documentation/BackendUpgrades/AsynchronyProposal.md new file mode 100644 index 00000000..1ed23a92 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/BackendUpgrades/AsynchronyProposal.md @@ -0,0 +1,94 @@ +--- +title: + Proposal:Leveraging Asynchrony in our C# API for Improved Performance and Responsiveness into the + Future +--- + +Author: Chloe Hulme + +## Objective + +The objective of this proposal is to outline the concept of asynchrony in an API, highlight the +benefits of implementing asynchrony in our C# based API, and provide guidelines along with sample +code for effectively incorporating asynchrony into our API design this trimester. + +### Introduction to Asynchrony in APIs + +Asynchrony in APIs refers to the ability to perform operations concurrently without blocking the +main thread of execution. Traditionally, APIs perform tasks synchronously, meaning they execute one +operation at a time and wait for each operation to complete before moving to the next one. Whereas, +asynchronous APIs allow multiple operations to be executed in parallel, which significantly enhances +performance and responsiveness. Particularly across larger data sets. + +### Benefits of Implementing Asynchrony in our API + +Implementing asynchrony in our API offers several advantages: + +- Improved responsiveness: Asynchrony will enable our application to remain responsive to user + interactions even while performing resource-intensive operations such as network requests and + database queries. + +- Enhanced performance: By allowing multiple tasks to run concurrently, we can take advantage of + multi-core processors, leading to improved throughput and reduced execution times. + +- Scalability: Asynchronous APIs are particularly beneficial in scenarios with a large number of + users. They enable the API to handle more simultaneous requests without causing bottlenecks. We + can secure the future performance of our API by implementing asynchrony, so that we are prepared + to handle larger volumes of traffic once we have deployed. + +- Efficient resource utilization: Asynchronous operations can release system resources while waiting + for tasks to complete, allowing the system to utilize these resources for other tasks. + +- Better user experience: Users will experience quicker response times and smoother interactions + with our applications if we utilize asynchronous APIs, enhancing overall user satisfaction once we + inevitably deploy. + +### Guidelines for Implementing Asynchrony + +When implementing asynchrony in a C# API, reviewing the following guidelines will ensure efficient +and reliable design: + +1. Identify blocking operations: Identify operations that could potentially block the main thread. + In our case this is primarily database queries. + +2. Use the `async` and `await` keywords: Utilize the `async` and `await` keywords to mark methods as + asynchronous and to await the completion of asynchronous tasks, respectively. This allows the + main thread to continue processing other tasks while waiting for the asynchronous task to finish. + +3. Return `Task` or `Task`: Modify the method signatures to return `Task` or `Task` types to + indicate that the method is asynchronous and returns a task representing the operation. + +4. Avoid mixing synchronous and asynchronous code: Try to keep your codebase consistent by avoiding + mixing synchronous and asynchronous code within the same method, as it can lead to confusion and + potential deadlocks. We will keep our ADO.NET implementation synchronous, as our Repository + Pattern (RP) implementation is more favourable. We will hence implement asynchrony in our RP + implementation, replacing the synchronous database queries. + +5. Handle errors gracefully: Implement error handling mechanisms, including try-catch blocks or + async-specific error handling, to manage exceptions that might occur during asynchronous + operations. + +### Sample Code + +Here's a simple example of how to implement an asynchronous API method in C#: + +```csharp +public class BasicAPIService +{ + public async Task GetDataAsync() + { + // Simulate an asynchronous operation (e.g., fetching data from a remote server) + await Task.Delay(2000); // Simulating a 2 second delay + return "Data fetched successfully!"; + } +} +``` + +## Conclusion + +Incorporating asynchrony into our API will lead to substantial improvements in performance, +responsiveness, and overall user experience. We are able to future-proof our API in terms of +handling many user requests, and queries to large data setsas our database grows post-deployment. By +following the guidelines outlined in this proposal, we can leverage asynchrony to handle +resource-intensive tasks while maintaining application responsiveness. This will have lasting +benefits for our company and product into the future. diff --git a/src/content/docs/products/art-gallery/Documentation/BackendUpgrades/NET8Migration.md b/src/content/docs/products/art-gallery/Documentation/BackendUpgrades/NET8Migration.md new file mode 100644 index 00000000..67673802 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/BackendUpgrades/NET8Migration.md @@ -0,0 +1,129 @@ +--- +title: A Complete Guide:Migrating the Art Gallery API to .NET8 +--- + +Author: Chloe Hulme + +## Why migrate? + +Migrating an existing API from .NET 7 to .NET 8 is an important step in keeping software up-to-date +and taking advantage of the latest improvements and features offered by the newer version of the +framework. .NET 8 is likely to continue to introduce significant performance optimizations, security +enhancements, and new functionalities, all of which can contribute to a more efficient and robust +API. + +One of the main reasons why migration is important is to ensure ongoing support and compatibility +with the evolving technology landscape. As older versions of .NET become obsolete, they receive +fewer updates and bug fixes, leaving our API potentially vulnerable to security threats and lacking +in performance optimisations. By migrating to .NET 8, we can take advantage of the latest security +patches and leverage the framework's advancements to maintain a secure and high-performing API. Our +API will continue to reap the benefits of this in the long-term future, as it will be far more +streamlined for future cohorts to migrate our API to later releases of .NET, if we keep our API +consistently up to date in the short-term. + +Additionally, upgrading to .NET 8 can also lead to improved productivity and code maintainability +for future cohots. With .NET 8 introducing features that streamline API development, enhance +debugging capabilities, and provide better tools for managing dependencies, we will be able to +build, test, and maintain our API more efficiently into the future. Ultimately, resulting in faster +development cycles and reduced maintenance overhead for future cohorts. Our API can be greatly +enhanced if we continue to leverage emerging technologies, and effectively future-proofed to remain +compatible with new technologies and platforms, if we take this proactive step to migrate to .NET8. + +## What's new in .NET 8 + +- Improvements to JSON serialisation and deserialisation. This is impacting `System.Text.Json`. +- Introduction of Time abstraction, including timers with the new TimeProvider class and ITimer + interface. +- UTF-8 improvements +- Default port for containers has changed from 80 to 8080 +- The `System.Random` and `System.Security.Cryptography.RandomNumberGenerator` types introduce two + new methods for working with randomness. +- Introduction of performance-focussed types: + `FrozenDictionary, FrozenSet, System.Buffers.SearchValues, System.Text.CompositeFormat, System.IO.Hashing.XxHash3 and System.IO.Hashing.XxHash128` +- Improvements to data validation +- New extension libraries +- Improved memory optimisation +- Improved support with reflections +- SDK changes +- NuGet changes regarding certificate verification +- Overall performance improvements + +## Breaking Changes in .NET 8 + +Our API is built using .NET6 therefore we can expect to encounter some changes in .NET 8 that will +break our otherwise working implementatoin. Other changes might affect the way our app runs, and +will require some adjustments. + +**Binary incompatible changes:** These are changes in .NET 8 that can cause our existing app to +behave incorrectly or even crash when it runs on .NET 8. This means that we might need to make some +changes to our app's code and then recompile it using the new .NET 8 tools. + +**Source incompatible changes:** These are changes in .NET 8 that can cause our existing app's +source code to encounter problems when we try to compile it using .NET 8. This means that we might +need to modify some parts of our source code to make it compatible with the new .NET 8 version. + +**Behavioral changes:** These are changes in .NET 8 that can cause our app, even if it's +successfully compiled with .NET 8, to behave differently than before when it runs. If this new +behaviour is not what we want, we will need to update our app's code to handle the changes correctly +and then recompile it with .NET 8. + +So, before we migrate our app to .NET 8, we need to be aware of these possible issues and check if +any of the changes announced by Microsoft apply to our app. We can then make the necessary +adjustments and ensure a smooth transition to the updated version. + +### ASP.NET Core + +None that affect our product. + +### Containers + +Default port has changed from 80 to 8080. + +### Core .NET libraries + +None that affect our product. + +### Globalisation + +None that affect our product. + +### SDK + +None that affect our product. + +### Packages + +NuGet packages may be out of date, this will impact the API until rectified. + +## Steps to Migrate + +1. Check Compatibility: Eensure that the application's codebase, libraries, and dependencies are + compatible with .NET 8. +2. Update SDK and Tooling: Ensure that the latest .NET SDK and tooling is installed locally. +3. Migrate to .NET 8: Update the project's target framework to .NET 8 in the `.csproj` file +4. Check Dependencies: Update NuGet packages to their latest compatible versions for .NET 8. Use the + NuGet Package Manager or the Package Manager Console to update the packages. +5. Fix Breaking Changes: Address any breaking changes specific to .NET 8 in the codebase. +6. Verify and Test: Thoroughly test the application after the migration to ensure that it works as + expected with the new version. +7. Optimise for New Features: Implement new features in .NET 8 that have been identified to improve + out API. +8. Update Third-Party Libraries: Ensure that any third-party libraries used are compatible with + .NET 8. + +## Potential enhancements to implement in our API + +- Data validation (`System.ComponentModel.DataAnnotations.AllowedValuesAttribute`, + `System.ComponentModel.DataAnnotations.LengthAttribute`) to validate dates for artists and + artworks, as well as a length attribute to help validate passwords. +- An updated hashing algorithm to explore for password security. We are currently using bearer token + authentication. +- Improvements to the Reflection library + +## Update: 9/8/23 + +Preliminary steps to migrate the API have been taken. The most current Docker image release for .NET +is .NET 8.1. The containers have been rebuilt accordingly and breaking changes affecting container +operation have been rectified. Prior to thorough testing, the API appears to have been successfully +migrated to .NET 8.1 stable preview. Further, and more thorough, testing will be conducted to +confirm this. diff --git a/src/content/docs/products/art-gallery/Documentation/Deployment/CICDPipeline.md b/src/content/docs/products/art-gallery/Documentation/Deployment/CICDPipeline.md new file mode 100644 index 00000000..520d0e5c --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Deployment/CICDPipeline.md @@ -0,0 +1,242 @@ +--- +title: CI/CD Mock Pipeline +--- + +## Author: Ayan Masood, [amasood@deakin.edu.au](mailto:amasood@deakin.edu.au) + +## Introduction + +This document contains a step-by-step guide on CI/CD Pipeline integration within the processes of +the online Art Gallery application. It will go over steps to setup tests for both CI and CD in order +to ensure all commits to the GitHub repository and changes to Google Cloud Platform (GCP) meet +requirements set. + +## CI Tests + +Tests will need to be included in the **art-gallery/.github/workflows/ci.yml** file. To add tests +the defined environments have to be added under the “steps” line in the yml file. + +`name: CI` + +`on:` + +`pull_request:` + +`push:` + +`branches: [development]` + +`jobs:` + +`build:` + +`runs-on: ubuntu-latest` + +`steps:` + +`- uses: actions/checkout@v2` + +`- name: Linelint` + +`uses: fernandrone/linelint@master` + +`- name: Set up Node` + +`uses: actions/setup-node@v1` + +`with:` + +`node-version: 16.14.2` + +`- name: Install dependencies` + +`run: npm install` + +`- name: Prettier` + +`run: npm run format:check` + +`- name: Vale` + +`run: |` + +`sudo apt update` + +`sudo apt install snapd` + +`sudo snap install vale --edge` + +`npm run prose:check ` + +The current file contains checks on formatting mostly with a Linter being setup for whitespace +identification and Prettier support for formatting style of all commits. These tests are performed +on both pull and push requests in the repository. It also sets up Node.js and, Vale for prose +checks. + +## Additional Tests + +Testing and building a Docker image and tagging with timestamp and date for traceability: + +`- name: Build the Docker image` + +`run: docker build . --file Dockerfile --tag my-image-name:$(date +%s)` + +Security and code formatting issues with ESLint for JavaScript applications: + +`- name: Install ESLint` + +`run: ` + +`npm install eslint@8.10.0` + +`npm install @microsoft/eslint-formatter-sarif@2.1.7` + +`- name: Run ESLint` + +`run: npx eslint .` + +`--config .eslintrc.js` + +`--ext .js,.jsx,.ts,.tsx` + +`--format @microsoft/eslint-formatter-sarif` + +`--output-file eslint-results.sarif` + +`continue-on-error: true` + +`- name: Upload analysis results to GitHub` + +`uses: github/codeql-action/upload-sarif@v2` + +`with:` + +`sarif_file: eslint-results.sarif` + +`wait-for-processing: true` + +## CD Tests + +A new cd YAML file can be created in the workflows path with all information related to deploying +code on commits which affect the running of the application. An extremely helpful video on editing +and setting up this file can be found at this link: +[https://www.youtube.com/watch?v=DMCi7WWTtX0](https://www.youtube.com/watch?v=DMCi7WWTtX0) + +The file itself can be found as a template within GitHub on the actions page: + +`name: Build and Deploy to Cloud Run` + +`on:` + +`push:` + +`branches:` + +`- master` + +`env:` + +`PROJECT_ID: YOUR_PROJECT_ID //Update with your Google Cloud project ID` + +`GAR_LOCATION: YOUR_GAR_LOCATION //Update with your Artifact Registry location` + +`SERVICE: YOUR_SERVICE_NAME //Update with your Cloud Run service name` + +`REGION: YOUR_SERVICE_REGION //Update with your Cloud Run service region` + +`jobs:` + +`deploy:` + +`permissions:` + +`contents: 'read'` + +`id-token: 'write'` + +`runs-on: ubuntu-latest` + +`steps:` + +`- name: Checkout` + +`uses: actions/checkout@v2` + +`- name: Google Auth` + +`id: auth` + +`uses: google-github-actions/auth@v0` + +`with:` + +`token_format: 'access_token'` + +`workload_identity_provider: '${{ secrets.WIF_PROVIDER }}'` + +`// Workload Identity Federation provider` + +`service_account: '${{ secrets.WIF_SERVICE_ACCOUNT }}'` + +`// Service account for WIF` + +`// Uncomment the following section to use authentication via credentials JSON` + +`// - name: Google Auth` + +`// id: auth` + +`// uses: google-github-actions/auth@v0` + +`// with:` + +`// credentials_json: '${{ secrets.GCP_CREDENTIALS }}'` + +`// BEGIN - Docker auth and build (NOTE: If you already have a container image, these Docker steps can be omitted)` + +`// Authenticate Docker to Google Cloud Artifact Registry` + +`- name: Docker Auth` + +`id: docker-auth` + +`uses: docker/login-action@v1` + +`with:` + +`username: 'oauth2accesstoken'` + +`password: '${{ steps.auth.outputs.access_token }}'` + +`registry: '${{ env.GAR_LOCATION }}-docker.pkg.dev'` + +`- name: Build and Push Container` + +`run: ` + +`docker build -t "${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.SERVICE }}:${{ github.sha }}" ./` + +`docker push "${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.SERVICE }}:${{ github.sha }}"` + +`// END - Docker auth and build` + +`- name: Deploy to Cloud Run` + +`id: deploy` + +`uses: google-github-actions/deploy-cloudrun@v0` + +`with:` + +`service: ${{ env.SERVICE }}` + +`region: ${{ env.REGION }}` + +`image: ${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.SERVICE }}:${{ github.sha }}` + +`- name: Show Output` + +`run: echo ${{ steps.deploy.outputs.url }}` + +This code can be edited for both use of credentials and authentication thus, can be adjusted for +preferred use. diff --git a/src/content/docs/products/art-gallery/Documentation/Deployment/CICDPipelineOverview.md b/src/content/docs/products/art-gallery/Documentation/Deployment/CICDPipelineOverview.md new file mode 100644 index 00000000..c1de22d4 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Deployment/CICDPipelineOverview.md @@ -0,0 +1,65 @@ +--- +title: CI/CD Pipeline Integration with GitHub Actions +--- + +**Author:** Ayan Masood, [amasood@deakin.edu.au](mailto:amasood@deakin.edu.au) + +## Introduction + +Integration of a continuous integration (CI) and deployment (CD) pipeline involves automation of +different processes such as building, testing and deploying of code and/or documentation. This +process ensure that code quality remains consistent and overall collaboration is more polished +andrefined due to error and bug identification. + +## Creating a Configuration File (Workflow File) + +To define checks related to this process to allow for automation a configuration file containing all +identified checks needed for this project should be defined. This file contains different +preexisting tools the team can use to perform tests on incominpng code/documentation when merging +data into the repository through a push request. The configuration file has to be included inside +the main repository in a specific location to allow for automatic integration to the project. This +can also be customized to run on any type of event; pull, push or commit due to it allowing easy +modification of steps and processes. + +## Using Templates + +The user can also create CI/CD workflows by using provided template by GitHub Actions. This contains +different tests already coded to perform various activities and can be easily modified to be used +for project purposes. Each template comes with predefined steps for common tasks like building, +deploying, testing, etc. These tests can be used to simplify implementation as well as reduce the +time taken for added new steps in the configuration file. + +## Tests required in Pipeline + +- Code and Documentation Style + +Ensure consistent layout of code and documentation throughout the project. + +- Security Tests + +Test for any threats or vulnerabilities in code provided. + +- Compatibility Errors + +Help to review any issues with compatibility of code being input + +- Performance Optimization + +Evaluate performance and find areas of optimization. + +- Integration Tests + +Check to see provided resources are able to interact with integrated parts of the system (API’s, +Databases, etc.) + +- Deployment Tests + +These relate to all resources which affect deployment of application to ensure every change which +directly affects the application is of standard and no compilation errors occur. + +## Conclusion + +Through incorporating CI and CD into the project automation of tests and identification of errors +can be simplified. It minimizes the need for manual testing allowing for less code related errors +and troubleshooting time required. This helps to develop and commit constant changes to the +application. diff --git a/src/content/docs/products/art-gallery/Documentation/Deployment/CICDToolsResearch.md b/src/content/docs/products/art-gallery/Documentation/Deployment/CICDToolsResearch.md new file mode 100644 index 00000000..3600e13e --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Deployment/CICDToolsResearch.md @@ -0,0 +1,115 @@ +--- +title: CI/CD Technologies +--- + +Author: Chloe Hulme + +Research discussing popular CI/CD tools, and which is best suited to automating the Art Gallery's +deployment. + +## Jenkins + +**Pros:** + +- Completely free +- Plugins available, very customisable (can integrate Docker) +- Widely used in industry, lots of information/resources available +- Integrates with GitHub +- Branch-specific deployment possible + +**Cons:** + +- Time consuming/confusing setup +- Less intuitive than other tools +- Requires more maintenance than other tools +- Does not natively support Docker +- On-premise service, infrastructure management required + +## CircleCI + +**Pros:** + +- Integrates with GitHub +- Free tier +- Easy setup, particularly if project hosted on GitHub +- Straightforward and modern interface +- Supports Docker +- Cloud-hosted service +- Branch-specific deployment possible + +**Cons:** + +- Free tier can be limited (resource constraints) +- Less extensive plugin support compared to Jenkins +- Can be costly for resource intensive builds + +## GitLab + +**Pros:** + +- Integrates with GitHub +- Free tier +- Setup and configuration straightforward +- Easily defined pipelines using ‘.gitlab-ci.yml’ +- Supports Docker +- Cloud hosted or on-premise service +- Branch-specific deployment possible + +**Cons:** + +- Requires higher-tier plan (expensive) for more advanced features +- Not as popular as other CI/CD tools + +## GitHub Actions + +**Pros:** + +- Native integration with GitHub repositories (easy setup and configuration) +- Generous free tier for public repositories +- Offers a variety of pre-built actions +- We already have a working CI pipeline here that can be extended +- Supports Docker +- Cloud-hosted service +- Branch-specific deployment possible + +**Cons:** + +- Can become costly for resource intensive workflows +- Not as established as other CI/CD tools (less documentation/resources?) + +## TeamCity + +**Pros:** + +- Well-established tool, lots of resources available +- Easy to setup and configure, highly intuitive interface +- Good support for version control systems such as GitHub +- Plugins available (can integrate Docker) +- Free tier +- Branch-specific deployment possible + +**Cons:** + +- Licence required for commercial use (does that include us?) +- Free tier is limited +- On-premise service, infrastructure management required + +┌----------------------------------┼---Jenkins---CircleCI-----GitLab----GitHub Actions---TeamCity-┐ +|Completely free-------------------┼---- ✓ ----┼---- ✗ ----┼---- ✗ ----┼----- ✗ ------┼---- ✗ ----| +|Free-tier available---------------┼---- ✓ ----┼---- ✓ ----┼---- ✓ ----┼----- ✓ ------┼---- ✓ ----| +|Cloud hosted----------------------┼---- ✗ ----┼---- ✓ ----┼---- ✗ ----┼----- ✓ ------┼---- ✗ ----| +|Branch-specific deployment--------┼---- ✓ ----┼---- ✓ ----┼---- ✓ ----┼----- ✓ ------┼---- ✓ ----| +|Natively integration with GitHub--┼---- ✓ ----┼---- ✓ ----┼---- ✓ ----┼----- ✓ ------┼---- ✓ ----| +|Native support for Docker---------┼---- ✗ ----┼---- ✓ ----┼---- ✓ ----┼----- ✓ ------┼---- ✗ ----| +|Ease of setup/config--------------┼---- ✗ ----┼---- ✓ ----┼---- ✓ ----┼----- ✓ ------┼---- ✓ ----| +|Well-established tool-------------┼---- ✓ ----┼---- ✓ ----┼---- ✗ ----┼----- ✗ ------┼---- ✓ ----| +└──-----------------------------------------------------------------------------------------------┘ + +**Recommendation:** GitHub Actions is the best choice as a CI/CD pipeline tool in this project. The +team is already familiar with this tool given the currently utilised CI pipeline. Additionally, the +generous free tier makes this an attractive choice. Finally, centralising our work will allow us to +streamline future changes/fixes to our pipeline as the team inevitably hands the project over to +future cohorts. + +UPDATE (27/7): After discussion with the client, it is confirmed that GitHub Actions will be our +CI/CD tool of choice. diff --git a/src/content/docs/products/art-gallery/Documentation/Deployment/CybersecurityPolicy.md b/src/content/docs/products/art-gallery/Documentation/Deployment/CybersecurityPolicy.md new file mode 100644 index 00000000..221f8961 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Deployment/CybersecurityPolicy.md @@ -0,0 +1,34 @@ +--- +title: GCP Security Policy +--- + +**Author:** Ayan Masood, amasood@deakin.edu.au + +## Introduction + +This document will go over the security policy for management of user access on Google Cloud +Platform (GCP). It focuses on minimizing cybersecurity risks in regards to application development +and deployment. The key aim of this report is to help keep the collaboration space secure and reduce +the risk of human error relating to accidental changes to the application. + +## Setting Up User Credentials + +Service accounts will need to be created for every person working on the application on GCP. These +accounts have the ability for the admin to assign roles to them which limits access and certain +capabilities to the admin’s choosing. For example, only making certain parts of the project viewable +only, allowing the user to edit the application itself, etc. + +## Account Key + +Each service account will require an account key. This key allows access to the account thus, +keeping it secure is extremely important. The account key and its details are inside a JSON file +which the account holder has to present in order to gain access to their predefined roles and make +changes. These keys will have to be rotated after a particular period; this step involves deleting +the previous key and generating a new one for every account to ensure it is not being misused or +another person has gained access to the previous credentials. + +## Conclusion + +Service accounts and keys provide a secure and controlled approach for access of GCP resources +without sharing/storing of personal credentials. This approach is best suited for the management of +access and control of limitation on users working on the development component of the application diff --git a/src/content/docs/products/art-gallery/Documentation/Deployment/DeploymentStatus.md b/src/content/docs/products/art-gallery/Documentation/Deployment/DeploymentStatus.md new file mode 100644 index 00000000..444fe90b --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Deployment/DeploymentStatus.md @@ -0,0 +1,58 @@ +--- +title: Mid-Trimester Deployment Update (17/8/23) +--- + +Author: Chloe Hulme + +## Introduction + +This document serves as an update on the progress made regarding the deployment of the Indigenous +Art Gallery. As part of our continuous efforts to put our best foot forward regarding our deployment +processes, we have chosen Google Cloud Platform (GCP) and GitHub Actions as our deployment and CI/CD +tools. In this document, you will find details about our chosen tools, the current status of our GCP +usage approval, and what we can expect moving forward. + +## Deployment Tools + +### Google Cloud Platform (GCP) + +After liaising with all stakeholders, we have selected Google Cloud Platform as our cloud +infrastructure provider for deploying and hosting our product. GCP offers a wide range of services +and resources that align well with our development and scalability needs. This choice enables us to +leverage GCP's robust features for seamless deployment, automatic scaling, and reliable performance. +As an added benefit, we will be able to make use of the partnership between Deakin and GCP. + +### GitHub Actions + +GitHub Actions is our chosen continuous integration and deployment platform. It provides an +integrated workflow for automating tasks, including building, testing, and deploying our application +directly from our GitHub repository. This integration streamlines our development process, ensuring +that changes are thoroughly tested and deployed efficiently. + +## GCP Usage Approval Status + +Recently we have taken a significant step toward utilising GCP for our deployment needs. I have +submitted the necessary paperwork to request approval for our GCP usage from the school of IT staff. +As of today (17/8/23) I have received confirmation that our request is under review. The review +process is an essential step in ensuring compliance, security, and optimal resource allocation. + +## Next Steps + +1. **Review Process Completion**: We will await the completion of the GCP usage review. The school + of IT staff will assess our request to ensure it aligns with the university's requirements and + policies - particularly pertaining to cybersecurity. + +2. **Feedback and Approval**: We may receive feedback or inquiries from the review team. If any + additional information or clarifications are needed, we will promptly provide them to expedite + the approval process. + +3. **Deployment Planning**: We will use the remaining time this trimester to refine our deployment + strategy. We will continue working on optimising our GitHub Actions workflows including + developing sample code for future cohorts to use as a reference point; and ensuring that our + application is ready for deployment in the coming trimester once we receive the green light. + +## Stay Informed + +As we progress through the GCP usage approval process, I will keep the team informed about any +updates or changes. If you have any questions, concerns, or suggestions, please feel free to reach +out - and thank you to the eployment team your consisten efforts and hard work! diff --git a/src/content/docs/products/art-gallery/Documentation/Deployment/DeploymentStrategies.md b/src/content/docs/products/art-gallery/Documentation/Deployment/DeploymentStrategies.md new file mode 100644 index 00000000..b9fa4779 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Deployment/DeploymentStrategies.md @@ -0,0 +1,106 @@ +--- +title: Comparison of Deployment Strategies +--- + +**Author:** Ayan Masood, + +## Goals / Deliverables + +- Identify the strengths and weakness of various deployment platforms +- Shortlist the best posible technique/s to deploy the proposed application +- Compare different resources available to company goals and requirements + +## Resources + +- AWS Documentation: +- Auto Scaling: + [https://www.youtube.com/watch?v=4EOaAkY4pNE](https://www.youtube.com/watch?v=4EOaAkY4pNE) +- Lambda: [https://www.youtube.com/watch?v=7wLg4IR07so](https://www.youtube.com/watch?v=7wLg4IR07so) +- Availability Zones: + +- GCP Documentation: +- Pricing:[https://cloud.google.com/pricing](https://cloud.google.com/pricing) +- Scalability Differences: + [https://davidmytton.blog/aws-vs-google-cloud-flexibility-vs-operational-simplicity/](https://davidmytton.blog/aws-vs-google-cloud-flexibility-vs-operational-simplicity/) +- Security Functionality: + [https://kinsta.com/blog/google-cloud-vs-aws/](https://kinsta.com/blog/google-cloud-vs-aws/) +- GitHub Pages Documentation: +- Overview: +- Limitations: + [https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-large-files-on-github#file-and-repository-size-limitations](https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-large-files-on-github#file-and-repository-size-limitations) + +## What we found out + +Amazon Web Services (AWS): + +- Feasibility: Widely adopted with extensive documentation and resources available for + implementation and problem solving. +- Cost: depends upon traffic and features used. Pay-as-you-go options for different functionality + requirements. +- Ease of Use: AWS provides a wide range of services and features, which can make it overwhelming + for beginners. While some services offer user-friendly interfaces and easy setup, others might + require advanced knowledge of console commands and configurations. The level of ease of use can + vary on user knowledge and familiarity of cloud technologies. +- Scalability: Excellent scalability options with Auto Scaling, Elastic Load Balancing, and AWS + Lambda. Auto Scaling is a service which helps the user to monitor applications and has the ability + to automatically adjust the capacity of the infrastructure in order to maintain efficient, + predictable performance. This is used in conjunction with the Load Balancer which transfers + traffic between different instances to distribute the workload helping to easily scale the + infrastructure up or down, depending on user requirement. AWS Lambda scales user code to the + number of requests, removing the need to manually manage service resources and is also capable of + creating additional instances to handle increased load on the system. +- Availability: High level of availability through multiple Availability Zones and Local Zones. The + cloud computing resources of AWS are hosted in numerous locations worldwide. Local Zones allow + resources to be placed in multiple regions and thus, closer to the targeted users. +- Security: Robust security measures with encryption, access controls, and network security built-in + removing the need to work with third-party software for security purposes, helping to have a + single environment for management and deployment. + +Google Cloud Platform (GCP): + +- Feasibility: Strong contender with diverse services and language/framework support. It offers a + more simplified interface which can aid to provide a better experience. +- Cost: Pay-as-you-go model; cost estimation and control are crucial. Pricing depends upon number of + instances and resources allocated. Offers discounts on continued use decreasing of service. +- Ease of Use: Built-in integration with google services, simplified user interface and layout. If + working with google applications they are easier to link. Not much different to AWS in regards of + functionality. +- Scalability: Excellent scalability with managed instance groups and automatic scaling. Similar + features to discussed AWS such as; Load Balancing, AWS Lambda, which the counterpart for google is + Cloud Functions. In contrast to the more flexible AWS, GCP appeals more towards simplicity to be + more scalable; fixed pricing plans, easy to use interface, etc. +- Availability: High level availability with multi-region deployments however less cloud network + locations offered than AWS. +- Security: Robust security features with IAM roles, encryption, and DDoS protection. Identical + functionality to AWS. + +GitHub Pages: + +- Feasibility: It is more suited to hosting static websites; contains pre-built data only capable of + altering data manually, which the Art Gallery would not fall into as a database has to be used to + alter contents dynamically. There are also certain usage limits on large files which may also + negatively impact the feasibility. +- Cost: It is the cheapest of the three and is free for public repositories. For private there are + some limitations and additional cost but it is still the more cost-effective option. +- Ease of Use: Extremely easy to use especially if user has previous GitHub knowledge. It is as + simple as pushing data into a repository or enabling GitHub Pages in the repository settings. +- Scalability: In comparison to GCP and AWS scalability is poor as it is primarily designed to be + used for small to medium-sized static websites, which can handle moderate traffic to the platform. +- Availability: Cannot manually select regions; auto allocated to nearest position. Less + multiregional support and +- Security: Basic security measure provided such as HTTPS and Rate Limiting but, more customizable + encryptions and advanced DDOS protection is not available. + +## Recommendations + +1. For the current project GitHub Pages is not suitable. It offers very low flexibility in terms of + features available and the lack of support for dynamic websites makes it unsuitable for this + particular project. + +2. AWS and GCP have very limited differences between them in all the 6 categories discussed in each + platform. Selection should depend on development team knowledge and familiarity between the two + resources. + +3. If the team were to use primarily Google based software/resources GCP would be more suitable for + linking and management of that particular type of data, making it the better choice in that + scenario. diff --git a/src/content/docs/products/art-gallery/Documentation/Deployment/PreliminaryProposal.md b/src/content/docs/products/art-gallery/Documentation/Deployment/PreliminaryProposal.md new file mode 100644 index 00000000..be50789b --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Deployment/PreliminaryProposal.md @@ -0,0 +1,66 @@ +--- +title: Preliminary Proposal +--- + +**Author:** Ayan Masood, amasood@deakin.edu.au + +## Introduction + +This proposal outlines the deployment strategy for an Art Gallery application through the +incorporation of Google Cloud Platform (GCP). It provides a brief overview of all technologies which +will be utilized and a step-by-step process on how to deploy the proposed application. + +## Containerized Application + +The first step is to containerize the application which will allow the programming team to access +the app and perform changes to it without having to manually installing all dependencies required on +each device. A Dockerfile containing all required dependencies will be created and made accessible +to all members working on the Art Gallery development process. + +## Creating a Kubernetes Cluster + +After containerizing the application, the Kubernetes API in GCP will need to be enabled, then a new +cluster created; which acts as a basis of deployment and operation of containerized applications. +Google Kubernetes Engine (GKE) creates and manages VM instances on the user's behalf so, no manual +setup is required. + +## Kubernetes Nodes and Pods + +These are responsible for running containerized applications. It provides a highly scalable +environment for the application. Every node can host multiple pods, which are the smallest +deployable units in Kubernetes. Nodes essentially provide the necessary resources for running the +application; networking, memory, CPU, etc. Each pod represents an instance of the application or a +microservice. + +## Deploying to GKE + +To deploy the Art Gallery application to the GKE cluster Kubernetes deployment manifests have to be +defined using the GKE console. These manifests are kubectl commands which define the configuration +of deployment as well as pods and services. For example, when creating a deployment, one typically +needs to provide the following details through the console: + +- Name and labels for the deployment +- Container image and tags to use +- Resource requirement outline for containers (CPU and memory) +- Number of replicas (instances) of the application +- Networking settings + +## Kubernetes Service- LoadBalancer and Ingress + +After the process of deploying the cluster a service will need to be created which will allow other +pods to access the application. For external traffic (targeted users of the application) a +LoadBalancer will need to be setup in order to expose the application to the internet and those +external networks. An Ingress resource can also be used if more advanced traffic management is +needed such as path-based routing and SSL termination. + +## CI/CD Pipeline Integration + +Integrate CI/CD pipelines to automate testing and deployment. Enable resources which allow for +automatic deployment on code changes by programming team to allow for CI/CD approach and a better +collaboration platform. + +## Conclusion + +By using GCP the deployment process will be streamlined, scalable and reliable due to the services +and technologies provided. The containerized environment ensure developers can manage resources +efficiently and integrate CI/CD pipelines in order to test and manage the application effectively. diff --git a/src/content/docs/products/art-gallery/Documentation/Dockerization/DockerizationFeasabilityCheck.md b/src/content/docs/products/art-gallery/Documentation/Dockerization/DockerizationFeasabilityCheck.md new file mode 100644 index 00000000..96801a21 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Dockerization/DockerizationFeasabilityCheck.md @@ -0,0 +1,47 @@ +--- +title: Dockerization feasibility check +--- + +## Capstone SIT374 - Chloe Hulme + +### Preamble + +The aim of this study is to check the feasibility of Dockerizing the Indigenous Art Gallery Project. + +### Research Information + +The biggest hurdle within this project will be understanding the Docker platform and gaining some +familiarity with it as I have no prior experience using Docker. I have identified the following +resources to cross check the feasibility of this task. + + + + + + + + + + + + + + + +### Outcome + +After some preliminary research, it was determined that a Docker image must first be created. This +is done by including a Dockerfile in the root directory of the project. Once the requisite details +are included in the Dockerfile, it is a matter of building a container image and running the +container. + +This process will ned to be completed for both the front and back ends as they should be kept in +seperate containers as best practice. + +### Plan + +From this week I will begin more serious up-skilling on Docker. Once I am equipped with a better +understanding of the platform, I will begin preparing the Dockerfiles for the front and back ends +and building the container images. By week 6 I want to have at least one of the containers up and +running - I will most likely begin with the backend as I am more familiar with this part of the +project given I contributed to building it. diff --git a/src/content/docs/products/art-gallery/Documentation/Dockerization/DockerizationProjectOutline.md b/src/content/docs/products/art-gallery/Documentation/Dockerization/DockerizationProjectOutline.md new file mode 100644 index 00000000..e18ee39b --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Dockerization/DockerizationProjectOutline.md @@ -0,0 +1,34 @@ +--- +title: Dockerization project outline +--- + +## Capstone SIT374 - Chloe Hulme + +_Aim_ + +The aim is to Dockerize the Indigenous Art Gallery Project so that it may run smoothly on every +machine with minimal setup; as well as being able to be deployed into a Docker Swarm. + +The first step in this component of the project will be to up-skill on Docker and gain an +understanding of the platform and how it operates. From there, we will formulate a process on how to +Dockerize the project and begin to do so. + +_Key Outcomes_ + +- Feasibility report of product -> Check how this can be achieved and assess possible problems and + their potential solutions. +- Fully Dockerize front-end to run smoothly in a container. +- Fully Dockerize back-end to run smoothly in a seperate container. + +_Delivery Time frames_ + +The feasibility report and fully Dockerized application will be working and available by the end of +T1 2023. + +Product: Indigenous Art Gallery + +Delivery Lead: Chloe Hulme + +Team Members: TBA + +Skills required: Docker diff --git a/src/content/docs/products/art-gallery/Documentation/Dockerization/DockerizationResearchNotes.md b/src/content/docs/products/art-gallery/Documentation/Dockerization/DockerizationResearchNotes.md new file mode 100644 index 00000000..65fd6364 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Dockerization/DockerizationResearchNotes.md @@ -0,0 +1,236 @@ +--- +title: Preliminary Research +--- + +## Chloe Hulme + +### Preamble + +The goal of this research is to better understand how to fully dockerize a .NET minimal web api, +with a Vue based front end. The research will include an in-depth look into how we can begin to +complete this, as well as projected timelines and useful tutorials. + +### General + +- create dockerfile in root of project (Dockerfile -> no ext) +- Whenever a change is made to code, container needs to be rebuilt + +### Backend (.NET minimal web api) (weeks 4-7) + +- use multi-stage build (build stage and serve stage in Dockerfile) +- Splitting base images makes build and run more efficient +- Initial base image uses .NET sdk -> this builds binaries +- In Dockerfile: + + - `FROM [mcr.microsoft.com/dotnet/sdk:6-0-focal](http://mcr.microsoft.com/dotnet/sdk:6-0-focal) as BUILD` + - Set working directory (`WORKDIR /source`) + - Copy everything from current working directory into that new /source (`COPY . .`) + - Restore project dependencies (`RUN dotnet restore "\*.csproj" --disable-parallel`) + - Publish artefacts to output directory + (`RUN dotnet publish "\*.csproj" -c release -o /app --no-restore`) + +- Second base image uses .NET runtime + +- In Dockerfile: + - `FROM [mcr.microsoft.com/dotnet/aspnet:6-0-focal](http://mcr.microsoft.com/dotnet/sdk:6-0-focal)` + - Create new working directory (`WORKDIR /app`) + - Copy output from build into current working directory (`COPY --from=build /app ./`) + - Expose port (`EXPOSE 5000`) + - Define entrypoint (`ENTRYPOINT ["dotnet", "ProjName.dll"]`) + +**To build container:** + +`docker build --rm -t productive-dev/proj-name:latest .` ^^ must be run inside root directory of +project + +`docker image ls -> lists built images (use to check if built)` + +**To run container:** + +```plaintext +docker run - -rm -p 5000:5000 -p 5001:5001 -e ASPNETCORE_HTTP_PORT= -e +ASPNETCORE_URLS= productive-dev/proj-name +``` + +**To stop container:** + +`docker container stop ` + +**Docker-compose.yml file will be required to run database and backend at the same time** + + +- `docker-compose up` and `docker-compose up --build` to run containers from .yml file +- Link containers using bridge network +- Specify each service: postgreSQL image and image build from Dockerfile +- Automatically dump .sql file into db on first build by mounting .sql scrip to + `docker-entrypoint-initdb.d` +- change db connection string in api to match docker-compose, Server=host.docker.local + +### Frontend (Vue) (weeks 7-10) + +- In Dockerfile: + - Choose base image for your Vue application. In this case, we'll use node:14.18.0-alpine3.14, + which is a lightweight version of Node.js (`FROM node:14.18.0-alpine3.14`) + - Set the working directory to /app (`WORKDIR /app`) + - Install dependencies: Install the @vue/cli globally using the RUN command + (`RUN npm install -g @vue/cli`) + - Copy the package.json and package-lock.json files: Copy the package.json and package-lock.json + files to the working directory using the COPY command (`COPY package*.json ./`) + - Run npm install to install the dependencies for our application. We need to use + --legacy-peer-deps flag to work around any potential issues with peer dependencies + (`RUN npm install --legacy-peer-deps`) + - Copy the rest of the source code to the working directory (`COPY . ./`) + - Run npm run build to build the application (`RUN npm run build`) + - Expose port 80 (HTTP) (`EXPOSE 80`) + - Use CMD command to start the application by running npm run serve + (`CMD ["npm", "run", "serve"]`) + +**Integrating with backend:** + +- Create dockr-compose.yml in root directory and add frontend service +- Ensure `context` to locate Dockerfile in nested directories for backend/frontend +- `docker-compose up --build` to build and tun containers +- Repos will need to be re-structured as follows: + +```plaintext + ├── art-gallery-backend + │ ├── .vs + │ ├── art-gallery-backend + │ │ ├── Authentication + │ │ ├── bin + │ │ ├── db_dump + │ │ ├── Middleware + │ │ ├── Models + │ │ ├── obj + │ │ ├── Persistence + │ │ ├── Properties + │ │ ├── wwwroot + │ │ ├── .gitignore + │ │ ├── appsettings.Development.json + │ │ ├── appsettings.json + │ │ ├── art-gallery-backend.csproj + │ │ ├── art-gallery-backend.csproj.user + │ │ ├── Program.cs + │ │ ├── Dockerfile + ├── art-gallery-frontend + │ ├── docs + │ ├── node_modules + │ ├── public + │ ├── src + │ ├── .gitignore + │ ├── babel.config.js + │ ├── jsconfig.json + │ ├── package-lock.json + │ ├── package.json + │ ├── README.md + │ ├── vue.config.js + │ ├── Dockerfile + └── docker-compose.yml +``` + +- There will also be additional docker-copmose.yml files to run each side of the application in + isolation, ie. running just the backend containers or just the frontend container. This will help + development teams quickly test their individual contributions. The updated directory tree is as + follows: + +```plaintext + ├── art-gallery-backend + │ ├── .vs + │ ├── art-gallery-backend + │ │ ├── Authentication + │ │ ├── bin + │ │ ├── db_dump + │ │ ├── Middleware + │ │ ├── Models + │ │ ├── obj + │ │ ├── Persistence + │ │ ├── Properties + │ │ ├── wwwroot + │ │ ├── .gitignore + │ │ ├── appsettings.Development.json + │ │ ├── appsettings.json + │ │ ├── art-gallery-backend.csproj + │ │ ├── art-gallery-backend.csproj.user + │ │ ├── Program.cs + │ │ ├── Dockerfile + │ │ ├── docker-compose.yml + ├── art-gallery-frontend + │ ├── docs + │ ├── node_modules + │ ├── public + │ ├── src + │ ├── .gitignore + │ ├── babel.config.js + │ ├── jsconfig.json + │ ├── package-lock.json + │ ├── package.json + │ ├── README.md + │ ├── vue.config.js + │ ├── Dockerfile + │ ├── docker-compose.yml + └── docker-compose.yml +``` + +- The final production environment will contain production copies of each docker file, as shown + here: + +```plaintext + ├── art-gallery-backend + │ ├── .vs + │ ├── art-gallery-backend + │ │ ├── Authentication + │ │ ├── bin + │ │ ├── db_dump + │ │ ├── Middleware + │ │ ├── Models + │ │ ├── obj + │ │ ├── Persistence + │ │ ├── Properties + │ │ ├── wwwroot + │ │ ├── .gitignore + │ │ ├── appsettings.Development.json + │ │ ├── appsettings.json + │ │ ├── art-gallery-backend.csproj + │ │ ├── art-gallery-backend.csproj.user + │ │ ├── Program.cs + │ │ ├── dev.Dockerfile + │ │ ├── prod.Dockerfile + │ │ ├── docker-compose-dev.yml + ├── art-gallery-frontend + │ ├── docs + │ ├── node_modules + │ ├── public + │ ├── src + │ ├── .gitignore + │ ├── babel.config.js + │ ├── jsconfig.json + │ ├── package-lock.json + │ ├── package.json + │ ├── README.md + │ ├── vue.config.js + │ ├── dev.Dockerfile + │ ├── prod.Dockerfile + │ ├── docker-compose-dev.yml + ├── docker-compose-dev.yml + └── docker-compose-prod.yml +``` + +### Useful resources + +- +- +- +- +- +- +- +- +- +- +- + +### Documentation (weeks 10+) + +Documentation detailing how users can install docker and run containers will be packaged inside the +Art Gallery repo. This documentation will specify build and run commands as well as how each +container can interact with each other. As well as what each command actually does. diff --git a/src/content/docs/products/art-gallery/Documentation/Dockerization/How To Contribute.md b/src/content/docs/products/art-gallery/Documentation/Dockerization/How To Contribute.md new file mode 100644 index 00000000..c6765de8 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Dockerization/How To Contribute.md @@ -0,0 +1,37 @@ +--- +title: Summary:how to contribute to repo# ##Written by Chloe Hulme +--- + +**Fork repo in GUI (only needs to be done once per repo at the start) -> then clone forked repo into +a local directory:** + +git clone < etc... the link from the repo> + +## Creating a new branch: + +git checkout -b / + +_Using 'checkout' will automatically switch you onto this branch_ + +## After making your changes: + +git add . + +git commit ------>> press **'i**' key to edit then: :, hit **esc**, then type +**:wq** and hit enter + +git push -u origin + +## Creating a draft pull request: + +Go into GUI and create a draft pull request **(pull request will be between Thoth Techs file vs your +repo's file, ie. Thoth tech/Art Gallery/README.md vs My Forked Repo/Art Gallery/README.md)**, add in +a relevant comment,then mark it as ready for review. + +## Some useful tools:## \*\*Run your contribution through these to ensure your pull request can be + +approved!\*\* + +_Markdown:_ + +_Prettier:_ **Set print-width: 100, prose-wrap: always** diff --git a/src/content/docs/products/art-gallery/Documentation/Documentation Project/BookStackInformation.md b/src/content/docs/products/art-gallery/Documentation/Documentation Project/BookStackInformation.md new file mode 100644 index 00000000..5d674f89 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Documentation Project/BookStackInformation.md @@ -0,0 +1,11 @@ +--- +title: Documentation BookStack Information +--- + +This is information related to the bookstack.sql database. + +### User + +Admin: Admin Email: Password: password + +IMPORTANT: remember to change the administrator user credentials as soon as you log in. diff --git a/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationContentDiscussion.md b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationContentDiscussion.md new file mode 100644 index 00000000..0c030890 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationContentDiscussion.md @@ -0,0 +1,50 @@ +--- +title: Documentation Content Discussion +--- + +### Preamble + +This document was created during a series of interviews with the delivery leads of the art gallery +project. + +An interesting idea that came from these sessions: consider the possibility of using the knowledge +base as a handover document. + +### Testing - James Burden + +- Testing methodologies, including technology stacks involved. Technologies will change during the + transfer to Ruby, so it’s important to show reasoning behind decisions (such as through archival + research). +- Testing types document. +- Further testing in the future (footprint document). + +### Lighthouse/Front-end Enhancement - Rhonda Jorgensen + +- Integrating lighthouse into the GitHub workflow, as it takes a long time to identify which team is + responsible for each element. + - So, what is needed is knowledge about other teams, by creating a space where individual elements + can be placed for other teams to claim and fix rather than the Lighthouse Project attempting to + fix it without any knowledge of the reasoning behind its properties. +- Rhonda is creating/wants a GitHub how-to document that is accessible and simple for newer and all + members to be able to go through for support. Some of the current documentation can be confusing, + so having a document with clear instructions and screenshots would go a long way in getting people + to contribute to the repository. +- Rhonda has created a Lighthouse onboarding document, so depending on how it is formatted it could + just be transferred immediately onto the knowledge base. + +### Dockerisation/Deployment - Chloe Hulme + +- How to set up and use docker. Whether external or internal information, having it all in one spot + is important. +- Troubleshooting and technical support for docker. +- Document of future improvements, ideas that haven’t been completed, a footprint of future + intentions (term: footprint document). + +### Cyber Security - Domonic Ryzner + +- This project is mainly documentation over technical knowledge. +- A documents subcategory, alongside a incomplete research-based category, like “research for + implementation”, “research for development”. Alternatively, this could be formatted as a single + footprint document. +- Security review documents with best practices, project-wide cyber security best members practices, + and response practices. diff --git a/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationFeasabilityCheck.md b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationFeasabilityCheck.md new file mode 100644 index 00000000..d035723b --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationFeasabilityCheck.md @@ -0,0 +1,37 @@ +--- +title: Documentation Feasibility Check +--- + +### Preamble + +The purpose of this document is to check the feasibility of documentation within the Indigenous Art +Gallery Project through the use of a knowledge base. + +None of the members of this subproject have much familiarity or experience with the platform +"Confluence", so the first main focus will on conducting research on the platform to inform the +choices made in constructing a knowledge base. + +### Research Information + +Upskilling and research in the use of Confluence has been conducted using online resources, and the +following have been idenitifed as useful sources of instruction and information: + +- [The Atlassian Guides:](https://www.atlassian.com/software/confluence/guides/) +- [Software Testing Help Beginner’s Guide:](https://www.softwaretestinghelp.com/atlassian-confluence-tutorial/) +- [Confluence Documentation Tutorial 2023:](https://www.youtube.com/watch?v=emn3hoamV-M) +- [Simon Confluence Tutorial for Beginners:](https://www.youtube.com/watch?v=5p3QzaS33GA) + +### Outcome + +After conducting research on Confluence and its capabilities, it appears that the platform wil be +able to house the kind of documentation, code, or guides required for use during and after the +project. The interface itself is simple enough to navigate and will likely be accommodating to newer +users/members given the correct instruction and guidance, which can also be provided by the content +within the knowledge base itself. + +### Plan + +Further research into the limitations of Confluence (in its free state) need to be carried out to +ensure that none of the restrictions could hinder the use of the knowledge base, especially for use +by the client. If there are limitations in place that cause issue, investigation into circumvention +or minimising harms will be implimented. diff --git a/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationHostCase.md b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationHostCase.md new file mode 100644 index 00000000..b9329ded --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationHostCase.md @@ -0,0 +1,90 @@ +--- +title: Documentation Host Case +--- + +### Preamble + +This was a case created during contact with Andrew Cain concerning hosting options for a BookStack +version of the knowledge base. + +This document has been created to provide a case for hosting the Thoth Tech art gallery project's +knowledge base through Deakin's Google Cloud platform. Alternatives that have been considered for +this project are listed and briefly described to provide context for the project's current +direction. + +### Hosting/Platform Alternatives Considered + +- Confluence: this is the platform that was originally intended for use as the knowledge base since + last handover and was originally promising with its multitude of features and interface. However, + due to certain size limitations that came with the free licence version of the software, and the + classroom licence only providing a percentage discount, the platform was deemed economically + unviable for the project during a meeting with the client, and was dropped in favour of Bookstack. +- Wikidot: extremely briefly considered due to being free to use, being the host of certain other + high-profile hobbyist databases, and plausibly being able to hold the intended knowledge base + structure. This service is unfortunately very outdated, and with all active development having + been dropped years ago, most major wikis are intending to migrate away or are already hosting + alternative sites. +- GitHub Pages: a free and accessible platform that could plausibly hold the knowledge base + structure even in its most basic form, albeit in a less accessible manner than solutions designed + expressly as wiki platforms. It seems that the reason that this wasn't originally considered for + hosting the knowledge base since the previous handover is due the platform not necessarily being + the best option for a knowledge base when compared to platforms like Confluence and Bookstack that + are far more accessible in construction, contribution and navigation to a general audience. The + knowledge base currently is being designed with new project members online that will need support + that is immediately easy to follow to prevent them from getting lost or burnt out, and eventually + the knowledge base will need to accommodate the clientele of the project who will benefit the most + from a knowledge base built on a wiki foundation that is appealing to navigate. In addition, Thoth + Tech does already utilize GitHub for its projects and for certain documentation, which works as + intended, however, having a second GitHub platform for this project may cause uncertainty as to + the purpose and content differences between the repository and the knowledge base. This might + cause issues, for example multiple copies of certain documents existing simultaneously on both + platforms, causing revisions to become desynchronised or lost. A distinct and separate platform + would better serve the strengths necessary for this knowledge base to perform as intended for its + target userbase. +- Vultr: Appeared capable of hosting Bookstack, however the initial payment for verification didn't + appear appropriate for a project with restrictive economic concerns. +- OVHcloud: Also appeared to be practically viable for hosting Bookstack, but the prices of hosting + were too costly so any trial or credits system would likely depreciate rapidly, not allowing for + effective use in the future. +- [Deakin Public Hosting Web Cluster](https://acqol.com.au/): Found during research, but contact + with the IT Service Desk retrieved uncertain responses, and there has been no follow-up since. In + all likelihood, this service has either been discontinued or has been changed into a different + service like the Google Cloud Platform. However, if a response does return positive, this service + could be very promising given its availability due to the client being a Deakin Associate. +- DigitalOcean: Currently the most promising hosting service for hosting Bookstack, as many of the + guides that demonstrate hosting Bookstack use this service to host the server. Allows a fairly + lengthy free trial that could be extended through a service the platform provides for non-profit + enterprises, and can be used in conjunction with Cloudflare for the domain and Cloudron for simple + installation. The droplet created to host Bookstack may also be transferred across accounts, so + hosting responsibilities can always be given to the most relevant individual (client, product + lead, etc.). Should hosting not be possible through Deakin but Bookstack is still the favoured + knowledge base platform, this is the most likely contender for hosting. + +### Pros of Bookstack + +- Open-source software that is continuously supported, has plenty of community support, and the lead + developer of which is easily contactable and will provide support and troubleshooting through the + appropriate channels. +- Easily understood structure concepts that follow a consistent theme that create a memorable + production environment. +- Easily traceable revision system allowing demonstration of progress and contribution. +- Allows for WYSIWYG or Markdown editing that is great for adapting to project preference, and + document creation that allows for simple implementation of interactive elements for a more + effective learning/research experience. +- Deep organizational structure that allows for greater categorization that can be navigated even + more easily with the addition of document metadata. Pros of Deakin Hosting: +- Recognisable domain that students and clientele can trust. +- Hosting will be accessible to and managed by the university hosting the unit the project is being + worked under, allowing for troubleshooting and access to efficiently reach the appropriate + individuals. +- Costs will correlate with purpose and traffic more closely as opposed to with an external hosting + service with a tiered price system. + +### Pros of Deakin Hosting + +- Recognisable domain that students and clientele can trust. +- Hosting will be accessible to and managed by the university hosting the unit the project is being + worked under, allowing for troubleshooting and access to efficiently reach the appropriate + individuals. +- Costs will correlate with purpose and traffic more closely as opposed to with an external hosting + service with a tiered price system. diff --git a/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationInitialDesigns.md b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationInitialDesigns.md new file mode 100644 index 00000000..d60c6dc0 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationInitialDesigns.md @@ -0,0 +1,69 @@ +--- +title: Documentation Knowledge Base Initial Designs +--- + +### Preamble + +This document displays and explains some of the initial design sketches created during +experimentation and research with Confluence. + +These designs are generally simplified, giving a basis for how the knowledge base might be +structured, and do not always show all of the required spaces/categories. These structures may also +be applied to environments outside of Confluence, so should there be any need to migrate away from +Confluence, these structures can follow. + +The content placed in these sketches is only for demonstrative purposes and may not reflect the +content of the final knowledge base. + +### Individual-oriented Proposal + +![Individual-oriented design](https://github.com/thoth-tech/documentation/blob/48eaf79ad87b6ee81435563b74ae0d0dff9cf0a5/docs/ArtGallery/Documentation%20Project/Documentation%20Design%20Sketches/InitialDesign1.png "Individual-oriented Design") + +This design splits content between the various projects currently being worked on and then further +divides it based on the individual working on it, whos page will give a basic overview of their work +and area of expertise. This structure would create individual identity within the knowledge base, +giving members credit for their works through the structure, however it is not a very effective +design for a knowledge base designed to be accessable. This is more of an interesting thought +experiment than a workable design. + +### Technology-oriented Proposal + +![Technology-oriented design](https://github.com/thoth-tech/documentation/blob/48eaf79ad87b6ee81435563b74ae0d0dff9cf0a5/docs/ArtGallery/Documentation%20Project/Documentation%20Design%20Sketches/InitialDesign2.png "Technology-oriented Design") + +This design categorises content for the technology being used in the project based on its relevance +to the area of the project. This structure would be to the benifit of more experienced team members +who already understand the underlying technologies of the project and know how to navigate through +the knowledge base, meaning that it would be less welcoming to newer members without some guidance. +This structure works well as a living knowledge base that is consistently referred to while working +on the project. + +### Developer/Client-oriented Proposal + +![Developer/Client-oriented design](https://github.com/thoth-tech/documentation/blob/48eaf79ad87b6ee81435563b74ae0d0dff9cf0a5/docs/ArtGallery/Documentation%20Project/Documentation%20Design%20Sketches/InitialDesign3.png "Developer/Client-oriented Design") + +This design splits the knowledge base between content for the developers of the project and the +client. The content for developers is split between the active projects, while the client's content +is split between the relevant guides for the project/product and any reports coming from the +developers. This design addresses the need to accommodate for the client during the project's +progress, and provide a space for information on navigating the completed product. + +### Internal/External-oriented Proposal + +![Internal/External-oriented design](https://github.com/thoth-tech/documentation/blob/48eaf79ad87b6ee81435563b74ae0d0dff9cf0a5/docs/ArtGallery/Documentation%20Project/Documentation%20Design%20Sketches/InitialDesign4.png "Internal/External-oriented Design") + +Currently the most expansive design and the best candidate for the final structure, based on the +strucure proposed by Matthew Hesketh. Takes into account both developer and client needs, but is +designed to also accommodate onboarding by creating a space designed to aid in learning more about +the knowledge base itself (in the sketch this is shown as "Confluence Support", however this could +be applied to any platform), allowing newer members and clientele to get more easily acquainted with +navigating through the content. Internal content is separated between active projects, and generally +contains information on the technology and practices used in the project. This is a fairly +well-rounded design, and is both accessible and practical in its structure. + +### BookStack Design + +![BookStack Design](https://github.com/thoth-tech/documentation/blob/48eaf79ad87b6ee81435563b74ae0d0dff9cf0a5/docs/ArtGallery/Documentation%20Project/Documentation%20Design%20Sketches/InitialDesign5.png "BookStack Design") + +Design created from client and delivery lead feedback. Provides sections for each project, newer +members, and clientele. Uses BookStack concepts, but can still be applied to other platforms like +GitHub pages. Last design created for the project. diff --git a/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationProgressReportWeek5.md b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationProgressReportWeek5.md new file mode 100644 index 00000000..0ef5ab03 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationProgressReportWeek5.md @@ -0,0 +1,37 @@ +--- +title: Art Gallery Documentation Progress Report - Week 5 +--- + +## Completed + +Following the first 5 weeks of this trimester, the following things have been produced and/or +submitted for the sake of this project: + +- An initial project outline used to set project goals and delegate general areas of work and study + to documentation project members. +- A MS Teams chat to facilitate communications between the members of the documentation project. +- A Trello board to record and follow individual progress between members. +- 3 partially filled and/or template documents that are used to/will be used for the project + feasibility, the project outline, and any notable research and sources of information regarding + the technology (Confluence) being utilised by this project, all submitted to GitHub. +- This document, submitted to GitHub. + +## Goals Achieved + +Since joining the company and organizing into the appropriate groups for each project, there has +been a sizeable amount of upskilling required to proceed with the project. Upskilling has been +achieved in the use of Trello, the use of GitHub and the use of Confluence, all of which are vital +for project members to successfully deploy self-management, to contribute to the project, and to +design, test and implement the knowledge base solution. There has also been some testing with +Confluence, learning more practically about the functionality and available features of the +technology and how they can be best utilized for the project. + +## Difficulties/Issues + +Given the unfamiliarity with some of the technologies necessary for this project and for working +within and contributing to Toth Tech, there has been very considerable amounts of necessary +upskilling as mentioned above. This has been a sort of barrier to entry before anything has been +able to be achieved within the group, and as the technology is still relatively new to some members, +progress may at times slow down to accommodate for learning. To combat this issue, members need only +to continue their upskilling as often as possible as they work, keeping what they’ve learned fresh +in their memories. diff --git a/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationProjectOutline.md b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationProjectOutline.md new file mode 100644 index 00000000..fdc58365 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationProjectOutline.md @@ -0,0 +1,41 @@ +--- +title: Documentation Project Outline +--- + +### Aim + +The aim of this project is to produce a knowledge base that can be utilized by members of the Art +Gallery Project for the purposes of creating guides and "how-tos", and troubleshooting between the +members of the project. It will also aims to be of use to the client, providing greater insight into +the project's inner-workings. + +### Key Outcomes/Deliverables + +- Feasibility Report: a document determining how this project can be achieved and any potential + issues and solutions that may be integral to the project's success. +- Research Notes: a document that describes key points of interest surrounding the use of knowledge + bases and Confluence, and includes any important or helpful resources that are currently and will + be of use. +- Initial Design: document(s)/image(s)/sketch(s) that outlines the possible structure of the + knowledge base, and how it would be integrated through Confluence. +- Knowledge Base: the structure of knowledge base created within Confluence, ready to begin + collecting information. + +### Delivery Time frames + +All of the above deliverables should be completed and submitted by the end of Trimester 1 of 2023. + +### Product: Indigenous Art Gallery + +### Delivery Lead: Kyle Adams + +### Team Members (ID) + +- Kyle Adams (220220216) +- Matthew Hesketh (218380133) +- Jaron Chen (220296732) + +## Skills Required + +- Confluence +- GitHub diff --git a/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationResearchNotes.md b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationResearchNotes.md new file mode 100644 index 00000000..70819c41 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Documentation Project/DocumentationResearchNotes.md @@ -0,0 +1,152 @@ +--- +title: Documentation/Knowledge Bases:Research +--- + +### Preamble + +The aim of this research is to better understand how BookStack can be used to produce a knowledge +base that would be most effective for the needs of this project, and to provide any future members +working on this project with direction to helpful and important information. + +### Resources + +- [BookStack Installation Page:](https://www.bookstackapp.com/docs/admin/installation/) Details for + installing bookstack, which can be partially followed for installing a local instance for Windows. +- [Manual BookStack Installation on Windows 10:](https://www.youtube.com/watch?v=_v-4BhVz7OI) + Installing BookStack for local testing purposes, works with Windows 11. +- [Installing BookStack on Ubuntu Server:](https://www.youtube.com/watch?v=wq78komr9rs) Basic + overview of setting up a knowledge base online using an Ubuntu droplet with DigitalOcean. +- [Awesome Open Source Overview:](https://www.youtube.com/watch?v=2izkat9tzoY) Independently made + guide that goes over some features and demonstrates the launching of a BookStack site using Ubuntu + via DigitalOcean and Hover to manage the domain. +- [Noted Overview:](https://noted.lol/bookstack/) A review of features and a brief overview of + installing BookStack with Docker Compose. +- [DigitalOcean Higher Education:](https://www.digitalocean.com/landing/do-for-higher-education) + Opportunities available to educational institutions for using DigitalOcean. +- [Techdox Bookstack Docker Install:](https://www.youtube.com/watch?v=VQj5kg7orAM) A brief tutorial + on self-hosting BookStack using Docker. +- [Vultr BookStack Hosting](https://serveravatar.com/deployments/host-bookstack-on-vultr-server) + +### Practical Notes + +- For the purposes of this project, BookStack has to be installed onto a live server with URL access + and HTTPS. +- To export a local database, on localhost (when running Apache) go to phpMyAdmin, go to the + bookstack database, select export at the top, and you’ll be able to export it in SQL format, which + can be transferred into other MySQL and MariaDB databases. + - This means that the knowledge base can be created locally and then transferred onto a live + server for use. +- Hosting options (for Ubuntu) are needed to get the knowledge base online. + - DigitalOcean, which offers a certain amount of free initial credits which would likely suffice + for this project's use and appears to be commonly used for BookStack hosting. + - There's also Hollie's Hub for Good, an part of DigitalOcean which gives out credits to + non-profit, social enterprise organisations with applications resuming May 2023 (the current + month as of writing). + - Hosting through Deakin's Public Hosting Web Cluster could be a possible option depending on if + it's open for this project and what the service can host. + - Cloudron allows for hosting apps on your self-hosted server, including BookStack, so it's a + setup that could work well with something like DigitalOcean. It also has a free tier that allows + for two apps, so BookStack can be installed free onto a server. + - Vultr is another possible option that can allow for low-cost pricing. +- Local installation on Windows requires Git, Composer, and XAMPP, which comes with PHP and MySQL. + +### Features + +- The editor used for contributing to the site can be WYSIWYG or MarkDown, suiting preference. +- In settings, "Public Access" can be enabled to allow users (through the "Guest" account) to access + and view the content on the site. They aren't be able to make changes, but it's a good way for + project members who only need to access the site for its information. +- Sites can allow for registration, which allows for users to sign up using their emails and will + then be given a default role that can be altered in the settings. +- BookStack content can be exported as PDF, plain text or Markdown files for external use. +- Every page has its own privacy settings, limiting who can view it. +- The homepage of the site is generally a display of the most recent activity on the site, however + the default homepage can be changed to display a list of shelves, books, or of a specific page. +- While the editor is less flamboyant when compared to Confluence, it is still completely + serviceable and allows for plenty of customization, along with media in documents that can make + the documents more animated. +- Every page includes a changelog full of revisions. You can customise your session changelog while + you edit a page, and every revision can be previewed and its changes reviewed. A page can be + reverted to a previous revision at any time. + - The number of revisions kept (that is, when older revision are removed) is customizable + depending on the system configuration. + +### Concepts + +- Users on the site have their own page that displays their recently activity on the site. Each user + can have a display name, a profile picture, and a preferred language. +- Roles are allocated to users and effect the privileges of the user they are assigned to. There is + a selection of default roles that can be utilised, and custom roles can be created for more + specific purposes. Roles can restrict what users can view, what they can contribute, and how they + can otherwise interact with the knowledge base. +- The overall hierarchy on BookStack is Shelves -> Books -> Chapters -> Pages. + - Shelves are categories that contain Books. + - Books are collections of Pages. + - Chapters organise Pages within Books + - Pages are the documents of the knowledge base that are written on. + +## Legacy Research + +### Confluence Resources + +- [The Atlassian Guides:](https://www.atlassian.com/software/confluence/guides/) Useful for getting + started with confluence and learning the basics. Begin with Part 1: Get started with Confluence to + go through the guides in order to get more in-depth as you progress. +- [Software Testing Help Beginner’s Guide:](https://www.softwaretestinghelp.com/atlassian-confluence-tutorial/) + A good starting point for confluence as it clearly defines key concepts. Makes notes of the + advantages of working with the software, showing how it is best used. Works through creation on + the platform, with clear instructions. +- [Confluence Documentation Tutorial 2023:](https://www.youtube.com/watch?v=emn3hoamV-M) Tutorial + that goes through basic processes on the site, showing how to navigate and contribute to a space. +- [Simon Confluence Tutorial for Beginners:](https://www.youtube.com/watch?v=5p3QzaS33GA) Active and + in-depth introduction to confluence concepts, as well as touring the platform to help with + navigation. + +These guides and resources cover similar content, but do so with different methods that will be more +to the benefit of various learning preferences. + +### Confluence Considerations + +- In the case of purchasing a plan, the choice between cloud, data centre and server hosting. + - Given that cloud hosting is the simplest with the most details taken care of by the platform + itself, it seems to be the best solution. + - While a server would offer more robust admin controls, because the responsibilities and + authority between delivery leads and project members is fairly even within the project, it + doesn’t seem necessary to have very many restrictions in place. +- For use of confluence without purchasing a plan: the current free plan only allows for 10 members + per site. + +### Confluence Concepts + +- Pages are live documents that make up the knowledge base, collaborative pieces that can be used + for notes, guides or policies. +- Spaces are how pages are organized, with pages of similar content being in the same space. + Depending on the amount of content you have to organise or how large each page is, you may only + need a single space with each page acting as the central document for a particular topic or area + of the project. +- A page tree organizes pages hierarchically under related spaces and other pages to allow for + simple navigation. These sub-pages are as robust as the parent pages they are nested under and are + utilized for the sake of order. +- Every space has a space overview, which is essentially the root page of the space which is always + seen first when entering the space. This is a useful feature to give a brief overview of the + space, navigation, and the content within. + +### Confluence Features + +- Pages and content within pages can be labelled in order to organise or contextualize a page, such + as a page being currently worked on being labelled as “In Progress” or certain content being + labelled as “Disputed” if there are disagreements surrounding it that need to be resolved. +- Content can be restricted (read-only) depending on the space settings, and certain members may + have different permissions depending on their roles. These global settings can divide between + contributing members and reading members. Individual pages can have restrictions placed upon them. +- Confluence makes use of a variety of templates for pages, streamlining the process of creating new + pages for different purposes. Templates can be used as a basis for the project’s own personal + templates within Confluence. +- In editing pages, changes made are automatically synced and available to other members in editing, + however the changes are not made publicly available for viewing until the page is “published’, at + which point the page is changed and the previous version is stored in the version history. Changes + can be reverted to the last version during editing. +- There is integration for markdown code and MS Teams within Confluence, relevant to this project as + important markdown snippets from GitHub can be more easily transferred to Confluence if needed, + and MS Teams integration can allow for less divide between communication and learning channels for + members of the project, given that Teams is a core communication channel. diff --git a/src/content/docs/products/art-gallery/Documentation/Documentation Project/bookstack.sql b/src/content/docs/products/art-gallery/Documentation/Documentation Project/bookstack.sql new file mode 100644 index 00000000..7b209d11 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Documentation Project/bookstack.sql @@ -0,0 +1,13274 @@ +-- phpMyAdmin SQL Dump +-- version 5.2.1 +-- https://www.phpmyadmin.net/ +-- +-- Host: 127.0.0.1 +-- Generation Time: May 18, 2023 at 01:08 PM +-- Server version: 10.4.28-MariaDB +-- PHP Version: 8.2.4 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Database: `bookstack` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `activities` +-- + +CREATE TABLE `activities` ( + `id` int(10) UNSIGNED NOT NULL, + `type` varchar(191) NOT NULL, + `detail` text NOT NULL, + `user_id` int(11) NOT NULL, + `ip` varchar(45) NOT NULL, + `entity_id` int(11) DEFAULT NULL, + `entity_type` varchar(191) DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `activities` +-- + +INSERT INTO `activities` (`id`, `type`, `detail`, `user_id`, `ip`, `entity_id`, `entity_type`, `created_at`, `updated_at`) VALUES +(1, 'auth_login', 'standard; (1) Admin', 1, '::1', NULL, NULL, '2023-05-05 21:08:31', '2023-05-05 21:08:31'), +(2, 'book_create', '(1) My first book', 1, '::1', 1, 'book', '2023-05-05 21:09:00', '2023-05-05 21:09:00'), +(3, 'page_create', '(1) My first page!', 1, '::1', 1, 'page', '2023-05-05 21:09:29', '2023-05-05 21:09:29'), +(4, 'user_update', '(1) Kyle Adams', 1, '::1', NULL, NULL, '2023-05-05 21:21:17', '2023-05-05 21:21:17'), +(5, 'book_delete', '(1) My first book', 1, '::1', 1, 'book', '2023-05-05 21:22:09', '2023-05-05 21:22:09'), +(6, 'settings_update', 'customization', 1, '::1', NULL, NULL, '2023-05-05 22:02:01', '2023-05-05 22:02:01'), +(7, 'bookshelf_create', '(1) The Core Self', 1, '::1', 1, 'bookshelf', '2023-05-06 01:16:52', '2023-05-06 01:16:52'), +(8, 'book_create', '(2) A Wonderous Book', 1, '::1', 2, 'book', '2023-05-06 01:17:12', '2023-05-06 01:17:12'), +(9, 'bookshelf_update', '(1) The Core Self', 1, '::1', 1, 'bookshelf', '2023-05-06 01:17:12', '2023-05-06 01:17:12'), +(10, 'chapter_create', '(1) Chapter 1: How to find a wonder', 1, '::1', 1, 'chapter', '2023-05-06 01:17:46', '2023-05-06 01:17:46'), +(11, 'page_create', '(3) Methods for Catching Wonders', 1, '::1', 3, 'page', '2023-05-06 01:21:08', '2023-05-06 01:21:08'), +(12, 'page_create', '(2) What are Wonders?', 1, '::1', 2, 'page', '2023-05-06 01:22:45', '2023-05-06 01:22:45'), +(13, 'settings_update', 'customization', 1, '::1', NULL, NULL, '2023-05-06 01:27:52', '2023-05-06 01:27:52'), +(14, 'auth_login', 'standard; (1) Kyle Adams', 1, '::1', NULL, NULL, '2023-05-06 05:18:34', '2023-05-06 05:18:34'), +(15, 'auth_login', 'standard; (1) Kyle Adams', 1, '::1', NULL, NULL, '2023-05-06 17:08:26', '2023-05-06 17:08:26'), +(16, 'auth_login', 'standard; (1) Kyle Adams', 1, '::1', NULL, NULL, '2023-05-06 19:23:37', '2023-05-06 19:23:37'), +(17, 'book_delete', '(2) A Wonderous Book', 1, '::1', 2, 'book', '2023-05-06 19:25:33', '2023-05-06 19:25:33'), +(18, 'bookshelf_delete', '(1) The Core Self', 1, '::1', 1, 'bookshelf', '2023-05-06 19:26:06', '2023-05-06 19:26:06'), +(19, 'bookshelf_create', '(2) Testing', 1, '::1', 2, 'bookshelf', '2023-05-06 19:38:15', '2023-05-06 19:38:15'), +(20, 'bookshelf_create', '(3) Lighthouse/Front-end Enhancement', 1, '::1', 3, 'bookshelf', '2023-05-06 19:40:57', '2023-05-06 19:40:57'), +(21, 'bookshelf_create', '(4) Dockerisation/Deployment', 1, '::1', 4, 'bookshelf', '2023-05-06 19:43:44', '2023-05-06 19:43:44'), +(22, 'bookshelf_update', '(4) Dockerisation/Deployment', 1, '::1', 4, 'bookshelf', '2023-05-06 19:44:07', '2023-05-06 19:44:07'), +(23, 'bookshelf_create', '(5) Cyber Security', 1, '::1', 5, 'bookshelf', '2023-05-06 19:45:40', '2023-05-06 19:45:40'), +(24, 'bookshelf_create', '(6) Documentation/Learning Materials', 1, '::1', 6, 'bookshelf', '2023-05-06 19:46:18', '2023-05-06 19:46:18'), +(25, 'bookshelf_create', '(7) Technical Support', 1, '::1', 7, 'bookshelf', '2023-05-06 19:47:24', '2023-05-06 19:47:24'), +(26, 'bookshelf_create', '(8) BookStack Support', 1, '::1', 8, 'bookshelf', '2023-05-06 19:48:45', '2023-05-06 19:48:45'), +(27, 'bookshelf_update', '(8) BookStack Support', 1, '::1', 8, 'bookshelf', '2023-05-06 19:49:11', '2023-05-06 19:49:11'), +(28, 'bookshelf_update', '(5) Cyber Security', 1, '::1', 5, 'bookshelf', '2023-05-06 19:49:30', '2023-05-06 19:49:30'), +(29, 'bookshelf_update', '(4) Dockerisation/Deployment', 1, '::1', 4, 'bookshelf', '2023-05-06 19:49:55', '2023-05-06 19:49:55'), +(30, 'bookshelf_update', '(8) BookStack Support', 1, '::1', 8, 'bookshelf', '2023-05-06 19:50:06', '2023-05-06 19:50:06'), +(31, 'bookshelf_update', '(5) Cyber Security', 1, '::1', 5, 'bookshelf', '2023-05-06 19:50:17', '2023-05-06 19:50:17'), +(32, 'bookshelf_update', '(6) Documentation/Learning Materials', 1, '::1', 6, 'bookshelf', '2023-05-06 19:50:36', '2023-05-06 19:50:36'), +(33, 'bookshelf_update', '(3) Lighthouse/Front-end Enhancement', 1, '::1', 3, 'bookshelf', '2023-05-06 19:51:00', '2023-05-06 19:51:00'), +(34, 'bookshelf_update', '(7) Technical Support', 1, '::1', 7, 'bookshelf', '2023-05-06 19:51:15', '2023-05-06 19:51:15'), +(35, 'bookshelf_update', '(2) Testing', 1, '::1', 2, 'bookshelf', '2023-05-06 19:51:29', '2023-05-06 19:51:29'), +(36, 'book_create', '(3) Example Book', 1, '::1', 3, 'book', '2023-05-06 20:54:16', '2023-05-06 20:54:16'), +(37, 'page_create', '(4) Experimenting with BookStack', 1, '::1', 4, 'page', '2023-05-06 21:21:25', '2023-05-06 21:21:25'), +(38, 'page_update', '(4) Experimenting with BookStack', 1, '::1', 4, 'page', '2023-05-06 21:26:19', '2023-05-06 21:26:19'), +(39, 'page_update', '(4) Experimenting with BookStack', 1, '::1', 4, 'page', '2023-05-06 21:26:37', '2023-05-06 21:26:37'), +(40, 'chapter_create', '(2) Blank Pages', 1, '::1', 2, 'chapter', '2023-05-06 21:31:09', '2023-05-06 21:31:09'), +(41, 'page_create', '(5) Blank Page', 1, '::1', 5, 'page', '2023-05-06 21:31:22', '2023-05-06 21:31:22'), +(42, 'page_create', '(6) Another Blank Page', 1, '::1', 6, 'page', '2023-05-06 21:31:38', '2023-05-06 21:31:38'), +(43, 'page_update', '(4) Experimenting with BookStack', 1, '::1', 4, 'page', '2023-05-06 21:32:22', '2023-05-06 21:32:22'), +(44, 'auth_login', 'standard; (1) Kyle Adams', 1, '::1', NULL, NULL, '2023-05-07 02:07:15', '2023-05-07 02:07:15'), +(45, 'settings_update', 'customization', 1, '::1', NULL, NULL, '2023-05-07 02:07:38', '2023-05-07 02:07:38'), +(46, 'auth_login', 'standard; (1) Kyle Adams', 1, '::1', NULL, NULL, '2023-05-17 12:37:05', '2023-05-17 12:37:05'), +(47, 'auth_login', 'standard; (1) Kyle Adams', 1, '::1', NULL, NULL, '2023-05-17 18:52:35', '2023-05-17 18:52:35'), +(48, 'auth_login', 'standard; (1) Kyle Adams', 1, '::1', NULL, NULL, '2023-05-17 23:14:01', '2023-05-17 23:14:01'), +(49, 'book_create', '(4) Element Review', 1, '::1', 4, 'book', '2023-05-17 23:16:17', '2023-05-17 23:16:17'), +(50, 'bookshelf_update', '(3) Lighthouse/Front-end Enhancement', 1, '::1', 3, 'bookshelf', '2023-05-17 23:16:17', '2023-05-17 23:16:17'), +(51, 'page_create', '(7) Problematic Elements', 1, '::1', 7, 'page', '2023-05-17 23:17:01', '2023-05-17 23:17:01'), +(52, 'page_update', '(7) Problematic Elements', 1, '::1', 7, 'page', '2023-05-17 23:33:36', '2023-05-17 23:33:36'), +(53, 'page_update', '(7) Problematic Elements', 1, '::1', 7, 'page', '2023-05-17 23:35:19', '2023-05-17 23:35:19'), +(54, 'page_update', '(7) Problematic Elements', 1, '::1', 7, 'page', '2023-05-17 23:36:21', '2023-05-17 23:36:21'), +(55, 'book_create', '(5) Lighthouse Guides', 1, '::1', 5, 'book', '2023-05-17 23:37:10', '2023-05-17 23:37:10'), +(56, 'bookshelf_update', '(3) Lighthouse/Front-end Enhancement', 1, '::1', 3, 'bookshelf', '2023-05-17 23:37:10', '2023-05-17 23:37:10'), +(57, 'page_create', '(8) Lighthouse Onboarding', 1, '::1', 8, 'page', '2023-05-17 23:38:36', '2023-05-17 23:38:36'), +(58, 'page_create', '(9) External Guides', 1, '::1', 9, 'page', '2023-05-17 23:39:55', '2023-05-17 23:39:55'), +(59, 'book_create', '(6) Security Documents', 1, '::1', 6, 'book', '2023-05-17 23:41:19', '2023-05-17 23:41:19'), +(60, 'bookshelf_update', '(5) Cyber Security', 1, '::1', 5, 'bookshelf', '2023-05-17 23:41:19', '2023-05-17 23:41:19'), +(61, 'page_create', '(10) Security Best Practices', 1, '::1', 10, 'page', '2023-05-17 23:42:23', '2023-05-17 23:42:23'), +(62, 'page_create', '(11) Member Best Practices', 1, '::1', 11, 'page', '2023-05-17 23:43:26', '2023-05-17 23:43:26'), +(63, 'page_create', '(12) Response Practices', 1, '::1', 12, 'page', '2023-05-17 23:44:56', '2023-05-17 23:44:56'), +(64, 'book_create', '(7) Developing Research', 1, '::1', 7, 'book', '2023-05-17 23:45:46', '2023-05-17 23:45:46'), +(65, 'bookshelf_update', '(5) Cyber Security', 1, '::1', 5, 'bookshelf', '2023-05-17 23:45:46', '2023-05-17 23:45:46'), +(66, 'page_create', '(13) Proposal 1', 1, '::1', 13, 'page', '2023-05-17 23:46:57', '2023-05-17 23:46:57'), +(67, 'page_create', '(14) Proposal 2', 1, '::1', 14, 'page', '2023-05-17 23:47:17', '2023-05-17 23:47:17'), +(68, 'book_create', '(8) Methodologies', 1, '::1', 8, 'book', '2023-05-17 23:48:25', '2023-05-17 23:48:25'), +(69, 'bookshelf_update', '(2) Testing', 1, '::1', 2, 'bookshelf', '2023-05-17 23:48:25', '2023-05-17 23:48:25'), +(70, 'page_create', '(15) Testing Methodologies/Tech Stack', 1, '::1', 15, 'page', '2023-05-17 23:49:33', '2023-05-17 23:49:33'), +(71, 'page_create', '(16) Testing Types', 1, '::1', 16, 'page', '2023-05-17 23:50:17', '2023-05-17 23:50:17'), +(72, 'book_create', '(9) Research', 1, '::1', 9, 'book', '2023-05-17 23:50:50', '2023-05-17 23:50:50'), +(73, 'bookshelf_update', '(2) Testing', 1, '::1', 2, 'bookshelf', '2023-05-17 23:50:50', '2023-05-17 23:50:50'), +(74, 'page_create', '(17) Further Testing', 1, '::1', 17, 'page', '2023-05-17 23:51:24', '2023-05-17 23:51:24'), +(75, 'page_create', '(18) Archival Research', 1, '::1', 18, 'page', '2023-05-17 23:52:42', '2023-05-17 23:52:42'), +(76, 'book_create', '(10) Docker Support', 1, '::1', 10, 'book', '2023-05-17 23:53:44', '2023-05-17 23:53:44'), +(77, 'bookshelf_update', '(4) Dockerisation/Deployment', 1, '::1', 4, 'bookshelf', '2023-05-17 23:53:44', '2023-05-17 23:53:44'), +(78, 'page_create', '(19) Docker Setup', 1, '::1', 19, 'page', '2023-05-17 23:54:20', '2023-05-17 23:54:20'), +(79, 'page_create', '(20) Troubleshooting and Technical Support', 1, '::1', 20, 'page', '2023-05-17 23:55:33', '2023-05-17 23:55:33'), +(80, 'book_create', '(11) Developing Research', 1, '::1', 11, 'book', '2023-05-17 23:56:14', '2023-05-17 23:56:14'), +(81, 'bookshelf_update', '(4) Dockerisation/Deployment', 1, '::1', 4, 'bookshelf', '2023-05-17 23:56:14', '2023-05-17 23:56:14'), +(82, 'page_create', '(21) Future Research', 1, '::1', 21, 'page', '2023-05-17 23:57:07', '2023-05-17 23:57:07'), +(83, 'book_create', '(12) Documentation Overview', 1, '::1', 12, 'book', '2023-05-17 23:58:33', '2023-05-17 23:58:33'), +(84, 'bookshelf_update', '(6) Documentation/Learning Materials', 1, '::1', 6, 'bookshelf', '2023-05-17 23:58:33', '2023-05-17 23:58:33'), +(85, 'page_create', '(22) Project Desired Content', 1, '::1', 22, 'page', '2023-05-17 23:59:29', '2023-05-17 23:59:29'), +(86, 'page_create', '(23) Knowledge Base Structure', 1, '::1', 23, 'page', '2023-05-18 00:01:03', '2023-05-18 00:01:03'), +(87, 'book_create', '(13) BookStack', 1, '::1', 13, 'book', '2023-05-18 00:01:43', '2023-05-18 00:01:43'), +(88, 'bookshelf_update', '(6) Documentation/Learning Materials', 1, '::1', 6, 'bookshelf', '2023-05-18 00:01:43', '2023-05-18 00:01:43'), +(89, 'page_create', '(24) Installation/Testing', 1, '::1', 24, 'page', '2023-05-18 00:02:58', '2023-05-18 00:02:58'), +(90, 'page_create', '(25) Hosting', 1, '::1', 25, 'page', '2023-05-18 00:04:01', '2023-05-18 00:04:01'), +(91, 'bookshelf_create', '(9) Guides for New Members', 1, '::1', 9, 'bookshelf', '2023-05-18 00:04:54', '2023-05-18 00:04:54'), +(92, 'book_create', '(14) GitHub', 1, '::1', 14, 'book', '2023-05-18 00:05:21', '2023-05-18 00:05:21'), +(93, 'bookshelf_update', '(9) Guides for New Members', 1, '::1', 9, 'bookshelf', '2023-05-18 00:05:21', '2023-05-18 00:05:21'), +(94, 'chapter_create', '(3) GitHub Tutorials', 1, '::1', 3, 'chapter', '2023-05-18 00:06:15', '2023-05-18 00:06:15'), +(95, 'page_create', '(26) Navigating', 1, '::1', 26, 'page', '2023-05-18 00:06:51', '2023-05-18 00:06:51'), +(96, 'page_create', '(27) Contributing', 1, '::1', 27, 'page', '2023-05-18 00:07:28', '2023-05-18 00:07:28'), +(97, 'page_create', '(28) External Resources', 1, '::1', 28, 'page', '2023-05-18 00:08:19', '2023-05-18 00:08:19'), +(98, 'book_create', '(15) BookStack Tutorials', 1, '::1', 15, 'book', '2023-05-18 00:09:12', '2023-05-18 00:09:12'), +(99, 'bookshelf_update', '(8) BookStack Support', 1, '::1', 8, 'bookshelf', '2023-05-18 00:09:12', '2023-05-18 00:09:12'), +(100, 'chapter_create', '(4) Tutorials', 1, '::1', 4, 'chapter', '2023-05-18 00:09:46', '2023-05-18 00:09:46'), +(101, 'page_create', '(29) Navigation', 1, '::1', 29, 'page', '2023-05-18 00:10:19', '2023-05-18 00:10:19'), +(102, 'page_create', '(30) Contributing', 1, '::1', 30, 'page', '2023-05-18 00:10:55', '2023-05-18 00:10:55'), +(103, 'page_create', '(31) External Resources', 1, '::1', 31, 'page', '2023-05-18 00:11:50', '2023-05-18 00:11:50'), +(104, 'book_create', '(16) Client Support', 1, '::1', 16, 'book', '2023-05-18 00:12:33', '2023-05-18 00:12:33'), +(105, 'bookshelf_update', '(7) Technical Support', 1, '::1', 7, 'bookshelf', '2023-05-18 00:12:33', '2023-05-18 00:12:33'), +(106, 'page_create', '(32) Contact Information', 1, '::1', 32, 'page', '2023-05-18 00:13:29', '2023-05-18 00:13:29'), +(107, 'chapter_create', '(5) Policy', 1, '::1', 5, 'chapter', '2023-05-18 00:13:58', '2023-05-18 00:13:58'), +(108, 'page_create', '(33) Customer Service Policy', 1, '::1', 33, 'page', '2023-05-18 00:14:47', '2023-05-18 00:14:47'), +(109, 'page_create', '(34) Privacy Policy', 1, '::1', 34, 'page', '2023-05-18 00:15:20', '2023-05-18 00:15:20'), +(110, 'page_create', '(35) Customer FAQ', 1, '::1', 35, 'page', '2023-05-18 00:16:16', '2023-05-18 00:16:16'), +(111, 'book_create', '(17) Getting Started', 1, '::1', 17, 'book', '2023-05-18 00:17:26', '2023-05-18 00:17:26'), +(112, 'bookshelf_update', '(7) Technical Support', 1, '::1', 7, 'bookshelf', '2023-05-18 00:17:26', '2023-05-18 00:17:26'), +(113, 'page_create', '(36) Where to Start', 1, '::1', 36, 'page', '2023-05-18 00:18:27', '2023-05-18 00:18:27'), +(114, 'page_create', '(37) Features and Functionality', 1, '::1', 37, 'page', '2023-05-18 00:19:18', '2023-05-18 00:19:18'), +(115, 'book_create', '(18) Developer Reports', 1, '::1', 18, 'book', '2023-05-18 00:20:06', '2023-05-18 00:20:06'), +(116, 'bookshelf_update', '(7) Technical Support', 1, '::1', 7, 'bookshelf', '2023-05-18 00:20:06', '2023-05-18 00:20:06'), +(117, 'page_create', '(38) Updates', 1, '::1', 38, 'page', '2023-05-18 00:20:52', '2023-05-18 00:20:52'), +(118, 'book_create', '(19) Troubleshooting', 1, '::1', 19, 'book', '2023-05-18 00:21:17', '2023-05-18 00:21:17'), +(119, 'bookshelf_update', '(7) Technical Support', 1, '::1', 7, 'bookshelf', '2023-05-18 00:21:17', '2023-05-18 00:21:17'), +(120, 'page_create', '(39) Common Problems and Solutions', 1, '::1', 39, 'page', '2023-05-18 00:22:43', '2023-05-18 00:22:43'), +(121, 'user_update', '(1) Admin', 1, '::1', NULL, NULL, '2023-05-18 01:05:24', '2023-05-18 01:05:24'), +(122, 'auth_login', 'standard; (1) Admin', 1, '::1', NULL, NULL, '2023-05-18 01:07:34', '2023-05-18 01:07:34'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `api_tokens` +-- + +CREATE TABLE `api_tokens` ( + `id` int(10) UNSIGNED NOT NULL, + `name` varchar(191) NOT NULL, + `token_id` varchar(191) NOT NULL, + `secret` varchar(191) NOT NULL, + `user_id` int(10) UNSIGNED NOT NULL, + `expires_at` date NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `attachments` +-- + +CREATE TABLE `attachments` ( + `id` int(10) UNSIGNED NOT NULL, + `name` varchar(191) NOT NULL, + `path` text NOT NULL, + `extension` varchar(20) NOT NULL, + `uploaded_to` int(11) NOT NULL, + `external` tinyint(1) NOT NULL, + `order` int(11) NOT NULL, + `created_by` int(11) NOT NULL, + `updated_by` int(11) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `books` +-- + +CREATE TABLE `books` ( + `id` int(10) UNSIGNED NOT NULL, + `name` varchar(191) NOT NULL, + `slug` varchar(191) NOT NULL, + `description` text NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `created_by` int(11) NOT NULL, + `updated_by` int(11) NOT NULL, + `image_id` int(11) DEFAULT NULL, + `deleted_at` timestamp NULL DEFAULT NULL, + `owned_by` int(10) UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `books` +-- + +INSERT INTO `books` (`id`, `name`, `slug`, `description`, `created_at`, `updated_at`, `created_by`, `updated_by`, `image_id`, `deleted_at`, `owned_by`) VALUES +(1, 'My first book', 'my-first-book', '', '2023-05-05 21:08:59', '2023-05-05 21:22:09', 1, 1, NULL, '2023-05-05 21:22:09', 1), +(2, 'A Wonderous Book', 'a-wonderous-book', 'A book filled with wonders.', '2023-05-06 01:17:12', '2023-05-06 19:25:33', 1, 1, NULL, '2023-05-06 19:25:33', 1), +(3, 'Example Book', 'example-book', 'This book is an example of the kind of content that can be created for BookStack.', '2023-05-06 20:54:16', '2023-05-06 20:54:16', 1, 1, 2, NULL, 1), +(4, 'Element Review', 'element-review', 'Reviewing project elements under lighthouse tools.', '2023-05-17 23:16:17', '2023-05-17 23:16:17', 1, 1, NULL, NULL, 1), +(5, 'Lighthouse Guides', 'lighthouse-guides', 'Guides and resources for getting started with Lighthouse.', '2023-05-17 23:37:10', '2023-05-17 23:37:10', 1, 1, NULL, NULL, 1), +(6, 'Security Documents', 'security-documents', 'Documents that cover the cyber security team\'s and general security practices.', '2023-05-17 23:41:19', '2023-05-17 23:41:19', 1, 1, NULL, NULL, 1), +(7, 'Developing Research', 'developing-research', 'Research that is currently underdeveloped and in need of further expansion or exploration for the cyber security project go here.', '2023-05-17 23:45:46', '2023-05-17 23:45:46', 1, 1, NULL, NULL, 1), +(8, 'Methodologies', 'methodologies', 'Details regarding testing processes and the technologies involved.', '2023-05-17 23:48:25', '2023-05-17 23:48:25', 1, 1, NULL, NULL, 1), +(9, 'Research', 'research', 'Research conducted for the testing project.', '2023-05-17 23:50:50', '2023-05-17 23:50:50', 1, 1, NULL, NULL, 1), +(10, 'Docker Support', 'docker-support', 'Support in getting started and moving forward with Docker.', '2023-05-17 23:53:44', '2023-05-17 23:53:44', 1, 1, NULL, NULL, 1), +(11, 'Developing Research', 'developing-research-oGa', 'Research areas for Docker that are in need of development.', '2023-05-17 23:56:14', '2023-05-17 23:56:14', 1, 1, NULL, NULL, 1), +(12, 'Documentation Overview', 'documentation-overview', 'An overview of the elements that produce the knowledge base.', '2023-05-17 23:58:32', '2023-05-17 23:58:32', 1, 1, NULL, NULL, 1), +(13, 'BookStack', 'bookstack', 'Materials for utilizing BookStack to host a knowledge base.', '2023-05-18 00:01:43', '2023-05-18 00:01:43', 1, 1, NULL, NULL, 1), +(14, 'GitHub', 'github', 'Information on GitHub use within the company and project.', '2023-05-18 00:05:21', '2023-05-18 00:05:21', 1, 1, NULL, NULL, 1), +(15, 'BookStack Tutorials', 'bookstack-tutorials', 'Resources for members to begin working alongside BookStack as part of the project.', '2023-05-18 00:09:12', '2023-05-18 00:09:12', 1, 1, NULL, NULL, 1), +(16, 'Client Support', 'client-support', 'Support information for the clientele of the Thoth Tech art gallery project.', '2023-05-18 00:12:33', '2023-05-18 00:12:33', 1, 1, NULL, NULL, 1), +(17, 'Getting Started', 'getting-started', 'Guides for first starting out with the art gallery platform.', '2023-05-18 00:17:26', '2023-05-18 00:17:26', 1, 1, NULL, NULL, 1), +(18, 'Developer Reports', 'developer-reports', 'Communications from the developers to the clientele regarding the status of the art gallery project and platform.', '2023-05-18 00:20:06', '2023-05-18 00:20:06', 1, 1, NULL, NULL, 1), +(19, 'Troubleshooting', 'troubleshooting', 'Troubleshooting solutions for the art gallery platform.', '2023-05-18 00:21:17', '2023-05-18 00:21:17', 1, 1, NULL, NULL, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `bookshelves` +-- + +CREATE TABLE `bookshelves` ( + `id` int(10) UNSIGNED NOT NULL, + `name` varchar(180) NOT NULL, + `slug` varchar(180) NOT NULL, + `description` text NOT NULL, + `created_by` int(11) DEFAULT NULL, + `updated_by` int(11) DEFAULT NULL, + `image_id` int(11) DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `deleted_at` timestamp NULL DEFAULT NULL, + `owned_by` int(10) UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `bookshelves` +-- + +INSERT INTO `bookshelves` (`id`, `name`, `slug`, `description`, `created_by`, `updated_by`, `image_id`, `created_at`, `updated_at`, `deleted_at`, `owned_by`) VALUES +(1, 'The Core Self', 'the-core-self', 'The main shelf that holds all knowledge.', 1, 1, NULL, '2023-05-06 01:16:51', '2023-05-06 19:26:06', '2023-05-06 19:26:06', 1), +(2, 'Testing', 'testing', 'Testing for backend and frontend.', 1, 1, NULL, '2023-05-06 19:38:15', '2023-05-06 19:51:29', NULL, 1), +(3, 'Lighthouse/Front-end Enhancement', 'lighthousefront-end-enhancement', 'Identifying areas of improvement with Google Lighthouse and discovering more ways to refine the front-end.', 1, 1, NULL, '2023-05-06 19:40:57', '2023-05-06 19:51:00', NULL, 1), +(4, 'Dockerisation/Deployment', 'dockerisationdeployment', 'Dockerising the art gallery project to run smoothly and deploy into a Docker Swarm.', 1, 1, NULL, '2023-05-06 19:43:44', '2023-05-06 19:49:55', NULL, 1), +(5, 'Cyber Security', 'cyber-security', 'Reviewing and setting up the security for the art gallery.', 1, 1, NULL, '2023-05-06 19:45:40', '2023-05-06 19:50:17', NULL, 1), +(6, 'Documentation/Learning Materials', 'documentationlearning-materials', 'Creating a knowledge base to support project development.', 1, 1, NULL, '2023-05-06 19:46:18', '2023-05-06 19:50:36', NULL, 1), +(7, 'Technical Support', 'technical-support', 'Art Gallery information and support for non-developers.', 1, 1, NULL, '2023-05-06 19:47:24', '2023-05-06 19:51:14', NULL, 1), +(8, 'BookStack Support', 'bookstack-support', 'Guides and information to help new users get started navigating and contributing to this knowledge base.', 1, 1, NULL, '2023-05-06 19:48:45', '2023-05-06 19:50:06', NULL, 1), +(9, 'Guides for New Members', 'guides-for-new-members', 'Guides designed to help new members settle into their roles and begin contributing to the project.', 1, 1, NULL, '2023-05-18 00:04:54', '2023-05-18 00:04:54', NULL, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `bookshelves_books` +-- + +CREATE TABLE `bookshelves_books` ( + `bookshelf_id` int(10) UNSIGNED NOT NULL, + `book_id` int(10) UNSIGNED NOT NULL, + `order` int(10) UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `bookshelves_books` +-- + +INSERT INTO `bookshelves_books` (`bookshelf_id`, `book_id`, `order`) VALUES +(1, 2, 1), +(2, 8, 1), +(2, 9, 2), +(3, 4, 1), +(3, 5, 2), +(4, 10, 1), +(4, 11, 2), +(5, 6, 1), +(5, 7, 2), +(6, 12, 1), +(6, 13, 2), +(7, 16, 1), +(7, 17, 2), +(7, 18, 3), +(7, 19, 4), +(8, 15, 1), +(9, 14, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `cache` +-- + +CREATE TABLE `cache` ( + `key` varchar(191) NOT NULL, + `value` text NOT NULL, + `expiration` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `chapters` +-- + +CREATE TABLE `chapters` ( + `id` int(10) UNSIGNED NOT NULL, + `book_id` int(11) NOT NULL, + `slug` varchar(191) NOT NULL, + `name` text NOT NULL, + `description` text NOT NULL, + `priority` int(11) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `created_by` int(11) NOT NULL, + `updated_by` int(11) NOT NULL, + `deleted_at` timestamp NULL DEFAULT NULL, + `owned_by` int(10) UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `chapters` +-- + +INSERT INTO `chapters` (`id`, `book_id`, `slug`, `name`, `description`, `priority`, `created_at`, `updated_at`, `created_by`, `updated_by`, `deleted_at`, `owned_by`) VALUES +(1, 2, 'chapter-1-how-to-find-a-wonder', 'Chapter 1: How to find a wonder', 'Wonders are elusive, and may not be found so easily.', 2, '2023-05-06 01:17:46', '2023-05-06 19:25:33', 1, 1, '2023-05-06 19:25:33', 1), +(2, 3, 'blank-pages', 'Blank Pages', 'A collection of blank pages with no use.', 3, '2023-05-06 21:31:08', '2023-05-06 21:31:08', 1, 1, NULL, 1), +(3, 14, 'github-tutorials', 'GitHub Tutorials', 'Tutorials on getting started with GitHub.', 2, '2023-05-18 00:06:15', '2023-05-18 00:06:15', 1, 1, NULL, 1), +(4, 15, 'tutorials', 'Tutorials', 'The main tutorials related to project member interactions with GitHub.', 2, '2023-05-18 00:09:46', '2023-05-18 00:09:46', 1, 1, NULL, 1), +(5, 16, 'policy', 'Policy', 'Project policy documents.', 3, '2023-05-18 00:13:58', '2023-05-18 00:13:58', 1, 1, NULL, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `comments` +-- + +CREATE TABLE `comments` ( + `id` int(10) UNSIGNED NOT NULL, + `entity_id` int(10) UNSIGNED NOT NULL, + `entity_type` varchar(191) NOT NULL, + `text` longtext DEFAULT NULL, + `html` longtext DEFAULT NULL, + `parent_id` int(10) UNSIGNED DEFAULT NULL, + `local_id` int(10) UNSIGNED DEFAULT NULL, + `created_by` int(10) UNSIGNED NOT NULL, + `updated_by` int(10) UNSIGNED DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `deletions` +-- + +CREATE TABLE `deletions` ( + `id` int(10) UNSIGNED NOT NULL, + `deleted_by` int(11) NOT NULL, + `deletable_type` varchar(100) NOT NULL, + `deletable_id` int(11) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `deletions` +-- + +INSERT INTO `deletions` (`id`, `deleted_by`, `deletable_type`, `deletable_id`, `created_at`, `updated_at`) VALUES +(1, 1, 'book', 1, '2023-05-05 21:22:09', '2023-05-05 21:22:09'), +(2, 1, 'book', 2, '2023-05-06 19:25:33', '2023-05-06 19:25:33'), +(3, 1, 'bookshelf', 1, '2023-05-06 19:26:06', '2023-05-06 19:26:06'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `email_confirmations` +-- + +CREATE TABLE `email_confirmations` ( + `id` int(10) UNSIGNED NOT NULL, + `user_id` int(11) NOT NULL, + `token` varchar(191) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `entity_permissions` +-- + +CREATE TABLE `entity_permissions` ( + `id` bigint(20) UNSIGNED NOT NULL, + `entity_id` int(10) UNSIGNED NOT NULL, + `entity_type` varchar(25) NOT NULL, + `role_id` int(10) UNSIGNED NOT NULL, + `view` tinyint(1) NOT NULL DEFAULT 0, + `create` tinyint(1) NOT NULL DEFAULT 0, + `update` tinyint(1) NOT NULL DEFAULT 0, + `delete` tinyint(1) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `failed_jobs` +-- + +CREATE TABLE `failed_jobs` ( + `id` bigint(20) UNSIGNED NOT NULL, + `uuid` varchar(191) NOT NULL, + `connection` text NOT NULL, + `queue` text NOT NULL, + `payload` longtext NOT NULL, + `exception` longtext NOT NULL, + `failed_at` timestamp NOT NULL DEFAULT current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `favourites` +-- + +CREATE TABLE `favourites` ( + `id` int(10) UNSIGNED NOT NULL, + `user_id` int(11) NOT NULL, + `favouritable_id` int(11) NOT NULL, + `favouritable_type` varchar(100) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `images` +-- + +CREATE TABLE `images` ( + `id` int(10) UNSIGNED NOT NULL, + `name` varchar(191) NOT NULL, + `url` varchar(191) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `created_by` int(11) NOT NULL, + `updated_by` int(11) NOT NULL, + `path` varchar(400) NOT NULL, + `type` varchar(191) NOT NULL, + `uploaded_to` int(11) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `images` +-- + +INSERT INTO `images` (`id`, `name`, `url`, `created_at`, `updated_at`, `created_by`, `updated_by`, `path`, `type`, `uploaded_to`) VALUES +(2, 'emergency-tree-services.jpg', 'http://localhost:8080/uploads/images/cover_book/2023-05/emergency-tree-services.jpg', '2023-05-06 20:54:16', '2023-05-06 20:54:16', 1, 1, '/uploads/images/cover_book/2023-05/emergency-tree-services.jpg', 'cover_book', 3), +(3, '6ed2cb83de2d8c53a81286c9cf5c4f58.jpg', 'http://localhost:8080/uploads/images/gallery/2023-05/6ed2cb83de2d8c53a81286c9cf5c4f58.jpg', '2023-05-06 21:22:44', '2023-05-06 21:22:44', 1, 1, '/uploads/images/gallery/2023-05/6ed2cb83de2d8c53a81286c9cf5c4f58.jpg', 'gallery', 4), +(4, 'pine-watt-2Hzmz15wGik-unsplash (1).jpg', 'http://localhost:8080/uploads/images/gallery/2023-05/pine-watt-2hzmz15wgik-unsplash-1.jpg', '2023-05-17 23:32:42', '2023-05-17 23:32:42', 1, 1, '/uploads/images/gallery/2023-05/pine-watt-2hzmz15wgik-unsplash-1.jpg', 'gallery', 7); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `jobs` +-- + +CREATE TABLE `jobs` ( + `id` bigint(20) UNSIGNED NOT NULL, + `queue` varchar(191) NOT NULL, + `payload` longtext NOT NULL, + `attempts` tinyint(3) UNSIGNED NOT NULL, + `reserved_at` int(10) UNSIGNED DEFAULT NULL, + `available_at` int(10) UNSIGNED NOT NULL, + `created_at` int(10) UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `joint_permissions` +-- + +CREATE TABLE `joint_permissions` ( + `role_id` int(11) NOT NULL, + `entity_type` varchar(191) NOT NULL, + `entity_id` int(11) NOT NULL, + `status` tinyint(3) UNSIGNED NOT NULL, + `owner_id` int(10) UNSIGNED DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `joint_permissions` +-- + +INSERT INTO `joint_permissions` (`role_id`, `entity_type`, `entity_id`, `status`, `owner_id`) VALUES +(1, 'book', 1, 3, 1), +(1, 'book', 2, 3, 1), +(1, 'book', 3, 3, 1), +(1, 'book', 4, 3, 1), +(1, 'book', 5, 3, 1), +(1, 'book', 6, 3, 1), +(1, 'book', 7, 3, 1), +(1, 'book', 8, 3, 1), +(1, 'book', 9, 3, 1), +(1, 'book', 10, 3, 1), +(1, 'book', 11, 3, 1), +(1, 'book', 12, 3, 1), +(1, 'book', 13, 3, 1), +(1, 'book', 14, 3, 1), +(1, 'book', 15, 3, 1), +(1, 'book', 16, 3, 1), +(1, 'book', 17, 3, 1), +(1, 'book', 18, 3, 1), +(1, 'book', 19, 3, 1), +(1, 'bookshelf', 1, 3, 1), +(1, 'bookshelf', 2, 3, 1), +(1, 'bookshelf', 3, 3, 1), +(1, 'bookshelf', 4, 3, 1), +(1, 'bookshelf', 5, 3, 1), +(1, 'bookshelf', 6, 3, 1), +(1, 'bookshelf', 7, 3, 1), +(1, 'bookshelf', 8, 3, 1), +(1, 'bookshelf', 9, 3, 1), +(1, 'chapter', 1, 3, 1), +(1, 'chapter', 2, 3, 1), +(1, 'chapter', 3, 3, 1), +(1, 'chapter', 4, 3, 1), +(1, 'chapter', 5, 3, 1), +(1, 'page', 1, 3, 1), +(1, 'page', 2, 3, 1), +(1, 'page', 3, 3, 1), +(1, 'page', 4, 3, 1), +(1, 'page', 5, 3, 1), +(1, 'page', 6, 3, 1), +(1, 'page', 7, 3, 1), +(1, 'page', 8, 3, 1), +(1, 'page', 9, 3, 1), +(1, 'page', 10, 3, 1), +(1, 'page', 11, 3, 1), +(1, 'page', 12, 3, 1), +(1, 'page', 13, 3, 1), +(1, 'page', 14, 3, 1), +(1, 'page', 15, 3, 1), +(1, 'page', 16, 3, 1), +(1, 'page', 17, 3, 1), +(1, 'page', 18, 3, 1), +(1, 'page', 19, 3, 1), +(1, 'page', 20, 3, 1), +(1, 'page', 21, 3, 1), +(1, 'page', 22, 3, 1), +(1, 'page', 23, 3, 1), +(1, 'page', 24, 3, 1), +(1, 'page', 25, 3, 1), +(1, 'page', 26, 3, 1), +(1, 'page', 27, 3, 1), +(1, 'page', 28, 3, 1), +(1, 'page', 29, 3, 1), +(1, 'page', 30, 3, 1), +(1, 'page', 31, 3, 1), +(1, 'page', 32, 3, 1), +(1, 'page', 33, 3, 1), +(1, 'page', 34, 3, 1), +(1, 'page', 35, 3, 1), +(1, 'page', 36, 3, 1), +(1, 'page', 37, 3, 1), +(1, 'page', 38, 3, 1), +(1, 'page', 39, 3, 1), +(2, 'book', 1, 1, 1), +(2, 'book', 2, 1, 1), +(2, 'book', 3, 1, 1), +(2, 'book', 4, 1, 1), +(2, 'book', 5, 1, 1), +(2, 'book', 6, 1, 1), +(2, 'book', 7, 1, 1), +(2, 'book', 8, 1, 1), +(2, 'book', 9, 1, 1), +(2, 'book', 10, 1, 1), +(2, 'book', 11, 1, 1), +(2, 'book', 12, 1, 1), +(2, 'book', 13, 1, 1), +(2, 'book', 14, 1, 1), +(2, 'book', 15, 1, 1), +(2, 'book', 16, 1, 1), +(2, 'book', 17, 1, 1), +(2, 'book', 18, 1, 1), +(2, 'book', 19, 1, 1), +(2, 'bookshelf', 1, 1, 1), +(2, 'bookshelf', 2, 1, 1), +(2, 'bookshelf', 3, 1, 1), +(2, 'bookshelf', 4, 1, 1), +(2, 'bookshelf', 5, 1, 1), +(2, 'bookshelf', 6, 1, 1), +(2, 'bookshelf', 7, 1, 1), +(2, 'bookshelf', 8, 1, 1), +(2, 'bookshelf', 9, 1, 1), +(2, 'chapter', 1, 1, 1), +(2, 'chapter', 2, 1, 1), +(2, 'chapter', 3, 1, 1), +(2, 'chapter', 4, 1, 1), +(2, 'chapter', 5, 1, 1), +(2, 'page', 1, 1, 1), +(2, 'page', 2, 1, 1), +(2, 'page', 3, 1, 1), +(2, 'page', 4, 1, 1), +(2, 'page', 5, 1, 1), +(2, 'page', 6, 1, 1), +(2, 'page', 7, 1, 1), +(2, 'page', 8, 1, 1), +(2, 'page', 9, 1, 1), +(2, 'page', 10, 1, 1), +(2, 'page', 11, 1, 1), +(2, 'page', 12, 1, 1), +(2, 'page', 13, 1, 1), +(2, 'page', 14, 1, 1), +(2, 'page', 15, 1, 1), +(2, 'page', 16, 1, 1), +(2, 'page', 17, 1, 1), +(2, 'page', 18, 1, 1), +(2, 'page', 19, 1, 1), +(2, 'page', 20, 1, 1), +(2, 'page', 21, 1, 1), +(2, 'page', 22, 1, 1), +(2, 'page', 23, 1, 1), +(2, 'page', 24, 1, 1), +(2, 'page', 25, 1, 1), +(2, 'page', 26, 1, 1), +(2, 'page', 27, 1, 1), +(2, 'page', 28, 1, 1), +(2, 'page', 29, 1, 1), +(2, 'page', 30, 1, 1), +(2, 'page', 31, 1, 1), +(2, 'page', 32, 1, 1), +(2, 'page', 33, 1, 1), +(2, 'page', 34, 1, 1), +(2, 'page', 35, 1, 1), +(2, 'page', 36, 1, 1), +(2, 'page', 37, 1, 1), +(2, 'page', 38, 1, 1), +(2, 'page', 39, 1, 1), +(3, 'book', 1, 1, 1), +(3, 'book', 2, 1, 1), +(3, 'book', 3, 1, 1), +(3, 'book', 4, 1, 1), +(3, 'book', 5, 1, 1), +(3, 'book', 6, 1, 1), +(3, 'book', 7, 1, 1), +(3, 'book', 8, 1, 1), +(3, 'book', 9, 1, 1), +(3, 'book', 10, 1, 1), +(3, 'book', 11, 1, 1), +(3, 'book', 12, 1, 1), +(3, 'book', 13, 1, 1), +(3, 'book', 14, 1, 1), +(3, 'book', 15, 1, 1), +(3, 'book', 16, 1, 1), +(3, 'book', 17, 1, 1), +(3, 'book', 18, 1, 1), +(3, 'book', 19, 1, 1), +(3, 'bookshelf', 1, 1, 1), +(3, 'bookshelf', 2, 1, 1), +(3, 'bookshelf', 3, 1, 1), +(3, 'bookshelf', 4, 1, 1), +(3, 'bookshelf', 5, 1, 1), +(3, 'bookshelf', 6, 1, 1), +(3, 'bookshelf', 7, 1, 1), +(3, 'bookshelf', 8, 1, 1), +(3, 'bookshelf', 9, 1, 1), +(3, 'chapter', 1, 1, 1), +(3, 'chapter', 2, 1, 1), +(3, 'chapter', 3, 1, 1), +(3, 'chapter', 4, 1, 1), +(3, 'chapter', 5, 1, 1), +(3, 'page', 1, 1, 1), +(3, 'page', 2, 1, 1), +(3, 'page', 3, 1, 1), +(3, 'page', 4, 1, 1), +(3, 'page', 5, 1, 1), +(3, 'page', 6, 1, 1), +(3, 'page', 7, 1, 1), +(3, 'page', 8, 1, 1), +(3, 'page', 9, 1, 1), +(3, 'page', 10, 1, 1), +(3, 'page', 11, 1, 1), +(3, 'page', 12, 1, 1), +(3, 'page', 13, 1, 1), +(3, 'page', 14, 1, 1), +(3, 'page', 15, 1, 1), +(3, 'page', 16, 1, 1), +(3, 'page', 17, 1, 1), +(3, 'page', 18, 1, 1), +(3, 'page', 19, 1, 1), +(3, 'page', 20, 1, 1), +(3, 'page', 21, 1, 1), +(3, 'page', 22, 1, 1), +(3, 'page', 23, 1, 1), +(3, 'page', 24, 1, 1), +(3, 'page', 25, 1, 1), +(3, 'page', 26, 1, 1), +(3, 'page', 27, 1, 1), +(3, 'page', 28, 1, 1), +(3, 'page', 29, 1, 1), +(3, 'page', 30, 1, 1), +(3, 'page', 31, 1, 1), +(3, 'page', 32, 1, 1), +(3, 'page', 33, 1, 1), +(3, 'page', 34, 1, 1), +(3, 'page', 35, 1, 1), +(3, 'page', 36, 1, 1), +(3, 'page', 37, 1, 1), +(3, 'page', 38, 1, 1), +(3, 'page', 39, 1, 1), +(4, 'book', 1, 1, 1), +(4, 'book', 2, 1, 1), +(4, 'book', 3, 1, 1), +(4, 'book', 4, 1, 1), +(4, 'book', 5, 1, 1), +(4, 'book', 6, 1, 1), +(4, 'book', 7, 1, 1), +(4, 'book', 8, 1, 1), +(4, 'book', 9, 1, 1), +(4, 'book', 10, 1, 1), +(4, 'book', 11, 1, 1), +(4, 'book', 12, 1, 1), +(4, 'book', 13, 1, 1), +(4, 'book', 14, 1, 1), +(4, 'book', 15, 1, 1), +(4, 'book', 16, 1, 1), +(4, 'book', 17, 1, 1), +(4, 'book', 18, 1, 1), +(4, 'book', 19, 1, 1), +(4, 'bookshelf', 1, 1, 1), +(4, 'bookshelf', 2, 1, 1), +(4, 'bookshelf', 3, 1, 1), +(4, 'bookshelf', 4, 1, 1), +(4, 'bookshelf', 5, 1, 1), +(4, 'bookshelf', 6, 1, 1), +(4, 'bookshelf', 7, 1, 1), +(4, 'bookshelf', 8, 1, 1), +(4, 'bookshelf', 9, 1, 1), +(4, 'chapter', 1, 1, 1), +(4, 'chapter', 2, 1, 1), +(4, 'chapter', 3, 1, 1), +(4, 'chapter', 4, 1, 1), +(4, 'chapter', 5, 1, 1), +(4, 'page', 1, 1, 1), +(4, 'page', 2, 1, 1), +(4, 'page', 3, 1, 1), +(4, 'page', 4, 1, 1), +(4, 'page', 5, 1, 1), +(4, 'page', 6, 1, 1), +(4, 'page', 7, 1, 1), +(4, 'page', 8, 1, 1), +(4, 'page', 9, 1, 1), +(4, 'page', 10, 1, 1), +(4, 'page', 11, 1, 1), +(4, 'page', 12, 1, 1), +(4, 'page', 13, 1, 1), +(4, 'page', 14, 1, 1), +(4, 'page', 15, 1, 1), +(4, 'page', 16, 1, 1), +(4, 'page', 17, 1, 1), +(4, 'page', 18, 1, 1), +(4, 'page', 19, 1, 1), +(4, 'page', 20, 1, 1), +(4, 'page', 21, 1, 1), +(4, 'page', 22, 1, 1), +(4, 'page', 23, 1, 1), +(4, 'page', 24, 1, 1), +(4, 'page', 25, 1, 1), +(4, 'page', 26, 1, 1), +(4, 'page', 27, 1, 1), +(4, 'page', 28, 1, 1), +(4, 'page', 29, 1, 1), +(4, 'page', 30, 1, 1), +(4, 'page', 31, 1, 1), +(4, 'page', 32, 1, 1), +(4, 'page', 33, 1, 1), +(4, 'page', 34, 1, 1), +(4, 'page', 35, 1, 1), +(4, 'page', 36, 1, 1), +(4, 'page', 37, 1, 1), +(4, 'page', 38, 1, 1), +(4, 'page', 39, 1, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `mfa_values` +-- + +CREATE TABLE `mfa_values` ( + `id` int(10) UNSIGNED NOT NULL, + `user_id` int(11) NOT NULL, + `method` varchar(20) NOT NULL, + `value` text NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `migrations` +-- + +CREATE TABLE `migrations` ( + `id` int(10) UNSIGNED NOT NULL, + `migration` varchar(191) NOT NULL, + `batch` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `migrations` +-- + +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES +(1, '2014_10_12_000000_create_users_table', 1), +(2, '2014_10_12_100000_create_password_resets_table', 1), +(3, '2015_07_12_114933_create_books_table', 1), +(4, '2015_07_12_190027_create_pages_table', 1), +(5, '2015_07_13_172121_create_images_table', 1), +(6, '2015_07_27_172342_create_chapters_table', 1), +(7, '2015_08_08_200447_add_users_to_entities', 1), +(8, '2015_08_09_093534_create_page_revisions_table', 1), +(9, '2015_08_16_142133_create_activities_table', 1), +(10, '2015_08_29_105422_add_roles_and_permissions', 1), +(11, '2015_08_30_125859_create_settings_table', 1), +(12, '2015_08_31_175240_add_search_indexes', 1), +(13, '2015_09_04_165821_create_social_accounts_table', 1), +(14, '2015_09_05_164707_add_email_confirmation_table', 1), +(15, '2015_11_21_145609_create_views_table', 1), +(16, '2015_11_26_221857_add_entity_indexes', 1), +(17, '2015_12_05_145049_fulltext_weighting', 1), +(18, '2015_12_07_195238_add_image_upload_types', 1), +(19, '2015_12_09_195748_add_user_avatars', 1), +(20, '2016_01_11_210908_add_external_auth_to_users', 1), +(21, '2016_02_25_184030_add_slug_to_revisions', 1), +(22, '2016_02_27_120329_update_permissions_and_roles', 1), +(23, '2016_02_28_084200_add_entity_access_controls', 1), +(24, '2016_03_09_203143_add_page_revision_types', 1), +(25, '2016_03_13_082138_add_page_drafts', 1), +(26, '2016_03_25_123157_add_markdown_support', 1), +(27, '2016_04_09_100730_add_view_permissions_to_roles', 1), +(28, '2016_04_20_192649_create_joint_permissions_table', 1), +(29, '2016_05_06_185215_create_tags_table', 1), +(30, '2016_07_07_181521_add_summary_to_page_revisions', 1), +(31, '2016_09_29_101449_remove_hidden_roles', 1), +(32, '2016_10_09_142037_create_attachments_table', 1), +(33, '2017_01_21_163556_create_cache_table', 1), +(34, '2017_01_21_163602_create_sessions_table', 1), +(35, '2017_03_19_091553_create_search_index_table', 1), +(36, '2017_04_20_185112_add_revision_counts', 1), +(37, '2017_07_02_152834_update_db_encoding_to_ut8mb4', 1), +(38, '2017_08_01_130541_create_comments_table', 1), +(39, '2017_08_29_102650_add_cover_image_display', 1), +(40, '2018_07_15_173514_add_role_external_auth_id', 1), +(41, '2018_08_04_115700_create_bookshelves_table', 1), +(42, '2019_07_07_112515_add_template_support', 1), +(43, '2019_08_17_140214_add_user_invites_table', 1), +(44, '2019_12_29_120917_add_api_auth', 1), +(45, '2020_08_04_111754_drop_joint_permissions_id', 1), +(46, '2020_08_04_131052_remove_role_name_field', 1), +(47, '2020_09_19_094251_add_activity_indexes', 1), +(48, '2020_09_27_210059_add_entity_soft_deletes', 1), +(49, '2020_09_27_210528_create_deletions_table', 1), +(50, '2020_11_07_232321_simplify_activities_table', 1), +(51, '2020_12_30_173528_add_owned_by_field_to_entities', 1), +(52, '2021_01_30_225441_add_settings_type_column', 1), +(53, '2021_03_08_215138_add_user_slug', 1), +(54, '2021_05_15_173110_create_favourites_table', 1), +(55, '2021_06_30_173111_create_mfa_values_table', 1), +(56, '2021_07_03_085038_add_mfa_enforced_to_roles_table', 1), +(57, '2021_08_28_161743_add_export_role_permission', 1), +(58, '2021_09_26_044614_add_activities_ip_column', 1), +(59, '2021_11_26_070438_add_index_for_user_ip', 1), +(60, '2021_12_07_111343_create_webhooks_table', 1), +(61, '2021_12_13_152024_create_jobs_table', 1), +(62, '2021_12_13_152120_create_failed_jobs_table', 1), +(63, '2022_01_03_154041_add_webhooks_timeout_error_columns', 1), +(64, '2022_04_17_101741_add_editor_change_field_and_permission', 1), +(65, '2022_04_25_140741_update_polymorphic_types', 1), +(66, '2022_07_16_170051_drop_joint_permission_type', 1), +(67, '2022_08_17_092941_create_references_table', 1), +(68, '2022_09_02_082910_fix_shelf_cover_image_types', 1), +(69, '2022_10_07_091406_flatten_entity_permissions_table', 1), +(70, '2022_10_08_104202_drop_entity_restricted_field', 1), +(71, '2023_01_24_104625_refactor_joint_permissions_storage', 1), +(72, '2023_01_28_141230_copy_color_settings_for_dark_mode', 1), +(73, '2023_02_20_093655_increase_attachments_path_length', 1), +(74, '2023_02_23_200227_add_updated_at_index_to_pages', 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pages` +-- + +CREATE TABLE `pages` ( + `id` int(10) UNSIGNED NOT NULL, + `book_id` int(11) NOT NULL, + `chapter_id` int(11) NOT NULL, + `name` varchar(191) NOT NULL, + `slug` varchar(191) NOT NULL, + `html` longtext NOT NULL, + `text` longtext NOT NULL, + `priority` int(11) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `created_by` int(11) NOT NULL, + `updated_by` int(11) NOT NULL, + `draft` tinyint(1) NOT NULL DEFAULT 0, + `markdown` longtext NOT NULL DEFAULT '', + `revision_count` int(11) NOT NULL, + `template` tinyint(1) NOT NULL DEFAULT 0, + `deleted_at` timestamp NULL DEFAULT NULL, + `owned_by` int(10) UNSIGNED NOT NULL, + `editor` varchar(50) NOT NULL DEFAULT '' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `pages` +-- + +INSERT INTO `pages` (`id`, `book_id`, `chapter_id`, `name`, `slug`, `html`, `text`, `priority`, `created_at`, `updated_at`, `created_by`, `updated_by`, `draft`, `markdown`, `revision_count`, `template`, `deleted_at`, `owned_by`, `editor`) VALUES +(1, 1, 0, 'My first page!', 'my-first-page', '

Testing!

', 'Testing!', 2, '2023-05-05 21:09:02', '2023-05-05 21:22:09', 1, 1, 0, '', 1, 0, '2023-05-05 21:22:09', 1, ''), +(2, 2, 1, 'What are Wonders?', 'what-are-wonders', '

Wonders are the sparkle in everything that you do!

\r\n

...do you need to know anything more?

', 'Wonders are the sparkle in everything that you do!\r\n...do you need to know anything more?', 2, '2023-05-06 01:17:50', '2023-05-06 19:25:33', 1, 1, 0, '', 1, 0, '2023-05-06 19:25:33', 1, ''), +(3, 2, 1, 'Methods for Catching Wonders', 'methods-for-catching-wonders', '

Caught wonders are most valuable. 
You may catch wonders by:

\r\n
    \r\n
  • Putting them in a basket.
  • \r\n
  • Dropping them in a bucket.
  • \r\n
  • Covering them with a bag.
  • \r\n
  • Grabbing them with your hands.
  • \r\n
\r\n

All of the above methods are equally effective.

', 'Caught wonders are most valuable. You may catch wonders by:\r\n\r\nPutting them in a basket.\r\nDropping them in a bucket.\r\nCovering them with a bag.\r\nGrabbing them with your hands.\r\n\r\nAll of the above methods are equally effective.', 1, '2023-05-06 01:17:52', '2023-05-06 19:25:33', 1, 1, 0, '', 1, 0, '2023-05-06 19:25:33', 1, ''), +(4, 3, 0, 'Experimenting with BookStack', 'experimenting-with-bookstack', '

The Ins and Outs of Pages

\r\n

The WYSIWYG edior allows for a certain degree of customization but isn\'t overboard in its presentation. It essentially has many of the same features available to word documents, with some additions that breath life into a wiki. But what\'s the secret?

\r\n
\r\nThe Big Secret\r\n

Interactive elements that sort information in a more accessible way.

\r\n
\r\n

\r\n

Sometimes, media allows you to convey information faster than text ever could.

\r\n

But sometimes, data:

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
Is Helpful75%
Isn\'t Helpful25%
\r\n

The above data is not:
- Real
- Informative

\r\n

This isn\'t great for a document.

\r\n

But it\'s fine for a test!

\r\n

You may even find that you need machine languages to convey meaning to a human:

\r\n
print(\"Like this!\")
\r\n
// Machine relations program\r\nnamespace HelloWorld\r\n{\r\n    class Hello {         \r\n        static void Main(string[] args)\r\n        {\r\n            System.Console.WriteLine(\"Or maybe something like this!\");\r\n        }\r\n    }\r\n}
\r\n

However, if less == more, then you can always just share a few in-line snippets.

\r\n

\"An

\r\n

An amazing tree!

\r\n
    \r\n
  • Look at it!
  • \r\n
  • Appreciate it!
  • \r\n
  • Keep it in mind!
  • \r\n
  • Share it with the whole world!
  • \r\n
\r\n

', 'The Ins and Outs of Pages\r\nThe WYSIWYG edior allows for a certain degree of customization but isn\'t overboard in its presentation. It essentially has many of the same features available to word documents, with some additions that breath life into a wiki. But what\'s the secret?\r\n\r\nThe Big Secret\r\nInteractive elements that sort information in a more accessible way.\r\n\r\n\r\nSometimes, media allows you to convey information faster than text ever could.\r\nBut sometimes, data:\r\n\r\n\r\n\r\nIs Helpful\r\n75%\r\n\r\n\r\nIsn\'t Helpful\r\n25%\r\n\r\n\r\n\r\nThe above data is not:- Real- Informative\r\nThis isn\'t great for a document.\r\nBut it\'s fine for a test!\r\nYou may even find that you need machine languages to convey meaning to a human:\r\nprint(\"Like this!\")\r\n// Machine relations program\r\nnamespace HelloWorld\r\n{\r\n class Hello { \r\n static void Main(string[] args)\r\n {\r\n System.Console.WriteLine(\"Or maybe something like this!\");\r\n }\r\n }\r\n}\r\nHowever, if less == more, then you can always just share a few in-line snippets.\r\n\r\nAn amazing tree!\r\n\r\nLook at it!\r\nAppreciate it!\r\nKeep it in mind!\r\nShare it with the whole world!\r\n\r\n', 2, '2023-05-06 20:54:21', '2023-05-06 21:32:22', 1, 1, 0, '', 4, 0, NULL, 1, ''), +(5, 3, 2, 'Blank Page', 'blank-page', '

This page is blank.

', 'This page is blank.', 1, '2023-05-06 21:31:13', '2023-05-06 21:31:22', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(6, 3, 2, 'Another Blank Page', 'another-blank-page', '

This page is also blank.

', 'This page is also blank.', 2, '2023-05-06 21:31:27', '2023-05-06 21:31:38', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(7, 4, 0, 'Problematic Elements', 'problematic-elements', '

Description: A list of currently problematic elements that need to be claimed by other members to ensure safe alterations are made to optimize the categories reviewed by lighthouse audits.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A list of currently problematic elements that need to be claimed by other members to ensure safe alterations are made to optimize the categories reviewed by lighthouse audits.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-17 23:16:21', '2023-05-17 23:36:21', 1, 1, 0, '', 4, 0, NULL, 1, ''), +(8, 5, 0, 'Lighthouse Onboarding', 'lighthouse-onboarding', '

Description: A guide designed to get members new to the project up to speed on the current Lighthouse practices.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A guide designed to get members new to the project up to speed on the current Lighthouse practices.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-17 23:37:15', '2023-05-17 23:38:36', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(9, 5, 0, 'External Guides', 'external-guides', '

Description: Links and directions to resources that can support Lighthouse learning and research.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Links and directions to resources that can support Lighthouse learning and research.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 3, '2023-05-17 23:38:49', '2023-05-17 23:39:55', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(10, 6, 0, 'Security Best Practices', 'security-best-practices', '

Description: A guide to security practices that should be observed by all cyber security team members.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A guide to security practices that should be observed by all cyber security team members.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-17 23:41:21', '2023-05-17 23:42:23', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(11, 6, 0, 'Member Best Practices', 'member-best-practices', '

Description: Security practices that should be distributed to and observed by all project members on a company-wide basis.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Security practices that should be distributed to and observed by all project members on a company-wide basis.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 3, '2023-05-17 23:42:30', '2023-05-17 23:43:26', 1, 1, 0, '', 1, 0, NULL, 1, ''); +INSERT INTO `pages` (`id`, `book_id`, `chapter_id`, `name`, `slug`, `html`, `text`, `priority`, `created_at`, `updated_at`, `created_by`, `updated_by`, `draft`, `markdown`, `revision_count`, `template`, `deleted_at`, `owned_by`, `editor`) VALUES +(12, 6, 0, 'Response Practices', 'response-practices', '

Description: The best practices for all members alongside cyber security team members to engage in during a security incident or emergency.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: The best practices for all members alongside cyber security team members to engage in during a security incident or emergency.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 4, '2023-05-17 23:43:38', '2023-05-17 23:44:56', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(13, 7, 0, 'Proposal 1', 'proposal-1', '

Description: A proposal area of research that could benefit the cyber security project with some further exploration.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A proposal area of research that could benefit the cyber security project with some further exploration.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-17 23:45:49', '2023-05-17 23:46:57', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(14, 7, 0, 'Proposal 2', 'proposal-2', '

Description: A proposal area of research that could benefit the cyber security project with some further exploration.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A proposal area of research that could benefit the cyber security project with some further exploration.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 3, '2023-05-17 23:47:04', '2023-05-17 23:47:17', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(15, 8, 0, 'Testing Methodologies/Tech Stack', 'testing-methodologiestech-stack', '

Description: A document detailing the methodologies used during testing alongside the technologies involved.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A document detailing the methodologies used during testing alongside the technologies involved.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-17 23:48:29', '2023-05-17 23:49:33', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(16, 8, 0, 'Testing Types', 'testing-types', '

Description: A list of the types of testing utilised throughout the project and their purposes.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A list of the types of testing utilised throughout the project and their purposes.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 3, '2023-05-17 23:49:42', '2023-05-17 23:50:17', 1, 1, 0, '', 1, 0, NULL, 1, ''); +INSERT INTO `pages` (`id`, `book_id`, `chapter_id`, `name`, `slug`, `html`, `text`, `priority`, `created_at`, `updated_at`, `created_by`, `updated_by`, `draft`, `markdown`, `revision_count`, `template`, `deleted_at`, `owned_by`, `editor`) VALUES +(17, 9, 0, 'Further Testing', 'further-testing', '

Description: Various proposal areas of research that could benefit the testing project with some further exploration.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Various proposal areas of research that could benefit the testing project with some further exploration.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-17 23:50:52', '2023-05-17 23:51:24', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(18, 9, 0, 'Archival Research', 'archival-research', '

Description: Prior research that details the decision-making process and resources utilized throughout the testing project\'s lifespan.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Prior research that details the decision-making process and resources utilized throughout the testing project\'s lifespan.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 3, '2023-05-17 23:51:31', '2023-05-17 23:52:42', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(19, 10, 0, 'Docker Setup', 'docker-setup', '

Description: A guide on getting set up with docker for the first time.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A guide on getting set up with docker for the first time.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-17 23:53:46', '2023-05-17 23:54:20', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(20, 10, 0, 'Troubleshooting and Technical Support', 'troubleshooting-and-technical-support', '

Description: Common issues found when using Docker and common solutions that can help Docker development continue.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Common issues found when using Docker and common solutions that can help Docker development continue.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 3, '2023-05-17 23:54:27', '2023-05-17 23:55:33', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(21, 11, 0, 'Future Research', 'future-research', '

Description: Research areas for Docker that may prove useful in the future if further expanded upon and explored.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Research areas for Docker that may prove useful in the future if further expanded upon and explored.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-17 23:56:16', '2023-05-17 23:57:07', 1, 1, 0, '', 1, 0, NULL, 1, ''); +INSERT INTO `pages` (`id`, `book_id`, `chapter_id`, `name`, `slug`, `html`, `text`, `priority`, `created_at`, `updated_at`, `created_by`, `updated_by`, `draft`, `markdown`, `revision_count`, `template`, `deleted_at`, `owned_by`, `editor`) VALUES +(22, 12, 0, 'Project Desired Content', 'project-desired-content', '

Description: A description of the content that is appropriate and helpful to host on the knowledge base for each project.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A description of the content that is appropriate and helpful to host on the knowledge base for each project.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-17 23:58:35', '2023-05-17 23:59:29', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(23, 12, 0, 'Knowledge Base Structure', 'knowledge-base-structure', '

Description: An overview of providing the most efficient and supportive structure for the needs of this project.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: An overview of providing the most efficient and supportive structure for the needs of this project.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 3, '2023-05-17 23:59:56', '2023-05-18 00:01:03', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(24, 13, 0, 'Installation/Testing', 'installationtesting', '

Description: Resources for installing both local and external BookStack instances for project use or testing.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Resources for installing both local and external BookStack instances for project use or testing. \r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-18 00:01:45', '2023-05-18 00:02:58', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(25, 13, 0, 'Hosting', 'hosting', '

Description: Resources related to hosting platforms that could viably be utilized for this project\'s BookStack knowledge base.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Resources related to hosting platforms that could viably be utilized for this project\'s BookStack knowledge base.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 3, '2023-05-18 00:03:09', '2023-05-18 00:04:01', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(26, 14, 3, 'Navigating', 'navigating', '

Description: Tutorial on navigating the Thoth repository.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Tutorial on navigating the Thoth repository.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:06:20', '2023-05-18 00:06:51', 1, 1, 0, '', 1, 0, NULL, 1, ''); +INSERT INTO `pages` (`id`, `book_id`, `chapter_id`, `name`, `slug`, `html`, `text`, `priority`, `created_at`, `updated_at`, `created_by`, `updated_by`, `draft`, `markdown`, `revision_count`, `template`, `deleted_at`, `owned_by`, `editor`) VALUES +(27, 14, 3, 'Contributing', 'contributing', '

Description: Tutorial on how to contribute to the Toth repository.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Tutorial on how to contribute to the Toth repository.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-18 00:06:59', '2023-05-18 00:07:28', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(28, 14, 0, 'External Resources', 'external-resources', '

Description: Links and directions to all useful external resources in learning about GitHub for the first time or advancing knowledge.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Links and directions to all useful external resources in learning about GitHub for the first time or advancing knowledge.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 3, '2023-05-18 00:07:34', '2023-05-18 00:08:19', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(29, 15, 4, 'Navigation', 'navigation', '

Description: Tutorial on navigating the BookStack knowledge base.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Tutorial on navigating the BookStack knowledge base.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:09:48', '2023-05-18 00:10:19', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(30, 15, 4, 'Contributing', 'contributing', '

Description: Tutorial on contributing to the BookStack knowledge base.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Tutorial on contributing to the BookStack knowledge base.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-18 00:10:26', '2023-05-18 00:10:55', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(31, 15, 0, 'External Resources', 'external-resources', '

Description: Links and directions to resources that cover BookStack features and functionality.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Links and directions to resources that cover BookStack features and functionality.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 3, '2023-05-18 00:10:59', '2023-05-18 00:11:50', 1, 1, 0, '', 1, 0, NULL, 1, ''); +INSERT INTO `pages` (`id`, `book_id`, `chapter_id`, `name`, `slug`, `html`, `text`, `priority`, `created_at`, `updated_at`, `created_by`, `updated_by`, `draft`, `markdown`, `revision_count`, `template`, `deleted_at`, `owned_by`, `editor`) VALUES +(32, 16, 0, 'Contact Information', 'contact-information', '

Description: Project developer contact information for contacts regarding specialized issues or troubleshooting.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Project developer contact information for contacts regarding specialized issues or troubleshooting.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-18 00:12:36', '2023-05-18 00:13:29', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(33, 16, 5, 'Customer Service Policy', 'customer-service-policy', '

Description: The customer service policies for the Thoth Tech art gallery project/platform.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: The customer service policies for the Thoth Tech art gallery project/platform.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:14:02', '2023-05-18 00:14:47', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(34, 16, 5, 'Privacy Policy', 'privacy-policy', '

Description: The privacy policies for the Thoth Tech art gallery project/platform.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: The privacy policies for the Thoth Tech art gallery project/platform.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-18 00:14:52', '2023-05-18 00:15:20', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(35, 16, 0, 'Customer FAQ', 'customer-faq', '

Description: Frequently asked questions and their answers regarding the art gallery project/platform.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Frequently asked questions and their answers regarding the art gallery project/platform.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 4, '2023-05-18 00:15:29', '2023-05-18 00:16:16', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(36, 17, 0, 'Where to Start', 'where-to-start', '

Description: An overview of where exactly to begin with naviagating and interacting with the art gallery platform.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: An overview of where exactly to begin with naviagating and interacting with the art gallery platform.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-18 00:17:29', '2023-05-18 00:18:27', 1, 1, 0, '', 1, 0, NULL, 1, ''); +INSERT INTO `pages` (`id`, `book_id`, `chapter_id`, `name`, `slug`, `html`, `text`, `priority`, `created_at`, `updated_at`, `created_by`, `updated_by`, `draft`, `markdown`, `revision_count`, `template`, `deleted_at`, `owned_by`, `editor`) VALUES +(37, 17, 0, 'Features and Functionality', 'features-and-functionality', '

Description: A list of the features of the art gallery platform and the functionality it provides.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A list of the features of the art gallery platform and the functionality it provides.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 3, '2023-05-18 00:18:34', '2023-05-18 00:19:18', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(38, 18, 0, 'Updates', 'updates', '

Description: Updates describing new progress and features of the art gallery platform.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Updates describing new progress and features of the art gallery platform.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-18 00:20:08', '2023-05-18 00:20:52', 1, 1, 0, '', 1, 0, NULL, 1, ''), +(39, 19, 0, 'Common Problems and Solutions', 'common-problems-and-solutions', '

Description: A list of commonly encountered issues with the art gallery platform and general solutions.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A list of commonly encountered issues with the art gallery platform and general solutions.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 2, '2023-05-18 00:21:19', '2023-05-18 00:22:43', 1, 1, 0, '', 1, 0, NULL, 1, ''); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `page_revisions` +-- + +CREATE TABLE `page_revisions` ( + `id` int(10) UNSIGNED NOT NULL, + `page_id` int(11) NOT NULL, + `name` varchar(191) NOT NULL, + `html` longtext NOT NULL, + `text` longtext NOT NULL, + `created_by` int(11) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `slug` varchar(191) NOT NULL, + `book_slug` varchar(191) NOT NULL, + `type` varchar(191) NOT NULL DEFAULT 'version', + `markdown` longtext NOT NULL DEFAULT '', + `summary` varchar(191) DEFAULT NULL, + `revision_number` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `page_revisions` +-- + +INSERT INTO `page_revisions` (`id`, `page_id`, `name`, `html`, `text`, `created_by`, `created_at`, `updated_at`, `slug`, `book_slug`, `type`, `markdown`, `summary`, `revision_number`) VALUES +(1, 1, 'My first page!', '

Testing!

', 'Testing!', 1, '2023-05-05 21:09:29', '2023-05-05 21:09:29', 'my-first-page', 'my-first-book', 'version', '', 'Initial publish', 1), +(2, 3, 'Methods for Catching Wonders', '

Caught wonders are most valuable. 
You may catch wonders by:

\r\n
    \r\n
  • Putting them in a basket.
  • \r\n
  • Dropping them in a bucket.
  • \r\n
  • Covering them with a bag.
  • \r\n
  • Grabbing them with your hands.
  • \r\n
\r\n

All of the above methods are equally effective.

', 'Caught wonders are most valuable. You may catch wonders by:\r\n\r\nPutting them in a basket.\r\nDropping them in a bucket.\r\nCovering them with a bag.\r\nGrabbing them with your hands.\r\n\r\nAll of the above methods are equally effective.', 1, '2023-05-06 01:21:07', '2023-05-06 01:21:07', 'methods-for-catching-wonders', 'a-wonderous-book', 'version', '', 'Initial publish', 1), +(3, 2, 'What are Wonders?', '

Wonders are the sparkle in everything that you do!

\r\n

...do you need to know anything more?

', 'Wonders are the sparkle in everything that you do!\r\n...do you need to know anything more?', 1, '2023-05-06 01:22:45', '2023-05-06 01:22:45', 'what-are-wonders', 'a-wonderous-book', 'version', '', 'Initial publish', 1), +(4, 4, 'Experimenting with BookStack', '

The Ins and Outs of Pages

\r\n

The WYSIWYG edior allows for a certain degree of customization but isn\'t overboard in its presentation. It essentially has many of the same features available to word documents, with some additions that breath life into a wiki. But what\'s the secret?

\r\n
\r\nThe Big Secret\r\n

Interactive elements that sort information in a more accessible way.

\r\n
\r\n

\r\n

Sometimes, media allows you to convey information faster than text ever could.

\r\n

But sometimes, data:

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
Is Helpful75%
Isn\'t Helpful25%
\r\n

The above data is not:
- Real
- Informative

\r\n

This isn\'t great for a document.

\r\n

But it\'s fine for a test!

\r\n

You may even find that you need machine languages to convey meaning to a human:

\r\n
print(\"Like this!\")
\r\n
// Machine relations program\r\nnamespace HelloWorld\r\n{\r\n    class Hello {         \r\n        static void Main(string[] args)\r\n        {\r\n            System.Console.WriteLine(\"Or maybe something like this!\");\r\n        }\r\n    }\r\n}
\r\n

However, if less == more, then you can always just share a few in-line snippets.

\r\n

 

\r\n

 

', 'The Ins and Outs of Pages\r\nThe WYSIWYG edior allows for a certain degree of customization but isn\'t overboard in its presentation. It essentially has many of the same features available to word documents, with some additions that breath life into a wiki. But what\'s the secret?\r\n\r\nThe Big Secret\r\nInteractive elements that sort information in a more accessible way.\r\n\r\n\r\nSometimes, media allows you to convey information faster than text ever could.\r\nBut sometimes, data:\r\n\r\n\r\n\r\nIs Helpful\r\n75%\r\n\r\n\r\nIsn\'t Helpful\r\n25%\r\n\r\n\r\n\r\nThe above data is not:- Real- Informative\r\nThis isn\'t great for a document.\r\nBut it\'s fine for a test!\r\nYou may even find that you need machine languages to convey meaning to a human:\r\nprint(\"Like this!\")\r\n// Machine relations program\r\nnamespace HelloWorld\r\n{\r\n class Hello { \r\n static void Main(string[] args)\r\n {\r\n System.Console.WriteLine(\"Or maybe something like this!\");\r\n }\r\n }\r\n}\r\nHowever, if less == more, then you can always just share a few in-line snippets.\r\n \r\n ', 1, '2023-05-06 21:21:25', '2023-05-06 21:21:25', 'experimenting-with-bookstack', 'example-book', 'version', '', 'Initial publish', 1), +(6, 4, 'Experimenting with BookStack', '

The Ins and Outs of Pages

\r\n

The WYSIWYG edior allows for a certain degree of customization but isn\'t overboard in its presentation. It essentially has many of the same features available to word documents, with some additions that breath life into a wiki. But what\'s the secret?

\r\n
\r\nThe Big Secret\r\n

Interactive elements that sort information in a more accessible way.

\r\n
\r\n

\r\n

Sometimes, media allows you to convey information faster than text ever could.

\r\n

But sometimes, data:

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
Is Helpful75%
Isn\'t Helpful25%
\r\n

The above data is not:
- Real
- Informative

\r\n

This isn\'t great for a document.

\r\n

But it\'s fine for a test!

\r\n

You may even find that you need machine languages to convey meaning to a human:

\r\n
print(\"Like this!\")
\r\n
// Machine relations program\r\nnamespace HelloWorld\r\n{\r\n    class Hello {         \r\n        static void Main(string[] args)\r\n        {\r\n            System.Console.WriteLine(\"Or maybe something like this!\");\r\n        }\r\n    }\r\n}
\r\n

However, if less == more, then you can always just share a few in-line snippets.

\r\n

\"An

\r\n

An amazing tree!

\r\n
    \r\n
  • Look at it!
  • \r\n
  • Appreciate it!
  • \r\n
  • Keep it in mind!
  • \r\n
  • Share it with the whole world!
  • \r\n
\r\n

 

', 'The Ins and Outs of Pages\r\nThe WYSIWYG edior allows for a certain degree of customization but isn\'t overboard in its presentation. It essentially has many of the same features available to word documents, with some additions that breath life into a wiki. But what\'s the secret?\r\n\r\nThe Big Secret\r\nInteractive elements that sort information in a more accessible way.\r\n\r\n\r\nSometimes, media allows you to convey information faster than text ever could.\r\nBut sometimes, data:\r\n\r\n\r\n\r\nIs Helpful\r\n75%\r\n\r\n\r\nIsn\'t Helpful\r\n25%\r\n\r\n\r\n\r\nThe above data is not:- Real- Informative\r\nThis isn\'t great for a document.\r\nBut it\'s fine for a test!\r\nYou may even find that you need machine languages to convey meaning to a human:\r\nprint(\"Like this!\")\r\n// Machine relations program\r\nnamespace HelloWorld\r\n{\r\n class Hello { \r\n static void Main(string[] args)\r\n {\r\n System.Console.WriteLine(\"Or maybe something like this!\");\r\n }\r\n }\r\n}\r\nHowever, if less == more, then you can always just share a few in-line snippets.\r\n\r\nAn amazing tree!\r\n\r\nLook at it!\r\nAppreciate it!\r\nKeep it in mind!\r\nShare it with the whole world!\r\n\r\n ', 1, '2023-05-06 21:26:19', '2023-05-06 21:26:19', 'experimenting-with-bookstack', 'example-book', 'version', '', '', 2), +(7, 4, 'Experimenting with BookStack', '

The Ins and Outs of Pages

\r\n

The WYSIWYG edior allows for a certain degree of customization but isn\'t overboard in its presentation. It essentially has many of the same features available to word documents, with some additions that breath life into a wiki. But what\'s the secret?

\r\n
\r\nThe Big Secret\r\n

Interactive elements that sort information in a more accessible way.

\r\n
\r\n

\r\n

Sometimes, media allows you to convey information faster than text ever could.

\r\n

But sometimes, data:

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
Is Helpful75%
Isn\'t Helpful25%
\r\n

The above data is not:
- Real
- Informative

\r\n

This isn\'t great for a document.

\r\n

But it\'s fine for a test!

\r\n

You may even find that you need machine languages to convey meaning to a human:

\r\n
print(\"Like this!\")
\r\n
// Machine relations program\r\nnamespace HelloWorld\r\n{\r\n    class Hello {         \r\n        static void Main(string[] args)\r\n        {\r\n            System.Console.WriteLine(\"Or maybe something like this!\");\r\n        }\r\n    }\r\n}
\r\n

However, if less == more, then you can always just share a few in-line snippets.

\r\n

\"An

\r\n

An amazing tree!

\r\n
    \r\n
  • Look at it!
  • \r\n
  • Appreciate it!
  • \r\n
  • Keep it in mind!
  • \r\n
  • Share it with the whole world!
  • \r\n
\r\n

', 'The Ins and Outs of Pages\r\nThe WYSIWYG edior allows for a certain degree of customization but isn\'t overboard in its presentation. It essentially has many of the same features available to word documents, with some additions that breath life into a wiki. But what\'s the secret?\r\n\r\nThe Big Secret\r\nInteractive elements that sort information in a more accessible way.\r\n\r\n\r\nSometimes, media allows you to convey information faster than text ever could.\r\nBut sometimes, data:\r\n\r\n\r\n\r\nIs Helpful\r\n75%\r\n\r\n\r\nIsn\'t Helpful\r\n25%\r\n\r\n\r\n\r\nThe above data is not:- Real- Informative\r\nThis isn\'t great for a document.\r\nBut it\'s fine for a test!\r\nYou may even find that you need machine languages to convey meaning to a human:\r\nprint(\"Like this!\")\r\n// Machine relations program\r\nnamespace HelloWorld\r\n{\r\n class Hello { \r\n static void Main(string[] args)\r\n {\r\n System.Console.WriteLine(\"Or maybe something like this!\");\r\n }\r\n }\r\n}\r\nHowever, if less == more, then you can always just share a few in-line snippets.\r\n\r\nAn amazing tree!\r\n\r\nLook at it!\r\nAppreciate it!\r\nKeep it in mind!\r\nShare it with the whole world!\r\n\r\n', 1, '2023-05-06 21:26:37', '2023-05-06 21:26:37', 'experimenting-with-bookstack', 'example-book', 'version', '', 'No changes this time.', 3), +(8, 5, 'Blank Page', '

This page is blank.

', 'This page is blank.', 1, '2023-05-06 21:31:22', '2023-05-06 21:31:22', 'blank-page', 'example-book', 'version', '', 'Initial publish', 1), +(9, 6, 'Another Blank Page', '

This page is also blank.

', 'This page is also blank.', 1, '2023-05-06 21:31:38', '2023-05-06 21:31:38', 'another-blank-page', 'example-book', 'version', '', 'Initial publish', 1), +(10, 4, 'Experimenting with BookStack', '

The Ins and Outs of Pages

\r\n

The WYSIWYG edior allows for a certain degree of customization but isn\'t overboard in its presentation. It essentially has many of the same features available to word documents, with some additions that breath life into a wiki. But what\'s the secret?

\r\n
\r\nThe Big Secret\r\n

Interactive elements that sort information in a more accessible way.

\r\n
\r\n

\r\n

Sometimes, media allows you to convey information faster than text ever could.

\r\n

But sometimes, data:

\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
Is Helpful75%
Isn\'t Helpful25%
\r\n

The above data is not:
- Real
- Informative

\r\n

This isn\'t great for a document.

\r\n

But it\'s fine for a test!

\r\n

You may even find that you need machine languages to convey meaning to a human:

\r\n
print(\"Like this!\")
\r\n
// Machine relations program\r\nnamespace HelloWorld\r\n{\r\n    class Hello {         \r\n        static void Main(string[] args)\r\n        {\r\n            System.Console.WriteLine(\"Or maybe something like this!\");\r\n        }\r\n    }\r\n}
\r\n

However, if less == more, then you can always just share a few in-line snippets.

\r\n

\"An

\r\n

An amazing tree!

\r\n
    \r\n
  • Look at it!
  • \r\n
  • Appreciate it!
  • \r\n
  • Keep it in mind!
  • \r\n
  • Share it with the whole world!
  • \r\n
\r\n

', 'The Ins and Outs of Pages\r\nThe WYSIWYG edior allows for a certain degree of customization but isn\'t overboard in its presentation. It essentially has many of the same features available to word documents, with some additions that breath life into a wiki. But what\'s the secret?\r\n\r\nThe Big Secret\r\nInteractive elements that sort information in a more accessible way.\r\n\r\n\r\nSometimes, media allows you to convey information faster than text ever could.\r\nBut sometimes, data:\r\n\r\n\r\n\r\nIs Helpful\r\n75%\r\n\r\n\r\nIsn\'t Helpful\r\n25%\r\n\r\n\r\n\r\nThe above data is not:- Real- Informative\r\nThis isn\'t great for a document.\r\nBut it\'s fine for a test!\r\nYou may even find that you need machine languages to convey meaning to a human:\r\nprint(\"Like this!\")\r\n// Machine relations program\r\nnamespace HelloWorld\r\n{\r\n class Hello { \r\n static void Main(string[] args)\r\n {\r\n System.Console.WriteLine(\"Or maybe something like this!\");\r\n }\r\n }\r\n}\r\nHowever, if less == more, then you can always just share a few in-line snippets.\r\n\r\nAn amazing tree!\r\n\r\nLook at it!\r\nAppreciate it!\r\nKeep it in mind!\r\nShare it with the whole world!\r\n\r\n', 1, '2023-05-06 21:32:22', '2023-05-06 21:32:22', 'experimenting-with-bookstack', 'example-book', 'version', '', '', 4), +(11, 7, 'Problematic Elements', '

Welcome! This 

', 'Welcome! This ', 1, '2023-05-17 23:17:01', '2023-05-17 23:17:01', 'problematic-elements', 'element-review', 'version', '', 'Initial publish', 1), +(13, 7, 'Problematic Elements', '

Description: A list of currently problematic elements that need to be claimed by other members to ensure safe alterations are made to optimize the categories reviewed by lighthouse audits.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document!

', 'Description: A list of currently problematic elements that need to be claimed by other members to ensure safe alterations are made to optimize the categories reviewed by lighthouse audits.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document!', 1, '2023-05-17 23:33:36', '2023-05-17 23:33:36', 'problematic-elements', 'element-review', 'version', '', '', 2), +(15, 7, 'Problematic Elements', '

Description: A list of currently problematic elements that need to be claimed by other members to ensure safe alterations are made to optimize the categories reviewed by lighthouse audits.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A list of currently problematic elements that need to be claimed by other members to ensure safe alterations are made to optimize the categories reviewed by lighthouse audits.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:35:19', '2023-05-17 23:35:19', 'problematic-elements', 'element-review', 'version', '', '', 3), +(16, 8, 'Lighthouse Onboarding', '

Description: A guide designed to get members new to the project up to speed on the current Lighthouse practices.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A guide designed to get members new to the project up to speed on the current Lighthouse practices.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:38:36', '2023-05-17 23:38:36', 'lighthouse-onboarding', 'lighthouse-guides', 'version', '', 'Initial publish', 1); +INSERT INTO `page_revisions` (`id`, `page_id`, `name`, `html`, `text`, `created_by`, `created_at`, `updated_at`, `slug`, `book_slug`, `type`, `markdown`, `summary`, `revision_number`) VALUES +(17, 9, 'External Guides', '

Description: Links and directions to resources that can support Lighthouse learning and research.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Links and directions to resources that can support Lighthouse learning and research.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:39:55', '2023-05-17 23:39:55', 'external-guides', 'lighthouse-guides', 'version', '', 'Initial publish', 1), +(18, 10, 'Security Best Practices', '

Description: A guide to security practices that should be observed by all cyber security team members.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A guide to security practices that should be observed by all cyber security team members.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:42:23', '2023-05-17 23:42:23', 'security-best-practices', 'security-documents', 'version', '', 'Initial publish', 1), +(19, 10, 'Security Best Practices', '

Description: A guide to security practices that should be observed by all cyber security team members.

\n

An Example Document

\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\n

Further Content

\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\n

Even Less Useful Content

\n

\"pine-watt-2Hzmz15wGik-unsplash

\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\n

Conclusion

\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\n

', '', 1, '2023-05-17 23:42:25', '2023-05-17 23:42:25', 'security-best-practices', 'security-documents', 'update_draft', '', NULL, 0), +(20, 11, 'Member Best Practices', '

Description: Security practices that should be distributed to and observed by all project members on a company-wide basis.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Security practices that should be distributed to and observed by all project members on a company-wide basis.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:43:26', '2023-05-17 23:43:26', 'member-best-practices', 'security-documents', 'version', '', 'Initial publish', 1), +(21, 12, 'Response Practices', '

Description: The best practices for all members alongside cyber security team members to engage in during a security incident or emergency.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: The best practices for all members alongside cyber security team members to engage in during a security incident or emergency.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:44:56', '2023-05-17 23:44:56', 'response-practices', 'security-documents', 'version', '', 'Initial publish', 1), +(22, 13, 'Proposal 1', '

Description: A proposal area of research that could benefit the cyber security project with some further exploration.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A proposal area of research that could benefit the cyber security project with some further exploration.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:46:57', '2023-05-17 23:46:57', 'proposal-1', 'developing-research', 'version', '', 'Initial publish', 1); +INSERT INTO `page_revisions` (`id`, `page_id`, `name`, `html`, `text`, `created_by`, `created_at`, `updated_at`, `slug`, `book_slug`, `type`, `markdown`, `summary`, `revision_number`) VALUES +(23, 14, 'Proposal 2', '

Description: A proposal area of research that could benefit the cyber security project with some further exploration.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A proposal area of research that could benefit the cyber security project with some further exploration.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:47:17', '2023-05-17 23:47:17', 'proposal-2', 'developing-research', 'version', '', 'Initial publish', 1), +(24, 15, 'Testing Methodologies/Tech Stack', '

Description: A document detailing the methodologies used during testing alongside the technologies involved.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A document detailing the methodologies used during testing alongside the technologies involved.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:49:33', '2023-05-17 23:49:33', 'testing-methodologiestech-stack', 'methodologies', 'version', '', 'Initial publish', 1), +(25, 16, 'Testing Types', '

Description: A list of the types of testing utilised throughout the project and their purposes.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A list of the types of testing utilised throughout the project and their purposes.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:50:17', '2023-05-17 23:50:17', 'testing-types', 'methodologies', 'version', '', 'Initial publish', 1), +(26, 17, 'Further Testing', '

Description: Various proposal areas of research that could benefit the testing project with some further exploration.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Various proposal areas of research that could benefit the testing project with some further exploration.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:51:24', '2023-05-17 23:51:24', 'further-testing', 'research', 'version', '', 'Initial publish', 1), +(27, 17, 'Further Testing', '

Description: Various proposal areas of research that could benefit the testing project with some further exploration.

\n

An Example Document

\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\n

Further Content

\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\n

Even Less Useful Content

\n

\"pine-watt-2Hzmz15wGik-unsplash

\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\n

Conclusion

\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\n

', '', 1, '2023-05-17 23:51:26', '2023-05-17 23:51:26', 'further-testing', 'research', 'update_draft', '', NULL, 0), +(28, 18, 'Archival Research', '

Description: Prior research that details the decision-making process and resources utilized throughout the testing project\'s lifespan.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Prior research that details the decision-making process and resources utilized throughout the testing project\'s lifespan.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:52:42', '2023-05-17 23:52:42', 'archival-research', 'research', 'version', '', 'Initial publish', 1); +INSERT INTO `page_revisions` (`id`, `page_id`, `name`, `html`, `text`, `created_by`, `created_at`, `updated_at`, `slug`, `book_slug`, `type`, `markdown`, `summary`, `revision_number`) VALUES +(29, 19, 'Docker Setup', '

Description: A guide on getting set up with docker for the first time.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A guide on getting set up with docker for the first time.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:54:20', '2023-05-17 23:54:20', 'docker-setup', 'docker-support', 'version', '', 'Initial publish', 1), +(30, 20, 'Troubleshooting and Technical Support', '

Description: Common issues found when using Docker and common solutions that can help Docker development continue.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Common issues found when using Docker and common solutions that can help Docker development continue.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:55:33', '2023-05-17 23:55:33', 'troubleshooting-and-technical-support', 'docker-support', 'version', '', 'Initial publish', 1), +(31, 21, 'Future Research', '

Description: Research areas for Docker that may prove useful in the future if further expanded upon and explored.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Research areas for Docker that may prove useful in the future if further expanded upon and explored.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:57:07', '2023-05-17 23:57:07', 'future-research', 'developing-research-oGa', 'version', '', 'Initial publish', 1), +(32, 22, 'Project Desired Content', '

Description: A description of the content that is appropriate and helpful to host on the knowledge base for each project.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A description of the content that is appropriate and helpful to host on the knowledge base for each project.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-17 23:59:29', '2023-05-17 23:59:29', 'project-desired-content', 'documentation-overview', 'version', '', 'Initial publish', 1), +(33, 23, 'Knowledge Base Structure', '

Description: An overview of providing the most efficient and supportive structure for the needs of this project.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: An overview of providing the most efficient and supportive structure for the needs of this project.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:01:03', '2023-05-18 00:01:03', 'knowledge-base-structure', 'documentation-overview', 'version', '', 'Initial publish', 1); +INSERT INTO `page_revisions` (`id`, `page_id`, `name`, `html`, `text`, `created_by`, `created_at`, `updated_at`, `slug`, `book_slug`, `type`, `markdown`, `summary`, `revision_number`) VALUES +(34, 24, 'Installation/Testing', '

Description: Resources for installing both local and external BookStack instances for project use or testing.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Resources for installing both local and external BookStack instances for project use or testing. \r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:02:58', '2023-05-18 00:02:58', 'installationtesting', 'bookstack', 'version', '', 'Initial publish', 1), +(35, 25, 'Hosting', '

Description: Resources related to hosting platforms that could viably be utilized for this project\'s BookStack knowledge base.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Resources related to hosting platforms that could viably be utilized for this project\'s BookStack knowledge base.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:04:01', '2023-05-18 00:04:01', 'hosting', 'bookstack', 'version', '', 'Initial publish', 1), +(36, 26, 'Navigating', '

Description: Tutorial on navigating the Thoth repository.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Tutorial on navigating the Thoth repository.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:06:51', '2023-05-18 00:06:51', 'navigating', 'github', 'version', '', 'Initial publish', 1), +(37, 27, 'Contributing', '

Description: Tutorial on how to contribute to the Toth repository.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Tutorial on how to contribute to the Toth repository.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:07:28', '2023-05-18 00:07:28', 'contributing', 'github', 'version', '', 'Initial publish', 1), +(38, 28, 'External Resources', '

Description: Links and directions to all useful external resources in learning about GitHub for the first time or advancing knowledge.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Links and directions to all useful external resources in learning about GitHub for the first time or advancing knowledge.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:08:19', '2023-05-18 00:08:19', 'external-resources', 'github', 'version', '', 'Initial publish', 1); +INSERT INTO `page_revisions` (`id`, `page_id`, `name`, `html`, `text`, `created_by`, `created_at`, `updated_at`, `slug`, `book_slug`, `type`, `markdown`, `summary`, `revision_number`) VALUES +(39, 29, 'Navigation', '

Description: Tutorial on navigating the BookStack knowledge base.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Tutorial on navigating the BookStack knowledge base.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:10:19', '2023-05-18 00:10:19', 'navigation', 'bookstack-tutorials', 'version', '', 'Initial publish', 1), +(40, 30, 'Contributing', '

Description: Tutorial on contributing to the BookStack knowledge base.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Tutorial on contributing to the BookStack knowledge base.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:10:55', '2023-05-18 00:10:55', 'contributing', 'bookstack-tutorials', 'version', '', 'Initial publish', 1), +(41, 31, 'External Resources', '

Description: Links and directions to resources that cover BookStack features and functionality.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Links and directions to resources that cover BookStack features and functionality.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:11:50', '2023-05-18 00:11:50', 'external-resources', 'bookstack-tutorials', 'version', '', 'Initial publish', 1), +(42, 32, 'Contact Information', '

Description: Project developer contact information for contacts regarding specialized issues or troubleshooting.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Project developer contact information for contacts regarding specialized issues or troubleshooting.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:13:29', '2023-05-18 00:13:29', 'contact-information', 'client-support', 'version', '', 'Initial publish', 1), +(43, 33, 'Customer Service Policy', '

Description: The customer service policies for the Thoth Tech art gallery project/platform.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: The customer service policies for the Thoth Tech art gallery project/platform.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:14:47', '2023-05-18 00:14:47', 'customer-service-policy', 'client-support', 'version', '', 'Initial publish', 1); +INSERT INTO `page_revisions` (`id`, `page_id`, `name`, `html`, `text`, `created_by`, `created_at`, `updated_at`, `slug`, `book_slug`, `type`, `markdown`, `summary`, `revision_number`) VALUES +(44, 34, 'Privacy Policy', '

Description: The privacy policies for the Thoth Tech art gallery project/platform.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: The privacy policies for the Thoth Tech art gallery project/platform.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:15:20', '2023-05-18 00:15:20', 'privacy-policy', 'client-support', 'version', '', 'Initial publish', 1), +(45, 35, 'Customer FAQ', '

Description: Frequently asked questions and their answers regarding the art gallery project/platform.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Frequently asked questions and their answers regarding the art gallery project/platform.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:16:16', '2023-05-18 00:16:16', 'customer-faq', 'client-support', 'version', '', 'Initial publish', 1), +(46, 36, 'Where to Start', '

Description: An overview of where exactly to begin with naviagating and interacting with the art gallery platform.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: An overview of where exactly to begin with naviagating and interacting with the art gallery platform.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:18:27', '2023-05-18 00:18:27', 'where-to-start', 'getting-started', 'version', '', 'Initial publish', 1), +(47, 37, 'Features and Functionality', '

Description: A list of the features of the art gallery platform and the functionality it provides.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A list of the features of the art gallery platform and the functionality it provides.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:19:18', '2023-05-18 00:19:18', 'features-and-functionality', 'getting-started', 'version', '', 'Initial publish', 1), +(48, 38, 'Updates', '

Description: Updates describing new progress and features of the art gallery platform.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: Updates describing new progress and features of the art gallery platform.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:20:52', '2023-05-18 00:20:52', 'updates', 'developer-reports', 'version', '', 'Initial publish', 1); +INSERT INTO `page_revisions` (`id`, `page_id`, `name`, `html`, `text`, `created_by`, `created_at`, `updated_at`, `slug`, `book_slug`, `type`, `markdown`, `summary`, `revision_number`) VALUES +(49, 39, 'Common Problems and Solutions', '

Description: A list of commonly encountered issues with the art gallery platform and general solutions.

\r\n

An Example Document

\r\n

Welcome! This is a filler page to show off the formatting of BookStack documents. 

\r\n

All the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.

\r\n

Further Content

\r\n

The purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.

\r\n

Knowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.

\r\n

Knowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.

\r\n

Another reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.

\r\n

Even Less Useful Content

\r\n

\"pine-watt-2Hzmz15wGik-unsplash

\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.

\r\n

Duis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.

\r\n

Conclusion

\r\n

I hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:

\r\n

', 'Description: A list of commonly encountered issues with the art gallery platform and general solutions.\r\nAn Example Document\r\nWelcome! This is a filler page to show off the formatting of BookStack documents. \r\nAll the content aside from the description at the top of this document is unrelated to the document\'s actual purposes and should not be used aside from demonstrative purposes.\r\nFurther Content\r\nThe purpose of a knowledge base is to act as a centralized and organized platform to access guides, tutorials, troubleshooting information, and other resources.\r\nKnowledge base systems come in different flavors, for example, there may be a number of predefined modules that can be added and removed, and knowledge base systems can be developed in an integrated manner with other products.\r\nKnowledge base systems are most frequently used to contain detailed and organized guides. These include guides with solutions to a wide range of technical problems, but also include guides on every aspect of programming, hardware and software topics, and business concepts.\r\nAnother reason to consider Knowledge Base is that it is often used as a single entry point for system information. This is a very convenient feature for remote clients who need to select a particular program to download to their computer, or who need to quickly learn how to configure a system. It is particularly useful in schools, where users can easily learn about a particular software application and then use it, without having to understand how it works.\r\nEven Less Useful Content\r\n\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque sit amet porttitor eget dolor morbi. Nunc sed velit dignissim sodales ut eu sem integer. Gravida cum sociis natoque penatibus et magnis dis. Proin sed libero enim sed faucibus turpis. In fermentum posuere urna nec tincidunt praesent semper. Varius duis at consectetur lorem. Placerat orci nulla pellentesque dignissim enim sit amet venenatis. Integer feugiat scelerisque varius morbi enim nunc. Diam quam nulla porttitor massa. Dolor sit amet consectetur adipiscing elit ut. Tempus iaculis urna id volutpat. Ac auctor augue mauris augue neque gravida. Blandit libero volutpat sed cras ornare arcu. In eu mi bibendum neque egestas. Non quam lacus suspendisse faucibus interdum posuere lorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus at augue eget arcu dictum varius duis.\r\nDuis ut diam quam nulla porttitor massa id neque. Egestas congue quisque egestas diam in arcu cursus. Quis viverra nibh cras pulvinar. Hendrerit gravida rutrum quisque non tellus. Metus vulputate eu scelerisque felis imperdiet proin fermentum. Nulla facilisi morbi tempus iaculis urna. Eget dolor morbi non arcu risus quis varius quam. Quisque non tellus orci ac auctor augue mauris augue. Eget nullam non nisi est sit amet. Id diam vel quam elementum pulvinar etiam. Pretium viverra suspendisse potenti nullam. Aliquam id diam maecenas ultricies mi eget. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Facilisi cras fermentum odio eu. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus. Nullam non nisi est sit. Quam vulputate dignissim suspendisse in est ante in nibh mauris. Nisi vitae suscipit tellus mauris. Felis imperdiet proin fermentum leo vel orci porta non pulvinar. Integer feugiat scelerisque varius morbi enim nunc faucibus.\r\nConclusion\r\nI hope you enjoyed browsing this (almost) pointless document! As a reward, check out this sweet video:\r\n', 1, '2023-05-18 00:22:43', '2023-05-18 00:22:43', 'common-problems-and-solutions', 'troubleshooting', 'version', '', 'Initial publish', 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `password_resets` +-- + +CREATE TABLE `password_resets` ( + `email` varchar(191) NOT NULL, + `token` varchar(191) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `permission_role` +-- + +CREATE TABLE `permission_role` ( + `permission_id` int(10) UNSIGNED NOT NULL, + `role_id` int(10) UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `permission_role` +-- + +INSERT INTO `permission_role` (`permission_id`, `role_id`) VALUES +(19, 1), +(20, 1), +(21, 1), +(22, 1), +(23, 1), +(24, 1), +(24, 2), +(25, 1), +(25, 2), +(26, 1), +(26, 2), +(27, 1), +(27, 2), +(28, 1), +(28, 2), +(29, 1), +(29, 2), +(30, 1), +(30, 2), +(31, 1), +(31, 2), +(32, 1), +(32, 2), +(33, 1), +(33, 2), +(34, 1), +(34, 2), +(35, 1), +(35, 2), +(36, 1), +(36, 2), +(37, 1), +(37, 2), +(38, 1), +(38, 2), +(39, 1), +(39, 2), +(40, 1), +(40, 2), +(41, 1), +(41, 2), +(42, 1), +(42, 2), +(43, 1), +(43, 2), +(44, 1), +(44, 2), +(45, 1), +(45, 2), +(46, 1), +(46, 2), +(47, 1), +(47, 2), +(48, 1), +(48, 2), +(48, 3), +(48, 4), +(49, 1), +(49, 2), +(49, 3), +(49, 4), +(50, 1), +(50, 2), +(50, 3), +(50, 4), +(51, 1), +(51, 2), +(51, 3), +(51, 4), +(52, 1), +(52, 2), +(52, 3), +(52, 4), +(53, 1), +(53, 2), +(53, 3), +(53, 4), +(54, 1), +(55, 1), +(56, 1), +(57, 1), +(58, 1), +(59, 1), +(60, 1), +(61, 1), +(62, 1), +(63, 1), +(64, 1), +(65, 1), +(66, 1), +(66, 2), +(66, 3), +(66, 4), +(67, 1), +(67, 2), +(67, 3), +(67, 4), +(68, 1), +(68, 2), +(69, 1), +(69, 2), +(70, 1), +(70, 2), +(71, 1), +(71, 2), +(72, 1), +(72, 2), +(73, 1), +(73, 2), +(74, 1), +(75, 1), +(76, 1), +(76, 2), +(76, 3), +(76, 4), +(77, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `references` +-- + +CREATE TABLE `references` ( + `id` bigint(20) UNSIGNED NOT NULL, + `from_id` int(10) UNSIGNED NOT NULL, + `from_type` varchar(25) NOT NULL, + `to_id` int(10) UNSIGNED NOT NULL, + `to_type` varchar(25) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `roles` +-- + +CREATE TABLE `roles` ( + `id` int(10) UNSIGNED NOT NULL, + `display_name` varchar(191) DEFAULT NULL, + `description` varchar(191) DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `system_name` varchar(191) NOT NULL, + `external_auth_id` varchar(180) NOT NULL DEFAULT '', + `mfa_enforced` tinyint(1) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `roles` +-- + +INSERT INTO `roles` (`id`, `display_name`, `description`, `created_at`, `updated_at`, `system_name`, `external_auth_id`, `mfa_enforced`) VALUES +(1, 'Admin', 'Administrator of the whole application', '2023-05-05 21:04:49', '2023-05-05 21:04:49', 'admin', '', 0), +(2, 'Editor', 'User can edit Books, Chapters & Pages', '2023-05-05 21:04:49', '2023-05-05 21:04:49', '', '', 0), +(3, 'Viewer', 'User can view books & their content behind authentication', '2023-05-05 21:04:49', '2023-05-05 21:04:49', '', '', 0), +(4, 'Public', 'The role given to public visitors if allowed', '2023-05-05 21:04:53', '2023-05-05 21:04:53', 'public', '', 0); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `role_permissions` +-- + +CREATE TABLE `role_permissions` ( + `id` int(10) UNSIGNED NOT NULL, + `name` varchar(191) NOT NULL, + `display_name` varchar(191) DEFAULT NULL, + `description` varchar(191) DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `role_permissions` +-- + +INSERT INTO `role_permissions` (`id`, `name`, `display_name`, `description`, `created_at`, `updated_at`) VALUES +(19, 'settings-manage', 'Manage Settings', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(20, 'users-manage', 'Manage Users', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(21, 'user-roles-manage', 'Manage Roles & Permissions', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(22, 'restrictions-manage-all', 'Manage All Entity Permissions', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(23, 'restrictions-manage-own', 'Manage Entity Permissions On Own Content', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(24, 'book-create-all', 'Create All Books', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(25, 'book-create-own', 'Create Own Books', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(26, 'book-update-all', 'Update All Books', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(27, 'book-update-own', 'Update Own Books', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(28, 'book-delete-all', 'Delete All Books', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(29, 'book-delete-own', 'Delete Own Books', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(30, 'page-create-all', 'Create All Pages', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(31, 'page-create-own', 'Create Own Pages', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(32, 'page-update-all', 'Update All Pages', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(33, 'page-update-own', 'Update Own Pages', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(34, 'page-delete-all', 'Delete All Pages', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(35, 'page-delete-own', 'Delete Own Pages', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(36, 'chapter-create-all', 'Create All Chapters', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(37, 'chapter-create-own', 'Create Own Chapters', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(38, 'chapter-update-all', 'Update All Chapters', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(39, 'chapter-update-own', 'Update Own Chapters', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(40, 'chapter-delete-all', 'Delete All Chapters', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(41, 'chapter-delete-own', 'Delete Own Chapters', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(42, 'image-create-all', 'Create All Images', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(43, 'image-create-own', 'Create Own Images', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(44, 'image-update-all', 'Update All Images', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(45, 'image-update-own', 'Update Own Images', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(46, 'image-delete-all', 'Delete All Images', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(47, 'image-delete-own', 'Delete Own Images', NULL, '2023-05-05 21:04:51', '2023-05-05 21:04:51'), +(48, 'book-view-all', 'View All Books', NULL, '2023-05-05 21:04:52', '2023-05-05 21:04:52'), +(49, 'book-view-own', 'View Own Books', NULL, '2023-05-05 21:04:52', '2023-05-05 21:04:52'), +(50, 'page-view-all', 'View All Pages', NULL, '2023-05-05 21:04:52', '2023-05-05 21:04:52'), +(51, 'page-view-own', 'View Own Pages', NULL, '2023-05-05 21:04:52', '2023-05-05 21:04:52'), +(52, 'chapter-view-all', 'View All Chapters', NULL, '2023-05-05 21:04:52', '2023-05-05 21:04:52'), +(53, 'chapter-view-own', 'View Own Chapters', NULL, '2023-05-05 21:04:52', '2023-05-05 21:04:52'), +(54, 'attachment-create-all', 'Create All Attachments', NULL, '2023-05-05 21:04:54', '2023-05-05 21:04:54'), +(55, 'attachment-create-own', 'Create Own Attachments', NULL, '2023-05-05 21:04:54', '2023-05-05 21:04:54'), +(56, 'attachment-update-all', 'Update All Attachments', NULL, '2023-05-05 21:04:54', '2023-05-05 21:04:54'), +(57, 'attachment-update-own', 'Update Own Attachments', NULL, '2023-05-05 21:04:54', '2023-05-05 21:04:54'), +(58, 'attachment-delete-all', 'Delete All Attachments', NULL, '2023-05-05 21:04:54', '2023-05-05 21:04:54'), +(59, 'attachment-delete-own', 'Delete Own Attachments', NULL, '2023-05-05 21:04:54', '2023-05-05 21:04:54'), +(60, 'comment-create-all', 'Create All Comments', NULL, '2023-05-05 21:04:54', '2023-05-05 21:04:54'), +(61, 'comment-create-own', 'Create Own Comments', NULL, '2023-05-05 21:04:55', '2023-05-05 21:04:55'), +(62, 'comment-update-all', 'Update All Comments', NULL, '2023-05-05 21:04:55', '2023-05-05 21:04:55'), +(63, 'comment-update-own', 'Update Own Comments', NULL, '2023-05-05 21:04:55', '2023-05-05 21:04:55'), +(64, 'comment-delete-all', 'Delete All Comments', NULL, '2023-05-05 21:04:55', '2023-05-05 21:04:55'), +(65, 'comment-delete-own', 'Delete Own Comments', NULL, '2023-05-05 21:04:55', '2023-05-05 21:04:55'), +(66, 'bookshelf-view-all', 'View All BookShelves', NULL, '2023-05-05 21:04:56', '2023-05-05 21:04:56'), +(67, 'bookshelf-view-own', 'View Own BookShelves', NULL, '2023-05-05 21:04:56', '2023-05-05 21:04:56'), +(68, 'bookshelf-create-all', 'Create All BookShelves', NULL, '2023-05-05 21:04:56', '2023-05-05 21:04:56'), +(69, 'bookshelf-create-own', 'Create Own BookShelves', NULL, '2023-05-05 21:04:56', '2023-05-05 21:04:56'), +(70, 'bookshelf-update-all', 'Update All BookShelves', NULL, '2023-05-05 21:04:56', '2023-05-05 21:04:56'), +(71, 'bookshelf-update-own', 'Update Own BookShelves', NULL, '2023-05-05 21:04:56', '2023-05-05 21:04:56'), +(72, 'bookshelf-delete-all', 'Delete All BookShelves', NULL, '2023-05-05 21:04:56', '2023-05-05 21:04:56'), +(73, 'bookshelf-delete-own', 'Delete Own BookShelves', NULL, '2023-05-05 21:04:56', '2023-05-05 21:04:56'), +(74, 'templates-manage', 'Manage Page Templates', NULL, '2023-05-05 21:04:56', '2023-05-05 21:04:56'), +(75, 'access-api', 'Access system API', NULL, '2023-05-05 21:04:56', '2023-05-05 21:04:56'), +(76, 'content-export', 'Export Content', NULL, '2023-05-05 21:04:59', '2023-05-05 21:04:59'), +(77, 'editor-change', 'Change page editor', NULL, '2023-05-05 21:05:00', '2023-05-05 21:05:00'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `role_user` +-- + +CREATE TABLE `role_user` ( + `user_id` int(10) UNSIGNED NOT NULL, + `role_id` int(10) UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `role_user` +-- + +INSERT INTO `role_user` (`user_id`, `role_id`) VALUES +(1, 1), +(2, 4); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `search_terms` +-- + +CREATE TABLE `search_terms` ( + `id` int(10) UNSIGNED NOT NULL, + `term` varchar(180) NOT NULL, + `entity_type` varchar(100) NOT NULL, + `entity_id` int(11) NOT NULL, + `score` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `search_terms` +-- + +INSERT INTO `search_terms` (`id`, `term`, `entity_type`, `entity_id`, `score`) VALUES +(1, 'My', 'book', 1, 48), +(2, 'first', 'book', 1, 48), +(3, 'book', 'book', 1, 48), +(4, 'My', 'page', 1, 40), +(5, 'first', 'page', 1, 40), +(6, 'page', 'page', 1, 40), +(7, 'Testing', 'page', 1, 1), +(8, 'The', 'bookshelf', 1, 49), +(9, 'Core', 'bookshelf', 1, 48), +(10, 'Self', 'bookshelf', 1, 48), +(11, 'main', 'bookshelf', 1, 1), +(12, 'shelf', 'bookshelf', 1, 1), +(13, 'that', 'bookshelf', 1, 1), +(14, 'holds', 'bookshelf', 1, 1), +(15, 'all', 'bookshelf', 1, 1), +(16, 'knowledge', 'bookshelf', 1, 1), +(17, 'A', 'book', 2, 49), +(18, 'Wonderous', 'book', 2, 48), +(19, 'Book', 'book', 2, 48), +(20, 'book', 'book', 2, 1), +(21, 'filled', 'book', 2, 1), +(22, 'with', 'book', 2, 1), +(23, 'wonders', 'book', 2, 1), +(24, 'Chapter', 'chapter', 1, 48), +(25, '1', 'chapter', 1, 48), +(26, 'How', 'chapter', 1, 48), +(27, 'to', 'chapter', 1, 48), +(28, 'find', 'chapter', 1, 48), +(29, 'a', 'chapter', 1, 48), +(30, 'wonder', 'chapter', 1, 48), +(31, 'Wonders', 'chapter', 1, 1), +(32, 'are', 'chapter', 1, 1), +(33, 'elusive', 'chapter', 1, 1), +(34, 'and', 'chapter', 1, 1), +(35, 'may', 'chapter', 1, 1), +(36, 'not', 'chapter', 1, 1), +(37, 'be', 'chapter', 1, 1), +(38, 'found', 'chapter', 1, 1), +(39, 'so', 'chapter', 1, 1), +(40, 'easily', 'chapter', 1, 1), +(41, 'Methods', 'page', 3, 40), +(42, 'for', 'page', 3, 40), +(43, 'Catching', 'page', 3, 40), +(44, 'Wonders', 'page', 3, 40), +(45, 'Caught', 'page', 3, 1), +(46, 'wonders', 'page', 3, 2), +(47, 'are', 'page', 3, 2), +(48, 'most', 'page', 3, 1), +(49, 'valuable', 'page', 3, 1), +(50, ' ', 'page', 3, 1), +(51, 'You', 'page', 3, 1), +(52, 'may', 'page', 3, 1), +(53, 'catch', 'page', 3, 1), +(54, 'by', 'page', 3, 1), +(55, 'Putting', 'page', 3, 1), +(56, 'them', 'page', 3, 4), +(57, 'in', 'page', 3, 2), +(58, 'a', 'page', 3, 3), +(59, 'basket', 'page', 3, 1), +(60, '\r', 'page', 3, 3), +(61, 'Dropping', 'page', 3, 1), +(62, 'bucket', 'page', 3, 1), +(63, 'Covering', 'page', 3, 1), +(64, 'with', 'page', 3, 2), +(65, 'bag', 'page', 3, 1), +(66, 'Grabbing', 'page', 3, 1), +(67, 'your', 'page', 3, 1), +(68, 'hands', 'page', 3, 1), +(69, 'All', 'page', 3, 1), +(70, 'of', 'page', 3, 1), +(71, 'the', 'page', 3, 1), +(72, 'above', 'page', 3, 1), +(73, 'methods', 'page', 3, 1), +(74, 'equally', 'page', 3, 1), +(75, 'effective', 'page', 3, 1), +(76, 'What', 'page', 2, 40), +(77, 'are', 'page', 2, 41), +(78, 'Wonders', 'page', 2, 41), +(79, 'the', 'page', 2, 1), +(80, 'sparkle', 'page', 2, 1), +(81, 'in', 'page', 2, 1), +(82, 'everything', 'page', 2, 1), +(83, 'that', 'page', 2, 1), +(84, 'you', 'page', 2, 2), +(85, 'do', 'page', 2, 2), +(86, 'need', 'page', 2, 1), +(87, 'to', 'page', 2, 1), +(88, 'know', 'page', 2, 1), +(89, 'anything', 'page', 2, 1), +(90, 'more', 'page', 2, 1), +(222, 'Dockerisation/Deployment', 'bookshelf', 4, 48), +(223, 'Dockerising', 'bookshelf', 4, 1), +(224, 'the', 'bookshelf', 4, 1), +(225, 'art', 'bookshelf', 4, 1), +(226, 'gallery', 'bookshelf', 4, 1), +(227, 'project', 'bookshelf', 4, 1), +(228, 'to', 'bookshelf', 4, 1), +(229, 'run', 'bookshelf', 4, 1), +(230, 'smoothly', 'bookshelf', 4, 1), +(231, 'and', 'bookshelf', 4, 1), +(232, 'deploy', 'bookshelf', 4, 1), +(233, 'into', 'bookshelf', 4, 1), +(234, 'a', 'bookshelf', 4, 1), +(235, 'Docker', 'bookshelf', 4, 1), +(236, 'Swarm', 'bookshelf', 4, 1), +(237, 'internal', 'bookshelf', 4, 3), +(238, 'BookStack', 'bookshelf', 8, 48), +(239, 'Support', 'bookshelf', 8, 48), +(240, 'Guides', 'bookshelf', 8, 1), +(241, 'and', 'bookshelf', 8, 2), +(242, 'information', 'bookshelf', 8, 1), +(243, 'to', 'bookshelf', 8, 2), +(244, 'help', 'bookshelf', 8, 1), +(245, 'new', 'bookshelf', 8, 1), +(246, 'users', 'bookshelf', 8, 1), +(247, 'get', 'bookshelf', 8, 1), +(248, 'started', 'bookshelf', 8, 1), +(249, 'navigating', 'bookshelf', 8, 1), +(250, 'contributing', 'bookshelf', 8, 1), +(251, 'this', 'bookshelf', 8, 1), +(252, 'knowledge', 'bookshelf', 8, 1), +(253, 'base', 'bookshelf', 8, 1), +(254, 'external', 'bookshelf', 8, 3), +(255, 'Cyber', 'bookshelf', 5, 48), +(256, 'Security', 'bookshelf', 5, 48), +(257, 'Reviewing', 'bookshelf', 5, 1), +(258, 'and', 'bookshelf', 5, 1), +(259, 'setting', 'bookshelf', 5, 1), +(260, 'up', 'bookshelf', 5, 1), +(261, 'the', 'bookshelf', 5, 2), +(262, 'security', 'bookshelf', 5, 1), +(263, 'for', 'bookshelf', 5, 1), +(264, 'art', 'bookshelf', 5, 1), +(265, 'gallery', 'bookshelf', 5, 1), +(266, 'internal', 'bookshelf', 5, 3), +(267, 'Documentation/Learning', 'bookshelf', 6, 48), +(268, 'Materials', 'bookshelf', 6, 48), +(269, 'Creating', 'bookshelf', 6, 1), +(270, 'a', 'bookshelf', 6, 1), +(271, 'knowledge', 'bookshelf', 6, 1), +(272, 'base', 'bookshelf', 6, 1), +(273, 'to', 'bookshelf', 6, 1), +(274, 'support', 'bookshelf', 6, 1), +(275, 'project', 'bookshelf', 6, 1), +(276, 'development', 'bookshelf', 6, 1), +(277, 'internal', 'bookshelf', 6, 3), +(278, 'Lighthouse/Front-end', 'bookshelf', 3, 48), +(279, 'Enhancement', 'bookshelf', 3, 48), +(280, 'Identifying', 'bookshelf', 3, 1), +(281, 'areas', 'bookshelf', 3, 1), +(282, 'of', 'bookshelf', 3, 1), +(283, 'improvement', 'bookshelf', 3, 1), +(284, 'with', 'bookshelf', 3, 1), +(285, 'Google', 'bookshelf', 3, 1), +(286, 'Lighthouse', 'bookshelf', 3, 1), +(287, 'and', 'bookshelf', 3, 1), +(288, 'discovering', 'bookshelf', 3, 1), +(289, 'more', 'bookshelf', 3, 1), +(290, 'ways', 'bookshelf', 3, 1), +(291, 'to', 'bookshelf', 3, 1), +(292, 'refine', 'bookshelf', 3, 1), +(293, 'the', 'bookshelf', 3, 1), +(294, 'front-end', 'bookshelf', 3, 1), +(295, 'internal', 'bookshelf', 3, 3), +(296, 'Technical', 'bookshelf', 7, 48), +(297, 'Support', 'bookshelf', 7, 48), +(298, 'Art', 'bookshelf', 7, 1), +(299, 'Gallery', 'bookshelf', 7, 1), +(300, 'information', 'bookshelf', 7, 1), +(301, 'and', 'bookshelf', 7, 1), +(302, 'support', 'bookshelf', 7, 1), +(303, 'for', 'bookshelf', 7, 1), +(304, 'non-developers', 'bookshelf', 7, 1), +(305, 'external', 'bookshelf', 7, 3), +(306, 'Testing', 'bookshelf', 2, 49), +(307, 'for', 'bookshelf', 2, 1), +(308, 'backend', 'bookshelf', 2, 1), +(309, 'and', 'bookshelf', 2, 1), +(310, 'frontend', 'bookshelf', 2, 1), +(311, 'internal', 'bookshelf', 2, 3), +(312, 'Example', 'book', 3, 48), +(313, 'Book', 'book', 3, 48), +(314, 'This', 'book', 3, 1), +(315, 'book', 'book', 3, 1), +(316, 'is', 'book', 3, 1), +(317, 'an', 'book', 3, 1), +(318, 'example', 'book', 3, 1), +(319, 'of', 'book', 3, 2), +(320, 'the', 'book', 3, 1), +(321, 'kind', 'book', 3, 1), +(322, 'content', 'book', 3, 1), +(323, 'that', 'book', 3, 1), +(324, 'can', 'book', 3, 1), +(325, 'be', 'book', 3, 1), +(326, 'created', 'book', 3, 1), +(327, 'for', 'book', 3, 1), +(328, 'BookStack', 'book', 3, 1), +(329, 'test', 'book', 3, 3), +(738, 'Blank', 'chapter', 2, 48), +(739, 'Pages', 'chapter', 2, 48), +(740, 'A', 'chapter', 2, 1), +(741, 'collection', 'chapter', 2, 1), +(742, 'of', 'chapter', 2, 1), +(743, 'blank', 'chapter', 2, 1), +(744, 'pages', 'chapter', 2, 1), +(745, 'with', 'chapter', 2, 1), +(746, 'no', 'chapter', 2, 1), +(747, 'use', 'chapter', 2, 1), +(748, 'Blank', 'page', 5, 40), +(749, 'Page', 'page', 5, 40), +(750, 'This', 'page', 5, 1), +(751, 'page', 'page', 5, 1), +(752, 'is', 'page', 5, 1), +(753, 'blank', 'page', 5, 1), +(754, 'Another', 'page', 6, 40), +(755, 'Blank', 'page', 6, 40), +(756, 'Page', 'page', 6, 40), +(757, 'This', 'page', 6, 1), +(758, 'page', 'page', 6, 1), +(759, 'is', 'page', 6, 1), +(760, 'also', 'page', 6, 1), +(761, 'blank', 'page', 6, 1), +(762, 'Experimenting', 'page', 4, 40), +(763, 'with', 'page', 4, 42), +(764, 'BookStack', 'page', 4, 40), +(765, 'The', 'page', 4, 8), +(766, 'Ins', 'page', 4, 5), +(767, 'and', 'page', 4, 5), +(768, 'Outs', 'page', 4, 5), +(769, 'of', 'page', 4, 7), +(770, 'Pages', 'page', 4, 5), +(771, 'WYSIWYG', 'page', 4, 1), +(772, 'edior', 'page', 4, 1), +(773, 'allows', 'page', 4, 2), +(774, 'for', 'page', 4, 3), +(775, 'a', 'page', 4, 7), +(776, 'certain', 'page', 4, 1), +(777, 'degree', 'page', 4, 1), +(778, 'customization', 'page', 4, 1), +(779, 'but', 'page', 4, 1), +(780, 'isn', 'page', 4, 2), +(781, 't', 'page', 4, 3), +(782, 'overboard', 'page', 4, 1), +(783, 'in', 'page', 4, 3), +(784, 'its', 'page', 4, 1), +(785, 'presentation', 'page', 4, 1), +(786, 'It', 'page', 4, 1), +(787, 'essentially', 'page', 4, 1), +(788, 'has', 'page', 4, 1), +(789, 'many', 'page', 4, 1), +(790, 'the', 'page', 4, 3), +(791, 'same', 'page', 4, 1), +(792, 'features', 'page', 4, 1), +(793, 'available', 'page', 4, 1), +(794, 'to', 'page', 4, 4), +(795, 'word', 'page', 4, 1), +(796, 'documents', 'page', 4, 1), +(797, 'some', 'page', 4, 1), +(798, 'additions', 'page', 4, 1), +(799, 'that', 'page', 4, 3), +(800, 'breath', 'page', 4, 1), +(801, 'life', 'page', 4, 1), +(802, 'into', 'page', 4, 1), +(803, 'wiki', 'page', 4, 1), +(804, 'But', 'page', 4, 3), +(805, 'what', 'page', 4, 1), +(806, 's', 'page', 4, 2), +(807, 'secret', 'page', 4, 1), +(808, 'Big', 'page', 4, 1), +(809, 'Secret\r', 'page', 4, 1), +(810, 'Interactive', 'page', 4, 1), +(811, 'elements', 'page', 4, 1), +(812, 'sort', 'page', 4, 1), +(813, 'information', 'page', 4, 2), +(814, 'more', 'page', 4, 2), +(815, 'accessible', 'page', 4, 1), +(816, 'way', 'page', 4, 1), +(817, 'Sometimes', 'page', 4, 1), +(818, 'media', 'page', 4, 1), +(819, 'you', 'page', 4, 3), +(820, 'convey', 'page', 4, 2), +(821, 'faster', 'page', 4, 1), +(822, 'than', 'page', 4, 1), +(823, 'text', 'page', 4, 1), +(824, 'ever', 'page', 4, 1), +(825, 'could', 'page', 4, 1), +(826, 'sometimes', 'page', 4, 1), +(827, 'data', 'page', 4, 2), +(828, 'Is', 'page', 4, 1), +(829, 'Helpful\r', 'page', 4, 2), +(830, '75%\r', 'page', 4, 1), +(831, '\r', 'page', 4, 12), +(832, 'Isn', 'page', 4, 1), +(833, '25%', 'page', 4, 1), +(834, 'above', 'page', 4, 1), +(835, 'is', 'page', 4, 1), +(836, 'not', 'page', 4, 1), +(837, '-', 'page', 4, 2), +(838, 'Real', 'page', 4, 1), +(839, 'Informative', 'page', 4, 1), +(840, 'This', 'page', 4, 1), +(841, 'great', 'page', 4, 1), +(842, 'document', 'page', 4, 1), +(843, 'it', 'page', 4, 5), +(844, 'fine', 'page', 4, 1), +(845, 'test', 'page', 4, 1), +(846, 'You', 'page', 4, 1), +(847, 'may', 'page', 4, 1), +(848, 'even', 'page', 4, 1), +(849, 'find', 'page', 4, 1), +(850, 'need', 'page', 4, 1), +(851, 'machine', 'page', 4, 1), +(852, 'languages', 'page', 4, 1), +(853, 'meaning', 'page', 4, 1), +(854, 'human', 'page', 4, 1), +(855, 'print', 'page', 4, 1), +(856, 'Like', 'page', 4, 1), +(857, 'this', 'page', 4, 2), +(858, '//', 'page', 4, 1), +(859, 'Machine', 'page', 4, 1), +(860, 'relations', 'page', 4, 1), +(861, 'program\r', 'page', 4, 1), +(862, 'namespace', 'page', 4, 1), +(863, 'HelloWorld\r', 'page', 4, 1), +(864, 'class', 'page', 4, 1), +(865, 'Hello', 'page', 4, 1), +(866, 'static', 'page', 4, 1), +(867, 'void', 'page', 4, 1), +(868, 'Main', 'page', 4, 1), +(869, 'string', 'page', 4, 1), +(870, 'args', 'page', 4, 1), +(871, 'System', 'page', 4, 1), +(872, 'Console', 'page', 4, 1), +(873, 'WriteLine', 'page', 4, 1), +(874, 'Or', 'page', 4, 1), +(875, 'maybe', 'page', 4, 1), +(876, 'something', 'page', 4, 1), +(877, 'like', 'page', 4, 1), +(878, 'However', 'page', 4, 1), +(879, ' if', 'page', 4, 1), +(880, 'less', 'page', 4, 1), +(881, '==', 'page', 4, 1), +(882, 'then', 'page', 4, 1), +(883, 'can', 'page', 4, 1), +(884, 'always', 'page', 4, 1), +(885, 'just', 'page', 4, 1), +(886, 'share', 'page', 4, 1), +(887, 'few', 'page', 4, 1), +(888, 'in-line', 'page', 4, 1), +(889, 'snippets', 'page', 4, 1), +(890, 'An', 'page', 4, 1), +(891, 'amazing', 'page', 4, 1), +(892, 'tree', 'page', 4, 1), +(893, 'Look', 'page', 4, 1), +(894, 'at', 'page', 4, 1), +(895, 'Appreciate', 'page', 4, 1), +(896, 'Keep', 'page', 4, 1), +(897, 'mind', 'page', 4, 1), +(898, 'Share', 'page', 4, 1), +(899, 'whole', 'page', 4, 1), +(900, 'world', 'page', 4, 1), +(901, 'Element', 'book', 4, 48), +(902, 'Review', 'book', 4, 48), +(903, 'Reviewing', 'book', 4, 1), +(904, 'project', 'book', 4, 1), +(905, 'elements', 'book', 4, 1), +(906, 'under', 'book', 4, 1), +(907, 'lighthouse', 'book', 4, 1), +(908, 'tools', 'book', 4, 1), +(1561, 'Problematic', 'page', 7, 40), +(1562, 'Elements', 'page', 7, 40), +(1563, 'Description', 'page', 7, 1), +(1564, 'A', 'page', 7, 1), +(1565, 'list', 'page', 7, 1), +(1566, 'of', 'page', 7, 7), +(1567, 'currently', 'page', 7, 1), +(1568, 'problematic', 'page', 7, 1), +(1569, 'elements', 'page', 7, 1), +(1570, 'that', 'page', 7, 3), +(1571, 'need', 'page', 7, 3), +(1572, 'to', 'page', 7, 16), +(1573, 'be', 'page', 7, 5), +(1574, 'claimed', 'page', 7, 1), +(1575, 'by', 'page', 7, 2), +(1576, 'other', 'page', 7, 3), +(1577, 'members', 'page', 7, 1), +(1578, 'ensure', 'page', 7, 1), +(1579, 'safe', 'page', 7, 1), +(1580, 'alterations', 'page', 7, 1), +(1581, 'are', 'page', 7, 2), +(1582, 'made', 'page', 7, 1), +(1583, 'optimize', 'page', 7, 1), +(1584, 'the', 'page', 7, 6), +(1585, 'categories', 'page', 7, 1), +(1586, 'reviewed', 'page', 7, 1), +(1587, 'lighthouse', 'page', 7, 1), +(1588, 'audits', 'page', 7, 1), +(1589, 'An', 'page', 7, 4), +(1590, 'Example', 'page', 7, 4), +(1591, 'Document', 'page', 7, 4), +(1592, 'Welcome', 'page', 7, 1), +(1593, 'This', 'page', 7, 2), +(1594, 'is', 'page', 7, 7), +(1595, 'a', 'page', 7, 11), +(1596, 'filler', 'page', 7, 1), +(1597, 'page', 'page', 7, 1), +(1598, 'show', 'page', 7, 1), +(1599, 'off', 'page', 7, 1), +(1600, 'formatting', 'page', 7, 1), +(1601, 'BookStack', 'page', 7, 1), +(1602, 'documents', 'page', 7, 1), +(1603, ' ', 'page', 7, 1), +(1604, 'All', 'page', 7, 1), +(1605, 'content', 'page', 7, 1), +(1606, 'aside', 'page', 7, 2), +(1607, 'from', 'page', 7, 2), +(1608, 'description', 'page', 7, 1), +(1609, 'at', 'page', 7, 3), +(1610, 'top', 'page', 7, 1), +(1611, 'this', 'page', 7, 3), +(1612, 'document', 'page', 7, 3), +(1613, 'unrelated', 'page', 7, 1), +(1614, 's', 'page', 7, 1), +(1615, 'actual', 'page', 7, 1), +(1616, 'purposes', 'page', 7, 2), +(1617, 'and', 'page', 7, 9), +(1618, 'should', 'page', 7, 1), +(1619, 'not', 'page', 7, 1), +(1620, 'used', 'page', 7, 3), +(1621, 'demonstrative', 'page', 7, 1), +(1622, 'Further', 'page', 7, 4), +(1623, 'Content', 'page', 7, 8), +(1624, 'The', 'page', 7, 1), +(1625, 'purpose', 'page', 7, 1), +(1626, 'knowledge', 'page', 7, 2), +(1627, 'base', 'page', 7, 4), +(1628, 'act', 'page', 7, 1), +(1629, 'as', 'page', 7, 2), +(1630, 'centralized', 'page', 7, 1), +(1631, 'organized', 'page', 7, 2), +(1632, 'platform', 'page', 7, 1), +(1633, 'access', 'page', 7, 1), +(1634, 'guides', 'page', 7, 4), +(1635, 'tutorials', 'page', 7, 1), +(1636, 'troubleshooting', 'page', 7, 1), +(1637, 'information', 'page', 7, 2), +(1638, 'resources', 'page', 7, 1), +(1639, 'Knowledge', 'page', 7, 3), +(1640, 'systems', 'page', 7, 3), +(1641, 'come', 'page', 7, 1), +(1642, 'in', 'page', 7, 6), +(1643, 'different', 'page', 7, 1), +(1644, 'flavors', 'page', 7, 1), +(1645, 'for', 'page', 7, 3), +(1646, 'example', 'page', 7, 1), +(1647, 'there', 'page', 7, 1), +(1648, 'may', 'page', 7, 1), +(1649, 'number', 'page', 7, 1), +(1650, 'predefined', 'page', 7, 1), +(1651, 'modules', 'page', 7, 1), +(1652, 'can', 'page', 7, 3), +(1653, 'added', 'page', 7, 1), +(1654, 'removed', 'page', 7, 1), +(1655, 'developed', 'page', 7, 1), +(1656, 'an', 'page', 7, 1), +(1657, 'integrated', 'page', 7, 1), +(1658, 'manner', 'page', 7, 1), +(1659, 'with', 'page', 7, 2), +(1660, 'products', 'page', 7, 1), +(1661, 'most', 'page', 7, 1), +(1662, 'frequently', 'page', 7, 1), +(1663, 'contain', 'page', 7, 1), +(1664, 'detailed', 'page', 7, 1), +(1665, 'These', 'page', 7, 1), +(1666, 'include', 'page', 7, 2), +(1667, 'solutions', 'page', 7, 1), +(1668, 'wide', 'page', 7, 1), +(1669, 'range', 'page', 7, 1), +(1670, 'technical', 'page', 7, 1), +(1671, 'problems', 'page', 7, 1), +(1672, 'but', 'page', 7, 1), +(1673, 'also', 'page', 7, 1), +(1674, 'on', 'page', 7, 1), +(1675, 'every', 'page', 7, 1), +(1676, 'aspect', 'page', 7, 1), +(1677, 'programming', 'page', 7, 1), +(1678, 'hardware', 'page', 7, 1), +(1679, 'software', 'page', 7, 2), +(1680, 'topics', 'page', 7, 1), +(1681, 'business', 'page', 7, 1), +(1682, 'concepts', 'page', 7, 1), +(1683, 'Another', 'page', 7, 1), +(1684, 'reason', 'page', 7, 1), +(1685, 'consider', 'page', 7, 1), +(1686, 'Base', 'page', 7, 1), +(1687, 'it', 'page', 7, 3), +(1688, 'often', 'page', 7, 1), +(1689, 'single', 'page', 7, 1), +(1690, 'entry', 'page', 7, 1), +(1691, 'point', 'page', 7, 1), +(1692, 'system', 'page', 7, 2), +(1693, 'very', 'page', 7, 1), +(1694, 'convenient', 'page', 7, 1), +(1695, 'feature', 'page', 7, 1), +(1696, 'remote', 'page', 7, 1), +(1697, 'clients', 'page', 7, 1), +(1698, 'who', 'page', 7, 2), +(1699, 'select', 'page', 7, 1), +(1700, 'particular', 'page', 7, 2), +(1701, 'program', 'page', 7, 1), +(1702, 'download', 'page', 7, 1), +(1703, 'their', 'page', 7, 1), +(1704, 'computer', 'page', 7, 1), +(1705, 'or', 'page', 7, 1), +(1706, 'quickly', 'page', 7, 1), +(1707, 'learn', 'page', 7, 2), +(1708, 'how', 'page', 7, 2), +(1709, 'configure', 'page', 7, 1), +(1710, 'It', 'page', 7, 1), +(1711, 'particularly', 'page', 7, 1), +(1712, 'useful', 'page', 7, 1), +(1713, 'schools', 'page', 7, 1), +(1714, 'where', 'page', 7, 1), +(1715, 'users', 'page', 7, 1), +(1716, 'easily', 'page', 7, 1), +(1717, 'about', 'page', 7, 1), +(1718, 'application', 'page', 7, 1), +(1719, 'then', 'page', 7, 1), +(1720, 'use', 'page', 7, 1), +(1721, 'without', 'page', 7, 1), +(1722, 'having', 'page', 7, 1), +(1723, 'understand', 'page', 7, 1), +(1724, 'works', 'page', 7, 1), +(1725, 'Even', 'page', 7, 4), +(1726, 'Less', 'page', 7, 4), +(1727, 'Useful', 'page', 7, 4), +(1728, 'Lorem', 'page', 7, 2), +(1729, 'ipsum', 'page', 7, 2), +(1730, 'dolor', 'page', 7, 4), +(1731, 'sit', 'page', 7, 7), +(1732, 'amet', 'page', 7, 6), +(1733, 'consectetur', 'page', 7, 4), +(1734, 'adipiscing', 'page', 7, 3), +(1735, 'elit', 'page', 7, 3), +(1736, 'sed', 'page', 7, 5), +(1737, 'do', 'page', 7, 1), +(1738, 'eiusmod', 'page', 7, 1), +(1739, 'tempor', 'page', 7, 1), +(1740, 'incididunt', 'page', 7, 1), +(1741, 'ut', 'page', 7, 4), +(1742, 'labore', 'page', 7, 1), +(1743, 'et', 'page', 7, 2), +(1744, 'dolore', 'page', 7, 1), +(1745, 'magna', 'page', 7, 1), +(1746, 'aliqua', 'page', 7, 1), +(1747, 'Pellentesque', 'page', 7, 1), +(1748, 'porttitor', 'page', 7, 3), +(1749, 'eget', 'page', 7, 3), +(1750, 'morbi', 'page', 7, 5), +(1751, 'Nunc', 'page', 7, 1), +(1752, 'velit', 'page', 7, 1), +(1753, 'dignissim', 'page', 7, 3), +(1754, 'sodales', 'page', 7, 1), +(1755, 'eu', 'page', 7, 5), +(1756, 'sem', 'page', 7, 1), +(1757, 'integer', 'page', 7, 1), +(1758, 'Gravida', 'page', 7, 1), +(1759, 'cum', 'page', 7, 1), +(1760, 'sociis', 'page', 7, 1), +(1761, 'natoque', 'page', 7, 1), +(1762, 'penatibus', 'page', 7, 1), +(1763, 'magnis', 'page', 7, 1), +(1764, 'dis', 'page', 7, 1), +(1765, 'Proin', 'page', 7, 1), +(1766, 'libero', 'page', 7, 2), +(1767, 'enim', 'page', 7, 4), +(1768, 'faucibus', 'page', 7, 3), +(1769, 'turpis', 'page', 7, 1), +(1770, 'In', 'page', 7, 2), +(1771, 'fermentum', 'page', 7, 5), +(1772, 'posuere', 'page', 7, 2), +(1773, 'urna', 'page', 7, 3), +(1774, 'nec', 'page', 7, 1), +(1775, 'tincidunt', 'page', 7, 2), +(1776, 'praesent', 'page', 7, 1), +(1777, 'semper', 'page', 7, 1), +(1778, 'Varius', 'page', 7, 1), +(1779, 'duis', 'page', 7, 2), +(1780, 'lorem', 'page', 7, 2), +(1781, 'Placerat', 'page', 7, 1), +(1782, 'orci', 'page', 7, 4), +(1783, 'nulla', 'page', 7, 4), +(1784, 'pellentesque', 'page', 7, 2), +(1785, 'venenatis', 'page', 7, 1), +(1786, 'Integer', 'page', 7, 2), +(1787, 'feugiat', 'page', 7, 2), +(1788, 'scelerisque', 'page', 7, 3), +(1789, 'varius', 'page', 7, 4), +(1790, 'nunc', 'page', 7, 2), +(1791, 'Diam', 'page', 7, 1), +(1792, 'quam', 'page', 7, 5), +(1793, 'massa', 'page', 7, 2), +(1794, 'Dolor', 'page', 7, 1), +(1795, 'Tempus', 'page', 7, 1), +(1796, 'iaculis', 'page', 7, 2), +(1797, 'id', 'page', 7, 3), +(1798, 'volutpat', 'page', 7, 2), +(1799, 'Ac', 'page', 7, 1), +(1800, 'auctor', 'page', 7, 2), +(1801, 'augue', 'page', 7, 5), +(1802, 'mauris', 'page', 7, 4), +(1803, 'neque', 'page', 7, 3), +(1804, 'gravida', 'page', 7, 2), +(1805, 'Blandit', 'page', 7, 1), +(1806, 'cras', 'page', 7, 4), +(1807, 'ornare', 'page', 7, 1), +(1808, 'arcu', 'page', 7, 4), +(1809, 'mi', 'page', 7, 2), +(1810, 'bibendum', 'page', 7, 1), +(1811, 'egestas', 'page', 7, 3), +(1812, 'Non', 'page', 7, 1), +(1813, 'lacus', 'page', 7, 1), +(1814, 'suspendisse', 'page', 7, 3), +(1815, 'interdum', 'page', 7, 1), +(1816, 'Vivamus', 'page', 7, 1), +(1817, 'dictum', 'page', 7, 1), +(1818, 'Duis', 'page', 7, 1), +(1819, 'diam', 'page', 7, 4), +(1820, 'Egestas', 'page', 7, 1), +(1821, 'congue', 'page', 7, 1), +(1822, 'quisque', 'page', 7, 2), +(1823, 'cursus', 'page', 7, 1), +(1824, 'Quis', 'page', 7, 1), +(1825, 'viverra', 'page', 7, 2), +(1826, 'nibh', 'page', 7, 2), +(1827, 'pulvinar', 'page', 7, 3), +(1828, 'Hendrerit', 'page', 7, 1), +(1829, 'rutrum', 'page', 7, 2), +(1830, 'non', 'page', 7, 6), +(1831, 'tellus', 'page', 7, 5), +(1832, 'Metus', 'page', 7, 1), +(1833, 'vulputate', 'page', 7, 2), +(1834, 'felis', 'page', 7, 1), +(1835, 'imperdiet', 'page', 7, 2), +(1836, 'proin', 'page', 7, 2), +(1837, 'Nulla', 'page', 7, 1), +(1838, 'facilisi', 'page', 7, 2), +(1839, 'tempus', 'page', 7, 1), +(1840, 'Eget', 'page', 7, 2), +(1841, 'risus', 'page', 7, 1), +(1842, 'quis', 'page', 7, 1), +(1843, 'Quisque', 'page', 7, 1), +(1844, 'ac', 'page', 7, 2), +(1845, 'nullam', 'page', 7, 2), +(1846, 'nisi', 'page', 7, 2), +(1847, 'est', 'page', 7, 3), +(1848, 'Id', 'page', 7, 1), +(1849, 'vel', 'page', 7, 2), +(1850, 'elementum', 'page', 7, 1), +(1851, 'etiam', 'page', 7, 1), +(1852, 'Pretium', 'page', 7, 1), +(1853, 'potenti', 'page', 7, 1), +(1854, 'Aliquam', 'page', 7, 1), +(1855, 'maecenas', 'page', 7, 1), +(1856, 'ultricies', 'page', 7, 1), +(1857, 'Tellus', 'page', 7, 1), +(1858, 'tortor', 'page', 7, 1), +(1859, 'aliquam', 'page', 7, 1), +(1860, 'Facilisi', 'page', 7, 1), +(1861, 'odio', 'page', 7, 1), +(1862, 'Et', 'page', 7, 1), +(1863, 'sollicitudin', 'page', 7, 1), +(1864, 'phasellus', 'page', 7, 1), +(1865, 'Nullam', 'page', 7, 1), +(1866, 'Quam', 'page', 7, 1), +(1867, 'ante', 'page', 7, 1), +(1868, 'Nisi', 'page', 7, 1), +(1869, 'vitae', 'page', 7, 1), +(1870, 'suscipit', 'page', 7, 1), +(1871, 'Felis', 'page', 7, 1), +(1872, 'leo', 'page', 7, 1), +(1873, 'porta', 'page', 7, 1), +(1874, 'Conclusion', 'page', 7, 4), +(1875, 'I', 'page', 7, 1), +(1876, 'hope', 'page', 7, 1), +(1877, 'you', 'page', 7, 1), +(1878, 'enjoyed', 'page', 7, 1), +(1879, 'browsing', 'page', 7, 1), +(1880, 'almost', 'page', 7, 1), +(1881, 'pointless', 'page', 7, 1), +(1882, 'As', 'page', 7, 1), +(1883, 'reward', 'page', 7, 1), +(1884, 'check', 'page', 7, 1), +(1885, 'out', 'page', 7, 1), +(1886, 'sweet', 'page', 7, 1), +(1887, 'video', 'page', 7, 1), +(1888, 'Lighthouse', 'book', 5, 49), +(1889, 'Guides', 'book', 5, 49), +(1890, 'and', 'book', 5, 1), +(1891, 'resources', 'book', 5, 1), +(1892, 'for', 'book', 5, 1), +(1893, 'getting', 'book', 5, 1), +(1894, 'started', 'book', 5, 1), +(1895, 'with', 'book', 5, 1), +(1896, 'Lighthouse', 'page', 8, 41), +(1897, 'Onboarding', 'page', 8, 40), +(1898, 'Description', 'page', 8, 1), +(1899, 'A', 'page', 8, 1), +(1900, 'guide', 'page', 8, 1), +(1901, 'designed', 'page', 8, 1), +(1902, 'to', 'page', 8, 16), +(1903, 'get', 'page', 8, 1), +(1904, 'members', 'page', 8, 1), +(1905, 'new', 'page', 8, 1), +(1906, 'the', 'page', 8, 7), +(1907, 'project', 'page', 8, 1), +(1908, 'up', 'page', 8, 1), +(1909, 'speed', 'page', 8, 1), +(1910, 'on', 'page', 8, 2), +(1911, 'current', 'page', 8, 1), +(1912, 'practices', 'page', 8, 1), +(1913, 'An', 'page', 8, 4), +(1914, 'Example', 'page', 8, 4), +(1915, 'Document', 'page', 8, 4), +(1916, 'Welcome', 'page', 8, 1), +(1917, 'This', 'page', 8, 2), +(1918, 'is', 'page', 8, 7), +(1919, 'a', 'page', 8, 11), +(1920, 'filler', 'page', 8, 1), +(1921, 'page', 'page', 8, 1), +(1922, 'show', 'page', 8, 1), +(1923, 'off', 'page', 8, 1), +(1924, 'formatting', 'page', 8, 1), +(1925, 'of', 'page', 8, 6), +(1926, 'BookStack', 'page', 8, 1), +(1927, 'documents', 'page', 8, 1), +(1928, ' ', 'page', 8, 1), +(1929, 'All', 'page', 8, 1), +(1930, 'content', 'page', 8, 1), +(1931, 'aside', 'page', 8, 2), +(1932, 'from', 'page', 8, 2), +(1933, 'description', 'page', 8, 1), +(1934, 'at', 'page', 8, 3), +(1935, 'top', 'page', 8, 1), +(1936, 'this', 'page', 8, 3), +(1937, 'document', 'page', 8, 3), +(1938, 'unrelated', 'page', 8, 1), +(1939, 's', 'page', 8, 1), +(1940, 'actual', 'page', 8, 1), +(1941, 'purposes', 'page', 8, 2), +(1942, 'and', 'page', 8, 9), +(1943, 'should', 'page', 8, 1), +(1944, 'not', 'page', 8, 1), +(1945, 'be', 'page', 8, 4), +(1946, 'used', 'page', 8, 3), +(1947, 'demonstrative', 'page', 8, 1), +(1948, 'Further', 'page', 8, 4), +(1949, 'Content', 'page', 8, 8), +(1950, 'The', 'page', 8, 1), +(1951, 'purpose', 'page', 8, 1), +(1952, 'knowledge', 'page', 8, 2), +(1953, 'base', 'page', 8, 4), +(1954, 'act', 'page', 8, 1), +(1955, 'as', 'page', 8, 2), +(1956, 'centralized', 'page', 8, 1), +(1957, 'organized', 'page', 8, 2), +(1958, 'platform', 'page', 8, 1), +(1959, 'access', 'page', 8, 1), +(1960, 'guides', 'page', 8, 4), +(1961, 'tutorials', 'page', 8, 1), +(1962, 'troubleshooting', 'page', 8, 1), +(1963, 'information', 'page', 8, 2), +(1964, 'other', 'page', 8, 2), +(1965, 'resources', 'page', 8, 1), +(1966, 'Knowledge', 'page', 8, 3), +(1967, 'systems', 'page', 8, 3), +(1968, 'come', 'page', 8, 1), +(1969, 'in', 'page', 8, 6), +(1970, 'different', 'page', 8, 1), +(1971, 'flavors', 'page', 8, 1), +(1972, 'for', 'page', 8, 3), +(1973, 'example', 'page', 8, 1), +(1974, 'there', 'page', 8, 1), +(1975, 'may', 'page', 8, 1), +(1976, 'number', 'page', 8, 1), +(1977, 'predefined', 'page', 8, 1), +(1978, 'modules', 'page', 8, 1), +(1979, 'that', 'page', 8, 2), +(1980, 'can', 'page', 8, 3), +(1981, 'added', 'page', 8, 1), +(1982, 'removed', 'page', 8, 1), +(1983, 'developed', 'page', 8, 1), +(1984, 'an', 'page', 8, 1), +(1985, 'integrated', 'page', 8, 1), +(1986, 'manner', 'page', 8, 1), +(1987, 'with', 'page', 8, 2), +(1988, 'products', 'page', 8, 1), +(1989, 'are', 'page', 8, 1), +(1990, 'most', 'page', 8, 1), +(1991, 'frequently', 'page', 8, 1), +(1992, 'contain', 'page', 8, 1), +(1993, 'detailed', 'page', 8, 1), +(1994, 'These', 'page', 8, 1), +(1995, 'include', 'page', 8, 2), +(1996, 'solutions', 'page', 8, 1), +(1997, 'wide', 'page', 8, 1), +(1998, 'range', 'page', 8, 1), +(1999, 'technical', 'page', 8, 1), +(2000, 'problems', 'page', 8, 1), +(2001, 'but', 'page', 8, 1), +(2002, 'also', 'page', 8, 1), +(2003, 'every', 'page', 8, 1), +(2004, 'aspect', 'page', 8, 1), +(2005, 'programming', 'page', 8, 1), +(2006, 'hardware', 'page', 8, 1), +(2007, 'software', 'page', 8, 2), +(2008, 'topics', 'page', 8, 1), +(2009, 'business', 'page', 8, 1), +(2010, 'concepts', 'page', 8, 1), +(2011, 'Another', 'page', 8, 1), +(2012, 'reason', 'page', 8, 1), +(2013, 'consider', 'page', 8, 1), +(2014, 'Base', 'page', 8, 1), +(2015, 'it', 'page', 8, 3), +(2016, 'often', 'page', 8, 1), +(2017, 'single', 'page', 8, 1), +(2018, 'entry', 'page', 8, 1), +(2019, 'point', 'page', 8, 1), +(2020, 'system', 'page', 8, 2), +(2021, 'very', 'page', 8, 1), +(2022, 'convenient', 'page', 8, 1), +(2023, 'feature', 'page', 8, 1), +(2024, 'remote', 'page', 8, 1), +(2025, 'clients', 'page', 8, 1), +(2026, 'who', 'page', 8, 2), +(2027, 'need', 'page', 8, 2), +(2028, 'select', 'page', 8, 1), +(2029, 'particular', 'page', 8, 2), +(2030, 'program', 'page', 8, 1), +(2031, 'download', 'page', 8, 1), +(2032, 'their', 'page', 8, 1), +(2033, 'computer', 'page', 8, 1), +(2034, 'or', 'page', 8, 1), +(2035, 'quickly', 'page', 8, 1), +(2036, 'learn', 'page', 8, 2), +(2037, 'how', 'page', 8, 2), +(2038, 'configure', 'page', 8, 1), +(2039, 'It', 'page', 8, 1), +(2040, 'particularly', 'page', 8, 1), +(2041, 'useful', 'page', 8, 1), +(2042, 'schools', 'page', 8, 1), +(2043, 'where', 'page', 8, 1), +(2044, 'users', 'page', 8, 1), +(2045, 'easily', 'page', 8, 1), +(2046, 'about', 'page', 8, 1), +(2047, 'application', 'page', 8, 1), +(2048, 'then', 'page', 8, 1), +(2049, 'use', 'page', 8, 1), +(2050, 'without', 'page', 8, 1), +(2051, 'having', 'page', 8, 1), +(2052, 'understand', 'page', 8, 1), +(2053, 'works', 'page', 8, 1), +(2054, 'Even', 'page', 8, 4), +(2055, 'Less', 'page', 8, 4), +(2056, 'Useful', 'page', 8, 4), +(2057, 'Lorem', 'page', 8, 2), +(2058, 'ipsum', 'page', 8, 2), +(2059, 'dolor', 'page', 8, 4), +(2060, 'sit', 'page', 8, 7), +(2061, 'amet', 'page', 8, 6), +(2062, 'consectetur', 'page', 8, 4), +(2063, 'adipiscing', 'page', 8, 3), +(2064, 'elit', 'page', 8, 3), +(2065, 'sed', 'page', 8, 5), +(2066, 'do', 'page', 8, 1), +(2067, 'eiusmod', 'page', 8, 1), +(2068, 'tempor', 'page', 8, 1), +(2069, 'incididunt', 'page', 8, 1), +(2070, 'ut', 'page', 8, 4), +(2071, 'labore', 'page', 8, 1), +(2072, 'et', 'page', 8, 2), +(2073, 'dolore', 'page', 8, 1), +(2074, 'magna', 'page', 8, 1), +(2075, 'aliqua', 'page', 8, 1), +(2076, 'Pellentesque', 'page', 8, 1), +(2077, 'porttitor', 'page', 8, 3), +(2078, 'eget', 'page', 8, 3), +(2079, 'morbi', 'page', 8, 5), +(2080, 'Nunc', 'page', 8, 1), +(2081, 'velit', 'page', 8, 1), +(2082, 'dignissim', 'page', 8, 3), +(2083, 'sodales', 'page', 8, 1), +(2084, 'eu', 'page', 8, 5), +(2085, 'sem', 'page', 8, 1), +(2086, 'integer', 'page', 8, 1), +(2087, 'Gravida', 'page', 8, 1), +(2088, 'cum', 'page', 8, 1), +(2089, 'sociis', 'page', 8, 1), +(2090, 'natoque', 'page', 8, 1), +(2091, 'penatibus', 'page', 8, 1), +(2092, 'magnis', 'page', 8, 1), +(2093, 'dis', 'page', 8, 1), +(2094, 'Proin', 'page', 8, 1), +(2095, 'libero', 'page', 8, 2), +(2096, 'enim', 'page', 8, 4), +(2097, 'faucibus', 'page', 8, 3), +(2098, 'turpis', 'page', 8, 1), +(2099, 'In', 'page', 8, 2), +(2100, 'fermentum', 'page', 8, 5), +(2101, 'posuere', 'page', 8, 2), +(2102, 'urna', 'page', 8, 3), +(2103, 'nec', 'page', 8, 1), +(2104, 'tincidunt', 'page', 8, 2), +(2105, 'praesent', 'page', 8, 1), +(2106, 'semper', 'page', 8, 1), +(2107, 'Varius', 'page', 8, 1), +(2108, 'duis', 'page', 8, 2), +(2109, 'lorem', 'page', 8, 2), +(2110, 'Placerat', 'page', 8, 1), +(2111, 'orci', 'page', 8, 4), +(2112, 'nulla', 'page', 8, 4), +(2113, 'pellentesque', 'page', 8, 2), +(2114, 'venenatis', 'page', 8, 1), +(2115, 'Integer', 'page', 8, 2), +(2116, 'feugiat', 'page', 8, 2), +(2117, 'scelerisque', 'page', 8, 3), +(2118, 'varius', 'page', 8, 4), +(2119, 'nunc', 'page', 8, 2), +(2120, 'Diam', 'page', 8, 1), +(2121, 'quam', 'page', 8, 5), +(2122, 'massa', 'page', 8, 2), +(2123, 'Dolor', 'page', 8, 1), +(2124, 'Tempus', 'page', 8, 1), +(2125, 'iaculis', 'page', 8, 2), +(2126, 'id', 'page', 8, 3), +(2127, 'volutpat', 'page', 8, 2), +(2128, 'Ac', 'page', 8, 1), +(2129, 'auctor', 'page', 8, 2), +(2130, 'augue', 'page', 8, 5), +(2131, 'mauris', 'page', 8, 4), +(2132, 'neque', 'page', 8, 3), +(2133, 'gravida', 'page', 8, 2), +(2134, 'Blandit', 'page', 8, 1), +(2135, 'cras', 'page', 8, 4), +(2136, 'ornare', 'page', 8, 1), +(2137, 'arcu', 'page', 8, 4), +(2138, 'mi', 'page', 8, 2), +(2139, 'bibendum', 'page', 8, 1), +(2140, 'egestas', 'page', 8, 3), +(2141, 'Non', 'page', 8, 1), +(2142, 'lacus', 'page', 8, 1), +(2143, 'suspendisse', 'page', 8, 3), +(2144, 'interdum', 'page', 8, 1), +(2145, 'Vivamus', 'page', 8, 1), +(2146, 'dictum', 'page', 8, 1), +(2147, 'Duis', 'page', 8, 1), +(2148, 'diam', 'page', 8, 4), +(2149, 'Egestas', 'page', 8, 1), +(2150, 'congue', 'page', 8, 1), +(2151, 'quisque', 'page', 8, 2), +(2152, 'cursus', 'page', 8, 1), +(2153, 'Quis', 'page', 8, 1), +(2154, 'viverra', 'page', 8, 2), +(2155, 'nibh', 'page', 8, 2), +(2156, 'pulvinar', 'page', 8, 3), +(2157, 'Hendrerit', 'page', 8, 1), +(2158, 'rutrum', 'page', 8, 2), +(2159, 'non', 'page', 8, 6), +(2160, 'tellus', 'page', 8, 5), +(2161, 'Metus', 'page', 8, 1), +(2162, 'vulputate', 'page', 8, 2), +(2163, 'felis', 'page', 8, 1), +(2164, 'imperdiet', 'page', 8, 2), +(2165, 'proin', 'page', 8, 2), +(2166, 'Nulla', 'page', 8, 1), +(2167, 'facilisi', 'page', 8, 2), +(2168, 'tempus', 'page', 8, 1), +(2169, 'Eget', 'page', 8, 2), +(2170, 'risus', 'page', 8, 1), +(2171, 'quis', 'page', 8, 1), +(2172, 'Quisque', 'page', 8, 1), +(2173, 'ac', 'page', 8, 2), +(2174, 'nullam', 'page', 8, 2), +(2175, 'nisi', 'page', 8, 2), +(2176, 'est', 'page', 8, 3), +(2177, 'Id', 'page', 8, 1), +(2178, 'vel', 'page', 8, 2), +(2179, 'elementum', 'page', 8, 1), +(2180, 'etiam', 'page', 8, 1), +(2181, 'Pretium', 'page', 8, 1), +(2182, 'potenti', 'page', 8, 1), +(2183, 'Aliquam', 'page', 8, 1), +(2184, 'maecenas', 'page', 8, 1), +(2185, 'ultricies', 'page', 8, 1), +(2186, 'Tellus', 'page', 8, 1), +(2187, 'tortor', 'page', 8, 1), +(2188, 'aliquam', 'page', 8, 1), +(2189, 'Facilisi', 'page', 8, 1), +(2190, 'odio', 'page', 8, 1), +(2191, 'Et', 'page', 8, 1), +(2192, 'sollicitudin', 'page', 8, 1), +(2193, 'phasellus', 'page', 8, 1), +(2194, 'Nullam', 'page', 8, 1), +(2195, 'Quam', 'page', 8, 1), +(2196, 'ante', 'page', 8, 1), +(2197, 'Nisi', 'page', 8, 1), +(2198, 'vitae', 'page', 8, 1), +(2199, 'suscipit', 'page', 8, 1), +(2200, 'Felis', 'page', 8, 1), +(2201, 'leo', 'page', 8, 1), +(2202, 'porta', 'page', 8, 1), +(2203, 'Conclusion', 'page', 8, 4), +(2204, 'I', 'page', 8, 1), +(2205, 'hope', 'page', 8, 1), +(2206, 'you', 'page', 8, 1), +(2207, 'enjoyed', 'page', 8, 1), +(2208, 'browsing', 'page', 8, 1), +(2209, 'almost', 'page', 8, 1), +(2210, 'pointless', 'page', 8, 1), +(2211, 'As', 'page', 8, 1), +(2212, 'reward', 'page', 8, 1), +(2213, 'check', 'page', 8, 1), +(2214, 'out', 'page', 8, 1), +(2215, 'sweet', 'page', 8, 1), +(2216, 'video', 'page', 8, 1), +(2217, 'External', 'page', 9, 40), +(2218, 'Guides', 'page', 9, 40), +(2219, 'Description', 'page', 9, 1), +(2220, 'Links', 'page', 9, 1), +(2221, 'and', 'page', 9, 11), +(2222, 'directions', 'page', 9, 1), +(2223, 'to', 'page', 9, 14), +(2224, 'resources', 'page', 9, 2), +(2225, 'that', 'page', 9, 3), +(2226, 'can', 'page', 9, 4), +(2227, 'support', 'page', 9, 1), +(2228, 'Lighthouse', 'page', 9, 1), +(2229, 'learning', 'page', 9, 1), +(2230, 'research', 'page', 9, 1), +(2231, 'An', 'page', 9, 4), +(2232, 'Example', 'page', 9, 4), +(2233, 'Document', 'page', 9, 4), +(2234, 'Welcome', 'page', 9, 1), +(2235, 'This', 'page', 9, 2), +(2236, 'is', 'page', 9, 7), +(2237, 'a', 'page', 9, 11), +(2238, 'filler', 'page', 9, 1), +(2239, 'page', 'page', 9, 1), +(2240, 'show', 'page', 9, 1), +(2241, 'off', 'page', 9, 1), +(2242, 'the', 'page', 9, 5), +(2243, 'formatting', 'page', 9, 1), +(2244, 'of', 'page', 9, 6), +(2245, 'BookStack', 'page', 9, 1), +(2246, 'documents', 'page', 9, 1), +(2247, ' ', 'page', 9, 1), +(2248, 'All', 'page', 9, 1), +(2249, 'content', 'page', 9, 1), +(2250, 'aside', 'page', 9, 2), +(2251, 'from', 'page', 9, 2), +(2252, 'description', 'page', 9, 1), +(2253, 'at', 'page', 9, 3), +(2254, 'top', 'page', 9, 1), +(2255, 'this', 'page', 9, 3), +(2256, 'document', 'page', 9, 3), +(2257, 'unrelated', 'page', 9, 1), +(2258, 's', 'page', 9, 1), +(2259, 'actual', 'page', 9, 1), +(2260, 'purposes', 'page', 9, 2), +(2261, 'should', 'page', 9, 1), +(2262, 'not', 'page', 9, 1), +(2263, 'be', 'page', 9, 4), +(2264, 'used', 'page', 9, 3), +(2265, 'demonstrative', 'page', 9, 1), +(2266, 'Further', 'page', 9, 4), +(2267, 'Content', 'page', 9, 8), +(2268, 'The', 'page', 9, 1), +(2269, 'purpose', 'page', 9, 1), +(2270, 'knowledge', 'page', 9, 2), +(2271, 'base', 'page', 9, 4), +(2272, 'act', 'page', 9, 1), +(2273, 'as', 'page', 9, 2), +(2274, 'centralized', 'page', 9, 1), +(2275, 'organized', 'page', 9, 2), +(2276, 'platform', 'page', 9, 1), +(2277, 'access', 'page', 9, 1), +(2278, 'guides', 'page', 9, 4), +(2279, 'tutorials', 'page', 9, 1), +(2280, 'troubleshooting', 'page', 9, 1), +(2281, 'information', 'page', 9, 2), +(2282, 'other', 'page', 9, 2), +(2283, 'Knowledge', 'page', 9, 3), +(2284, 'systems', 'page', 9, 3), +(2285, 'come', 'page', 9, 1), +(2286, 'in', 'page', 9, 6), +(2287, 'different', 'page', 9, 1), +(2288, 'flavors', 'page', 9, 1), +(2289, 'for', 'page', 9, 3), +(2290, 'example', 'page', 9, 1), +(2291, 'there', 'page', 9, 1), +(2292, 'may', 'page', 9, 1), +(2293, 'number', 'page', 9, 1), +(2294, 'predefined', 'page', 9, 1), +(2295, 'modules', 'page', 9, 1), +(2296, 'added', 'page', 9, 1), +(2297, 'removed', 'page', 9, 1), +(2298, 'developed', 'page', 9, 1), +(2299, 'an', 'page', 9, 1), +(2300, 'integrated', 'page', 9, 1), +(2301, 'manner', 'page', 9, 1), +(2302, 'with', 'page', 9, 2), +(2303, 'products', 'page', 9, 1), +(2304, 'are', 'page', 9, 1), +(2305, 'most', 'page', 9, 1), +(2306, 'frequently', 'page', 9, 1), +(2307, 'contain', 'page', 9, 1), +(2308, 'detailed', 'page', 9, 1), +(2309, 'These', 'page', 9, 1), +(2310, 'include', 'page', 9, 2), +(2311, 'solutions', 'page', 9, 1), +(2312, 'wide', 'page', 9, 1), +(2313, 'range', 'page', 9, 1), +(2314, 'technical', 'page', 9, 1), +(2315, 'problems', 'page', 9, 1), +(2316, 'but', 'page', 9, 1), +(2317, 'also', 'page', 9, 1), +(2318, 'on', 'page', 9, 1), +(2319, 'every', 'page', 9, 1), +(2320, 'aspect', 'page', 9, 1), +(2321, 'programming', 'page', 9, 1), +(2322, 'hardware', 'page', 9, 1), +(2323, 'software', 'page', 9, 2), +(2324, 'topics', 'page', 9, 1), +(2325, 'business', 'page', 9, 1), +(2326, 'concepts', 'page', 9, 1), +(2327, 'Another', 'page', 9, 1), +(2328, 'reason', 'page', 9, 1), +(2329, 'consider', 'page', 9, 1), +(2330, 'Base', 'page', 9, 1), +(2331, 'it', 'page', 9, 3), +(2332, 'often', 'page', 9, 1), +(2333, 'single', 'page', 9, 1), +(2334, 'entry', 'page', 9, 1), +(2335, 'point', 'page', 9, 1), +(2336, 'system', 'page', 9, 2), +(2337, 'very', 'page', 9, 1), +(2338, 'convenient', 'page', 9, 1), +(2339, 'feature', 'page', 9, 1), +(2340, 'remote', 'page', 9, 1), +(2341, 'clients', 'page', 9, 1), +(2342, 'who', 'page', 9, 2), +(2343, 'need', 'page', 9, 2), +(2344, 'select', 'page', 9, 1), +(2345, 'particular', 'page', 9, 2), +(2346, 'program', 'page', 9, 1), +(2347, 'download', 'page', 9, 1), +(2348, 'their', 'page', 9, 1), +(2349, 'computer', 'page', 9, 1), +(2350, 'or', 'page', 9, 1), +(2351, 'quickly', 'page', 9, 1), +(2352, 'learn', 'page', 9, 2), +(2353, 'how', 'page', 9, 2), +(2354, 'configure', 'page', 9, 1), +(2355, 'It', 'page', 9, 1), +(2356, 'particularly', 'page', 9, 1), +(2357, 'useful', 'page', 9, 1), +(2358, 'schools', 'page', 9, 1), +(2359, 'where', 'page', 9, 1), +(2360, 'users', 'page', 9, 1), +(2361, 'easily', 'page', 9, 1), +(2362, 'about', 'page', 9, 1), +(2363, 'application', 'page', 9, 1), +(2364, 'then', 'page', 9, 1), +(2365, 'use', 'page', 9, 1), +(2366, 'without', 'page', 9, 1), +(2367, 'having', 'page', 9, 1), +(2368, 'understand', 'page', 9, 1), +(2369, 'works', 'page', 9, 1), +(2370, 'Even', 'page', 9, 4), +(2371, 'Less', 'page', 9, 4), +(2372, 'Useful', 'page', 9, 4), +(2373, 'Lorem', 'page', 9, 2), +(2374, 'ipsum', 'page', 9, 2), +(2375, 'dolor', 'page', 9, 4), +(2376, 'sit', 'page', 9, 7), +(2377, 'amet', 'page', 9, 6), +(2378, 'consectetur', 'page', 9, 4), +(2379, 'adipiscing', 'page', 9, 3), +(2380, 'elit', 'page', 9, 3), +(2381, 'sed', 'page', 9, 5), +(2382, 'do', 'page', 9, 1), +(2383, 'eiusmod', 'page', 9, 1), +(2384, 'tempor', 'page', 9, 1), +(2385, 'incididunt', 'page', 9, 1), +(2386, 'ut', 'page', 9, 4), +(2387, 'labore', 'page', 9, 1), +(2388, 'et', 'page', 9, 2), +(2389, 'dolore', 'page', 9, 1), +(2390, 'magna', 'page', 9, 1), +(2391, 'aliqua', 'page', 9, 1), +(2392, 'Pellentesque', 'page', 9, 1), +(2393, 'porttitor', 'page', 9, 3), +(2394, 'eget', 'page', 9, 3), +(2395, 'morbi', 'page', 9, 5), +(2396, 'Nunc', 'page', 9, 1), +(2397, 'velit', 'page', 9, 1), +(2398, 'dignissim', 'page', 9, 3), +(2399, 'sodales', 'page', 9, 1), +(2400, 'eu', 'page', 9, 5), +(2401, 'sem', 'page', 9, 1), +(2402, 'integer', 'page', 9, 1), +(2403, 'Gravida', 'page', 9, 1), +(2404, 'cum', 'page', 9, 1), +(2405, 'sociis', 'page', 9, 1), +(2406, 'natoque', 'page', 9, 1), +(2407, 'penatibus', 'page', 9, 1), +(2408, 'magnis', 'page', 9, 1), +(2409, 'dis', 'page', 9, 1), +(2410, 'Proin', 'page', 9, 1), +(2411, 'libero', 'page', 9, 2), +(2412, 'enim', 'page', 9, 4), +(2413, 'faucibus', 'page', 9, 3), +(2414, 'turpis', 'page', 9, 1), +(2415, 'In', 'page', 9, 2), +(2416, 'fermentum', 'page', 9, 5), +(2417, 'posuere', 'page', 9, 2), +(2418, 'urna', 'page', 9, 3), +(2419, 'nec', 'page', 9, 1), +(2420, 'tincidunt', 'page', 9, 2), +(2421, 'praesent', 'page', 9, 1), +(2422, 'semper', 'page', 9, 1), +(2423, 'Varius', 'page', 9, 1), +(2424, 'duis', 'page', 9, 2), +(2425, 'lorem', 'page', 9, 2), +(2426, 'Placerat', 'page', 9, 1), +(2427, 'orci', 'page', 9, 4), +(2428, 'nulla', 'page', 9, 4), +(2429, 'pellentesque', 'page', 9, 2), +(2430, 'venenatis', 'page', 9, 1), +(2431, 'Integer', 'page', 9, 2), +(2432, 'feugiat', 'page', 9, 2), +(2433, 'scelerisque', 'page', 9, 3), +(2434, 'varius', 'page', 9, 4), +(2435, 'nunc', 'page', 9, 2), +(2436, 'Diam', 'page', 9, 1), +(2437, 'quam', 'page', 9, 5), +(2438, 'massa', 'page', 9, 2), +(2439, 'Dolor', 'page', 9, 1), +(2440, 'Tempus', 'page', 9, 1), +(2441, 'iaculis', 'page', 9, 2), +(2442, 'id', 'page', 9, 3), +(2443, 'volutpat', 'page', 9, 2), +(2444, 'Ac', 'page', 9, 1), +(2445, 'auctor', 'page', 9, 2), +(2446, 'augue', 'page', 9, 5), +(2447, 'mauris', 'page', 9, 4), +(2448, 'neque', 'page', 9, 3), +(2449, 'gravida', 'page', 9, 2), +(2450, 'Blandit', 'page', 9, 1), +(2451, 'cras', 'page', 9, 4), +(2452, 'ornare', 'page', 9, 1), +(2453, 'arcu', 'page', 9, 4), +(2454, 'mi', 'page', 9, 2), +(2455, 'bibendum', 'page', 9, 1), +(2456, 'egestas', 'page', 9, 3), +(2457, 'Non', 'page', 9, 1), +(2458, 'lacus', 'page', 9, 1), +(2459, 'suspendisse', 'page', 9, 3), +(2460, 'interdum', 'page', 9, 1), +(2461, 'Vivamus', 'page', 9, 1), +(2462, 'dictum', 'page', 9, 1), +(2463, 'Duis', 'page', 9, 1), +(2464, 'diam', 'page', 9, 4), +(2465, 'Egestas', 'page', 9, 1), +(2466, 'congue', 'page', 9, 1), +(2467, 'quisque', 'page', 9, 2), +(2468, 'cursus', 'page', 9, 1), +(2469, 'Quis', 'page', 9, 1), +(2470, 'viverra', 'page', 9, 2), +(2471, 'nibh', 'page', 9, 2), +(2472, 'pulvinar', 'page', 9, 3), +(2473, 'Hendrerit', 'page', 9, 1), +(2474, 'rutrum', 'page', 9, 2), +(2475, 'non', 'page', 9, 6), +(2476, 'tellus', 'page', 9, 5), +(2477, 'Metus', 'page', 9, 1), +(2478, 'vulputate', 'page', 9, 2), +(2479, 'felis', 'page', 9, 1), +(2480, 'imperdiet', 'page', 9, 2), +(2481, 'proin', 'page', 9, 2), +(2482, 'Nulla', 'page', 9, 1), +(2483, 'facilisi', 'page', 9, 2), +(2484, 'tempus', 'page', 9, 1), +(2485, 'Eget', 'page', 9, 2), +(2486, 'risus', 'page', 9, 1), +(2487, 'quis', 'page', 9, 1), +(2488, 'Quisque', 'page', 9, 1), +(2489, 'ac', 'page', 9, 2), +(2490, 'nullam', 'page', 9, 2), +(2491, 'nisi', 'page', 9, 2), +(2492, 'est', 'page', 9, 3), +(2493, 'Id', 'page', 9, 1), +(2494, 'vel', 'page', 9, 2), +(2495, 'elementum', 'page', 9, 1), +(2496, 'etiam', 'page', 9, 1), +(2497, 'Pretium', 'page', 9, 1), +(2498, 'potenti', 'page', 9, 1), +(2499, 'Aliquam', 'page', 9, 1), +(2500, 'maecenas', 'page', 9, 1), +(2501, 'ultricies', 'page', 9, 1), +(2502, 'Tellus', 'page', 9, 1), +(2503, 'tortor', 'page', 9, 1), +(2504, 'aliquam', 'page', 9, 1), +(2505, 'Facilisi', 'page', 9, 1), +(2506, 'odio', 'page', 9, 1), +(2507, 'Et', 'page', 9, 1), +(2508, 'sollicitudin', 'page', 9, 1), +(2509, 'phasellus', 'page', 9, 1), +(2510, 'Nullam', 'page', 9, 1), +(2511, 'Quam', 'page', 9, 1), +(2512, 'ante', 'page', 9, 1), +(2513, 'Nisi', 'page', 9, 1), +(2514, 'vitae', 'page', 9, 1), +(2515, 'suscipit', 'page', 9, 1), +(2516, 'Felis', 'page', 9, 1), +(2517, 'leo', 'page', 9, 1), +(2518, 'porta', 'page', 9, 1), +(2519, 'Conclusion', 'page', 9, 4), +(2520, 'I', 'page', 9, 1), +(2521, 'hope', 'page', 9, 1), +(2522, 'you', 'page', 9, 1), +(2523, 'enjoyed', 'page', 9, 1), +(2524, 'browsing', 'page', 9, 1), +(2525, 'almost', 'page', 9, 1), +(2526, 'pointless', 'page', 9, 1), +(2527, 'As', 'page', 9, 1), +(2528, 'reward', 'page', 9, 1), +(2529, 'check', 'page', 9, 1), +(2530, 'out', 'page', 9, 1), +(2531, 'sweet', 'page', 9, 1), +(2532, 'video', 'page', 9, 1), +(2533, 'Security', 'book', 6, 48), +(2534, 'Documents', 'book', 6, 49), +(2535, 'that', 'book', 6, 1), +(2536, 'cover', 'book', 6, 1), +(2537, 'the', 'book', 6, 1), +(2538, 'cyber', 'book', 6, 1), +(2539, 'security', 'book', 6, 2), +(2540, 'team', 'book', 6, 1), +(2541, 's', 'book', 6, 1), +(2542, 'and', 'book', 6, 1), +(2543, 'general', 'book', 6, 1), +(2544, 'practices', 'book', 6, 1), +(2545, 'Security', 'page', 10, 40), +(2546, 'Best', 'page', 10, 40), +(2547, 'Practices', 'page', 10, 40), +(2548, 'Description', 'page', 10, 1), +(2549, 'A', 'page', 10, 1), +(2550, 'guide', 'page', 10, 1), +(2551, 'to', 'page', 10, 14), +(2552, 'security', 'page', 10, 2), +(2553, 'practices', 'page', 10, 1), +(2554, 'that', 'page', 10, 3), +(2555, 'should', 'page', 10, 2), +(2556, 'be', 'page', 10, 5), +(2557, 'observed', 'page', 10, 1), +(2558, 'by', 'page', 10, 1), +(2559, 'all', 'page', 10, 1), +(2560, 'cyber', 'page', 10, 1), +(2561, 'team', 'page', 10, 1), +(2562, 'members', 'page', 10, 1), +(2563, 'An', 'page', 10, 4), +(2564, 'Example', 'page', 10, 4), +(2565, 'Document', 'page', 10, 4), +(2566, 'Welcome', 'page', 10, 1), +(2567, 'This', 'page', 10, 2), +(2568, 'is', 'page', 10, 7), +(2569, 'a', 'page', 10, 11), +(2570, 'filler', 'page', 10, 1), +(2571, 'page', 'page', 10, 1), +(2572, 'show', 'page', 10, 1), +(2573, 'off', 'page', 10, 1), +(2574, 'the', 'page', 10, 5), +(2575, 'formatting', 'page', 10, 1), +(2576, 'of', 'page', 10, 6), +(2577, 'BookStack', 'page', 10, 1), +(2578, 'documents', 'page', 10, 1), +(2579, ' ', 'page', 10, 1), +(2580, 'All', 'page', 10, 1), +(2581, 'content', 'page', 10, 1), +(2582, 'aside', 'page', 10, 2), +(2583, 'from', 'page', 10, 2), +(2584, 'description', 'page', 10, 1), +(2585, 'at', 'page', 10, 3), +(2586, 'top', 'page', 10, 1), +(2587, 'this', 'page', 10, 3), +(2588, 'document', 'page', 10, 3), +(2589, 'unrelated', 'page', 10, 1), +(2590, 's', 'page', 10, 1), +(2591, 'actual', 'page', 10, 1), +(2592, 'purposes', 'page', 10, 2), +(2593, 'and', 'page', 10, 9), +(2594, 'not', 'page', 10, 1), +(2595, 'used', 'page', 10, 3), +(2596, 'demonstrative', 'page', 10, 1), +(2597, 'Further', 'page', 10, 4), +(2598, 'Content', 'page', 10, 8), +(2599, 'The', 'page', 10, 1), +(2600, 'purpose', 'page', 10, 1), +(2601, 'knowledge', 'page', 10, 2), +(2602, 'base', 'page', 10, 4), +(2603, 'act', 'page', 10, 1), +(2604, 'as', 'page', 10, 2), +(2605, 'centralized', 'page', 10, 1), +(2606, 'organized', 'page', 10, 2), +(2607, 'platform', 'page', 10, 1), +(2608, 'access', 'page', 10, 1), +(2609, 'guides', 'page', 10, 4), +(2610, 'tutorials', 'page', 10, 1), +(2611, 'troubleshooting', 'page', 10, 1), +(2612, 'information', 'page', 10, 2), +(2613, 'other', 'page', 10, 2), +(2614, 'resources', 'page', 10, 1), +(2615, 'Knowledge', 'page', 10, 3), +(2616, 'systems', 'page', 10, 3), +(2617, 'come', 'page', 10, 1), +(2618, 'in', 'page', 10, 6), +(2619, 'different', 'page', 10, 1), +(2620, 'flavors', 'page', 10, 1), +(2621, 'for', 'page', 10, 3), +(2622, 'example', 'page', 10, 1), +(2623, 'there', 'page', 10, 1), +(2624, 'may', 'page', 10, 1), +(2625, 'number', 'page', 10, 1), +(2626, 'predefined', 'page', 10, 1), +(2627, 'modules', 'page', 10, 1), +(2628, 'can', 'page', 10, 3), +(2629, 'added', 'page', 10, 1), +(2630, 'removed', 'page', 10, 1), +(2631, 'developed', 'page', 10, 1), +(2632, 'an', 'page', 10, 1), +(2633, 'integrated', 'page', 10, 1), +(2634, 'manner', 'page', 10, 1), +(2635, 'with', 'page', 10, 2), +(2636, 'products', 'page', 10, 1), +(2637, 'are', 'page', 10, 1), +(2638, 'most', 'page', 10, 1), +(2639, 'frequently', 'page', 10, 1), +(2640, 'contain', 'page', 10, 1), +(2641, 'detailed', 'page', 10, 1), +(2642, 'These', 'page', 10, 1), +(2643, 'include', 'page', 10, 2), +(2644, 'solutions', 'page', 10, 1), +(2645, 'wide', 'page', 10, 1), +(2646, 'range', 'page', 10, 1), +(2647, 'technical', 'page', 10, 1), +(2648, 'problems', 'page', 10, 1), +(2649, 'but', 'page', 10, 1), +(2650, 'also', 'page', 10, 1), +(2651, 'on', 'page', 10, 1), +(2652, 'every', 'page', 10, 1), +(2653, 'aspect', 'page', 10, 1), +(2654, 'programming', 'page', 10, 1), +(2655, 'hardware', 'page', 10, 1), +(2656, 'software', 'page', 10, 2), +(2657, 'topics', 'page', 10, 1), +(2658, 'business', 'page', 10, 1), +(2659, 'concepts', 'page', 10, 1), +(2660, 'Another', 'page', 10, 1), +(2661, 'reason', 'page', 10, 1), +(2662, 'consider', 'page', 10, 1), +(2663, 'Base', 'page', 10, 1), +(2664, 'it', 'page', 10, 3), +(2665, 'often', 'page', 10, 1), +(2666, 'single', 'page', 10, 1), +(2667, 'entry', 'page', 10, 1), +(2668, 'point', 'page', 10, 1), +(2669, 'system', 'page', 10, 2), +(2670, 'very', 'page', 10, 1), +(2671, 'convenient', 'page', 10, 1), +(2672, 'feature', 'page', 10, 1), +(2673, 'remote', 'page', 10, 1), +(2674, 'clients', 'page', 10, 1), +(2675, 'who', 'page', 10, 2), +(2676, 'need', 'page', 10, 2), +(2677, 'select', 'page', 10, 1), +(2678, 'particular', 'page', 10, 2), +(2679, 'program', 'page', 10, 1), +(2680, 'download', 'page', 10, 1), +(2681, 'their', 'page', 10, 1), +(2682, 'computer', 'page', 10, 1), +(2683, 'or', 'page', 10, 1), +(2684, 'quickly', 'page', 10, 1), +(2685, 'learn', 'page', 10, 2), +(2686, 'how', 'page', 10, 2), +(2687, 'configure', 'page', 10, 1), +(2688, 'It', 'page', 10, 1), +(2689, 'particularly', 'page', 10, 1), +(2690, 'useful', 'page', 10, 1), +(2691, 'schools', 'page', 10, 1), +(2692, 'where', 'page', 10, 1), +(2693, 'users', 'page', 10, 1), +(2694, 'easily', 'page', 10, 1), +(2695, 'about', 'page', 10, 1), +(2696, 'application', 'page', 10, 1), +(2697, 'then', 'page', 10, 1), +(2698, 'use', 'page', 10, 1), +(2699, 'without', 'page', 10, 1), +(2700, 'having', 'page', 10, 1), +(2701, 'understand', 'page', 10, 1), +(2702, 'works', 'page', 10, 1), +(2703, 'Even', 'page', 10, 4), +(2704, 'Less', 'page', 10, 4), +(2705, 'Useful', 'page', 10, 4), +(2706, 'Lorem', 'page', 10, 2), +(2707, 'ipsum', 'page', 10, 2), +(2708, 'dolor', 'page', 10, 4), +(2709, 'sit', 'page', 10, 7), +(2710, 'amet', 'page', 10, 6), +(2711, 'consectetur', 'page', 10, 4), +(2712, 'adipiscing', 'page', 10, 3), +(2713, 'elit', 'page', 10, 3), +(2714, 'sed', 'page', 10, 5), +(2715, 'do', 'page', 10, 1), +(2716, 'eiusmod', 'page', 10, 1), +(2717, 'tempor', 'page', 10, 1), +(2718, 'incididunt', 'page', 10, 1), +(2719, 'ut', 'page', 10, 4), +(2720, 'labore', 'page', 10, 1), +(2721, 'et', 'page', 10, 2), +(2722, 'dolore', 'page', 10, 1), +(2723, 'magna', 'page', 10, 1), +(2724, 'aliqua', 'page', 10, 1), +(2725, 'Pellentesque', 'page', 10, 1), +(2726, 'porttitor', 'page', 10, 3), +(2727, 'eget', 'page', 10, 3), +(2728, 'morbi', 'page', 10, 5), +(2729, 'Nunc', 'page', 10, 1), +(2730, 'velit', 'page', 10, 1), +(2731, 'dignissim', 'page', 10, 3), +(2732, 'sodales', 'page', 10, 1), +(2733, 'eu', 'page', 10, 5), +(2734, 'sem', 'page', 10, 1), +(2735, 'integer', 'page', 10, 1), +(2736, 'Gravida', 'page', 10, 1), +(2737, 'cum', 'page', 10, 1), +(2738, 'sociis', 'page', 10, 1), +(2739, 'natoque', 'page', 10, 1), +(2740, 'penatibus', 'page', 10, 1), +(2741, 'magnis', 'page', 10, 1), +(2742, 'dis', 'page', 10, 1), +(2743, 'Proin', 'page', 10, 1), +(2744, 'libero', 'page', 10, 2), +(2745, 'enim', 'page', 10, 4), +(2746, 'faucibus', 'page', 10, 3), +(2747, 'turpis', 'page', 10, 1), +(2748, 'In', 'page', 10, 2), +(2749, 'fermentum', 'page', 10, 5), +(2750, 'posuere', 'page', 10, 2), +(2751, 'urna', 'page', 10, 3), +(2752, 'nec', 'page', 10, 1), +(2753, 'tincidunt', 'page', 10, 2), +(2754, 'praesent', 'page', 10, 1), +(2755, 'semper', 'page', 10, 1), +(2756, 'Varius', 'page', 10, 1), +(2757, 'duis', 'page', 10, 2), +(2758, 'lorem', 'page', 10, 2), +(2759, 'Placerat', 'page', 10, 1), +(2760, 'orci', 'page', 10, 4), +(2761, 'nulla', 'page', 10, 4), +(2762, 'pellentesque', 'page', 10, 2), +(2763, 'venenatis', 'page', 10, 1), +(2764, 'Integer', 'page', 10, 2), +(2765, 'feugiat', 'page', 10, 2), +(2766, 'scelerisque', 'page', 10, 3), +(2767, 'varius', 'page', 10, 4), +(2768, 'nunc', 'page', 10, 2), +(2769, 'Diam', 'page', 10, 1), +(2770, 'quam', 'page', 10, 5), +(2771, 'massa', 'page', 10, 2), +(2772, 'Dolor', 'page', 10, 1), +(2773, 'Tempus', 'page', 10, 1), +(2774, 'iaculis', 'page', 10, 2), +(2775, 'id', 'page', 10, 3), +(2776, 'volutpat', 'page', 10, 2), +(2777, 'Ac', 'page', 10, 1), +(2778, 'auctor', 'page', 10, 2), +(2779, 'augue', 'page', 10, 5), +(2780, 'mauris', 'page', 10, 4), +(2781, 'neque', 'page', 10, 3), +(2782, 'gravida', 'page', 10, 2), +(2783, 'Blandit', 'page', 10, 1), +(2784, 'cras', 'page', 10, 4), +(2785, 'ornare', 'page', 10, 1), +(2786, 'arcu', 'page', 10, 4), +(2787, 'mi', 'page', 10, 2), +(2788, 'bibendum', 'page', 10, 1), +(2789, 'egestas', 'page', 10, 3), +(2790, 'Non', 'page', 10, 1), +(2791, 'lacus', 'page', 10, 1), +(2792, 'suspendisse', 'page', 10, 3), +(2793, 'interdum', 'page', 10, 1), +(2794, 'Vivamus', 'page', 10, 1), +(2795, 'dictum', 'page', 10, 1), +(2796, 'Duis', 'page', 10, 1), +(2797, 'diam', 'page', 10, 4), +(2798, 'Egestas', 'page', 10, 1), +(2799, 'congue', 'page', 10, 1), +(2800, 'quisque', 'page', 10, 2), +(2801, 'cursus', 'page', 10, 1), +(2802, 'Quis', 'page', 10, 1), +(2803, 'viverra', 'page', 10, 2), +(2804, 'nibh', 'page', 10, 2), +(2805, 'pulvinar', 'page', 10, 3), +(2806, 'Hendrerit', 'page', 10, 1), +(2807, 'rutrum', 'page', 10, 2), +(2808, 'non', 'page', 10, 6), +(2809, 'tellus', 'page', 10, 5), +(2810, 'Metus', 'page', 10, 1), +(2811, 'vulputate', 'page', 10, 2), +(2812, 'felis', 'page', 10, 1), +(2813, 'imperdiet', 'page', 10, 2), +(2814, 'proin', 'page', 10, 2), +(2815, 'Nulla', 'page', 10, 1), +(2816, 'facilisi', 'page', 10, 2), +(2817, 'tempus', 'page', 10, 1), +(2818, 'Eget', 'page', 10, 2), +(2819, 'risus', 'page', 10, 1), +(2820, 'quis', 'page', 10, 1), +(2821, 'Quisque', 'page', 10, 1), +(2822, 'ac', 'page', 10, 2), +(2823, 'nullam', 'page', 10, 2), +(2824, 'nisi', 'page', 10, 2), +(2825, 'est', 'page', 10, 3), +(2826, 'Id', 'page', 10, 1), +(2827, 'vel', 'page', 10, 2), +(2828, 'elementum', 'page', 10, 1), +(2829, 'etiam', 'page', 10, 1), +(2830, 'Pretium', 'page', 10, 1), +(2831, 'potenti', 'page', 10, 1), +(2832, 'Aliquam', 'page', 10, 1), +(2833, 'maecenas', 'page', 10, 1), +(2834, 'ultricies', 'page', 10, 1), +(2835, 'Tellus', 'page', 10, 1), +(2836, 'tortor', 'page', 10, 1), +(2837, 'aliquam', 'page', 10, 1), +(2838, 'Facilisi', 'page', 10, 1), +(2839, 'odio', 'page', 10, 1), +(2840, 'Et', 'page', 10, 1), +(2841, 'sollicitudin', 'page', 10, 1), +(2842, 'phasellus', 'page', 10, 1), +(2843, 'Nullam', 'page', 10, 1), +(2844, 'Quam', 'page', 10, 1), +(2845, 'ante', 'page', 10, 1), +(2846, 'Nisi', 'page', 10, 1), +(2847, 'vitae', 'page', 10, 1), +(2848, 'suscipit', 'page', 10, 1), +(2849, 'Felis', 'page', 10, 1), +(2850, 'leo', 'page', 10, 1); +INSERT INTO `search_terms` (`id`, `term`, `entity_type`, `entity_id`, `score`) VALUES +(2851, 'porta', 'page', 10, 1), +(2852, 'Conclusion', 'page', 10, 4), +(2853, 'I', 'page', 10, 1), +(2854, 'hope', 'page', 10, 1), +(2855, 'you', 'page', 10, 1), +(2856, 'enjoyed', 'page', 10, 1), +(2857, 'browsing', 'page', 10, 1), +(2858, 'almost', 'page', 10, 1), +(2859, 'pointless', 'page', 10, 1), +(2860, 'As', 'page', 10, 1), +(2861, 'reward', 'page', 10, 1), +(2862, 'check', 'page', 10, 1), +(2863, 'out', 'page', 10, 1), +(2864, 'sweet', 'page', 10, 1), +(2865, 'video', 'page', 10, 1), +(2866, 'Member', 'page', 11, 40), +(2867, 'Best', 'page', 11, 40), +(2868, 'Practices', 'page', 11, 40), +(2869, 'Description', 'page', 11, 1), +(2870, 'Security', 'page', 11, 1), +(2871, 'practices', 'page', 11, 1), +(2872, 'that', 'page', 11, 3), +(2873, 'should', 'page', 11, 2), +(2874, 'be', 'page', 11, 5), +(2875, 'distributed', 'page', 11, 1), +(2876, 'to', 'page', 11, 14), +(2877, 'and', 'page', 11, 10), +(2878, 'observed', 'page', 11, 1), +(2879, 'by', 'page', 11, 1), +(2880, 'all', 'page', 11, 1), +(2881, 'project', 'page', 11, 1), +(2882, 'members', 'page', 11, 1), +(2883, 'on', 'page', 11, 2), +(2884, 'a', 'page', 11, 12), +(2885, 'company-wide', 'page', 11, 1), +(2886, 'basis', 'page', 11, 1), +(2887, 'An', 'page', 11, 4), +(2888, 'Example', 'page', 11, 4), +(2889, 'Document', 'page', 11, 4), +(2890, 'Welcome', 'page', 11, 1), +(2891, 'This', 'page', 11, 2), +(2892, 'is', 'page', 11, 7), +(2893, 'filler', 'page', 11, 1), +(2894, 'page', 'page', 11, 1), +(2895, 'show', 'page', 11, 1), +(2896, 'off', 'page', 11, 1), +(2897, 'the', 'page', 11, 5), +(2898, 'formatting', 'page', 11, 1), +(2899, 'of', 'page', 11, 6), +(2900, 'BookStack', 'page', 11, 1), +(2901, 'documents', 'page', 11, 1), +(2902, ' ', 'page', 11, 1), +(2903, 'All', 'page', 11, 1), +(2904, 'content', 'page', 11, 1), +(2905, 'aside', 'page', 11, 2), +(2906, 'from', 'page', 11, 2), +(2907, 'description', 'page', 11, 1), +(2908, 'at', 'page', 11, 3), +(2909, 'top', 'page', 11, 1), +(2910, 'this', 'page', 11, 3), +(2911, 'document', 'page', 11, 3), +(2912, 'unrelated', 'page', 11, 1), +(2913, 's', 'page', 11, 1), +(2914, 'actual', 'page', 11, 1), +(2915, 'purposes', 'page', 11, 2), +(2916, 'not', 'page', 11, 1), +(2917, 'used', 'page', 11, 3), +(2918, 'demonstrative', 'page', 11, 1), +(2919, 'Further', 'page', 11, 4), +(2920, 'Content', 'page', 11, 8), +(2921, 'The', 'page', 11, 1), +(2922, 'purpose', 'page', 11, 1), +(2923, 'knowledge', 'page', 11, 2), +(2924, 'base', 'page', 11, 4), +(2925, 'act', 'page', 11, 1), +(2926, 'as', 'page', 11, 2), +(2927, 'centralized', 'page', 11, 1), +(2928, 'organized', 'page', 11, 2), +(2929, 'platform', 'page', 11, 1), +(2930, 'access', 'page', 11, 1), +(2931, 'guides', 'page', 11, 4), +(2932, 'tutorials', 'page', 11, 1), +(2933, 'troubleshooting', 'page', 11, 1), +(2934, 'information', 'page', 11, 2), +(2935, 'other', 'page', 11, 2), +(2936, 'resources', 'page', 11, 1), +(2937, 'Knowledge', 'page', 11, 3), +(2938, 'systems', 'page', 11, 3), +(2939, 'come', 'page', 11, 1), +(2940, 'in', 'page', 11, 6), +(2941, 'different', 'page', 11, 1), +(2942, 'flavors', 'page', 11, 1), +(2943, 'for', 'page', 11, 3), +(2944, 'example', 'page', 11, 1), +(2945, 'there', 'page', 11, 1), +(2946, 'may', 'page', 11, 1), +(2947, 'number', 'page', 11, 1), +(2948, 'predefined', 'page', 11, 1), +(2949, 'modules', 'page', 11, 1), +(2950, 'can', 'page', 11, 3), +(2951, 'added', 'page', 11, 1), +(2952, 'removed', 'page', 11, 1), +(2953, 'developed', 'page', 11, 1), +(2954, 'an', 'page', 11, 1), +(2955, 'integrated', 'page', 11, 1), +(2956, 'manner', 'page', 11, 1), +(2957, 'with', 'page', 11, 2), +(2958, 'products', 'page', 11, 1), +(2959, 'are', 'page', 11, 1), +(2960, 'most', 'page', 11, 1), +(2961, 'frequently', 'page', 11, 1), +(2962, 'contain', 'page', 11, 1), +(2963, 'detailed', 'page', 11, 1), +(2964, 'These', 'page', 11, 1), +(2965, 'include', 'page', 11, 2), +(2966, 'solutions', 'page', 11, 1), +(2967, 'wide', 'page', 11, 1), +(2968, 'range', 'page', 11, 1), +(2969, 'technical', 'page', 11, 1), +(2970, 'problems', 'page', 11, 1), +(2971, 'but', 'page', 11, 1), +(2972, 'also', 'page', 11, 1), +(2973, 'every', 'page', 11, 1), +(2974, 'aspect', 'page', 11, 1), +(2975, 'programming', 'page', 11, 1), +(2976, 'hardware', 'page', 11, 1), +(2977, 'software', 'page', 11, 2), +(2978, 'topics', 'page', 11, 1), +(2979, 'business', 'page', 11, 1), +(2980, 'concepts', 'page', 11, 1), +(2981, 'Another', 'page', 11, 1), +(2982, 'reason', 'page', 11, 1), +(2983, 'consider', 'page', 11, 1), +(2984, 'Base', 'page', 11, 1), +(2985, 'it', 'page', 11, 3), +(2986, 'often', 'page', 11, 1), +(2987, 'single', 'page', 11, 1), +(2988, 'entry', 'page', 11, 1), +(2989, 'point', 'page', 11, 1), +(2990, 'system', 'page', 11, 2), +(2991, 'very', 'page', 11, 1), +(2992, 'convenient', 'page', 11, 1), +(2993, 'feature', 'page', 11, 1), +(2994, 'remote', 'page', 11, 1), +(2995, 'clients', 'page', 11, 1), +(2996, 'who', 'page', 11, 2), +(2997, 'need', 'page', 11, 2), +(2998, 'select', 'page', 11, 1), +(2999, 'particular', 'page', 11, 2), +(3000, 'program', 'page', 11, 1), +(3001, 'download', 'page', 11, 1), +(3002, 'their', 'page', 11, 1), +(3003, 'computer', 'page', 11, 1), +(3004, 'or', 'page', 11, 1), +(3005, 'quickly', 'page', 11, 1), +(3006, 'learn', 'page', 11, 2), +(3007, 'how', 'page', 11, 2), +(3008, 'configure', 'page', 11, 1), +(3009, 'It', 'page', 11, 1), +(3010, 'particularly', 'page', 11, 1), +(3011, 'useful', 'page', 11, 1), +(3012, 'schools', 'page', 11, 1), +(3013, 'where', 'page', 11, 1), +(3014, 'users', 'page', 11, 1), +(3015, 'easily', 'page', 11, 1), +(3016, 'about', 'page', 11, 1), +(3017, 'application', 'page', 11, 1), +(3018, 'then', 'page', 11, 1), +(3019, 'use', 'page', 11, 1), +(3020, 'without', 'page', 11, 1), +(3021, 'having', 'page', 11, 1), +(3022, 'understand', 'page', 11, 1), +(3023, 'works', 'page', 11, 1), +(3024, 'Even', 'page', 11, 4), +(3025, 'Less', 'page', 11, 4), +(3026, 'Useful', 'page', 11, 4), +(3027, 'Lorem', 'page', 11, 2), +(3028, 'ipsum', 'page', 11, 2), +(3029, 'dolor', 'page', 11, 4), +(3030, 'sit', 'page', 11, 7), +(3031, 'amet', 'page', 11, 6), +(3032, 'consectetur', 'page', 11, 4), +(3033, 'adipiscing', 'page', 11, 3), +(3034, 'elit', 'page', 11, 3), +(3035, 'sed', 'page', 11, 5), +(3036, 'do', 'page', 11, 1), +(3037, 'eiusmod', 'page', 11, 1), +(3038, 'tempor', 'page', 11, 1), +(3039, 'incididunt', 'page', 11, 1), +(3040, 'ut', 'page', 11, 4), +(3041, 'labore', 'page', 11, 1), +(3042, 'et', 'page', 11, 2), +(3043, 'dolore', 'page', 11, 1), +(3044, 'magna', 'page', 11, 1), +(3045, 'aliqua', 'page', 11, 1), +(3046, 'Pellentesque', 'page', 11, 1), +(3047, 'porttitor', 'page', 11, 3), +(3048, 'eget', 'page', 11, 3), +(3049, 'morbi', 'page', 11, 5), +(3050, 'Nunc', 'page', 11, 1), +(3051, 'velit', 'page', 11, 1), +(3052, 'dignissim', 'page', 11, 3), +(3053, 'sodales', 'page', 11, 1), +(3054, 'eu', 'page', 11, 5), +(3055, 'sem', 'page', 11, 1), +(3056, 'integer', 'page', 11, 1), +(3057, 'Gravida', 'page', 11, 1), +(3058, 'cum', 'page', 11, 1), +(3059, 'sociis', 'page', 11, 1), +(3060, 'natoque', 'page', 11, 1), +(3061, 'penatibus', 'page', 11, 1), +(3062, 'magnis', 'page', 11, 1), +(3063, 'dis', 'page', 11, 1), +(3064, 'Proin', 'page', 11, 1), +(3065, 'libero', 'page', 11, 2), +(3066, 'enim', 'page', 11, 4), +(3067, 'faucibus', 'page', 11, 3), +(3068, 'turpis', 'page', 11, 1), +(3069, 'In', 'page', 11, 2), +(3070, 'fermentum', 'page', 11, 5), +(3071, 'posuere', 'page', 11, 2), +(3072, 'urna', 'page', 11, 3), +(3073, 'nec', 'page', 11, 1), +(3074, 'tincidunt', 'page', 11, 2), +(3075, 'praesent', 'page', 11, 1), +(3076, 'semper', 'page', 11, 1), +(3077, 'Varius', 'page', 11, 1), +(3078, 'duis', 'page', 11, 2), +(3079, 'lorem', 'page', 11, 2), +(3080, 'Placerat', 'page', 11, 1), +(3081, 'orci', 'page', 11, 4), +(3082, 'nulla', 'page', 11, 4), +(3083, 'pellentesque', 'page', 11, 2), +(3084, 'venenatis', 'page', 11, 1), +(3085, 'Integer', 'page', 11, 2), +(3086, 'feugiat', 'page', 11, 2), +(3087, 'scelerisque', 'page', 11, 3), +(3088, 'varius', 'page', 11, 4), +(3089, 'nunc', 'page', 11, 2), +(3090, 'Diam', 'page', 11, 1), +(3091, 'quam', 'page', 11, 5), +(3092, 'massa', 'page', 11, 2), +(3093, 'Dolor', 'page', 11, 1), +(3094, 'Tempus', 'page', 11, 1), +(3095, 'iaculis', 'page', 11, 2), +(3096, 'id', 'page', 11, 3), +(3097, 'volutpat', 'page', 11, 2), +(3098, 'Ac', 'page', 11, 1), +(3099, 'auctor', 'page', 11, 2), +(3100, 'augue', 'page', 11, 5), +(3101, 'mauris', 'page', 11, 4), +(3102, 'neque', 'page', 11, 3), +(3103, 'gravida', 'page', 11, 2), +(3104, 'Blandit', 'page', 11, 1), +(3105, 'cras', 'page', 11, 4), +(3106, 'ornare', 'page', 11, 1), +(3107, 'arcu', 'page', 11, 4), +(3108, 'mi', 'page', 11, 2), +(3109, 'bibendum', 'page', 11, 1), +(3110, 'egestas', 'page', 11, 3), +(3111, 'Non', 'page', 11, 1), +(3112, 'lacus', 'page', 11, 1), +(3113, 'suspendisse', 'page', 11, 3), +(3114, 'interdum', 'page', 11, 1), +(3115, 'Vivamus', 'page', 11, 1), +(3116, 'dictum', 'page', 11, 1), +(3117, 'Duis', 'page', 11, 1), +(3118, 'diam', 'page', 11, 4), +(3119, 'Egestas', 'page', 11, 1), +(3120, 'congue', 'page', 11, 1), +(3121, 'quisque', 'page', 11, 2), +(3122, 'cursus', 'page', 11, 1), +(3123, 'Quis', 'page', 11, 1), +(3124, 'viverra', 'page', 11, 2), +(3125, 'nibh', 'page', 11, 2), +(3126, 'pulvinar', 'page', 11, 3), +(3127, 'Hendrerit', 'page', 11, 1), +(3128, 'rutrum', 'page', 11, 2), +(3129, 'non', 'page', 11, 6), +(3130, 'tellus', 'page', 11, 5), +(3131, 'Metus', 'page', 11, 1), +(3132, 'vulputate', 'page', 11, 2), +(3133, 'felis', 'page', 11, 1), +(3134, 'imperdiet', 'page', 11, 2), +(3135, 'proin', 'page', 11, 2), +(3136, 'Nulla', 'page', 11, 1), +(3137, 'facilisi', 'page', 11, 2), +(3138, 'tempus', 'page', 11, 1), +(3139, 'Eget', 'page', 11, 2), +(3140, 'risus', 'page', 11, 1), +(3141, 'quis', 'page', 11, 1), +(3142, 'Quisque', 'page', 11, 1), +(3143, 'ac', 'page', 11, 2), +(3144, 'nullam', 'page', 11, 2), +(3145, 'nisi', 'page', 11, 2), +(3146, 'est', 'page', 11, 3), +(3147, 'Id', 'page', 11, 1), +(3148, 'vel', 'page', 11, 2), +(3149, 'elementum', 'page', 11, 1), +(3150, 'etiam', 'page', 11, 1), +(3151, 'Pretium', 'page', 11, 1), +(3152, 'potenti', 'page', 11, 1), +(3153, 'Aliquam', 'page', 11, 1), +(3154, 'maecenas', 'page', 11, 1), +(3155, 'ultricies', 'page', 11, 1), +(3156, 'Tellus', 'page', 11, 1), +(3157, 'tortor', 'page', 11, 1), +(3158, 'aliquam', 'page', 11, 1), +(3159, 'Facilisi', 'page', 11, 1), +(3160, 'odio', 'page', 11, 1), +(3161, 'Et', 'page', 11, 1), +(3162, 'sollicitudin', 'page', 11, 1), +(3163, 'phasellus', 'page', 11, 1), +(3164, 'Nullam', 'page', 11, 1), +(3165, 'Quam', 'page', 11, 1), +(3166, 'ante', 'page', 11, 1), +(3167, 'Nisi', 'page', 11, 1), +(3168, 'vitae', 'page', 11, 1), +(3169, 'suscipit', 'page', 11, 1), +(3170, 'Felis', 'page', 11, 1), +(3171, 'leo', 'page', 11, 1), +(3172, 'porta', 'page', 11, 1), +(3173, 'Conclusion', 'page', 11, 4), +(3174, 'I', 'page', 11, 1), +(3175, 'hope', 'page', 11, 1), +(3176, 'you', 'page', 11, 1), +(3177, 'enjoyed', 'page', 11, 1), +(3178, 'browsing', 'page', 11, 1), +(3179, 'almost', 'page', 11, 1), +(3180, 'pointless', 'page', 11, 1), +(3181, 'As', 'page', 11, 1), +(3182, 'reward', 'page', 11, 1), +(3183, 'check', 'page', 11, 1), +(3184, 'out', 'page', 11, 1), +(3185, 'sweet', 'page', 11, 1), +(3186, 'video', 'page', 11, 1), +(3187, 'Response', 'page', 12, 40), +(3188, 'Practices', 'page', 12, 40), +(3189, 'Description', 'page', 12, 1), +(3190, 'The', 'page', 12, 2), +(3191, 'best', 'page', 12, 1), +(3192, 'practices', 'page', 12, 1), +(3193, 'for', 'page', 12, 4), +(3194, 'all', 'page', 12, 1), +(3195, 'members', 'page', 12, 2), +(3196, 'alongside', 'page', 12, 1), +(3197, 'cyber', 'page', 12, 1), +(3198, 'security', 'page', 12, 2), +(3199, 'team', 'page', 12, 1), +(3200, 'to', 'page', 12, 14), +(3201, 'engage', 'page', 12, 1), +(3202, 'in', 'page', 12, 7), +(3203, 'during', 'page', 12, 1), +(3204, 'a', 'page', 12, 12), +(3205, 'incident', 'page', 12, 1), +(3206, 'or', 'page', 12, 2), +(3207, 'emergency', 'page', 12, 1), +(3208, 'An', 'page', 12, 4), +(3209, 'Example', 'page', 12, 4), +(3210, 'Document', 'page', 12, 4), +(3211, 'Welcome', 'page', 12, 1), +(3212, 'This', 'page', 12, 2), +(3213, 'is', 'page', 12, 7), +(3214, 'filler', 'page', 12, 1), +(3215, 'page', 'page', 12, 1), +(3216, 'show', 'page', 12, 1), +(3217, 'off', 'page', 12, 1), +(3218, 'the', 'page', 12, 5), +(3219, 'formatting', 'page', 12, 1), +(3220, 'of', 'page', 12, 6), +(3221, 'BookStack', 'page', 12, 1), +(3222, 'documents', 'page', 12, 1), +(3223, ' ', 'page', 12, 1), +(3224, 'All', 'page', 12, 1), +(3225, 'content', 'page', 12, 1), +(3226, 'aside', 'page', 12, 2), +(3227, 'from', 'page', 12, 2), +(3228, 'description', 'page', 12, 1), +(3229, 'at', 'page', 12, 3), +(3230, 'top', 'page', 12, 1), +(3231, 'this', 'page', 12, 3), +(3232, 'document', 'page', 12, 3), +(3233, 'unrelated', 'page', 12, 1), +(3234, 's', 'page', 12, 1), +(3235, 'actual', 'page', 12, 1), +(3236, 'purposes', 'page', 12, 2), +(3237, 'and', 'page', 12, 9), +(3238, 'should', 'page', 12, 1), +(3239, 'not', 'page', 12, 1), +(3240, 'be', 'page', 12, 4), +(3241, 'used', 'page', 12, 3), +(3242, 'demonstrative', 'page', 12, 1), +(3243, 'Further', 'page', 12, 4), +(3244, 'Content', 'page', 12, 8), +(3245, 'purpose', 'page', 12, 1), +(3246, 'knowledge', 'page', 12, 2), +(3247, 'base', 'page', 12, 4), +(3248, 'act', 'page', 12, 1), +(3249, 'as', 'page', 12, 2), +(3250, 'centralized', 'page', 12, 1), +(3251, 'organized', 'page', 12, 2), +(3252, 'platform', 'page', 12, 1), +(3253, 'access', 'page', 12, 1), +(3254, 'guides', 'page', 12, 4), +(3255, 'tutorials', 'page', 12, 1), +(3256, 'troubleshooting', 'page', 12, 1), +(3257, 'information', 'page', 12, 2), +(3258, 'other', 'page', 12, 2), +(3259, 'resources', 'page', 12, 1), +(3260, 'Knowledge', 'page', 12, 3), +(3261, 'systems', 'page', 12, 3), +(3262, 'come', 'page', 12, 1), +(3263, 'different', 'page', 12, 1), +(3264, 'flavors', 'page', 12, 1), +(3265, 'example', 'page', 12, 1), +(3266, 'there', 'page', 12, 1), +(3267, 'may', 'page', 12, 1), +(3268, 'number', 'page', 12, 1), +(3269, 'predefined', 'page', 12, 1), +(3270, 'modules', 'page', 12, 1), +(3271, 'that', 'page', 12, 2), +(3272, 'can', 'page', 12, 3), +(3273, 'added', 'page', 12, 1), +(3274, 'removed', 'page', 12, 1), +(3275, 'developed', 'page', 12, 1), +(3276, 'an', 'page', 12, 1), +(3277, 'integrated', 'page', 12, 1), +(3278, 'manner', 'page', 12, 1), +(3279, 'with', 'page', 12, 2), +(3280, 'products', 'page', 12, 1), +(3281, 'are', 'page', 12, 1), +(3282, 'most', 'page', 12, 1), +(3283, 'frequently', 'page', 12, 1), +(3284, 'contain', 'page', 12, 1), +(3285, 'detailed', 'page', 12, 1), +(3286, 'These', 'page', 12, 1), +(3287, 'include', 'page', 12, 2), +(3288, 'solutions', 'page', 12, 1), +(3289, 'wide', 'page', 12, 1), +(3290, 'range', 'page', 12, 1), +(3291, 'technical', 'page', 12, 1), +(3292, 'problems', 'page', 12, 1), +(3293, 'but', 'page', 12, 1), +(3294, 'also', 'page', 12, 1), +(3295, 'on', 'page', 12, 1), +(3296, 'every', 'page', 12, 1), +(3297, 'aspect', 'page', 12, 1), +(3298, 'programming', 'page', 12, 1), +(3299, 'hardware', 'page', 12, 1), +(3300, 'software', 'page', 12, 2), +(3301, 'topics', 'page', 12, 1), +(3302, 'business', 'page', 12, 1), +(3303, 'concepts', 'page', 12, 1), +(3304, 'Another', 'page', 12, 1), +(3305, 'reason', 'page', 12, 1), +(3306, 'consider', 'page', 12, 1), +(3307, 'Base', 'page', 12, 1), +(3308, 'it', 'page', 12, 3), +(3309, 'often', 'page', 12, 1), +(3310, 'single', 'page', 12, 1), +(3311, 'entry', 'page', 12, 1), +(3312, 'point', 'page', 12, 1), +(3313, 'system', 'page', 12, 2), +(3314, 'very', 'page', 12, 1), +(3315, 'convenient', 'page', 12, 1), +(3316, 'feature', 'page', 12, 1), +(3317, 'remote', 'page', 12, 1), +(3318, 'clients', 'page', 12, 1), +(3319, 'who', 'page', 12, 2), +(3320, 'need', 'page', 12, 2), +(3321, 'select', 'page', 12, 1), +(3322, 'particular', 'page', 12, 2), +(3323, 'program', 'page', 12, 1), +(3324, 'download', 'page', 12, 1), +(3325, 'their', 'page', 12, 1), +(3326, 'computer', 'page', 12, 1), +(3327, 'quickly', 'page', 12, 1), +(3328, 'learn', 'page', 12, 2), +(3329, 'how', 'page', 12, 2), +(3330, 'configure', 'page', 12, 1), +(3331, 'It', 'page', 12, 1), +(3332, 'particularly', 'page', 12, 1), +(3333, 'useful', 'page', 12, 1), +(3334, 'schools', 'page', 12, 1), +(3335, 'where', 'page', 12, 1), +(3336, 'users', 'page', 12, 1), +(3337, 'easily', 'page', 12, 1), +(3338, 'about', 'page', 12, 1), +(3339, 'application', 'page', 12, 1), +(3340, 'then', 'page', 12, 1), +(3341, 'use', 'page', 12, 1), +(3342, 'without', 'page', 12, 1), +(3343, 'having', 'page', 12, 1), +(3344, 'understand', 'page', 12, 1), +(3345, 'works', 'page', 12, 1), +(3346, 'Even', 'page', 12, 4), +(3347, 'Less', 'page', 12, 4), +(3348, 'Useful', 'page', 12, 4), +(3349, 'Lorem', 'page', 12, 2), +(3350, 'ipsum', 'page', 12, 2), +(3351, 'dolor', 'page', 12, 4), +(3352, 'sit', 'page', 12, 7), +(3353, 'amet', 'page', 12, 6), +(3354, 'consectetur', 'page', 12, 4), +(3355, 'adipiscing', 'page', 12, 3), +(3356, 'elit', 'page', 12, 3), +(3357, 'sed', 'page', 12, 5), +(3358, 'do', 'page', 12, 1), +(3359, 'eiusmod', 'page', 12, 1), +(3360, 'tempor', 'page', 12, 1), +(3361, 'incididunt', 'page', 12, 1), +(3362, 'ut', 'page', 12, 4), +(3363, 'labore', 'page', 12, 1), +(3364, 'et', 'page', 12, 2), +(3365, 'dolore', 'page', 12, 1), +(3366, 'magna', 'page', 12, 1), +(3367, 'aliqua', 'page', 12, 1), +(3368, 'Pellentesque', 'page', 12, 1), +(3369, 'porttitor', 'page', 12, 3), +(3370, 'eget', 'page', 12, 3), +(3371, 'morbi', 'page', 12, 5), +(3372, 'Nunc', 'page', 12, 1), +(3373, 'velit', 'page', 12, 1), +(3374, 'dignissim', 'page', 12, 3), +(3375, 'sodales', 'page', 12, 1), +(3376, 'eu', 'page', 12, 5), +(3377, 'sem', 'page', 12, 1), +(3378, 'integer', 'page', 12, 1), +(3379, 'Gravida', 'page', 12, 1), +(3380, 'cum', 'page', 12, 1), +(3381, 'sociis', 'page', 12, 1), +(3382, 'natoque', 'page', 12, 1), +(3383, 'penatibus', 'page', 12, 1), +(3384, 'magnis', 'page', 12, 1), +(3385, 'dis', 'page', 12, 1), +(3386, 'Proin', 'page', 12, 1), +(3387, 'libero', 'page', 12, 2), +(3388, 'enim', 'page', 12, 4), +(3389, 'faucibus', 'page', 12, 3), +(3390, 'turpis', 'page', 12, 1), +(3391, 'In', 'page', 12, 2), +(3392, 'fermentum', 'page', 12, 5), +(3393, 'posuere', 'page', 12, 2), +(3394, 'urna', 'page', 12, 3), +(3395, 'nec', 'page', 12, 1), +(3396, 'tincidunt', 'page', 12, 2), +(3397, 'praesent', 'page', 12, 1), +(3398, 'semper', 'page', 12, 1), +(3399, 'Varius', 'page', 12, 1), +(3400, 'duis', 'page', 12, 2), +(3401, 'lorem', 'page', 12, 2), +(3402, 'Placerat', 'page', 12, 1), +(3403, 'orci', 'page', 12, 4), +(3404, 'nulla', 'page', 12, 4), +(3405, 'pellentesque', 'page', 12, 2), +(3406, 'venenatis', 'page', 12, 1), +(3407, 'Integer', 'page', 12, 2), +(3408, 'feugiat', 'page', 12, 2), +(3409, 'scelerisque', 'page', 12, 3), +(3410, 'varius', 'page', 12, 4), +(3411, 'nunc', 'page', 12, 2), +(3412, 'Diam', 'page', 12, 1), +(3413, 'quam', 'page', 12, 5), +(3414, 'massa', 'page', 12, 2), +(3415, 'Dolor', 'page', 12, 1), +(3416, 'Tempus', 'page', 12, 1), +(3417, 'iaculis', 'page', 12, 2), +(3418, 'id', 'page', 12, 3), +(3419, 'volutpat', 'page', 12, 2), +(3420, 'Ac', 'page', 12, 1), +(3421, 'auctor', 'page', 12, 2), +(3422, 'augue', 'page', 12, 5), +(3423, 'mauris', 'page', 12, 4), +(3424, 'neque', 'page', 12, 3), +(3425, 'gravida', 'page', 12, 2), +(3426, 'Blandit', 'page', 12, 1), +(3427, 'cras', 'page', 12, 4), +(3428, 'ornare', 'page', 12, 1), +(3429, 'arcu', 'page', 12, 4), +(3430, 'mi', 'page', 12, 2), +(3431, 'bibendum', 'page', 12, 1), +(3432, 'egestas', 'page', 12, 3), +(3433, 'Non', 'page', 12, 1), +(3434, 'lacus', 'page', 12, 1), +(3435, 'suspendisse', 'page', 12, 3), +(3436, 'interdum', 'page', 12, 1), +(3437, 'Vivamus', 'page', 12, 1), +(3438, 'dictum', 'page', 12, 1), +(3439, 'Duis', 'page', 12, 1), +(3440, 'diam', 'page', 12, 4), +(3441, 'Egestas', 'page', 12, 1), +(3442, 'congue', 'page', 12, 1), +(3443, 'quisque', 'page', 12, 2), +(3444, 'cursus', 'page', 12, 1), +(3445, 'Quis', 'page', 12, 1), +(3446, 'viverra', 'page', 12, 2), +(3447, 'nibh', 'page', 12, 2), +(3448, 'pulvinar', 'page', 12, 3), +(3449, 'Hendrerit', 'page', 12, 1), +(3450, 'rutrum', 'page', 12, 2), +(3451, 'non', 'page', 12, 6), +(3452, 'tellus', 'page', 12, 5), +(3453, 'Metus', 'page', 12, 1), +(3454, 'vulputate', 'page', 12, 2), +(3455, 'felis', 'page', 12, 1), +(3456, 'imperdiet', 'page', 12, 2), +(3457, 'proin', 'page', 12, 2), +(3458, 'Nulla', 'page', 12, 1), +(3459, 'facilisi', 'page', 12, 2), +(3460, 'tempus', 'page', 12, 1), +(3461, 'Eget', 'page', 12, 2), +(3462, 'risus', 'page', 12, 1), +(3463, 'quis', 'page', 12, 1), +(3464, 'Quisque', 'page', 12, 1), +(3465, 'ac', 'page', 12, 2), +(3466, 'nullam', 'page', 12, 2), +(3467, 'nisi', 'page', 12, 2), +(3468, 'est', 'page', 12, 3), +(3469, 'Id', 'page', 12, 1), +(3470, 'vel', 'page', 12, 2), +(3471, 'elementum', 'page', 12, 1), +(3472, 'etiam', 'page', 12, 1), +(3473, 'Pretium', 'page', 12, 1), +(3474, 'potenti', 'page', 12, 1), +(3475, 'Aliquam', 'page', 12, 1), +(3476, 'maecenas', 'page', 12, 1), +(3477, 'ultricies', 'page', 12, 1), +(3478, 'Tellus', 'page', 12, 1), +(3479, 'tortor', 'page', 12, 1), +(3480, 'aliquam', 'page', 12, 1), +(3481, 'Facilisi', 'page', 12, 1), +(3482, 'odio', 'page', 12, 1), +(3483, 'Et', 'page', 12, 1), +(3484, 'sollicitudin', 'page', 12, 1), +(3485, 'phasellus', 'page', 12, 1), +(3486, 'Nullam', 'page', 12, 1), +(3487, 'Quam', 'page', 12, 1), +(3488, 'ante', 'page', 12, 1), +(3489, 'Nisi', 'page', 12, 1), +(3490, 'vitae', 'page', 12, 1), +(3491, 'suscipit', 'page', 12, 1), +(3492, 'Felis', 'page', 12, 1), +(3493, 'leo', 'page', 12, 1), +(3494, 'porta', 'page', 12, 1), +(3495, 'Conclusion', 'page', 12, 4), +(3496, 'I', 'page', 12, 1), +(3497, 'hope', 'page', 12, 1), +(3498, 'you', 'page', 12, 1), +(3499, 'enjoyed', 'page', 12, 1), +(3500, 'browsing', 'page', 12, 1), +(3501, 'almost', 'page', 12, 1), +(3502, 'pointless', 'page', 12, 1), +(3503, 'As', 'page', 12, 1), +(3504, 'reward', 'page', 12, 1), +(3505, 'check', 'page', 12, 1), +(3506, 'out', 'page', 12, 1), +(3507, 'sweet', 'page', 12, 1), +(3508, 'video', 'page', 12, 1), +(3509, 'Developing', 'book', 7, 48), +(3510, 'Research', 'book', 7, 49), +(3511, 'that', 'book', 7, 1), +(3512, 'is', 'book', 7, 1), +(3513, 'currently', 'book', 7, 1), +(3514, 'underdeveloped', 'book', 7, 1), +(3515, 'and', 'book', 7, 1), +(3516, 'in', 'book', 7, 1), +(3517, 'need', 'book', 7, 1), +(3518, 'of', 'book', 7, 1), +(3519, 'further', 'book', 7, 1), +(3520, 'expansion', 'book', 7, 1), +(3521, 'or', 'book', 7, 1), +(3522, 'exploration', 'book', 7, 1), +(3523, 'for', 'book', 7, 1), +(3524, 'the', 'book', 7, 1), +(3525, 'cyber', 'book', 7, 1), +(3526, 'security', 'book', 7, 1), +(3527, 'project', 'book', 7, 1), +(3528, 'go', 'book', 7, 1), +(3529, 'here', 'book', 7, 1), +(3530, 'Proposal', 'page', 13, 40), +(3531, '1', 'page', 13, 40), +(3532, 'Description', 'page', 13, 1), +(3533, 'A', 'page', 13, 1), +(3534, 'proposal', 'page', 13, 1), +(3535, 'area', 'page', 13, 1), +(3536, 'of', 'page', 13, 7), +(3537, 'research', 'page', 13, 1), +(3538, 'that', 'page', 13, 3), +(3539, 'could', 'page', 13, 1), +(3540, 'benefit', 'page', 13, 1), +(3541, 'the', 'page', 13, 6), +(3542, 'cyber', 'page', 13, 1), +(3543, 'security', 'page', 13, 1), +(3544, 'project', 'page', 13, 1), +(3545, 'with', 'page', 13, 3), +(3546, 'some', 'page', 13, 1), +(3547, 'further', 'page', 13, 1), +(3548, 'exploration', 'page', 13, 1), +(3549, 'An', 'page', 13, 4), +(3550, 'Example', 'page', 13, 4), +(3551, 'Document', 'page', 13, 4), +(3552, 'Welcome', 'page', 13, 1), +(3553, 'This', 'page', 13, 2), +(3554, 'is', 'page', 13, 7), +(3555, 'a', 'page', 13, 11), +(3556, 'filler', 'page', 13, 1), +(3557, 'page', 'page', 13, 1), +(3558, 'to', 'page', 13, 13), +(3559, 'show', 'page', 13, 1), +(3560, 'off', 'page', 13, 1), +(3561, 'formatting', 'page', 13, 1), +(3562, 'BookStack', 'page', 13, 1), +(3563, 'documents', 'page', 13, 1), +(3564, ' ', 'page', 13, 1), +(3565, 'All', 'page', 13, 1), +(3566, 'content', 'page', 13, 1), +(3567, 'aside', 'page', 13, 2), +(3568, 'from', 'page', 13, 2), +(3569, 'description', 'page', 13, 1), +(3570, 'at', 'page', 13, 3), +(3571, 'top', 'page', 13, 1), +(3572, 'this', 'page', 13, 3), +(3573, 'document', 'page', 13, 3), +(3574, 'unrelated', 'page', 13, 1), +(3575, 's', 'page', 13, 1), +(3576, 'actual', 'page', 13, 1), +(3577, 'purposes', 'page', 13, 2), +(3578, 'and', 'page', 13, 9), +(3579, 'should', 'page', 13, 1), +(3580, 'not', 'page', 13, 1), +(3581, 'be', 'page', 13, 4), +(3582, 'used', 'page', 13, 3), +(3583, 'demonstrative', 'page', 13, 1), +(3584, 'Further', 'page', 13, 4), +(3585, 'Content', 'page', 13, 8), +(3586, 'The', 'page', 13, 1), +(3587, 'purpose', 'page', 13, 1), +(3588, 'knowledge', 'page', 13, 2), +(3589, 'base', 'page', 13, 4), +(3590, 'act', 'page', 13, 1), +(3591, 'as', 'page', 13, 2), +(3592, 'centralized', 'page', 13, 1), +(3593, 'organized', 'page', 13, 2), +(3594, 'platform', 'page', 13, 1), +(3595, 'access', 'page', 13, 1), +(3596, 'guides', 'page', 13, 4), +(3597, 'tutorials', 'page', 13, 1), +(3598, 'troubleshooting', 'page', 13, 1), +(3599, 'information', 'page', 13, 2), +(3600, 'other', 'page', 13, 2), +(3601, 'resources', 'page', 13, 1), +(3602, 'Knowledge', 'page', 13, 3), +(3603, 'systems', 'page', 13, 3), +(3604, 'come', 'page', 13, 1), +(3605, 'in', 'page', 13, 6), +(3606, 'different', 'page', 13, 1), +(3607, 'flavors', 'page', 13, 1), +(3608, 'for', 'page', 13, 3), +(3609, 'example', 'page', 13, 1), +(3610, 'there', 'page', 13, 1), +(3611, 'may', 'page', 13, 1), +(3612, 'number', 'page', 13, 1), +(3613, 'predefined', 'page', 13, 1), +(3614, 'modules', 'page', 13, 1), +(3615, 'can', 'page', 13, 3), +(3616, 'added', 'page', 13, 1), +(3617, 'removed', 'page', 13, 1), +(3618, 'developed', 'page', 13, 1), +(3619, 'an', 'page', 13, 1), +(3620, 'integrated', 'page', 13, 1), +(3621, 'manner', 'page', 13, 1), +(3622, 'products', 'page', 13, 1), +(3623, 'are', 'page', 13, 1), +(3624, 'most', 'page', 13, 1), +(3625, 'frequently', 'page', 13, 1), +(3626, 'contain', 'page', 13, 1), +(3627, 'detailed', 'page', 13, 1), +(3628, 'These', 'page', 13, 1), +(3629, 'include', 'page', 13, 2), +(3630, 'solutions', 'page', 13, 1), +(3631, 'wide', 'page', 13, 1), +(3632, 'range', 'page', 13, 1), +(3633, 'technical', 'page', 13, 1), +(3634, 'problems', 'page', 13, 1), +(3635, 'but', 'page', 13, 1), +(3636, 'also', 'page', 13, 1), +(3637, 'on', 'page', 13, 1), +(3638, 'every', 'page', 13, 1), +(3639, 'aspect', 'page', 13, 1), +(3640, 'programming', 'page', 13, 1), +(3641, 'hardware', 'page', 13, 1), +(3642, 'software', 'page', 13, 2), +(3643, 'topics', 'page', 13, 1), +(3644, 'business', 'page', 13, 1), +(3645, 'concepts', 'page', 13, 1), +(3646, 'Another', 'page', 13, 1), +(3647, 'reason', 'page', 13, 1), +(3648, 'consider', 'page', 13, 1), +(3649, 'Base', 'page', 13, 1), +(3650, 'it', 'page', 13, 3), +(3651, 'often', 'page', 13, 1), +(3652, 'single', 'page', 13, 1), +(3653, 'entry', 'page', 13, 1), +(3654, 'point', 'page', 13, 1), +(3655, 'system', 'page', 13, 2), +(3656, 'very', 'page', 13, 1), +(3657, 'convenient', 'page', 13, 1), +(3658, 'feature', 'page', 13, 1), +(3659, 'remote', 'page', 13, 1), +(3660, 'clients', 'page', 13, 1), +(3661, 'who', 'page', 13, 2), +(3662, 'need', 'page', 13, 2), +(3663, 'select', 'page', 13, 1), +(3664, 'particular', 'page', 13, 2), +(3665, 'program', 'page', 13, 1), +(3666, 'download', 'page', 13, 1), +(3667, 'their', 'page', 13, 1), +(3668, 'computer', 'page', 13, 1), +(3669, 'or', 'page', 13, 1), +(3670, 'quickly', 'page', 13, 1), +(3671, 'learn', 'page', 13, 2), +(3672, 'how', 'page', 13, 2), +(3673, 'configure', 'page', 13, 1), +(3674, 'It', 'page', 13, 1), +(3675, 'particularly', 'page', 13, 1), +(3676, 'useful', 'page', 13, 1), +(3677, 'schools', 'page', 13, 1), +(3678, 'where', 'page', 13, 1), +(3679, 'users', 'page', 13, 1), +(3680, 'easily', 'page', 13, 1), +(3681, 'about', 'page', 13, 1), +(3682, 'application', 'page', 13, 1), +(3683, 'then', 'page', 13, 1), +(3684, 'use', 'page', 13, 1), +(3685, 'without', 'page', 13, 1), +(3686, 'having', 'page', 13, 1), +(3687, 'understand', 'page', 13, 1), +(3688, 'works', 'page', 13, 1), +(3689, 'Even', 'page', 13, 4), +(3690, 'Less', 'page', 13, 4), +(3691, 'Useful', 'page', 13, 4), +(3692, 'Lorem', 'page', 13, 2), +(3693, 'ipsum', 'page', 13, 2), +(3694, 'dolor', 'page', 13, 4), +(3695, 'sit', 'page', 13, 7), +(3696, 'amet', 'page', 13, 6), +(3697, 'consectetur', 'page', 13, 4), +(3698, 'adipiscing', 'page', 13, 3), +(3699, 'elit', 'page', 13, 3), +(3700, 'sed', 'page', 13, 5), +(3701, 'do', 'page', 13, 1), +(3702, 'eiusmod', 'page', 13, 1), +(3703, 'tempor', 'page', 13, 1), +(3704, 'incididunt', 'page', 13, 1), +(3705, 'ut', 'page', 13, 4), +(3706, 'labore', 'page', 13, 1), +(3707, 'et', 'page', 13, 2), +(3708, 'dolore', 'page', 13, 1), +(3709, 'magna', 'page', 13, 1), +(3710, 'aliqua', 'page', 13, 1), +(3711, 'Pellentesque', 'page', 13, 1), +(3712, 'porttitor', 'page', 13, 3), +(3713, 'eget', 'page', 13, 3), +(3714, 'morbi', 'page', 13, 5), +(3715, 'Nunc', 'page', 13, 1), +(3716, 'velit', 'page', 13, 1), +(3717, 'dignissim', 'page', 13, 3), +(3718, 'sodales', 'page', 13, 1), +(3719, 'eu', 'page', 13, 5), +(3720, 'sem', 'page', 13, 1), +(3721, 'integer', 'page', 13, 1), +(3722, 'Gravida', 'page', 13, 1), +(3723, 'cum', 'page', 13, 1), +(3724, 'sociis', 'page', 13, 1), +(3725, 'natoque', 'page', 13, 1), +(3726, 'penatibus', 'page', 13, 1), +(3727, 'magnis', 'page', 13, 1), +(3728, 'dis', 'page', 13, 1), +(3729, 'Proin', 'page', 13, 1), +(3730, 'libero', 'page', 13, 2), +(3731, 'enim', 'page', 13, 4), +(3732, 'faucibus', 'page', 13, 3), +(3733, 'turpis', 'page', 13, 1), +(3734, 'In', 'page', 13, 2), +(3735, 'fermentum', 'page', 13, 5), +(3736, 'posuere', 'page', 13, 2), +(3737, 'urna', 'page', 13, 3), +(3738, 'nec', 'page', 13, 1), +(3739, 'tincidunt', 'page', 13, 2), +(3740, 'praesent', 'page', 13, 1), +(3741, 'semper', 'page', 13, 1), +(3742, 'Varius', 'page', 13, 1), +(3743, 'duis', 'page', 13, 2), +(3744, 'lorem', 'page', 13, 2), +(3745, 'Placerat', 'page', 13, 1), +(3746, 'orci', 'page', 13, 4), +(3747, 'nulla', 'page', 13, 4), +(3748, 'pellentesque', 'page', 13, 2), +(3749, 'venenatis', 'page', 13, 1), +(3750, 'Integer', 'page', 13, 2), +(3751, 'feugiat', 'page', 13, 2), +(3752, 'scelerisque', 'page', 13, 3), +(3753, 'varius', 'page', 13, 4), +(3754, 'nunc', 'page', 13, 2), +(3755, 'Diam', 'page', 13, 1), +(3756, 'quam', 'page', 13, 5), +(3757, 'massa', 'page', 13, 2), +(3758, 'Dolor', 'page', 13, 1), +(3759, 'Tempus', 'page', 13, 1), +(3760, 'iaculis', 'page', 13, 2), +(3761, 'id', 'page', 13, 3), +(3762, 'volutpat', 'page', 13, 2), +(3763, 'Ac', 'page', 13, 1), +(3764, 'auctor', 'page', 13, 2), +(3765, 'augue', 'page', 13, 5), +(3766, 'mauris', 'page', 13, 4), +(3767, 'neque', 'page', 13, 3), +(3768, 'gravida', 'page', 13, 2), +(3769, 'Blandit', 'page', 13, 1), +(3770, 'cras', 'page', 13, 4), +(3771, 'ornare', 'page', 13, 1), +(3772, 'arcu', 'page', 13, 4), +(3773, 'mi', 'page', 13, 2), +(3774, 'bibendum', 'page', 13, 1), +(3775, 'egestas', 'page', 13, 3), +(3776, 'Non', 'page', 13, 1), +(3777, 'lacus', 'page', 13, 1), +(3778, 'suspendisse', 'page', 13, 3), +(3779, 'interdum', 'page', 13, 1), +(3780, 'Vivamus', 'page', 13, 1), +(3781, 'dictum', 'page', 13, 1), +(3782, 'Duis', 'page', 13, 1), +(3783, 'diam', 'page', 13, 4), +(3784, 'Egestas', 'page', 13, 1), +(3785, 'congue', 'page', 13, 1), +(3786, 'quisque', 'page', 13, 2), +(3787, 'cursus', 'page', 13, 1), +(3788, 'Quis', 'page', 13, 1), +(3789, 'viverra', 'page', 13, 2), +(3790, 'nibh', 'page', 13, 2), +(3791, 'pulvinar', 'page', 13, 3), +(3792, 'Hendrerit', 'page', 13, 1), +(3793, 'rutrum', 'page', 13, 2), +(3794, 'non', 'page', 13, 6), +(3795, 'tellus', 'page', 13, 5), +(3796, 'Metus', 'page', 13, 1), +(3797, 'vulputate', 'page', 13, 2), +(3798, 'felis', 'page', 13, 1), +(3799, 'imperdiet', 'page', 13, 2), +(3800, 'proin', 'page', 13, 2), +(3801, 'Nulla', 'page', 13, 1), +(3802, 'facilisi', 'page', 13, 2), +(3803, 'tempus', 'page', 13, 1), +(3804, 'Eget', 'page', 13, 2), +(3805, 'risus', 'page', 13, 1), +(3806, 'quis', 'page', 13, 1), +(3807, 'Quisque', 'page', 13, 1), +(3808, 'ac', 'page', 13, 2), +(3809, 'nullam', 'page', 13, 2), +(3810, 'nisi', 'page', 13, 2), +(3811, 'est', 'page', 13, 3), +(3812, 'Id', 'page', 13, 1), +(3813, 'vel', 'page', 13, 2), +(3814, 'elementum', 'page', 13, 1), +(3815, 'etiam', 'page', 13, 1), +(3816, 'Pretium', 'page', 13, 1), +(3817, 'potenti', 'page', 13, 1), +(3818, 'Aliquam', 'page', 13, 1), +(3819, 'maecenas', 'page', 13, 1), +(3820, 'ultricies', 'page', 13, 1), +(3821, 'Tellus', 'page', 13, 1), +(3822, 'tortor', 'page', 13, 1), +(3823, 'aliquam', 'page', 13, 1), +(3824, 'Facilisi', 'page', 13, 1), +(3825, 'odio', 'page', 13, 1), +(3826, 'Et', 'page', 13, 1), +(3827, 'sollicitudin', 'page', 13, 1), +(3828, 'phasellus', 'page', 13, 1), +(3829, 'Nullam', 'page', 13, 1), +(3830, 'Quam', 'page', 13, 1), +(3831, 'ante', 'page', 13, 1), +(3832, 'Nisi', 'page', 13, 1), +(3833, 'vitae', 'page', 13, 1), +(3834, 'suscipit', 'page', 13, 1), +(3835, 'Felis', 'page', 13, 1), +(3836, 'leo', 'page', 13, 1), +(3837, 'porta', 'page', 13, 1), +(3838, 'Conclusion', 'page', 13, 4), +(3839, 'I', 'page', 13, 1), +(3840, 'hope', 'page', 13, 1), +(3841, 'you', 'page', 13, 1), +(3842, 'enjoyed', 'page', 13, 1), +(3843, 'browsing', 'page', 13, 1), +(3844, 'almost', 'page', 13, 1), +(3845, 'pointless', 'page', 13, 1), +(3846, 'As', 'page', 13, 1), +(3847, 'reward', 'page', 13, 1), +(3848, 'check', 'page', 13, 1), +(3849, 'out', 'page', 13, 1), +(3850, 'sweet', 'page', 13, 1), +(3851, 'video', 'page', 13, 1), +(3852, 'Proposal', 'page', 14, 40), +(3853, '2', 'page', 14, 40), +(3854, 'Description', 'page', 14, 1), +(3855, 'A', 'page', 14, 1), +(3856, 'proposal', 'page', 14, 1), +(3857, 'area', 'page', 14, 1), +(3858, 'of', 'page', 14, 7), +(3859, 'research', 'page', 14, 1), +(3860, 'that', 'page', 14, 3), +(3861, 'could', 'page', 14, 1), +(3862, 'benefit', 'page', 14, 1), +(3863, 'the', 'page', 14, 6), +(3864, 'cyber', 'page', 14, 1), +(3865, 'security', 'page', 14, 1), +(3866, 'project', 'page', 14, 1), +(3867, 'with', 'page', 14, 3), +(3868, 'some', 'page', 14, 1), +(3869, 'further', 'page', 14, 1), +(3870, 'exploration', 'page', 14, 1), +(3871, 'An', 'page', 14, 4), +(3872, 'Example', 'page', 14, 4), +(3873, 'Document', 'page', 14, 4), +(3874, 'Welcome', 'page', 14, 1), +(3875, 'This', 'page', 14, 2), +(3876, 'is', 'page', 14, 7), +(3877, 'a', 'page', 14, 11), +(3878, 'filler', 'page', 14, 1), +(3879, 'page', 'page', 14, 1), +(3880, 'to', 'page', 14, 13), +(3881, 'show', 'page', 14, 1), +(3882, 'off', 'page', 14, 1), +(3883, 'formatting', 'page', 14, 1), +(3884, 'BookStack', 'page', 14, 1), +(3885, 'documents', 'page', 14, 1), +(3886, ' ', 'page', 14, 1), +(3887, 'All', 'page', 14, 1), +(3888, 'content', 'page', 14, 1), +(3889, 'aside', 'page', 14, 2), +(3890, 'from', 'page', 14, 2), +(3891, 'description', 'page', 14, 1), +(3892, 'at', 'page', 14, 3), +(3893, 'top', 'page', 14, 1), +(3894, 'this', 'page', 14, 3), +(3895, 'document', 'page', 14, 3), +(3896, 'unrelated', 'page', 14, 1), +(3897, 's', 'page', 14, 1), +(3898, 'actual', 'page', 14, 1), +(3899, 'purposes', 'page', 14, 2), +(3900, 'and', 'page', 14, 9), +(3901, 'should', 'page', 14, 1), +(3902, 'not', 'page', 14, 1), +(3903, 'be', 'page', 14, 4), +(3904, 'used', 'page', 14, 3), +(3905, 'demonstrative', 'page', 14, 1), +(3906, 'Further', 'page', 14, 4), +(3907, 'Content', 'page', 14, 8), +(3908, 'The', 'page', 14, 1), +(3909, 'purpose', 'page', 14, 1), +(3910, 'knowledge', 'page', 14, 2), +(3911, 'base', 'page', 14, 4), +(3912, 'act', 'page', 14, 1), +(3913, 'as', 'page', 14, 2), +(3914, 'centralized', 'page', 14, 1), +(3915, 'organized', 'page', 14, 2), +(3916, 'platform', 'page', 14, 1), +(3917, 'access', 'page', 14, 1), +(3918, 'guides', 'page', 14, 4), +(3919, 'tutorials', 'page', 14, 1), +(3920, 'troubleshooting', 'page', 14, 1), +(3921, 'information', 'page', 14, 2), +(3922, 'other', 'page', 14, 2), +(3923, 'resources', 'page', 14, 1), +(3924, 'Knowledge', 'page', 14, 3), +(3925, 'systems', 'page', 14, 3), +(3926, 'come', 'page', 14, 1), +(3927, 'in', 'page', 14, 6), +(3928, 'different', 'page', 14, 1), +(3929, 'flavors', 'page', 14, 1), +(3930, 'for', 'page', 14, 3), +(3931, 'example', 'page', 14, 1), +(3932, 'there', 'page', 14, 1), +(3933, 'may', 'page', 14, 1), +(3934, 'number', 'page', 14, 1), +(3935, 'predefined', 'page', 14, 1), +(3936, 'modules', 'page', 14, 1), +(3937, 'can', 'page', 14, 3), +(3938, 'added', 'page', 14, 1), +(3939, 'removed', 'page', 14, 1), +(3940, 'developed', 'page', 14, 1), +(3941, 'an', 'page', 14, 1), +(3942, 'integrated', 'page', 14, 1), +(3943, 'manner', 'page', 14, 1), +(3944, 'products', 'page', 14, 1), +(3945, 'are', 'page', 14, 1), +(3946, 'most', 'page', 14, 1), +(3947, 'frequently', 'page', 14, 1), +(3948, 'contain', 'page', 14, 1), +(3949, 'detailed', 'page', 14, 1), +(3950, 'These', 'page', 14, 1), +(3951, 'include', 'page', 14, 2), +(3952, 'solutions', 'page', 14, 1), +(3953, 'wide', 'page', 14, 1), +(3954, 'range', 'page', 14, 1), +(3955, 'technical', 'page', 14, 1), +(3956, 'problems', 'page', 14, 1), +(3957, 'but', 'page', 14, 1), +(3958, 'also', 'page', 14, 1), +(3959, 'on', 'page', 14, 1), +(3960, 'every', 'page', 14, 1), +(3961, 'aspect', 'page', 14, 1), +(3962, 'programming', 'page', 14, 1), +(3963, 'hardware', 'page', 14, 1), +(3964, 'software', 'page', 14, 2), +(3965, 'topics', 'page', 14, 1), +(3966, 'business', 'page', 14, 1), +(3967, 'concepts', 'page', 14, 1), +(3968, 'Another', 'page', 14, 1), +(3969, 'reason', 'page', 14, 1), +(3970, 'consider', 'page', 14, 1), +(3971, 'Base', 'page', 14, 1), +(3972, 'it', 'page', 14, 3), +(3973, 'often', 'page', 14, 1), +(3974, 'single', 'page', 14, 1), +(3975, 'entry', 'page', 14, 1), +(3976, 'point', 'page', 14, 1), +(3977, 'system', 'page', 14, 2), +(3978, 'very', 'page', 14, 1), +(3979, 'convenient', 'page', 14, 1), +(3980, 'feature', 'page', 14, 1), +(3981, 'remote', 'page', 14, 1), +(3982, 'clients', 'page', 14, 1), +(3983, 'who', 'page', 14, 2), +(3984, 'need', 'page', 14, 2), +(3985, 'select', 'page', 14, 1), +(3986, 'particular', 'page', 14, 2), +(3987, 'program', 'page', 14, 1), +(3988, 'download', 'page', 14, 1), +(3989, 'their', 'page', 14, 1), +(3990, 'computer', 'page', 14, 1), +(3991, 'or', 'page', 14, 1), +(3992, 'quickly', 'page', 14, 1), +(3993, 'learn', 'page', 14, 2), +(3994, 'how', 'page', 14, 2), +(3995, 'configure', 'page', 14, 1), +(3996, 'It', 'page', 14, 1), +(3997, 'particularly', 'page', 14, 1), +(3998, 'useful', 'page', 14, 1), +(3999, 'schools', 'page', 14, 1), +(4000, 'where', 'page', 14, 1), +(4001, 'users', 'page', 14, 1), +(4002, 'easily', 'page', 14, 1), +(4003, 'about', 'page', 14, 1), +(4004, 'application', 'page', 14, 1), +(4005, 'then', 'page', 14, 1), +(4006, 'use', 'page', 14, 1), +(4007, 'without', 'page', 14, 1), +(4008, 'having', 'page', 14, 1), +(4009, 'understand', 'page', 14, 1), +(4010, 'works', 'page', 14, 1), +(4011, 'Even', 'page', 14, 4), +(4012, 'Less', 'page', 14, 4), +(4013, 'Useful', 'page', 14, 4), +(4014, 'Lorem', 'page', 14, 2), +(4015, 'ipsum', 'page', 14, 2), +(4016, 'dolor', 'page', 14, 4), +(4017, 'sit', 'page', 14, 7), +(4018, 'amet', 'page', 14, 6), +(4019, 'consectetur', 'page', 14, 4), +(4020, 'adipiscing', 'page', 14, 3), +(4021, 'elit', 'page', 14, 3), +(4022, 'sed', 'page', 14, 5), +(4023, 'do', 'page', 14, 1), +(4024, 'eiusmod', 'page', 14, 1), +(4025, 'tempor', 'page', 14, 1), +(4026, 'incididunt', 'page', 14, 1), +(4027, 'ut', 'page', 14, 4), +(4028, 'labore', 'page', 14, 1), +(4029, 'et', 'page', 14, 2), +(4030, 'dolore', 'page', 14, 1), +(4031, 'magna', 'page', 14, 1), +(4032, 'aliqua', 'page', 14, 1), +(4033, 'Pellentesque', 'page', 14, 1), +(4034, 'porttitor', 'page', 14, 3), +(4035, 'eget', 'page', 14, 3), +(4036, 'morbi', 'page', 14, 5), +(4037, 'Nunc', 'page', 14, 1), +(4038, 'velit', 'page', 14, 1), +(4039, 'dignissim', 'page', 14, 3), +(4040, 'sodales', 'page', 14, 1), +(4041, 'eu', 'page', 14, 5), +(4042, 'sem', 'page', 14, 1), +(4043, 'integer', 'page', 14, 1), +(4044, 'Gravida', 'page', 14, 1), +(4045, 'cum', 'page', 14, 1), +(4046, 'sociis', 'page', 14, 1), +(4047, 'natoque', 'page', 14, 1), +(4048, 'penatibus', 'page', 14, 1), +(4049, 'magnis', 'page', 14, 1), +(4050, 'dis', 'page', 14, 1), +(4051, 'Proin', 'page', 14, 1), +(4052, 'libero', 'page', 14, 2), +(4053, 'enim', 'page', 14, 4), +(4054, 'faucibus', 'page', 14, 3), +(4055, 'turpis', 'page', 14, 1), +(4056, 'In', 'page', 14, 2), +(4057, 'fermentum', 'page', 14, 5), +(4058, 'posuere', 'page', 14, 2), +(4059, 'urna', 'page', 14, 3), +(4060, 'nec', 'page', 14, 1), +(4061, 'tincidunt', 'page', 14, 2), +(4062, 'praesent', 'page', 14, 1), +(4063, 'semper', 'page', 14, 1), +(4064, 'Varius', 'page', 14, 1), +(4065, 'duis', 'page', 14, 2), +(4066, 'lorem', 'page', 14, 2), +(4067, 'Placerat', 'page', 14, 1), +(4068, 'orci', 'page', 14, 4), +(4069, 'nulla', 'page', 14, 4), +(4070, 'pellentesque', 'page', 14, 2), +(4071, 'venenatis', 'page', 14, 1), +(4072, 'Integer', 'page', 14, 2), +(4073, 'feugiat', 'page', 14, 2), +(4074, 'scelerisque', 'page', 14, 3), +(4075, 'varius', 'page', 14, 4), +(4076, 'nunc', 'page', 14, 2), +(4077, 'Diam', 'page', 14, 1), +(4078, 'quam', 'page', 14, 5), +(4079, 'massa', 'page', 14, 2), +(4080, 'Dolor', 'page', 14, 1), +(4081, 'Tempus', 'page', 14, 1), +(4082, 'iaculis', 'page', 14, 2), +(4083, 'id', 'page', 14, 3), +(4084, 'volutpat', 'page', 14, 2), +(4085, 'Ac', 'page', 14, 1), +(4086, 'auctor', 'page', 14, 2), +(4087, 'augue', 'page', 14, 5), +(4088, 'mauris', 'page', 14, 4), +(4089, 'neque', 'page', 14, 3), +(4090, 'gravida', 'page', 14, 2), +(4091, 'Blandit', 'page', 14, 1), +(4092, 'cras', 'page', 14, 4), +(4093, 'ornare', 'page', 14, 1), +(4094, 'arcu', 'page', 14, 4), +(4095, 'mi', 'page', 14, 2), +(4096, 'bibendum', 'page', 14, 1), +(4097, 'egestas', 'page', 14, 3), +(4098, 'Non', 'page', 14, 1), +(4099, 'lacus', 'page', 14, 1), +(4100, 'suspendisse', 'page', 14, 3), +(4101, 'interdum', 'page', 14, 1), +(4102, 'Vivamus', 'page', 14, 1), +(4103, 'dictum', 'page', 14, 1), +(4104, 'Duis', 'page', 14, 1), +(4105, 'diam', 'page', 14, 4), +(4106, 'Egestas', 'page', 14, 1), +(4107, 'congue', 'page', 14, 1), +(4108, 'quisque', 'page', 14, 2), +(4109, 'cursus', 'page', 14, 1), +(4110, 'Quis', 'page', 14, 1), +(4111, 'viverra', 'page', 14, 2), +(4112, 'nibh', 'page', 14, 2), +(4113, 'pulvinar', 'page', 14, 3), +(4114, 'Hendrerit', 'page', 14, 1), +(4115, 'rutrum', 'page', 14, 2), +(4116, 'non', 'page', 14, 6), +(4117, 'tellus', 'page', 14, 5), +(4118, 'Metus', 'page', 14, 1), +(4119, 'vulputate', 'page', 14, 2), +(4120, 'felis', 'page', 14, 1), +(4121, 'imperdiet', 'page', 14, 2), +(4122, 'proin', 'page', 14, 2), +(4123, 'Nulla', 'page', 14, 1), +(4124, 'facilisi', 'page', 14, 2), +(4125, 'tempus', 'page', 14, 1), +(4126, 'Eget', 'page', 14, 2), +(4127, 'risus', 'page', 14, 1), +(4128, 'quis', 'page', 14, 1), +(4129, 'Quisque', 'page', 14, 1), +(4130, 'ac', 'page', 14, 2), +(4131, 'nullam', 'page', 14, 2), +(4132, 'nisi', 'page', 14, 2), +(4133, 'est', 'page', 14, 3), +(4134, 'Id', 'page', 14, 1), +(4135, 'vel', 'page', 14, 2), +(4136, 'elementum', 'page', 14, 1), +(4137, 'etiam', 'page', 14, 1), +(4138, 'Pretium', 'page', 14, 1), +(4139, 'potenti', 'page', 14, 1), +(4140, 'Aliquam', 'page', 14, 1), +(4141, 'maecenas', 'page', 14, 1), +(4142, 'ultricies', 'page', 14, 1), +(4143, 'Tellus', 'page', 14, 1), +(4144, 'tortor', 'page', 14, 1), +(4145, 'aliquam', 'page', 14, 1), +(4146, 'Facilisi', 'page', 14, 1), +(4147, 'odio', 'page', 14, 1), +(4148, 'Et', 'page', 14, 1), +(4149, 'sollicitudin', 'page', 14, 1), +(4150, 'phasellus', 'page', 14, 1), +(4151, 'Nullam', 'page', 14, 1), +(4152, 'Quam', 'page', 14, 1), +(4153, 'ante', 'page', 14, 1), +(4154, 'Nisi', 'page', 14, 1), +(4155, 'vitae', 'page', 14, 1), +(4156, 'suscipit', 'page', 14, 1), +(4157, 'Felis', 'page', 14, 1), +(4158, 'leo', 'page', 14, 1), +(4159, 'porta', 'page', 14, 1), +(4160, 'Conclusion', 'page', 14, 4), +(4161, 'I', 'page', 14, 1), +(4162, 'hope', 'page', 14, 1), +(4163, 'you', 'page', 14, 1), +(4164, 'enjoyed', 'page', 14, 1), +(4165, 'browsing', 'page', 14, 1), +(4166, 'almost', 'page', 14, 1), +(4167, 'pointless', 'page', 14, 1), +(4168, 'As', 'page', 14, 1), +(4169, 'reward', 'page', 14, 1), +(4170, 'check', 'page', 14, 1), +(4171, 'out', 'page', 14, 1), +(4172, 'sweet', 'page', 14, 1), +(4173, 'video', 'page', 14, 1), +(4174, 'Methodologies', 'book', 8, 48), +(4175, 'Details', 'book', 8, 1), +(4176, 'regarding', 'book', 8, 1), +(4177, 'testing', 'book', 8, 1), +(4178, 'processes', 'book', 8, 1), +(4179, 'and', 'book', 8, 1), +(4180, 'the', 'book', 8, 1), +(4181, 'technologies', 'book', 8, 1), +(4182, 'involved', 'book', 8, 1), +(4183, 'Testing', 'page', 15, 40), +(4184, 'Methodologies/Tech', 'page', 15, 40), +(4185, 'Stack', 'page', 15, 40), +(4186, 'Description', 'page', 15, 1), +(4187, 'A', 'page', 15, 1), +(4188, 'document', 'page', 15, 4), +(4189, 'detailing', 'page', 15, 1), +(4190, 'the', 'page', 15, 7), +(4191, 'methodologies', 'page', 15, 1), +(4192, 'used', 'page', 15, 4), +(4193, 'during', 'page', 15, 1), +(4194, 'testing', 'page', 15, 1), +(4195, 'alongside', 'page', 15, 1), +(4196, 'technologies', 'page', 15, 1), +(4197, 'involved', 'page', 15, 1), +(4198, 'An', 'page', 15, 4), +(4199, 'Example', 'page', 15, 4), +(4200, 'Document', 'page', 15, 4), +(4201, 'Welcome', 'page', 15, 1), +(4202, 'This', 'page', 15, 2), +(4203, 'is', 'page', 15, 7), +(4204, 'a', 'page', 15, 11), +(4205, 'filler', 'page', 15, 1), +(4206, 'page', 'page', 15, 1), +(4207, 'to', 'page', 15, 13), +(4208, 'show', 'page', 15, 1), +(4209, 'off', 'page', 15, 1), +(4210, 'formatting', 'page', 15, 1), +(4211, 'of', 'page', 15, 6), +(4212, 'BookStack', 'page', 15, 1), +(4213, 'documents', 'page', 15, 1), +(4214, ' ', 'page', 15, 1), +(4215, 'All', 'page', 15, 1), +(4216, 'content', 'page', 15, 1), +(4217, 'aside', 'page', 15, 2), +(4218, 'from', 'page', 15, 2), +(4219, 'description', 'page', 15, 1), +(4220, 'at', 'page', 15, 3), +(4221, 'top', 'page', 15, 1), +(4222, 'this', 'page', 15, 3), +(4223, 'unrelated', 'page', 15, 1), +(4224, 's', 'page', 15, 1), +(4225, 'actual', 'page', 15, 1), +(4226, 'purposes', 'page', 15, 2), +(4227, 'and', 'page', 15, 9), +(4228, 'should', 'page', 15, 1), +(4229, 'not', 'page', 15, 1), +(4230, 'be', 'page', 15, 4), +(4231, 'demonstrative', 'page', 15, 1), +(4232, 'Further', 'page', 15, 4), +(4233, 'Content', 'page', 15, 8), +(4234, 'The', 'page', 15, 1), +(4235, 'purpose', 'page', 15, 1), +(4236, 'knowledge', 'page', 15, 2), +(4237, 'base', 'page', 15, 4), +(4238, 'act', 'page', 15, 1), +(4239, 'as', 'page', 15, 2), +(4240, 'centralized', 'page', 15, 1), +(4241, 'organized', 'page', 15, 2), +(4242, 'platform', 'page', 15, 1), +(4243, 'access', 'page', 15, 1), +(4244, 'guides', 'page', 15, 4), +(4245, 'tutorials', 'page', 15, 1), +(4246, 'troubleshooting', 'page', 15, 1), +(4247, 'information', 'page', 15, 2), +(4248, 'other', 'page', 15, 2), +(4249, 'resources', 'page', 15, 1), +(4250, 'Knowledge', 'page', 15, 3), +(4251, 'systems', 'page', 15, 3), +(4252, 'come', 'page', 15, 1), +(4253, 'in', 'page', 15, 6), +(4254, 'different', 'page', 15, 1), +(4255, 'flavors', 'page', 15, 1), +(4256, 'for', 'page', 15, 3), +(4257, 'example', 'page', 15, 1), +(4258, 'there', 'page', 15, 1), +(4259, 'may', 'page', 15, 1), +(4260, 'number', 'page', 15, 1), +(4261, 'predefined', 'page', 15, 1), +(4262, 'modules', 'page', 15, 1), +(4263, 'that', 'page', 15, 2), +(4264, 'can', 'page', 15, 3), +(4265, 'added', 'page', 15, 1), +(4266, 'removed', 'page', 15, 1), +(4267, 'developed', 'page', 15, 1), +(4268, 'an', 'page', 15, 1), +(4269, 'integrated', 'page', 15, 1), +(4270, 'manner', 'page', 15, 1), +(4271, 'with', 'page', 15, 2), +(4272, 'products', 'page', 15, 1), +(4273, 'are', 'page', 15, 1), +(4274, 'most', 'page', 15, 1), +(4275, 'frequently', 'page', 15, 1), +(4276, 'contain', 'page', 15, 1), +(4277, 'detailed', 'page', 15, 1), +(4278, 'These', 'page', 15, 1), +(4279, 'include', 'page', 15, 2), +(4280, 'solutions', 'page', 15, 1), +(4281, 'wide', 'page', 15, 1), +(4282, 'range', 'page', 15, 1), +(4283, 'technical', 'page', 15, 1), +(4284, 'problems', 'page', 15, 1), +(4285, 'but', 'page', 15, 1), +(4286, 'also', 'page', 15, 1), +(4287, 'on', 'page', 15, 1), +(4288, 'every', 'page', 15, 1), +(4289, 'aspect', 'page', 15, 1), +(4290, 'programming', 'page', 15, 1), +(4291, 'hardware', 'page', 15, 1), +(4292, 'software', 'page', 15, 2), +(4293, 'topics', 'page', 15, 1), +(4294, 'business', 'page', 15, 1), +(4295, 'concepts', 'page', 15, 1), +(4296, 'Another', 'page', 15, 1), +(4297, 'reason', 'page', 15, 1), +(4298, 'consider', 'page', 15, 1), +(4299, 'Base', 'page', 15, 1), +(4300, 'it', 'page', 15, 3), +(4301, 'often', 'page', 15, 1), +(4302, 'single', 'page', 15, 1), +(4303, 'entry', 'page', 15, 1), +(4304, 'point', 'page', 15, 1), +(4305, 'system', 'page', 15, 2), +(4306, 'very', 'page', 15, 1), +(4307, 'convenient', 'page', 15, 1), +(4308, 'feature', 'page', 15, 1), +(4309, 'remote', 'page', 15, 1), +(4310, 'clients', 'page', 15, 1), +(4311, 'who', 'page', 15, 2), +(4312, 'need', 'page', 15, 2), +(4313, 'select', 'page', 15, 1), +(4314, 'particular', 'page', 15, 2), +(4315, 'program', 'page', 15, 1), +(4316, 'download', 'page', 15, 1), +(4317, 'their', 'page', 15, 1), +(4318, 'computer', 'page', 15, 1), +(4319, 'or', 'page', 15, 1), +(4320, 'quickly', 'page', 15, 1), +(4321, 'learn', 'page', 15, 2), +(4322, 'how', 'page', 15, 2), +(4323, 'configure', 'page', 15, 1), +(4324, 'It', 'page', 15, 1), +(4325, 'particularly', 'page', 15, 1), +(4326, 'useful', 'page', 15, 1), +(4327, 'schools', 'page', 15, 1), +(4328, 'where', 'page', 15, 1), +(4329, 'users', 'page', 15, 1), +(4330, 'easily', 'page', 15, 1), +(4331, 'about', 'page', 15, 1), +(4332, 'application', 'page', 15, 1), +(4333, 'then', 'page', 15, 1), +(4334, 'use', 'page', 15, 1), +(4335, 'without', 'page', 15, 1), +(4336, 'having', 'page', 15, 1), +(4337, 'understand', 'page', 15, 1), +(4338, 'works', 'page', 15, 1), +(4339, 'Even', 'page', 15, 4), +(4340, 'Less', 'page', 15, 4), +(4341, 'Useful', 'page', 15, 4), +(4342, 'Lorem', 'page', 15, 2), +(4343, 'ipsum', 'page', 15, 2), +(4344, 'dolor', 'page', 15, 4), +(4345, 'sit', 'page', 15, 7), +(4346, 'amet', 'page', 15, 6), +(4347, 'consectetur', 'page', 15, 4), +(4348, 'adipiscing', 'page', 15, 3), +(4349, 'elit', 'page', 15, 3), +(4350, 'sed', 'page', 15, 5), +(4351, 'do', 'page', 15, 1), +(4352, 'eiusmod', 'page', 15, 1), +(4353, 'tempor', 'page', 15, 1), +(4354, 'incididunt', 'page', 15, 1), +(4355, 'ut', 'page', 15, 4), +(4356, 'labore', 'page', 15, 1), +(4357, 'et', 'page', 15, 2), +(4358, 'dolore', 'page', 15, 1), +(4359, 'magna', 'page', 15, 1), +(4360, 'aliqua', 'page', 15, 1), +(4361, 'Pellentesque', 'page', 15, 1), +(4362, 'porttitor', 'page', 15, 3), +(4363, 'eget', 'page', 15, 3), +(4364, 'morbi', 'page', 15, 5), +(4365, 'Nunc', 'page', 15, 1), +(4366, 'velit', 'page', 15, 1), +(4367, 'dignissim', 'page', 15, 3), +(4368, 'sodales', 'page', 15, 1), +(4369, 'eu', 'page', 15, 5), +(4370, 'sem', 'page', 15, 1), +(4371, 'integer', 'page', 15, 1), +(4372, 'Gravida', 'page', 15, 1), +(4373, 'cum', 'page', 15, 1), +(4374, 'sociis', 'page', 15, 1), +(4375, 'natoque', 'page', 15, 1), +(4376, 'penatibus', 'page', 15, 1), +(4377, 'magnis', 'page', 15, 1), +(4378, 'dis', 'page', 15, 1), +(4379, 'Proin', 'page', 15, 1), +(4380, 'libero', 'page', 15, 2), +(4381, 'enim', 'page', 15, 4), +(4382, 'faucibus', 'page', 15, 3), +(4383, 'turpis', 'page', 15, 1), +(4384, 'In', 'page', 15, 2), +(4385, 'fermentum', 'page', 15, 5), +(4386, 'posuere', 'page', 15, 2), +(4387, 'urna', 'page', 15, 3), +(4388, 'nec', 'page', 15, 1), +(4389, 'tincidunt', 'page', 15, 2), +(4390, 'praesent', 'page', 15, 1), +(4391, 'semper', 'page', 15, 1), +(4392, 'Varius', 'page', 15, 1), +(4393, 'duis', 'page', 15, 2), +(4394, 'lorem', 'page', 15, 2), +(4395, 'Placerat', 'page', 15, 1), +(4396, 'orci', 'page', 15, 4), +(4397, 'nulla', 'page', 15, 4), +(4398, 'pellentesque', 'page', 15, 2), +(4399, 'venenatis', 'page', 15, 1), +(4400, 'Integer', 'page', 15, 2), +(4401, 'feugiat', 'page', 15, 2), +(4402, 'scelerisque', 'page', 15, 3), +(4403, 'varius', 'page', 15, 4), +(4404, 'nunc', 'page', 15, 2), +(4405, 'Diam', 'page', 15, 1), +(4406, 'quam', 'page', 15, 5), +(4407, 'massa', 'page', 15, 2), +(4408, 'Dolor', 'page', 15, 1), +(4409, 'Tempus', 'page', 15, 1), +(4410, 'iaculis', 'page', 15, 2), +(4411, 'id', 'page', 15, 3), +(4412, 'volutpat', 'page', 15, 2), +(4413, 'Ac', 'page', 15, 1), +(4414, 'auctor', 'page', 15, 2), +(4415, 'augue', 'page', 15, 5), +(4416, 'mauris', 'page', 15, 4), +(4417, 'neque', 'page', 15, 3), +(4418, 'gravida', 'page', 15, 2), +(4419, 'Blandit', 'page', 15, 1), +(4420, 'cras', 'page', 15, 4), +(4421, 'ornare', 'page', 15, 1), +(4422, 'arcu', 'page', 15, 4), +(4423, 'mi', 'page', 15, 2), +(4424, 'bibendum', 'page', 15, 1), +(4425, 'egestas', 'page', 15, 3), +(4426, 'Non', 'page', 15, 1), +(4427, 'lacus', 'page', 15, 1), +(4428, 'suspendisse', 'page', 15, 3), +(4429, 'interdum', 'page', 15, 1), +(4430, 'Vivamus', 'page', 15, 1), +(4431, 'dictum', 'page', 15, 1), +(4432, 'Duis', 'page', 15, 1), +(4433, 'diam', 'page', 15, 4), +(4434, 'Egestas', 'page', 15, 1), +(4435, 'congue', 'page', 15, 1), +(4436, 'quisque', 'page', 15, 2), +(4437, 'cursus', 'page', 15, 1), +(4438, 'Quis', 'page', 15, 1), +(4439, 'viverra', 'page', 15, 2), +(4440, 'nibh', 'page', 15, 2), +(4441, 'pulvinar', 'page', 15, 3), +(4442, 'Hendrerit', 'page', 15, 1), +(4443, 'rutrum', 'page', 15, 2), +(4444, 'non', 'page', 15, 6), +(4445, 'tellus', 'page', 15, 5), +(4446, 'Metus', 'page', 15, 1), +(4447, 'vulputate', 'page', 15, 2), +(4448, 'felis', 'page', 15, 1), +(4449, 'imperdiet', 'page', 15, 2), +(4450, 'proin', 'page', 15, 2), +(4451, 'Nulla', 'page', 15, 1), +(4452, 'facilisi', 'page', 15, 2), +(4453, 'tempus', 'page', 15, 1), +(4454, 'Eget', 'page', 15, 2), +(4455, 'risus', 'page', 15, 1), +(4456, 'quis', 'page', 15, 1), +(4457, 'Quisque', 'page', 15, 1), +(4458, 'ac', 'page', 15, 2), +(4459, 'nullam', 'page', 15, 2), +(4460, 'nisi', 'page', 15, 2), +(4461, 'est', 'page', 15, 3), +(4462, 'Id', 'page', 15, 1), +(4463, 'vel', 'page', 15, 2), +(4464, 'elementum', 'page', 15, 1); +INSERT INTO `search_terms` (`id`, `term`, `entity_type`, `entity_id`, `score`) VALUES +(4465, 'etiam', 'page', 15, 1), +(4466, 'Pretium', 'page', 15, 1), +(4467, 'potenti', 'page', 15, 1), +(4468, 'Aliquam', 'page', 15, 1), +(4469, 'maecenas', 'page', 15, 1), +(4470, 'ultricies', 'page', 15, 1), +(4471, 'Tellus', 'page', 15, 1), +(4472, 'tortor', 'page', 15, 1), +(4473, 'aliquam', 'page', 15, 1), +(4474, 'Facilisi', 'page', 15, 1), +(4475, 'odio', 'page', 15, 1), +(4476, 'Et', 'page', 15, 1), +(4477, 'sollicitudin', 'page', 15, 1), +(4478, 'phasellus', 'page', 15, 1), +(4479, 'Nullam', 'page', 15, 1), +(4480, 'Quam', 'page', 15, 1), +(4481, 'ante', 'page', 15, 1), +(4482, 'Nisi', 'page', 15, 1), +(4483, 'vitae', 'page', 15, 1), +(4484, 'suscipit', 'page', 15, 1), +(4485, 'Felis', 'page', 15, 1), +(4486, 'leo', 'page', 15, 1), +(4487, 'porta', 'page', 15, 1), +(4488, 'Conclusion', 'page', 15, 4), +(4489, 'I', 'page', 15, 1), +(4490, 'hope', 'page', 15, 1), +(4491, 'you', 'page', 15, 1), +(4492, 'enjoyed', 'page', 15, 1), +(4493, 'browsing', 'page', 15, 1), +(4494, 'almost', 'page', 15, 1), +(4495, 'pointless', 'page', 15, 1), +(4496, 'As', 'page', 15, 1), +(4497, 'reward', 'page', 15, 1), +(4498, 'check', 'page', 15, 1), +(4499, 'out', 'page', 15, 1), +(4500, 'sweet', 'page', 15, 1), +(4501, 'video', 'page', 15, 1), +(4502, 'Testing', 'page', 16, 40), +(4503, 'Types', 'page', 16, 40), +(4504, 'Description', 'page', 16, 1), +(4505, 'A', 'page', 16, 1), +(4506, 'list', 'page', 16, 1), +(4507, 'of', 'page', 16, 8), +(4508, 'the', 'page', 16, 7), +(4509, 'types', 'page', 16, 1), +(4510, 'testing', 'page', 16, 1), +(4511, 'utilised', 'page', 16, 1), +(4512, 'throughout', 'page', 16, 1), +(4513, 'project', 'page', 16, 1), +(4514, 'and', 'page', 16, 10), +(4515, 'their', 'page', 16, 2), +(4516, 'purposes', 'page', 16, 3), +(4517, 'An', 'page', 16, 4), +(4518, 'Example', 'page', 16, 4), +(4519, 'Document', 'page', 16, 4), +(4520, 'Welcome', 'page', 16, 1), +(4521, 'This', 'page', 16, 2), +(4522, 'is', 'page', 16, 7), +(4523, 'a', 'page', 16, 11), +(4524, 'filler', 'page', 16, 1), +(4525, 'page', 'page', 16, 1), +(4526, 'to', 'page', 16, 13), +(4527, 'show', 'page', 16, 1), +(4528, 'off', 'page', 16, 1), +(4529, 'formatting', 'page', 16, 1), +(4530, 'BookStack', 'page', 16, 1), +(4531, 'documents', 'page', 16, 1), +(4532, ' ', 'page', 16, 1), +(4533, 'All', 'page', 16, 1), +(4534, 'content', 'page', 16, 1), +(4535, 'aside', 'page', 16, 2), +(4536, 'from', 'page', 16, 2), +(4537, 'description', 'page', 16, 1), +(4538, 'at', 'page', 16, 3), +(4539, 'top', 'page', 16, 1), +(4540, 'this', 'page', 16, 3), +(4541, 'document', 'page', 16, 3), +(4542, 'unrelated', 'page', 16, 1), +(4543, 's', 'page', 16, 1), +(4544, 'actual', 'page', 16, 1), +(4545, 'should', 'page', 16, 1), +(4546, 'not', 'page', 16, 1), +(4547, 'be', 'page', 16, 4), +(4548, 'used', 'page', 16, 3), +(4549, 'demonstrative', 'page', 16, 1), +(4550, 'Further', 'page', 16, 4), +(4551, 'Content', 'page', 16, 8), +(4552, 'The', 'page', 16, 1), +(4553, 'purpose', 'page', 16, 1), +(4554, 'knowledge', 'page', 16, 2), +(4555, 'base', 'page', 16, 4), +(4556, 'act', 'page', 16, 1), +(4557, 'as', 'page', 16, 2), +(4558, 'centralized', 'page', 16, 1), +(4559, 'organized', 'page', 16, 2), +(4560, 'platform', 'page', 16, 1), +(4561, 'access', 'page', 16, 1), +(4562, 'guides', 'page', 16, 4), +(4563, 'tutorials', 'page', 16, 1), +(4564, 'troubleshooting', 'page', 16, 1), +(4565, 'information', 'page', 16, 2), +(4566, 'other', 'page', 16, 2), +(4567, 'resources', 'page', 16, 1), +(4568, 'Knowledge', 'page', 16, 3), +(4569, 'systems', 'page', 16, 3), +(4570, 'come', 'page', 16, 1), +(4571, 'in', 'page', 16, 6), +(4572, 'different', 'page', 16, 1), +(4573, 'flavors', 'page', 16, 1), +(4574, 'for', 'page', 16, 3), +(4575, 'example', 'page', 16, 1), +(4576, 'there', 'page', 16, 1), +(4577, 'may', 'page', 16, 1), +(4578, 'number', 'page', 16, 1), +(4579, 'predefined', 'page', 16, 1), +(4580, 'modules', 'page', 16, 1), +(4581, 'that', 'page', 16, 2), +(4582, 'can', 'page', 16, 3), +(4583, 'added', 'page', 16, 1), +(4584, 'removed', 'page', 16, 1), +(4585, 'developed', 'page', 16, 1), +(4586, 'an', 'page', 16, 1), +(4587, 'integrated', 'page', 16, 1), +(4588, 'manner', 'page', 16, 1), +(4589, 'with', 'page', 16, 2), +(4590, 'products', 'page', 16, 1), +(4591, 'are', 'page', 16, 1), +(4592, 'most', 'page', 16, 1), +(4593, 'frequently', 'page', 16, 1), +(4594, 'contain', 'page', 16, 1), +(4595, 'detailed', 'page', 16, 1), +(4596, 'These', 'page', 16, 1), +(4597, 'include', 'page', 16, 2), +(4598, 'solutions', 'page', 16, 1), +(4599, 'wide', 'page', 16, 1), +(4600, 'range', 'page', 16, 1), +(4601, 'technical', 'page', 16, 1), +(4602, 'problems', 'page', 16, 1), +(4603, 'but', 'page', 16, 1), +(4604, 'also', 'page', 16, 1), +(4605, 'on', 'page', 16, 1), +(4606, 'every', 'page', 16, 1), +(4607, 'aspect', 'page', 16, 1), +(4608, 'programming', 'page', 16, 1), +(4609, 'hardware', 'page', 16, 1), +(4610, 'software', 'page', 16, 2), +(4611, 'topics', 'page', 16, 1), +(4612, 'business', 'page', 16, 1), +(4613, 'concepts', 'page', 16, 1), +(4614, 'Another', 'page', 16, 1), +(4615, 'reason', 'page', 16, 1), +(4616, 'consider', 'page', 16, 1), +(4617, 'Base', 'page', 16, 1), +(4618, 'it', 'page', 16, 3), +(4619, 'often', 'page', 16, 1), +(4620, 'single', 'page', 16, 1), +(4621, 'entry', 'page', 16, 1), +(4622, 'point', 'page', 16, 1), +(4623, 'system', 'page', 16, 2), +(4624, 'very', 'page', 16, 1), +(4625, 'convenient', 'page', 16, 1), +(4626, 'feature', 'page', 16, 1), +(4627, 'remote', 'page', 16, 1), +(4628, 'clients', 'page', 16, 1), +(4629, 'who', 'page', 16, 2), +(4630, 'need', 'page', 16, 2), +(4631, 'select', 'page', 16, 1), +(4632, 'particular', 'page', 16, 2), +(4633, 'program', 'page', 16, 1), +(4634, 'download', 'page', 16, 1), +(4635, 'computer', 'page', 16, 1), +(4636, 'or', 'page', 16, 1), +(4637, 'quickly', 'page', 16, 1), +(4638, 'learn', 'page', 16, 2), +(4639, 'how', 'page', 16, 2), +(4640, 'configure', 'page', 16, 1), +(4641, 'It', 'page', 16, 1), +(4642, 'particularly', 'page', 16, 1), +(4643, 'useful', 'page', 16, 1), +(4644, 'schools', 'page', 16, 1), +(4645, 'where', 'page', 16, 1), +(4646, 'users', 'page', 16, 1), +(4647, 'easily', 'page', 16, 1), +(4648, 'about', 'page', 16, 1), +(4649, 'application', 'page', 16, 1), +(4650, 'then', 'page', 16, 1), +(4651, 'use', 'page', 16, 1), +(4652, 'without', 'page', 16, 1), +(4653, 'having', 'page', 16, 1), +(4654, 'understand', 'page', 16, 1), +(4655, 'works', 'page', 16, 1), +(4656, 'Even', 'page', 16, 4), +(4657, 'Less', 'page', 16, 4), +(4658, 'Useful', 'page', 16, 4), +(4659, 'Lorem', 'page', 16, 2), +(4660, 'ipsum', 'page', 16, 2), +(4661, 'dolor', 'page', 16, 4), +(4662, 'sit', 'page', 16, 7), +(4663, 'amet', 'page', 16, 6), +(4664, 'consectetur', 'page', 16, 4), +(4665, 'adipiscing', 'page', 16, 3), +(4666, 'elit', 'page', 16, 3), +(4667, 'sed', 'page', 16, 5), +(4668, 'do', 'page', 16, 1), +(4669, 'eiusmod', 'page', 16, 1), +(4670, 'tempor', 'page', 16, 1), +(4671, 'incididunt', 'page', 16, 1), +(4672, 'ut', 'page', 16, 4), +(4673, 'labore', 'page', 16, 1), +(4674, 'et', 'page', 16, 2), +(4675, 'dolore', 'page', 16, 1), +(4676, 'magna', 'page', 16, 1), +(4677, 'aliqua', 'page', 16, 1), +(4678, 'Pellentesque', 'page', 16, 1), +(4679, 'porttitor', 'page', 16, 3), +(4680, 'eget', 'page', 16, 3), +(4681, 'morbi', 'page', 16, 5), +(4682, 'Nunc', 'page', 16, 1), +(4683, 'velit', 'page', 16, 1), +(4684, 'dignissim', 'page', 16, 3), +(4685, 'sodales', 'page', 16, 1), +(4686, 'eu', 'page', 16, 5), +(4687, 'sem', 'page', 16, 1), +(4688, 'integer', 'page', 16, 1), +(4689, 'Gravida', 'page', 16, 1), +(4690, 'cum', 'page', 16, 1), +(4691, 'sociis', 'page', 16, 1), +(4692, 'natoque', 'page', 16, 1), +(4693, 'penatibus', 'page', 16, 1), +(4694, 'magnis', 'page', 16, 1), +(4695, 'dis', 'page', 16, 1), +(4696, 'Proin', 'page', 16, 1), +(4697, 'libero', 'page', 16, 2), +(4698, 'enim', 'page', 16, 4), +(4699, 'faucibus', 'page', 16, 3), +(4700, 'turpis', 'page', 16, 1), +(4701, 'In', 'page', 16, 2), +(4702, 'fermentum', 'page', 16, 5), +(4703, 'posuere', 'page', 16, 2), +(4704, 'urna', 'page', 16, 3), +(4705, 'nec', 'page', 16, 1), +(4706, 'tincidunt', 'page', 16, 2), +(4707, 'praesent', 'page', 16, 1), +(4708, 'semper', 'page', 16, 1), +(4709, 'Varius', 'page', 16, 1), +(4710, 'duis', 'page', 16, 2), +(4711, 'lorem', 'page', 16, 2), +(4712, 'Placerat', 'page', 16, 1), +(4713, 'orci', 'page', 16, 4), +(4714, 'nulla', 'page', 16, 4), +(4715, 'pellentesque', 'page', 16, 2), +(4716, 'venenatis', 'page', 16, 1), +(4717, 'Integer', 'page', 16, 2), +(4718, 'feugiat', 'page', 16, 2), +(4719, 'scelerisque', 'page', 16, 3), +(4720, 'varius', 'page', 16, 4), +(4721, 'nunc', 'page', 16, 2), +(4722, 'Diam', 'page', 16, 1), +(4723, 'quam', 'page', 16, 5), +(4724, 'massa', 'page', 16, 2), +(4725, 'Dolor', 'page', 16, 1), +(4726, 'Tempus', 'page', 16, 1), +(4727, 'iaculis', 'page', 16, 2), +(4728, 'id', 'page', 16, 3), +(4729, 'volutpat', 'page', 16, 2), +(4730, 'Ac', 'page', 16, 1), +(4731, 'auctor', 'page', 16, 2), +(4732, 'augue', 'page', 16, 5), +(4733, 'mauris', 'page', 16, 4), +(4734, 'neque', 'page', 16, 3), +(4735, 'gravida', 'page', 16, 2), +(4736, 'Blandit', 'page', 16, 1), +(4737, 'cras', 'page', 16, 4), +(4738, 'ornare', 'page', 16, 1), +(4739, 'arcu', 'page', 16, 4), +(4740, 'mi', 'page', 16, 2), +(4741, 'bibendum', 'page', 16, 1), +(4742, 'egestas', 'page', 16, 3), +(4743, 'Non', 'page', 16, 1), +(4744, 'lacus', 'page', 16, 1), +(4745, 'suspendisse', 'page', 16, 3), +(4746, 'interdum', 'page', 16, 1), +(4747, 'Vivamus', 'page', 16, 1), +(4748, 'dictum', 'page', 16, 1), +(4749, 'Duis', 'page', 16, 1), +(4750, 'diam', 'page', 16, 4), +(4751, 'Egestas', 'page', 16, 1), +(4752, 'congue', 'page', 16, 1), +(4753, 'quisque', 'page', 16, 2), +(4754, 'cursus', 'page', 16, 1), +(4755, 'Quis', 'page', 16, 1), +(4756, 'viverra', 'page', 16, 2), +(4757, 'nibh', 'page', 16, 2), +(4758, 'pulvinar', 'page', 16, 3), +(4759, 'Hendrerit', 'page', 16, 1), +(4760, 'rutrum', 'page', 16, 2), +(4761, 'non', 'page', 16, 6), +(4762, 'tellus', 'page', 16, 5), +(4763, 'Metus', 'page', 16, 1), +(4764, 'vulputate', 'page', 16, 2), +(4765, 'felis', 'page', 16, 1), +(4766, 'imperdiet', 'page', 16, 2), +(4767, 'proin', 'page', 16, 2), +(4768, 'Nulla', 'page', 16, 1), +(4769, 'facilisi', 'page', 16, 2), +(4770, 'tempus', 'page', 16, 1), +(4771, 'Eget', 'page', 16, 2), +(4772, 'risus', 'page', 16, 1), +(4773, 'quis', 'page', 16, 1), +(4774, 'Quisque', 'page', 16, 1), +(4775, 'ac', 'page', 16, 2), +(4776, 'nullam', 'page', 16, 2), +(4777, 'nisi', 'page', 16, 2), +(4778, 'est', 'page', 16, 3), +(4779, 'Id', 'page', 16, 1), +(4780, 'vel', 'page', 16, 2), +(4781, 'elementum', 'page', 16, 1), +(4782, 'etiam', 'page', 16, 1), +(4783, 'Pretium', 'page', 16, 1), +(4784, 'potenti', 'page', 16, 1), +(4785, 'Aliquam', 'page', 16, 1), +(4786, 'maecenas', 'page', 16, 1), +(4787, 'ultricies', 'page', 16, 1), +(4788, 'Tellus', 'page', 16, 1), +(4789, 'tortor', 'page', 16, 1), +(4790, 'aliquam', 'page', 16, 1), +(4791, 'Facilisi', 'page', 16, 1), +(4792, 'odio', 'page', 16, 1), +(4793, 'Et', 'page', 16, 1), +(4794, 'sollicitudin', 'page', 16, 1), +(4795, 'phasellus', 'page', 16, 1), +(4796, 'Nullam', 'page', 16, 1), +(4797, 'Quam', 'page', 16, 1), +(4798, 'ante', 'page', 16, 1), +(4799, 'Nisi', 'page', 16, 1), +(4800, 'vitae', 'page', 16, 1), +(4801, 'suscipit', 'page', 16, 1), +(4802, 'Felis', 'page', 16, 1), +(4803, 'leo', 'page', 16, 1), +(4804, 'porta', 'page', 16, 1), +(4805, 'Conclusion', 'page', 16, 4), +(4806, 'I', 'page', 16, 1), +(4807, 'hope', 'page', 16, 1), +(4808, 'you', 'page', 16, 1), +(4809, 'enjoyed', 'page', 16, 1), +(4810, 'browsing', 'page', 16, 1), +(4811, 'almost', 'page', 16, 1), +(4812, 'pointless', 'page', 16, 1), +(4813, 'As', 'page', 16, 1), +(4814, 'reward', 'page', 16, 1), +(4815, 'check', 'page', 16, 1), +(4816, 'out', 'page', 16, 1), +(4817, 'sweet', 'page', 16, 1), +(4818, 'video', 'page', 16, 1), +(4819, 'Research', 'book', 9, 49), +(4820, 'conducted', 'book', 9, 1), +(4821, 'for', 'book', 9, 1), +(4822, 'the', 'book', 9, 1), +(4823, 'testing', 'book', 9, 1), +(4824, 'project', 'book', 9, 1), +(4825, 'Further', 'page', 17, 44), +(4826, 'Testing', 'page', 17, 40), +(4827, 'Description', 'page', 17, 1), +(4828, 'Various', 'page', 17, 1), +(4829, 'proposal', 'page', 17, 1), +(4830, 'areas', 'page', 17, 1), +(4831, 'of', 'page', 17, 7), +(4832, 'research', 'page', 17, 1), +(4833, 'that', 'page', 17, 3), +(4834, 'could', 'page', 17, 1), +(4835, 'benefit', 'page', 17, 1), +(4836, 'the', 'page', 17, 6), +(4837, 'testing', 'page', 17, 1), +(4838, 'project', 'page', 17, 1), +(4839, 'with', 'page', 17, 3), +(4840, 'some', 'page', 17, 1), +(4841, 'further', 'page', 17, 1), +(4842, 'exploration', 'page', 17, 1), +(4843, 'An', 'page', 17, 4), +(4844, 'Example', 'page', 17, 4), +(4845, 'Document', 'page', 17, 4), +(4846, 'Welcome', 'page', 17, 1), +(4847, 'This', 'page', 17, 2), +(4848, 'is', 'page', 17, 7), +(4849, 'a', 'page', 17, 11), +(4850, 'filler', 'page', 17, 1), +(4851, 'page', 'page', 17, 1), +(4852, 'to', 'page', 17, 13), +(4853, 'show', 'page', 17, 1), +(4854, 'off', 'page', 17, 1), +(4855, 'formatting', 'page', 17, 1), +(4856, 'BookStack', 'page', 17, 1), +(4857, 'documents', 'page', 17, 1), +(4858, ' ', 'page', 17, 1), +(4859, 'All', 'page', 17, 1), +(4860, 'content', 'page', 17, 1), +(4861, 'aside', 'page', 17, 2), +(4862, 'from', 'page', 17, 2), +(4863, 'description', 'page', 17, 1), +(4864, 'at', 'page', 17, 3), +(4865, 'top', 'page', 17, 1), +(4866, 'this', 'page', 17, 3), +(4867, 'document', 'page', 17, 3), +(4868, 'unrelated', 'page', 17, 1), +(4869, 's', 'page', 17, 1), +(4870, 'actual', 'page', 17, 1), +(4871, 'purposes', 'page', 17, 2), +(4872, 'and', 'page', 17, 9), +(4873, 'should', 'page', 17, 1), +(4874, 'not', 'page', 17, 1), +(4875, 'be', 'page', 17, 4), +(4876, 'used', 'page', 17, 3), +(4877, 'demonstrative', 'page', 17, 1), +(4878, 'Content', 'page', 17, 8), +(4879, 'The', 'page', 17, 1), +(4880, 'purpose', 'page', 17, 1), +(4881, 'knowledge', 'page', 17, 2), +(4882, 'base', 'page', 17, 4), +(4883, 'act', 'page', 17, 1), +(4884, 'as', 'page', 17, 2), +(4885, 'centralized', 'page', 17, 1), +(4886, 'organized', 'page', 17, 2), +(4887, 'platform', 'page', 17, 1), +(4888, 'access', 'page', 17, 1), +(4889, 'guides', 'page', 17, 4), +(4890, 'tutorials', 'page', 17, 1), +(4891, 'troubleshooting', 'page', 17, 1), +(4892, 'information', 'page', 17, 2), +(4893, 'other', 'page', 17, 2), +(4894, 'resources', 'page', 17, 1), +(4895, 'Knowledge', 'page', 17, 3), +(4896, 'systems', 'page', 17, 3), +(4897, 'come', 'page', 17, 1), +(4898, 'in', 'page', 17, 6), +(4899, 'different', 'page', 17, 1), +(4900, 'flavors', 'page', 17, 1), +(4901, 'for', 'page', 17, 3), +(4902, 'example', 'page', 17, 1), +(4903, 'there', 'page', 17, 1), +(4904, 'may', 'page', 17, 1), +(4905, 'number', 'page', 17, 1), +(4906, 'predefined', 'page', 17, 1), +(4907, 'modules', 'page', 17, 1), +(4908, 'can', 'page', 17, 3), +(4909, 'added', 'page', 17, 1), +(4910, 'removed', 'page', 17, 1), +(4911, 'developed', 'page', 17, 1), +(4912, 'an', 'page', 17, 1), +(4913, 'integrated', 'page', 17, 1), +(4914, 'manner', 'page', 17, 1), +(4915, 'products', 'page', 17, 1), +(4916, 'are', 'page', 17, 1), +(4917, 'most', 'page', 17, 1), +(4918, 'frequently', 'page', 17, 1), +(4919, 'contain', 'page', 17, 1), +(4920, 'detailed', 'page', 17, 1), +(4921, 'These', 'page', 17, 1), +(4922, 'include', 'page', 17, 2), +(4923, 'solutions', 'page', 17, 1), +(4924, 'wide', 'page', 17, 1), +(4925, 'range', 'page', 17, 1), +(4926, 'technical', 'page', 17, 1), +(4927, 'problems', 'page', 17, 1), +(4928, 'but', 'page', 17, 1), +(4929, 'also', 'page', 17, 1), +(4930, 'on', 'page', 17, 1), +(4931, 'every', 'page', 17, 1), +(4932, 'aspect', 'page', 17, 1), +(4933, 'programming', 'page', 17, 1), +(4934, 'hardware', 'page', 17, 1), +(4935, 'software', 'page', 17, 2), +(4936, 'topics', 'page', 17, 1), +(4937, 'business', 'page', 17, 1), +(4938, 'concepts', 'page', 17, 1), +(4939, 'Another', 'page', 17, 1), +(4940, 'reason', 'page', 17, 1), +(4941, 'consider', 'page', 17, 1), +(4942, 'Base', 'page', 17, 1), +(4943, 'it', 'page', 17, 3), +(4944, 'often', 'page', 17, 1), +(4945, 'single', 'page', 17, 1), +(4946, 'entry', 'page', 17, 1), +(4947, 'point', 'page', 17, 1), +(4948, 'system', 'page', 17, 2), +(4949, 'very', 'page', 17, 1), +(4950, 'convenient', 'page', 17, 1), +(4951, 'feature', 'page', 17, 1), +(4952, 'remote', 'page', 17, 1), +(4953, 'clients', 'page', 17, 1), +(4954, 'who', 'page', 17, 2), +(4955, 'need', 'page', 17, 2), +(4956, 'select', 'page', 17, 1), +(4957, 'particular', 'page', 17, 2), +(4958, 'program', 'page', 17, 1), +(4959, 'download', 'page', 17, 1), +(4960, 'their', 'page', 17, 1), +(4961, 'computer', 'page', 17, 1), +(4962, 'or', 'page', 17, 1), +(4963, 'quickly', 'page', 17, 1), +(4964, 'learn', 'page', 17, 2), +(4965, 'how', 'page', 17, 2), +(4966, 'configure', 'page', 17, 1), +(4967, 'It', 'page', 17, 1), +(4968, 'particularly', 'page', 17, 1), +(4969, 'useful', 'page', 17, 1), +(4970, 'schools', 'page', 17, 1), +(4971, 'where', 'page', 17, 1), +(4972, 'users', 'page', 17, 1), +(4973, 'easily', 'page', 17, 1), +(4974, 'about', 'page', 17, 1), +(4975, 'application', 'page', 17, 1), +(4976, 'then', 'page', 17, 1), +(4977, 'use', 'page', 17, 1), +(4978, 'without', 'page', 17, 1), +(4979, 'having', 'page', 17, 1), +(4980, 'understand', 'page', 17, 1), +(4981, 'works', 'page', 17, 1), +(4982, 'Even', 'page', 17, 4), +(4983, 'Less', 'page', 17, 4), +(4984, 'Useful', 'page', 17, 4), +(4985, 'Lorem', 'page', 17, 2), +(4986, 'ipsum', 'page', 17, 2), +(4987, 'dolor', 'page', 17, 4), +(4988, 'sit', 'page', 17, 7), +(4989, 'amet', 'page', 17, 6), +(4990, 'consectetur', 'page', 17, 4), +(4991, 'adipiscing', 'page', 17, 3), +(4992, 'elit', 'page', 17, 3), +(4993, 'sed', 'page', 17, 5), +(4994, 'do', 'page', 17, 1), +(4995, 'eiusmod', 'page', 17, 1), +(4996, 'tempor', 'page', 17, 1), +(4997, 'incididunt', 'page', 17, 1), +(4998, 'ut', 'page', 17, 4), +(4999, 'labore', 'page', 17, 1), +(5000, 'et', 'page', 17, 2), +(5001, 'dolore', 'page', 17, 1), +(5002, 'magna', 'page', 17, 1), +(5003, 'aliqua', 'page', 17, 1), +(5004, 'Pellentesque', 'page', 17, 1), +(5005, 'porttitor', 'page', 17, 3), +(5006, 'eget', 'page', 17, 3), +(5007, 'morbi', 'page', 17, 5), +(5008, 'Nunc', 'page', 17, 1), +(5009, 'velit', 'page', 17, 1), +(5010, 'dignissim', 'page', 17, 3), +(5011, 'sodales', 'page', 17, 1), +(5012, 'eu', 'page', 17, 5), +(5013, 'sem', 'page', 17, 1), +(5014, 'integer', 'page', 17, 1), +(5015, 'Gravida', 'page', 17, 1), +(5016, 'cum', 'page', 17, 1), +(5017, 'sociis', 'page', 17, 1), +(5018, 'natoque', 'page', 17, 1), +(5019, 'penatibus', 'page', 17, 1), +(5020, 'magnis', 'page', 17, 1), +(5021, 'dis', 'page', 17, 1), +(5022, 'Proin', 'page', 17, 1), +(5023, 'libero', 'page', 17, 2), +(5024, 'enim', 'page', 17, 4), +(5025, 'faucibus', 'page', 17, 3), +(5026, 'turpis', 'page', 17, 1), +(5027, 'In', 'page', 17, 2), +(5028, 'fermentum', 'page', 17, 5), +(5029, 'posuere', 'page', 17, 2), +(5030, 'urna', 'page', 17, 3), +(5031, 'nec', 'page', 17, 1), +(5032, 'tincidunt', 'page', 17, 2), +(5033, 'praesent', 'page', 17, 1), +(5034, 'semper', 'page', 17, 1), +(5035, 'Varius', 'page', 17, 1), +(5036, 'duis', 'page', 17, 2), +(5037, 'lorem', 'page', 17, 2), +(5038, 'Placerat', 'page', 17, 1), +(5039, 'orci', 'page', 17, 4), +(5040, 'nulla', 'page', 17, 4), +(5041, 'pellentesque', 'page', 17, 2), +(5042, 'venenatis', 'page', 17, 1), +(5043, 'Integer', 'page', 17, 2), +(5044, 'feugiat', 'page', 17, 2), +(5045, 'scelerisque', 'page', 17, 3), +(5046, 'varius', 'page', 17, 4), +(5047, 'nunc', 'page', 17, 2), +(5048, 'Diam', 'page', 17, 1), +(5049, 'quam', 'page', 17, 5), +(5050, 'massa', 'page', 17, 2), +(5051, 'Dolor', 'page', 17, 1), +(5052, 'Tempus', 'page', 17, 1), +(5053, 'iaculis', 'page', 17, 2), +(5054, 'id', 'page', 17, 3), +(5055, 'volutpat', 'page', 17, 2), +(5056, 'Ac', 'page', 17, 1), +(5057, 'auctor', 'page', 17, 2), +(5058, 'augue', 'page', 17, 5), +(5059, 'mauris', 'page', 17, 4), +(5060, 'neque', 'page', 17, 3), +(5061, 'gravida', 'page', 17, 2), +(5062, 'Blandit', 'page', 17, 1), +(5063, 'cras', 'page', 17, 4), +(5064, 'ornare', 'page', 17, 1), +(5065, 'arcu', 'page', 17, 4), +(5066, 'mi', 'page', 17, 2), +(5067, 'bibendum', 'page', 17, 1), +(5068, 'egestas', 'page', 17, 3), +(5069, 'Non', 'page', 17, 1), +(5070, 'lacus', 'page', 17, 1), +(5071, 'suspendisse', 'page', 17, 3), +(5072, 'interdum', 'page', 17, 1), +(5073, 'Vivamus', 'page', 17, 1), +(5074, 'dictum', 'page', 17, 1), +(5075, 'Duis', 'page', 17, 1), +(5076, 'diam', 'page', 17, 4), +(5077, 'Egestas', 'page', 17, 1), +(5078, 'congue', 'page', 17, 1), +(5079, 'quisque', 'page', 17, 2), +(5080, 'cursus', 'page', 17, 1), +(5081, 'Quis', 'page', 17, 1), +(5082, 'viverra', 'page', 17, 2), +(5083, 'nibh', 'page', 17, 2), +(5084, 'pulvinar', 'page', 17, 3), +(5085, 'Hendrerit', 'page', 17, 1), +(5086, 'rutrum', 'page', 17, 2), +(5087, 'non', 'page', 17, 6), +(5088, 'tellus', 'page', 17, 5), +(5089, 'Metus', 'page', 17, 1), +(5090, 'vulputate', 'page', 17, 2), +(5091, 'felis', 'page', 17, 1), +(5092, 'imperdiet', 'page', 17, 2), +(5093, 'proin', 'page', 17, 2), +(5094, 'Nulla', 'page', 17, 1), +(5095, 'facilisi', 'page', 17, 2), +(5096, 'tempus', 'page', 17, 1), +(5097, 'Eget', 'page', 17, 2), +(5098, 'risus', 'page', 17, 1), +(5099, 'quis', 'page', 17, 1), +(5100, 'Quisque', 'page', 17, 1), +(5101, 'ac', 'page', 17, 2), +(5102, 'nullam', 'page', 17, 2), +(5103, 'nisi', 'page', 17, 2), +(5104, 'est', 'page', 17, 3), +(5105, 'Id', 'page', 17, 1), +(5106, 'vel', 'page', 17, 2), +(5107, 'elementum', 'page', 17, 1), +(5108, 'etiam', 'page', 17, 1), +(5109, 'Pretium', 'page', 17, 1), +(5110, 'potenti', 'page', 17, 1), +(5111, 'Aliquam', 'page', 17, 1), +(5112, 'maecenas', 'page', 17, 1), +(5113, 'ultricies', 'page', 17, 1), +(5114, 'Tellus', 'page', 17, 1), +(5115, 'tortor', 'page', 17, 1), +(5116, 'aliquam', 'page', 17, 1), +(5117, 'Facilisi', 'page', 17, 1), +(5118, 'odio', 'page', 17, 1), +(5119, 'Et', 'page', 17, 1), +(5120, 'sollicitudin', 'page', 17, 1), +(5121, 'phasellus', 'page', 17, 1), +(5122, 'Nullam', 'page', 17, 1), +(5123, 'Quam', 'page', 17, 1), +(5124, 'ante', 'page', 17, 1), +(5125, 'Nisi', 'page', 17, 1), +(5126, 'vitae', 'page', 17, 1), +(5127, 'suscipit', 'page', 17, 1), +(5128, 'Felis', 'page', 17, 1), +(5129, 'leo', 'page', 17, 1), +(5130, 'porta', 'page', 17, 1), +(5131, 'Conclusion', 'page', 17, 4), +(5132, 'I', 'page', 17, 1), +(5133, 'hope', 'page', 17, 1), +(5134, 'you', 'page', 17, 1), +(5135, 'enjoyed', 'page', 17, 1), +(5136, 'browsing', 'page', 17, 1), +(5137, 'almost', 'page', 17, 1), +(5138, 'pointless', 'page', 17, 1), +(5139, 'As', 'page', 17, 1), +(5140, 'reward', 'page', 17, 1), +(5141, 'check', 'page', 17, 1), +(5142, 'out', 'page', 17, 1), +(5143, 'sweet', 'page', 17, 1), +(5144, 'video', 'page', 17, 1), +(5145, 'Archival', 'page', 18, 40), +(5146, 'Research', 'page', 18, 40), +(5147, 'Description', 'page', 18, 1), +(5148, 'Prior', 'page', 18, 1), +(5149, 'research', 'page', 18, 1), +(5150, 'that', 'page', 18, 3), +(5151, 'details', 'page', 18, 1), +(5152, 'the', 'page', 18, 7), +(5153, 'decision-making', 'page', 18, 1), +(5154, 'process', 'page', 18, 1), +(5155, 'and', 'page', 18, 10), +(5156, 'resources', 'page', 18, 2), +(5157, 'utilized', 'page', 18, 1), +(5158, 'throughout', 'page', 18, 1), +(5159, 'testing', 'page', 18, 1), +(5160, 'project', 'page', 18, 1), +(5161, 's', 'page', 18, 2), +(5162, 'lifespan', 'page', 18, 1), +(5163, 'An', 'page', 18, 4), +(5164, 'Example', 'page', 18, 4), +(5165, 'Document', 'page', 18, 4), +(5166, 'Welcome', 'page', 18, 1), +(5167, 'This', 'page', 18, 2), +(5168, 'is', 'page', 18, 7), +(5169, 'a', 'page', 18, 11), +(5170, 'filler', 'page', 18, 1), +(5171, 'page', 'page', 18, 1), +(5172, 'to', 'page', 18, 13), +(5173, 'show', 'page', 18, 1), +(5174, 'off', 'page', 18, 1), +(5175, 'formatting', 'page', 18, 1), +(5176, 'of', 'page', 18, 6), +(5177, 'BookStack', 'page', 18, 1), +(5178, 'documents', 'page', 18, 1), +(5179, ' ', 'page', 18, 1), +(5180, 'All', 'page', 18, 1), +(5181, 'content', 'page', 18, 1), +(5182, 'aside', 'page', 18, 2), +(5183, 'from', 'page', 18, 2), +(5184, 'description', 'page', 18, 1), +(5185, 'at', 'page', 18, 3), +(5186, 'top', 'page', 18, 1), +(5187, 'this', 'page', 18, 3), +(5188, 'document', 'page', 18, 3), +(5189, 'unrelated', 'page', 18, 1), +(5190, 'actual', 'page', 18, 1), +(5191, 'purposes', 'page', 18, 2), +(5192, 'should', 'page', 18, 1), +(5193, 'not', 'page', 18, 1), +(5194, 'be', 'page', 18, 4), +(5195, 'used', 'page', 18, 3), +(5196, 'demonstrative', 'page', 18, 1), +(5197, 'Further', 'page', 18, 4), +(5198, 'Content', 'page', 18, 8), +(5199, 'The', 'page', 18, 1), +(5200, 'purpose', 'page', 18, 1), +(5201, 'knowledge', 'page', 18, 2), +(5202, 'base', 'page', 18, 4), +(5203, 'act', 'page', 18, 1), +(5204, 'as', 'page', 18, 2), +(5205, 'centralized', 'page', 18, 1), +(5206, 'organized', 'page', 18, 2), +(5207, 'platform', 'page', 18, 1), +(5208, 'access', 'page', 18, 1), +(5209, 'guides', 'page', 18, 4), +(5210, 'tutorials', 'page', 18, 1), +(5211, 'troubleshooting', 'page', 18, 1), +(5212, 'information', 'page', 18, 2), +(5213, 'other', 'page', 18, 2), +(5214, 'Knowledge', 'page', 18, 3), +(5215, 'systems', 'page', 18, 3), +(5216, 'come', 'page', 18, 1), +(5217, 'in', 'page', 18, 6), +(5218, 'different', 'page', 18, 1), +(5219, 'flavors', 'page', 18, 1), +(5220, 'for', 'page', 18, 3), +(5221, 'example', 'page', 18, 1), +(5222, 'there', 'page', 18, 1), +(5223, 'may', 'page', 18, 1), +(5224, 'number', 'page', 18, 1), +(5225, 'predefined', 'page', 18, 1), +(5226, 'modules', 'page', 18, 1), +(5227, 'can', 'page', 18, 3), +(5228, 'added', 'page', 18, 1), +(5229, 'removed', 'page', 18, 1), +(5230, 'developed', 'page', 18, 1), +(5231, 'an', 'page', 18, 1), +(5232, 'integrated', 'page', 18, 1), +(5233, 'manner', 'page', 18, 1), +(5234, 'with', 'page', 18, 2), +(5235, 'products', 'page', 18, 1), +(5236, 'are', 'page', 18, 1), +(5237, 'most', 'page', 18, 1), +(5238, 'frequently', 'page', 18, 1), +(5239, 'contain', 'page', 18, 1), +(5240, 'detailed', 'page', 18, 1), +(5241, 'These', 'page', 18, 1), +(5242, 'include', 'page', 18, 2), +(5243, 'solutions', 'page', 18, 1), +(5244, 'wide', 'page', 18, 1), +(5245, 'range', 'page', 18, 1), +(5246, 'technical', 'page', 18, 1), +(5247, 'problems', 'page', 18, 1), +(5248, 'but', 'page', 18, 1), +(5249, 'also', 'page', 18, 1), +(5250, 'on', 'page', 18, 1), +(5251, 'every', 'page', 18, 1), +(5252, 'aspect', 'page', 18, 1), +(5253, 'programming', 'page', 18, 1), +(5254, 'hardware', 'page', 18, 1), +(5255, 'software', 'page', 18, 2), +(5256, 'topics', 'page', 18, 1), +(5257, 'business', 'page', 18, 1), +(5258, 'concepts', 'page', 18, 1), +(5259, 'Another', 'page', 18, 1), +(5260, 'reason', 'page', 18, 1), +(5261, 'consider', 'page', 18, 1), +(5262, 'Base', 'page', 18, 1), +(5263, 'it', 'page', 18, 3), +(5264, 'often', 'page', 18, 1), +(5265, 'single', 'page', 18, 1), +(5266, 'entry', 'page', 18, 1), +(5267, 'point', 'page', 18, 1), +(5268, 'system', 'page', 18, 2), +(5269, 'very', 'page', 18, 1), +(5270, 'convenient', 'page', 18, 1), +(5271, 'feature', 'page', 18, 1), +(5272, 'remote', 'page', 18, 1), +(5273, 'clients', 'page', 18, 1), +(5274, 'who', 'page', 18, 2), +(5275, 'need', 'page', 18, 2), +(5276, 'select', 'page', 18, 1), +(5277, 'particular', 'page', 18, 2), +(5278, 'program', 'page', 18, 1), +(5279, 'download', 'page', 18, 1), +(5280, 'their', 'page', 18, 1), +(5281, 'computer', 'page', 18, 1), +(5282, 'or', 'page', 18, 1), +(5283, 'quickly', 'page', 18, 1), +(5284, 'learn', 'page', 18, 2), +(5285, 'how', 'page', 18, 2), +(5286, 'configure', 'page', 18, 1), +(5287, 'It', 'page', 18, 1), +(5288, 'particularly', 'page', 18, 1), +(5289, 'useful', 'page', 18, 1), +(5290, 'schools', 'page', 18, 1), +(5291, 'where', 'page', 18, 1), +(5292, 'users', 'page', 18, 1), +(5293, 'easily', 'page', 18, 1), +(5294, 'about', 'page', 18, 1), +(5295, 'application', 'page', 18, 1), +(5296, 'then', 'page', 18, 1), +(5297, 'use', 'page', 18, 1), +(5298, 'without', 'page', 18, 1), +(5299, 'having', 'page', 18, 1), +(5300, 'understand', 'page', 18, 1), +(5301, 'works', 'page', 18, 1), +(5302, 'Even', 'page', 18, 4), +(5303, 'Less', 'page', 18, 4), +(5304, 'Useful', 'page', 18, 4), +(5305, 'Lorem', 'page', 18, 2), +(5306, 'ipsum', 'page', 18, 2), +(5307, 'dolor', 'page', 18, 4), +(5308, 'sit', 'page', 18, 7), +(5309, 'amet', 'page', 18, 6), +(5310, 'consectetur', 'page', 18, 4), +(5311, 'adipiscing', 'page', 18, 3), +(5312, 'elit', 'page', 18, 3), +(5313, 'sed', 'page', 18, 5), +(5314, 'do', 'page', 18, 1), +(5315, 'eiusmod', 'page', 18, 1), +(5316, 'tempor', 'page', 18, 1), +(5317, 'incididunt', 'page', 18, 1), +(5318, 'ut', 'page', 18, 4), +(5319, 'labore', 'page', 18, 1), +(5320, 'et', 'page', 18, 2), +(5321, 'dolore', 'page', 18, 1), +(5322, 'magna', 'page', 18, 1), +(5323, 'aliqua', 'page', 18, 1), +(5324, 'Pellentesque', 'page', 18, 1), +(5325, 'porttitor', 'page', 18, 3), +(5326, 'eget', 'page', 18, 3), +(5327, 'morbi', 'page', 18, 5), +(5328, 'Nunc', 'page', 18, 1), +(5329, 'velit', 'page', 18, 1), +(5330, 'dignissim', 'page', 18, 3), +(5331, 'sodales', 'page', 18, 1), +(5332, 'eu', 'page', 18, 5), +(5333, 'sem', 'page', 18, 1), +(5334, 'integer', 'page', 18, 1), +(5335, 'Gravida', 'page', 18, 1), +(5336, 'cum', 'page', 18, 1), +(5337, 'sociis', 'page', 18, 1), +(5338, 'natoque', 'page', 18, 1), +(5339, 'penatibus', 'page', 18, 1), +(5340, 'magnis', 'page', 18, 1), +(5341, 'dis', 'page', 18, 1), +(5342, 'Proin', 'page', 18, 1), +(5343, 'libero', 'page', 18, 2), +(5344, 'enim', 'page', 18, 4), +(5345, 'faucibus', 'page', 18, 3), +(5346, 'turpis', 'page', 18, 1), +(5347, 'In', 'page', 18, 2), +(5348, 'fermentum', 'page', 18, 5), +(5349, 'posuere', 'page', 18, 2), +(5350, 'urna', 'page', 18, 3), +(5351, 'nec', 'page', 18, 1), +(5352, 'tincidunt', 'page', 18, 2), +(5353, 'praesent', 'page', 18, 1), +(5354, 'semper', 'page', 18, 1), +(5355, 'Varius', 'page', 18, 1), +(5356, 'duis', 'page', 18, 2), +(5357, 'lorem', 'page', 18, 2), +(5358, 'Placerat', 'page', 18, 1), +(5359, 'orci', 'page', 18, 4), +(5360, 'nulla', 'page', 18, 4), +(5361, 'pellentesque', 'page', 18, 2), +(5362, 'venenatis', 'page', 18, 1), +(5363, 'Integer', 'page', 18, 2), +(5364, 'feugiat', 'page', 18, 2), +(5365, 'scelerisque', 'page', 18, 3), +(5366, 'varius', 'page', 18, 4), +(5367, 'nunc', 'page', 18, 2), +(5368, 'Diam', 'page', 18, 1), +(5369, 'quam', 'page', 18, 5), +(5370, 'massa', 'page', 18, 2), +(5371, 'Dolor', 'page', 18, 1), +(5372, 'Tempus', 'page', 18, 1), +(5373, 'iaculis', 'page', 18, 2), +(5374, 'id', 'page', 18, 3), +(5375, 'volutpat', 'page', 18, 2), +(5376, 'Ac', 'page', 18, 1), +(5377, 'auctor', 'page', 18, 2), +(5378, 'augue', 'page', 18, 5), +(5379, 'mauris', 'page', 18, 4), +(5380, 'neque', 'page', 18, 3), +(5381, 'gravida', 'page', 18, 2), +(5382, 'Blandit', 'page', 18, 1), +(5383, 'cras', 'page', 18, 4), +(5384, 'ornare', 'page', 18, 1), +(5385, 'arcu', 'page', 18, 4), +(5386, 'mi', 'page', 18, 2), +(5387, 'bibendum', 'page', 18, 1), +(5388, 'egestas', 'page', 18, 3), +(5389, 'Non', 'page', 18, 1), +(5390, 'lacus', 'page', 18, 1), +(5391, 'suspendisse', 'page', 18, 3), +(5392, 'interdum', 'page', 18, 1), +(5393, 'Vivamus', 'page', 18, 1), +(5394, 'dictum', 'page', 18, 1), +(5395, 'Duis', 'page', 18, 1), +(5396, 'diam', 'page', 18, 4), +(5397, 'Egestas', 'page', 18, 1), +(5398, 'congue', 'page', 18, 1), +(5399, 'quisque', 'page', 18, 2), +(5400, 'cursus', 'page', 18, 1), +(5401, 'Quis', 'page', 18, 1), +(5402, 'viverra', 'page', 18, 2), +(5403, 'nibh', 'page', 18, 2), +(5404, 'pulvinar', 'page', 18, 3), +(5405, 'Hendrerit', 'page', 18, 1), +(5406, 'rutrum', 'page', 18, 2), +(5407, 'non', 'page', 18, 6), +(5408, 'tellus', 'page', 18, 5), +(5409, 'Metus', 'page', 18, 1), +(5410, 'vulputate', 'page', 18, 2), +(5411, 'felis', 'page', 18, 1), +(5412, 'imperdiet', 'page', 18, 2), +(5413, 'proin', 'page', 18, 2), +(5414, 'Nulla', 'page', 18, 1), +(5415, 'facilisi', 'page', 18, 2), +(5416, 'tempus', 'page', 18, 1), +(5417, 'Eget', 'page', 18, 2), +(5418, 'risus', 'page', 18, 1), +(5419, 'quis', 'page', 18, 1), +(5420, 'Quisque', 'page', 18, 1), +(5421, 'ac', 'page', 18, 2), +(5422, 'nullam', 'page', 18, 2), +(5423, 'nisi', 'page', 18, 2), +(5424, 'est', 'page', 18, 3), +(5425, 'Id', 'page', 18, 1), +(5426, 'vel', 'page', 18, 2), +(5427, 'elementum', 'page', 18, 1), +(5428, 'etiam', 'page', 18, 1), +(5429, 'Pretium', 'page', 18, 1), +(5430, 'potenti', 'page', 18, 1), +(5431, 'Aliquam', 'page', 18, 1), +(5432, 'maecenas', 'page', 18, 1), +(5433, 'ultricies', 'page', 18, 1), +(5434, 'Tellus', 'page', 18, 1), +(5435, 'tortor', 'page', 18, 1), +(5436, 'aliquam', 'page', 18, 1), +(5437, 'Facilisi', 'page', 18, 1), +(5438, 'odio', 'page', 18, 1), +(5439, 'Et', 'page', 18, 1), +(5440, 'sollicitudin', 'page', 18, 1), +(5441, 'phasellus', 'page', 18, 1), +(5442, 'Nullam', 'page', 18, 1), +(5443, 'Quam', 'page', 18, 1), +(5444, 'ante', 'page', 18, 1), +(5445, 'Nisi', 'page', 18, 1), +(5446, 'vitae', 'page', 18, 1), +(5447, 'suscipit', 'page', 18, 1), +(5448, 'Felis', 'page', 18, 1), +(5449, 'leo', 'page', 18, 1), +(5450, 'porta', 'page', 18, 1), +(5451, 'Conclusion', 'page', 18, 4), +(5452, 'I', 'page', 18, 1), +(5453, 'hope', 'page', 18, 1), +(5454, 'you', 'page', 18, 1), +(5455, 'enjoyed', 'page', 18, 1), +(5456, 'browsing', 'page', 18, 1), +(5457, 'almost', 'page', 18, 1), +(5458, 'pointless', 'page', 18, 1), +(5459, 'As', 'page', 18, 1), +(5460, 'reward', 'page', 18, 1), +(5461, 'check', 'page', 18, 1), +(5462, 'out', 'page', 18, 1), +(5463, 'sweet', 'page', 18, 1), +(5464, 'video', 'page', 18, 1), +(5465, 'Docker', 'book', 10, 49), +(5466, 'Support', 'book', 10, 49), +(5467, 'in', 'book', 10, 1), +(5468, 'getting', 'book', 10, 1), +(5469, 'started', 'book', 10, 1), +(5470, 'and', 'book', 10, 1), +(5471, 'moving', 'book', 10, 1), +(5472, 'forward', 'book', 10, 1), +(5473, 'with', 'book', 10, 1), +(5474, 'Docker', 'page', 19, 40), +(5475, 'Setup', 'page', 19, 40), +(5476, 'Description', 'page', 19, 1), +(5477, 'A', 'page', 19, 1), +(5478, 'guide', 'page', 19, 1), +(5479, 'on', 'page', 19, 2), +(5480, 'getting', 'page', 19, 1), +(5481, 'set', 'page', 19, 1), +(5482, 'up', 'page', 19, 1), +(5483, 'with', 'page', 19, 3), +(5484, 'docker', 'page', 19, 1), +(5485, 'for', 'page', 19, 4), +(5486, 'the', 'page', 19, 6), +(5487, 'first', 'page', 19, 1), +(5488, 'time', 'page', 19, 1), +(5489, 'An', 'page', 19, 4), +(5490, 'Example', 'page', 19, 4), +(5491, 'Document', 'page', 19, 4), +(5492, 'Welcome', 'page', 19, 1), +(5493, 'This', 'page', 19, 2), +(5494, 'is', 'page', 19, 7), +(5495, 'a', 'page', 19, 11), +(5496, 'filler', 'page', 19, 1), +(5497, 'page', 'page', 19, 1), +(5498, 'to', 'page', 19, 13), +(5499, 'show', 'page', 19, 1), +(5500, 'off', 'page', 19, 1), +(5501, 'formatting', 'page', 19, 1), +(5502, 'of', 'page', 19, 6), +(5503, 'BookStack', 'page', 19, 1), +(5504, 'documents', 'page', 19, 1), +(5505, ' ', 'page', 19, 1), +(5506, 'All', 'page', 19, 1), +(5507, 'content', 'page', 19, 1), +(5508, 'aside', 'page', 19, 2), +(5509, 'from', 'page', 19, 2), +(5510, 'description', 'page', 19, 1), +(5511, 'at', 'page', 19, 3), +(5512, 'top', 'page', 19, 1), +(5513, 'this', 'page', 19, 3), +(5514, 'document', 'page', 19, 3), +(5515, 'unrelated', 'page', 19, 1), +(5516, 's', 'page', 19, 1), +(5517, 'actual', 'page', 19, 1), +(5518, 'purposes', 'page', 19, 2), +(5519, 'and', 'page', 19, 9), +(5520, 'should', 'page', 19, 1), +(5521, 'not', 'page', 19, 1), +(5522, 'be', 'page', 19, 4), +(5523, 'used', 'page', 19, 3), +(5524, 'demonstrative', 'page', 19, 1), +(5525, 'Further', 'page', 19, 4), +(5526, 'Content', 'page', 19, 8), +(5527, 'The', 'page', 19, 1), +(5528, 'purpose', 'page', 19, 1), +(5529, 'knowledge', 'page', 19, 2), +(5530, 'base', 'page', 19, 4), +(5531, 'act', 'page', 19, 1), +(5532, 'as', 'page', 19, 2), +(5533, 'centralized', 'page', 19, 1), +(5534, 'organized', 'page', 19, 2), +(5535, 'platform', 'page', 19, 1), +(5536, 'access', 'page', 19, 1), +(5537, 'guides', 'page', 19, 4), +(5538, 'tutorials', 'page', 19, 1), +(5539, 'troubleshooting', 'page', 19, 1), +(5540, 'information', 'page', 19, 2), +(5541, 'other', 'page', 19, 2), +(5542, 'resources', 'page', 19, 1), +(5543, 'Knowledge', 'page', 19, 3), +(5544, 'systems', 'page', 19, 3), +(5545, 'come', 'page', 19, 1), +(5546, 'in', 'page', 19, 6), +(5547, 'different', 'page', 19, 1), +(5548, 'flavors', 'page', 19, 1), +(5549, 'example', 'page', 19, 1), +(5550, 'there', 'page', 19, 1), +(5551, 'may', 'page', 19, 1), +(5552, 'number', 'page', 19, 1), +(5553, 'predefined', 'page', 19, 1), +(5554, 'modules', 'page', 19, 1), +(5555, 'that', 'page', 19, 2), +(5556, 'can', 'page', 19, 3), +(5557, 'added', 'page', 19, 1), +(5558, 'removed', 'page', 19, 1), +(5559, 'developed', 'page', 19, 1), +(5560, 'an', 'page', 19, 1), +(5561, 'integrated', 'page', 19, 1), +(5562, 'manner', 'page', 19, 1), +(5563, 'products', 'page', 19, 1), +(5564, 'are', 'page', 19, 1), +(5565, 'most', 'page', 19, 1), +(5566, 'frequently', 'page', 19, 1), +(5567, 'contain', 'page', 19, 1), +(5568, 'detailed', 'page', 19, 1), +(5569, 'These', 'page', 19, 1), +(5570, 'include', 'page', 19, 2), +(5571, 'solutions', 'page', 19, 1), +(5572, 'wide', 'page', 19, 1), +(5573, 'range', 'page', 19, 1), +(5574, 'technical', 'page', 19, 1), +(5575, 'problems', 'page', 19, 1), +(5576, 'but', 'page', 19, 1), +(5577, 'also', 'page', 19, 1), +(5578, 'every', 'page', 19, 1), +(5579, 'aspect', 'page', 19, 1), +(5580, 'programming', 'page', 19, 1), +(5581, 'hardware', 'page', 19, 1), +(5582, 'software', 'page', 19, 2), +(5583, 'topics', 'page', 19, 1), +(5584, 'business', 'page', 19, 1), +(5585, 'concepts', 'page', 19, 1), +(5586, 'Another', 'page', 19, 1), +(5587, 'reason', 'page', 19, 1), +(5588, 'consider', 'page', 19, 1), +(5589, 'Base', 'page', 19, 1), +(5590, 'it', 'page', 19, 3), +(5591, 'often', 'page', 19, 1), +(5592, 'single', 'page', 19, 1), +(5593, 'entry', 'page', 19, 1), +(5594, 'point', 'page', 19, 1), +(5595, 'system', 'page', 19, 2), +(5596, 'very', 'page', 19, 1), +(5597, 'convenient', 'page', 19, 1), +(5598, 'feature', 'page', 19, 1), +(5599, 'remote', 'page', 19, 1), +(5600, 'clients', 'page', 19, 1), +(5601, 'who', 'page', 19, 2), +(5602, 'need', 'page', 19, 2), +(5603, 'select', 'page', 19, 1), +(5604, 'particular', 'page', 19, 2), +(5605, 'program', 'page', 19, 1), +(5606, 'download', 'page', 19, 1), +(5607, 'their', 'page', 19, 1), +(5608, 'computer', 'page', 19, 1), +(5609, 'or', 'page', 19, 1), +(5610, 'quickly', 'page', 19, 1), +(5611, 'learn', 'page', 19, 2), +(5612, 'how', 'page', 19, 2), +(5613, 'configure', 'page', 19, 1), +(5614, 'It', 'page', 19, 1), +(5615, 'particularly', 'page', 19, 1), +(5616, 'useful', 'page', 19, 1), +(5617, 'schools', 'page', 19, 1), +(5618, 'where', 'page', 19, 1), +(5619, 'users', 'page', 19, 1), +(5620, 'easily', 'page', 19, 1), +(5621, 'about', 'page', 19, 1), +(5622, 'application', 'page', 19, 1), +(5623, 'then', 'page', 19, 1), +(5624, 'use', 'page', 19, 1), +(5625, 'without', 'page', 19, 1), +(5626, 'having', 'page', 19, 1), +(5627, 'understand', 'page', 19, 1), +(5628, 'works', 'page', 19, 1), +(5629, 'Even', 'page', 19, 4), +(5630, 'Less', 'page', 19, 4), +(5631, 'Useful', 'page', 19, 4), +(5632, 'Lorem', 'page', 19, 2), +(5633, 'ipsum', 'page', 19, 2), +(5634, 'dolor', 'page', 19, 4), +(5635, 'sit', 'page', 19, 7), +(5636, 'amet', 'page', 19, 6), +(5637, 'consectetur', 'page', 19, 4), +(5638, 'adipiscing', 'page', 19, 3), +(5639, 'elit', 'page', 19, 3), +(5640, 'sed', 'page', 19, 5), +(5641, 'do', 'page', 19, 1), +(5642, 'eiusmod', 'page', 19, 1), +(5643, 'tempor', 'page', 19, 1), +(5644, 'incididunt', 'page', 19, 1), +(5645, 'ut', 'page', 19, 4), +(5646, 'labore', 'page', 19, 1), +(5647, 'et', 'page', 19, 2), +(5648, 'dolore', 'page', 19, 1), +(5649, 'magna', 'page', 19, 1), +(5650, 'aliqua', 'page', 19, 1), +(5651, 'Pellentesque', 'page', 19, 1), +(5652, 'porttitor', 'page', 19, 3), +(5653, 'eget', 'page', 19, 3), +(5654, 'morbi', 'page', 19, 5), +(5655, 'Nunc', 'page', 19, 1), +(5656, 'velit', 'page', 19, 1), +(5657, 'dignissim', 'page', 19, 3), +(5658, 'sodales', 'page', 19, 1), +(5659, 'eu', 'page', 19, 5), +(5660, 'sem', 'page', 19, 1), +(5661, 'integer', 'page', 19, 1), +(5662, 'Gravida', 'page', 19, 1), +(5663, 'cum', 'page', 19, 1), +(5664, 'sociis', 'page', 19, 1), +(5665, 'natoque', 'page', 19, 1), +(5666, 'penatibus', 'page', 19, 1), +(5667, 'magnis', 'page', 19, 1), +(5668, 'dis', 'page', 19, 1), +(5669, 'Proin', 'page', 19, 1), +(5670, 'libero', 'page', 19, 2), +(5671, 'enim', 'page', 19, 4), +(5672, 'faucibus', 'page', 19, 3), +(5673, 'turpis', 'page', 19, 1), +(5674, 'In', 'page', 19, 2), +(5675, 'fermentum', 'page', 19, 5), +(5676, 'posuere', 'page', 19, 2), +(5677, 'urna', 'page', 19, 3), +(5678, 'nec', 'page', 19, 1), +(5679, 'tincidunt', 'page', 19, 2), +(5680, 'praesent', 'page', 19, 1), +(5681, 'semper', 'page', 19, 1), +(5682, 'Varius', 'page', 19, 1), +(5683, 'duis', 'page', 19, 2), +(5684, 'lorem', 'page', 19, 2), +(5685, 'Placerat', 'page', 19, 1), +(5686, 'orci', 'page', 19, 4), +(5687, 'nulla', 'page', 19, 4), +(5688, 'pellentesque', 'page', 19, 2), +(5689, 'venenatis', 'page', 19, 1), +(5690, 'Integer', 'page', 19, 2), +(5691, 'feugiat', 'page', 19, 2), +(5692, 'scelerisque', 'page', 19, 3), +(5693, 'varius', 'page', 19, 4), +(5694, 'nunc', 'page', 19, 2), +(5695, 'Diam', 'page', 19, 1), +(5696, 'quam', 'page', 19, 5), +(5697, 'massa', 'page', 19, 2), +(5698, 'Dolor', 'page', 19, 1), +(5699, 'Tempus', 'page', 19, 1), +(5700, 'iaculis', 'page', 19, 2), +(5701, 'id', 'page', 19, 3), +(5702, 'volutpat', 'page', 19, 2), +(5703, 'Ac', 'page', 19, 1), +(5704, 'auctor', 'page', 19, 2), +(5705, 'augue', 'page', 19, 5), +(5706, 'mauris', 'page', 19, 4), +(5707, 'neque', 'page', 19, 3), +(5708, 'gravida', 'page', 19, 2), +(5709, 'Blandit', 'page', 19, 1), +(5710, 'cras', 'page', 19, 4), +(5711, 'ornare', 'page', 19, 1), +(5712, 'arcu', 'page', 19, 4), +(5713, 'mi', 'page', 19, 2), +(5714, 'bibendum', 'page', 19, 1), +(5715, 'egestas', 'page', 19, 3), +(5716, 'Non', 'page', 19, 1), +(5717, 'lacus', 'page', 19, 1), +(5718, 'suspendisse', 'page', 19, 3), +(5719, 'interdum', 'page', 19, 1), +(5720, 'Vivamus', 'page', 19, 1), +(5721, 'dictum', 'page', 19, 1), +(5722, 'Duis', 'page', 19, 1), +(5723, 'diam', 'page', 19, 4), +(5724, 'Egestas', 'page', 19, 1), +(5725, 'congue', 'page', 19, 1), +(5726, 'quisque', 'page', 19, 2), +(5727, 'cursus', 'page', 19, 1), +(5728, 'Quis', 'page', 19, 1), +(5729, 'viverra', 'page', 19, 2), +(5730, 'nibh', 'page', 19, 2), +(5731, 'pulvinar', 'page', 19, 3), +(5732, 'Hendrerit', 'page', 19, 1), +(5733, 'rutrum', 'page', 19, 2), +(5734, 'non', 'page', 19, 6), +(5735, 'tellus', 'page', 19, 5), +(5736, 'Metus', 'page', 19, 1), +(5737, 'vulputate', 'page', 19, 2), +(5738, 'felis', 'page', 19, 1), +(5739, 'imperdiet', 'page', 19, 2), +(5740, 'proin', 'page', 19, 2), +(5741, 'Nulla', 'page', 19, 1), +(5742, 'facilisi', 'page', 19, 2), +(5743, 'tempus', 'page', 19, 1), +(5744, 'Eget', 'page', 19, 2), +(5745, 'risus', 'page', 19, 1), +(5746, 'quis', 'page', 19, 1), +(5747, 'Quisque', 'page', 19, 1), +(5748, 'ac', 'page', 19, 2), +(5749, 'nullam', 'page', 19, 2), +(5750, 'nisi', 'page', 19, 2), +(5751, 'est', 'page', 19, 3), +(5752, 'Id', 'page', 19, 1), +(5753, 'vel', 'page', 19, 2), +(5754, 'elementum', 'page', 19, 1), +(5755, 'etiam', 'page', 19, 1), +(5756, 'Pretium', 'page', 19, 1), +(5757, 'potenti', 'page', 19, 1), +(5758, 'Aliquam', 'page', 19, 1), +(5759, 'maecenas', 'page', 19, 1), +(5760, 'ultricies', 'page', 19, 1), +(5761, 'Tellus', 'page', 19, 1), +(5762, 'tortor', 'page', 19, 1), +(5763, 'aliquam', 'page', 19, 1), +(5764, 'Facilisi', 'page', 19, 1), +(5765, 'odio', 'page', 19, 1), +(5766, 'Et', 'page', 19, 1), +(5767, 'sollicitudin', 'page', 19, 1), +(5768, 'phasellus', 'page', 19, 1), +(5769, 'Nullam', 'page', 19, 1), +(5770, 'Quam', 'page', 19, 1), +(5771, 'ante', 'page', 19, 1), +(5772, 'Nisi', 'page', 19, 1), +(5773, 'vitae', 'page', 19, 1), +(5774, 'suscipit', 'page', 19, 1), +(5775, 'Felis', 'page', 19, 1), +(5776, 'leo', 'page', 19, 1), +(5777, 'porta', 'page', 19, 1), +(5778, 'Conclusion', 'page', 19, 4), +(5779, 'I', 'page', 19, 1), +(5780, 'hope', 'page', 19, 1), +(5781, 'you', 'page', 19, 1), +(5782, 'enjoyed', 'page', 19, 1), +(5783, 'browsing', 'page', 19, 1), +(5784, 'almost', 'page', 19, 1), +(5785, 'pointless', 'page', 19, 1), +(5786, 'As', 'page', 19, 1), +(5787, 'reward', 'page', 19, 1), +(5788, 'check', 'page', 19, 1), +(5789, 'out', 'page', 19, 1), +(5790, 'sweet', 'page', 19, 1), +(5791, 'video', 'page', 19, 1), +(5792, 'Troubleshooting', 'page', 20, 40), +(5793, 'and', 'page', 20, 50), +(5794, 'Technical', 'page', 20, 40), +(5795, 'Support', 'page', 20, 40), +(5796, 'Description', 'page', 20, 1), +(5797, 'Common', 'page', 20, 1), +(5798, 'issues', 'page', 20, 1), +(5799, 'found', 'page', 20, 1), +(5800, 'when', 'page', 20, 1), +(5801, 'using', 'page', 20, 1), +(5802, 'Docker', 'page', 20, 2), +(5803, 'common', 'page', 20, 1), +(5804, 'solutions', 'page', 20, 2), +(5805, 'that', 'page', 20, 3), +(5806, 'can', 'page', 20, 4), +(5807, 'help', 'page', 20, 1), +(5808, 'development', 'page', 20, 1), +(5809, 'continue', 'page', 20, 1), +(5810, 'An', 'page', 20, 4), +(5811, 'Example', 'page', 20, 4), +(5812, 'Document', 'page', 20, 4), +(5813, 'Welcome', 'page', 20, 1), +(5814, 'This', 'page', 20, 2), +(5815, 'is', 'page', 20, 7), +(5816, 'a', 'page', 20, 11), +(5817, 'filler', 'page', 20, 1), +(5818, 'page', 'page', 20, 1), +(5819, 'to', 'page', 20, 13), +(5820, 'show', 'page', 20, 1), +(5821, 'off', 'page', 20, 1), +(5822, 'the', 'page', 20, 5), +(5823, 'formatting', 'page', 20, 1), +(5824, 'of', 'page', 20, 6), +(5825, 'BookStack', 'page', 20, 1), +(5826, 'documents', 'page', 20, 1), +(5827, ' ', 'page', 20, 1), +(5828, 'All', 'page', 20, 1), +(5829, 'content', 'page', 20, 1), +(5830, 'aside', 'page', 20, 2), +(5831, 'from', 'page', 20, 2), +(5832, 'description', 'page', 20, 1), +(5833, 'at', 'page', 20, 3), +(5834, 'top', 'page', 20, 1), +(5835, 'this', 'page', 20, 3), +(5836, 'document', 'page', 20, 3), +(5837, 'unrelated', 'page', 20, 1), +(5838, 's', 'page', 20, 1), +(5839, 'actual', 'page', 20, 1), +(5840, 'purposes', 'page', 20, 2), +(5841, 'should', 'page', 20, 1), +(5842, 'not', 'page', 20, 1), +(5843, 'be', 'page', 20, 4), +(5844, 'used', 'page', 20, 3), +(5845, 'demonstrative', 'page', 20, 1), +(5846, 'Further', 'page', 20, 4), +(5847, 'Content', 'page', 20, 8), +(5848, 'The', 'page', 20, 1), +(5849, 'purpose', 'page', 20, 1), +(5850, 'knowledge', 'page', 20, 2), +(5851, 'base', 'page', 20, 4), +(5852, 'act', 'page', 20, 1), +(5853, 'as', 'page', 20, 2), +(5854, 'centralized', 'page', 20, 1), +(5855, 'organized', 'page', 20, 2), +(5856, 'platform', 'page', 20, 1), +(5857, 'access', 'page', 20, 1), +(5858, 'guides', 'page', 20, 4), +(5859, 'tutorials', 'page', 20, 1), +(5860, 'troubleshooting', 'page', 20, 1), +(5861, 'information', 'page', 20, 2), +(5862, 'other', 'page', 20, 2), +(5863, 'resources', 'page', 20, 1), +(5864, 'Knowledge', 'page', 20, 3), +(5865, 'systems', 'page', 20, 3), +(5866, 'come', 'page', 20, 1), +(5867, 'in', 'page', 20, 6), +(5868, 'different', 'page', 20, 1), +(5869, 'flavors', 'page', 20, 1), +(5870, 'for', 'page', 20, 3), +(5871, 'example', 'page', 20, 1), +(5872, 'there', 'page', 20, 1), +(5873, 'may', 'page', 20, 1), +(5874, 'number', 'page', 20, 1), +(5875, 'predefined', 'page', 20, 1), +(5876, 'modules', 'page', 20, 1), +(5877, 'added', 'page', 20, 1), +(5878, 'removed', 'page', 20, 1), +(5879, 'developed', 'page', 20, 1), +(5880, 'an', 'page', 20, 1), +(5881, 'integrated', 'page', 20, 1), +(5882, 'manner', 'page', 20, 1), +(5883, 'with', 'page', 20, 2), +(5884, 'products', 'page', 20, 1), +(5885, 'are', 'page', 20, 1), +(5886, 'most', 'page', 20, 1), +(5887, 'frequently', 'page', 20, 1), +(5888, 'contain', 'page', 20, 1), +(5889, 'detailed', 'page', 20, 1), +(5890, 'These', 'page', 20, 1), +(5891, 'include', 'page', 20, 2), +(5892, 'wide', 'page', 20, 1), +(5893, 'range', 'page', 20, 1), +(5894, 'technical', 'page', 20, 1), +(5895, 'problems', 'page', 20, 1), +(5896, 'but', 'page', 20, 1), +(5897, 'also', 'page', 20, 1), +(5898, 'on', 'page', 20, 1), +(5899, 'every', 'page', 20, 1), +(5900, 'aspect', 'page', 20, 1), +(5901, 'programming', 'page', 20, 1), +(5902, 'hardware', 'page', 20, 1), +(5903, 'software', 'page', 20, 2), +(5904, 'topics', 'page', 20, 1), +(5905, 'business', 'page', 20, 1), +(5906, 'concepts', 'page', 20, 1), +(5907, 'Another', 'page', 20, 1), +(5908, 'reason', 'page', 20, 1), +(5909, 'consider', 'page', 20, 1), +(5910, 'Base', 'page', 20, 1), +(5911, 'it', 'page', 20, 3), +(5912, 'often', 'page', 20, 1), +(5913, 'single', 'page', 20, 1), +(5914, 'entry', 'page', 20, 1), +(5915, 'point', 'page', 20, 1), +(5916, 'system', 'page', 20, 2), +(5917, 'very', 'page', 20, 1), +(5918, 'convenient', 'page', 20, 1), +(5919, 'feature', 'page', 20, 1), +(5920, 'remote', 'page', 20, 1), +(5921, 'clients', 'page', 20, 1), +(5922, 'who', 'page', 20, 2), +(5923, 'need', 'page', 20, 2), +(5924, 'select', 'page', 20, 1), +(5925, 'particular', 'page', 20, 2), +(5926, 'program', 'page', 20, 1), +(5927, 'download', 'page', 20, 1), +(5928, 'their', 'page', 20, 1), +(5929, 'computer', 'page', 20, 1), +(5930, 'or', 'page', 20, 1), +(5931, 'quickly', 'page', 20, 1), +(5932, 'learn', 'page', 20, 2), +(5933, 'how', 'page', 20, 2), +(5934, 'configure', 'page', 20, 1), +(5935, 'It', 'page', 20, 1), +(5936, 'particularly', 'page', 20, 1), +(5937, 'useful', 'page', 20, 1), +(5938, 'schools', 'page', 20, 1), +(5939, 'where', 'page', 20, 1), +(5940, 'users', 'page', 20, 1), +(5941, 'easily', 'page', 20, 1), +(5942, 'about', 'page', 20, 1), +(5943, 'application', 'page', 20, 1), +(5944, 'then', 'page', 20, 1), +(5945, 'use', 'page', 20, 1), +(5946, 'without', 'page', 20, 1), +(5947, 'having', 'page', 20, 1), +(5948, 'understand', 'page', 20, 1), +(5949, 'works', 'page', 20, 1), +(5950, 'Even', 'page', 20, 4), +(5951, 'Less', 'page', 20, 4), +(5952, 'Useful', 'page', 20, 4), +(5953, 'Lorem', 'page', 20, 2), +(5954, 'ipsum', 'page', 20, 2), +(5955, 'dolor', 'page', 20, 4), +(5956, 'sit', 'page', 20, 7), +(5957, 'amet', 'page', 20, 6), +(5958, 'consectetur', 'page', 20, 4), +(5959, 'adipiscing', 'page', 20, 3), +(5960, 'elit', 'page', 20, 3), +(5961, 'sed', 'page', 20, 5), +(5962, 'do', 'page', 20, 1), +(5963, 'eiusmod', 'page', 20, 1), +(5964, 'tempor', 'page', 20, 1), +(5965, 'incididunt', 'page', 20, 1), +(5966, 'ut', 'page', 20, 4), +(5967, 'labore', 'page', 20, 1), +(5968, 'et', 'page', 20, 2), +(5969, 'dolore', 'page', 20, 1), +(5970, 'magna', 'page', 20, 1), +(5971, 'aliqua', 'page', 20, 1), +(5972, 'Pellentesque', 'page', 20, 1), +(5973, 'porttitor', 'page', 20, 3), +(5974, 'eget', 'page', 20, 3), +(5975, 'morbi', 'page', 20, 5), +(5976, 'Nunc', 'page', 20, 1), +(5977, 'velit', 'page', 20, 1), +(5978, 'dignissim', 'page', 20, 3), +(5979, 'sodales', 'page', 20, 1), +(5980, 'eu', 'page', 20, 5), +(5981, 'sem', 'page', 20, 1), +(5982, 'integer', 'page', 20, 1), +(5983, 'Gravida', 'page', 20, 1), +(5984, 'cum', 'page', 20, 1), +(5985, 'sociis', 'page', 20, 1), +(5986, 'natoque', 'page', 20, 1), +(5987, 'penatibus', 'page', 20, 1), +(5988, 'magnis', 'page', 20, 1), +(5989, 'dis', 'page', 20, 1), +(5990, 'Proin', 'page', 20, 1), +(5991, 'libero', 'page', 20, 2), +(5992, 'enim', 'page', 20, 4), +(5993, 'faucibus', 'page', 20, 3), +(5994, 'turpis', 'page', 20, 1), +(5995, 'In', 'page', 20, 2), +(5996, 'fermentum', 'page', 20, 5), +(5997, 'posuere', 'page', 20, 2), +(5998, 'urna', 'page', 20, 3), +(5999, 'nec', 'page', 20, 1), +(6000, 'tincidunt', 'page', 20, 2), +(6001, 'praesent', 'page', 20, 1), +(6002, 'semper', 'page', 20, 1), +(6003, 'Varius', 'page', 20, 1), +(6004, 'duis', 'page', 20, 2), +(6005, 'lorem', 'page', 20, 2), +(6006, 'Placerat', 'page', 20, 1), +(6007, 'orci', 'page', 20, 4), +(6008, 'nulla', 'page', 20, 4), +(6009, 'pellentesque', 'page', 20, 2), +(6010, 'venenatis', 'page', 20, 1), +(6011, 'Integer', 'page', 20, 2), +(6012, 'feugiat', 'page', 20, 2), +(6013, 'scelerisque', 'page', 20, 3), +(6014, 'varius', 'page', 20, 4), +(6015, 'nunc', 'page', 20, 2), +(6016, 'Diam', 'page', 20, 1), +(6017, 'quam', 'page', 20, 5), +(6018, 'massa', 'page', 20, 2), +(6019, 'Dolor', 'page', 20, 1), +(6020, 'Tempus', 'page', 20, 1), +(6021, 'iaculis', 'page', 20, 2), +(6022, 'id', 'page', 20, 3), +(6023, 'volutpat', 'page', 20, 2), +(6024, 'Ac', 'page', 20, 1), +(6025, 'auctor', 'page', 20, 2), +(6026, 'augue', 'page', 20, 5), +(6027, 'mauris', 'page', 20, 4), +(6028, 'neque', 'page', 20, 3), +(6029, 'gravida', 'page', 20, 2), +(6030, 'Blandit', 'page', 20, 1), +(6031, 'cras', 'page', 20, 4), +(6032, 'ornare', 'page', 20, 1), +(6033, 'arcu', 'page', 20, 4), +(6034, 'mi', 'page', 20, 2), +(6035, 'bibendum', 'page', 20, 1), +(6036, 'egestas', 'page', 20, 3), +(6037, 'Non', 'page', 20, 1), +(6038, 'lacus', 'page', 20, 1), +(6039, 'suspendisse', 'page', 20, 3), +(6040, 'interdum', 'page', 20, 1), +(6041, 'Vivamus', 'page', 20, 1), +(6042, 'dictum', 'page', 20, 1), +(6043, 'Duis', 'page', 20, 1), +(6044, 'diam', 'page', 20, 4), +(6045, 'Egestas', 'page', 20, 1), +(6046, 'congue', 'page', 20, 1), +(6047, 'quisque', 'page', 20, 2), +(6048, 'cursus', 'page', 20, 1), +(6049, 'Quis', 'page', 20, 1), +(6050, 'viverra', 'page', 20, 2), +(6051, 'nibh', 'page', 20, 2), +(6052, 'pulvinar', 'page', 20, 3), +(6053, 'Hendrerit', 'page', 20, 1), +(6054, 'rutrum', 'page', 20, 2), +(6055, 'non', 'page', 20, 6), +(6056, 'tellus', 'page', 20, 5), +(6057, 'Metus', 'page', 20, 1), +(6058, 'vulputate', 'page', 20, 2), +(6059, 'felis', 'page', 20, 1), +(6060, 'imperdiet', 'page', 20, 2), +(6061, 'proin', 'page', 20, 2), +(6062, 'Nulla', 'page', 20, 1), +(6063, 'facilisi', 'page', 20, 2), +(6064, 'tempus', 'page', 20, 1), +(6065, 'Eget', 'page', 20, 2), +(6066, 'risus', 'page', 20, 1), +(6067, 'quis', 'page', 20, 1), +(6068, 'Quisque', 'page', 20, 1), +(6069, 'ac', 'page', 20, 2), +(6070, 'nullam', 'page', 20, 2), +(6071, 'nisi', 'page', 20, 2), +(6072, 'est', 'page', 20, 3), +(6073, 'Id', 'page', 20, 1), +(6074, 'vel', 'page', 20, 2), +(6075, 'elementum', 'page', 20, 1), +(6076, 'etiam', 'page', 20, 1), +(6077, 'Pretium', 'page', 20, 1), +(6078, 'potenti', 'page', 20, 1); +INSERT INTO `search_terms` (`id`, `term`, `entity_type`, `entity_id`, `score`) VALUES +(6079, 'Aliquam', 'page', 20, 1), +(6080, 'maecenas', 'page', 20, 1), +(6081, 'ultricies', 'page', 20, 1), +(6082, 'Tellus', 'page', 20, 1), +(6083, 'tortor', 'page', 20, 1), +(6084, 'aliquam', 'page', 20, 1), +(6085, 'Facilisi', 'page', 20, 1), +(6086, 'odio', 'page', 20, 1), +(6087, 'Et', 'page', 20, 1), +(6088, 'sollicitudin', 'page', 20, 1), +(6089, 'phasellus', 'page', 20, 1), +(6090, 'Nullam', 'page', 20, 1), +(6091, 'Quam', 'page', 20, 1), +(6092, 'ante', 'page', 20, 1), +(6093, 'Nisi', 'page', 20, 1), +(6094, 'vitae', 'page', 20, 1), +(6095, 'suscipit', 'page', 20, 1), +(6096, 'Felis', 'page', 20, 1), +(6097, 'leo', 'page', 20, 1), +(6098, 'porta', 'page', 20, 1), +(6099, 'Conclusion', 'page', 20, 4), +(6100, 'I', 'page', 20, 1), +(6101, 'hope', 'page', 20, 1), +(6102, 'you', 'page', 20, 1), +(6103, 'enjoyed', 'page', 20, 1), +(6104, 'browsing', 'page', 20, 1), +(6105, 'almost', 'page', 20, 1), +(6106, 'pointless', 'page', 20, 1), +(6107, 'As', 'page', 20, 1), +(6108, 'reward', 'page', 20, 1), +(6109, 'check', 'page', 20, 1), +(6110, 'out', 'page', 20, 1), +(6111, 'sweet', 'page', 20, 1), +(6112, 'video', 'page', 20, 1), +(6113, 'Developing', 'book', 11, 48), +(6114, 'Research', 'book', 11, 49), +(6115, 'areas', 'book', 11, 1), +(6116, 'for', 'book', 11, 1), +(6117, 'Docker', 'book', 11, 1), +(6118, 'that', 'book', 11, 1), +(6119, 'are', 'book', 11, 1), +(6120, 'in', 'book', 11, 1), +(6121, 'need', 'book', 11, 1), +(6122, 'of', 'book', 11, 1), +(6123, 'development', 'book', 11, 1), +(6124, 'Future', 'page', 21, 40), +(6125, 'Research', 'page', 21, 41), +(6126, 'Description', 'page', 21, 1), +(6127, 'areas', 'page', 21, 1), +(6128, 'for', 'page', 21, 4), +(6129, 'Docker', 'page', 21, 1), +(6130, 'that', 'page', 21, 3), +(6131, 'may', 'page', 21, 2), +(6132, 'prove', 'page', 21, 1), +(6133, 'useful', 'page', 21, 2), +(6134, 'in', 'page', 21, 7), +(6135, 'the', 'page', 21, 6), +(6136, 'future', 'page', 21, 1), +(6137, 'if', 'page', 21, 1), +(6138, 'further', 'page', 21, 1), +(6139, 'expanded', 'page', 21, 1), +(6140, 'upon', 'page', 21, 1), +(6141, 'and', 'page', 21, 10), +(6142, 'explored', 'page', 21, 1), +(6143, 'An', 'page', 21, 4), +(6144, 'Example', 'page', 21, 4), +(6145, 'Document', 'page', 21, 4), +(6146, 'Welcome', 'page', 21, 1), +(6147, 'This', 'page', 21, 2), +(6148, 'is', 'page', 21, 7), +(6149, 'a', 'page', 21, 11), +(6150, 'filler', 'page', 21, 1), +(6151, 'page', 'page', 21, 1), +(6152, 'to', 'page', 21, 13), +(6153, 'show', 'page', 21, 1), +(6154, 'off', 'page', 21, 1), +(6155, 'formatting', 'page', 21, 1), +(6156, 'of', 'page', 21, 6), +(6157, 'BookStack', 'page', 21, 1), +(6158, 'documents', 'page', 21, 1), +(6159, ' ', 'page', 21, 1), +(6160, 'All', 'page', 21, 1), +(6161, 'content', 'page', 21, 1), +(6162, 'aside', 'page', 21, 2), +(6163, 'from', 'page', 21, 2), +(6164, 'description', 'page', 21, 1), +(6165, 'at', 'page', 21, 3), +(6166, 'top', 'page', 21, 1), +(6167, 'this', 'page', 21, 3), +(6168, 'document', 'page', 21, 3), +(6169, 'unrelated', 'page', 21, 1), +(6170, 's', 'page', 21, 1), +(6171, 'actual', 'page', 21, 1), +(6172, 'purposes', 'page', 21, 2), +(6173, 'should', 'page', 21, 1), +(6174, 'not', 'page', 21, 1), +(6175, 'be', 'page', 21, 4), +(6176, 'used', 'page', 21, 3), +(6177, 'demonstrative', 'page', 21, 1), +(6178, 'Further', 'page', 21, 4), +(6179, 'Content', 'page', 21, 8), +(6180, 'The', 'page', 21, 1), +(6181, 'purpose', 'page', 21, 1), +(6182, 'knowledge', 'page', 21, 2), +(6183, 'base', 'page', 21, 4), +(6184, 'act', 'page', 21, 1), +(6185, 'as', 'page', 21, 2), +(6186, 'centralized', 'page', 21, 1), +(6187, 'organized', 'page', 21, 2), +(6188, 'platform', 'page', 21, 1), +(6189, 'access', 'page', 21, 1), +(6190, 'guides', 'page', 21, 4), +(6191, 'tutorials', 'page', 21, 1), +(6192, 'troubleshooting', 'page', 21, 1), +(6193, 'information', 'page', 21, 2), +(6194, 'other', 'page', 21, 2), +(6195, 'resources', 'page', 21, 1), +(6196, 'Knowledge', 'page', 21, 3), +(6197, 'systems', 'page', 21, 3), +(6198, 'come', 'page', 21, 1), +(6199, 'different', 'page', 21, 1), +(6200, 'flavors', 'page', 21, 1), +(6201, 'example', 'page', 21, 1), +(6202, 'there', 'page', 21, 1), +(6203, 'number', 'page', 21, 1), +(6204, 'predefined', 'page', 21, 1), +(6205, 'modules', 'page', 21, 1), +(6206, 'can', 'page', 21, 3), +(6207, 'added', 'page', 21, 1), +(6208, 'removed', 'page', 21, 1), +(6209, 'developed', 'page', 21, 1), +(6210, 'an', 'page', 21, 1), +(6211, 'integrated', 'page', 21, 1), +(6212, 'manner', 'page', 21, 1), +(6213, 'with', 'page', 21, 2), +(6214, 'products', 'page', 21, 1), +(6215, 'are', 'page', 21, 1), +(6216, 'most', 'page', 21, 1), +(6217, 'frequently', 'page', 21, 1), +(6218, 'contain', 'page', 21, 1), +(6219, 'detailed', 'page', 21, 1), +(6220, 'These', 'page', 21, 1), +(6221, 'include', 'page', 21, 2), +(6222, 'solutions', 'page', 21, 1), +(6223, 'wide', 'page', 21, 1), +(6224, 'range', 'page', 21, 1), +(6225, 'technical', 'page', 21, 1), +(6226, 'problems', 'page', 21, 1), +(6227, 'but', 'page', 21, 1), +(6228, 'also', 'page', 21, 1), +(6229, 'on', 'page', 21, 1), +(6230, 'every', 'page', 21, 1), +(6231, 'aspect', 'page', 21, 1), +(6232, 'programming', 'page', 21, 1), +(6233, 'hardware', 'page', 21, 1), +(6234, 'software', 'page', 21, 2), +(6235, 'topics', 'page', 21, 1), +(6236, 'business', 'page', 21, 1), +(6237, 'concepts', 'page', 21, 1), +(6238, 'Another', 'page', 21, 1), +(6239, 'reason', 'page', 21, 1), +(6240, 'consider', 'page', 21, 1), +(6241, 'Base', 'page', 21, 1), +(6242, 'it', 'page', 21, 3), +(6243, 'often', 'page', 21, 1), +(6244, 'single', 'page', 21, 1), +(6245, 'entry', 'page', 21, 1), +(6246, 'point', 'page', 21, 1), +(6247, 'system', 'page', 21, 2), +(6248, 'very', 'page', 21, 1), +(6249, 'convenient', 'page', 21, 1), +(6250, 'feature', 'page', 21, 1), +(6251, 'remote', 'page', 21, 1), +(6252, 'clients', 'page', 21, 1), +(6253, 'who', 'page', 21, 2), +(6254, 'need', 'page', 21, 2), +(6255, 'select', 'page', 21, 1), +(6256, 'particular', 'page', 21, 2), +(6257, 'program', 'page', 21, 1), +(6258, 'download', 'page', 21, 1), +(6259, 'their', 'page', 21, 1), +(6260, 'computer', 'page', 21, 1), +(6261, 'or', 'page', 21, 1), +(6262, 'quickly', 'page', 21, 1), +(6263, 'learn', 'page', 21, 2), +(6264, 'how', 'page', 21, 2), +(6265, 'configure', 'page', 21, 1), +(6266, 'It', 'page', 21, 1), +(6267, 'particularly', 'page', 21, 1), +(6268, 'schools', 'page', 21, 1), +(6269, 'where', 'page', 21, 1), +(6270, 'users', 'page', 21, 1), +(6271, 'easily', 'page', 21, 1), +(6272, 'about', 'page', 21, 1), +(6273, 'application', 'page', 21, 1), +(6274, 'then', 'page', 21, 1), +(6275, 'use', 'page', 21, 1), +(6276, 'without', 'page', 21, 1), +(6277, 'having', 'page', 21, 1), +(6278, 'understand', 'page', 21, 1), +(6279, 'works', 'page', 21, 1), +(6280, 'Even', 'page', 21, 4), +(6281, 'Less', 'page', 21, 4), +(6282, 'Useful', 'page', 21, 4), +(6283, 'Lorem', 'page', 21, 2), +(6284, 'ipsum', 'page', 21, 2), +(6285, 'dolor', 'page', 21, 4), +(6286, 'sit', 'page', 21, 7), +(6287, 'amet', 'page', 21, 6), +(6288, 'consectetur', 'page', 21, 4), +(6289, 'adipiscing', 'page', 21, 3), +(6290, 'elit', 'page', 21, 3), +(6291, 'sed', 'page', 21, 5), +(6292, 'do', 'page', 21, 1), +(6293, 'eiusmod', 'page', 21, 1), +(6294, 'tempor', 'page', 21, 1), +(6295, 'incididunt', 'page', 21, 1), +(6296, 'ut', 'page', 21, 4), +(6297, 'labore', 'page', 21, 1), +(6298, 'et', 'page', 21, 2), +(6299, 'dolore', 'page', 21, 1), +(6300, 'magna', 'page', 21, 1), +(6301, 'aliqua', 'page', 21, 1), +(6302, 'Pellentesque', 'page', 21, 1), +(6303, 'porttitor', 'page', 21, 3), +(6304, 'eget', 'page', 21, 3), +(6305, 'morbi', 'page', 21, 5), +(6306, 'Nunc', 'page', 21, 1), +(6307, 'velit', 'page', 21, 1), +(6308, 'dignissim', 'page', 21, 3), +(6309, 'sodales', 'page', 21, 1), +(6310, 'eu', 'page', 21, 5), +(6311, 'sem', 'page', 21, 1), +(6312, 'integer', 'page', 21, 1), +(6313, 'Gravida', 'page', 21, 1), +(6314, 'cum', 'page', 21, 1), +(6315, 'sociis', 'page', 21, 1), +(6316, 'natoque', 'page', 21, 1), +(6317, 'penatibus', 'page', 21, 1), +(6318, 'magnis', 'page', 21, 1), +(6319, 'dis', 'page', 21, 1), +(6320, 'Proin', 'page', 21, 1), +(6321, 'libero', 'page', 21, 2), +(6322, 'enim', 'page', 21, 4), +(6323, 'faucibus', 'page', 21, 3), +(6324, 'turpis', 'page', 21, 1), +(6325, 'In', 'page', 21, 2), +(6326, 'fermentum', 'page', 21, 5), +(6327, 'posuere', 'page', 21, 2), +(6328, 'urna', 'page', 21, 3), +(6329, 'nec', 'page', 21, 1), +(6330, 'tincidunt', 'page', 21, 2), +(6331, 'praesent', 'page', 21, 1), +(6332, 'semper', 'page', 21, 1), +(6333, 'Varius', 'page', 21, 1), +(6334, 'duis', 'page', 21, 2), +(6335, 'lorem', 'page', 21, 2), +(6336, 'Placerat', 'page', 21, 1), +(6337, 'orci', 'page', 21, 4), +(6338, 'nulla', 'page', 21, 4), +(6339, 'pellentesque', 'page', 21, 2), +(6340, 'venenatis', 'page', 21, 1), +(6341, 'Integer', 'page', 21, 2), +(6342, 'feugiat', 'page', 21, 2), +(6343, 'scelerisque', 'page', 21, 3), +(6344, 'varius', 'page', 21, 4), +(6345, 'nunc', 'page', 21, 2), +(6346, 'Diam', 'page', 21, 1), +(6347, 'quam', 'page', 21, 5), +(6348, 'massa', 'page', 21, 2), +(6349, 'Dolor', 'page', 21, 1), +(6350, 'Tempus', 'page', 21, 1), +(6351, 'iaculis', 'page', 21, 2), +(6352, 'id', 'page', 21, 3), +(6353, 'volutpat', 'page', 21, 2), +(6354, 'Ac', 'page', 21, 1), +(6355, 'auctor', 'page', 21, 2), +(6356, 'augue', 'page', 21, 5), +(6357, 'mauris', 'page', 21, 4), +(6358, 'neque', 'page', 21, 3), +(6359, 'gravida', 'page', 21, 2), +(6360, 'Blandit', 'page', 21, 1), +(6361, 'cras', 'page', 21, 4), +(6362, 'ornare', 'page', 21, 1), +(6363, 'arcu', 'page', 21, 4), +(6364, 'mi', 'page', 21, 2), +(6365, 'bibendum', 'page', 21, 1), +(6366, 'egestas', 'page', 21, 3), +(6367, 'Non', 'page', 21, 1), +(6368, 'lacus', 'page', 21, 1), +(6369, 'suspendisse', 'page', 21, 3), +(6370, 'interdum', 'page', 21, 1), +(6371, 'Vivamus', 'page', 21, 1), +(6372, 'dictum', 'page', 21, 1), +(6373, 'Duis', 'page', 21, 1), +(6374, 'diam', 'page', 21, 4), +(6375, 'Egestas', 'page', 21, 1), +(6376, 'congue', 'page', 21, 1), +(6377, 'quisque', 'page', 21, 2), +(6378, 'cursus', 'page', 21, 1), +(6379, 'Quis', 'page', 21, 1), +(6380, 'viverra', 'page', 21, 2), +(6381, 'nibh', 'page', 21, 2), +(6382, 'pulvinar', 'page', 21, 3), +(6383, 'Hendrerit', 'page', 21, 1), +(6384, 'rutrum', 'page', 21, 2), +(6385, 'non', 'page', 21, 6), +(6386, 'tellus', 'page', 21, 5), +(6387, 'Metus', 'page', 21, 1), +(6388, 'vulputate', 'page', 21, 2), +(6389, 'felis', 'page', 21, 1), +(6390, 'imperdiet', 'page', 21, 2), +(6391, 'proin', 'page', 21, 2), +(6392, 'Nulla', 'page', 21, 1), +(6393, 'facilisi', 'page', 21, 2), +(6394, 'tempus', 'page', 21, 1), +(6395, 'Eget', 'page', 21, 2), +(6396, 'risus', 'page', 21, 1), +(6397, 'quis', 'page', 21, 1), +(6398, 'Quisque', 'page', 21, 1), +(6399, 'ac', 'page', 21, 2), +(6400, 'nullam', 'page', 21, 2), +(6401, 'nisi', 'page', 21, 2), +(6402, 'est', 'page', 21, 3), +(6403, 'Id', 'page', 21, 1), +(6404, 'vel', 'page', 21, 2), +(6405, 'elementum', 'page', 21, 1), +(6406, 'etiam', 'page', 21, 1), +(6407, 'Pretium', 'page', 21, 1), +(6408, 'potenti', 'page', 21, 1), +(6409, 'Aliquam', 'page', 21, 1), +(6410, 'maecenas', 'page', 21, 1), +(6411, 'ultricies', 'page', 21, 1), +(6412, 'Tellus', 'page', 21, 1), +(6413, 'tortor', 'page', 21, 1), +(6414, 'aliquam', 'page', 21, 1), +(6415, 'Facilisi', 'page', 21, 1), +(6416, 'odio', 'page', 21, 1), +(6417, 'Et', 'page', 21, 1), +(6418, 'sollicitudin', 'page', 21, 1), +(6419, 'phasellus', 'page', 21, 1), +(6420, 'Nullam', 'page', 21, 1), +(6421, 'Quam', 'page', 21, 1), +(6422, 'ante', 'page', 21, 1), +(6423, 'Nisi', 'page', 21, 1), +(6424, 'vitae', 'page', 21, 1), +(6425, 'suscipit', 'page', 21, 1), +(6426, 'Felis', 'page', 21, 1), +(6427, 'leo', 'page', 21, 1), +(6428, 'porta', 'page', 21, 1), +(6429, 'Conclusion', 'page', 21, 4), +(6430, 'I', 'page', 21, 1), +(6431, 'hope', 'page', 21, 1), +(6432, 'you', 'page', 21, 1), +(6433, 'enjoyed', 'page', 21, 1), +(6434, 'browsing', 'page', 21, 1), +(6435, 'almost', 'page', 21, 1), +(6436, 'pointless', 'page', 21, 1), +(6437, 'As', 'page', 21, 1), +(6438, 'reward', 'page', 21, 1), +(6439, 'check', 'page', 21, 1), +(6440, 'out', 'page', 21, 1), +(6441, 'sweet', 'page', 21, 1), +(6442, 'video', 'page', 21, 1), +(6443, 'Documentation', 'book', 12, 48), +(6444, 'Overview', 'book', 12, 48), +(6445, 'An', 'book', 12, 1), +(6446, 'overview', 'book', 12, 1), +(6447, 'of', 'book', 12, 1), +(6448, 'the', 'book', 12, 2), +(6449, 'elements', 'book', 12, 1), +(6450, 'that', 'book', 12, 1), +(6451, 'produce', 'book', 12, 1), +(6452, 'knowledge', 'book', 12, 1), +(6453, 'base', 'book', 12, 1), +(6454, 'Project', 'page', 22, 40), +(6455, 'Desired', 'page', 22, 40), +(6456, 'Content', 'page', 22, 48), +(6457, 'Description', 'page', 22, 1), +(6458, 'A', 'page', 22, 1), +(6459, 'description', 'page', 22, 2), +(6460, 'of', 'page', 22, 7), +(6461, 'the', 'page', 22, 7), +(6462, 'content', 'page', 22, 2), +(6463, 'that', 'page', 22, 3), +(6464, 'is', 'page', 22, 8), +(6465, 'appropriate', 'page', 22, 1), +(6466, 'and', 'page', 22, 10), +(6467, 'helpful', 'page', 22, 1), +(6468, 'to', 'page', 22, 14), +(6469, 'host', 'page', 22, 1), +(6470, 'on', 'page', 22, 2), +(6471, 'knowledge', 'page', 22, 3), +(6472, 'base', 'page', 22, 5), +(6473, 'for', 'page', 22, 4), +(6474, 'each', 'page', 22, 1), +(6475, 'project', 'page', 22, 1), +(6476, 'An', 'page', 22, 4), +(6477, 'Example', 'page', 22, 4), +(6478, 'Document', 'page', 22, 4), +(6479, 'Welcome', 'page', 22, 1), +(6480, 'This', 'page', 22, 2), +(6481, 'a', 'page', 22, 11), +(6482, 'filler', 'page', 22, 1), +(6483, 'page', 'page', 22, 1), +(6484, 'show', 'page', 22, 1), +(6485, 'off', 'page', 22, 1), +(6486, 'formatting', 'page', 22, 1), +(6487, 'BookStack', 'page', 22, 1), +(6488, 'documents', 'page', 22, 1), +(6489, ' ', 'page', 22, 1), +(6490, 'All', 'page', 22, 1), +(6491, 'aside', 'page', 22, 2), +(6492, 'from', 'page', 22, 2), +(6493, 'at', 'page', 22, 3), +(6494, 'top', 'page', 22, 1), +(6495, 'this', 'page', 22, 3), +(6496, 'document', 'page', 22, 3), +(6497, 'unrelated', 'page', 22, 1), +(6498, 's', 'page', 22, 1), +(6499, 'actual', 'page', 22, 1), +(6500, 'purposes', 'page', 22, 2), +(6501, 'should', 'page', 22, 1), +(6502, 'not', 'page', 22, 1), +(6503, 'be', 'page', 22, 4), +(6504, 'used', 'page', 22, 3), +(6505, 'demonstrative', 'page', 22, 1), +(6506, 'Further', 'page', 22, 4), +(6507, 'The', 'page', 22, 1), +(6508, 'purpose', 'page', 22, 1), +(6509, 'act', 'page', 22, 1), +(6510, 'as', 'page', 22, 2), +(6511, 'centralized', 'page', 22, 1), +(6512, 'organized', 'page', 22, 2), +(6513, 'platform', 'page', 22, 1), +(6514, 'access', 'page', 22, 1), +(6515, 'guides', 'page', 22, 4), +(6516, 'tutorials', 'page', 22, 1), +(6517, 'troubleshooting', 'page', 22, 1), +(6518, 'information', 'page', 22, 2), +(6519, 'other', 'page', 22, 2), +(6520, 'resources', 'page', 22, 1), +(6521, 'Knowledge', 'page', 22, 3), +(6522, 'systems', 'page', 22, 3), +(6523, 'come', 'page', 22, 1), +(6524, 'in', 'page', 22, 6), +(6525, 'different', 'page', 22, 1), +(6526, 'flavors', 'page', 22, 1), +(6527, 'example', 'page', 22, 1), +(6528, 'there', 'page', 22, 1), +(6529, 'may', 'page', 22, 1), +(6530, 'number', 'page', 22, 1), +(6531, 'predefined', 'page', 22, 1), +(6532, 'modules', 'page', 22, 1), +(6533, 'can', 'page', 22, 3), +(6534, 'added', 'page', 22, 1), +(6535, 'removed', 'page', 22, 1), +(6536, 'developed', 'page', 22, 1), +(6537, 'an', 'page', 22, 1), +(6538, 'integrated', 'page', 22, 1), +(6539, 'manner', 'page', 22, 1), +(6540, 'with', 'page', 22, 2), +(6541, 'products', 'page', 22, 1), +(6542, 'are', 'page', 22, 1), +(6543, 'most', 'page', 22, 1), +(6544, 'frequently', 'page', 22, 1), +(6545, 'contain', 'page', 22, 1), +(6546, 'detailed', 'page', 22, 1), +(6547, 'These', 'page', 22, 1), +(6548, 'include', 'page', 22, 2), +(6549, 'solutions', 'page', 22, 1), +(6550, 'wide', 'page', 22, 1), +(6551, 'range', 'page', 22, 1), +(6552, 'technical', 'page', 22, 1), +(6553, 'problems', 'page', 22, 1), +(6554, 'but', 'page', 22, 1), +(6555, 'also', 'page', 22, 1), +(6556, 'every', 'page', 22, 1), +(6557, 'aspect', 'page', 22, 1), +(6558, 'programming', 'page', 22, 1), +(6559, 'hardware', 'page', 22, 1), +(6560, 'software', 'page', 22, 2), +(6561, 'topics', 'page', 22, 1), +(6562, 'business', 'page', 22, 1), +(6563, 'concepts', 'page', 22, 1), +(6564, 'Another', 'page', 22, 1), +(6565, 'reason', 'page', 22, 1), +(6566, 'consider', 'page', 22, 1), +(6567, 'Base', 'page', 22, 1), +(6568, 'it', 'page', 22, 3), +(6569, 'often', 'page', 22, 1), +(6570, 'single', 'page', 22, 1), +(6571, 'entry', 'page', 22, 1), +(6572, 'point', 'page', 22, 1), +(6573, 'system', 'page', 22, 2), +(6574, 'very', 'page', 22, 1), +(6575, 'convenient', 'page', 22, 1), +(6576, 'feature', 'page', 22, 1), +(6577, 'remote', 'page', 22, 1), +(6578, 'clients', 'page', 22, 1), +(6579, 'who', 'page', 22, 2), +(6580, 'need', 'page', 22, 2), +(6581, 'select', 'page', 22, 1), +(6582, 'particular', 'page', 22, 2), +(6583, 'program', 'page', 22, 1), +(6584, 'download', 'page', 22, 1), +(6585, 'their', 'page', 22, 1), +(6586, 'computer', 'page', 22, 1), +(6587, 'or', 'page', 22, 1), +(6588, 'quickly', 'page', 22, 1), +(6589, 'learn', 'page', 22, 2), +(6590, 'how', 'page', 22, 2), +(6591, 'configure', 'page', 22, 1), +(6592, 'It', 'page', 22, 1), +(6593, 'particularly', 'page', 22, 1), +(6594, 'useful', 'page', 22, 1), +(6595, 'schools', 'page', 22, 1), +(6596, 'where', 'page', 22, 1), +(6597, 'users', 'page', 22, 1), +(6598, 'easily', 'page', 22, 1), +(6599, 'about', 'page', 22, 1), +(6600, 'application', 'page', 22, 1), +(6601, 'then', 'page', 22, 1), +(6602, 'use', 'page', 22, 1), +(6603, 'without', 'page', 22, 1), +(6604, 'having', 'page', 22, 1), +(6605, 'understand', 'page', 22, 1), +(6606, 'works', 'page', 22, 1), +(6607, 'Even', 'page', 22, 4), +(6608, 'Less', 'page', 22, 4), +(6609, 'Useful', 'page', 22, 4), +(6610, 'Lorem', 'page', 22, 2), +(6611, 'ipsum', 'page', 22, 2), +(6612, 'dolor', 'page', 22, 4), +(6613, 'sit', 'page', 22, 7), +(6614, 'amet', 'page', 22, 6), +(6615, 'consectetur', 'page', 22, 4), +(6616, 'adipiscing', 'page', 22, 3), +(6617, 'elit', 'page', 22, 3), +(6618, 'sed', 'page', 22, 5), +(6619, 'do', 'page', 22, 1), +(6620, 'eiusmod', 'page', 22, 1), +(6621, 'tempor', 'page', 22, 1), +(6622, 'incididunt', 'page', 22, 1), +(6623, 'ut', 'page', 22, 4), +(6624, 'labore', 'page', 22, 1), +(6625, 'et', 'page', 22, 2), +(6626, 'dolore', 'page', 22, 1), +(6627, 'magna', 'page', 22, 1), +(6628, 'aliqua', 'page', 22, 1), +(6629, 'Pellentesque', 'page', 22, 1), +(6630, 'porttitor', 'page', 22, 3), +(6631, 'eget', 'page', 22, 3), +(6632, 'morbi', 'page', 22, 5), +(6633, 'Nunc', 'page', 22, 1), +(6634, 'velit', 'page', 22, 1), +(6635, 'dignissim', 'page', 22, 3), +(6636, 'sodales', 'page', 22, 1), +(6637, 'eu', 'page', 22, 5), +(6638, 'sem', 'page', 22, 1), +(6639, 'integer', 'page', 22, 1), +(6640, 'Gravida', 'page', 22, 1), +(6641, 'cum', 'page', 22, 1), +(6642, 'sociis', 'page', 22, 1), +(6643, 'natoque', 'page', 22, 1), +(6644, 'penatibus', 'page', 22, 1), +(6645, 'magnis', 'page', 22, 1), +(6646, 'dis', 'page', 22, 1), +(6647, 'Proin', 'page', 22, 1), +(6648, 'libero', 'page', 22, 2), +(6649, 'enim', 'page', 22, 4), +(6650, 'faucibus', 'page', 22, 3), +(6651, 'turpis', 'page', 22, 1), +(6652, 'In', 'page', 22, 2), +(6653, 'fermentum', 'page', 22, 5), +(6654, 'posuere', 'page', 22, 2), +(6655, 'urna', 'page', 22, 3), +(6656, 'nec', 'page', 22, 1), +(6657, 'tincidunt', 'page', 22, 2), +(6658, 'praesent', 'page', 22, 1), +(6659, 'semper', 'page', 22, 1), +(6660, 'Varius', 'page', 22, 1), +(6661, 'duis', 'page', 22, 2), +(6662, 'lorem', 'page', 22, 2), +(6663, 'Placerat', 'page', 22, 1), +(6664, 'orci', 'page', 22, 4), +(6665, 'nulla', 'page', 22, 4), +(6666, 'pellentesque', 'page', 22, 2), +(6667, 'venenatis', 'page', 22, 1), +(6668, 'Integer', 'page', 22, 2), +(6669, 'feugiat', 'page', 22, 2), +(6670, 'scelerisque', 'page', 22, 3), +(6671, 'varius', 'page', 22, 4), +(6672, 'nunc', 'page', 22, 2), +(6673, 'Diam', 'page', 22, 1), +(6674, 'quam', 'page', 22, 5), +(6675, 'massa', 'page', 22, 2), +(6676, 'Dolor', 'page', 22, 1), +(6677, 'Tempus', 'page', 22, 1), +(6678, 'iaculis', 'page', 22, 2), +(6679, 'id', 'page', 22, 3), +(6680, 'volutpat', 'page', 22, 2), +(6681, 'Ac', 'page', 22, 1), +(6682, 'auctor', 'page', 22, 2), +(6683, 'augue', 'page', 22, 5), +(6684, 'mauris', 'page', 22, 4), +(6685, 'neque', 'page', 22, 3), +(6686, 'gravida', 'page', 22, 2), +(6687, 'Blandit', 'page', 22, 1), +(6688, 'cras', 'page', 22, 4), +(6689, 'ornare', 'page', 22, 1), +(6690, 'arcu', 'page', 22, 4), +(6691, 'mi', 'page', 22, 2), +(6692, 'bibendum', 'page', 22, 1), +(6693, 'egestas', 'page', 22, 3), +(6694, 'Non', 'page', 22, 1), +(6695, 'lacus', 'page', 22, 1), +(6696, 'suspendisse', 'page', 22, 3), +(6697, 'interdum', 'page', 22, 1), +(6698, 'Vivamus', 'page', 22, 1), +(6699, 'dictum', 'page', 22, 1), +(6700, 'Duis', 'page', 22, 1), +(6701, 'diam', 'page', 22, 4), +(6702, 'Egestas', 'page', 22, 1), +(6703, 'congue', 'page', 22, 1), +(6704, 'quisque', 'page', 22, 2), +(6705, 'cursus', 'page', 22, 1), +(6706, 'Quis', 'page', 22, 1), +(6707, 'viverra', 'page', 22, 2), +(6708, 'nibh', 'page', 22, 2), +(6709, 'pulvinar', 'page', 22, 3), +(6710, 'Hendrerit', 'page', 22, 1), +(6711, 'rutrum', 'page', 22, 2), +(6712, 'non', 'page', 22, 6), +(6713, 'tellus', 'page', 22, 5), +(6714, 'Metus', 'page', 22, 1), +(6715, 'vulputate', 'page', 22, 2), +(6716, 'felis', 'page', 22, 1), +(6717, 'imperdiet', 'page', 22, 2), +(6718, 'proin', 'page', 22, 2), +(6719, 'Nulla', 'page', 22, 1), +(6720, 'facilisi', 'page', 22, 2), +(6721, 'tempus', 'page', 22, 1), +(6722, 'Eget', 'page', 22, 2), +(6723, 'risus', 'page', 22, 1), +(6724, 'quis', 'page', 22, 1), +(6725, 'Quisque', 'page', 22, 1), +(6726, 'ac', 'page', 22, 2), +(6727, 'nullam', 'page', 22, 2), +(6728, 'nisi', 'page', 22, 2), +(6729, 'est', 'page', 22, 3), +(6730, 'Id', 'page', 22, 1), +(6731, 'vel', 'page', 22, 2), +(6732, 'elementum', 'page', 22, 1), +(6733, 'etiam', 'page', 22, 1), +(6734, 'Pretium', 'page', 22, 1), +(6735, 'potenti', 'page', 22, 1), +(6736, 'Aliquam', 'page', 22, 1), +(6737, 'maecenas', 'page', 22, 1), +(6738, 'ultricies', 'page', 22, 1), +(6739, 'Tellus', 'page', 22, 1), +(6740, 'tortor', 'page', 22, 1), +(6741, 'aliquam', 'page', 22, 1), +(6742, 'Facilisi', 'page', 22, 1), +(6743, 'odio', 'page', 22, 1), +(6744, 'Et', 'page', 22, 1), +(6745, 'sollicitudin', 'page', 22, 1), +(6746, 'phasellus', 'page', 22, 1), +(6747, 'Nullam', 'page', 22, 1), +(6748, 'Quam', 'page', 22, 1), +(6749, 'ante', 'page', 22, 1), +(6750, 'Nisi', 'page', 22, 1), +(6751, 'vitae', 'page', 22, 1), +(6752, 'suscipit', 'page', 22, 1), +(6753, 'Felis', 'page', 22, 1), +(6754, 'leo', 'page', 22, 1), +(6755, 'porta', 'page', 22, 1), +(6756, 'Conclusion', 'page', 22, 4), +(6757, 'I', 'page', 22, 1), +(6758, 'hope', 'page', 22, 1), +(6759, 'you', 'page', 22, 1), +(6760, 'enjoyed', 'page', 22, 1), +(6761, 'browsing', 'page', 22, 1), +(6762, 'almost', 'page', 22, 1), +(6763, 'pointless', 'page', 22, 1), +(6764, 'As', 'page', 22, 1), +(6765, 'reward', 'page', 22, 1), +(6766, 'check', 'page', 22, 1), +(6767, 'out', 'page', 22, 1), +(6768, 'sweet', 'page', 22, 1), +(6769, 'video', 'page', 22, 1), +(6770, 'Knowledge', 'page', 23, 43), +(6771, 'Base', 'page', 23, 41), +(6772, 'Structure', 'page', 23, 40), +(6773, 'Description', 'page', 23, 1), +(6774, 'An', 'page', 23, 5), +(6775, 'overview', 'page', 23, 1), +(6776, 'of', 'page', 23, 8), +(6777, 'providing', 'page', 23, 1), +(6778, 'the', 'page', 23, 7), +(6779, 'most', 'page', 23, 2), +(6780, 'efficient', 'page', 23, 1), +(6781, 'and', 'page', 23, 10), +(6782, 'supportive', 'page', 23, 1), +(6783, 'structure', 'page', 23, 1), +(6784, 'for', 'page', 23, 4), +(6785, 'needs', 'page', 23, 1), +(6786, 'this', 'page', 23, 4), +(6787, 'project', 'page', 23, 1), +(6788, 'Example', 'page', 23, 4), +(6789, 'Document', 'page', 23, 4), +(6790, 'Welcome', 'page', 23, 1), +(6791, 'This', 'page', 23, 2), +(6792, 'is', 'page', 23, 7), +(6793, 'a', 'page', 23, 11), +(6794, 'filler', 'page', 23, 1), +(6795, 'page', 'page', 23, 1), +(6796, 'to', 'page', 23, 13), +(6797, 'show', 'page', 23, 1), +(6798, 'off', 'page', 23, 1), +(6799, 'formatting', 'page', 23, 1), +(6800, 'BookStack', 'page', 23, 1), +(6801, 'documents', 'page', 23, 1), +(6802, ' ', 'page', 23, 1), +(6803, 'All', 'page', 23, 1), +(6804, 'content', 'page', 23, 1), +(6805, 'aside', 'page', 23, 2), +(6806, 'from', 'page', 23, 2), +(6807, 'description', 'page', 23, 1), +(6808, 'at', 'page', 23, 3), +(6809, 'top', 'page', 23, 1), +(6810, 'document', 'page', 23, 3), +(6811, 'unrelated', 'page', 23, 1), +(6812, 's', 'page', 23, 1), +(6813, 'actual', 'page', 23, 1), +(6814, 'purposes', 'page', 23, 2), +(6815, 'should', 'page', 23, 1), +(6816, 'not', 'page', 23, 1), +(6817, 'be', 'page', 23, 4), +(6818, 'used', 'page', 23, 3), +(6819, 'demonstrative', 'page', 23, 1), +(6820, 'Further', 'page', 23, 4), +(6821, 'Content', 'page', 23, 8), +(6822, 'The', 'page', 23, 1), +(6823, 'purpose', 'page', 23, 1), +(6824, 'knowledge', 'page', 23, 2), +(6825, 'base', 'page', 23, 4), +(6826, 'act', 'page', 23, 1), +(6827, 'as', 'page', 23, 2), +(6828, 'centralized', 'page', 23, 1), +(6829, 'organized', 'page', 23, 2), +(6830, 'platform', 'page', 23, 1), +(6831, 'access', 'page', 23, 1), +(6832, 'guides', 'page', 23, 4), +(6833, 'tutorials', 'page', 23, 1), +(6834, 'troubleshooting', 'page', 23, 1), +(6835, 'information', 'page', 23, 2), +(6836, 'other', 'page', 23, 2), +(6837, 'resources', 'page', 23, 1), +(6838, 'systems', 'page', 23, 3), +(6839, 'come', 'page', 23, 1), +(6840, 'in', 'page', 23, 6), +(6841, 'different', 'page', 23, 1), +(6842, 'flavors', 'page', 23, 1), +(6843, 'example', 'page', 23, 1), +(6844, 'there', 'page', 23, 1), +(6845, 'may', 'page', 23, 1), +(6846, 'number', 'page', 23, 1), +(6847, 'predefined', 'page', 23, 1), +(6848, 'modules', 'page', 23, 1), +(6849, 'that', 'page', 23, 2), +(6850, 'can', 'page', 23, 3), +(6851, 'added', 'page', 23, 1), +(6852, 'removed', 'page', 23, 1), +(6853, 'developed', 'page', 23, 1), +(6854, 'an', 'page', 23, 1), +(6855, 'integrated', 'page', 23, 1), +(6856, 'manner', 'page', 23, 1), +(6857, 'with', 'page', 23, 2), +(6858, 'products', 'page', 23, 1), +(6859, 'are', 'page', 23, 1), +(6860, 'frequently', 'page', 23, 1), +(6861, 'contain', 'page', 23, 1), +(6862, 'detailed', 'page', 23, 1), +(6863, 'These', 'page', 23, 1), +(6864, 'include', 'page', 23, 2), +(6865, 'solutions', 'page', 23, 1), +(6866, 'wide', 'page', 23, 1), +(6867, 'range', 'page', 23, 1), +(6868, 'technical', 'page', 23, 1), +(6869, 'problems', 'page', 23, 1), +(6870, 'but', 'page', 23, 1), +(6871, 'also', 'page', 23, 1), +(6872, 'on', 'page', 23, 1), +(6873, 'every', 'page', 23, 1), +(6874, 'aspect', 'page', 23, 1), +(6875, 'programming', 'page', 23, 1), +(6876, 'hardware', 'page', 23, 1), +(6877, 'software', 'page', 23, 2), +(6878, 'topics', 'page', 23, 1), +(6879, 'business', 'page', 23, 1), +(6880, 'concepts', 'page', 23, 1), +(6881, 'Another', 'page', 23, 1), +(6882, 'reason', 'page', 23, 1), +(6883, 'consider', 'page', 23, 1), +(6884, 'it', 'page', 23, 3), +(6885, 'often', 'page', 23, 1), +(6886, 'single', 'page', 23, 1), +(6887, 'entry', 'page', 23, 1), +(6888, 'point', 'page', 23, 1), +(6889, 'system', 'page', 23, 2), +(6890, 'very', 'page', 23, 1), +(6891, 'convenient', 'page', 23, 1), +(6892, 'feature', 'page', 23, 1), +(6893, 'remote', 'page', 23, 1), +(6894, 'clients', 'page', 23, 1), +(6895, 'who', 'page', 23, 2), +(6896, 'need', 'page', 23, 2), +(6897, 'select', 'page', 23, 1), +(6898, 'particular', 'page', 23, 2), +(6899, 'program', 'page', 23, 1), +(6900, 'download', 'page', 23, 1), +(6901, 'their', 'page', 23, 1), +(6902, 'computer', 'page', 23, 1), +(6903, 'or', 'page', 23, 1), +(6904, 'quickly', 'page', 23, 1), +(6905, 'learn', 'page', 23, 2), +(6906, 'how', 'page', 23, 2), +(6907, 'configure', 'page', 23, 1), +(6908, 'It', 'page', 23, 1), +(6909, 'particularly', 'page', 23, 1), +(6910, 'useful', 'page', 23, 1), +(6911, 'schools', 'page', 23, 1), +(6912, 'where', 'page', 23, 1), +(6913, 'users', 'page', 23, 1), +(6914, 'easily', 'page', 23, 1), +(6915, 'about', 'page', 23, 1), +(6916, 'application', 'page', 23, 1), +(6917, 'then', 'page', 23, 1), +(6918, 'use', 'page', 23, 1), +(6919, 'without', 'page', 23, 1), +(6920, 'having', 'page', 23, 1), +(6921, 'understand', 'page', 23, 1), +(6922, 'works', 'page', 23, 1), +(6923, 'Even', 'page', 23, 4), +(6924, 'Less', 'page', 23, 4), +(6925, 'Useful', 'page', 23, 4), +(6926, 'Lorem', 'page', 23, 2), +(6927, 'ipsum', 'page', 23, 2), +(6928, 'dolor', 'page', 23, 4), +(6929, 'sit', 'page', 23, 7), +(6930, 'amet', 'page', 23, 6), +(6931, 'consectetur', 'page', 23, 4), +(6932, 'adipiscing', 'page', 23, 3), +(6933, 'elit', 'page', 23, 3), +(6934, 'sed', 'page', 23, 5), +(6935, 'do', 'page', 23, 1), +(6936, 'eiusmod', 'page', 23, 1), +(6937, 'tempor', 'page', 23, 1), +(6938, 'incididunt', 'page', 23, 1), +(6939, 'ut', 'page', 23, 4), +(6940, 'labore', 'page', 23, 1), +(6941, 'et', 'page', 23, 2), +(6942, 'dolore', 'page', 23, 1), +(6943, 'magna', 'page', 23, 1), +(6944, 'aliqua', 'page', 23, 1), +(6945, 'Pellentesque', 'page', 23, 1), +(6946, 'porttitor', 'page', 23, 3), +(6947, 'eget', 'page', 23, 3), +(6948, 'morbi', 'page', 23, 5), +(6949, 'Nunc', 'page', 23, 1), +(6950, 'velit', 'page', 23, 1), +(6951, 'dignissim', 'page', 23, 3), +(6952, 'sodales', 'page', 23, 1), +(6953, 'eu', 'page', 23, 5), +(6954, 'sem', 'page', 23, 1), +(6955, 'integer', 'page', 23, 1), +(6956, 'Gravida', 'page', 23, 1), +(6957, 'cum', 'page', 23, 1), +(6958, 'sociis', 'page', 23, 1), +(6959, 'natoque', 'page', 23, 1), +(6960, 'penatibus', 'page', 23, 1), +(6961, 'magnis', 'page', 23, 1), +(6962, 'dis', 'page', 23, 1), +(6963, 'Proin', 'page', 23, 1), +(6964, 'libero', 'page', 23, 2), +(6965, 'enim', 'page', 23, 4), +(6966, 'faucibus', 'page', 23, 3), +(6967, 'turpis', 'page', 23, 1), +(6968, 'In', 'page', 23, 2), +(6969, 'fermentum', 'page', 23, 5), +(6970, 'posuere', 'page', 23, 2), +(6971, 'urna', 'page', 23, 3), +(6972, 'nec', 'page', 23, 1), +(6973, 'tincidunt', 'page', 23, 2), +(6974, 'praesent', 'page', 23, 1), +(6975, 'semper', 'page', 23, 1), +(6976, 'Varius', 'page', 23, 1), +(6977, 'duis', 'page', 23, 2), +(6978, 'lorem', 'page', 23, 2), +(6979, 'Placerat', 'page', 23, 1), +(6980, 'orci', 'page', 23, 4), +(6981, 'nulla', 'page', 23, 4), +(6982, 'pellentesque', 'page', 23, 2), +(6983, 'venenatis', 'page', 23, 1), +(6984, 'Integer', 'page', 23, 2), +(6985, 'feugiat', 'page', 23, 2), +(6986, 'scelerisque', 'page', 23, 3), +(6987, 'varius', 'page', 23, 4), +(6988, 'nunc', 'page', 23, 2), +(6989, 'Diam', 'page', 23, 1), +(6990, 'quam', 'page', 23, 5), +(6991, 'massa', 'page', 23, 2), +(6992, 'Dolor', 'page', 23, 1), +(6993, 'Tempus', 'page', 23, 1), +(6994, 'iaculis', 'page', 23, 2), +(6995, 'id', 'page', 23, 3), +(6996, 'volutpat', 'page', 23, 2), +(6997, 'Ac', 'page', 23, 1), +(6998, 'auctor', 'page', 23, 2), +(6999, 'augue', 'page', 23, 5), +(7000, 'mauris', 'page', 23, 4), +(7001, 'neque', 'page', 23, 3), +(7002, 'gravida', 'page', 23, 2), +(7003, 'Blandit', 'page', 23, 1), +(7004, 'cras', 'page', 23, 4), +(7005, 'ornare', 'page', 23, 1), +(7006, 'arcu', 'page', 23, 4), +(7007, 'mi', 'page', 23, 2), +(7008, 'bibendum', 'page', 23, 1), +(7009, 'egestas', 'page', 23, 3), +(7010, 'Non', 'page', 23, 1), +(7011, 'lacus', 'page', 23, 1), +(7012, 'suspendisse', 'page', 23, 3), +(7013, 'interdum', 'page', 23, 1), +(7014, 'Vivamus', 'page', 23, 1), +(7015, 'dictum', 'page', 23, 1), +(7016, 'Duis', 'page', 23, 1), +(7017, 'diam', 'page', 23, 4), +(7018, 'Egestas', 'page', 23, 1), +(7019, 'congue', 'page', 23, 1), +(7020, 'quisque', 'page', 23, 2), +(7021, 'cursus', 'page', 23, 1), +(7022, 'Quis', 'page', 23, 1), +(7023, 'viverra', 'page', 23, 2), +(7024, 'nibh', 'page', 23, 2), +(7025, 'pulvinar', 'page', 23, 3), +(7026, 'Hendrerit', 'page', 23, 1), +(7027, 'rutrum', 'page', 23, 2), +(7028, 'non', 'page', 23, 6), +(7029, 'tellus', 'page', 23, 5), +(7030, 'Metus', 'page', 23, 1), +(7031, 'vulputate', 'page', 23, 2), +(7032, 'felis', 'page', 23, 1), +(7033, 'imperdiet', 'page', 23, 2), +(7034, 'proin', 'page', 23, 2), +(7035, 'Nulla', 'page', 23, 1), +(7036, 'facilisi', 'page', 23, 2), +(7037, 'tempus', 'page', 23, 1), +(7038, 'Eget', 'page', 23, 2), +(7039, 'risus', 'page', 23, 1), +(7040, 'quis', 'page', 23, 1), +(7041, 'Quisque', 'page', 23, 1), +(7042, 'ac', 'page', 23, 2), +(7043, 'nullam', 'page', 23, 2), +(7044, 'nisi', 'page', 23, 2), +(7045, 'est', 'page', 23, 3), +(7046, 'Id', 'page', 23, 1), +(7047, 'vel', 'page', 23, 2), +(7048, 'elementum', 'page', 23, 1), +(7049, 'etiam', 'page', 23, 1), +(7050, 'Pretium', 'page', 23, 1), +(7051, 'potenti', 'page', 23, 1), +(7052, 'Aliquam', 'page', 23, 1), +(7053, 'maecenas', 'page', 23, 1), +(7054, 'ultricies', 'page', 23, 1), +(7055, 'Tellus', 'page', 23, 1), +(7056, 'tortor', 'page', 23, 1), +(7057, 'aliquam', 'page', 23, 1), +(7058, 'Facilisi', 'page', 23, 1), +(7059, 'odio', 'page', 23, 1), +(7060, 'Et', 'page', 23, 1), +(7061, 'sollicitudin', 'page', 23, 1), +(7062, 'phasellus', 'page', 23, 1), +(7063, 'Nullam', 'page', 23, 1), +(7064, 'Quam', 'page', 23, 1), +(7065, 'ante', 'page', 23, 1), +(7066, 'Nisi', 'page', 23, 1), +(7067, 'vitae', 'page', 23, 1), +(7068, 'suscipit', 'page', 23, 1), +(7069, 'Felis', 'page', 23, 1), +(7070, 'leo', 'page', 23, 1), +(7071, 'porta', 'page', 23, 1), +(7072, 'Conclusion', 'page', 23, 4), +(7073, 'I', 'page', 23, 1), +(7074, 'hope', 'page', 23, 1), +(7075, 'you', 'page', 23, 1), +(7076, 'enjoyed', 'page', 23, 1), +(7077, 'browsing', 'page', 23, 1), +(7078, 'almost', 'page', 23, 1), +(7079, 'pointless', 'page', 23, 1), +(7080, 'As', 'page', 23, 1), +(7081, 'reward', 'page', 23, 1), +(7082, 'check', 'page', 23, 1), +(7083, 'out', 'page', 23, 1), +(7084, 'sweet', 'page', 23, 1), +(7085, 'video', 'page', 23, 1), +(7086, 'BookStack', 'book', 13, 49), +(7087, 'Materials', 'book', 13, 1), +(7088, 'for', 'book', 13, 1), +(7089, 'utilizing', 'book', 13, 1), +(7090, 'to', 'book', 13, 1), +(7091, 'host', 'book', 13, 1), +(7092, 'a', 'book', 13, 1), +(7093, 'knowledge', 'book', 13, 1), +(7094, 'base', 'book', 13, 1), +(7095, 'Installation/Testing', 'page', 24, 40), +(7096, 'Description', 'page', 24, 1), +(7097, 'Resources', 'page', 24, 1), +(7098, 'for', 'page', 24, 5), +(7099, 'installing', 'page', 24, 1), +(7100, 'both', 'page', 24, 1), +(7101, 'local', 'page', 24, 1), +(7102, 'and', 'page', 24, 10), +(7103, 'external', 'page', 24, 1), +(7104, 'BookStack', 'page', 24, 2), +(7105, 'instances', 'page', 24, 1), +(7106, 'project', 'page', 24, 1), +(7107, 'use', 'page', 24, 2), +(7108, 'or', 'page', 24, 2), +(7109, 'testing', 'page', 24, 1), +(7110, 'An', 'page', 24, 4), +(7111, 'Example', 'page', 24, 4), +(7112, 'Document', 'page', 24, 4), +(7113, 'Welcome', 'page', 24, 1), +(7114, 'This', 'page', 24, 2), +(7115, 'is', 'page', 24, 7), +(7116, 'a', 'page', 24, 11), +(7117, 'filler', 'page', 24, 1), +(7118, 'page', 'page', 24, 1), +(7119, 'to', 'page', 24, 13), +(7120, 'show', 'page', 24, 1), +(7121, 'off', 'page', 24, 1), +(7122, 'the', 'page', 24, 5), +(7123, 'formatting', 'page', 24, 1), +(7124, 'of', 'page', 24, 6), +(7125, 'documents', 'page', 24, 1), +(7126, ' ', 'page', 24, 1), +(7127, 'All', 'page', 24, 1), +(7128, 'content', 'page', 24, 1), +(7129, 'aside', 'page', 24, 2), +(7130, 'from', 'page', 24, 2), +(7131, 'description', 'page', 24, 1), +(7132, 'at', 'page', 24, 3), +(7133, 'top', 'page', 24, 1), +(7134, 'this', 'page', 24, 3), +(7135, 'document', 'page', 24, 3), +(7136, 'unrelated', 'page', 24, 1), +(7137, 's', 'page', 24, 1), +(7138, 'actual', 'page', 24, 1), +(7139, 'purposes', 'page', 24, 2), +(7140, 'should', 'page', 24, 1), +(7141, 'not', 'page', 24, 1), +(7142, 'be', 'page', 24, 4), +(7143, 'used', 'page', 24, 3), +(7144, 'demonstrative', 'page', 24, 1), +(7145, 'Further', 'page', 24, 4), +(7146, 'Content', 'page', 24, 8), +(7147, 'The', 'page', 24, 1), +(7148, 'purpose', 'page', 24, 1), +(7149, 'knowledge', 'page', 24, 2), +(7150, 'base', 'page', 24, 4), +(7151, 'act', 'page', 24, 1), +(7152, 'as', 'page', 24, 2), +(7153, 'centralized', 'page', 24, 1), +(7154, 'organized', 'page', 24, 2), +(7155, 'platform', 'page', 24, 1), +(7156, 'access', 'page', 24, 1), +(7157, 'guides', 'page', 24, 4), +(7158, 'tutorials', 'page', 24, 1), +(7159, 'troubleshooting', 'page', 24, 1), +(7160, 'information', 'page', 24, 2), +(7161, 'other', 'page', 24, 2), +(7162, 'resources', 'page', 24, 1), +(7163, 'Knowledge', 'page', 24, 3), +(7164, 'systems', 'page', 24, 3), +(7165, 'come', 'page', 24, 1), +(7166, 'in', 'page', 24, 6), +(7167, 'different', 'page', 24, 1), +(7168, 'flavors', 'page', 24, 1), +(7169, 'example', 'page', 24, 1), +(7170, 'there', 'page', 24, 1), +(7171, 'may', 'page', 24, 1), +(7172, 'number', 'page', 24, 1), +(7173, 'predefined', 'page', 24, 1), +(7174, 'modules', 'page', 24, 1), +(7175, 'that', 'page', 24, 2), +(7176, 'can', 'page', 24, 3), +(7177, 'added', 'page', 24, 1), +(7178, 'removed', 'page', 24, 1), +(7179, 'developed', 'page', 24, 1), +(7180, 'an', 'page', 24, 1), +(7181, 'integrated', 'page', 24, 1), +(7182, 'manner', 'page', 24, 1), +(7183, 'with', 'page', 24, 2), +(7184, 'products', 'page', 24, 1), +(7185, 'are', 'page', 24, 1), +(7186, 'most', 'page', 24, 1), +(7187, 'frequently', 'page', 24, 1), +(7188, 'contain', 'page', 24, 1), +(7189, 'detailed', 'page', 24, 1), +(7190, 'These', 'page', 24, 1), +(7191, 'include', 'page', 24, 2), +(7192, 'solutions', 'page', 24, 1), +(7193, 'wide', 'page', 24, 1), +(7194, 'range', 'page', 24, 1), +(7195, 'technical', 'page', 24, 1), +(7196, 'problems', 'page', 24, 1), +(7197, 'but', 'page', 24, 1), +(7198, 'also', 'page', 24, 1), +(7199, 'on', 'page', 24, 1), +(7200, 'every', 'page', 24, 1), +(7201, 'aspect', 'page', 24, 1), +(7202, 'programming', 'page', 24, 1), +(7203, 'hardware', 'page', 24, 1), +(7204, 'software', 'page', 24, 2), +(7205, 'topics', 'page', 24, 1), +(7206, 'business', 'page', 24, 1), +(7207, 'concepts', 'page', 24, 1), +(7208, 'Another', 'page', 24, 1), +(7209, 'reason', 'page', 24, 1), +(7210, 'consider', 'page', 24, 1), +(7211, 'Base', 'page', 24, 1), +(7212, 'it', 'page', 24, 3), +(7213, 'often', 'page', 24, 1), +(7214, 'single', 'page', 24, 1), +(7215, 'entry', 'page', 24, 1), +(7216, 'point', 'page', 24, 1), +(7217, 'system', 'page', 24, 2), +(7218, 'very', 'page', 24, 1), +(7219, 'convenient', 'page', 24, 1), +(7220, 'feature', 'page', 24, 1), +(7221, 'remote', 'page', 24, 1), +(7222, 'clients', 'page', 24, 1), +(7223, 'who', 'page', 24, 2), +(7224, 'need', 'page', 24, 2), +(7225, 'select', 'page', 24, 1), +(7226, 'particular', 'page', 24, 2), +(7227, 'program', 'page', 24, 1), +(7228, 'download', 'page', 24, 1), +(7229, 'their', 'page', 24, 1), +(7230, 'computer', 'page', 24, 1), +(7231, 'quickly', 'page', 24, 1), +(7232, 'learn', 'page', 24, 2), +(7233, 'how', 'page', 24, 2), +(7234, 'configure', 'page', 24, 1), +(7235, 'It', 'page', 24, 1), +(7236, 'particularly', 'page', 24, 1), +(7237, 'useful', 'page', 24, 1), +(7238, 'schools', 'page', 24, 1), +(7239, 'where', 'page', 24, 1), +(7240, 'users', 'page', 24, 1), +(7241, 'easily', 'page', 24, 1), +(7242, 'about', 'page', 24, 1), +(7243, 'application', 'page', 24, 1), +(7244, 'then', 'page', 24, 1), +(7245, 'without', 'page', 24, 1), +(7246, 'having', 'page', 24, 1), +(7247, 'understand', 'page', 24, 1), +(7248, 'works', 'page', 24, 1), +(7249, 'Even', 'page', 24, 4), +(7250, 'Less', 'page', 24, 4), +(7251, 'Useful', 'page', 24, 4), +(7252, 'Lorem', 'page', 24, 2), +(7253, 'ipsum', 'page', 24, 2), +(7254, 'dolor', 'page', 24, 4), +(7255, 'sit', 'page', 24, 7), +(7256, 'amet', 'page', 24, 6), +(7257, 'consectetur', 'page', 24, 4), +(7258, 'adipiscing', 'page', 24, 3), +(7259, 'elit', 'page', 24, 3), +(7260, 'sed', 'page', 24, 5), +(7261, 'do', 'page', 24, 1), +(7262, 'eiusmod', 'page', 24, 1), +(7263, 'tempor', 'page', 24, 1), +(7264, 'incididunt', 'page', 24, 1), +(7265, 'ut', 'page', 24, 4), +(7266, 'labore', 'page', 24, 1), +(7267, 'et', 'page', 24, 2), +(7268, 'dolore', 'page', 24, 1), +(7269, 'magna', 'page', 24, 1), +(7270, 'aliqua', 'page', 24, 1), +(7271, 'Pellentesque', 'page', 24, 1), +(7272, 'porttitor', 'page', 24, 3), +(7273, 'eget', 'page', 24, 3), +(7274, 'morbi', 'page', 24, 5), +(7275, 'Nunc', 'page', 24, 1), +(7276, 'velit', 'page', 24, 1), +(7277, 'dignissim', 'page', 24, 3), +(7278, 'sodales', 'page', 24, 1), +(7279, 'eu', 'page', 24, 5), +(7280, 'sem', 'page', 24, 1), +(7281, 'integer', 'page', 24, 1), +(7282, 'Gravida', 'page', 24, 1), +(7283, 'cum', 'page', 24, 1), +(7284, 'sociis', 'page', 24, 1), +(7285, 'natoque', 'page', 24, 1), +(7286, 'penatibus', 'page', 24, 1), +(7287, 'magnis', 'page', 24, 1), +(7288, 'dis', 'page', 24, 1), +(7289, 'Proin', 'page', 24, 1), +(7290, 'libero', 'page', 24, 2), +(7291, 'enim', 'page', 24, 4), +(7292, 'faucibus', 'page', 24, 3), +(7293, 'turpis', 'page', 24, 1), +(7294, 'In', 'page', 24, 2), +(7295, 'fermentum', 'page', 24, 5), +(7296, 'posuere', 'page', 24, 2), +(7297, 'urna', 'page', 24, 3), +(7298, 'nec', 'page', 24, 1), +(7299, 'tincidunt', 'page', 24, 2), +(7300, 'praesent', 'page', 24, 1), +(7301, 'semper', 'page', 24, 1), +(7302, 'Varius', 'page', 24, 1), +(7303, 'duis', 'page', 24, 2), +(7304, 'lorem', 'page', 24, 2), +(7305, 'Placerat', 'page', 24, 1), +(7306, 'orci', 'page', 24, 4), +(7307, 'nulla', 'page', 24, 4), +(7308, 'pellentesque', 'page', 24, 2), +(7309, 'venenatis', 'page', 24, 1), +(7310, 'Integer', 'page', 24, 2), +(7311, 'feugiat', 'page', 24, 2), +(7312, 'scelerisque', 'page', 24, 3), +(7313, 'varius', 'page', 24, 4), +(7314, 'nunc', 'page', 24, 2), +(7315, 'Diam', 'page', 24, 1), +(7316, 'quam', 'page', 24, 5), +(7317, 'massa', 'page', 24, 2), +(7318, 'Dolor', 'page', 24, 1), +(7319, 'Tempus', 'page', 24, 1), +(7320, 'iaculis', 'page', 24, 2), +(7321, 'id', 'page', 24, 3), +(7322, 'volutpat', 'page', 24, 2), +(7323, 'Ac', 'page', 24, 1), +(7324, 'auctor', 'page', 24, 2), +(7325, 'augue', 'page', 24, 5), +(7326, 'mauris', 'page', 24, 4), +(7327, 'neque', 'page', 24, 3), +(7328, 'gravida', 'page', 24, 2), +(7329, 'Blandit', 'page', 24, 1), +(7330, 'cras', 'page', 24, 4), +(7331, 'ornare', 'page', 24, 1), +(7332, 'arcu', 'page', 24, 4), +(7333, 'mi', 'page', 24, 2), +(7334, 'bibendum', 'page', 24, 1), +(7335, 'egestas', 'page', 24, 3), +(7336, 'Non', 'page', 24, 1), +(7337, 'lacus', 'page', 24, 1), +(7338, 'suspendisse', 'page', 24, 3), +(7339, 'interdum', 'page', 24, 1), +(7340, 'Vivamus', 'page', 24, 1), +(7341, 'dictum', 'page', 24, 1), +(7342, 'Duis', 'page', 24, 1), +(7343, 'diam', 'page', 24, 4), +(7344, 'Egestas', 'page', 24, 1), +(7345, 'congue', 'page', 24, 1), +(7346, 'quisque', 'page', 24, 2), +(7347, 'cursus', 'page', 24, 1), +(7348, 'Quis', 'page', 24, 1), +(7349, 'viverra', 'page', 24, 2), +(7350, 'nibh', 'page', 24, 2), +(7351, 'pulvinar', 'page', 24, 3), +(7352, 'Hendrerit', 'page', 24, 1), +(7353, 'rutrum', 'page', 24, 2), +(7354, 'non', 'page', 24, 6), +(7355, 'tellus', 'page', 24, 5), +(7356, 'Metus', 'page', 24, 1), +(7357, 'vulputate', 'page', 24, 2), +(7358, 'felis', 'page', 24, 1), +(7359, 'imperdiet', 'page', 24, 2), +(7360, 'proin', 'page', 24, 2), +(7361, 'Nulla', 'page', 24, 1), +(7362, 'facilisi', 'page', 24, 2), +(7363, 'tempus', 'page', 24, 1), +(7364, 'Eget', 'page', 24, 2), +(7365, 'risus', 'page', 24, 1), +(7366, 'quis', 'page', 24, 1), +(7367, 'Quisque', 'page', 24, 1), +(7368, 'ac', 'page', 24, 2), +(7369, 'nullam', 'page', 24, 2), +(7370, 'nisi', 'page', 24, 2), +(7371, 'est', 'page', 24, 3), +(7372, 'Id', 'page', 24, 1), +(7373, 'vel', 'page', 24, 2), +(7374, 'elementum', 'page', 24, 1), +(7375, 'etiam', 'page', 24, 1), +(7376, 'Pretium', 'page', 24, 1), +(7377, 'potenti', 'page', 24, 1), +(7378, 'Aliquam', 'page', 24, 1), +(7379, 'maecenas', 'page', 24, 1), +(7380, 'ultricies', 'page', 24, 1), +(7381, 'Tellus', 'page', 24, 1), +(7382, 'tortor', 'page', 24, 1), +(7383, 'aliquam', 'page', 24, 1), +(7384, 'Facilisi', 'page', 24, 1), +(7385, 'odio', 'page', 24, 1), +(7386, 'Et', 'page', 24, 1), +(7387, 'sollicitudin', 'page', 24, 1), +(7388, 'phasellus', 'page', 24, 1), +(7389, 'Nullam', 'page', 24, 1), +(7390, 'Quam', 'page', 24, 1), +(7391, 'ante', 'page', 24, 1), +(7392, 'Nisi', 'page', 24, 1), +(7393, 'vitae', 'page', 24, 1), +(7394, 'suscipit', 'page', 24, 1), +(7395, 'Felis', 'page', 24, 1), +(7396, 'leo', 'page', 24, 1), +(7397, 'porta', 'page', 24, 1), +(7398, 'Conclusion', 'page', 24, 4), +(7399, 'I', 'page', 24, 1), +(7400, 'hope', 'page', 24, 1), +(7401, 'you', 'page', 24, 1), +(7402, 'enjoyed', 'page', 24, 1), +(7403, 'browsing', 'page', 24, 1), +(7404, 'almost', 'page', 24, 1), +(7405, 'pointless', 'page', 24, 1), +(7406, 'As', 'page', 24, 1), +(7407, 'reward', 'page', 24, 1), +(7408, 'check', 'page', 24, 1), +(7409, 'out', 'page', 24, 1), +(7410, 'sweet', 'page', 24, 1), +(7411, 'video', 'page', 24, 1), +(7412, 'Hosting', 'page', 25, 40), +(7413, 'Description', 'page', 25, 1), +(7414, 'Resources', 'page', 25, 1), +(7415, 'related', 'page', 25, 1), +(7416, 'to', 'page', 25, 14), +(7417, 'hosting', 'page', 25, 1), +(7418, 'platforms', 'page', 25, 1), +(7419, 'that', 'page', 25, 3), +(7420, 'could', 'page', 25, 1), +(7421, 'viably', 'page', 25, 1), +(7422, 'be', 'page', 25, 5), +(7423, 'utilized', 'page', 25, 1), +(7424, 'for', 'page', 25, 4), +(7425, 'this', 'page', 25, 4), +(7426, 'project', 'page', 25, 1), +(7427, 's', 'page', 25, 2), +(7428, 'BookStack', 'page', 25, 2), +(7429, 'knowledge', 'page', 25, 3), +(7430, 'base', 'page', 25, 5), +(7431, 'An', 'page', 25, 4), +(7432, 'Example', 'page', 25, 4), +(7433, 'Document', 'page', 25, 4), +(7434, 'Welcome', 'page', 25, 1), +(7435, 'This', 'page', 25, 2), +(7436, 'is', 'page', 25, 7), +(7437, 'a', 'page', 25, 11), +(7438, 'filler', 'page', 25, 1), +(7439, 'page', 'page', 25, 1), +(7440, 'show', 'page', 25, 1), +(7441, 'off', 'page', 25, 1), +(7442, 'the', 'page', 25, 5), +(7443, 'formatting', 'page', 25, 1), +(7444, 'of', 'page', 25, 6), +(7445, 'documents', 'page', 25, 1), +(7446, ' ', 'page', 25, 1), +(7447, 'All', 'page', 25, 1), +(7448, 'content', 'page', 25, 1), +(7449, 'aside', 'page', 25, 2), +(7450, 'from', 'page', 25, 2), +(7451, 'description', 'page', 25, 1), +(7452, 'at', 'page', 25, 3), +(7453, 'top', 'page', 25, 1), +(7454, 'document', 'page', 25, 3), +(7455, 'unrelated', 'page', 25, 1), +(7456, 'actual', 'page', 25, 1), +(7457, 'purposes', 'page', 25, 2), +(7458, 'and', 'page', 25, 9), +(7459, 'should', 'page', 25, 1), +(7460, 'not', 'page', 25, 1), +(7461, 'used', 'page', 25, 3), +(7462, 'demonstrative', 'page', 25, 1), +(7463, 'Further', 'page', 25, 4), +(7464, 'Content', 'page', 25, 8), +(7465, 'The', 'page', 25, 1), +(7466, 'purpose', 'page', 25, 1), +(7467, 'act', 'page', 25, 1), +(7468, 'as', 'page', 25, 2), +(7469, 'centralized', 'page', 25, 1), +(7470, 'organized', 'page', 25, 2), +(7471, 'platform', 'page', 25, 1), +(7472, 'access', 'page', 25, 1), +(7473, 'guides', 'page', 25, 4), +(7474, 'tutorials', 'page', 25, 1), +(7475, 'troubleshooting', 'page', 25, 1), +(7476, 'information', 'page', 25, 2), +(7477, 'other', 'page', 25, 2), +(7478, 'resources', 'page', 25, 1), +(7479, 'Knowledge', 'page', 25, 3), +(7480, 'systems', 'page', 25, 3), +(7481, 'come', 'page', 25, 1), +(7482, 'in', 'page', 25, 6), +(7483, 'different', 'page', 25, 1), +(7484, 'flavors', 'page', 25, 1), +(7485, 'example', 'page', 25, 1), +(7486, 'there', 'page', 25, 1), +(7487, 'may', 'page', 25, 1), +(7488, 'number', 'page', 25, 1), +(7489, 'predefined', 'page', 25, 1), +(7490, 'modules', 'page', 25, 1), +(7491, 'can', 'page', 25, 3), +(7492, 'added', 'page', 25, 1), +(7493, 'removed', 'page', 25, 1), +(7494, 'developed', 'page', 25, 1), +(7495, 'an', 'page', 25, 1), +(7496, 'integrated', 'page', 25, 1), +(7497, 'manner', 'page', 25, 1), +(7498, 'with', 'page', 25, 2), +(7499, 'products', 'page', 25, 1), +(7500, 'are', 'page', 25, 1), +(7501, 'most', 'page', 25, 1), +(7502, 'frequently', 'page', 25, 1), +(7503, 'contain', 'page', 25, 1), +(7504, 'detailed', 'page', 25, 1), +(7505, 'These', 'page', 25, 1), +(7506, 'include', 'page', 25, 2), +(7507, 'solutions', 'page', 25, 1), +(7508, 'wide', 'page', 25, 1), +(7509, 'range', 'page', 25, 1), +(7510, 'technical', 'page', 25, 1), +(7511, 'problems', 'page', 25, 1), +(7512, 'but', 'page', 25, 1), +(7513, 'also', 'page', 25, 1), +(7514, 'on', 'page', 25, 1), +(7515, 'every', 'page', 25, 1), +(7516, 'aspect', 'page', 25, 1), +(7517, 'programming', 'page', 25, 1), +(7518, 'hardware', 'page', 25, 1), +(7519, 'software', 'page', 25, 2), +(7520, 'topics', 'page', 25, 1), +(7521, 'business', 'page', 25, 1), +(7522, 'concepts', 'page', 25, 1), +(7523, 'Another', 'page', 25, 1), +(7524, 'reason', 'page', 25, 1), +(7525, 'consider', 'page', 25, 1), +(7526, 'Base', 'page', 25, 1), +(7527, 'it', 'page', 25, 3), +(7528, 'often', 'page', 25, 1), +(7529, 'single', 'page', 25, 1), +(7530, 'entry', 'page', 25, 1), +(7531, 'point', 'page', 25, 1), +(7532, 'system', 'page', 25, 2), +(7533, 'very', 'page', 25, 1), +(7534, 'convenient', 'page', 25, 1), +(7535, 'feature', 'page', 25, 1), +(7536, 'remote', 'page', 25, 1), +(7537, 'clients', 'page', 25, 1), +(7538, 'who', 'page', 25, 2), +(7539, 'need', 'page', 25, 2), +(7540, 'select', 'page', 25, 1), +(7541, 'particular', 'page', 25, 2), +(7542, 'program', 'page', 25, 1), +(7543, 'download', 'page', 25, 1), +(7544, 'their', 'page', 25, 1), +(7545, 'computer', 'page', 25, 1), +(7546, 'or', 'page', 25, 1), +(7547, 'quickly', 'page', 25, 1), +(7548, 'learn', 'page', 25, 2), +(7549, 'how', 'page', 25, 2), +(7550, 'configure', 'page', 25, 1), +(7551, 'It', 'page', 25, 1), +(7552, 'particularly', 'page', 25, 1), +(7553, 'useful', 'page', 25, 1), +(7554, 'schools', 'page', 25, 1), +(7555, 'where', 'page', 25, 1), +(7556, 'users', 'page', 25, 1), +(7557, 'easily', 'page', 25, 1), +(7558, 'about', 'page', 25, 1), +(7559, 'application', 'page', 25, 1), +(7560, 'then', 'page', 25, 1), +(7561, 'use', 'page', 25, 1), +(7562, 'without', 'page', 25, 1), +(7563, 'having', 'page', 25, 1), +(7564, 'understand', 'page', 25, 1), +(7565, 'works', 'page', 25, 1), +(7566, 'Even', 'page', 25, 4), +(7567, 'Less', 'page', 25, 4), +(7568, 'Useful', 'page', 25, 4), +(7569, 'Lorem', 'page', 25, 2), +(7570, 'ipsum', 'page', 25, 2), +(7571, 'dolor', 'page', 25, 4), +(7572, 'sit', 'page', 25, 7), +(7573, 'amet', 'page', 25, 6), +(7574, 'consectetur', 'page', 25, 4), +(7575, 'adipiscing', 'page', 25, 3), +(7576, 'elit', 'page', 25, 3), +(7577, 'sed', 'page', 25, 5), +(7578, 'do', 'page', 25, 1), +(7579, 'eiusmod', 'page', 25, 1), +(7580, 'tempor', 'page', 25, 1), +(7581, 'incididunt', 'page', 25, 1), +(7582, 'ut', 'page', 25, 4), +(7583, 'labore', 'page', 25, 1), +(7584, 'et', 'page', 25, 2), +(7585, 'dolore', 'page', 25, 1), +(7586, 'magna', 'page', 25, 1), +(7587, 'aliqua', 'page', 25, 1), +(7588, 'Pellentesque', 'page', 25, 1), +(7589, 'porttitor', 'page', 25, 3), +(7590, 'eget', 'page', 25, 3), +(7591, 'morbi', 'page', 25, 5), +(7592, 'Nunc', 'page', 25, 1), +(7593, 'velit', 'page', 25, 1), +(7594, 'dignissim', 'page', 25, 3), +(7595, 'sodales', 'page', 25, 1), +(7596, 'eu', 'page', 25, 5), +(7597, 'sem', 'page', 25, 1), +(7598, 'integer', 'page', 25, 1), +(7599, 'Gravida', 'page', 25, 1), +(7600, 'cum', 'page', 25, 1), +(7601, 'sociis', 'page', 25, 1), +(7602, 'natoque', 'page', 25, 1), +(7603, 'penatibus', 'page', 25, 1), +(7604, 'magnis', 'page', 25, 1), +(7605, 'dis', 'page', 25, 1), +(7606, 'Proin', 'page', 25, 1), +(7607, 'libero', 'page', 25, 2), +(7608, 'enim', 'page', 25, 4), +(7609, 'faucibus', 'page', 25, 3), +(7610, 'turpis', 'page', 25, 1), +(7611, 'In', 'page', 25, 2), +(7612, 'fermentum', 'page', 25, 5), +(7613, 'posuere', 'page', 25, 2), +(7614, 'urna', 'page', 25, 3), +(7615, 'nec', 'page', 25, 1), +(7616, 'tincidunt', 'page', 25, 2), +(7617, 'praesent', 'page', 25, 1), +(7618, 'semper', 'page', 25, 1), +(7619, 'Varius', 'page', 25, 1), +(7620, 'duis', 'page', 25, 2), +(7621, 'lorem', 'page', 25, 2), +(7622, 'Placerat', 'page', 25, 1), +(7623, 'orci', 'page', 25, 4), +(7624, 'nulla', 'page', 25, 4), +(7625, 'pellentesque', 'page', 25, 2), +(7626, 'venenatis', 'page', 25, 1), +(7627, 'Integer', 'page', 25, 2), +(7628, 'feugiat', 'page', 25, 2), +(7629, 'scelerisque', 'page', 25, 3), +(7630, 'varius', 'page', 25, 4), +(7631, 'nunc', 'page', 25, 2), +(7632, 'Diam', 'page', 25, 1), +(7633, 'quam', 'page', 25, 5), +(7634, 'massa', 'page', 25, 2), +(7635, 'Dolor', 'page', 25, 1), +(7636, 'Tempus', 'page', 25, 1), +(7637, 'iaculis', 'page', 25, 2), +(7638, 'id', 'page', 25, 3), +(7639, 'volutpat', 'page', 25, 2), +(7640, 'Ac', 'page', 25, 1), +(7641, 'auctor', 'page', 25, 2), +(7642, 'augue', 'page', 25, 5), +(7643, 'mauris', 'page', 25, 4), +(7644, 'neque', 'page', 25, 3), +(7645, 'gravida', 'page', 25, 2), +(7646, 'Blandit', 'page', 25, 1), +(7647, 'cras', 'page', 25, 4), +(7648, 'ornare', 'page', 25, 1), +(7649, 'arcu', 'page', 25, 4), +(7650, 'mi', 'page', 25, 2), +(7651, 'bibendum', 'page', 25, 1), +(7652, 'egestas', 'page', 25, 3), +(7653, 'Non', 'page', 25, 1), +(7654, 'lacus', 'page', 25, 1), +(7655, 'suspendisse', 'page', 25, 3), +(7656, 'interdum', 'page', 25, 1), +(7657, 'Vivamus', 'page', 25, 1), +(7658, 'dictum', 'page', 25, 1), +(7659, 'Duis', 'page', 25, 1), +(7660, 'diam', 'page', 25, 4), +(7661, 'Egestas', 'page', 25, 1), +(7662, 'congue', 'page', 25, 1), +(7663, 'quisque', 'page', 25, 2), +(7664, 'cursus', 'page', 25, 1), +(7665, 'Quis', 'page', 25, 1), +(7666, 'viverra', 'page', 25, 2), +(7667, 'nibh', 'page', 25, 2), +(7668, 'pulvinar', 'page', 25, 3), +(7669, 'Hendrerit', 'page', 25, 1), +(7670, 'rutrum', 'page', 25, 2), +(7671, 'non', 'page', 25, 6), +(7672, 'tellus', 'page', 25, 5), +(7673, 'Metus', 'page', 25, 1), +(7674, 'vulputate', 'page', 25, 2), +(7675, 'felis', 'page', 25, 1), +(7676, 'imperdiet', 'page', 25, 2), +(7677, 'proin', 'page', 25, 2), +(7678, 'Nulla', 'page', 25, 1), +(7679, 'facilisi', 'page', 25, 2), +(7680, 'tempus', 'page', 25, 1), +(7681, 'Eget', 'page', 25, 2), +(7682, 'risus', 'page', 25, 1), +(7683, 'quis', 'page', 25, 1), +(7684, 'Quisque', 'page', 25, 1), +(7685, 'ac', 'page', 25, 2), +(7686, 'nullam', 'page', 25, 2), +(7687, 'nisi', 'page', 25, 2), +(7688, 'est', 'page', 25, 3), +(7689, 'Id', 'page', 25, 1), +(7690, 'vel', 'page', 25, 2), +(7691, 'elementum', 'page', 25, 1), +(7692, 'etiam', 'page', 25, 1); +INSERT INTO `search_terms` (`id`, `term`, `entity_type`, `entity_id`, `score`) VALUES +(7693, 'Pretium', 'page', 25, 1), +(7694, 'potenti', 'page', 25, 1), +(7695, 'Aliquam', 'page', 25, 1), +(7696, 'maecenas', 'page', 25, 1), +(7697, 'ultricies', 'page', 25, 1), +(7698, 'Tellus', 'page', 25, 1), +(7699, 'tortor', 'page', 25, 1), +(7700, 'aliquam', 'page', 25, 1), +(7701, 'Facilisi', 'page', 25, 1), +(7702, 'odio', 'page', 25, 1), +(7703, 'Et', 'page', 25, 1), +(7704, 'sollicitudin', 'page', 25, 1), +(7705, 'phasellus', 'page', 25, 1), +(7706, 'Nullam', 'page', 25, 1), +(7707, 'Quam', 'page', 25, 1), +(7708, 'ante', 'page', 25, 1), +(7709, 'Nisi', 'page', 25, 1), +(7710, 'vitae', 'page', 25, 1), +(7711, 'suscipit', 'page', 25, 1), +(7712, 'Felis', 'page', 25, 1), +(7713, 'leo', 'page', 25, 1), +(7714, 'porta', 'page', 25, 1), +(7715, 'Conclusion', 'page', 25, 4), +(7716, 'I', 'page', 25, 1), +(7717, 'hope', 'page', 25, 1), +(7718, 'you', 'page', 25, 1), +(7719, 'enjoyed', 'page', 25, 1), +(7720, 'browsing', 'page', 25, 1), +(7721, 'almost', 'page', 25, 1), +(7722, 'pointless', 'page', 25, 1), +(7723, 'As', 'page', 25, 1), +(7724, 'reward', 'page', 25, 1), +(7725, 'check', 'page', 25, 1), +(7726, 'out', 'page', 25, 1), +(7727, 'sweet', 'page', 25, 1), +(7728, 'video', 'page', 25, 1), +(7729, 'Guides', 'bookshelf', 9, 49), +(7730, 'for', 'bookshelf', 9, 48), +(7731, 'New', 'bookshelf', 9, 48), +(7732, 'Members', 'bookshelf', 9, 48), +(7733, 'designed', 'bookshelf', 9, 1), +(7734, 'to', 'bookshelf', 9, 2), +(7735, 'help', 'bookshelf', 9, 1), +(7736, 'new', 'bookshelf', 9, 1), +(7737, 'members', 'bookshelf', 9, 1), +(7738, 'settle', 'bookshelf', 9, 1), +(7739, 'into', 'bookshelf', 9, 1), +(7740, 'their', 'bookshelf', 9, 1), +(7741, 'roles', 'bookshelf', 9, 1), +(7742, 'and', 'bookshelf', 9, 1), +(7743, 'begin', 'bookshelf', 9, 1), +(7744, 'contributing', 'bookshelf', 9, 1), +(7745, 'the', 'bookshelf', 9, 1), +(7746, 'project', 'bookshelf', 9, 1), +(7747, 'GitHub', 'book', 14, 49), +(7748, 'Information', 'book', 14, 1), +(7749, 'on', 'book', 14, 1), +(7750, 'use', 'book', 14, 1), +(7751, 'within', 'book', 14, 1), +(7752, 'the', 'book', 14, 1), +(7753, 'company', 'book', 14, 1), +(7754, 'and', 'book', 14, 1), +(7755, 'project', 'book', 14, 1), +(7756, 'GitHub', 'chapter', 3, 49), +(7757, 'Tutorials', 'chapter', 3, 49), +(7758, 'on', 'chapter', 3, 1), +(7759, 'getting', 'chapter', 3, 1), +(7760, 'started', 'chapter', 3, 1), +(7761, 'with', 'chapter', 3, 1), +(7762, 'Navigating', 'page', 26, 40), +(7763, 'Description', 'page', 26, 1), +(7764, 'Tutorial', 'page', 26, 1), +(7765, 'on', 'page', 26, 2), +(7766, 'navigating', 'page', 26, 1), +(7767, 'the', 'page', 26, 6), +(7768, 'Thoth', 'page', 26, 1), +(7769, 'repository', 'page', 26, 1), +(7770, 'An', 'page', 26, 4), +(7771, 'Example', 'page', 26, 4), +(7772, 'Document', 'page', 26, 4), +(7773, 'Welcome', 'page', 26, 1), +(7774, 'This', 'page', 26, 2), +(7775, 'is', 'page', 26, 7), +(7776, 'a', 'page', 26, 11), +(7777, 'filler', 'page', 26, 1), +(7778, 'page', 'page', 26, 1), +(7779, 'to', 'page', 26, 13), +(7780, 'show', 'page', 26, 1), +(7781, 'off', 'page', 26, 1), +(7782, 'formatting', 'page', 26, 1), +(7783, 'of', 'page', 26, 6), +(7784, 'BookStack', 'page', 26, 1), +(7785, 'documents', 'page', 26, 1), +(7786, ' ', 'page', 26, 1), +(7787, 'All', 'page', 26, 1), +(7788, 'content', 'page', 26, 1), +(7789, 'aside', 'page', 26, 2), +(7790, 'from', 'page', 26, 2), +(7791, 'description', 'page', 26, 1), +(7792, 'at', 'page', 26, 3), +(7793, 'top', 'page', 26, 1), +(7794, 'this', 'page', 26, 3), +(7795, 'document', 'page', 26, 3), +(7796, 'unrelated', 'page', 26, 1), +(7797, 's', 'page', 26, 1), +(7798, 'actual', 'page', 26, 1), +(7799, 'purposes', 'page', 26, 2), +(7800, 'and', 'page', 26, 9), +(7801, 'should', 'page', 26, 1), +(7802, 'not', 'page', 26, 1), +(7803, 'be', 'page', 26, 4), +(7804, 'used', 'page', 26, 3), +(7805, 'demonstrative', 'page', 26, 1), +(7806, 'Further', 'page', 26, 4), +(7807, 'Content', 'page', 26, 8), +(7808, 'The', 'page', 26, 1), +(7809, 'purpose', 'page', 26, 1), +(7810, 'knowledge', 'page', 26, 2), +(7811, 'base', 'page', 26, 4), +(7812, 'act', 'page', 26, 1), +(7813, 'as', 'page', 26, 2), +(7814, 'centralized', 'page', 26, 1), +(7815, 'organized', 'page', 26, 2), +(7816, 'platform', 'page', 26, 1), +(7817, 'access', 'page', 26, 1), +(7818, 'guides', 'page', 26, 4), +(7819, 'tutorials', 'page', 26, 1), +(7820, 'troubleshooting', 'page', 26, 1), +(7821, 'information', 'page', 26, 2), +(7822, 'other', 'page', 26, 2), +(7823, 'resources', 'page', 26, 1), +(7824, 'Knowledge', 'page', 26, 3), +(7825, 'systems', 'page', 26, 3), +(7826, 'come', 'page', 26, 1), +(7827, 'in', 'page', 26, 6), +(7828, 'different', 'page', 26, 1), +(7829, 'flavors', 'page', 26, 1), +(7830, 'for', 'page', 26, 3), +(7831, 'example', 'page', 26, 1), +(7832, 'there', 'page', 26, 1), +(7833, 'may', 'page', 26, 1), +(7834, 'number', 'page', 26, 1), +(7835, 'predefined', 'page', 26, 1), +(7836, 'modules', 'page', 26, 1), +(7837, 'that', 'page', 26, 2), +(7838, 'can', 'page', 26, 3), +(7839, 'added', 'page', 26, 1), +(7840, 'removed', 'page', 26, 1), +(7841, 'developed', 'page', 26, 1), +(7842, 'an', 'page', 26, 1), +(7843, 'integrated', 'page', 26, 1), +(7844, 'manner', 'page', 26, 1), +(7845, 'with', 'page', 26, 2), +(7846, 'products', 'page', 26, 1), +(7847, 'are', 'page', 26, 1), +(7848, 'most', 'page', 26, 1), +(7849, 'frequently', 'page', 26, 1), +(7850, 'contain', 'page', 26, 1), +(7851, 'detailed', 'page', 26, 1), +(7852, 'These', 'page', 26, 1), +(7853, 'include', 'page', 26, 2), +(7854, 'solutions', 'page', 26, 1), +(7855, 'wide', 'page', 26, 1), +(7856, 'range', 'page', 26, 1), +(7857, 'technical', 'page', 26, 1), +(7858, 'problems', 'page', 26, 1), +(7859, 'but', 'page', 26, 1), +(7860, 'also', 'page', 26, 1), +(7861, 'every', 'page', 26, 1), +(7862, 'aspect', 'page', 26, 1), +(7863, 'programming', 'page', 26, 1), +(7864, 'hardware', 'page', 26, 1), +(7865, 'software', 'page', 26, 2), +(7866, 'topics', 'page', 26, 1), +(7867, 'business', 'page', 26, 1), +(7868, 'concepts', 'page', 26, 1), +(7869, 'Another', 'page', 26, 1), +(7870, 'reason', 'page', 26, 1), +(7871, 'consider', 'page', 26, 1), +(7872, 'Base', 'page', 26, 1), +(7873, 'it', 'page', 26, 3), +(7874, 'often', 'page', 26, 1), +(7875, 'single', 'page', 26, 1), +(7876, 'entry', 'page', 26, 1), +(7877, 'point', 'page', 26, 1), +(7878, 'system', 'page', 26, 2), +(7879, 'very', 'page', 26, 1), +(7880, 'convenient', 'page', 26, 1), +(7881, 'feature', 'page', 26, 1), +(7882, 'remote', 'page', 26, 1), +(7883, 'clients', 'page', 26, 1), +(7884, 'who', 'page', 26, 2), +(7885, 'need', 'page', 26, 2), +(7886, 'select', 'page', 26, 1), +(7887, 'particular', 'page', 26, 2), +(7888, 'program', 'page', 26, 1), +(7889, 'download', 'page', 26, 1), +(7890, 'their', 'page', 26, 1), +(7891, 'computer', 'page', 26, 1), +(7892, 'or', 'page', 26, 1), +(7893, 'quickly', 'page', 26, 1), +(7894, 'learn', 'page', 26, 2), +(7895, 'how', 'page', 26, 2), +(7896, 'configure', 'page', 26, 1), +(7897, 'It', 'page', 26, 1), +(7898, 'particularly', 'page', 26, 1), +(7899, 'useful', 'page', 26, 1), +(7900, 'schools', 'page', 26, 1), +(7901, 'where', 'page', 26, 1), +(7902, 'users', 'page', 26, 1), +(7903, 'easily', 'page', 26, 1), +(7904, 'about', 'page', 26, 1), +(7905, 'application', 'page', 26, 1), +(7906, 'then', 'page', 26, 1), +(7907, 'use', 'page', 26, 1), +(7908, 'without', 'page', 26, 1), +(7909, 'having', 'page', 26, 1), +(7910, 'understand', 'page', 26, 1), +(7911, 'works', 'page', 26, 1), +(7912, 'Even', 'page', 26, 4), +(7913, 'Less', 'page', 26, 4), +(7914, 'Useful', 'page', 26, 4), +(7915, 'Lorem', 'page', 26, 2), +(7916, 'ipsum', 'page', 26, 2), +(7917, 'dolor', 'page', 26, 4), +(7918, 'sit', 'page', 26, 7), +(7919, 'amet', 'page', 26, 6), +(7920, 'consectetur', 'page', 26, 4), +(7921, 'adipiscing', 'page', 26, 3), +(7922, 'elit', 'page', 26, 3), +(7923, 'sed', 'page', 26, 5), +(7924, 'do', 'page', 26, 1), +(7925, 'eiusmod', 'page', 26, 1), +(7926, 'tempor', 'page', 26, 1), +(7927, 'incididunt', 'page', 26, 1), +(7928, 'ut', 'page', 26, 4), +(7929, 'labore', 'page', 26, 1), +(7930, 'et', 'page', 26, 2), +(7931, 'dolore', 'page', 26, 1), +(7932, 'magna', 'page', 26, 1), +(7933, 'aliqua', 'page', 26, 1), +(7934, 'Pellentesque', 'page', 26, 1), +(7935, 'porttitor', 'page', 26, 3), +(7936, 'eget', 'page', 26, 3), +(7937, 'morbi', 'page', 26, 5), +(7938, 'Nunc', 'page', 26, 1), +(7939, 'velit', 'page', 26, 1), +(7940, 'dignissim', 'page', 26, 3), +(7941, 'sodales', 'page', 26, 1), +(7942, 'eu', 'page', 26, 5), +(7943, 'sem', 'page', 26, 1), +(7944, 'integer', 'page', 26, 1), +(7945, 'Gravida', 'page', 26, 1), +(7946, 'cum', 'page', 26, 1), +(7947, 'sociis', 'page', 26, 1), +(7948, 'natoque', 'page', 26, 1), +(7949, 'penatibus', 'page', 26, 1), +(7950, 'magnis', 'page', 26, 1), +(7951, 'dis', 'page', 26, 1), +(7952, 'Proin', 'page', 26, 1), +(7953, 'libero', 'page', 26, 2), +(7954, 'enim', 'page', 26, 4), +(7955, 'faucibus', 'page', 26, 3), +(7956, 'turpis', 'page', 26, 1), +(7957, 'In', 'page', 26, 2), +(7958, 'fermentum', 'page', 26, 5), +(7959, 'posuere', 'page', 26, 2), +(7960, 'urna', 'page', 26, 3), +(7961, 'nec', 'page', 26, 1), +(7962, 'tincidunt', 'page', 26, 2), +(7963, 'praesent', 'page', 26, 1), +(7964, 'semper', 'page', 26, 1), +(7965, 'Varius', 'page', 26, 1), +(7966, 'duis', 'page', 26, 2), +(7967, 'lorem', 'page', 26, 2), +(7968, 'Placerat', 'page', 26, 1), +(7969, 'orci', 'page', 26, 4), +(7970, 'nulla', 'page', 26, 4), +(7971, 'pellentesque', 'page', 26, 2), +(7972, 'venenatis', 'page', 26, 1), +(7973, 'Integer', 'page', 26, 2), +(7974, 'feugiat', 'page', 26, 2), +(7975, 'scelerisque', 'page', 26, 3), +(7976, 'varius', 'page', 26, 4), +(7977, 'nunc', 'page', 26, 2), +(7978, 'Diam', 'page', 26, 1), +(7979, 'quam', 'page', 26, 5), +(7980, 'massa', 'page', 26, 2), +(7981, 'Dolor', 'page', 26, 1), +(7982, 'Tempus', 'page', 26, 1), +(7983, 'iaculis', 'page', 26, 2), +(7984, 'id', 'page', 26, 3), +(7985, 'volutpat', 'page', 26, 2), +(7986, 'Ac', 'page', 26, 1), +(7987, 'auctor', 'page', 26, 2), +(7988, 'augue', 'page', 26, 5), +(7989, 'mauris', 'page', 26, 4), +(7990, 'neque', 'page', 26, 3), +(7991, 'gravida', 'page', 26, 2), +(7992, 'Blandit', 'page', 26, 1), +(7993, 'cras', 'page', 26, 4), +(7994, 'ornare', 'page', 26, 1), +(7995, 'arcu', 'page', 26, 4), +(7996, 'mi', 'page', 26, 2), +(7997, 'bibendum', 'page', 26, 1), +(7998, 'egestas', 'page', 26, 3), +(7999, 'Non', 'page', 26, 1), +(8000, 'lacus', 'page', 26, 1), +(8001, 'suspendisse', 'page', 26, 3), +(8002, 'interdum', 'page', 26, 1), +(8003, 'Vivamus', 'page', 26, 1), +(8004, 'dictum', 'page', 26, 1), +(8005, 'Duis', 'page', 26, 1), +(8006, 'diam', 'page', 26, 4), +(8007, 'Egestas', 'page', 26, 1), +(8008, 'congue', 'page', 26, 1), +(8009, 'quisque', 'page', 26, 2), +(8010, 'cursus', 'page', 26, 1), +(8011, 'Quis', 'page', 26, 1), +(8012, 'viverra', 'page', 26, 2), +(8013, 'nibh', 'page', 26, 2), +(8014, 'pulvinar', 'page', 26, 3), +(8015, 'Hendrerit', 'page', 26, 1), +(8016, 'rutrum', 'page', 26, 2), +(8017, 'non', 'page', 26, 6), +(8018, 'tellus', 'page', 26, 5), +(8019, 'Metus', 'page', 26, 1), +(8020, 'vulputate', 'page', 26, 2), +(8021, 'felis', 'page', 26, 1), +(8022, 'imperdiet', 'page', 26, 2), +(8023, 'proin', 'page', 26, 2), +(8024, 'Nulla', 'page', 26, 1), +(8025, 'facilisi', 'page', 26, 2), +(8026, 'tempus', 'page', 26, 1), +(8027, 'Eget', 'page', 26, 2), +(8028, 'risus', 'page', 26, 1), +(8029, 'quis', 'page', 26, 1), +(8030, 'Quisque', 'page', 26, 1), +(8031, 'ac', 'page', 26, 2), +(8032, 'nullam', 'page', 26, 2), +(8033, 'nisi', 'page', 26, 2), +(8034, 'est', 'page', 26, 3), +(8035, 'Id', 'page', 26, 1), +(8036, 'vel', 'page', 26, 2), +(8037, 'elementum', 'page', 26, 1), +(8038, 'etiam', 'page', 26, 1), +(8039, 'Pretium', 'page', 26, 1), +(8040, 'potenti', 'page', 26, 1), +(8041, 'Aliquam', 'page', 26, 1), +(8042, 'maecenas', 'page', 26, 1), +(8043, 'ultricies', 'page', 26, 1), +(8044, 'Tellus', 'page', 26, 1), +(8045, 'tortor', 'page', 26, 1), +(8046, 'aliquam', 'page', 26, 1), +(8047, 'Facilisi', 'page', 26, 1), +(8048, 'odio', 'page', 26, 1), +(8049, 'Et', 'page', 26, 1), +(8050, 'sollicitudin', 'page', 26, 1), +(8051, 'phasellus', 'page', 26, 1), +(8052, 'Nullam', 'page', 26, 1), +(8053, 'Quam', 'page', 26, 1), +(8054, 'ante', 'page', 26, 1), +(8055, 'Nisi', 'page', 26, 1), +(8056, 'vitae', 'page', 26, 1), +(8057, 'suscipit', 'page', 26, 1), +(8058, 'Felis', 'page', 26, 1), +(8059, 'leo', 'page', 26, 1), +(8060, 'porta', 'page', 26, 1), +(8061, 'Conclusion', 'page', 26, 4), +(8062, 'I', 'page', 26, 1), +(8063, 'hope', 'page', 26, 1), +(8064, 'you', 'page', 26, 1), +(8065, 'enjoyed', 'page', 26, 1), +(8066, 'browsing', 'page', 26, 1), +(8067, 'almost', 'page', 26, 1), +(8068, 'pointless', 'page', 26, 1), +(8069, 'As', 'page', 26, 1), +(8070, 'reward', 'page', 26, 1), +(8071, 'check', 'page', 26, 1), +(8072, 'out', 'page', 26, 1), +(8073, 'sweet', 'page', 26, 1), +(8074, 'video', 'page', 26, 1), +(8075, 'Contributing', 'page', 27, 40), +(8076, 'Description', 'page', 27, 1), +(8077, 'Tutorial', 'page', 27, 1), +(8078, 'on', 'page', 27, 2), +(8079, 'how', 'page', 27, 3), +(8080, 'to', 'page', 27, 15), +(8081, 'contribute', 'page', 27, 1), +(8082, 'the', 'page', 27, 6), +(8083, 'Toth', 'page', 27, 1), +(8084, 'repository', 'page', 27, 1), +(8085, 'An', 'page', 27, 4), +(8086, 'Example', 'page', 27, 4), +(8087, 'Document', 'page', 27, 4), +(8088, 'Welcome', 'page', 27, 1), +(8089, 'This', 'page', 27, 2), +(8090, 'is', 'page', 27, 7), +(8091, 'a', 'page', 27, 11), +(8092, 'filler', 'page', 27, 1), +(8093, 'page', 'page', 27, 1), +(8094, 'show', 'page', 27, 1), +(8095, 'off', 'page', 27, 1), +(8096, 'formatting', 'page', 27, 1), +(8097, 'of', 'page', 27, 6), +(8098, 'BookStack', 'page', 27, 1), +(8099, 'documents', 'page', 27, 1), +(8100, ' ', 'page', 27, 1), +(8101, 'All', 'page', 27, 1), +(8102, 'content', 'page', 27, 1), +(8103, 'aside', 'page', 27, 2), +(8104, 'from', 'page', 27, 2), +(8105, 'description', 'page', 27, 1), +(8106, 'at', 'page', 27, 3), +(8107, 'top', 'page', 27, 1), +(8108, 'this', 'page', 27, 3), +(8109, 'document', 'page', 27, 3), +(8110, 'unrelated', 'page', 27, 1), +(8111, 's', 'page', 27, 1), +(8112, 'actual', 'page', 27, 1), +(8113, 'purposes', 'page', 27, 2), +(8114, 'and', 'page', 27, 9), +(8115, 'should', 'page', 27, 1), +(8116, 'not', 'page', 27, 1), +(8117, 'be', 'page', 27, 4), +(8118, 'used', 'page', 27, 3), +(8119, 'demonstrative', 'page', 27, 1), +(8120, 'Further', 'page', 27, 4), +(8121, 'Content', 'page', 27, 8), +(8122, 'The', 'page', 27, 1), +(8123, 'purpose', 'page', 27, 1), +(8124, 'knowledge', 'page', 27, 2), +(8125, 'base', 'page', 27, 4), +(8126, 'act', 'page', 27, 1), +(8127, 'as', 'page', 27, 2), +(8128, 'centralized', 'page', 27, 1), +(8129, 'organized', 'page', 27, 2), +(8130, 'platform', 'page', 27, 1), +(8131, 'access', 'page', 27, 1), +(8132, 'guides', 'page', 27, 4), +(8133, 'tutorials', 'page', 27, 1), +(8134, 'troubleshooting', 'page', 27, 1), +(8135, 'information', 'page', 27, 2), +(8136, 'other', 'page', 27, 2), +(8137, 'resources', 'page', 27, 1), +(8138, 'Knowledge', 'page', 27, 3), +(8139, 'systems', 'page', 27, 3), +(8140, 'come', 'page', 27, 1), +(8141, 'in', 'page', 27, 6), +(8142, 'different', 'page', 27, 1), +(8143, 'flavors', 'page', 27, 1), +(8144, 'for', 'page', 27, 3), +(8145, 'example', 'page', 27, 1), +(8146, 'there', 'page', 27, 1), +(8147, 'may', 'page', 27, 1), +(8148, 'number', 'page', 27, 1), +(8149, 'predefined', 'page', 27, 1), +(8150, 'modules', 'page', 27, 1), +(8151, 'that', 'page', 27, 2), +(8152, 'can', 'page', 27, 3), +(8153, 'added', 'page', 27, 1), +(8154, 'removed', 'page', 27, 1), +(8155, 'developed', 'page', 27, 1), +(8156, 'an', 'page', 27, 1), +(8157, 'integrated', 'page', 27, 1), +(8158, 'manner', 'page', 27, 1), +(8159, 'with', 'page', 27, 2), +(8160, 'products', 'page', 27, 1), +(8161, 'are', 'page', 27, 1), +(8162, 'most', 'page', 27, 1), +(8163, 'frequently', 'page', 27, 1), +(8164, 'contain', 'page', 27, 1), +(8165, 'detailed', 'page', 27, 1), +(8166, 'These', 'page', 27, 1), +(8167, 'include', 'page', 27, 2), +(8168, 'solutions', 'page', 27, 1), +(8169, 'wide', 'page', 27, 1), +(8170, 'range', 'page', 27, 1), +(8171, 'technical', 'page', 27, 1), +(8172, 'problems', 'page', 27, 1), +(8173, 'but', 'page', 27, 1), +(8174, 'also', 'page', 27, 1), +(8175, 'every', 'page', 27, 1), +(8176, 'aspect', 'page', 27, 1), +(8177, 'programming', 'page', 27, 1), +(8178, 'hardware', 'page', 27, 1), +(8179, 'software', 'page', 27, 2), +(8180, 'topics', 'page', 27, 1), +(8181, 'business', 'page', 27, 1), +(8182, 'concepts', 'page', 27, 1), +(8183, 'Another', 'page', 27, 1), +(8184, 'reason', 'page', 27, 1), +(8185, 'consider', 'page', 27, 1), +(8186, 'Base', 'page', 27, 1), +(8187, 'it', 'page', 27, 3), +(8188, 'often', 'page', 27, 1), +(8189, 'single', 'page', 27, 1), +(8190, 'entry', 'page', 27, 1), +(8191, 'point', 'page', 27, 1), +(8192, 'system', 'page', 27, 2), +(8193, 'very', 'page', 27, 1), +(8194, 'convenient', 'page', 27, 1), +(8195, 'feature', 'page', 27, 1), +(8196, 'remote', 'page', 27, 1), +(8197, 'clients', 'page', 27, 1), +(8198, 'who', 'page', 27, 2), +(8199, 'need', 'page', 27, 2), +(8200, 'select', 'page', 27, 1), +(8201, 'particular', 'page', 27, 2), +(8202, 'program', 'page', 27, 1), +(8203, 'download', 'page', 27, 1), +(8204, 'their', 'page', 27, 1), +(8205, 'computer', 'page', 27, 1), +(8206, 'or', 'page', 27, 1), +(8207, 'quickly', 'page', 27, 1), +(8208, 'learn', 'page', 27, 2), +(8209, 'configure', 'page', 27, 1), +(8210, 'It', 'page', 27, 1), +(8211, 'particularly', 'page', 27, 1), +(8212, 'useful', 'page', 27, 1), +(8213, 'schools', 'page', 27, 1), +(8214, 'where', 'page', 27, 1), +(8215, 'users', 'page', 27, 1), +(8216, 'easily', 'page', 27, 1), +(8217, 'about', 'page', 27, 1), +(8218, 'application', 'page', 27, 1), +(8219, 'then', 'page', 27, 1), +(8220, 'use', 'page', 27, 1), +(8221, 'without', 'page', 27, 1), +(8222, 'having', 'page', 27, 1), +(8223, 'understand', 'page', 27, 1), +(8224, 'works', 'page', 27, 1), +(8225, 'Even', 'page', 27, 4), +(8226, 'Less', 'page', 27, 4), +(8227, 'Useful', 'page', 27, 4), +(8228, 'Lorem', 'page', 27, 2), +(8229, 'ipsum', 'page', 27, 2), +(8230, 'dolor', 'page', 27, 4), +(8231, 'sit', 'page', 27, 7), +(8232, 'amet', 'page', 27, 6), +(8233, 'consectetur', 'page', 27, 4), +(8234, 'adipiscing', 'page', 27, 3), +(8235, 'elit', 'page', 27, 3), +(8236, 'sed', 'page', 27, 5), +(8237, 'do', 'page', 27, 1), +(8238, 'eiusmod', 'page', 27, 1), +(8239, 'tempor', 'page', 27, 1), +(8240, 'incididunt', 'page', 27, 1), +(8241, 'ut', 'page', 27, 4), +(8242, 'labore', 'page', 27, 1), +(8243, 'et', 'page', 27, 2), +(8244, 'dolore', 'page', 27, 1), +(8245, 'magna', 'page', 27, 1), +(8246, 'aliqua', 'page', 27, 1), +(8247, 'Pellentesque', 'page', 27, 1), +(8248, 'porttitor', 'page', 27, 3), +(8249, 'eget', 'page', 27, 3), +(8250, 'morbi', 'page', 27, 5), +(8251, 'Nunc', 'page', 27, 1), +(8252, 'velit', 'page', 27, 1), +(8253, 'dignissim', 'page', 27, 3), +(8254, 'sodales', 'page', 27, 1), +(8255, 'eu', 'page', 27, 5), +(8256, 'sem', 'page', 27, 1), +(8257, 'integer', 'page', 27, 1), +(8258, 'Gravida', 'page', 27, 1), +(8259, 'cum', 'page', 27, 1), +(8260, 'sociis', 'page', 27, 1), +(8261, 'natoque', 'page', 27, 1), +(8262, 'penatibus', 'page', 27, 1), +(8263, 'magnis', 'page', 27, 1), +(8264, 'dis', 'page', 27, 1), +(8265, 'Proin', 'page', 27, 1), +(8266, 'libero', 'page', 27, 2), +(8267, 'enim', 'page', 27, 4), +(8268, 'faucibus', 'page', 27, 3), +(8269, 'turpis', 'page', 27, 1), +(8270, 'In', 'page', 27, 2), +(8271, 'fermentum', 'page', 27, 5), +(8272, 'posuere', 'page', 27, 2), +(8273, 'urna', 'page', 27, 3), +(8274, 'nec', 'page', 27, 1), +(8275, 'tincidunt', 'page', 27, 2), +(8276, 'praesent', 'page', 27, 1), +(8277, 'semper', 'page', 27, 1), +(8278, 'Varius', 'page', 27, 1), +(8279, 'duis', 'page', 27, 2), +(8280, 'lorem', 'page', 27, 2), +(8281, 'Placerat', 'page', 27, 1), +(8282, 'orci', 'page', 27, 4), +(8283, 'nulla', 'page', 27, 4), +(8284, 'pellentesque', 'page', 27, 2), +(8285, 'venenatis', 'page', 27, 1), +(8286, 'Integer', 'page', 27, 2), +(8287, 'feugiat', 'page', 27, 2), +(8288, 'scelerisque', 'page', 27, 3), +(8289, 'varius', 'page', 27, 4), +(8290, 'nunc', 'page', 27, 2), +(8291, 'Diam', 'page', 27, 1), +(8292, 'quam', 'page', 27, 5), +(8293, 'massa', 'page', 27, 2), +(8294, 'Dolor', 'page', 27, 1), +(8295, 'Tempus', 'page', 27, 1), +(8296, 'iaculis', 'page', 27, 2), +(8297, 'id', 'page', 27, 3), +(8298, 'volutpat', 'page', 27, 2), +(8299, 'Ac', 'page', 27, 1), +(8300, 'auctor', 'page', 27, 2), +(8301, 'augue', 'page', 27, 5), +(8302, 'mauris', 'page', 27, 4), +(8303, 'neque', 'page', 27, 3), +(8304, 'gravida', 'page', 27, 2), +(8305, 'Blandit', 'page', 27, 1), +(8306, 'cras', 'page', 27, 4), +(8307, 'ornare', 'page', 27, 1), +(8308, 'arcu', 'page', 27, 4), +(8309, 'mi', 'page', 27, 2), +(8310, 'bibendum', 'page', 27, 1), +(8311, 'egestas', 'page', 27, 3), +(8312, 'Non', 'page', 27, 1), +(8313, 'lacus', 'page', 27, 1), +(8314, 'suspendisse', 'page', 27, 3), +(8315, 'interdum', 'page', 27, 1), +(8316, 'Vivamus', 'page', 27, 1), +(8317, 'dictum', 'page', 27, 1), +(8318, 'Duis', 'page', 27, 1), +(8319, 'diam', 'page', 27, 4), +(8320, 'Egestas', 'page', 27, 1), +(8321, 'congue', 'page', 27, 1), +(8322, 'quisque', 'page', 27, 2), +(8323, 'cursus', 'page', 27, 1), +(8324, 'Quis', 'page', 27, 1), +(8325, 'viverra', 'page', 27, 2), +(8326, 'nibh', 'page', 27, 2), +(8327, 'pulvinar', 'page', 27, 3), +(8328, 'Hendrerit', 'page', 27, 1), +(8329, 'rutrum', 'page', 27, 2), +(8330, 'non', 'page', 27, 6), +(8331, 'tellus', 'page', 27, 5), +(8332, 'Metus', 'page', 27, 1), +(8333, 'vulputate', 'page', 27, 2), +(8334, 'felis', 'page', 27, 1), +(8335, 'imperdiet', 'page', 27, 2), +(8336, 'proin', 'page', 27, 2), +(8337, 'Nulla', 'page', 27, 1), +(8338, 'facilisi', 'page', 27, 2), +(8339, 'tempus', 'page', 27, 1), +(8340, 'Eget', 'page', 27, 2), +(8341, 'risus', 'page', 27, 1), +(8342, 'quis', 'page', 27, 1), +(8343, 'Quisque', 'page', 27, 1), +(8344, 'ac', 'page', 27, 2), +(8345, 'nullam', 'page', 27, 2), +(8346, 'nisi', 'page', 27, 2), +(8347, 'est', 'page', 27, 3), +(8348, 'Id', 'page', 27, 1), +(8349, 'vel', 'page', 27, 2), +(8350, 'elementum', 'page', 27, 1), +(8351, 'etiam', 'page', 27, 1), +(8352, 'Pretium', 'page', 27, 1), +(8353, 'potenti', 'page', 27, 1), +(8354, 'Aliquam', 'page', 27, 1), +(8355, 'maecenas', 'page', 27, 1), +(8356, 'ultricies', 'page', 27, 1), +(8357, 'Tellus', 'page', 27, 1), +(8358, 'tortor', 'page', 27, 1), +(8359, 'aliquam', 'page', 27, 1), +(8360, 'Facilisi', 'page', 27, 1), +(8361, 'odio', 'page', 27, 1), +(8362, 'Et', 'page', 27, 1), +(8363, 'sollicitudin', 'page', 27, 1), +(8364, 'phasellus', 'page', 27, 1), +(8365, 'Nullam', 'page', 27, 1), +(8366, 'Quam', 'page', 27, 1), +(8367, 'ante', 'page', 27, 1), +(8368, 'Nisi', 'page', 27, 1), +(8369, 'vitae', 'page', 27, 1), +(8370, 'suscipit', 'page', 27, 1), +(8371, 'Felis', 'page', 27, 1), +(8372, 'leo', 'page', 27, 1), +(8373, 'porta', 'page', 27, 1), +(8374, 'Conclusion', 'page', 27, 4), +(8375, 'I', 'page', 27, 1), +(8376, 'hope', 'page', 27, 1), +(8377, 'you', 'page', 27, 1), +(8378, 'enjoyed', 'page', 27, 1), +(8379, 'browsing', 'page', 27, 1), +(8380, 'almost', 'page', 27, 1), +(8381, 'pointless', 'page', 27, 1), +(8382, 'As', 'page', 27, 1), +(8383, 'reward', 'page', 27, 1), +(8384, 'check', 'page', 27, 1), +(8385, 'out', 'page', 27, 1), +(8386, 'sweet', 'page', 27, 1), +(8387, 'video', 'page', 27, 1), +(8388, 'External', 'page', 28, 40), +(8389, 'Resources', 'page', 28, 40), +(8390, 'Description', 'page', 28, 1), +(8391, 'Links', 'page', 28, 1), +(8392, 'and', 'page', 28, 10), +(8393, 'directions', 'page', 28, 1), +(8394, 'to', 'page', 28, 14), +(8395, 'all', 'page', 28, 1), +(8396, 'useful', 'page', 28, 2), +(8397, 'external', 'page', 28, 1), +(8398, 'resources', 'page', 28, 2), +(8399, 'in', 'page', 28, 7), +(8400, 'learning', 'page', 28, 1), +(8401, 'about', 'page', 28, 2), +(8402, 'GitHub', 'page', 28, 1), +(8403, 'for', 'page', 28, 4), +(8404, 'the', 'page', 28, 6), +(8405, 'first', 'page', 28, 1), +(8406, 'time', 'page', 28, 1), +(8407, 'or', 'page', 28, 2), +(8408, 'advancing', 'page', 28, 1), +(8409, 'knowledge', 'page', 28, 3), +(8410, 'An', 'page', 28, 4), +(8411, 'Example', 'page', 28, 4), +(8412, 'Document', 'page', 28, 4), +(8413, 'Welcome', 'page', 28, 1), +(8414, 'This', 'page', 28, 2), +(8415, 'is', 'page', 28, 7), +(8416, 'a', 'page', 28, 11), +(8417, 'filler', 'page', 28, 1), +(8418, 'page', 'page', 28, 1), +(8419, 'show', 'page', 28, 1), +(8420, 'off', 'page', 28, 1), +(8421, 'formatting', 'page', 28, 1), +(8422, 'of', 'page', 28, 6), +(8423, 'BookStack', 'page', 28, 1), +(8424, 'documents', 'page', 28, 1), +(8425, ' ', 'page', 28, 1), +(8426, 'All', 'page', 28, 1), +(8427, 'content', 'page', 28, 1), +(8428, 'aside', 'page', 28, 2), +(8429, 'from', 'page', 28, 2), +(8430, 'description', 'page', 28, 1), +(8431, 'at', 'page', 28, 3), +(8432, 'top', 'page', 28, 1), +(8433, 'this', 'page', 28, 3), +(8434, 'document', 'page', 28, 3), +(8435, 'unrelated', 'page', 28, 1), +(8436, 's', 'page', 28, 1), +(8437, 'actual', 'page', 28, 1), +(8438, 'purposes', 'page', 28, 2), +(8439, 'should', 'page', 28, 1), +(8440, 'not', 'page', 28, 1), +(8441, 'be', 'page', 28, 4), +(8442, 'used', 'page', 28, 3), +(8443, 'demonstrative', 'page', 28, 1), +(8444, 'Further', 'page', 28, 4), +(8445, 'Content', 'page', 28, 8), +(8446, 'The', 'page', 28, 1), +(8447, 'purpose', 'page', 28, 1), +(8448, 'base', 'page', 28, 4), +(8449, 'act', 'page', 28, 1), +(8450, 'as', 'page', 28, 2), +(8451, 'centralized', 'page', 28, 1), +(8452, 'organized', 'page', 28, 2), +(8453, 'platform', 'page', 28, 1), +(8454, 'access', 'page', 28, 1), +(8455, 'guides', 'page', 28, 4), +(8456, 'tutorials', 'page', 28, 1), +(8457, 'troubleshooting', 'page', 28, 1), +(8458, 'information', 'page', 28, 2), +(8459, 'other', 'page', 28, 2), +(8460, 'Knowledge', 'page', 28, 3), +(8461, 'systems', 'page', 28, 3), +(8462, 'come', 'page', 28, 1), +(8463, 'different', 'page', 28, 1), +(8464, 'flavors', 'page', 28, 1), +(8465, 'example', 'page', 28, 1), +(8466, 'there', 'page', 28, 1), +(8467, 'may', 'page', 28, 1), +(8468, 'number', 'page', 28, 1), +(8469, 'predefined', 'page', 28, 1), +(8470, 'modules', 'page', 28, 1), +(8471, 'that', 'page', 28, 2), +(8472, 'can', 'page', 28, 3), +(8473, 'added', 'page', 28, 1), +(8474, 'removed', 'page', 28, 1), +(8475, 'developed', 'page', 28, 1), +(8476, 'an', 'page', 28, 1), +(8477, 'integrated', 'page', 28, 1), +(8478, 'manner', 'page', 28, 1), +(8479, 'with', 'page', 28, 2), +(8480, 'products', 'page', 28, 1), +(8481, 'are', 'page', 28, 1), +(8482, 'most', 'page', 28, 1), +(8483, 'frequently', 'page', 28, 1), +(8484, 'contain', 'page', 28, 1), +(8485, 'detailed', 'page', 28, 1), +(8486, 'These', 'page', 28, 1), +(8487, 'include', 'page', 28, 2), +(8488, 'solutions', 'page', 28, 1), +(8489, 'wide', 'page', 28, 1), +(8490, 'range', 'page', 28, 1), +(8491, 'technical', 'page', 28, 1), +(8492, 'problems', 'page', 28, 1), +(8493, 'but', 'page', 28, 1), +(8494, 'also', 'page', 28, 1), +(8495, 'on', 'page', 28, 1), +(8496, 'every', 'page', 28, 1), +(8497, 'aspect', 'page', 28, 1), +(8498, 'programming', 'page', 28, 1), +(8499, 'hardware', 'page', 28, 1), +(8500, 'software', 'page', 28, 2), +(8501, 'topics', 'page', 28, 1), +(8502, 'business', 'page', 28, 1), +(8503, 'concepts', 'page', 28, 1), +(8504, 'Another', 'page', 28, 1), +(8505, 'reason', 'page', 28, 1), +(8506, 'consider', 'page', 28, 1), +(8507, 'Base', 'page', 28, 1), +(8508, 'it', 'page', 28, 3), +(8509, 'often', 'page', 28, 1), +(8510, 'single', 'page', 28, 1), +(8511, 'entry', 'page', 28, 1), +(8512, 'point', 'page', 28, 1), +(8513, 'system', 'page', 28, 2), +(8514, 'very', 'page', 28, 1), +(8515, 'convenient', 'page', 28, 1), +(8516, 'feature', 'page', 28, 1), +(8517, 'remote', 'page', 28, 1), +(8518, 'clients', 'page', 28, 1), +(8519, 'who', 'page', 28, 2), +(8520, 'need', 'page', 28, 2), +(8521, 'select', 'page', 28, 1), +(8522, 'particular', 'page', 28, 2), +(8523, 'program', 'page', 28, 1), +(8524, 'download', 'page', 28, 1), +(8525, 'their', 'page', 28, 1), +(8526, 'computer', 'page', 28, 1), +(8527, 'quickly', 'page', 28, 1), +(8528, 'learn', 'page', 28, 2), +(8529, 'how', 'page', 28, 2), +(8530, 'configure', 'page', 28, 1), +(8531, 'It', 'page', 28, 1), +(8532, 'particularly', 'page', 28, 1), +(8533, 'schools', 'page', 28, 1), +(8534, 'where', 'page', 28, 1), +(8535, 'users', 'page', 28, 1), +(8536, 'easily', 'page', 28, 1), +(8537, 'application', 'page', 28, 1), +(8538, 'then', 'page', 28, 1), +(8539, 'use', 'page', 28, 1), +(8540, 'without', 'page', 28, 1), +(8541, 'having', 'page', 28, 1), +(8542, 'understand', 'page', 28, 1), +(8543, 'works', 'page', 28, 1), +(8544, 'Even', 'page', 28, 4), +(8545, 'Less', 'page', 28, 4), +(8546, 'Useful', 'page', 28, 4), +(8547, 'Lorem', 'page', 28, 2), +(8548, 'ipsum', 'page', 28, 2), +(8549, 'dolor', 'page', 28, 4), +(8550, 'sit', 'page', 28, 7), +(8551, 'amet', 'page', 28, 6), +(8552, 'consectetur', 'page', 28, 4), +(8553, 'adipiscing', 'page', 28, 3), +(8554, 'elit', 'page', 28, 3), +(8555, 'sed', 'page', 28, 5), +(8556, 'do', 'page', 28, 1), +(8557, 'eiusmod', 'page', 28, 1), +(8558, 'tempor', 'page', 28, 1), +(8559, 'incididunt', 'page', 28, 1), +(8560, 'ut', 'page', 28, 4), +(8561, 'labore', 'page', 28, 1), +(8562, 'et', 'page', 28, 2), +(8563, 'dolore', 'page', 28, 1), +(8564, 'magna', 'page', 28, 1), +(8565, 'aliqua', 'page', 28, 1), +(8566, 'Pellentesque', 'page', 28, 1), +(8567, 'porttitor', 'page', 28, 3), +(8568, 'eget', 'page', 28, 3), +(8569, 'morbi', 'page', 28, 5), +(8570, 'Nunc', 'page', 28, 1), +(8571, 'velit', 'page', 28, 1), +(8572, 'dignissim', 'page', 28, 3), +(8573, 'sodales', 'page', 28, 1), +(8574, 'eu', 'page', 28, 5), +(8575, 'sem', 'page', 28, 1), +(8576, 'integer', 'page', 28, 1), +(8577, 'Gravida', 'page', 28, 1), +(8578, 'cum', 'page', 28, 1), +(8579, 'sociis', 'page', 28, 1), +(8580, 'natoque', 'page', 28, 1), +(8581, 'penatibus', 'page', 28, 1), +(8582, 'magnis', 'page', 28, 1), +(8583, 'dis', 'page', 28, 1), +(8584, 'Proin', 'page', 28, 1), +(8585, 'libero', 'page', 28, 2), +(8586, 'enim', 'page', 28, 4), +(8587, 'faucibus', 'page', 28, 3), +(8588, 'turpis', 'page', 28, 1), +(8589, 'In', 'page', 28, 2), +(8590, 'fermentum', 'page', 28, 5), +(8591, 'posuere', 'page', 28, 2), +(8592, 'urna', 'page', 28, 3), +(8593, 'nec', 'page', 28, 1), +(8594, 'tincidunt', 'page', 28, 2), +(8595, 'praesent', 'page', 28, 1), +(8596, 'semper', 'page', 28, 1), +(8597, 'Varius', 'page', 28, 1), +(8598, 'duis', 'page', 28, 2), +(8599, 'lorem', 'page', 28, 2), +(8600, 'Placerat', 'page', 28, 1), +(8601, 'orci', 'page', 28, 4), +(8602, 'nulla', 'page', 28, 4), +(8603, 'pellentesque', 'page', 28, 2), +(8604, 'venenatis', 'page', 28, 1), +(8605, 'Integer', 'page', 28, 2), +(8606, 'feugiat', 'page', 28, 2), +(8607, 'scelerisque', 'page', 28, 3), +(8608, 'varius', 'page', 28, 4), +(8609, 'nunc', 'page', 28, 2), +(8610, 'Diam', 'page', 28, 1), +(8611, 'quam', 'page', 28, 5), +(8612, 'massa', 'page', 28, 2), +(8613, 'Dolor', 'page', 28, 1), +(8614, 'Tempus', 'page', 28, 1), +(8615, 'iaculis', 'page', 28, 2), +(8616, 'id', 'page', 28, 3), +(8617, 'volutpat', 'page', 28, 2), +(8618, 'Ac', 'page', 28, 1), +(8619, 'auctor', 'page', 28, 2), +(8620, 'augue', 'page', 28, 5), +(8621, 'mauris', 'page', 28, 4), +(8622, 'neque', 'page', 28, 3), +(8623, 'gravida', 'page', 28, 2), +(8624, 'Blandit', 'page', 28, 1), +(8625, 'cras', 'page', 28, 4), +(8626, 'ornare', 'page', 28, 1), +(8627, 'arcu', 'page', 28, 4), +(8628, 'mi', 'page', 28, 2), +(8629, 'bibendum', 'page', 28, 1), +(8630, 'egestas', 'page', 28, 3), +(8631, 'Non', 'page', 28, 1), +(8632, 'lacus', 'page', 28, 1), +(8633, 'suspendisse', 'page', 28, 3), +(8634, 'interdum', 'page', 28, 1), +(8635, 'Vivamus', 'page', 28, 1), +(8636, 'dictum', 'page', 28, 1), +(8637, 'Duis', 'page', 28, 1), +(8638, 'diam', 'page', 28, 4), +(8639, 'Egestas', 'page', 28, 1), +(8640, 'congue', 'page', 28, 1), +(8641, 'quisque', 'page', 28, 2), +(8642, 'cursus', 'page', 28, 1), +(8643, 'Quis', 'page', 28, 1), +(8644, 'viverra', 'page', 28, 2), +(8645, 'nibh', 'page', 28, 2), +(8646, 'pulvinar', 'page', 28, 3), +(8647, 'Hendrerit', 'page', 28, 1), +(8648, 'rutrum', 'page', 28, 2), +(8649, 'non', 'page', 28, 6), +(8650, 'tellus', 'page', 28, 5), +(8651, 'Metus', 'page', 28, 1), +(8652, 'vulputate', 'page', 28, 2), +(8653, 'felis', 'page', 28, 1), +(8654, 'imperdiet', 'page', 28, 2), +(8655, 'proin', 'page', 28, 2), +(8656, 'Nulla', 'page', 28, 1), +(8657, 'facilisi', 'page', 28, 2), +(8658, 'tempus', 'page', 28, 1), +(8659, 'Eget', 'page', 28, 2), +(8660, 'risus', 'page', 28, 1), +(8661, 'quis', 'page', 28, 1), +(8662, 'Quisque', 'page', 28, 1), +(8663, 'ac', 'page', 28, 2), +(8664, 'nullam', 'page', 28, 2), +(8665, 'nisi', 'page', 28, 2), +(8666, 'est', 'page', 28, 3), +(8667, 'Id', 'page', 28, 1), +(8668, 'vel', 'page', 28, 2), +(8669, 'elementum', 'page', 28, 1), +(8670, 'etiam', 'page', 28, 1), +(8671, 'Pretium', 'page', 28, 1), +(8672, 'potenti', 'page', 28, 1), +(8673, 'Aliquam', 'page', 28, 1), +(8674, 'maecenas', 'page', 28, 1), +(8675, 'ultricies', 'page', 28, 1), +(8676, 'Tellus', 'page', 28, 1), +(8677, 'tortor', 'page', 28, 1), +(8678, 'aliquam', 'page', 28, 1), +(8679, 'Facilisi', 'page', 28, 1), +(8680, 'odio', 'page', 28, 1), +(8681, 'Et', 'page', 28, 1), +(8682, 'sollicitudin', 'page', 28, 1), +(8683, 'phasellus', 'page', 28, 1), +(8684, 'Nullam', 'page', 28, 1), +(8685, 'Quam', 'page', 28, 1), +(8686, 'ante', 'page', 28, 1), +(8687, 'Nisi', 'page', 28, 1), +(8688, 'vitae', 'page', 28, 1), +(8689, 'suscipit', 'page', 28, 1), +(8690, 'Felis', 'page', 28, 1), +(8691, 'leo', 'page', 28, 1), +(8692, 'porta', 'page', 28, 1), +(8693, 'Conclusion', 'page', 28, 4), +(8694, 'I', 'page', 28, 1), +(8695, 'hope', 'page', 28, 1), +(8696, 'you', 'page', 28, 1), +(8697, 'enjoyed', 'page', 28, 1), +(8698, 'browsing', 'page', 28, 1), +(8699, 'almost', 'page', 28, 1), +(8700, 'pointless', 'page', 28, 1), +(8701, 'As', 'page', 28, 1), +(8702, 'reward', 'page', 28, 1), +(8703, 'check', 'page', 28, 1), +(8704, 'out', 'page', 28, 1), +(8705, 'sweet', 'page', 28, 1), +(8706, 'video', 'page', 28, 1), +(8707, 'BookStack', 'book', 15, 49), +(8708, 'Tutorials', 'book', 15, 48), +(8709, 'Resources', 'book', 15, 1), +(8710, 'for', 'book', 15, 1), +(8711, 'members', 'book', 15, 1), +(8712, 'to', 'book', 15, 1), +(8713, 'begin', 'book', 15, 1), +(8714, 'working', 'book', 15, 1), +(8715, 'alongside', 'book', 15, 1), +(8716, 'as', 'book', 15, 1), +(8717, 'part', 'book', 15, 1), +(8718, 'of', 'book', 15, 1), +(8719, 'the', 'book', 15, 1), +(8720, 'project', 'book', 15, 1), +(8721, 'Tutorials', 'chapter', 4, 48), +(8722, 'The', 'chapter', 4, 1), +(8723, 'main', 'chapter', 4, 1), +(8724, 'tutorials', 'chapter', 4, 1), +(8725, 'related', 'chapter', 4, 1), +(8726, 'to', 'chapter', 4, 1), +(8727, 'project', 'chapter', 4, 1), +(8728, 'member', 'chapter', 4, 1), +(8729, 'interactions', 'chapter', 4, 1), +(8730, 'with', 'chapter', 4, 1), +(8731, 'GitHub', 'chapter', 4, 1), +(8732, 'Navigation', 'page', 29, 40), +(8733, 'Description', 'page', 29, 1), +(8734, 'Tutorial', 'page', 29, 1), +(8735, 'on', 'page', 29, 2), +(8736, 'navigating', 'page', 29, 1), +(8737, 'the', 'page', 29, 6), +(8738, 'BookStack', 'page', 29, 2), +(8739, 'knowledge', 'page', 29, 3), +(8740, 'base', 'page', 29, 5), +(8741, 'An', 'page', 29, 4), +(8742, 'Example', 'page', 29, 4), +(8743, 'Document', 'page', 29, 4), +(8744, 'Welcome', 'page', 29, 1), +(8745, 'This', 'page', 29, 2), +(8746, 'is', 'page', 29, 7), +(8747, 'a', 'page', 29, 11), +(8748, 'filler', 'page', 29, 1), +(8749, 'page', 'page', 29, 1), +(8750, 'to', 'page', 29, 13), +(8751, 'show', 'page', 29, 1), +(8752, 'off', 'page', 29, 1), +(8753, 'formatting', 'page', 29, 1), +(8754, 'of', 'page', 29, 6), +(8755, 'documents', 'page', 29, 1), +(8756, ' ', 'page', 29, 1), +(8757, 'All', 'page', 29, 1), +(8758, 'content', 'page', 29, 1), +(8759, 'aside', 'page', 29, 2), +(8760, 'from', 'page', 29, 2), +(8761, 'description', 'page', 29, 1), +(8762, 'at', 'page', 29, 3), +(8763, 'top', 'page', 29, 1), +(8764, 'this', 'page', 29, 3), +(8765, 'document', 'page', 29, 3), +(8766, 'unrelated', 'page', 29, 1), +(8767, 's', 'page', 29, 1), +(8768, 'actual', 'page', 29, 1), +(8769, 'purposes', 'page', 29, 2), +(8770, 'and', 'page', 29, 9), +(8771, 'should', 'page', 29, 1), +(8772, 'not', 'page', 29, 1), +(8773, 'be', 'page', 29, 4), +(8774, 'used', 'page', 29, 3), +(8775, 'demonstrative', 'page', 29, 1), +(8776, 'Further', 'page', 29, 4), +(8777, 'Content', 'page', 29, 8), +(8778, 'The', 'page', 29, 1), +(8779, 'purpose', 'page', 29, 1), +(8780, 'act', 'page', 29, 1), +(8781, 'as', 'page', 29, 2), +(8782, 'centralized', 'page', 29, 1), +(8783, 'organized', 'page', 29, 2), +(8784, 'platform', 'page', 29, 1), +(8785, 'access', 'page', 29, 1), +(8786, 'guides', 'page', 29, 4), +(8787, 'tutorials', 'page', 29, 1), +(8788, 'troubleshooting', 'page', 29, 1), +(8789, 'information', 'page', 29, 2), +(8790, 'other', 'page', 29, 2), +(8791, 'resources', 'page', 29, 1), +(8792, 'Knowledge', 'page', 29, 3), +(8793, 'systems', 'page', 29, 3), +(8794, 'come', 'page', 29, 1), +(8795, 'in', 'page', 29, 6), +(8796, 'different', 'page', 29, 1), +(8797, 'flavors', 'page', 29, 1), +(8798, 'for', 'page', 29, 3), +(8799, 'example', 'page', 29, 1), +(8800, 'there', 'page', 29, 1), +(8801, 'may', 'page', 29, 1), +(8802, 'number', 'page', 29, 1), +(8803, 'predefined', 'page', 29, 1), +(8804, 'modules', 'page', 29, 1), +(8805, 'that', 'page', 29, 2), +(8806, 'can', 'page', 29, 3), +(8807, 'added', 'page', 29, 1), +(8808, 'removed', 'page', 29, 1), +(8809, 'developed', 'page', 29, 1), +(8810, 'an', 'page', 29, 1), +(8811, 'integrated', 'page', 29, 1), +(8812, 'manner', 'page', 29, 1), +(8813, 'with', 'page', 29, 2), +(8814, 'products', 'page', 29, 1), +(8815, 'are', 'page', 29, 1), +(8816, 'most', 'page', 29, 1), +(8817, 'frequently', 'page', 29, 1), +(8818, 'contain', 'page', 29, 1), +(8819, 'detailed', 'page', 29, 1), +(8820, 'These', 'page', 29, 1), +(8821, 'include', 'page', 29, 2), +(8822, 'solutions', 'page', 29, 1), +(8823, 'wide', 'page', 29, 1), +(8824, 'range', 'page', 29, 1), +(8825, 'technical', 'page', 29, 1), +(8826, 'problems', 'page', 29, 1), +(8827, 'but', 'page', 29, 1), +(8828, 'also', 'page', 29, 1), +(8829, 'every', 'page', 29, 1), +(8830, 'aspect', 'page', 29, 1), +(8831, 'programming', 'page', 29, 1), +(8832, 'hardware', 'page', 29, 1), +(8833, 'software', 'page', 29, 2), +(8834, 'topics', 'page', 29, 1), +(8835, 'business', 'page', 29, 1), +(8836, 'concepts', 'page', 29, 1), +(8837, 'Another', 'page', 29, 1), +(8838, 'reason', 'page', 29, 1), +(8839, 'consider', 'page', 29, 1), +(8840, 'Base', 'page', 29, 1), +(8841, 'it', 'page', 29, 3), +(8842, 'often', 'page', 29, 1), +(8843, 'single', 'page', 29, 1), +(8844, 'entry', 'page', 29, 1), +(8845, 'point', 'page', 29, 1), +(8846, 'system', 'page', 29, 2), +(8847, 'very', 'page', 29, 1), +(8848, 'convenient', 'page', 29, 1), +(8849, 'feature', 'page', 29, 1), +(8850, 'remote', 'page', 29, 1), +(8851, 'clients', 'page', 29, 1), +(8852, 'who', 'page', 29, 2), +(8853, 'need', 'page', 29, 2), +(8854, 'select', 'page', 29, 1), +(8855, 'particular', 'page', 29, 2), +(8856, 'program', 'page', 29, 1), +(8857, 'download', 'page', 29, 1), +(8858, 'their', 'page', 29, 1), +(8859, 'computer', 'page', 29, 1), +(8860, 'or', 'page', 29, 1), +(8861, 'quickly', 'page', 29, 1), +(8862, 'learn', 'page', 29, 2), +(8863, 'how', 'page', 29, 2), +(8864, 'configure', 'page', 29, 1), +(8865, 'It', 'page', 29, 1), +(8866, 'particularly', 'page', 29, 1), +(8867, 'useful', 'page', 29, 1), +(8868, 'schools', 'page', 29, 1), +(8869, 'where', 'page', 29, 1), +(8870, 'users', 'page', 29, 1), +(8871, 'easily', 'page', 29, 1), +(8872, 'about', 'page', 29, 1), +(8873, 'application', 'page', 29, 1), +(8874, 'then', 'page', 29, 1), +(8875, 'use', 'page', 29, 1), +(8876, 'without', 'page', 29, 1), +(8877, 'having', 'page', 29, 1), +(8878, 'understand', 'page', 29, 1), +(8879, 'works', 'page', 29, 1), +(8880, 'Even', 'page', 29, 4), +(8881, 'Less', 'page', 29, 4), +(8882, 'Useful', 'page', 29, 4), +(8883, 'Lorem', 'page', 29, 2), +(8884, 'ipsum', 'page', 29, 2), +(8885, 'dolor', 'page', 29, 4), +(8886, 'sit', 'page', 29, 7), +(8887, 'amet', 'page', 29, 6), +(8888, 'consectetur', 'page', 29, 4), +(8889, 'adipiscing', 'page', 29, 3), +(8890, 'elit', 'page', 29, 3), +(8891, 'sed', 'page', 29, 5), +(8892, 'do', 'page', 29, 1), +(8893, 'eiusmod', 'page', 29, 1), +(8894, 'tempor', 'page', 29, 1), +(8895, 'incididunt', 'page', 29, 1), +(8896, 'ut', 'page', 29, 4), +(8897, 'labore', 'page', 29, 1), +(8898, 'et', 'page', 29, 2), +(8899, 'dolore', 'page', 29, 1), +(8900, 'magna', 'page', 29, 1), +(8901, 'aliqua', 'page', 29, 1), +(8902, 'Pellentesque', 'page', 29, 1), +(8903, 'porttitor', 'page', 29, 3), +(8904, 'eget', 'page', 29, 3), +(8905, 'morbi', 'page', 29, 5), +(8906, 'Nunc', 'page', 29, 1), +(8907, 'velit', 'page', 29, 1), +(8908, 'dignissim', 'page', 29, 3), +(8909, 'sodales', 'page', 29, 1), +(8910, 'eu', 'page', 29, 5), +(8911, 'sem', 'page', 29, 1), +(8912, 'integer', 'page', 29, 1), +(8913, 'Gravida', 'page', 29, 1), +(8914, 'cum', 'page', 29, 1), +(8915, 'sociis', 'page', 29, 1), +(8916, 'natoque', 'page', 29, 1), +(8917, 'penatibus', 'page', 29, 1), +(8918, 'magnis', 'page', 29, 1), +(8919, 'dis', 'page', 29, 1), +(8920, 'Proin', 'page', 29, 1), +(8921, 'libero', 'page', 29, 2), +(8922, 'enim', 'page', 29, 4), +(8923, 'faucibus', 'page', 29, 3), +(8924, 'turpis', 'page', 29, 1), +(8925, 'In', 'page', 29, 2), +(8926, 'fermentum', 'page', 29, 5), +(8927, 'posuere', 'page', 29, 2), +(8928, 'urna', 'page', 29, 3), +(8929, 'nec', 'page', 29, 1), +(8930, 'tincidunt', 'page', 29, 2), +(8931, 'praesent', 'page', 29, 1), +(8932, 'semper', 'page', 29, 1), +(8933, 'Varius', 'page', 29, 1), +(8934, 'duis', 'page', 29, 2), +(8935, 'lorem', 'page', 29, 2), +(8936, 'Placerat', 'page', 29, 1), +(8937, 'orci', 'page', 29, 4), +(8938, 'nulla', 'page', 29, 4), +(8939, 'pellentesque', 'page', 29, 2), +(8940, 'venenatis', 'page', 29, 1), +(8941, 'Integer', 'page', 29, 2), +(8942, 'feugiat', 'page', 29, 2), +(8943, 'scelerisque', 'page', 29, 3), +(8944, 'varius', 'page', 29, 4), +(8945, 'nunc', 'page', 29, 2), +(8946, 'Diam', 'page', 29, 1), +(8947, 'quam', 'page', 29, 5), +(8948, 'massa', 'page', 29, 2), +(8949, 'Dolor', 'page', 29, 1), +(8950, 'Tempus', 'page', 29, 1), +(8951, 'iaculis', 'page', 29, 2), +(8952, 'id', 'page', 29, 3), +(8953, 'volutpat', 'page', 29, 2), +(8954, 'Ac', 'page', 29, 1), +(8955, 'auctor', 'page', 29, 2), +(8956, 'augue', 'page', 29, 5), +(8957, 'mauris', 'page', 29, 4), +(8958, 'neque', 'page', 29, 3), +(8959, 'gravida', 'page', 29, 2), +(8960, 'Blandit', 'page', 29, 1), +(8961, 'cras', 'page', 29, 4), +(8962, 'ornare', 'page', 29, 1), +(8963, 'arcu', 'page', 29, 4), +(8964, 'mi', 'page', 29, 2), +(8965, 'bibendum', 'page', 29, 1), +(8966, 'egestas', 'page', 29, 3), +(8967, 'Non', 'page', 29, 1), +(8968, 'lacus', 'page', 29, 1), +(8969, 'suspendisse', 'page', 29, 3), +(8970, 'interdum', 'page', 29, 1), +(8971, 'Vivamus', 'page', 29, 1), +(8972, 'dictum', 'page', 29, 1), +(8973, 'Duis', 'page', 29, 1), +(8974, 'diam', 'page', 29, 4), +(8975, 'Egestas', 'page', 29, 1), +(8976, 'congue', 'page', 29, 1), +(8977, 'quisque', 'page', 29, 2), +(8978, 'cursus', 'page', 29, 1), +(8979, 'Quis', 'page', 29, 1), +(8980, 'viverra', 'page', 29, 2), +(8981, 'nibh', 'page', 29, 2), +(8982, 'pulvinar', 'page', 29, 3), +(8983, 'Hendrerit', 'page', 29, 1), +(8984, 'rutrum', 'page', 29, 2), +(8985, 'non', 'page', 29, 6), +(8986, 'tellus', 'page', 29, 5), +(8987, 'Metus', 'page', 29, 1), +(8988, 'vulputate', 'page', 29, 2), +(8989, 'felis', 'page', 29, 1), +(8990, 'imperdiet', 'page', 29, 2), +(8991, 'proin', 'page', 29, 2), +(8992, 'Nulla', 'page', 29, 1), +(8993, 'facilisi', 'page', 29, 2), +(8994, 'tempus', 'page', 29, 1), +(8995, 'Eget', 'page', 29, 2), +(8996, 'risus', 'page', 29, 1), +(8997, 'quis', 'page', 29, 1), +(8998, 'Quisque', 'page', 29, 1), +(8999, 'ac', 'page', 29, 2), +(9000, 'nullam', 'page', 29, 2), +(9001, 'nisi', 'page', 29, 2), +(9002, 'est', 'page', 29, 3), +(9003, 'Id', 'page', 29, 1), +(9004, 'vel', 'page', 29, 2), +(9005, 'elementum', 'page', 29, 1), +(9006, 'etiam', 'page', 29, 1), +(9007, 'Pretium', 'page', 29, 1), +(9008, 'potenti', 'page', 29, 1), +(9009, 'Aliquam', 'page', 29, 1), +(9010, 'maecenas', 'page', 29, 1), +(9011, 'ultricies', 'page', 29, 1), +(9012, 'Tellus', 'page', 29, 1), +(9013, 'tortor', 'page', 29, 1), +(9014, 'aliquam', 'page', 29, 1), +(9015, 'Facilisi', 'page', 29, 1), +(9016, 'odio', 'page', 29, 1), +(9017, 'Et', 'page', 29, 1), +(9018, 'sollicitudin', 'page', 29, 1), +(9019, 'phasellus', 'page', 29, 1), +(9020, 'Nullam', 'page', 29, 1), +(9021, 'Quam', 'page', 29, 1), +(9022, 'ante', 'page', 29, 1), +(9023, 'Nisi', 'page', 29, 1), +(9024, 'vitae', 'page', 29, 1), +(9025, 'suscipit', 'page', 29, 1), +(9026, 'Felis', 'page', 29, 1), +(9027, 'leo', 'page', 29, 1), +(9028, 'porta', 'page', 29, 1), +(9029, 'Conclusion', 'page', 29, 4), +(9030, 'I', 'page', 29, 1), +(9031, 'hope', 'page', 29, 1), +(9032, 'you', 'page', 29, 1), +(9033, 'enjoyed', 'page', 29, 1), +(9034, 'browsing', 'page', 29, 1), +(9035, 'almost', 'page', 29, 1), +(9036, 'pointless', 'page', 29, 1), +(9037, 'As', 'page', 29, 1), +(9038, 'reward', 'page', 29, 1), +(9039, 'check', 'page', 29, 1), +(9040, 'out', 'page', 29, 1), +(9041, 'sweet', 'page', 29, 1), +(9042, 'video', 'page', 29, 1), +(9043, 'Contributing', 'page', 30, 40), +(9044, 'Description', 'page', 30, 1), +(9045, 'Tutorial', 'page', 30, 1), +(9046, 'on', 'page', 30, 2), +(9047, 'contributing', 'page', 30, 1), +(9048, 'to', 'page', 30, 14), +(9049, 'the', 'page', 30, 6), +(9050, 'BookStack', 'page', 30, 2), +(9051, 'knowledge', 'page', 30, 3), +(9052, 'base', 'page', 30, 5), +(9053, 'An', 'page', 30, 4), +(9054, 'Example', 'page', 30, 4), +(9055, 'Document', 'page', 30, 4), +(9056, 'Welcome', 'page', 30, 1), +(9057, 'This', 'page', 30, 2), +(9058, 'is', 'page', 30, 7), +(9059, 'a', 'page', 30, 11), +(9060, 'filler', 'page', 30, 1), +(9061, 'page', 'page', 30, 1), +(9062, 'show', 'page', 30, 1), +(9063, 'off', 'page', 30, 1), +(9064, 'formatting', 'page', 30, 1), +(9065, 'of', 'page', 30, 6), +(9066, 'documents', 'page', 30, 1), +(9067, ' ', 'page', 30, 1), +(9068, 'All', 'page', 30, 1), +(9069, 'content', 'page', 30, 1), +(9070, 'aside', 'page', 30, 2), +(9071, 'from', 'page', 30, 2), +(9072, 'description', 'page', 30, 1), +(9073, 'at', 'page', 30, 3), +(9074, 'top', 'page', 30, 1), +(9075, 'this', 'page', 30, 3), +(9076, 'document', 'page', 30, 3), +(9077, 'unrelated', 'page', 30, 1), +(9078, 's', 'page', 30, 1), +(9079, 'actual', 'page', 30, 1), +(9080, 'purposes', 'page', 30, 2), +(9081, 'and', 'page', 30, 9), +(9082, 'should', 'page', 30, 1), +(9083, 'not', 'page', 30, 1), +(9084, 'be', 'page', 30, 4), +(9085, 'used', 'page', 30, 3), +(9086, 'demonstrative', 'page', 30, 1), +(9087, 'Further', 'page', 30, 4), +(9088, 'Content', 'page', 30, 8), +(9089, 'The', 'page', 30, 1), +(9090, 'purpose', 'page', 30, 1), +(9091, 'act', 'page', 30, 1), +(9092, 'as', 'page', 30, 2), +(9093, 'centralized', 'page', 30, 1), +(9094, 'organized', 'page', 30, 2), +(9095, 'platform', 'page', 30, 1), +(9096, 'access', 'page', 30, 1), +(9097, 'guides', 'page', 30, 4), +(9098, 'tutorials', 'page', 30, 1), +(9099, 'troubleshooting', 'page', 30, 1), +(9100, 'information', 'page', 30, 2), +(9101, 'other', 'page', 30, 2), +(9102, 'resources', 'page', 30, 1), +(9103, 'Knowledge', 'page', 30, 3), +(9104, 'systems', 'page', 30, 3), +(9105, 'come', 'page', 30, 1), +(9106, 'in', 'page', 30, 6), +(9107, 'different', 'page', 30, 1), +(9108, 'flavors', 'page', 30, 1), +(9109, 'for', 'page', 30, 3), +(9110, 'example', 'page', 30, 1), +(9111, 'there', 'page', 30, 1), +(9112, 'may', 'page', 30, 1), +(9113, 'number', 'page', 30, 1), +(9114, 'predefined', 'page', 30, 1), +(9115, 'modules', 'page', 30, 1), +(9116, 'that', 'page', 30, 2), +(9117, 'can', 'page', 30, 3), +(9118, 'added', 'page', 30, 1), +(9119, 'removed', 'page', 30, 1), +(9120, 'developed', 'page', 30, 1), +(9121, 'an', 'page', 30, 1), +(9122, 'integrated', 'page', 30, 1), +(9123, 'manner', 'page', 30, 1), +(9124, 'with', 'page', 30, 2), +(9125, 'products', 'page', 30, 1), +(9126, 'are', 'page', 30, 1), +(9127, 'most', 'page', 30, 1), +(9128, 'frequently', 'page', 30, 1), +(9129, 'contain', 'page', 30, 1), +(9130, 'detailed', 'page', 30, 1), +(9131, 'These', 'page', 30, 1), +(9132, 'include', 'page', 30, 2), +(9133, 'solutions', 'page', 30, 1), +(9134, 'wide', 'page', 30, 1), +(9135, 'range', 'page', 30, 1), +(9136, 'technical', 'page', 30, 1), +(9137, 'problems', 'page', 30, 1), +(9138, 'but', 'page', 30, 1), +(9139, 'also', 'page', 30, 1), +(9140, 'every', 'page', 30, 1), +(9141, 'aspect', 'page', 30, 1), +(9142, 'programming', 'page', 30, 1), +(9143, 'hardware', 'page', 30, 1), +(9144, 'software', 'page', 30, 2), +(9145, 'topics', 'page', 30, 1), +(9146, 'business', 'page', 30, 1), +(9147, 'concepts', 'page', 30, 1), +(9148, 'Another', 'page', 30, 1), +(9149, 'reason', 'page', 30, 1), +(9150, 'consider', 'page', 30, 1), +(9151, 'Base', 'page', 30, 1), +(9152, 'it', 'page', 30, 3), +(9153, 'often', 'page', 30, 1), +(9154, 'single', 'page', 30, 1), +(9155, 'entry', 'page', 30, 1), +(9156, 'point', 'page', 30, 1), +(9157, 'system', 'page', 30, 2), +(9158, 'very', 'page', 30, 1), +(9159, 'convenient', 'page', 30, 1), +(9160, 'feature', 'page', 30, 1), +(9161, 'remote', 'page', 30, 1), +(9162, 'clients', 'page', 30, 1), +(9163, 'who', 'page', 30, 2), +(9164, 'need', 'page', 30, 2), +(9165, 'select', 'page', 30, 1), +(9166, 'particular', 'page', 30, 2), +(9167, 'program', 'page', 30, 1), +(9168, 'download', 'page', 30, 1), +(9169, 'their', 'page', 30, 1), +(9170, 'computer', 'page', 30, 1), +(9171, 'or', 'page', 30, 1), +(9172, 'quickly', 'page', 30, 1), +(9173, 'learn', 'page', 30, 2), +(9174, 'how', 'page', 30, 2), +(9175, 'configure', 'page', 30, 1), +(9176, 'It', 'page', 30, 1), +(9177, 'particularly', 'page', 30, 1), +(9178, 'useful', 'page', 30, 1), +(9179, 'schools', 'page', 30, 1), +(9180, 'where', 'page', 30, 1), +(9181, 'users', 'page', 30, 1), +(9182, 'easily', 'page', 30, 1), +(9183, 'about', 'page', 30, 1), +(9184, 'application', 'page', 30, 1), +(9185, 'then', 'page', 30, 1), +(9186, 'use', 'page', 30, 1), +(9187, 'without', 'page', 30, 1), +(9188, 'having', 'page', 30, 1), +(9189, 'understand', 'page', 30, 1), +(9190, 'works', 'page', 30, 1), +(9191, 'Even', 'page', 30, 4), +(9192, 'Less', 'page', 30, 4), +(9193, 'Useful', 'page', 30, 4), +(9194, 'Lorem', 'page', 30, 2), +(9195, 'ipsum', 'page', 30, 2), +(9196, 'dolor', 'page', 30, 4), +(9197, 'sit', 'page', 30, 7), +(9198, 'amet', 'page', 30, 6), +(9199, 'consectetur', 'page', 30, 4), +(9200, 'adipiscing', 'page', 30, 3), +(9201, 'elit', 'page', 30, 3), +(9202, 'sed', 'page', 30, 5), +(9203, 'do', 'page', 30, 1), +(9204, 'eiusmod', 'page', 30, 1), +(9205, 'tempor', 'page', 30, 1), +(9206, 'incididunt', 'page', 30, 1), +(9207, 'ut', 'page', 30, 4), +(9208, 'labore', 'page', 30, 1), +(9209, 'et', 'page', 30, 2), +(9210, 'dolore', 'page', 30, 1), +(9211, 'magna', 'page', 30, 1), +(9212, 'aliqua', 'page', 30, 1), +(9213, 'Pellentesque', 'page', 30, 1), +(9214, 'porttitor', 'page', 30, 3), +(9215, 'eget', 'page', 30, 3), +(9216, 'morbi', 'page', 30, 5), +(9217, 'Nunc', 'page', 30, 1), +(9218, 'velit', 'page', 30, 1), +(9219, 'dignissim', 'page', 30, 3), +(9220, 'sodales', 'page', 30, 1), +(9221, 'eu', 'page', 30, 5), +(9222, 'sem', 'page', 30, 1), +(9223, 'integer', 'page', 30, 1), +(9224, 'Gravida', 'page', 30, 1), +(9225, 'cum', 'page', 30, 1), +(9226, 'sociis', 'page', 30, 1), +(9227, 'natoque', 'page', 30, 1), +(9228, 'penatibus', 'page', 30, 1), +(9229, 'magnis', 'page', 30, 1), +(9230, 'dis', 'page', 30, 1), +(9231, 'Proin', 'page', 30, 1), +(9232, 'libero', 'page', 30, 2), +(9233, 'enim', 'page', 30, 4), +(9234, 'faucibus', 'page', 30, 3), +(9235, 'turpis', 'page', 30, 1), +(9236, 'In', 'page', 30, 2), +(9237, 'fermentum', 'page', 30, 5), +(9238, 'posuere', 'page', 30, 2), +(9239, 'urna', 'page', 30, 3), +(9240, 'nec', 'page', 30, 1), +(9241, 'tincidunt', 'page', 30, 2), +(9242, 'praesent', 'page', 30, 1), +(9243, 'semper', 'page', 30, 1), +(9244, 'Varius', 'page', 30, 1), +(9245, 'duis', 'page', 30, 2), +(9246, 'lorem', 'page', 30, 2), +(9247, 'Placerat', 'page', 30, 1), +(9248, 'orci', 'page', 30, 4), +(9249, 'nulla', 'page', 30, 4), +(9250, 'pellentesque', 'page', 30, 2), +(9251, 'venenatis', 'page', 30, 1), +(9252, 'Integer', 'page', 30, 2), +(9253, 'feugiat', 'page', 30, 2), +(9254, 'scelerisque', 'page', 30, 3), +(9255, 'varius', 'page', 30, 4), +(9256, 'nunc', 'page', 30, 2), +(9257, 'Diam', 'page', 30, 1), +(9258, 'quam', 'page', 30, 5), +(9259, 'massa', 'page', 30, 2), +(9260, 'Dolor', 'page', 30, 1), +(9261, 'Tempus', 'page', 30, 1), +(9262, 'iaculis', 'page', 30, 2), +(9263, 'id', 'page', 30, 3), +(9264, 'volutpat', 'page', 30, 2), +(9265, 'Ac', 'page', 30, 1), +(9266, 'auctor', 'page', 30, 2), +(9267, 'augue', 'page', 30, 5), +(9268, 'mauris', 'page', 30, 4), +(9269, 'neque', 'page', 30, 3), +(9270, 'gravida', 'page', 30, 2), +(9271, 'Blandit', 'page', 30, 1), +(9272, 'cras', 'page', 30, 4), +(9273, 'ornare', 'page', 30, 1), +(9274, 'arcu', 'page', 30, 4), +(9275, 'mi', 'page', 30, 2), +(9276, 'bibendum', 'page', 30, 1), +(9277, 'egestas', 'page', 30, 3), +(9278, 'Non', 'page', 30, 1), +(9279, 'lacus', 'page', 30, 1), +(9280, 'suspendisse', 'page', 30, 3), +(9281, 'interdum', 'page', 30, 1), +(9282, 'Vivamus', 'page', 30, 1), +(9283, 'dictum', 'page', 30, 1), +(9284, 'Duis', 'page', 30, 1), +(9285, 'diam', 'page', 30, 4), +(9286, 'Egestas', 'page', 30, 1), +(9287, 'congue', 'page', 30, 1), +(9288, 'quisque', 'page', 30, 2), +(9289, 'cursus', 'page', 30, 1), +(9290, 'Quis', 'page', 30, 1), +(9291, 'viverra', 'page', 30, 2), +(9292, 'nibh', 'page', 30, 2), +(9293, 'pulvinar', 'page', 30, 3), +(9294, 'Hendrerit', 'page', 30, 1), +(9295, 'rutrum', 'page', 30, 2), +(9296, 'non', 'page', 30, 6), +(9297, 'tellus', 'page', 30, 5), +(9298, 'Metus', 'page', 30, 1), +(9299, 'vulputate', 'page', 30, 2), +(9300, 'felis', 'page', 30, 1), +(9301, 'imperdiet', 'page', 30, 2), +(9302, 'proin', 'page', 30, 2); +INSERT INTO `search_terms` (`id`, `term`, `entity_type`, `entity_id`, `score`) VALUES +(9303, 'Nulla', 'page', 30, 1), +(9304, 'facilisi', 'page', 30, 2), +(9305, 'tempus', 'page', 30, 1), +(9306, 'Eget', 'page', 30, 2), +(9307, 'risus', 'page', 30, 1), +(9308, 'quis', 'page', 30, 1), +(9309, 'Quisque', 'page', 30, 1), +(9310, 'ac', 'page', 30, 2), +(9311, 'nullam', 'page', 30, 2), +(9312, 'nisi', 'page', 30, 2), +(9313, 'est', 'page', 30, 3), +(9314, 'Id', 'page', 30, 1), +(9315, 'vel', 'page', 30, 2), +(9316, 'elementum', 'page', 30, 1), +(9317, 'etiam', 'page', 30, 1), +(9318, 'Pretium', 'page', 30, 1), +(9319, 'potenti', 'page', 30, 1), +(9320, 'Aliquam', 'page', 30, 1), +(9321, 'maecenas', 'page', 30, 1), +(9322, 'ultricies', 'page', 30, 1), +(9323, 'Tellus', 'page', 30, 1), +(9324, 'tortor', 'page', 30, 1), +(9325, 'aliquam', 'page', 30, 1), +(9326, 'Facilisi', 'page', 30, 1), +(9327, 'odio', 'page', 30, 1), +(9328, 'Et', 'page', 30, 1), +(9329, 'sollicitudin', 'page', 30, 1), +(9330, 'phasellus', 'page', 30, 1), +(9331, 'Nullam', 'page', 30, 1), +(9332, 'Quam', 'page', 30, 1), +(9333, 'ante', 'page', 30, 1), +(9334, 'Nisi', 'page', 30, 1), +(9335, 'vitae', 'page', 30, 1), +(9336, 'suscipit', 'page', 30, 1), +(9337, 'Felis', 'page', 30, 1), +(9338, 'leo', 'page', 30, 1), +(9339, 'porta', 'page', 30, 1), +(9340, 'Conclusion', 'page', 30, 4), +(9341, 'I', 'page', 30, 1), +(9342, 'hope', 'page', 30, 1), +(9343, 'you', 'page', 30, 1), +(9344, 'enjoyed', 'page', 30, 1), +(9345, 'browsing', 'page', 30, 1), +(9346, 'almost', 'page', 30, 1), +(9347, 'pointless', 'page', 30, 1), +(9348, 'As', 'page', 30, 1), +(9349, 'reward', 'page', 30, 1), +(9350, 'check', 'page', 30, 1), +(9351, 'out', 'page', 30, 1), +(9352, 'sweet', 'page', 30, 1), +(9353, 'video', 'page', 30, 1), +(9354, 'External', 'page', 31, 40), +(9355, 'Resources', 'page', 31, 40), +(9356, 'Description', 'page', 31, 1), +(9357, 'Links', 'page', 31, 1), +(9358, 'and', 'page', 31, 11), +(9359, 'directions', 'page', 31, 1), +(9360, 'to', 'page', 31, 14), +(9361, 'resources', 'page', 31, 2), +(9362, 'that', 'page', 31, 3), +(9363, 'cover', 'page', 31, 1), +(9364, 'BookStack', 'page', 31, 2), +(9365, 'features', 'page', 31, 1), +(9366, 'functionality', 'page', 31, 1), +(9367, 'An', 'page', 31, 4), +(9368, 'Example', 'page', 31, 4), +(9369, 'Document', 'page', 31, 4), +(9370, 'Welcome', 'page', 31, 1), +(9371, 'This', 'page', 31, 2), +(9372, 'is', 'page', 31, 7), +(9373, 'a', 'page', 31, 11), +(9374, 'filler', 'page', 31, 1), +(9375, 'page', 'page', 31, 1), +(9376, 'show', 'page', 31, 1), +(9377, 'off', 'page', 31, 1), +(9378, 'the', 'page', 31, 5), +(9379, 'formatting', 'page', 31, 1), +(9380, 'of', 'page', 31, 6), +(9381, 'documents', 'page', 31, 1), +(9382, ' ', 'page', 31, 1), +(9383, 'All', 'page', 31, 1), +(9384, 'content', 'page', 31, 1), +(9385, 'aside', 'page', 31, 2), +(9386, 'from', 'page', 31, 2), +(9387, 'description', 'page', 31, 1), +(9388, 'at', 'page', 31, 3), +(9389, 'top', 'page', 31, 1), +(9390, 'this', 'page', 31, 3), +(9391, 'document', 'page', 31, 3), +(9392, 'unrelated', 'page', 31, 1), +(9393, 's', 'page', 31, 1), +(9394, 'actual', 'page', 31, 1), +(9395, 'purposes', 'page', 31, 2), +(9396, 'should', 'page', 31, 1), +(9397, 'not', 'page', 31, 1), +(9398, 'be', 'page', 31, 4), +(9399, 'used', 'page', 31, 3), +(9400, 'demonstrative', 'page', 31, 1), +(9401, 'Further', 'page', 31, 4), +(9402, 'Content', 'page', 31, 8), +(9403, 'The', 'page', 31, 1), +(9404, 'purpose', 'page', 31, 1), +(9405, 'knowledge', 'page', 31, 2), +(9406, 'base', 'page', 31, 4), +(9407, 'act', 'page', 31, 1), +(9408, 'as', 'page', 31, 2), +(9409, 'centralized', 'page', 31, 1), +(9410, 'organized', 'page', 31, 2), +(9411, 'platform', 'page', 31, 1), +(9412, 'access', 'page', 31, 1), +(9413, 'guides', 'page', 31, 4), +(9414, 'tutorials', 'page', 31, 1), +(9415, 'troubleshooting', 'page', 31, 1), +(9416, 'information', 'page', 31, 2), +(9417, 'other', 'page', 31, 2), +(9418, 'Knowledge', 'page', 31, 3), +(9419, 'systems', 'page', 31, 3), +(9420, 'come', 'page', 31, 1), +(9421, 'in', 'page', 31, 6), +(9422, 'different', 'page', 31, 1), +(9423, 'flavors', 'page', 31, 1), +(9424, 'for', 'page', 31, 3), +(9425, 'example', 'page', 31, 1), +(9426, 'there', 'page', 31, 1), +(9427, 'may', 'page', 31, 1), +(9428, 'number', 'page', 31, 1), +(9429, 'predefined', 'page', 31, 1), +(9430, 'modules', 'page', 31, 1), +(9431, 'can', 'page', 31, 3), +(9432, 'added', 'page', 31, 1), +(9433, 'removed', 'page', 31, 1), +(9434, 'developed', 'page', 31, 1), +(9435, 'an', 'page', 31, 1), +(9436, 'integrated', 'page', 31, 1), +(9437, 'manner', 'page', 31, 1), +(9438, 'with', 'page', 31, 2), +(9439, 'products', 'page', 31, 1), +(9440, 'are', 'page', 31, 1), +(9441, 'most', 'page', 31, 1), +(9442, 'frequently', 'page', 31, 1), +(9443, 'contain', 'page', 31, 1), +(9444, 'detailed', 'page', 31, 1), +(9445, 'These', 'page', 31, 1), +(9446, 'include', 'page', 31, 2), +(9447, 'solutions', 'page', 31, 1), +(9448, 'wide', 'page', 31, 1), +(9449, 'range', 'page', 31, 1), +(9450, 'technical', 'page', 31, 1), +(9451, 'problems', 'page', 31, 1), +(9452, 'but', 'page', 31, 1), +(9453, 'also', 'page', 31, 1), +(9454, 'on', 'page', 31, 1), +(9455, 'every', 'page', 31, 1), +(9456, 'aspect', 'page', 31, 1), +(9457, 'programming', 'page', 31, 1), +(9458, 'hardware', 'page', 31, 1), +(9459, 'software', 'page', 31, 2), +(9460, 'topics', 'page', 31, 1), +(9461, 'business', 'page', 31, 1), +(9462, 'concepts', 'page', 31, 1), +(9463, 'Another', 'page', 31, 1), +(9464, 'reason', 'page', 31, 1), +(9465, 'consider', 'page', 31, 1), +(9466, 'Base', 'page', 31, 1), +(9467, 'it', 'page', 31, 3), +(9468, 'often', 'page', 31, 1), +(9469, 'single', 'page', 31, 1), +(9470, 'entry', 'page', 31, 1), +(9471, 'point', 'page', 31, 1), +(9472, 'system', 'page', 31, 2), +(9473, 'very', 'page', 31, 1), +(9474, 'convenient', 'page', 31, 1), +(9475, 'feature', 'page', 31, 1), +(9476, 'remote', 'page', 31, 1), +(9477, 'clients', 'page', 31, 1), +(9478, 'who', 'page', 31, 2), +(9479, 'need', 'page', 31, 2), +(9480, 'select', 'page', 31, 1), +(9481, 'particular', 'page', 31, 2), +(9482, 'program', 'page', 31, 1), +(9483, 'download', 'page', 31, 1), +(9484, 'their', 'page', 31, 1), +(9485, 'computer', 'page', 31, 1), +(9486, 'or', 'page', 31, 1), +(9487, 'quickly', 'page', 31, 1), +(9488, 'learn', 'page', 31, 2), +(9489, 'how', 'page', 31, 2), +(9490, 'configure', 'page', 31, 1), +(9491, 'It', 'page', 31, 1), +(9492, 'particularly', 'page', 31, 1), +(9493, 'useful', 'page', 31, 1), +(9494, 'schools', 'page', 31, 1), +(9495, 'where', 'page', 31, 1), +(9496, 'users', 'page', 31, 1), +(9497, 'easily', 'page', 31, 1), +(9498, 'about', 'page', 31, 1), +(9499, 'application', 'page', 31, 1), +(9500, 'then', 'page', 31, 1), +(9501, 'use', 'page', 31, 1), +(9502, 'without', 'page', 31, 1), +(9503, 'having', 'page', 31, 1), +(9504, 'understand', 'page', 31, 1), +(9505, 'works', 'page', 31, 1), +(9506, 'Even', 'page', 31, 4), +(9507, 'Less', 'page', 31, 4), +(9508, 'Useful', 'page', 31, 4), +(9509, 'Lorem', 'page', 31, 2), +(9510, 'ipsum', 'page', 31, 2), +(9511, 'dolor', 'page', 31, 4), +(9512, 'sit', 'page', 31, 7), +(9513, 'amet', 'page', 31, 6), +(9514, 'consectetur', 'page', 31, 4), +(9515, 'adipiscing', 'page', 31, 3), +(9516, 'elit', 'page', 31, 3), +(9517, 'sed', 'page', 31, 5), +(9518, 'do', 'page', 31, 1), +(9519, 'eiusmod', 'page', 31, 1), +(9520, 'tempor', 'page', 31, 1), +(9521, 'incididunt', 'page', 31, 1), +(9522, 'ut', 'page', 31, 4), +(9523, 'labore', 'page', 31, 1), +(9524, 'et', 'page', 31, 2), +(9525, 'dolore', 'page', 31, 1), +(9526, 'magna', 'page', 31, 1), +(9527, 'aliqua', 'page', 31, 1), +(9528, 'Pellentesque', 'page', 31, 1), +(9529, 'porttitor', 'page', 31, 3), +(9530, 'eget', 'page', 31, 3), +(9531, 'morbi', 'page', 31, 5), +(9532, 'Nunc', 'page', 31, 1), +(9533, 'velit', 'page', 31, 1), +(9534, 'dignissim', 'page', 31, 3), +(9535, 'sodales', 'page', 31, 1), +(9536, 'eu', 'page', 31, 5), +(9537, 'sem', 'page', 31, 1), +(9538, 'integer', 'page', 31, 1), +(9539, 'Gravida', 'page', 31, 1), +(9540, 'cum', 'page', 31, 1), +(9541, 'sociis', 'page', 31, 1), +(9542, 'natoque', 'page', 31, 1), +(9543, 'penatibus', 'page', 31, 1), +(9544, 'magnis', 'page', 31, 1), +(9545, 'dis', 'page', 31, 1), +(9546, 'Proin', 'page', 31, 1), +(9547, 'libero', 'page', 31, 2), +(9548, 'enim', 'page', 31, 4), +(9549, 'faucibus', 'page', 31, 3), +(9550, 'turpis', 'page', 31, 1), +(9551, 'In', 'page', 31, 2), +(9552, 'fermentum', 'page', 31, 5), +(9553, 'posuere', 'page', 31, 2), +(9554, 'urna', 'page', 31, 3), +(9555, 'nec', 'page', 31, 1), +(9556, 'tincidunt', 'page', 31, 2), +(9557, 'praesent', 'page', 31, 1), +(9558, 'semper', 'page', 31, 1), +(9559, 'Varius', 'page', 31, 1), +(9560, 'duis', 'page', 31, 2), +(9561, 'lorem', 'page', 31, 2), +(9562, 'Placerat', 'page', 31, 1), +(9563, 'orci', 'page', 31, 4), +(9564, 'nulla', 'page', 31, 4), +(9565, 'pellentesque', 'page', 31, 2), +(9566, 'venenatis', 'page', 31, 1), +(9567, 'Integer', 'page', 31, 2), +(9568, 'feugiat', 'page', 31, 2), +(9569, 'scelerisque', 'page', 31, 3), +(9570, 'varius', 'page', 31, 4), +(9571, 'nunc', 'page', 31, 2), +(9572, 'Diam', 'page', 31, 1), +(9573, 'quam', 'page', 31, 5), +(9574, 'massa', 'page', 31, 2), +(9575, 'Dolor', 'page', 31, 1), +(9576, 'Tempus', 'page', 31, 1), +(9577, 'iaculis', 'page', 31, 2), +(9578, 'id', 'page', 31, 3), +(9579, 'volutpat', 'page', 31, 2), +(9580, 'Ac', 'page', 31, 1), +(9581, 'auctor', 'page', 31, 2), +(9582, 'augue', 'page', 31, 5), +(9583, 'mauris', 'page', 31, 4), +(9584, 'neque', 'page', 31, 3), +(9585, 'gravida', 'page', 31, 2), +(9586, 'Blandit', 'page', 31, 1), +(9587, 'cras', 'page', 31, 4), +(9588, 'ornare', 'page', 31, 1), +(9589, 'arcu', 'page', 31, 4), +(9590, 'mi', 'page', 31, 2), +(9591, 'bibendum', 'page', 31, 1), +(9592, 'egestas', 'page', 31, 3), +(9593, 'Non', 'page', 31, 1), +(9594, 'lacus', 'page', 31, 1), +(9595, 'suspendisse', 'page', 31, 3), +(9596, 'interdum', 'page', 31, 1), +(9597, 'Vivamus', 'page', 31, 1), +(9598, 'dictum', 'page', 31, 1), +(9599, 'Duis', 'page', 31, 1), +(9600, 'diam', 'page', 31, 4), +(9601, 'Egestas', 'page', 31, 1), +(9602, 'congue', 'page', 31, 1), +(9603, 'quisque', 'page', 31, 2), +(9604, 'cursus', 'page', 31, 1), +(9605, 'Quis', 'page', 31, 1), +(9606, 'viverra', 'page', 31, 2), +(9607, 'nibh', 'page', 31, 2), +(9608, 'pulvinar', 'page', 31, 3), +(9609, 'Hendrerit', 'page', 31, 1), +(9610, 'rutrum', 'page', 31, 2), +(9611, 'non', 'page', 31, 6), +(9612, 'tellus', 'page', 31, 5), +(9613, 'Metus', 'page', 31, 1), +(9614, 'vulputate', 'page', 31, 2), +(9615, 'felis', 'page', 31, 1), +(9616, 'imperdiet', 'page', 31, 2), +(9617, 'proin', 'page', 31, 2), +(9618, 'Nulla', 'page', 31, 1), +(9619, 'facilisi', 'page', 31, 2), +(9620, 'tempus', 'page', 31, 1), +(9621, 'Eget', 'page', 31, 2), +(9622, 'risus', 'page', 31, 1), +(9623, 'quis', 'page', 31, 1), +(9624, 'Quisque', 'page', 31, 1), +(9625, 'ac', 'page', 31, 2), +(9626, 'nullam', 'page', 31, 2), +(9627, 'nisi', 'page', 31, 2), +(9628, 'est', 'page', 31, 3), +(9629, 'Id', 'page', 31, 1), +(9630, 'vel', 'page', 31, 2), +(9631, 'elementum', 'page', 31, 1), +(9632, 'etiam', 'page', 31, 1), +(9633, 'Pretium', 'page', 31, 1), +(9634, 'potenti', 'page', 31, 1), +(9635, 'Aliquam', 'page', 31, 1), +(9636, 'maecenas', 'page', 31, 1), +(9637, 'ultricies', 'page', 31, 1), +(9638, 'Tellus', 'page', 31, 1), +(9639, 'tortor', 'page', 31, 1), +(9640, 'aliquam', 'page', 31, 1), +(9641, 'Facilisi', 'page', 31, 1), +(9642, 'odio', 'page', 31, 1), +(9643, 'Et', 'page', 31, 1), +(9644, 'sollicitudin', 'page', 31, 1), +(9645, 'phasellus', 'page', 31, 1), +(9646, 'Nullam', 'page', 31, 1), +(9647, 'Quam', 'page', 31, 1), +(9648, 'ante', 'page', 31, 1), +(9649, 'Nisi', 'page', 31, 1), +(9650, 'vitae', 'page', 31, 1), +(9651, 'suscipit', 'page', 31, 1), +(9652, 'Felis', 'page', 31, 1), +(9653, 'leo', 'page', 31, 1), +(9654, 'porta', 'page', 31, 1), +(9655, 'Conclusion', 'page', 31, 4), +(9656, 'I', 'page', 31, 1), +(9657, 'hope', 'page', 31, 1), +(9658, 'you', 'page', 31, 1), +(9659, 'enjoyed', 'page', 31, 1), +(9660, 'browsing', 'page', 31, 1), +(9661, 'almost', 'page', 31, 1), +(9662, 'pointless', 'page', 31, 1), +(9663, 'As', 'page', 31, 1), +(9664, 'reward', 'page', 31, 1), +(9665, 'check', 'page', 31, 1), +(9666, 'out', 'page', 31, 1), +(9667, 'sweet', 'page', 31, 1), +(9668, 'video', 'page', 31, 1), +(9669, 'Client', 'book', 16, 48), +(9670, 'Support', 'book', 16, 49), +(9671, 'information', 'book', 16, 1), +(9672, 'for', 'book', 16, 1), +(9673, 'the', 'book', 16, 2), +(9674, 'clientele', 'book', 16, 1), +(9675, 'of', 'book', 16, 1), +(9676, 'Thoth', 'book', 16, 1), +(9677, 'Tech', 'book', 16, 1), +(9678, 'art', 'book', 16, 1), +(9679, 'gallery', 'book', 16, 1), +(9680, 'project', 'book', 16, 1), +(9681, 'Contact', 'page', 32, 40), +(9682, 'Information', 'page', 32, 40), +(9683, 'Description', 'page', 32, 1), +(9684, 'Project', 'page', 32, 1), +(9685, 'developer', 'page', 32, 1), +(9686, 'contact', 'page', 32, 1), +(9687, 'information', 'page', 32, 3), +(9688, 'for', 'page', 32, 4), +(9689, 'contacts', 'page', 32, 1), +(9690, 'regarding', 'page', 32, 1), +(9691, 'specialized', 'page', 32, 1), +(9692, 'issues', 'page', 32, 1), +(9693, 'or', 'page', 32, 2), +(9694, 'troubleshooting', 'page', 32, 2), +(9695, 'An', 'page', 32, 4), +(9696, 'Example', 'page', 32, 4), +(9697, 'Document', 'page', 32, 4), +(9698, 'Welcome', 'page', 32, 1), +(9699, 'This', 'page', 32, 2), +(9700, 'is', 'page', 32, 7), +(9701, 'a', 'page', 32, 11), +(9702, 'filler', 'page', 32, 1), +(9703, 'page', 'page', 32, 1), +(9704, 'to', 'page', 32, 13), +(9705, 'show', 'page', 32, 1), +(9706, 'off', 'page', 32, 1), +(9707, 'the', 'page', 32, 5), +(9708, 'formatting', 'page', 32, 1), +(9709, 'of', 'page', 32, 6), +(9710, 'BookStack', 'page', 32, 1), +(9711, 'documents', 'page', 32, 1), +(9712, ' ', 'page', 32, 1), +(9713, 'All', 'page', 32, 1), +(9714, 'content', 'page', 32, 1), +(9715, 'aside', 'page', 32, 2), +(9716, 'from', 'page', 32, 2), +(9717, 'description', 'page', 32, 1), +(9718, 'at', 'page', 32, 3), +(9719, 'top', 'page', 32, 1), +(9720, 'this', 'page', 32, 3), +(9721, 'document', 'page', 32, 3), +(9722, 'unrelated', 'page', 32, 1), +(9723, 's', 'page', 32, 1), +(9724, 'actual', 'page', 32, 1), +(9725, 'purposes', 'page', 32, 2), +(9726, 'and', 'page', 32, 9), +(9727, 'should', 'page', 32, 1), +(9728, 'not', 'page', 32, 1), +(9729, 'be', 'page', 32, 4), +(9730, 'used', 'page', 32, 3), +(9731, 'demonstrative', 'page', 32, 1), +(9732, 'Further', 'page', 32, 4), +(9733, 'Content', 'page', 32, 8), +(9734, 'The', 'page', 32, 1), +(9735, 'purpose', 'page', 32, 1), +(9736, 'knowledge', 'page', 32, 2), +(9737, 'base', 'page', 32, 4), +(9738, 'act', 'page', 32, 1), +(9739, 'as', 'page', 32, 2), +(9740, 'centralized', 'page', 32, 1), +(9741, 'organized', 'page', 32, 2), +(9742, 'platform', 'page', 32, 1), +(9743, 'access', 'page', 32, 1), +(9744, 'guides', 'page', 32, 4), +(9745, 'tutorials', 'page', 32, 1), +(9746, 'other', 'page', 32, 2), +(9747, 'resources', 'page', 32, 1), +(9748, 'Knowledge', 'page', 32, 3), +(9749, 'systems', 'page', 32, 3), +(9750, 'come', 'page', 32, 1), +(9751, 'in', 'page', 32, 6), +(9752, 'different', 'page', 32, 1), +(9753, 'flavors', 'page', 32, 1), +(9754, 'example', 'page', 32, 1), +(9755, 'there', 'page', 32, 1), +(9756, 'may', 'page', 32, 1), +(9757, 'number', 'page', 32, 1), +(9758, 'predefined', 'page', 32, 1), +(9759, 'modules', 'page', 32, 1), +(9760, 'that', 'page', 32, 2), +(9761, 'can', 'page', 32, 3), +(9762, 'added', 'page', 32, 1), +(9763, 'removed', 'page', 32, 1), +(9764, 'developed', 'page', 32, 1), +(9765, 'an', 'page', 32, 1), +(9766, 'integrated', 'page', 32, 1), +(9767, 'manner', 'page', 32, 1), +(9768, 'with', 'page', 32, 2), +(9769, 'products', 'page', 32, 1), +(9770, 'are', 'page', 32, 1), +(9771, 'most', 'page', 32, 1), +(9772, 'frequently', 'page', 32, 1), +(9773, 'contain', 'page', 32, 1), +(9774, 'detailed', 'page', 32, 1), +(9775, 'These', 'page', 32, 1), +(9776, 'include', 'page', 32, 2), +(9777, 'solutions', 'page', 32, 1), +(9778, 'wide', 'page', 32, 1), +(9779, 'range', 'page', 32, 1), +(9780, 'technical', 'page', 32, 1), +(9781, 'problems', 'page', 32, 1), +(9782, 'but', 'page', 32, 1), +(9783, 'also', 'page', 32, 1), +(9784, 'on', 'page', 32, 1), +(9785, 'every', 'page', 32, 1), +(9786, 'aspect', 'page', 32, 1), +(9787, 'programming', 'page', 32, 1), +(9788, 'hardware', 'page', 32, 1), +(9789, 'software', 'page', 32, 2), +(9790, 'topics', 'page', 32, 1), +(9791, 'business', 'page', 32, 1), +(9792, 'concepts', 'page', 32, 1), +(9793, 'Another', 'page', 32, 1), +(9794, 'reason', 'page', 32, 1), +(9795, 'consider', 'page', 32, 1), +(9796, 'Base', 'page', 32, 1), +(9797, 'it', 'page', 32, 3), +(9798, 'often', 'page', 32, 1), +(9799, 'single', 'page', 32, 1), +(9800, 'entry', 'page', 32, 1), +(9801, 'point', 'page', 32, 1), +(9802, 'system', 'page', 32, 2), +(9803, 'very', 'page', 32, 1), +(9804, 'convenient', 'page', 32, 1), +(9805, 'feature', 'page', 32, 1), +(9806, 'remote', 'page', 32, 1), +(9807, 'clients', 'page', 32, 1), +(9808, 'who', 'page', 32, 2), +(9809, 'need', 'page', 32, 2), +(9810, 'select', 'page', 32, 1), +(9811, 'particular', 'page', 32, 2), +(9812, 'program', 'page', 32, 1), +(9813, 'download', 'page', 32, 1), +(9814, 'their', 'page', 32, 1), +(9815, 'computer', 'page', 32, 1), +(9816, 'quickly', 'page', 32, 1), +(9817, 'learn', 'page', 32, 2), +(9818, 'how', 'page', 32, 2), +(9819, 'configure', 'page', 32, 1), +(9820, 'It', 'page', 32, 1), +(9821, 'particularly', 'page', 32, 1), +(9822, 'useful', 'page', 32, 1), +(9823, 'schools', 'page', 32, 1), +(9824, 'where', 'page', 32, 1), +(9825, 'users', 'page', 32, 1), +(9826, 'easily', 'page', 32, 1), +(9827, 'about', 'page', 32, 1), +(9828, 'application', 'page', 32, 1), +(9829, 'then', 'page', 32, 1), +(9830, 'use', 'page', 32, 1), +(9831, 'without', 'page', 32, 1), +(9832, 'having', 'page', 32, 1), +(9833, 'understand', 'page', 32, 1), +(9834, 'works', 'page', 32, 1), +(9835, 'Even', 'page', 32, 4), +(9836, 'Less', 'page', 32, 4), +(9837, 'Useful', 'page', 32, 4), +(9838, 'Lorem', 'page', 32, 2), +(9839, 'ipsum', 'page', 32, 2), +(9840, 'dolor', 'page', 32, 4), +(9841, 'sit', 'page', 32, 7), +(9842, 'amet', 'page', 32, 6), +(9843, 'consectetur', 'page', 32, 4), +(9844, 'adipiscing', 'page', 32, 3), +(9845, 'elit', 'page', 32, 3), +(9846, 'sed', 'page', 32, 5), +(9847, 'do', 'page', 32, 1), +(9848, 'eiusmod', 'page', 32, 1), +(9849, 'tempor', 'page', 32, 1), +(9850, 'incididunt', 'page', 32, 1), +(9851, 'ut', 'page', 32, 4), +(9852, 'labore', 'page', 32, 1), +(9853, 'et', 'page', 32, 2), +(9854, 'dolore', 'page', 32, 1), +(9855, 'magna', 'page', 32, 1), +(9856, 'aliqua', 'page', 32, 1), +(9857, 'Pellentesque', 'page', 32, 1), +(9858, 'porttitor', 'page', 32, 3), +(9859, 'eget', 'page', 32, 3), +(9860, 'morbi', 'page', 32, 5), +(9861, 'Nunc', 'page', 32, 1), +(9862, 'velit', 'page', 32, 1), +(9863, 'dignissim', 'page', 32, 3), +(9864, 'sodales', 'page', 32, 1), +(9865, 'eu', 'page', 32, 5), +(9866, 'sem', 'page', 32, 1), +(9867, 'integer', 'page', 32, 1), +(9868, 'Gravida', 'page', 32, 1), +(9869, 'cum', 'page', 32, 1), +(9870, 'sociis', 'page', 32, 1), +(9871, 'natoque', 'page', 32, 1), +(9872, 'penatibus', 'page', 32, 1), +(9873, 'magnis', 'page', 32, 1), +(9874, 'dis', 'page', 32, 1), +(9875, 'Proin', 'page', 32, 1), +(9876, 'libero', 'page', 32, 2), +(9877, 'enim', 'page', 32, 4), +(9878, 'faucibus', 'page', 32, 3), +(9879, 'turpis', 'page', 32, 1), +(9880, 'In', 'page', 32, 2), +(9881, 'fermentum', 'page', 32, 5), +(9882, 'posuere', 'page', 32, 2), +(9883, 'urna', 'page', 32, 3), +(9884, 'nec', 'page', 32, 1), +(9885, 'tincidunt', 'page', 32, 2), +(9886, 'praesent', 'page', 32, 1), +(9887, 'semper', 'page', 32, 1), +(9888, 'Varius', 'page', 32, 1), +(9889, 'duis', 'page', 32, 2), +(9890, 'lorem', 'page', 32, 2), +(9891, 'Placerat', 'page', 32, 1), +(9892, 'orci', 'page', 32, 4), +(9893, 'nulla', 'page', 32, 4), +(9894, 'pellentesque', 'page', 32, 2), +(9895, 'venenatis', 'page', 32, 1), +(9896, 'Integer', 'page', 32, 2), +(9897, 'feugiat', 'page', 32, 2), +(9898, 'scelerisque', 'page', 32, 3), +(9899, 'varius', 'page', 32, 4), +(9900, 'nunc', 'page', 32, 2), +(9901, 'Diam', 'page', 32, 1), +(9902, 'quam', 'page', 32, 5), +(9903, 'massa', 'page', 32, 2), +(9904, 'Dolor', 'page', 32, 1), +(9905, 'Tempus', 'page', 32, 1), +(9906, 'iaculis', 'page', 32, 2), +(9907, 'id', 'page', 32, 3), +(9908, 'volutpat', 'page', 32, 2), +(9909, 'Ac', 'page', 32, 1), +(9910, 'auctor', 'page', 32, 2), +(9911, 'augue', 'page', 32, 5), +(9912, 'mauris', 'page', 32, 4), +(9913, 'neque', 'page', 32, 3), +(9914, 'gravida', 'page', 32, 2), +(9915, 'Blandit', 'page', 32, 1), +(9916, 'cras', 'page', 32, 4), +(9917, 'ornare', 'page', 32, 1), +(9918, 'arcu', 'page', 32, 4), +(9919, 'mi', 'page', 32, 2), +(9920, 'bibendum', 'page', 32, 1), +(9921, 'egestas', 'page', 32, 3), +(9922, 'Non', 'page', 32, 1), +(9923, 'lacus', 'page', 32, 1), +(9924, 'suspendisse', 'page', 32, 3), +(9925, 'interdum', 'page', 32, 1), +(9926, 'Vivamus', 'page', 32, 1), +(9927, 'dictum', 'page', 32, 1), +(9928, 'Duis', 'page', 32, 1), +(9929, 'diam', 'page', 32, 4), +(9930, 'Egestas', 'page', 32, 1), +(9931, 'congue', 'page', 32, 1), +(9932, 'quisque', 'page', 32, 2), +(9933, 'cursus', 'page', 32, 1), +(9934, 'Quis', 'page', 32, 1), +(9935, 'viverra', 'page', 32, 2), +(9936, 'nibh', 'page', 32, 2), +(9937, 'pulvinar', 'page', 32, 3), +(9938, 'Hendrerit', 'page', 32, 1), +(9939, 'rutrum', 'page', 32, 2), +(9940, 'non', 'page', 32, 6), +(9941, 'tellus', 'page', 32, 5), +(9942, 'Metus', 'page', 32, 1), +(9943, 'vulputate', 'page', 32, 2), +(9944, 'felis', 'page', 32, 1), +(9945, 'imperdiet', 'page', 32, 2), +(9946, 'proin', 'page', 32, 2), +(9947, 'Nulla', 'page', 32, 1), +(9948, 'facilisi', 'page', 32, 2), +(9949, 'tempus', 'page', 32, 1), +(9950, 'Eget', 'page', 32, 2), +(9951, 'risus', 'page', 32, 1), +(9952, 'quis', 'page', 32, 1), +(9953, 'Quisque', 'page', 32, 1), +(9954, 'ac', 'page', 32, 2), +(9955, 'nullam', 'page', 32, 2), +(9956, 'nisi', 'page', 32, 2), +(9957, 'est', 'page', 32, 3), +(9958, 'Id', 'page', 32, 1), +(9959, 'vel', 'page', 32, 2), +(9960, 'elementum', 'page', 32, 1), +(9961, 'etiam', 'page', 32, 1), +(9962, 'Pretium', 'page', 32, 1), +(9963, 'potenti', 'page', 32, 1), +(9964, 'Aliquam', 'page', 32, 1), +(9965, 'maecenas', 'page', 32, 1), +(9966, 'ultricies', 'page', 32, 1), +(9967, 'Tellus', 'page', 32, 1), +(9968, 'tortor', 'page', 32, 1), +(9969, 'aliquam', 'page', 32, 1), +(9970, 'Facilisi', 'page', 32, 1), +(9971, 'odio', 'page', 32, 1), +(9972, 'Et', 'page', 32, 1), +(9973, 'sollicitudin', 'page', 32, 1), +(9974, 'phasellus', 'page', 32, 1), +(9975, 'Nullam', 'page', 32, 1), +(9976, 'Quam', 'page', 32, 1), +(9977, 'ante', 'page', 32, 1), +(9978, 'Nisi', 'page', 32, 1), +(9979, 'vitae', 'page', 32, 1), +(9980, 'suscipit', 'page', 32, 1), +(9981, 'Felis', 'page', 32, 1), +(9982, 'leo', 'page', 32, 1), +(9983, 'porta', 'page', 32, 1), +(9984, 'Conclusion', 'page', 32, 4), +(9985, 'I', 'page', 32, 1), +(9986, 'hope', 'page', 32, 1), +(9987, 'you', 'page', 32, 1), +(9988, 'enjoyed', 'page', 32, 1), +(9989, 'browsing', 'page', 32, 1), +(9990, 'almost', 'page', 32, 1), +(9991, 'pointless', 'page', 32, 1), +(9992, 'As', 'page', 32, 1), +(9993, 'reward', 'page', 32, 1), +(9994, 'check', 'page', 32, 1), +(9995, 'out', 'page', 32, 1), +(9996, 'sweet', 'page', 32, 1), +(9997, 'video', 'page', 32, 1), +(9998, 'Policy', 'chapter', 5, 48), +(9999, 'Project', 'chapter', 5, 1), +(10000, 'policy', 'chapter', 5, 1), +(10001, 'documents', 'chapter', 5, 1), +(10002, 'Customer', 'page', 33, 40), +(10003, 'Service', 'page', 33, 40), +(10004, 'Policy', 'page', 33, 40), +(10005, 'Description', 'page', 33, 1), +(10006, 'The', 'page', 33, 2), +(10007, 'customer', 'page', 33, 1), +(10008, 'service', 'page', 33, 1), +(10009, 'policies', 'page', 33, 1), +(10010, 'for', 'page', 33, 4), +(10011, 'the', 'page', 33, 6), +(10012, 'Thoth', 'page', 33, 1), +(10013, 'Tech', 'page', 33, 1), +(10014, 'art', 'page', 33, 1), +(10015, 'gallery', 'page', 33, 1), +(10016, 'project/platform', 'page', 33, 1), +(10017, 'An', 'page', 33, 4), +(10018, 'Example', 'page', 33, 4), +(10019, 'Document', 'page', 33, 4), +(10020, 'Welcome', 'page', 33, 1), +(10021, 'This', 'page', 33, 2), +(10022, 'is', 'page', 33, 7), +(10023, 'a', 'page', 33, 11), +(10024, 'filler', 'page', 33, 1), +(10025, 'page', 'page', 33, 1), +(10026, 'to', 'page', 33, 13), +(10027, 'show', 'page', 33, 1), +(10028, 'off', 'page', 33, 1), +(10029, 'formatting', 'page', 33, 1), +(10030, 'of', 'page', 33, 6), +(10031, 'BookStack', 'page', 33, 1), +(10032, 'documents', 'page', 33, 1), +(10033, ' ', 'page', 33, 1), +(10034, 'All', 'page', 33, 1), +(10035, 'content', 'page', 33, 1), +(10036, 'aside', 'page', 33, 2), +(10037, 'from', 'page', 33, 2), +(10038, 'description', 'page', 33, 1), +(10039, 'at', 'page', 33, 3), +(10040, 'top', 'page', 33, 1), +(10041, 'this', 'page', 33, 3), +(10042, 'document', 'page', 33, 3), +(10043, 'unrelated', 'page', 33, 1), +(10044, 's', 'page', 33, 1), +(10045, 'actual', 'page', 33, 1), +(10046, 'purposes', 'page', 33, 2), +(10047, 'and', 'page', 33, 9), +(10048, 'should', 'page', 33, 1), +(10049, 'not', 'page', 33, 1), +(10050, 'be', 'page', 33, 4), +(10051, 'used', 'page', 33, 3), +(10052, 'demonstrative', 'page', 33, 1), +(10053, 'Further', 'page', 33, 4), +(10054, 'Content', 'page', 33, 8), +(10055, 'purpose', 'page', 33, 1), +(10056, 'knowledge', 'page', 33, 2), +(10057, 'base', 'page', 33, 4), +(10058, 'act', 'page', 33, 1), +(10059, 'as', 'page', 33, 2), +(10060, 'centralized', 'page', 33, 1), +(10061, 'organized', 'page', 33, 2), +(10062, 'platform', 'page', 33, 1), +(10063, 'access', 'page', 33, 1), +(10064, 'guides', 'page', 33, 4), +(10065, 'tutorials', 'page', 33, 1), +(10066, 'troubleshooting', 'page', 33, 1), +(10067, 'information', 'page', 33, 2), +(10068, 'other', 'page', 33, 2), +(10069, 'resources', 'page', 33, 1), +(10070, 'Knowledge', 'page', 33, 3), +(10071, 'systems', 'page', 33, 3), +(10072, 'come', 'page', 33, 1), +(10073, 'in', 'page', 33, 6), +(10074, 'different', 'page', 33, 1), +(10075, 'flavors', 'page', 33, 1), +(10076, 'example', 'page', 33, 1), +(10077, 'there', 'page', 33, 1), +(10078, 'may', 'page', 33, 1), +(10079, 'number', 'page', 33, 1), +(10080, 'predefined', 'page', 33, 1), +(10081, 'modules', 'page', 33, 1), +(10082, 'that', 'page', 33, 2), +(10083, 'can', 'page', 33, 3), +(10084, 'added', 'page', 33, 1), +(10085, 'removed', 'page', 33, 1), +(10086, 'developed', 'page', 33, 1), +(10087, 'an', 'page', 33, 1), +(10088, 'integrated', 'page', 33, 1), +(10089, 'manner', 'page', 33, 1), +(10090, 'with', 'page', 33, 2), +(10091, 'products', 'page', 33, 1), +(10092, 'are', 'page', 33, 1), +(10093, 'most', 'page', 33, 1), +(10094, 'frequently', 'page', 33, 1), +(10095, 'contain', 'page', 33, 1), +(10096, 'detailed', 'page', 33, 1), +(10097, 'These', 'page', 33, 1), +(10098, 'include', 'page', 33, 2), +(10099, 'solutions', 'page', 33, 1), +(10100, 'wide', 'page', 33, 1), +(10101, 'range', 'page', 33, 1), +(10102, 'technical', 'page', 33, 1), +(10103, 'problems', 'page', 33, 1), +(10104, 'but', 'page', 33, 1), +(10105, 'also', 'page', 33, 1), +(10106, 'on', 'page', 33, 1), +(10107, 'every', 'page', 33, 1), +(10108, 'aspect', 'page', 33, 1), +(10109, 'programming', 'page', 33, 1), +(10110, 'hardware', 'page', 33, 1), +(10111, 'software', 'page', 33, 2), +(10112, 'topics', 'page', 33, 1), +(10113, 'business', 'page', 33, 1), +(10114, 'concepts', 'page', 33, 1), +(10115, 'Another', 'page', 33, 1), +(10116, 'reason', 'page', 33, 1), +(10117, 'consider', 'page', 33, 1), +(10118, 'Base', 'page', 33, 1), +(10119, 'it', 'page', 33, 3), +(10120, 'often', 'page', 33, 1), +(10121, 'single', 'page', 33, 1), +(10122, 'entry', 'page', 33, 1), +(10123, 'point', 'page', 33, 1), +(10124, 'system', 'page', 33, 2), +(10125, 'very', 'page', 33, 1), +(10126, 'convenient', 'page', 33, 1), +(10127, 'feature', 'page', 33, 1), +(10128, 'remote', 'page', 33, 1), +(10129, 'clients', 'page', 33, 1), +(10130, 'who', 'page', 33, 2), +(10131, 'need', 'page', 33, 2), +(10132, 'select', 'page', 33, 1), +(10133, 'particular', 'page', 33, 2), +(10134, 'program', 'page', 33, 1), +(10135, 'download', 'page', 33, 1), +(10136, 'their', 'page', 33, 1), +(10137, 'computer', 'page', 33, 1), +(10138, 'or', 'page', 33, 1), +(10139, 'quickly', 'page', 33, 1), +(10140, 'learn', 'page', 33, 2), +(10141, 'how', 'page', 33, 2), +(10142, 'configure', 'page', 33, 1), +(10143, 'It', 'page', 33, 1), +(10144, 'particularly', 'page', 33, 1), +(10145, 'useful', 'page', 33, 1), +(10146, 'schools', 'page', 33, 1), +(10147, 'where', 'page', 33, 1), +(10148, 'users', 'page', 33, 1), +(10149, 'easily', 'page', 33, 1), +(10150, 'about', 'page', 33, 1), +(10151, 'application', 'page', 33, 1), +(10152, 'then', 'page', 33, 1), +(10153, 'use', 'page', 33, 1), +(10154, 'without', 'page', 33, 1), +(10155, 'having', 'page', 33, 1), +(10156, 'understand', 'page', 33, 1), +(10157, 'works', 'page', 33, 1), +(10158, 'Even', 'page', 33, 4), +(10159, 'Less', 'page', 33, 4), +(10160, 'Useful', 'page', 33, 4), +(10161, 'Lorem', 'page', 33, 2), +(10162, 'ipsum', 'page', 33, 2), +(10163, 'dolor', 'page', 33, 4), +(10164, 'sit', 'page', 33, 7), +(10165, 'amet', 'page', 33, 6), +(10166, 'consectetur', 'page', 33, 4), +(10167, 'adipiscing', 'page', 33, 3), +(10168, 'elit', 'page', 33, 3), +(10169, 'sed', 'page', 33, 5), +(10170, 'do', 'page', 33, 1), +(10171, 'eiusmod', 'page', 33, 1), +(10172, 'tempor', 'page', 33, 1), +(10173, 'incididunt', 'page', 33, 1), +(10174, 'ut', 'page', 33, 4), +(10175, 'labore', 'page', 33, 1), +(10176, 'et', 'page', 33, 2), +(10177, 'dolore', 'page', 33, 1), +(10178, 'magna', 'page', 33, 1), +(10179, 'aliqua', 'page', 33, 1), +(10180, 'Pellentesque', 'page', 33, 1), +(10181, 'porttitor', 'page', 33, 3), +(10182, 'eget', 'page', 33, 3), +(10183, 'morbi', 'page', 33, 5), +(10184, 'Nunc', 'page', 33, 1), +(10185, 'velit', 'page', 33, 1), +(10186, 'dignissim', 'page', 33, 3), +(10187, 'sodales', 'page', 33, 1), +(10188, 'eu', 'page', 33, 5), +(10189, 'sem', 'page', 33, 1), +(10190, 'integer', 'page', 33, 1), +(10191, 'Gravida', 'page', 33, 1), +(10192, 'cum', 'page', 33, 1), +(10193, 'sociis', 'page', 33, 1), +(10194, 'natoque', 'page', 33, 1), +(10195, 'penatibus', 'page', 33, 1), +(10196, 'magnis', 'page', 33, 1), +(10197, 'dis', 'page', 33, 1), +(10198, 'Proin', 'page', 33, 1), +(10199, 'libero', 'page', 33, 2), +(10200, 'enim', 'page', 33, 4), +(10201, 'faucibus', 'page', 33, 3), +(10202, 'turpis', 'page', 33, 1), +(10203, 'In', 'page', 33, 2), +(10204, 'fermentum', 'page', 33, 5), +(10205, 'posuere', 'page', 33, 2), +(10206, 'urna', 'page', 33, 3), +(10207, 'nec', 'page', 33, 1), +(10208, 'tincidunt', 'page', 33, 2), +(10209, 'praesent', 'page', 33, 1), +(10210, 'semper', 'page', 33, 1), +(10211, 'Varius', 'page', 33, 1), +(10212, 'duis', 'page', 33, 2), +(10213, 'lorem', 'page', 33, 2), +(10214, 'Placerat', 'page', 33, 1), +(10215, 'orci', 'page', 33, 4), +(10216, 'nulla', 'page', 33, 4), +(10217, 'pellentesque', 'page', 33, 2), +(10218, 'venenatis', 'page', 33, 1), +(10219, 'Integer', 'page', 33, 2), +(10220, 'feugiat', 'page', 33, 2), +(10221, 'scelerisque', 'page', 33, 3), +(10222, 'varius', 'page', 33, 4), +(10223, 'nunc', 'page', 33, 2), +(10224, 'Diam', 'page', 33, 1), +(10225, 'quam', 'page', 33, 5), +(10226, 'massa', 'page', 33, 2), +(10227, 'Dolor', 'page', 33, 1), +(10228, 'Tempus', 'page', 33, 1), +(10229, 'iaculis', 'page', 33, 2), +(10230, 'id', 'page', 33, 3), +(10231, 'volutpat', 'page', 33, 2), +(10232, 'Ac', 'page', 33, 1), +(10233, 'auctor', 'page', 33, 2), +(10234, 'augue', 'page', 33, 5), +(10235, 'mauris', 'page', 33, 4), +(10236, 'neque', 'page', 33, 3), +(10237, 'gravida', 'page', 33, 2), +(10238, 'Blandit', 'page', 33, 1), +(10239, 'cras', 'page', 33, 4), +(10240, 'ornare', 'page', 33, 1), +(10241, 'arcu', 'page', 33, 4), +(10242, 'mi', 'page', 33, 2), +(10243, 'bibendum', 'page', 33, 1), +(10244, 'egestas', 'page', 33, 3), +(10245, 'Non', 'page', 33, 1), +(10246, 'lacus', 'page', 33, 1), +(10247, 'suspendisse', 'page', 33, 3), +(10248, 'interdum', 'page', 33, 1), +(10249, 'Vivamus', 'page', 33, 1), +(10250, 'dictum', 'page', 33, 1), +(10251, 'Duis', 'page', 33, 1), +(10252, 'diam', 'page', 33, 4), +(10253, 'Egestas', 'page', 33, 1), +(10254, 'congue', 'page', 33, 1), +(10255, 'quisque', 'page', 33, 2), +(10256, 'cursus', 'page', 33, 1), +(10257, 'Quis', 'page', 33, 1), +(10258, 'viverra', 'page', 33, 2), +(10259, 'nibh', 'page', 33, 2), +(10260, 'pulvinar', 'page', 33, 3), +(10261, 'Hendrerit', 'page', 33, 1), +(10262, 'rutrum', 'page', 33, 2), +(10263, 'non', 'page', 33, 6), +(10264, 'tellus', 'page', 33, 5), +(10265, 'Metus', 'page', 33, 1), +(10266, 'vulputate', 'page', 33, 2), +(10267, 'felis', 'page', 33, 1), +(10268, 'imperdiet', 'page', 33, 2), +(10269, 'proin', 'page', 33, 2), +(10270, 'Nulla', 'page', 33, 1), +(10271, 'facilisi', 'page', 33, 2), +(10272, 'tempus', 'page', 33, 1), +(10273, 'Eget', 'page', 33, 2), +(10274, 'risus', 'page', 33, 1), +(10275, 'quis', 'page', 33, 1), +(10276, 'Quisque', 'page', 33, 1), +(10277, 'ac', 'page', 33, 2), +(10278, 'nullam', 'page', 33, 2), +(10279, 'nisi', 'page', 33, 2), +(10280, 'est', 'page', 33, 3), +(10281, 'Id', 'page', 33, 1), +(10282, 'vel', 'page', 33, 2), +(10283, 'elementum', 'page', 33, 1), +(10284, 'etiam', 'page', 33, 1), +(10285, 'Pretium', 'page', 33, 1), +(10286, 'potenti', 'page', 33, 1), +(10287, 'Aliquam', 'page', 33, 1), +(10288, 'maecenas', 'page', 33, 1), +(10289, 'ultricies', 'page', 33, 1), +(10290, 'Tellus', 'page', 33, 1), +(10291, 'tortor', 'page', 33, 1), +(10292, 'aliquam', 'page', 33, 1), +(10293, 'Facilisi', 'page', 33, 1), +(10294, 'odio', 'page', 33, 1), +(10295, 'Et', 'page', 33, 1), +(10296, 'sollicitudin', 'page', 33, 1), +(10297, 'phasellus', 'page', 33, 1), +(10298, 'Nullam', 'page', 33, 1), +(10299, 'Quam', 'page', 33, 1), +(10300, 'ante', 'page', 33, 1), +(10301, 'Nisi', 'page', 33, 1), +(10302, 'vitae', 'page', 33, 1), +(10303, 'suscipit', 'page', 33, 1), +(10304, 'Felis', 'page', 33, 1), +(10305, 'leo', 'page', 33, 1), +(10306, 'porta', 'page', 33, 1), +(10307, 'Conclusion', 'page', 33, 4), +(10308, 'I', 'page', 33, 1), +(10309, 'hope', 'page', 33, 1), +(10310, 'you', 'page', 33, 1), +(10311, 'enjoyed', 'page', 33, 1), +(10312, 'browsing', 'page', 33, 1), +(10313, 'almost', 'page', 33, 1), +(10314, 'pointless', 'page', 33, 1), +(10315, 'As', 'page', 33, 1), +(10316, 'reward', 'page', 33, 1), +(10317, 'check', 'page', 33, 1), +(10318, 'out', 'page', 33, 1), +(10319, 'sweet', 'page', 33, 1), +(10320, 'video', 'page', 33, 1), +(10321, 'Privacy', 'page', 34, 40), +(10322, 'Policy', 'page', 34, 40), +(10323, 'Description', 'page', 34, 1), +(10324, 'The', 'page', 34, 2), +(10325, 'privacy', 'page', 34, 1), +(10326, 'policies', 'page', 34, 1), +(10327, 'for', 'page', 34, 4), +(10328, 'the', 'page', 34, 6), +(10329, 'Thoth', 'page', 34, 1), +(10330, 'Tech', 'page', 34, 1), +(10331, 'art', 'page', 34, 1), +(10332, 'gallery', 'page', 34, 1), +(10333, 'project/platform', 'page', 34, 1), +(10334, 'An', 'page', 34, 4), +(10335, 'Example', 'page', 34, 4), +(10336, 'Document', 'page', 34, 4), +(10337, 'Welcome', 'page', 34, 1), +(10338, 'This', 'page', 34, 2), +(10339, 'is', 'page', 34, 7), +(10340, 'a', 'page', 34, 11), +(10341, 'filler', 'page', 34, 1), +(10342, 'page', 'page', 34, 1), +(10343, 'to', 'page', 34, 13), +(10344, 'show', 'page', 34, 1), +(10345, 'off', 'page', 34, 1), +(10346, 'formatting', 'page', 34, 1), +(10347, 'of', 'page', 34, 6), +(10348, 'BookStack', 'page', 34, 1), +(10349, 'documents', 'page', 34, 1), +(10350, ' ', 'page', 34, 1), +(10351, 'All', 'page', 34, 1), +(10352, 'content', 'page', 34, 1), +(10353, 'aside', 'page', 34, 2), +(10354, 'from', 'page', 34, 2), +(10355, 'description', 'page', 34, 1), +(10356, 'at', 'page', 34, 3), +(10357, 'top', 'page', 34, 1), +(10358, 'this', 'page', 34, 3), +(10359, 'document', 'page', 34, 3), +(10360, 'unrelated', 'page', 34, 1), +(10361, 's', 'page', 34, 1), +(10362, 'actual', 'page', 34, 1), +(10363, 'purposes', 'page', 34, 2), +(10364, 'and', 'page', 34, 9), +(10365, 'should', 'page', 34, 1), +(10366, 'not', 'page', 34, 1), +(10367, 'be', 'page', 34, 4), +(10368, 'used', 'page', 34, 3), +(10369, 'demonstrative', 'page', 34, 1), +(10370, 'Further', 'page', 34, 4), +(10371, 'Content', 'page', 34, 8), +(10372, 'purpose', 'page', 34, 1), +(10373, 'knowledge', 'page', 34, 2), +(10374, 'base', 'page', 34, 4), +(10375, 'act', 'page', 34, 1), +(10376, 'as', 'page', 34, 2), +(10377, 'centralized', 'page', 34, 1), +(10378, 'organized', 'page', 34, 2), +(10379, 'platform', 'page', 34, 1), +(10380, 'access', 'page', 34, 1), +(10381, 'guides', 'page', 34, 4), +(10382, 'tutorials', 'page', 34, 1), +(10383, 'troubleshooting', 'page', 34, 1), +(10384, 'information', 'page', 34, 2), +(10385, 'other', 'page', 34, 2), +(10386, 'resources', 'page', 34, 1), +(10387, 'Knowledge', 'page', 34, 3), +(10388, 'systems', 'page', 34, 3), +(10389, 'come', 'page', 34, 1), +(10390, 'in', 'page', 34, 6), +(10391, 'different', 'page', 34, 1), +(10392, 'flavors', 'page', 34, 1), +(10393, 'example', 'page', 34, 1), +(10394, 'there', 'page', 34, 1), +(10395, 'may', 'page', 34, 1), +(10396, 'number', 'page', 34, 1), +(10397, 'predefined', 'page', 34, 1), +(10398, 'modules', 'page', 34, 1), +(10399, 'that', 'page', 34, 2), +(10400, 'can', 'page', 34, 3), +(10401, 'added', 'page', 34, 1), +(10402, 'removed', 'page', 34, 1), +(10403, 'developed', 'page', 34, 1), +(10404, 'an', 'page', 34, 1), +(10405, 'integrated', 'page', 34, 1), +(10406, 'manner', 'page', 34, 1), +(10407, 'with', 'page', 34, 2), +(10408, 'products', 'page', 34, 1), +(10409, 'are', 'page', 34, 1), +(10410, 'most', 'page', 34, 1), +(10411, 'frequently', 'page', 34, 1), +(10412, 'contain', 'page', 34, 1), +(10413, 'detailed', 'page', 34, 1), +(10414, 'These', 'page', 34, 1), +(10415, 'include', 'page', 34, 2), +(10416, 'solutions', 'page', 34, 1), +(10417, 'wide', 'page', 34, 1), +(10418, 'range', 'page', 34, 1), +(10419, 'technical', 'page', 34, 1), +(10420, 'problems', 'page', 34, 1), +(10421, 'but', 'page', 34, 1), +(10422, 'also', 'page', 34, 1), +(10423, 'on', 'page', 34, 1), +(10424, 'every', 'page', 34, 1), +(10425, 'aspect', 'page', 34, 1), +(10426, 'programming', 'page', 34, 1), +(10427, 'hardware', 'page', 34, 1), +(10428, 'software', 'page', 34, 2), +(10429, 'topics', 'page', 34, 1), +(10430, 'business', 'page', 34, 1), +(10431, 'concepts', 'page', 34, 1), +(10432, 'Another', 'page', 34, 1), +(10433, 'reason', 'page', 34, 1), +(10434, 'consider', 'page', 34, 1), +(10435, 'Base', 'page', 34, 1), +(10436, 'it', 'page', 34, 3), +(10437, 'often', 'page', 34, 1), +(10438, 'single', 'page', 34, 1), +(10439, 'entry', 'page', 34, 1), +(10440, 'point', 'page', 34, 1), +(10441, 'system', 'page', 34, 2), +(10442, 'very', 'page', 34, 1), +(10443, 'convenient', 'page', 34, 1), +(10444, 'feature', 'page', 34, 1), +(10445, 'remote', 'page', 34, 1), +(10446, 'clients', 'page', 34, 1), +(10447, 'who', 'page', 34, 2), +(10448, 'need', 'page', 34, 2), +(10449, 'select', 'page', 34, 1), +(10450, 'particular', 'page', 34, 2), +(10451, 'program', 'page', 34, 1), +(10452, 'download', 'page', 34, 1), +(10453, 'their', 'page', 34, 1), +(10454, 'computer', 'page', 34, 1), +(10455, 'or', 'page', 34, 1), +(10456, 'quickly', 'page', 34, 1), +(10457, 'learn', 'page', 34, 2), +(10458, 'how', 'page', 34, 2), +(10459, 'configure', 'page', 34, 1), +(10460, 'It', 'page', 34, 1), +(10461, 'particularly', 'page', 34, 1), +(10462, 'useful', 'page', 34, 1), +(10463, 'schools', 'page', 34, 1), +(10464, 'where', 'page', 34, 1), +(10465, 'users', 'page', 34, 1), +(10466, 'easily', 'page', 34, 1), +(10467, 'about', 'page', 34, 1), +(10468, 'application', 'page', 34, 1), +(10469, 'then', 'page', 34, 1), +(10470, 'use', 'page', 34, 1), +(10471, 'without', 'page', 34, 1), +(10472, 'having', 'page', 34, 1), +(10473, 'understand', 'page', 34, 1), +(10474, 'works', 'page', 34, 1), +(10475, 'Even', 'page', 34, 4), +(10476, 'Less', 'page', 34, 4), +(10477, 'Useful', 'page', 34, 4), +(10478, 'Lorem', 'page', 34, 2), +(10479, 'ipsum', 'page', 34, 2), +(10480, 'dolor', 'page', 34, 4), +(10481, 'sit', 'page', 34, 7), +(10482, 'amet', 'page', 34, 6), +(10483, 'consectetur', 'page', 34, 4), +(10484, 'adipiscing', 'page', 34, 3), +(10485, 'elit', 'page', 34, 3), +(10486, 'sed', 'page', 34, 5), +(10487, 'do', 'page', 34, 1), +(10488, 'eiusmod', 'page', 34, 1), +(10489, 'tempor', 'page', 34, 1), +(10490, 'incididunt', 'page', 34, 1), +(10491, 'ut', 'page', 34, 4), +(10492, 'labore', 'page', 34, 1), +(10493, 'et', 'page', 34, 2), +(10494, 'dolore', 'page', 34, 1), +(10495, 'magna', 'page', 34, 1), +(10496, 'aliqua', 'page', 34, 1), +(10497, 'Pellentesque', 'page', 34, 1), +(10498, 'porttitor', 'page', 34, 3), +(10499, 'eget', 'page', 34, 3), +(10500, 'morbi', 'page', 34, 5), +(10501, 'Nunc', 'page', 34, 1), +(10502, 'velit', 'page', 34, 1), +(10503, 'dignissim', 'page', 34, 3), +(10504, 'sodales', 'page', 34, 1), +(10505, 'eu', 'page', 34, 5), +(10506, 'sem', 'page', 34, 1), +(10507, 'integer', 'page', 34, 1), +(10508, 'Gravida', 'page', 34, 1), +(10509, 'cum', 'page', 34, 1), +(10510, 'sociis', 'page', 34, 1), +(10511, 'natoque', 'page', 34, 1), +(10512, 'penatibus', 'page', 34, 1), +(10513, 'magnis', 'page', 34, 1), +(10514, 'dis', 'page', 34, 1), +(10515, 'Proin', 'page', 34, 1), +(10516, 'libero', 'page', 34, 2), +(10517, 'enim', 'page', 34, 4), +(10518, 'faucibus', 'page', 34, 3), +(10519, 'turpis', 'page', 34, 1), +(10520, 'In', 'page', 34, 2), +(10521, 'fermentum', 'page', 34, 5), +(10522, 'posuere', 'page', 34, 2), +(10523, 'urna', 'page', 34, 3), +(10524, 'nec', 'page', 34, 1), +(10525, 'tincidunt', 'page', 34, 2), +(10526, 'praesent', 'page', 34, 1), +(10527, 'semper', 'page', 34, 1), +(10528, 'Varius', 'page', 34, 1), +(10529, 'duis', 'page', 34, 2), +(10530, 'lorem', 'page', 34, 2), +(10531, 'Placerat', 'page', 34, 1), +(10532, 'orci', 'page', 34, 4), +(10533, 'nulla', 'page', 34, 4), +(10534, 'pellentesque', 'page', 34, 2), +(10535, 'venenatis', 'page', 34, 1), +(10536, 'Integer', 'page', 34, 2), +(10537, 'feugiat', 'page', 34, 2), +(10538, 'scelerisque', 'page', 34, 3), +(10539, 'varius', 'page', 34, 4), +(10540, 'nunc', 'page', 34, 2), +(10541, 'Diam', 'page', 34, 1), +(10542, 'quam', 'page', 34, 5), +(10543, 'massa', 'page', 34, 2), +(10544, 'Dolor', 'page', 34, 1), +(10545, 'Tempus', 'page', 34, 1), +(10546, 'iaculis', 'page', 34, 2), +(10547, 'id', 'page', 34, 3), +(10548, 'volutpat', 'page', 34, 2), +(10549, 'Ac', 'page', 34, 1), +(10550, 'auctor', 'page', 34, 2), +(10551, 'augue', 'page', 34, 5), +(10552, 'mauris', 'page', 34, 4), +(10553, 'neque', 'page', 34, 3), +(10554, 'gravida', 'page', 34, 2), +(10555, 'Blandit', 'page', 34, 1), +(10556, 'cras', 'page', 34, 4), +(10557, 'ornare', 'page', 34, 1), +(10558, 'arcu', 'page', 34, 4), +(10559, 'mi', 'page', 34, 2), +(10560, 'bibendum', 'page', 34, 1), +(10561, 'egestas', 'page', 34, 3), +(10562, 'Non', 'page', 34, 1), +(10563, 'lacus', 'page', 34, 1), +(10564, 'suspendisse', 'page', 34, 3), +(10565, 'interdum', 'page', 34, 1), +(10566, 'Vivamus', 'page', 34, 1), +(10567, 'dictum', 'page', 34, 1), +(10568, 'Duis', 'page', 34, 1), +(10569, 'diam', 'page', 34, 4), +(10570, 'Egestas', 'page', 34, 1), +(10571, 'congue', 'page', 34, 1), +(10572, 'quisque', 'page', 34, 2), +(10573, 'cursus', 'page', 34, 1), +(10574, 'Quis', 'page', 34, 1), +(10575, 'viverra', 'page', 34, 2), +(10576, 'nibh', 'page', 34, 2), +(10577, 'pulvinar', 'page', 34, 3), +(10578, 'Hendrerit', 'page', 34, 1), +(10579, 'rutrum', 'page', 34, 2), +(10580, 'non', 'page', 34, 6), +(10581, 'tellus', 'page', 34, 5), +(10582, 'Metus', 'page', 34, 1), +(10583, 'vulputate', 'page', 34, 2), +(10584, 'felis', 'page', 34, 1), +(10585, 'imperdiet', 'page', 34, 2), +(10586, 'proin', 'page', 34, 2), +(10587, 'Nulla', 'page', 34, 1), +(10588, 'facilisi', 'page', 34, 2), +(10589, 'tempus', 'page', 34, 1), +(10590, 'Eget', 'page', 34, 2), +(10591, 'risus', 'page', 34, 1), +(10592, 'quis', 'page', 34, 1), +(10593, 'Quisque', 'page', 34, 1), +(10594, 'ac', 'page', 34, 2), +(10595, 'nullam', 'page', 34, 2), +(10596, 'nisi', 'page', 34, 2), +(10597, 'est', 'page', 34, 3), +(10598, 'Id', 'page', 34, 1), +(10599, 'vel', 'page', 34, 2), +(10600, 'elementum', 'page', 34, 1), +(10601, 'etiam', 'page', 34, 1), +(10602, 'Pretium', 'page', 34, 1), +(10603, 'potenti', 'page', 34, 1), +(10604, 'Aliquam', 'page', 34, 1), +(10605, 'maecenas', 'page', 34, 1), +(10606, 'ultricies', 'page', 34, 1), +(10607, 'Tellus', 'page', 34, 1), +(10608, 'tortor', 'page', 34, 1), +(10609, 'aliquam', 'page', 34, 1), +(10610, 'Facilisi', 'page', 34, 1), +(10611, 'odio', 'page', 34, 1), +(10612, 'Et', 'page', 34, 1), +(10613, 'sollicitudin', 'page', 34, 1), +(10614, 'phasellus', 'page', 34, 1), +(10615, 'Nullam', 'page', 34, 1), +(10616, 'Quam', 'page', 34, 1), +(10617, 'ante', 'page', 34, 1), +(10618, 'Nisi', 'page', 34, 1), +(10619, 'vitae', 'page', 34, 1), +(10620, 'suscipit', 'page', 34, 1), +(10621, 'Felis', 'page', 34, 1), +(10622, 'leo', 'page', 34, 1), +(10623, 'porta', 'page', 34, 1), +(10624, 'Conclusion', 'page', 34, 4), +(10625, 'I', 'page', 34, 1), +(10626, 'hope', 'page', 34, 1), +(10627, 'you', 'page', 34, 1), +(10628, 'enjoyed', 'page', 34, 1), +(10629, 'browsing', 'page', 34, 1), +(10630, 'almost', 'page', 34, 1), +(10631, 'pointless', 'page', 34, 1), +(10632, 'As', 'page', 34, 1), +(10633, 'reward', 'page', 34, 1), +(10634, 'check', 'page', 34, 1), +(10635, 'out', 'page', 34, 1), +(10636, 'sweet', 'page', 34, 1), +(10637, 'video', 'page', 34, 1), +(10638, 'Customer', 'page', 35, 40), +(10639, 'FAQ', 'page', 35, 40), +(10640, 'Description', 'page', 35, 1), +(10641, 'Frequently', 'page', 35, 1), +(10642, 'asked', 'page', 35, 1), +(10643, 'questions', 'page', 35, 1), +(10644, 'and', 'page', 35, 10), +(10645, 'their', 'page', 35, 2), +(10646, 'answers', 'page', 35, 1), +(10647, 'regarding', 'page', 35, 1), +(10648, 'the', 'page', 35, 6), +(10649, 'art', 'page', 35, 1), +(10650, 'gallery', 'page', 35, 1), +(10651, 'project/platform', 'page', 35, 1), +(10652, 'An', 'page', 35, 4), +(10653, 'Example', 'page', 35, 4), +(10654, 'Document', 'page', 35, 4), +(10655, 'Welcome', 'page', 35, 1), +(10656, 'This', 'page', 35, 2), +(10657, 'is', 'page', 35, 7), +(10658, 'a', 'page', 35, 11), +(10659, 'filler', 'page', 35, 1), +(10660, 'page', 'page', 35, 1), +(10661, 'to', 'page', 35, 13), +(10662, 'show', 'page', 35, 1), +(10663, 'off', 'page', 35, 1), +(10664, 'formatting', 'page', 35, 1), +(10665, 'of', 'page', 35, 6), +(10666, 'BookStack', 'page', 35, 1), +(10667, 'documents', 'page', 35, 1), +(10668, ' ', 'page', 35, 1), +(10669, 'All', 'page', 35, 1), +(10670, 'content', 'page', 35, 1), +(10671, 'aside', 'page', 35, 2), +(10672, 'from', 'page', 35, 2), +(10673, 'description', 'page', 35, 1), +(10674, 'at', 'page', 35, 3), +(10675, 'top', 'page', 35, 1), +(10676, 'this', 'page', 35, 3), +(10677, 'document', 'page', 35, 3), +(10678, 'unrelated', 'page', 35, 1), +(10679, 's', 'page', 35, 1), +(10680, 'actual', 'page', 35, 1), +(10681, 'purposes', 'page', 35, 2), +(10682, 'should', 'page', 35, 1), +(10683, 'not', 'page', 35, 1), +(10684, 'be', 'page', 35, 4), +(10685, 'used', 'page', 35, 3), +(10686, 'demonstrative', 'page', 35, 1), +(10687, 'Further', 'page', 35, 4), +(10688, 'Content', 'page', 35, 8), +(10689, 'The', 'page', 35, 1), +(10690, 'purpose', 'page', 35, 1), +(10691, 'knowledge', 'page', 35, 2), +(10692, 'base', 'page', 35, 4), +(10693, 'act', 'page', 35, 1), +(10694, 'as', 'page', 35, 2), +(10695, 'centralized', 'page', 35, 1), +(10696, 'organized', 'page', 35, 2), +(10697, 'platform', 'page', 35, 1), +(10698, 'access', 'page', 35, 1), +(10699, 'guides', 'page', 35, 4), +(10700, 'tutorials', 'page', 35, 1), +(10701, 'troubleshooting', 'page', 35, 1), +(10702, 'information', 'page', 35, 2), +(10703, 'other', 'page', 35, 2), +(10704, 'resources', 'page', 35, 1), +(10705, 'Knowledge', 'page', 35, 3), +(10706, 'systems', 'page', 35, 3), +(10707, 'come', 'page', 35, 1), +(10708, 'in', 'page', 35, 6), +(10709, 'different', 'page', 35, 1), +(10710, 'flavors', 'page', 35, 1), +(10711, 'for', 'page', 35, 3), +(10712, 'example', 'page', 35, 1), +(10713, 'there', 'page', 35, 1), +(10714, 'may', 'page', 35, 1), +(10715, 'number', 'page', 35, 1), +(10716, 'predefined', 'page', 35, 1), +(10717, 'modules', 'page', 35, 1), +(10718, 'that', 'page', 35, 2), +(10719, 'can', 'page', 35, 3), +(10720, 'added', 'page', 35, 1), +(10721, 'removed', 'page', 35, 1), +(10722, 'developed', 'page', 35, 1), +(10723, 'an', 'page', 35, 1), +(10724, 'integrated', 'page', 35, 1), +(10725, 'manner', 'page', 35, 1), +(10726, 'with', 'page', 35, 2), +(10727, 'products', 'page', 35, 1), +(10728, 'are', 'page', 35, 1), +(10729, 'most', 'page', 35, 1), +(10730, 'frequently', 'page', 35, 1), +(10731, 'contain', 'page', 35, 1), +(10732, 'detailed', 'page', 35, 1), +(10733, 'These', 'page', 35, 1), +(10734, 'include', 'page', 35, 2), +(10735, 'solutions', 'page', 35, 1), +(10736, 'wide', 'page', 35, 1), +(10737, 'range', 'page', 35, 1), +(10738, 'technical', 'page', 35, 1), +(10739, 'problems', 'page', 35, 1), +(10740, 'but', 'page', 35, 1), +(10741, 'also', 'page', 35, 1), +(10742, 'on', 'page', 35, 1), +(10743, 'every', 'page', 35, 1), +(10744, 'aspect', 'page', 35, 1), +(10745, 'programming', 'page', 35, 1), +(10746, 'hardware', 'page', 35, 1), +(10747, 'software', 'page', 35, 2), +(10748, 'topics', 'page', 35, 1), +(10749, 'business', 'page', 35, 1), +(10750, 'concepts', 'page', 35, 1), +(10751, 'Another', 'page', 35, 1), +(10752, 'reason', 'page', 35, 1), +(10753, 'consider', 'page', 35, 1), +(10754, 'Base', 'page', 35, 1), +(10755, 'it', 'page', 35, 3), +(10756, 'often', 'page', 35, 1), +(10757, 'single', 'page', 35, 1), +(10758, 'entry', 'page', 35, 1), +(10759, 'point', 'page', 35, 1), +(10760, 'system', 'page', 35, 2), +(10761, 'very', 'page', 35, 1), +(10762, 'convenient', 'page', 35, 1), +(10763, 'feature', 'page', 35, 1), +(10764, 'remote', 'page', 35, 1), +(10765, 'clients', 'page', 35, 1), +(10766, 'who', 'page', 35, 2), +(10767, 'need', 'page', 35, 2), +(10768, 'select', 'page', 35, 1), +(10769, 'particular', 'page', 35, 2), +(10770, 'program', 'page', 35, 1), +(10771, 'download', 'page', 35, 1), +(10772, 'computer', 'page', 35, 1), +(10773, 'or', 'page', 35, 1), +(10774, 'quickly', 'page', 35, 1), +(10775, 'learn', 'page', 35, 2), +(10776, 'how', 'page', 35, 2), +(10777, 'configure', 'page', 35, 1), +(10778, 'It', 'page', 35, 1), +(10779, 'particularly', 'page', 35, 1), +(10780, 'useful', 'page', 35, 1), +(10781, 'schools', 'page', 35, 1), +(10782, 'where', 'page', 35, 1), +(10783, 'users', 'page', 35, 1), +(10784, 'easily', 'page', 35, 1), +(10785, 'about', 'page', 35, 1), +(10786, 'application', 'page', 35, 1), +(10787, 'then', 'page', 35, 1), +(10788, 'use', 'page', 35, 1), +(10789, 'without', 'page', 35, 1), +(10790, 'having', 'page', 35, 1), +(10791, 'understand', 'page', 35, 1), +(10792, 'works', 'page', 35, 1), +(10793, 'Even', 'page', 35, 4), +(10794, 'Less', 'page', 35, 4), +(10795, 'Useful', 'page', 35, 4), +(10796, 'Lorem', 'page', 35, 2), +(10797, 'ipsum', 'page', 35, 2), +(10798, 'dolor', 'page', 35, 4), +(10799, 'sit', 'page', 35, 7), +(10800, 'amet', 'page', 35, 6), +(10801, 'consectetur', 'page', 35, 4), +(10802, 'adipiscing', 'page', 35, 3), +(10803, 'elit', 'page', 35, 3), +(10804, 'sed', 'page', 35, 5), +(10805, 'do', 'page', 35, 1), +(10806, 'eiusmod', 'page', 35, 1), +(10807, 'tempor', 'page', 35, 1), +(10808, 'incididunt', 'page', 35, 1), +(10809, 'ut', 'page', 35, 4), +(10810, 'labore', 'page', 35, 1), +(10811, 'et', 'page', 35, 2), +(10812, 'dolore', 'page', 35, 1), +(10813, 'magna', 'page', 35, 1), +(10814, 'aliqua', 'page', 35, 1), +(10815, 'Pellentesque', 'page', 35, 1), +(10816, 'porttitor', 'page', 35, 3), +(10817, 'eget', 'page', 35, 3), +(10818, 'morbi', 'page', 35, 5), +(10819, 'Nunc', 'page', 35, 1), +(10820, 'velit', 'page', 35, 1), +(10821, 'dignissim', 'page', 35, 3), +(10822, 'sodales', 'page', 35, 1), +(10823, 'eu', 'page', 35, 5), +(10824, 'sem', 'page', 35, 1), +(10825, 'integer', 'page', 35, 1), +(10826, 'Gravida', 'page', 35, 1), +(10827, 'cum', 'page', 35, 1), +(10828, 'sociis', 'page', 35, 1), +(10829, 'natoque', 'page', 35, 1), +(10830, 'penatibus', 'page', 35, 1), +(10831, 'magnis', 'page', 35, 1), +(10832, 'dis', 'page', 35, 1), +(10833, 'Proin', 'page', 35, 1), +(10834, 'libero', 'page', 35, 2), +(10835, 'enim', 'page', 35, 4), +(10836, 'faucibus', 'page', 35, 3), +(10837, 'turpis', 'page', 35, 1), +(10838, 'In', 'page', 35, 2), +(10839, 'fermentum', 'page', 35, 5), +(10840, 'posuere', 'page', 35, 2), +(10841, 'urna', 'page', 35, 3), +(10842, 'nec', 'page', 35, 1), +(10843, 'tincidunt', 'page', 35, 2), +(10844, 'praesent', 'page', 35, 1), +(10845, 'semper', 'page', 35, 1), +(10846, 'Varius', 'page', 35, 1), +(10847, 'duis', 'page', 35, 2), +(10848, 'lorem', 'page', 35, 2), +(10849, 'Placerat', 'page', 35, 1), +(10850, 'orci', 'page', 35, 4), +(10851, 'nulla', 'page', 35, 4), +(10852, 'pellentesque', 'page', 35, 2), +(10853, 'venenatis', 'page', 35, 1), +(10854, 'Integer', 'page', 35, 2), +(10855, 'feugiat', 'page', 35, 2), +(10856, 'scelerisque', 'page', 35, 3), +(10857, 'varius', 'page', 35, 4), +(10858, 'nunc', 'page', 35, 2), +(10859, 'Diam', 'page', 35, 1), +(10860, 'quam', 'page', 35, 5), +(10861, 'massa', 'page', 35, 2), +(10862, 'Dolor', 'page', 35, 1), +(10863, 'Tempus', 'page', 35, 1), +(10864, 'iaculis', 'page', 35, 2), +(10865, 'id', 'page', 35, 3), +(10866, 'volutpat', 'page', 35, 2), +(10867, 'Ac', 'page', 35, 1), +(10868, 'auctor', 'page', 35, 2), +(10869, 'augue', 'page', 35, 5), +(10870, 'mauris', 'page', 35, 4), +(10871, 'neque', 'page', 35, 3), +(10872, 'gravida', 'page', 35, 2), +(10873, 'Blandit', 'page', 35, 1), +(10874, 'cras', 'page', 35, 4), +(10875, 'ornare', 'page', 35, 1), +(10876, 'arcu', 'page', 35, 4), +(10877, 'mi', 'page', 35, 2), +(10878, 'bibendum', 'page', 35, 1), +(10879, 'egestas', 'page', 35, 3), +(10880, 'Non', 'page', 35, 1), +(10881, 'lacus', 'page', 35, 1), +(10882, 'suspendisse', 'page', 35, 3), +(10883, 'interdum', 'page', 35, 1), +(10884, 'Vivamus', 'page', 35, 1), +(10885, 'dictum', 'page', 35, 1), +(10886, 'Duis', 'page', 35, 1); +INSERT INTO `search_terms` (`id`, `term`, `entity_type`, `entity_id`, `score`) VALUES +(10887, 'diam', 'page', 35, 4), +(10888, 'Egestas', 'page', 35, 1), +(10889, 'congue', 'page', 35, 1), +(10890, 'quisque', 'page', 35, 2), +(10891, 'cursus', 'page', 35, 1), +(10892, 'Quis', 'page', 35, 1), +(10893, 'viverra', 'page', 35, 2), +(10894, 'nibh', 'page', 35, 2), +(10895, 'pulvinar', 'page', 35, 3), +(10896, 'Hendrerit', 'page', 35, 1), +(10897, 'rutrum', 'page', 35, 2), +(10898, 'non', 'page', 35, 6), +(10899, 'tellus', 'page', 35, 5), +(10900, 'Metus', 'page', 35, 1), +(10901, 'vulputate', 'page', 35, 2), +(10902, 'felis', 'page', 35, 1), +(10903, 'imperdiet', 'page', 35, 2), +(10904, 'proin', 'page', 35, 2), +(10905, 'Nulla', 'page', 35, 1), +(10906, 'facilisi', 'page', 35, 2), +(10907, 'tempus', 'page', 35, 1), +(10908, 'Eget', 'page', 35, 2), +(10909, 'risus', 'page', 35, 1), +(10910, 'quis', 'page', 35, 1), +(10911, 'Quisque', 'page', 35, 1), +(10912, 'ac', 'page', 35, 2), +(10913, 'nullam', 'page', 35, 2), +(10914, 'nisi', 'page', 35, 2), +(10915, 'est', 'page', 35, 3), +(10916, 'Id', 'page', 35, 1), +(10917, 'vel', 'page', 35, 2), +(10918, 'elementum', 'page', 35, 1), +(10919, 'etiam', 'page', 35, 1), +(10920, 'Pretium', 'page', 35, 1), +(10921, 'potenti', 'page', 35, 1), +(10922, 'Aliquam', 'page', 35, 1), +(10923, 'maecenas', 'page', 35, 1), +(10924, 'ultricies', 'page', 35, 1), +(10925, 'Tellus', 'page', 35, 1), +(10926, 'tortor', 'page', 35, 1), +(10927, 'aliquam', 'page', 35, 1), +(10928, 'Facilisi', 'page', 35, 1), +(10929, 'odio', 'page', 35, 1), +(10930, 'Et', 'page', 35, 1), +(10931, 'sollicitudin', 'page', 35, 1), +(10932, 'phasellus', 'page', 35, 1), +(10933, 'Nullam', 'page', 35, 1), +(10934, 'Quam', 'page', 35, 1), +(10935, 'ante', 'page', 35, 1), +(10936, 'Nisi', 'page', 35, 1), +(10937, 'vitae', 'page', 35, 1), +(10938, 'suscipit', 'page', 35, 1), +(10939, 'Felis', 'page', 35, 1), +(10940, 'leo', 'page', 35, 1), +(10941, 'porta', 'page', 35, 1), +(10942, 'Conclusion', 'page', 35, 4), +(10943, 'I', 'page', 35, 1), +(10944, 'hope', 'page', 35, 1), +(10945, 'you', 'page', 35, 1), +(10946, 'enjoyed', 'page', 35, 1), +(10947, 'browsing', 'page', 35, 1), +(10948, 'almost', 'page', 35, 1), +(10949, 'pointless', 'page', 35, 1), +(10950, 'As', 'page', 35, 1), +(10951, 'reward', 'page', 35, 1), +(10952, 'check', 'page', 35, 1), +(10953, 'out', 'page', 35, 1), +(10954, 'sweet', 'page', 35, 1), +(10955, 'video', 'page', 35, 1), +(10956, 'Getting', 'book', 17, 48), +(10957, 'Started', 'book', 17, 48), +(10958, 'Guides', 'book', 17, 1), +(10959, 'for', 'book', 17, 1), +(10960, 'first', 'book', 17, 1), +(10961, 'starting', 'book', 17, 1), +(10962, 'out', 'book', 17, 1), +(10963, 'with', 'book', 17, 1), +(10964, 'the', 'book', 17, 1), +(10965, 'art', 'book', 17, 1), +(10966, 'gallery', 'book', 17, 1), +(10967, 'platform', 'book', 17, 1), +(10968, 'Where', 'page', 36, 40), +(10969, 'to', 'page', 36, 54), +(10970, 'Start', 'page', 36, 40), +(10971, 'Description', 'page', 36, 1), +(10972, 'An', 'page', 36, 5), +(10973, 'overview', 'page', 36, 1), +(10974, 'of', 'page', 36, 7), +(10975, 'where', 'page', 36, 2), +(10976, 'exactly', 'page', 36, 1), +(10977, 'begin', 'page', 36, 1), +(10978, 'with', 'page', 36, 4), +(10979, 'naviagating', 'page', 36, 1), +(10980, 'and', 'page', 36, 10), +(10981, 'interacting', 'page', 36, 1), +(10982, 'the', 'page', 36, 6), +(10983, 'art', 'page', 36, 1), +(10984, 'gallery', 'page', 36, 1), +(10985, 'platform', 'page', 36, 2), +(10986, 'Example', 'page', 36, 4), +(10987, 'Document', 'page', 36, 4), +(10988, 'Welcome', 'page', 36, 1), +(10989, 'This', 'page', 36, 2), +(10990, 'is', 'page', 36, 7), +(10991, 'a', 'page', 36, 11), +(10992, 'filler', 'page', 36, 1), +(10993, 'page', 'page', 36, 1), +(10994, 'show', 'page', 36, 1), +(10995, 'off', 'page', 36, 1), +(10996, 'formatting', 'page', 36, 1), +(10997, 'BookStack', 'page', 36, 1), +(10998, 'documents', 'page', 36, 1), +(10999, ' ', 'page', 36, 1), +(11000, 'All', 'page', 36, 1), +(11001, 'content', 'page', 36, 1), +(11002, 'aside', 'page', 36, 2), +(11003, 'from', 'page', 36, 2), +(11004, 'description', 'page', 36, 1), +(11005, 'at', 'page', 36, 3), +(11006, 'top', 'page', 36, 1), +(11007, 'this', 'page', 36, 3), +(11008, 'document', 'page', 36, 3), +(11009, 'unrelated', 'page', 36, 1), +(11010, 's', 'page', 36, 1), +(11011, 'actual', 'page', 36, 1), +(11012, 'purposes', 'page', 36, 2), +(11013, 'should', 'page', 36, 1), +(11014, 'not', 'page', 36, 1), +(11015, 'be', 'page', 36, 4), +(11016, 'used', 'page', 36, 3), +(11017, 'demonstrative', 'page', 36, 1), +(11018, 'Further', 'page', 36, 4), +(11019, 'Content', 'page', 36, 8), +(11020, 'The', 'page', 36, 1), +(11021, 'purpose', 'page', 36, 1), +(11022, 'knowledge', 'page', 36, 2), +(11023, 'base', 'page', 36, 4), +(11024, 'act', 'page', 36, 1), +(11025, 'as', 'page', 36, 2), +(11026, 'centralized', 'page', 36, 1), +(11027, 'organized', 'page', 36, 2), +(11028, 'access', 'page', 36, 1), +(11029, 'guides', 'page', 36, 4), +(11030, 'tutorials', 'page', 36, 1), +(11031, 'troubleshooting', 'page', 36, 1), +(11032, 'information', 'page', 36, 2), +(11033, 'other', 'page', 36, 2), +(11034, 'resources', 'page', 36, 1), +(11035, 'Knowledge', 'page', 36, 3), +(11036, 'systems', 'page', 36, 3), +(11037, 'come', 'page', 36, 1), +(11038, 'in', 'page', 36, 6), +(11039, 'different', 'page', 36, 1), +(11040, 'flavors', 'page', 36, 1), +(11041, 'for', 'page', 36, 3), +(11042, 'example', 'page', 36, 1), +(11043, 'there', 'page', 36, 1), +(11044, 'may', 'page', 36, 1), +(11045, 'number', 'page', 36, 1), +(11046, 'predefined', 'page', 36, 1), +(11047, 'modules', 'page', 36, 1), +(11048, 'that', 'page', 36, 2), +(11049, 'can', 'page', 36, 3), +(11050, 'added', 'page', 36, 1), +(11051, 'removed', 'page', 36, 1), +(11052, 'developed', 'page', 36, 1), +(11053, 'an', 'page', 36, 1), +(11054, 'integrated', 'page', 36, 1), +(11055, 'manner', 'page', 36, 1), +(11056, 'products', 'page', 36, 1), +(11057, 'are', 'page', 36, 1), +(11058, 'most', 'page', 36, 1), +(11059, 'frequently', 'page', 36, 1), +(11060, 'contain', 'page', 36, 1), +(11061, 'detailed', 'page', 36, 1), +(11062, 'These', 'page', 36, 1), +(11063, 'include', 'page', 36, 2), +(11064, 'solutions', 'page', 36, 1), +(11065, 'wide', 'page', 36, 1), +(11066, 'range', 'page', 36, 1), +(11067, 'technical', 'page', 36, 1), +(11068, 'problems', 'page', 36, 1), +(11069, 'but', 'page', 36, 1), +(11070, 'also', 'page', 36, 1), +(11071, 'on', 'page', 36, 1), +(11072, 'every', 'page', 36, 1), +(11073, 'aspect', 'page', 36, 1), +(11074, 'programming', 'page', 36, 1), +(11075, 'hardware', 'page', 36, 1), +(11076, 'software', 'page', 36, 2), +(11077, 'topics', 'page', 36, 1), +(11078, 'business', 'page', 36, 1), +(11079, 'concepts', 'page', 36, 1), +(11080, 'Another', 'page', 36, 1), +(11081, 'reason', 'page', 36, 1), +(11082, 'consider', 'page', 36, 1), +(11083, 'Base', 'page', 36, 1), +(11084, 'it', 'page', 36, 3), +(11085, 'often', 'page', 36, 1), +(11086, 'single', 'page', 36, 1), +(11087, 'entry', 'page', 36, 1), +(11088, 'point', 'page', 36, 1), +(11089, 'system', 'page', 36, 2), +(11090, 'very', 'page', 36, 1), +(11091, 'convenient', 'page', 36, 1), +(11092, 'feature', 'page', 36, 1), +(11093, 'remote', 'page', 36, 1), +(11094, 'clients', 'page', 36, 1), +(11095, 'who', 'page', 36, 2), +(11096, 'need', 'page', 36, 2), +(11097, 'select', 'page', 36, 1), +(11098, 'particular', 'page', 36, 2), +(11099, 'program', 'page', 36, 1), +(11100, 'download', 'page', 36, 1), +(11101, 'their', 'page', 36, 1), +(11102, 'computer', 'page', 36, 1), +(11103, 'or', 'page', 36, 1), +(11104, 'quickly', 'page', 36, 1), +(11105, 'learn', 'page', 36, 2), +(11106, 'how', 'page', 36, 2), +(11107, 'configure', 'page', 36, 1), +(11108, 'It', 'page', 36, 1), +(11109, 'particularly', 'page', 36, 1), +(11110, 'useful', 'page', 36, 1), +(11111, 'schools', 'page', 36, 1), +(11112, 'users', 'page', 36, 1), +(11113, 'easily', 'page', 36, 1), +(11114, 'about', 'page', 36, 1), +(11115, 'application', 'page', 36, 1), +(11116, 'then', 'page', 36, 1), +(11117, 'use', 'page', 36, 1), +(11118, 'without', 'page', 36, 1), +(11119, 'having', 'page', 36, 1), +(11120, 'understand', 'page', 36, 1), +(11121, 'works', 'page', 36, 1), +(11122, 'Even', 'page', 36, 4), +(11123, 'Less', 'page', 36, 4), +(11124, 'Useful', 'page', 36, 4), +(11125, 'Lorem', 'page', 36, 2), +(11126, 'ipsum', 'page', 36, 2), +(11127, 'dolor', 'page', 36, 4), +(11128, 'sit', 'page', 36, 7), +(11129, 'amet', 'page', 36, 6), +(11130, 'consectetur', 'page', 36, 4), +(11131, 'adipiscing', 'page', 36, 3), +(11132, 'elit', 'page', 36, 3), +(11133, 'sed', 'page', 36, 5), +(11134, 'do', 'page', 36, 1), +(11135, 'eiusmod', 'page', 36, 1), +(11136, 'tempor', 'page', 36, 1), +(11137, 'incididunt', 'page', 36, 1), +(11138, 'ut', 'page', 36, 4), +(11139, 'labore', 'page', 36, 1), +(11140, 'et', 'page', 36, 2), +(11141, 'dolore', 'page', 36, 1), +(11142, 'magna', 'page', 36, 1), +(11143, 'aliqua', 'page', 36, 1), +(11144, 'Pellentesque', 'page', 36, 1), +(11145, 'porttitor', 'page', 36, 3), +(11146, 'eget', 'page', 36, 3), +(11147, 'morbi', 'page', 36, 5), +(11148, 'Nunc', 'page', 36, 1), +(11149, 'velit', 'page', 36, 1), +(11150, 'dignissim', 'page', 36, 3), +(11151, 'sodales', 'page', 36, 1), +(11152, 'eu', 'page', 36, 5), +(11153, 'sem', 'page', 36, 1), +(11154, 'integer', 'page', 36, 1), +(11155, 'Gravida', 'page', 36, 1), +(11156, 'cum', 'page', 36, 1), +(11157, 'sociis', 'page', 36, 1), +(11158, 'natoque', 'page', 36, 1), +(11159, 'penatibus', 'page', 36, 1), +(11160, 'magnis', 'page', 36, 1), +(11161, 'dis', 'page', 36, 1), +(11162, 'Proin', 'page', 36, 1), +(11163, 'libero', 'page', 36, 2), +(11164, 'enim', 'page', 36, 4), +(11165, 'faucibus', 'page', 36, 3), +(11166, 'turpis', 'page', 36, 1), +(11167, 'In', 'page', 36, 2), +(11168, 'fermentum', 'page', 36, 5), +(11169, 'posuere', 'page', 36, 2), +(11170, 'urna', 'page', 36, 3), +(11171, 'nec', 'page', 36, 1), +(11172, 'tincidunt', 'page', 36, 2), +(11173, 'praesent', 'page', 36, 1), +(11174, 'semper', 'page', 36, 1), +(11175, 'Varius', 'page', 36, 1), +(11176, 'duis', 'page', 36, 2), +(11177, 'lorem', 'page', 36, 2), +(11178, 'Placerat', 'page', 36, 1), +(11179, 'orci', 'page', 36, 4), +(11180, 'nulla', 'page', 36, 4), +(11181, 'pellentesque', 'page', 36, 2), +(11182, 'venenatis', 'page', 36, 1), +(11183, 'Integer', 'page', 36, 2), +(11184, 'feugiat', 'page', 36, 2), +(11185, 'scelerisque', 'page', 36, 3), +(11186, 'varius', 'page', 36, 4), +(11187, 'nunc', 'page', 36, 2), +(11188, 'Diam', 'page', 36, 1), +(11189, 'quam', 'page', 36, 5), +(11190, 'massa', 'page', 36, 2), +(11191, 'Dolor', 'page', 36, 1), +(11192, 'Tempus', 'page', 36, 1), +(11193, 'iaculis', 'page', 36, 2), +(11194, 'id', 'page', 36, 3), +(11195, 'volutpat', 'page', 36, 2), +(11196, 'Ac', 'page', 36, 1), +(11197, 'auctor', 'page', 36, 2), +(11198, 'augue', 'page', 36, 5), +(11199, 'mauris', 'page', 36, 4), +(11200, 'neque', 'page', 36, 3), +(11201, 'gravida', 'page', 36, 2), +(11202, 'Blandit', 'page', 36, 1), +(11203, 'cras', 'page', 36, 4), +(11204, 'ornare', 'page', 36, 1), +(11205, 'arcu', 'page', 36, 4), +(11206, 'mi', 'page', 36, 2), +(11207, 'bibendum', 'page', 36, 1), +(11208, 'egestas', 'page', 36, 3), +(11209, 'Non', 'page', 36, 1), +(11210, 'lacus', 'page', 36, 1), +(11211, 'suspendisse', 'page', 36, 3), +(11212, 'interdum', 'page', 36, 1), +(11213, 'Vivamus', 'page', 36, 1), +(11214, 'dictum', 'page', 36, 1), +(11215, 'Duis', 'page', 36, 1), +(11216, 'diam', 'page', 36, 4), +(11217, 'Egestas', 'page', 36, 1), +(11218, 'congue', 'page', 36, 1), +(11219, 'quisque', 'page', 36, 2), +(11220, 'cursus', 'page', 36, 1), +(11221, 'Quis', 'page', 36, 1), +(11222, 'viverra', 'page', 36, 2), +(11223, 'nibh', 'page', 36, 2), +(11224, 'pulvinar', 'page', 36, 3), +(11225, 'Hendrerit', 'page', 36, 1), +(11226, 'rutrum', 'page', 36, 2), +(11227, 'non', 'page', 36, 6), +(11228, 'tellus', 'page', 36, 5), +(11229, 'Metus', 'page', 36, 1), +(11230, 'vulputate', 'page', 36, 2), +(11231, 'felis', 'page', 36, 1), +(11232, 'imperdiet', 'page', 36, 2), +(11233, 'proin', 'page', 36, 2), +(11234, 'Nulla', 'page', 36, 1), +(11235, 'facilisi', 'page', 36, 2), +(11236, 'tempus', 'page', 36, 1), +(11237, 'Eget', 'page', 36, 2), +(11238, 'risus', 'page', 36, 1), +(11239, 'quis', 'page', 36, 1), +(11240, 'Quisque', 'page', 36, 1), +(11241, 'ac', 'page', 36, 2), +(11242, 'nullam', 'page', 36, 2), +(11243, 'nisi', 'page', 36, 2), +(11244, 'est', 'page', 36, 3), +(11245, 'Id', 'page', 36, 1), +(11246, 'vel', 'page', 36, 2), +(11247, 'elementum', 'page', 36, 1), +(11248, 'etiam', 'page', 36, 1), +(11249, 'Pretium', 'page', 36, 1), +(11250, 'potenti', 'page', 36, 1), +(11251, 'Aliquam', 'page', 36, 1), +(11252, 'maecenas', 'page', 36, 1), +(11253, 'ultricies', 'page', 36, 1), +(11254, 'Tellus', 'page', 36, 1), +(11255, 'tortor', 'page', 36, 1), +(11256, 'aliquam', 'page', 36, 1), +(11257, 'Facilisi', 'page', 36, 1), +(11258, 'odio', 'page', 36, 1), +(11259, 'Et', 'page', 36, 1), +(11260, 'sollicitudin', 'page', 36, 1), +(11261, 'phasellus', 'page', 36, 1), +(11262, 'Nullam', 'page', 36, 1), +(11263, 'Quam', 'page', 36, 1), +(11264, 'ante', 'page', 36, 1), +(11265, 'Nisi', 'page', 36, 1), +(11266, 'vitae', 'page', 36, 1), +(11267, 'suscipit', 'page', 36, 1), +(11268, 'Felis', 'page', 36, 1), +(11269, 'leo', 'page', 36, 1), +(11270, 'porta', 'page', 36, 1), +(11271, 'Conclusion', 'page', 36, 4), +(11272, 'I', 'page', 36, 1), +(11273, 'hope', 'page', 36, 1), +(11274, 'you', 'page', 36, 1), +(11275, 'enjoyed', 'page', 36, 1), +(11276, 'browsing', 'page', 36, 1), +(11277, 'almost', 'page', 36, 1), +(11278, 'pointless', 'page', 36, 1), +(11279, 'As', 'page', 36, 1), +(11280, 'reward', 'page', 36, 1), +(11281, 'check', 'page', 36, 1), +(11282, 'out', 'page', 36, 1), +(11283, 'sweet', 'page', 36, 1), +(11284, 'video', 'page', 36, 1), +(11285, 'Features', 'page', 37, 40), +(11286, 'and', 'page', 37, 50), +(11287, 'Functionality', 'page', 37, 40), +(11288, 'Description', 'page', 37, 1), +(11289, 'A', 'page', 37, 1), +(11290, 'list', 'page', 37, 1), +(11291, 'of', 'page', 37, 8), +(11292, 'the', 'page', 37, 8), +(11293, 'features', 'page', 37, 1), +(11294, 'art', 'page', 37, 1), +(11295, 'gallery', 'page', 37, 1), +(11296, 'platform', 'page', 37, 2), +(11297, 'functionality', 'page', 37, 1), +(11298, 'it', 'page', 37, 4), +(11299, 'provides', 'page', 37, 1), +(11300, 'An', 'page', 37, 4), +(11301, 'Example', 'page', 37, 4), +(11302, 'Document', 'page', 37, 4), +(11303, 'Welcome', 'page', 37, 1), +(11304, 'This', 'page', 37, 2), +(11305, 'is', 'page', 37, 7), +(11306, 'a', 'page', 37, 11), +(11307, 'filler', 'page', 37, 1), +(11308, 'page', 'page', 37, 1), +(11309, 'to', 'page', 37, 13), +(11310, 'show', 'page', 37, 1), +(11311, 'off', 'page', 37, 1), +(11312, 'formatting', 'page', 37, 1), +(11313, 'BookStack', 'page', 37, 1), +(11314, 'documents', 'page', 37, 1), +(11315, ' ', 'page', 37, 1), +(11316, 'All', 'page', 37, 1), +(11317, 'content', 'page', 37, 1), +(11318, 'aside', 'page', 37, 2), +(11319, 'from', 'page', 37, 2), +(11320, 'description', 'page', 37, 1), +(11321, 'at', 'page', 37, 3), +(11322, 'top', 'page', 37, 1), +(11323, 'this', 'page', 37, 3), +(11324, 'document', 'page', 37, 3), +(11325, 'unrelated', 'page', 37, 1), +(11326, 's', 'page', 37, 1), +(11327, 'actual', 'page', 37, 1), +(11328, 'purposes', 'page', 37, 2), +(11329, 'should', 'page', 37, 1), +(11330, 'not', 'page', 37, 1), +(11331, 'be', 'page', 37, 4), +(11332, 'used', 'page', 37, 3), +(11333, 'demonstrative', 'page', 37, 1), +(11334, 'Further', 'page', 37, 4), +(11335, 'Content', 'page', 37, 8), +(11336, 'The', 'page', 37, 1), +(11337, 'purpose', 'page', 37, 1), +(11338, 'knowledge', 'page', 37, 2), +(11339, 'base', 'page', 37, 4), +(11340, 'act', 'page', 37, 1), +(11341, 'as', 'page', 37, 2), +(11342, 'centralized', 'page', 37, 1), +(11343, 'organized', 'page', 37, 2), +(11344, 'access', 'page', 37, 1), +(11345, 'guides', 'page', 37, 4), +(11346, 'tutorials', 'page', 37, 1), +(11347, 'troubleshooting', 'page', 37, 1), +(11348, 'information', 'page', 37, 2), +(11349, 'other', 'page', 37, 2), +(11350, 'resources', 'page', 37, 1), +(11351, 'Knowledge', 'page', 37, 3), +(11352, 'systems', 'page', 37, 3), +(11353, 'come', 'page', 37, 1), +(11354, 'in', 'page', 37, 6), +(11355, 'different', 'page', 37, 1), +(11356, 'flavors', 'page', 37, 1), +(11357, 'for', 'page', 37, 3), +(11358, 'example', 'page', 37, 1), +(11359, 'there', 'page', 37, 1), +(11360, 'may', 'page', 37, 1), +(11361, 'number', 'page', 37, 1), +(11362, 'predefined', 'page', 37, 1), +(11363, 'modules', 'page', 37, 1), +(11364, 'that', 'page', 37, 2), +(11365, 'can', 'page', 37, 3), +(11366, 'added', 'page', 37, 1), +(11367, 'removed', 'page', 37, 1), +(11368, 'developed', 'page', 37, 1), +(11369, 'an', 'page', 37, 1), +(11370, 'integrated', 'page', 37, 1), +(11371, 'manner', 'page', 37, 1), +(11372, 'with', 'page', 37, 2), +(11373, 'products', 'page', 37, 1), +(11374, 'are', 'page', 37, 1), +(11375, 'most', 'page', 37, 1), +(11376, 'frequently', 'page', 37, 1), +(11377, 'contain', 'page', 37, 1), +(11378, 'detailed', 'page', 37, 1), +(11379, 'These', 'page', 37, 1), +(11380, 'include', 'page', 37, 2), +(11381, 'solutions', 'page', 37, 1), +(11382, 'wide', 'page', 37, 1), +(11383, 'range', 'page', 37, 1), +(11384, 'technical', 'page', 37, 1), +(11385, 'problems', 'page', 37, 1), +(11386, 'but', 'page', 37, 1), +(11387, 'also', 'page', 37, 1), +(11388, 'on', 'page', 37, 1), +(11389, 'every', 'page', 37, 1), +(11390, 'aspect', 'page', 37, 1), +(11391, 'programming', 'page', 37, 1), +(11392, 'hardware', 'page', 37, 1), +(11393, 'software', 'page', 37, 2), +(11394, 'topics', 'page', 37, 1), +(11395, 'business', 'page', 37, 1), +(11396, 'concepts', 'page', 37, 1), +(11397, 'Another', 'page', 37, 1), +(11398, 'reason', 'page', 37, 1), +(11399, 'consider', 'page', 37, 1), +(11400, 'Base', 'page', 37, 1), +(11401, 'often', 'page', 37, 1), +(11402, 'single', 'page', 37, 1), +(11403, 'entry', 'page', 37, 1), +(11404, 'point', 'page', 37, 1), +(11405, 'system', 'page', 37, 2), +(11406, 'very', 'page', 37, 1), +(11407, 'convenient', 'page', 37, 1), +(11408, 'feature', 'page', 37, 1), +(11409, 'remote', 'page', 37, 1), +(11410, 'clients', 'page', 37, 1), +(11411, 'who', 'page', 37, 2), +(11412, 'need', 'page', 37, 2), +(11413, 'select', 'page', 37, 1), +(11414, 'particular', 'page', 37, 2), +(11415, 'program', 'page', 37, 1), +(11416, 'download', 'page', 37, 1), +(11417, 'their', 'page', 37, 1), +(11418, 'computer', 'page', 37, 1), +(11419, 'or', 'page', 37, 1), +(11420, 'quickly', 'page', 37, 1), +(11421, 'learn', 'page', 37, 2), +(11422, 'how', 'page', 37, 2), +(11423, 'configure', 'page', 37, 1), +(11424, 'It', 'page', 37, 1), +(11425, 'particularly', 'page', 37, 1), +(11426, 'useful', 'page', 37, 1), +(11427, 'schools', 'page', 37, 1), +(11428, 'where', 'page', 37, 1), +(11429, 'users', 'page', 37, 1), +(11430, 'easily', 'page', 37, 1), +(11431, 'about', 'page', 37, 1), +(11432, 'application', 'page', 37, 1), +(11433, 'then', 'page', 37, 1), +(11434, 'use', 'page', 37, 1), +(11435, 'without', 'page', 37, 1), +(11436, 'having', 'page', 37, 1), +(11437, 'understand', 'page', 37, 1), +(11438, 'works', 'page', 37, 1), +(11439, 'Even', 'page', 37, 4), +(11440, 'Less', 'page', 37, 4), +(11441, 'Useful', 'page', 37, 4), +(11442, 'Lorem', 'page', 37, 2), +(11443, 'ipsum', 'page', 37, 2), +(11444, 'dolor', 'page', 37, 4), +(11445, 'sit', 'page', 37, 7), +(11446, 'amet', 'page', 37, 6), +(11447, 'consectetur', 'page', 37, 4), +(11448, 'adipiscing', 'page', 37, 3), +(11449, 'elit', 'page', 37, 3), +(11450, 'sed', 'page', 37, 5), +(11451, 'do', 'page', 37, 1), +(11452, 'eiusmod', 'page', 37, 1), +(11453, 'tempor', 'page', 37, 1), +(11454, 'incididunt', 'page', 37, 1), +(11455, 'ut', 'page', 37, 4), +(11456, 'labore', 'page', 37, 1), +(11457, 'et', 'page', 37, 2), +(11458, 'dolore', 'page', 37, 1), +(11459, 'magna', 'page', 37, 1), +(11460, 'aliqua', 'page', 37, 1), +(11461, 'Pellentesque', 'page', 37, 1), +(11462, 'porttitor', 'page', 37, 3), +(11463, 'eget', 'page', 37, 3), +(11464, 'morbi', 'page', 37, 5), +(11465, 'Nunc', 'page', 37, 1), +(11466, 'velit', 'page', 37, 1), +(11467, 'dignissim', 'page', 37, 3), +(11468, 'sodales', 'page', 37, 1), +(11469, 'eu', 'page', 37, 5), +(11470, 'sem', 'page', 37, 1), +(11471, 'integer', 'page', 37, 1), +(11472, 'Gravida', 'page', 37, 1), +(11473, 'cum', 'page', 37, 1), +(11474, 'sociis', 'page', 37, 1), +(11475, 'natoque', 'page', 37, 1), +(11476, 'penatibus', 'page', 37, 1), +(11477, 'magnis', 'page', 37, 1), +(11478, 'dis', 'page', 37, 1), +(11479, 'Proin', 'page', 37, 1), +(11480, 'libero', 'page', 37, 2), +(11481, 'enim', 'page', 37, 4), +(11482, 'faucibus', 'page', 37, 3), +(11483, 'turpis', 'page', 37, 1), +(11484, 'In', 'page', 37, 2), +(11485, 'fermentum', 'page', 37, 5), +(11486, 'posuere', 'page', 37, 2), +(11487, 'urna', 'page', 37, 3), +(11488, 'nec', 'page', 37, 1), +(11489, 'tincidunt', 'page', 37, 2), +(11490, 'praesent', 'page', 37, 1), +(11491, 'semper', 'page', 37, 1), +(11492, 'Varius', 'page', 37, 1), +(11493, 'duis', 'page', 37, 2), +(11494, 'lorem', 'page', 37, 2), +(11495, 'Placerat', 'page', 37, 1), +(11496, 'orci', 'page', 37, 4), +(11497, 'nulla', 'page', 37, 4), +(11498, 'pellentesque', 'page', 37, 2), +(11499, 'venenatis', 'page', 37, 1), +(11500, 'Integer', 'page', 37, 2), +(11501, 'feugiat', 'page', 37, 2), +(11502, 'scelerisque', 'page', 37, 3), +(11503, 'varius', 'page', 37, 4), +(11504, 'nunc', 'page', 37, 2), +(11505, 'Diam', 'page', 37, 1), +(11506, 'quam', 'page', 37, 5), +(11507, 'massa', 'page', 37, 2), +(11508, 'Dolor', 'page', 37, 1), +(11509, 'Tempus', 'page', 37, 1), +(11510, 'iaculis', 'page', 37, 2), +(11511, 'id', 'page', 37, 3), +(11512, 'volutpat', 'page', 37, 2), +(11513, 'Ac', 'page', 37, 1), +(11514, 'auctor', 'page', 37, 2), +(11515, 'augue', 'page', 37, 5), +(11516, 'mauris', 'page', 37, 4), +(11517, 'neque', 'page', 37, 3), +(11518, 'gravida', 'page', 37, 2), +(11519, 'Blandit', 'page', 37, 1), +(11520, 'cras', 'page', 37, 4), +(11521, 'ornare', 'page', 37, 1), +(11522, 'arcu', 'page', 37, 4), +(11523, 'mi', 'page', 37, 2), +(11524, 'bibendum', 'page', 37, 1), +(11525, 'egestas', 'page', 37, 3), +(11526, 'Non', 'page', 37, 1), +(11527, 'lacus', 'page', 37, 1), +(11528, 'suspendisse', 'page', 37, 3), +(11529, 'interdum', 'page', 37, 1), +(11530, 'Vivamus', 'page', 37, 1), +(11531, 'dictum', 'page', 37, 1), +(11532, 'Duis', 'page', 37, 1), +(11533, 'diam', 'page', 37, 4), +(11534, 'Egestas', 'page', 37, 1), +(11535, 'congue', 'page', 37, 1), +(11536, 'quisque', 'page', 37, 2), +(11537, 'cursus', 'page', 37, 1), +(11538, 'Quis', 'page', 37, 1), +(11539, 'viverra', 'page', 37, 2), +(11540, 'nibh', 'page', 37, 2), +(11541, 'pulvinar', 'page', 37, 3), +(11542, 'Hendrerit', 'page', 37, 1), +(11543, 'rutrum', 'page', 37, 2), +(11544, 'non', 'page', 37, 6), +(11545, 'tellus', 'page', 37, 5), +(11546, 'Metus', 'page', 37, 1), +(11547, 'vulputate', 'page', 37, 2), +(11548, 'felis', 'page', 37, 1), +(11549, 'imperdiet', 'page', 37, 2), +(11550, 'proin', 'page', 37, 2), +(11551, 'Nulla', 'page', 37, 1), +(11552, 'facilisi', 'page', 37, 2), +(11553, 'tempus', 'page', 37, 1), +(11554, 'Eget', 'page', 37, 2), +(11555, 'risus', 'page', 37, 1), +(11556, 'quis', 'page', 37, 1), +(11557, 'Quisque', 'page', 37, 1), +(11558, 'ac', 'page', 37, 2), +(11559, 'nullam', 'page', 37, 2), +(11560, 'nisi', 'page', 37, 2), +(11561, 'est', 'page', 37, 3), +(11562, 'Id', 'page', 37, 1), +(11563, 'vel', 'page', 37, 2), +(11564, 'elementum', 'page', 37, 1), +(11565, 'etiam', 'page', 37, 1), +(11566, 'Pretium', 'page', 37, 1), +(11567, 'potenti', 'page', 37, 1), +(11568, 'Aliquam', 'page', 37, 1), +(11569, 'maecenas', 'page', 37, 1), +(11570, 'ultricies', 'page', 37, 1), +(11571, 'Tellus', 'page', 37, 1), +(11572, 'tortor', 'page', 37, 1), +(11573, 'aliquam', 'page', 37, 1), +(11574, 'Facilisi', 'page', 37, 1), +(11575, 'odio', 'page', 37, 1), +(11576, 'Et', 'page', 37, 1), +(11577, 'sollicitudin', 'page', 37, 1), +(11578, 'phasellus', 'page', 37, 1), +(11579, 'Nullam', 'page', 37, 1), +(11580, 'Quam', 'page', 37, 1), +(11581, 'ante', 'page', 37, 1), +(11582, 'Nisi', 'page', 37, 1), +(11583, 'vitae', 'page', 37, 1), +(11584, 'suscipit', 'page', 37, 1), +(11585, 'Felis', 'page', 37, 1), +(11586, 'leo', 'page', 37, 1), +(11587, 'porta', 'page', 37, 1), +(11588, 'Conclusion', 'page', 37, 4), +(11589, 'I', 'page', 37, 1), +(11590, 'hope', 'page', 37, 1), +(11591, 'you', 'page', 37, 1), +(11592, 'enjoyed', 'page', 37, 1), +(11593, 'browsing', 'page', 37, 1), +(11594, 'almost', 'page', 37, 1), +(11595, 'pointless', 'page', 37, 1), +(11596, 'As', 'page', 37, 1), +(11597, 'reward', 'page', 37, 1), +(11598, 'check', 'page', 37, 1), +(11599, 'out', 'page', 37, 1), +(11600, 'sweet', 'page', 37, 1), +(11601, 'video', 'page', 37, 1), +(11602, 'Developer', 'book', 18, 48), +(11603, 'Reports', 'book', 18, 48), +(11604, 'Communications', 'book', 18, 1), +(11605, 'from', 'book', 18, 1), +(11606, 'the', 'book', 18, 4), +(11607, 'developers', 'book', 18, 1), +(11608, 'to', 'book', 18, 1), +(11609, 'clientele', 'book', 18, 1), +(11610, 'regarding', 'book', 18, 1), +(11611, 'status', 'book', 18, 1), +(11612, 'of', 'book', 18, 1), +(11613, 'art', 'book', 18, 1), +(11614, 'gallery', 'book', 18, 1), +(11615, 'project', 'book', 18, 1), +(11616, 'and', 'book', 18, 1), +(11617, 'platform', 'book', 18, 1), +(11618, 'Updates', 'page', 38, 41), +(11619, 'Description', 'page', 38, 1), +(11620, 'describing', 'page', 38, 1), +(11621, 'new', 'page', 38, 1), +(11622, 'progress', 'page', 38, 1), +(11623, 'and', 'page', 38, 10), +(11624, 'features', 'page', 38, 1), +(11625, 'of', 'page', 38, 7), +(11626, 'the', 'page', 38, 6), +(11627, 'art', 'page', 38, 1), +(11628, 'gallery', 'page', 38, 1), +(11629, 'platform', 'page', 38, 2), +(11630, 'An', 'page', 38, 4), +(11631, 'Example', 'page', 38, 4), +(11632, 'Document', 'page', 38, 4), +(11633, 'Welcome', 'page', 38, 1), +(11634, 'This', 'page', 38, 2), +(11635, 'is', 'page', 38, 7), +(11636, 'a', 'page', 38, 11), +(11637, 'filler', 'page', 38, 1), +(11638, 'page', 'page', 38, 1), +(11639, 'to', 'page', 38, 13), +(11640, 'show', 'page', 38, 1), +(11641, 'off', 'page', 38, 1), +(11642, 'formatting', 'page', 38, 1), +(11643, 'BookStack', 'page', 38, 1), +(11644, 'documents', 'page', 38, 1), +(11645, ' ', 'page', 38, 1), +(11646, 'All', 'page', 38, 1), +(11647, 'content', 'page', 38, 1), +(11648, 'aside', 'page', 38, 2), +(11649, 'from', 'page', 38, 2), +(11650, 'description', 'page', 38, 1), +(11651, 'at', 'page', 38, 3), +(11652, 'top', 'page', 38, 1), +(11653, 'this', 'page', 38, 3), +(11654, 'document', 'page', 38, 3), +(11655, 'unrelated', 'page', 38, 1), +(11656, 's', 'page', 38, 1), +(11657, 'actual', 'page', 38, 1), +(11658, 'purposes', 'page', 38, 2), +(11659, 'should', 'page', 38, 1), +(11660, 'not', 'page', 38, 1), +(11661, 'be', 'page', 38, 4), +(11662, 'used', 'page', 38, 3), +(11663, 'demonstrative', 'page', 38, 1), +(11664, 'Further', 'page', 38, 4), +(11665, 'Content', 'page', 38, 8), +(11666, 'The', 'page', 38, 1), +(11667, 'purpose', 'page', 38, 1), +(11668, 'knowledge', 'page', 38, 2), +(11669, 'base', 'page', 38, 4), +(11670, 'act', 'page', 38, 1), +(11671, 'as', 'page', 38, 2), +(11672, 'centralized', 'page', 38, 1), +(11673, 'organized', 'page', 38, 2), +(11674, 'access', 'page', 38, 1), +(11675, 'guides', 'page', 38, 4), +(11676, 'tutorials', 'page', 38, 1), +(11677, 'troubleshooting', 'page', 38, 1), +(11678, 'information', 'page', 38, 2), +(11679, 'other', 'page', 38, 2), +(11680, 'resources', 'page', 38, 1), +(11681, 'Knowledge', 'page', 38, 3), +(11682, 'systems', 'page', 38, 3), +(11683, 'come', 'page', 38, 1), +(11684, 'in', 'page', 38, 6), +(11685, 'different', 'page', 38, 1), +(11686, 'flavors', 'page', 38, 1), +(11687, 'for', 'page', 38, 3), +(11688, 'example', 'page', 38, 1), +(11689, 'there', 'page', 38, 1), +(11690, 'may', 'page', 38, 1), +(11691, 'number', 'page', 38, 1), +(11692, 'predefined', 'page', 38, 1), +(11693, 'modules', 'page', 38, 1), +(11694, 'that', 'page', 38, 2), +(11695, 'can', 'page', 38, 3), +(11696, 'added', 'page', 38, 1), +(11697, 'removed', 'page', 38, 1), +(11698, 'developed', 'page', 38, 1), +(11699, 'an', 'page', 38, 1), +(11700, 'integrated', 'page', 38, 1), +(11701, 'manner', 'page', 38, 1), +(11702, 'with', 'page', 38, 2), +(11703, 'products', 'page', 38, 1), +(11704, 'are', 'page', 38, 1), +(11705, 'most', 'page', 38, 1), +(11706, 'frequently', 'page', 38, 1), +(11707, 'contain', 'page', 38, 1), +(11708, 'detailed', 'page', 38, 1), +(11709, 'These', 'page', 38, 1), +(11710, 'include', 'page', 38, 2), +(11711, 'solutions', 'page', 38, 1), +(11712, 'wide', 'page', 38, 1), +(11713, 'range', 'page', 38, 1), +(11714, 'technical', 'page', 38, 1), +(11715, 'problems', 'page', 38, 1), +(11716, 'but', 'page', 38, 1), +(11717, 'also', 'page', 38, 1), +(11718, 'on', 'page', 38, 1), +(11719, 'every', 'page', 38, 1), +(11720, 'aspect', 'page', 38, 1), +(11721, 'programming', 'page', 38, 1), +(11722, 'hardware', 'page', 38, 1), +(11723, 'software', 'page', 38, 2), +(11724, 'topics', 'page', 38, 1), +(11725, 'business', 'page', 38, 1), +(11726, 'concepts', 'page', 38, 1), +(11727, 'Another', 'page', 38, 1), +(11728, 'reason', 'page', 38, 1), +(11729, 'consider', 'page', 38, 1), +(11730, 'Base', 'page', 38, 1), +(11731, 'it', 'page', 38, 3), +(11732, 'often', 'page', 38, 1), +(11733, 'single', 'page', 38, 1), +(11734, 'entry', 'page', 38, 1), +(11735, 'point', 'page', 38, 1), +(11736, 'system', 'page', 38, 2), +(11737, 'very', 'page', 38, 1), +(11738, 'convenient', 'page', 38, 1), +(11739, 'feature', 'page', 38, 1), +(11740, 'remote', 'page', 38, 1), +(11741, 'clients', 'page', 38, 1), +(11742, 'who', 'page', 38, 2), +(11743, 'need', 'page', 38, 2), +(11744, 'select', 'page', 38, 1), +(11745, 'particular', 'page', 38, 2), +(11746, 'program', 'page', 38, 1), +(11747, 'download', 'page', 38, 1), +(11748, 'their', 'page', 38, 1), +(11749, 'computer', 'page', 38, 1), +(11750, 'or', 'page', 38, 1), +(11751, 'quickly', 'page', 38, 1), +(11752, 'learn', 'page', 38, 2), +(11753, 'how', 'page', 38, 2), +(11754, 'configure', 'page', 38, 1), +(11755, 'It', 'page', 38, 1), +(11756, 'particularly', 'page', 38, 1), +(11757, 'useful', 'page', 38, 1), +(11758, 'schools', 'page', 38, 1), +(11759, 'where', 'page', 38, 1), +(11760, 'users', 'page', 38, 1), +(11761, 'easily', 'page', 38, 1), +(11762, 'about', 'page', 38, 1), +(11763, 'application', 'page', 38, 1), +(11764, 'then', 'page', 38, 1), +(11765, 'use', 'page', 38, 1), +(11766, 'without', 'page', 38, 1), +(11767, 'having', 'page', 38, 1), +(11768, 'understand', 'page', 38, 1), +(11769, 'works', 'page', 38, 1), +(11770, 'Even', 'page', 38, 4), +(11771, 'Less', 'page', 38, 4), +(11772, 'Useful', 'page', 38, 4), +(11773, 'Lorem', 'page', 38, 2), +(11774, 'ipsum', 'page', 38, 2), +(11775, 'dolor', 'page', 38, 4), +(11776, 'sit', 'page', 38, 7), +(11777, 'amet', 'page', 38, 6), +(11778, 'consectetur', 'page', 38, 4), +(11779, 'adipiscing', 'page', 38, 3), +(11780, 'elit', 'page', 38, 3), +(11781, 'sed', 'page', 38, 5), +(11782, 'do', 'page', 38, 1), +(11783, 'eiusmod', 'page', 38, 1), +(11784, 'tempor', 'page', 38, 1), +(11785, 'incididunt', 'page', 38, 1), +(11786, 'ut', 'page', 38, 4), +(11787, 'labore', 'page', 38, 1), +(11788, 'et', 'page', 38, 2), +(11789, 'dolore', 'page', 38, 1), +(11790, 'magna', 'page', 38, 1), +(11791, 'aliqua', 'page', 38, 1), +(11792, 'Pellentesque', 'page', 38, 1), +(11793, 'porttitor', 'page', 38, 3), +(11794, 'eget', 'page', 38, 3), +(11795, 'morbi', 'page', 38, 5), +(11796, 'Nunc', 'page', 38, 1), +(11797, 'velit', 'page', 38, 1), +(11798, 'dignissim', 'page', 38, 3), +(11799, 'sodales', 'page', 38, 1), +(11800, 'eu', 'page', 38, 5), +(11801, 'sem', 'page', 38, 1), +(11802, 'integer', 'page', 38, 1), +(11803, 'Gravida', 'page', 38, 1), +(11804, 'cum', 'page', 38, 1), +(11805, 'sociis', 'page', 38, 1), +(11806, 'natoque', 'page', 38, 1), +(11807, 'penatibus', 'page', 38, 1), +(11808, 'magnis', 'page', 38, 1), +(11809, 'dis', 'page', 38, 1), +(11810, 'Proin', 'page', 38, 1), +(11811, 'libero', 'page', 38, 2), +(11812, 'enim', 'page', 38, 4), +(11813, 'faucibus', 'page', 38, 3), +(11814, 'turpis', 'page', 38, 1), +(11815, 'In', 'page', 38, 2), +(11816, 'fermentum', 'page', 38, 5), +(11817, 'posuere', 'page', 38, 2), +(11818, 'urna', 'page', 38, 3), +(11819, 'nec', 'page', 38, 1), +(11820, 'tincidunt', 'page', 38, 2), +(11821, 'praesent', 'page', 38, 1), +(11822, 'semper', 'page', 38, 1), +(11823, 'Varius', 'page', 38, 1), +(11824, 'duis', 'page', 38, 2), +(11825, 'lorem', 'page', 38, 2), +(11826, 'Placerat', 'page', 38, 1), +(11827, 'orci', 'page', 38, 4), +(11828, 'nulla', 'page', 38, 4), +(11829, 'pellentesque', 'page', 38, 2), +(11830, 'venenatis', 'page', 38, 1), +(11831, 'Integer', 'page', 38, 2), +(11832, 'feugiat', 'page', 38, 2), +(11833, 'scelerisque', 'page', 38, 3), +(11834, 'varius', 'page', 38, 4), +(11835, 'nunc', 'page', 38, 2), +(11836, 'Diam', 'page', 38, 1), +(11837, 'quam', 'page', 38, 5), +(11838, 'massa', 'page', 38, 2), +(11839, 'Dolor', 'page', 38, 1), +(11840, 'Tempus', 'page', 38, 1), +(11841, 'iaculis', 'page', 38, 2), +(11842, 'id', 'page', 38, 3), +(11843, 'volutpat', 'page', 38, 2), +(11844, 'Ac', 'page', 38, 1), +(11845, 'auctor', 'page', 38, 2), +(11846, 'augue', 'page', 38, 5), +(11847, 'mauris', 'page', 38, 4), +(11848, 'neque', 'page', 38, 3), +(11849, 'gravida', 'page', 38, 2), +(11850, 'Blandit', 'page', 38, 1), +(11851, 'cras', 'page', 38, 4), +(11852, 'ornare', 'page', 38, 1), +(11853, 'arcu', 'page', 38, 4), +(11854, 'mi', 'page', 38, 2), +(11855, 'bibendum', 'page', 38, 1), +(11856, 'egestas', 'page', 38, 3), +(11857, 'Non', 'page', 38, 1), +(11858, 'lacus', 'page', 38, 1), +(11859, 'suspendisse', 'page', 38, 3), +(11860, 'interdum', 'page', 38, 1), +(11861, 'Vivamus', 'page', 38, 1), +(11862, 'dictum', 'page', 38, 1), +(11863, 'Duis', 'page', 38, 1), +(11864, 'diam', 'page', 38, 4), +(11865, 'Egestas', 'page', 38, 1), +(11866, 'congue', 'page', 38, 1), +(11867, 'quisque', 'page', 38, 2), +(11868, 'cursus', 'page', 38, 1), +(11869, 'Quis', 'page', 38, 1), +(11870, 'viverra', 'page', 38, 2), +(11871, 'nibh', 'page', 38, 2), +(11872, 'pulvinar', 'page', 38, 3), +(11873, 'Hendrerit', 'page', 38, 1), +(11874, 'rutrum', 'page', 38, 2), +(11875, 'non', 'page', 38, 6), +(11876, 'tellus', 'page', 38, 5), +(11877, 'Metus', 'page', 38, 1), +(11878, 'vulputate', 'page', 38, 2), +(11879, 'felis', 'page', 38, 1), +(11880, 'imperdiet', 'page', 38, 2), +(11881, 'proin', 'page', 38, 2), +(11882, 'Nulla', 'page', 38, 1), +(11883, 'facilisi', 'page', 38, 2), +(11884, 'tempus', 'page', 38, 1), +(11885, 'Eget', 'page', 38, 2), +(11886, 'risus', 'page', 38, 1), +(11887, 'quis', 'page', 38, 1), +(11888, 'Quisque', 'page', 38, 1), +(11889, 'ac', 'page', 38, 2), +(11890, 'nullam', 'page', 38, 2), +(11891, 'nisi', 'page', 38, 2), +(11892, 'est', 'page', 38, 3), +(11893, 'Id', 'page', 38, 1), +(11894, 'vel', 'page', 38, 2), +(11895, 'elementum', 'page', 38, 1), +(11896, 'etiam', 'page', 38, 1), +(11897, 'Pretium', 'page', 38, 1), +(11898, 'potenti', 'page', 38, 1), +(11899, 'Aliquam', 'page', 38, 1), +(11900, 'maecenas', 'page', 38, 1), +(11901, 'ultricies', 'page', 38, 1), +(11902, 'Tellus', 'page', 38, 1), +(11903, 'tortor', 'page', 38, 1), +(11904, 'aliquam', 'page', 38, 1), +(11905, 'Facilisi', 'page', 38, 1), +(11906, 'odio', 'page', 38, 1), +(11907, 'Et', 'page', 38, 1), +(11908, 'sollicitudin', 'page', 38, 1), +(11909, 'phasellus', 'page', 38, 1), +(11910, 'Nullam', 'page', 38, 1), +(11911, 'Quam', 'page', 38, 1), +(11912, 'ante', 'page', 38, 1), +(11913, 'Nisi', 'page', 38, 1), +(11914, 'vitae', 'page', 38, 1), +(11915, 'suscipit', 'page', 38, 1), +(11916, 'Felis', 'page', 38, 1), +(11917, 'leo', 'page', 38, 1), +(11918, 'porta', 'page', 38, 1), +(11919, 'Conclusion', 'page', 38, 4), +(11920, 'I', 'page', 38, 1), +(11921, 'hope', 'page', 38, 1), +(11922, 'you', 'page', 38, 1), +(11923, 'enjoyed', 'page', 38, 1), +(11924, 'browsing', 'page', 38, 1), +(11925, 'almost', 'page', 38, 1), +(11926, 'pointless', 'page', 38, 1), +(11927, 'As', 'page', 38, 1), +(11928, 'reward', 'page', 38, 1), +(11929, 'check', 'page', 38, 1), +(11930, 'out', 'page', 38, 1), +(11931, 'sweet', 'page', 38, 1), +(11932, 'video', 'page', 38, 1), +(11933, 'Troubleshooting', 'book', 19, 49), +(11934, 'solutions', 'book', 19, 1), +(11935, 'for', 'book', 19, 1), +(11936, 'the', 'book', 19, 1), +(11937, 'art', 'book', 19, 1), +(11938, 'gallery', 'book', 19, 1), +(11939, 'platform', 'book', 19, 1), +(11940, 'Common', 'page', 39, 40), +(11941, 'Problems', 'page', 39, 40), +(11942, 'and', 'page', 39, 50), +(11943, 'Solutions', 'page', 39, 40), +(11944, 'Description', 'page', 39, 1), +(11945, 'A', 'page', 39, 1), +(11946, 'list', 'page', 39, 1), +(11947, 'of', 'page', 39, 7), +(11948, 'commonly', 'page', 39, 1), +(11949, 'encountered', 'page', 39, 1), +(11950, 'issues', 'page', 39, 1), +(11951, 'with', 'page', 39, 3), +(11952, 'the', 'page', 39, 6), +(11953, 'art', 'page', 39, 1), +(11954, 'gallery', 'page', 39, 1), +(11955, 'platform', 'page', 39, 2), +(11956, 'general', 'page', 39, 1), +(11957, 'solutions', 'page', 39, 2), +(11958, 'An', 'page', 39, 4), +(11959, 'Example', 'page', 39, 4), +(11960, 'Document', 'page', 39, 4), +(11961, 'Welcome', 'page', 39, 1), +(11962, 'This', 'page', 39, 2), +(11963, 'is', 'page', 39, 7), +(11964, 'a', 'page', 39, 11), +(11965, 'filler', 'page', 39, 1), +(11966, 'page', 'page', 39, 1), +(11967, 'to', 'page', 39, 13), +(11968, 'show', 'page', 39, 1), +(11969, 'off', 'page', 39, 1), +(11970, 'formatting', 'page', 39, 1), +(11971, 'BookStack', 'page', 39, 1), +(11972, 'documents', 'page', 39, 1), +(11973, ' ', 'page', 39, 1), +(11974, 'All', 'page', 39, 1), +(11975, 'content', 'page', 39, 1), +(11976, 'aside', 'page', 39, 2), +(11977, 'from', 'page', 39, 2), +(11978, 'description', 'page', 39, 1), +(11979, 'at', 'page', 39, 3), +(11980, 'top', 'page', 39, 1), +(11981, 'this', 'page', 39, 3), +(11982, 'document', 'page', 39, 3), +(11983, 'unrelated', 'page', 39, 1), +(11984, 's', 'page', 39, 1), +(11985, 'actual', 'page', 39, 1), +(11986, 'purposes', 'page', 39, 2), +(11987, 'should', 'page', 39, 1), +(11988, 'not', 'page', 39, 1), +(11989, 'be', 'page', 39, 4), +(11990, 'used', 'page', 39, 3), +(11991, 'demonstrative', 'page', 39, 1), +(11992, 'Further', 'page', 39, 4), +(11993, 'Content', 'page', 39, 8), +(11994, 'The', 'page', 39, 1), +(11995, 'purpose', 'page', 39, 1), +(11996, 'knowledge', 'page', 39, 2), +(11997, 'base', 'page', 39, 4), +(11998, 'act', 'page', 39, 1), +(11999, 'as', 'page', 39, 2), +(12000, 'centralized', 'page', 39, 1), +(12001, 'organized', 'page', 39, 2), +(12002, 'access', 'page', 39, 1), +(12003, 'guides', 'page', 39, 4), +(12004, 'tutorials', 'page', 39, 1), +(12005, 'troubleshooting', 'page', 39, 1), +(12006, 'information', 'page', 39, 2), +(12007, 'other', 'page', 39, 2), +(12008, 'resources', 'page', 39, 1), +(12009, 'Knowledge', 'page', 39, 3), +(12010, 'systems', 'page', 39, 3), +(12011, 'come', 'page', 39, 1), +(12012, 'in', 'page', 39, 6), +(12013, 'different', 'page', 39, 1), +(12014, 'flavors', 'page', 39, 1), +(12015, 'for', 'page', 39, 3), +(12016, 'example', 'page', 39, 1), +(12017, 'there', 'page', 39, 1), +(12018, 'may', 'page', 39, 1), +(12019, 'number', 'page', 39, 1), +(12020, 'predefined', 'page', 39, 1), +(12021, 'modules', 'page', 39, 1), +(12022, 'that', 'page', 39, 2), +(12023, 'can', 'page', 39, 3), +(12024, 'added', 'page', 39, 1), +(12025, 'removed', 'page', 39, 1), +(12026, 'developed', 'page', 39, 1), +(12027, 'an', 'page', 39, 1), +(12028, 'integrated', 'page', 39, 1), +(12029, 'manner', 'page', 39, 1), +(12030, 'products', 'page', 39, 1), +(12031, 'are', 'page', 39, 1), +(12032, 'most', 'page', 39, 1), +(12033, 'frequently', 'page', 39, 1), +(12034, 'contain', 'page', 39, 1), +(12035, 'detailed', 'page', 39, 1), +(12036, 'These', 'page', 39, 1), +(12037, 'include', 'page', 39, 2), +(12038, 'wide', 'page', 39, 1), +(12039, 'range', 'page', 39, 1), +(12040, 'technical', 'page', 39, 1), +(12041, 'problems', 'page', 39, 1), +(12042, 'but', 'page', 39, 1), +(12043, 'also', 'page', 39, 1), +(12044, 'on', 'page', 39, 1), +(12045, 'every', 'page', 39, 1), +(12046, 'aspect', 'page', 39, 1), +(12047, 'programming', 'page', 39, 1), +(12048, 'hardware', 'page', 39, 1), +(12049, 'software', 'page', 39, 2), +(12050, 'topics', 'page', 39, 1), +(12051, 'business', 'page', 39, 1), +(12052, 'concepts', 'page', 39, 1), +(12053, 'Another', 'page', 39, 1), +(12054, 'reason', 'page', 39, 1), +(12055, 'consider', 'page', 39, 1), +(12056, 'Base', 'page', 39, 1), +(12057, 'it', 'page', 39, 3), +(12058, 'often', 'page', 39, 1), +(12059, 'single', 'page', 39, 1), +(12060, 'entry', 'page', 39, 1), +(12061, 'point', 'page', 39, 1), +(12062, 'system', 'page', 39, 2), +(12063, 'very', 'page', 39, 1), +(12064, 'convenient', 'page', 39, 1), +(12065, 'feature', 'page', 39, 1), +(12066, 'remote', 'page', 39, 1), +(12067, 'clients', 'page', 39, 1), +(12068, 'who', 'page', 39, 2), +(12069, 'need', 'page', 39, 2), +(12070, 'select', 'page', 39, 1), +(12071, 'particular', 'page', 39, 2), +(12072, 'program', 'page', 39, 1), +(12073, 'download', 'page', 39, 1), +(12074, 'their', 'page', 39, 1), +(12075, 'computer', 'page', 39, 1), +(12076, 'or', 'page', 39, 1), +(12077, 'quickly', 'page', 39, 1), +(12078, 'learn', 'page', 39, 2), +(12079, 'how', 'page', 39, 2), +(12080, 'configure', 'page', 39, 1), +(12081, 'It', 'page', 39, 1), +(12082, 'particularly', 'page', 39, 1), +(12083, 'useful', 'page', 39, 1), +(12084, 'schools', 'page', 39, 1), +(12085, 'where', 'page', 39, 1), +(12086, 'users', 'page', 39, 1), +(12087, 'easily', 'page', 39, 1), +(12088, 'about', 'page', 39, 1), +(12089, 'application', 'page', 39, 1), +(12090, 'then', 'page', 39, 1), +(12091, 'use', 'page', 39, 1), +(12092, 'without', 'page', 39, 1), +(12093, 'having', 'page', 39, 1), +(12094, 'understand', 'page', 39, 1), +(12095, 'works', 'page', 39, 1), +(12096, 'Even', 'page', 39, 4), +(12097, 'Less', 'page', 39, 4), +(12098, 'Useful', 'page', 39, 4), +(12099, 'Lorem', 'page', 39, 2), +(12100, 'ipsum', 'page', 39, 2), +(12101, 'dolor', 'page', 39, 4), +(12102, 'sit', 'page', 39, 7), +(12103, 'amet', 'page', 39, 6), +(12104, 'consectetur', 'page', 39, 4), +(12105, 'adipiscing', 'page', 39, 3), +(12106, 'elit', 'page', 39, 3), +(12107, 'sed', 'page', 39, 5), +(12108, 'do', 'page', 39, 1), +(12109, 'eiusmod', 'page', 39, 1), +(12110, 'tempor', 'page', 39, 1), +(12111, 'incididunt', 'page', 39, 1), +(12112, 'ut', 'page', 39, 4), +(12113, 'labore', 'page', 39, 1), +(12114, 'et', 'page', 39, 2), +(12115, 'dolore', 'page', 39, 1), +(12116, 'magna', 'page', 39, 1), +(12117, 'aliqua', 'page', 39, 1), +(12118, 'Pellentesque', 'page', 39, 1), +(12119, 'porttitor', 'page', 39, 3), +(12120, 'eget', 'page', 39, 3), +(12121, 'morbi', 'page', 39, 5), +(12122, 'Nunc', 'page', 39, 1), +(12123, 'velit', 'page', 39, 1), +(12124, 'dignissim', 'page', 39, 3), +(12125, 'sodales', 'page', 39, 1), +(12126, 'eu', 'page', 39, 5), +(12127, 'sem', 'page', 39, 1), +(12128, 'integer', 'page', 39, 1), +(12129, 'Gravida', 'page', 39, 1), +(12130, 'cum', 'page', 39, 1), +(12131, 'sociis', 'page', 39, 1), +(12132, 'natoque', 'page', 39, 1), +(12133, 'penatibus', 'page', 39, 1), +(12134, 'magnis', 'page', 39, 1), +(12135, 'dis', 'page', 39, 1), +(12136, 'Proin', 'page', 39, 1), +(12137, 'libero', 'page', 39, 2), +(12138, 'enim', 'page', 39, 4), +(12139, 'faucibus', 'page', 39, 3), +(12140, 'turpis', 'page', 39, 1), +(12141, 'In', 'page', 39, 2), +(12142, 'fermentum', 'page', 39, 5), +(12143, 'posuere', 'page', 39, 2), +(12144, 'urna', 'page', 39, 3), +(12145, 'nec', 'page', 39, 1), +(12146, 'tincidunt', 'page', 39, 2), +(12147, 'praesent', 'page', 39, 1), +(12148, 'semper', 'page', 39, 1), +(12149, 'Varius', 'page', 39, 1), +(12150, 'duis', 'page', 39, 2), +(12151, 'lorem', 'page', 39, 2), +(12152, 'Placerat', 'page', 39, 1), +(12153, 'orci', 'page', 39, 4), +(12154, 'nulla', 'page', 39, 4), +(12155, 'pellentesque', 'page', 39, 2), +(12156, 'venenatis', 'page', 39, 1), +(12157, 'Integer', 'page', 39, 2), +(12158, 'feugiat', 'page', 39, 2), +(12159, 'scelerisque', 'page', 39, 3), +(12160, 'varius', 'page', 39, 4), +(12161, 'nunc', 'page', 39, 2), +(12162, 'Diam', 'page', 39, 1), +(12163, 'quam', 'page', 39, 5), +(12164, 'massa', 'page', 39, 2), +(12165, 'Dolor', 'page', 39, 1), +(12166, 'Tempus', 'page', 39, 1), +(12167, 'iaculis', 'page', 39, 2), +(12168, 'id', 'page', 39, 3), +(12169, 'volutpat', 'page', 39, 2), +(12170, 'Ac', 'page', 39, 1), +(12171, 'auctor', 'page', 39, 2), +(12172, 'augue', 'page', 39, 5), +(12173, 'mauris', 'page', 39, 4), +(12174, 'neque', 'page', 39, 3), +(12175, 'gravida', 'page', 39, 2), +(12176, 'Blandit', 'page', 39, 1), +(12177, 'cras', 'page', 39, 4), +(12178, 'ornare', 'page', 39, 1), +(12179, 'arcu', 'page', 39, 4), +(12180, 'mi', 'page', 39, 2), +(12181, 'bibendum', 'page', 39, 1), +(12182, 'egestas', 'page', 39, 3), +(12183, 'Non', 'page', 39, 1), +(12184, 'lacus', 'page', 39, 1), +(12185, 'suspendisse', 'page', 39, 3), +(12186, 'interdum', 'page', 39, 1), +(12187, 'Vivamus', 'page', 39, 1), +(12188, 'dictum', 'page', 39, 1), +(12189, 'Duis', 'page', 39, 1), +(12190, 'diam', 'page', 39, 4), +(12191, 'Egestas', 'page', 39, 1), +(12192, 'congue', 'page', 39, 1), +(12193, 'quisque', 'page', 39, 2), +(12194, 'cursus', 'page', 39, 1), +(12195, 'Quis', 'page', 39, 1), +(12196, 'viverra', 'page', 39, 2), +(12197, 'nibh', 'page', 39, 2), +(12198, 'pulvinar', 'page', 39, 3), +(12199, 'Hendrerit', 'page', 39, 1), +(12200, 'rutrum', 'page', 39, 2), +(12201, 'non', 'page', 39, 6), +(12202, 'tellus', 'page', 39, 5), +(12203, 'Metus', 'page', 39, 1), +(12204, 'vulputate', 'page', 39, 2), +(12205, 'felis', 'page', 39, 1), +(12206, 'imperdiet', 'page', 39, 2), +(12207, 'proin', 'page', 39, 2), +(12208, 'Nulla', 'page', 39, 1), +(12209, 'facilisi', 'page', 39, 2), +(12210, 'tempus', 'page', 39, 1), +(12211, 'Eget', 'page', 39, 2), +(12212, 'risus', 'page', 39, 1), +(12213, 'quis', 'page', 39, 1), +(12214, 'Quisque', 'page', 39, 1), +(12215, 'ac', 'page', 39, 2), +(12216, 'nullam', 'page', 39, 2), +(12217, 'nisi', 'page', 39, 2), +(12218, 'est', 'page', 39, 3), +(12219, 'Id', 'page', 39, 1), +(12220, 'vel', 'page', 39, 2), +(12221, 'elementum', 'page', 39, 1), +(12222, 'etiam', 'page', 39, 1), +(12223, 'Pretium', 'page', 39, 1), +(12224, 'potenti', 'page', 39, 1), +(12225, 'Aliquam', 'page', 39, 1), +(12226, 'maecenas', 'page', 39, 1), +(12227, 'ultricies', 'page', 39, 1), +(12228, 'Tellus', 'page', 39, 1), +(12229, 'tortor', 'page', 39, 1), +(12230, 'aliquam', 'page', 39, 1), +(12231, 'Facilisi', 'page', 39, 1), +(12232, 'odio', 'page', 39, 1), +(12233, 'Et', 'page', 39, 1), +(12234, 'sollicitudin', 'page', 39, 1), +(12235, 'phasellus', 'page', 39, 1), +(12236, 'Nullam', 'page', 39, 1), +(12237, 'Quam', 'page', 39, 1), +(12238, 'ante', 'page', 39, 1), +(12239, 'Nisi', 'page', 39, 1), +(12240, 'vitae', 'page', 39, 1), +(12241, 'suscipit', 'page', 39, 1), +(12242, 'Felis', 'page', 39, 1), +(12243, 'leo', 'page', 39, 1), +(12244, 'porta', 'page', 39, 1), +(12245, 'Conclusion', 'page', 39, 4), +(12246, 'I', 'page', 39, 1), +(12247, 'hope', 'page', 39, 1), +(12248, 'you', 'page', 39, 1), +(12249, 'enjoyed', 'page', 39, 1), +(12250, 'browsing', 'page', 39, 1), +(12251, 'almost', 'page', 39, 1), +(12252, 'pointless', 'page', 39, 1), +(12253, 'As', 'page', 39, 1), +(12254, 'reward', 'page', 39, 1), +(12255, 'check', 'page', 39, 1), +(12256, 'out', 'page', 39, 1), +(12257, 'sweet', 'page', 39, 1), +(12258, 'video', 'page', 39, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `sessions` +-- + +CREATE TABLE `sessions` ( + `id` varchar(191) NOT NULL, + `user_id` int(11) DEFAULT NULL, + `ip_address` varchar(45) DEFAULT NULL, + `user_agent` text DEFAULT NULL, + `payload` text NOT NULL, + `last_activity` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `settings` +-- + +CREATE TABLE `settings` ( + `setting_key` varchar(191) NOT NULL, + `value` text NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `type` varchar(50) NOT NULL DEFAULT 'string' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `settings` +-- + +INSERT INTO `settings` (`setting_key`, `value`, `created_at`, `updated_at`, `type`) VALUES +('app-color', '#f0a400', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('app-color-dark', '#195785', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('app-color-light', 'rgba(240,164,0,0.15)', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('app-color-light-dark', 'rgba(32,110,167,0.15)', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('app-custom-head', '', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('app-editor', 'wysiwyg', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('app-footer-links', '[]', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'array'), +('app-homepage', '', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('app-homepage-type', 'default', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('app-name', 'Thoth Tech Art Gallery Project', '2023-05-05 22:02:01', '2023-05-07 02:07:38', 'string'), +('app-name-header', 'true', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('book-color', '#077b70', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('book-color-dark', '#389f60', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('bookshelf-color', '#a94747', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('bookshelf-color-dark', '#ff5454', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('chapter-color', '#af4d0d', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('chapter-color-dark', '#ee7a2d', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('link-color', '#206ea7', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('link-color-dark', '#429fe3', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('page-color', '#206ea7', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('page-color-dark', '#429fe3', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('page-draft-color', '#7e50b1', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('page-draft-color-dark', '#a66ce8', '2023-05-05 22:02:01', '2023-05-05 22:02:01', 'string'), +('user:1:bookshelf_view_type', 'list', '2023-05-06 19:51:47', '2023-05-06 19:51:47', 'string'), +('user:1:bookshelves_view_type', 'grid', '2023-05-06 17:21:53', '2023-05-06 19:51:52', 'string'), +('user:1:dark-mode-enabled', 'false', '2023-05-05 22:02:41', '2023-05-05 22:02:44', 'string'), +('user:1:language', 'en', '2023-05-05 21:21:17', '2023-05-05 21:21:17', 'string'), +('user:1:section_expansion#home-details', 'true', '2023-05-06 19:25:53', '2023-05-06 19:25:54', 'string'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `social_accounts` +-- + +CREATE TABLE `social_accounts` ( + `id` int(10) UNSIGNED NOT NULL, + `user_id` int(11) NOT NULL, + `driver` varchar(191) NOT NULL, + `driver_id` varchar(191) NOT NULL, + `avatar` varchar(191) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `tags` +-- + +CREATE TABLE `tags` ( + `id` int(10) UNSIGNED NOT NULL, + `entity_id` int(11) NOT NULL, + `entity_type` varchar(100) NOT NULL, + `name` varchar(191) NOT NULL, + `value` varchar(191) NOT NULL, + `order` int(11) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `tags` +-- + +INSERT INTO `tags` (`id`, `entity_id`, `entity_type`, `name`, `value`, `order`, `created_at`, `updated_at`) VALUES +(4, 4, 'bookshelf', 'internal', '', 0, '2023-05-06 19:49:55', '2023-05-06 19:49:55'), +(5, 8, 'bookshelf', 'external', '', 0, '2023-05-06 19:50:06', '2023-05-06 19:50:06'), +(6, 5, 'bookshelf', 'internal', '', 0, '2023-05-06 19:50:17', '2023-05-06 19:50:17'), +(7, 6, 'bookshelf', 'internal', '', 0, '2023-05-06 19:50:36', '2023-05-06 19:50:36'), +(8, 3, 'bookshelf', 'internal', '', 0, '2023-05-06 19:51:00', '2023-05-06 19:51:00'), +(9, 7, 'bookshelf', 'external', '', 0, '2023-05-06 19:51:14', '2023-05-06 19:51:14'), +(10, 2, 'bookshelf', 'internal', '', 0, '2023-05-06 19:51:29', '2023-05-06 19:51:29'), +(11, 3, 'book', 'test', '', 0, '2023-05-06 20:54:16', '2023-05-06 20:54:16'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `users` +-- + +CREATE TABLE `users` ( + `id` int(10) UNSIGNED NOT NULL, + `name` varchar(191) NOT NULL, + `email` varchar(191) NOT NULL, + `password` varchar(60) NOT NULL, + `remember_token` varchar(100) DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `email_confirmed` tinyint(1) NOT NULL DEFAULT 1, + `image_id` int(11) NOT NULL DEFAULT 0, + `external_auth_id` varchar(191) NOT NULL, + `system_name` varchar(191) DEFAULT NULL, + `slug` varchar(180) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `users` +-- + +INSERT INTO `users` (`id`, `name`, `email`, `password`, `remember_token`, `created_at`, `updated_at`, `email_confirmed`, `image_id`, `external_auth_id`, `system_name`, `slug`) VALUES +(1, 'Admin', 'admin@admin.com', '$2y$10$cI/h6ijwNfk2YJdNei6URudqtAcrWxp4zlGZeWYCVXUUq0XMRxiOK', NULL, '2023-05-05 21:04:47', '2023-05-18 01:05:24', 1, 0, '', NULL, 'admin'), +(2, 'Guest', 'guest@example.com', '', NULL, '2023-05-05 21:04:53', '2023-05-05 21:04:53', 1, 0, '', 'public', 'guest'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `user_invites` +-- + +CREATE TABLE `user_invites` ( + `id` int(10) UNSIGNED NOT NULL, + `user_id` int(11) NOT NULL, + `token` varchar(191) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `views` +-- + +CREATE TABLE `views` ( + `id` int(10) UNSIGNED NOT NULL, + `user_id` int(11) NOT NULL, + `viewable_id` int(11) NOT NULL, + `viewable_type` varchar(191) NOT NULL, + `views` int(11) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `views` +-- + +INSERT INTO `views` (`id`, `user_id`, `viewable_id`, `viewable_type`, `views`, `created_at`, `updated_at`) VALUES +(1, 1, 1, 'book', 3, '2023-05-05 21:09:00', '2023-05-05 21:22:05'), +(2, 1, 1, 'page', 2, '2023-05-05 21:09:29', '2023-05-05 21:21:59'), +(3, 1, 1, 'bookshelf', 5, '2023-05-06 01:16:52', '2023-05-06 19:26:01'), +(4, 1, 2, 'book', 7, '2023-05-06 01:17:12', '2023-05-06 19:25:27'), +(5, 1, 1, 'chapter', 5, '2023-05-06 01:17:47', '2023-05-06 17:21:43'), +(6, 1, 3, 'page', 3, '2023-05-06 01:21:08', '2023-05-06 17:10:28'), +(7, 1, 2, 'page', 1, '2023-05-06 01:22:46', '2023-05-06 01:22:46'), +(8, 1, 2, 'bookshelf', 8, '2023-05-06 19:38:16', '2023-05-17 23:52:55'), +(9, 1, 3, 'bookshelf', 5, '2023-05-06 19:40:58', '2023-05-17 23:36:30'), +(10, 1, 4, 'bookshelf', 9, '2023-05-06 19:43:44', '2023-05-17 23:57:10'), +(11, 1, 5, 'bookshelf', 9, '2023-05-06 19:45:40', '2023-05-17 23:47:23'), +(12, 1, 6, 'bookshelf', 6, '2023-05-06 19:46:19', '2023-05-18 00:01:11'), +(13, 1, 7, 'bookshelf', 12, '2023-05-06 19:47:24', '2023-05-18 00:49:23'), +(14, 1, 8, 'bookshelf', 9, '2023-05-06 19:48:45', '2023-05-18 00:08:31'), +(15, 1, 3, 'book', 4, '2023-05-06 20:54:17', '2023-05-17 13:29:04'), +(16, 1, 4, 'page', 9, '2023-05-06 21:21:25', '2023-05-07 02:08:50'), +(17, 1, 2, 'chapter', 2, '2023-05-06 21:31:09', '2023-05-06 21:31:25'), +(18, 1, 5, 'page', 1, '2023-05-06 21:31:22', '2023-05-06 21:31:22'), +(19, 1, 6, 'page', 1, '2023-05-06 21:31:38', '2023-05-06 21:31:38'), +(20, 1, 4, 'book', 2, '2023-05-17 23:16:18', '2023-05-17 23:36:28'), +(21, 1, 7, 'page', 6, '2023-05-17 23:17:01', '2023-05-17 23:36:22'), +(22, 1, 5, 'book', 2, '2023-05-17 23:37:10', '2023-05-17 23:38:44'), +(23, 1, 8, 'page', 1, '2023-05-17 23:38:37', '2023-05-17 23:38:37'), +(24, 1, 9, 'page', 1, '2023-05-17 23:39:56', '2023-05-17 23:39:56'), +(25, 1, 6, 'book', 4, '2023-05-17 23:41:19', '2023-05-17 23:44:59'), +(26, 1, 10, 'page', 1, '2023-05-17 23:42:24', '2023-05-17 23:42:24'), +(27, 1, 11, 'page', 1, '2023-05-17 23:43:26', '2023-05-17 23:43:26'), +(28, 1, 12, 'page', 1, '2023-05-17 23:44:56', '2023-05-17 23:44:56'), +(29, 1, 7, 'book', 2, '2023-05-17 23:45:47', '2023-05-17 23:47:02'), +(30, 1, 13, 'page', 1, '2023-05-17 23:46:58', '2023-05-17 23:46:58'), +(31, 1, 14, 'page', 1, '2023-05-17 23:47:17', '2023-05-17 23:47:17'), +(32, 1, 8, 'book', 3, '2023-05-17 23:48:25', '2023-05-17 23:50:21'), +(33, 1, 15, 'page', 2, '2023-05-17 23:49:34', '2023-05-17 23:49:37'), +(34, 1, 16, 'page', 1, '2023-05-17 23:50:17', '2023-05-17 23:50:17'), +(35, 1, 9, 'book', 2, '2023-05-17 23:50:51', '2023-05-17 23:51:28'), +(36, 1, 17, 'page', 1, '2023-05-17 23:51:24', '2023-05-17 23:51:24'), +(37, 1, 18, 'page', 1, '2023-05-17 23:52:42', '2023-05-17 23:52:42'), +(38, 1, 10, 'book', 3, '2023-05-17 23:53:45', '2023-05-17 23:55:37'), +(39, 1, 19, 'page', 1, '2023-05-17 23:54:21', '2023-05-17 23:54:21'), +(40, 1, 20, 'page', 1, '2023-05-17 23:55:33', '2023-05-17 23:55:33'), +(41, 1, 11, 'book', 1, '2023-05-17 23:56:14', '2023-05-17 23:56:14'), +(42, 1, 21, 'page', 1, '2023-05-17 23:57:07', '2023-05-17 23:57:07'), +(43, 1, 12, 'book', 3, '2023-05-17 23:58:33', '2023-05-18 00:01:09'), +(44, 1, 22, 'page', 1, '2023-05-17 23:59:29', '2023-05-17 23:59:29'), +(45, 1, 23, 'page', 1, '2023-05-18 00:01:03', '2023-05-18 00:01:03'), +(46, 1, 13, 'book', 2, '2023-05-18 00:01:44', '2023-05-18 00:03:08'), +(47, 1, 24, 'page', 1, '2023-05-18 00:02:59', '2023-05-18 00:02:59'), +(48, 1, 25, 'page', 1, '2023-05-18 00:04:01', '2023-05-18 00:04:01'), +(49, 1, 9, 'bookshelf', 2, '2023-05-18 00:04:55', '2023-05-18 00:08:26'), +(50, 1, 14, 'book', 3, '2023-05-18 00:05:21', '2023-05-18 00:08:23'), +(51, 1, 3, 'chapter', 2, '2023-05-18 00:06:16', '2023-05-18 00:06:55'), +(52, 1, 26, 'page', 1, '2023-05-18 00:06:51', '2023-05-18 00:06:51'), +(53, 1, 27, 'page', 1, '2023-05-18 00:07:28', '2023-05-18 00:07:28'), +(54, 1, 28, 'page', 1, '2023-05-18 00:08:20', '2023-05-18 00:08:20'), +(55, 1, 15, 'book', 3, '2023-05-18 00:09:12', '2023-05-18 00:10:57'), +(56, 1, 4, 'chapter', 2, '2023-05-18 00:09:46', '2023-05-18 00:10:24'), +(57, 1, 29, 'page', 1, '2023-05-18 00:10:19', '2023-05-18 00:10:19'), +(58, 1, 30, 'page', 1, '2023-05-18 00:10:55', '2023-05-18 00:10:55'), +(59, 1, 31, 'page', 1, '2023-05-18 00:11:50', '2023-05-18 00:11:50'), +(60, 1, 16, 'book', 8, '2023-05-18 00:12:33', '2023-05-18 00:49:25'), +(61, 1, 32, 'page', 2, '2023-05-18 00:13:30', '2023-05-18 00:13:33'), +(62, 1, 5, 'chapter', 3, '2023-05-18 00:13:58', '2023-05-18 00:15:23'), +(63, 1, 33, 'page', 5, '2023-05-18 00:14:47', '2023-05-18 00:49:29'), +(64, 1, 34, 'page', 1, '2023-05-18 00:15:20', '2023-05-18 00:15:20'), +(65, 1, 35, 'page', 1, '2023-05-18 00:16:16', '2023-05-18 00:16:16'), +(66, 1, 17, 'book', 3, '2023-05-18 00:17:26', '2023-05-18 00:19:22'), +(67, 1, 36, 'page', 1, '2023-05-18 00:18:28', '2023-05-18 00:18:28'), +(68, 1, 37, 'page', 1, '2023-05-18 00:19:18', '2023-05-18 00:19:18'), +(69, 1, 18, 'book', 2, '2023-05-18 00:20:06', '2023-05-18 00:20:56'), +(70, 1, 38, 'page', 1, '2023-05-18 00:20:52', '2023-05-18 00:20:52'), +(71, 1, 19, 'book', 1, '2023-05-18 00:21:18', '2023-05-18 00:21:18'), +(72, 1, 39, 'page', 1, '2023-05-18 00:22:43', '2023-05-18 00:22:43'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `webhooks` +-- + +CREATE TABLE `webhooks` ( + `id` int(10) UNSIGNED NOT NULL, + `name` varchar(150) NOT NULL, + `active` tinyint(1) NOT NULL, + `endpoint` varchar(500) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + `timeout` int(10) UNSIGNED NOT NULL DEFAULT 3, + `last_error` text NOT NULL DEFAULT '', + `last_called_at` timestamp NULL DEFAULT NULL, + `last_errored_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `webhook_tracked_events` +-- + +CREATE TABLE `webhook_tracked_events` ( + `id` int(10) UNSIGNED NOT NULL, + `webhook_id` int(11) NOT NULL, + `event` varchar(50) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `activities` +-- +ALTER TABLE `activities` + ADD PRIMARY KEY (`id`), + ADD KEY `activities_user_id_index` (`user_id`), + ADD KEY `activities_entity_id_index` (`entity_id`), + ADD KEY `activities_key_index` (`type`), + ADD KEY `activities_created_at_index` (`created_at`), + ADD KEY `activities_ip_index` (`ip`); + +-- +-- Indexes for table `api_tokens` +-- +ALTER TABLE `api_tokens` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `api_tokens_token_id_unique` (`token_id`), + ADD KEY `api_tokens_user_id_index` (`user_id`), + ADD KEY `api_tokens_expires_at_index` (`expires_at`); + +-- +-- Indexes for table `attachments` +-- +ALTER TABLE `attachments` + ADD PRIMARY KEY (`id`), + ADD KEY `attachments_uploaded_to_index` (`uploaded_to`); + +-- +-- Indexes for table `books` +-- +ALTER TABLE `books` + ADD PRIMARY KEY (`id`), + ADD KEY `books_slug_index` (`slug`), + ADD KEY `books_created_by_index` (`created_by`), + ADD KEY `books_updated_by_index` (`updated_by`), + ADD KEY `books_owned_by_index` (`owned_by`); + +-- +-- Indexes for table `bookshelves` +-- +ALTER TABLE `bookshelves` + ADD PRIMARY KEY (`id`), + ADD KEY `bookshelves_slug_index` (`slug`), + ADD KEY `bookshelves_created_by_index` (`created_by`), + ADD KEY `bookshelves_updated_by_index` (`updated_by`), + ADD KEY `bookshelves_owned_by_index` (`owned_by`); + +-- +-- Indexes for table `bookshelves_books` +-- +ALTER TABLE `bookshelves_books` + ADD PRIMARY KEY (`bookshelf_id`,`book_id`), + ADD KEY `bookshelves_books_book_id_foreign` (`book_id`); + +-- +-- Indexes for table `cache` +-- +ALTER TABLE `cache` + ADD UNIQUE KEY `cache_key_unique` (`key`); + +-- +-- Indexes for table `chapters` +-- +ALTER TABLE `chapters` + ADD PRIMARY KEY (`id`), + ADD KEY `chapters_slug_index` (`slug`), + ADD KEY `chapters_book_id_index` (`book_id`), + ADD KEY `chapters_priority_index` (`priority`), + ADD KEY `chapters_created_by_index` (`created_by`), + ADD KEY `chapters_updated_by_index` (`updated_by`), + ADD KEY `chapters_owned_by_index` (`owned_by`); + +-- +-- Indexes for table `comments` +-- +ALTER TABLE `comments` + ADD PRIMARY KEY (`id`), + ADD KEY `comments_entity_id_entity_type_index` (`entity_id`,`entity_type`), + ADD KEY `comments_local_id_index` (`local_id`); + +-- +-- Indexes for table `deletions` +-- +ALTER TABLE `deletions` + ADD PRIMARY KEY (`id`), + ADD KEY `deletions_deleted_by_index` (`deleted_by`), + ADD KEY `deletions_deletable_type_index` (`deletable_type`), + ADD KEY `deletions_deletable_id_index` (`deletable_id`); + +-- +-- Indexes for table `email_confirmations` +-- +ALTER TABLE `email_confirmations` + ADD PRIMARY KEY (`id`), + ADD KEY `email_confirmations_user_id_index` (`user_id`), + ADD KEY `email_confirmations_token_index` (`token`); + +-- +-- Indexes for table `entity_permissions` +-- +ALTER TABLE `entity_permissions` + ADD PRIMARY KEY (`id`), + ADD KEY `new_entity_permissions_entity_id_entity_type_index` (`entity_id`,`entity_type`), + ADD KEY `new_entity_permissions_role_id_index` (`role_id`); + +-- +-- Indexes for table `failed_jobs` +-- +ALTER TABLE `failed_jobs` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`); + +-- +-- Indexes for table `favourites` +-- +ALTER TABLE `favourites` + ADD PRIMARY KEY (`id`), + ADD KEY `favouritable_index` (`favouritable_id`,`favouritable_type`), + ADD KEY `favourites_user_id_index` (`user_id`); + +-- +-- Indexes for table `images` +-- +ALTER TABLE `images` + ADD PRIMARY KEY (`id`), + ADD KEY `images_type_index` (`type`), + ADD KEY `images_uploaded_to_index` (`uploaded_to`); + +-- +-- Indexes for table `jobs` +-- +ALTER TABLE `jobs` + ADD PRIMARY KEY (`id`), + ADD KEY `jobs_queue_index` (`queue`); + +-- +-- Indexes for table `joint_permissions` +-- +ALTER TABLE `joint_permissions` + ADD PRIMARY KEY (`role_id`,`entity_type`,`entity_id`), + ADD KEY `joint_permissions_entity_id_entity_type_index` (`entity_id`,`entity_type`), + ADD KEY `joint_permissions_role_id_index` (`role_id`), + ADD KEY `joint_permissions_status_index` (`status`), + ADD KEY `joint_permissions_owner_id_index` (`owner_id`); + +-- +-- Indexes for table `mfa_values` +-- +ALTER TABLE `mfa_values` + ADD PRIMARY KEY (`id`), + ADD KEY `mfa_values_user_id_index` (`user_id`), + ADD KEY `mfa_values_method_index` (`method`); + +-- +-- Indexes for table `migrations` +-- +ALTER TABLE `migrations` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `pages` +-- +ALTER TABLE `pages` + ADD PRIMARY KEY (`id`), + ADD KEY `pages_slug_index` (`slug`), + ADD KEY `pages_book_id_index` (`book_id`), + ADD KEY `pages_chapter_id_index` (`chapter_id`), + ADD KEY `pages_priority_index` (`priority`), + ADD KEY `pages_created_by_index` (`created_by`), + ADD KEY `pages_updated_by_index` (`updated_by`), + ADD KEY `pages_draft_index` (`draft`), + ADD KEY `pages_template_index` (`template`), + ADD KEY `pages_owned_by_index` (`owned_by`), + ADD KEY `pages_updated_at_index` (`updated_at`); + +-- +-- Indexes for table `page_revisions` +-- +ALTER TABLE `page_revisions` + ADD PRIMARY KEY (`id`), + ADD KEY `page_revisions_page_id_index` (`page_id`), + ADD KEY `page_revisions_slug_index` (`slug`), + ADD KEY `page_revisions_book_slug_index` (`book_slug`), + ADD KEY `page_revisions_type_index` (`type`), + ADD KEY `page_revisions_revision_number_index` (`revision_number`); + +-- +-- Indexes for table `password_resets` +-- +ALTER TABLE `password_resets` + ADD KEY `password_resets_email_index` (`email`), + ADD KEY `password_resets_token_index` (`token`); + +-- +-- Indexes for table `permission_role` +-- +ALTER TABLE `permission_role` + ADD PRIMARY KEY (`permission_id`,`role_id`), + ADD KEY `permission_role_role_id_foreign` (`role_id`); + +-- +-- Indexes for table `references` +-- +ALTER TABLE `references` + ADD PRIMARY KEY (`id`), + ADD KEY `references_from_id_index` (`from_id`), + ADD KEY `references_from_type_index` (`from_type`), + ADD KEY `references_to_id_index` (`to_id`), + ADD KEY `references_to_type_index` (`to_type`); + +-- +-- Indexes for table `roles` +-- +ALTER TABLE `roles` + ADD PRIMARY KEY (`id`), + ADD KEY `roles_system_name_index` (`system_name`), + ADD KEY `roles_external_auth_id_index` (`external_auth_id`); + +-- +-- Indexes for table `role_permissions` +-- +ALTER TABLE `role_permissions` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `permissions_name_unique` (`name`); + +-- +-- Indexes for table `role_user` +-- +ALTER TABLE `role_user` + ADD PRIMARY KEY (`user_id`,`role_id`), + ADD KEY `role_user_role_id_foreign` (`role_id`); + +-- +-- Indexes for table `search_terms` +-- +ALTER TABLE `search_terms` + ADD PRIMARY KEY (`id`), + ADD KEY `search_terms_term_index` (`term`), + ADD KEY `search_terms_entity_type_index` (`entity_type`), + ADD KEY `search_terms_entity_type_entity_id_index` (`entity_type`,`entity_id`), + ADD KEY `search_terms_score_index` (`score`); + +-- +-- Indexes for table `sessions` +-- +ALTER TABLE `sessions` + ADD UNIQUE KEY `sessions_id_unique` (`id`); + +-- +-- Indexes for table `settings` +-- +ALTER TABLE `settings` + ADD PRIMARY KEY (`setting_key`); + +-- +-- Indexes for table `social_accounts` +-- +ALTER TABLE `social_accounts` + ADD PRIMARY KEY (`id`), + ADD KEY `social_accounts_user_id_index` (`user_id`), + ADD KEY `social_accounts_driver_index` (`driver`); + +-- +-- Indexes for table `tags` +-- +ALTER TABLE `tags` + ADD PRIMARY KEY (`id`), + ADD KEY `tags_name_index` (`name`), + ADD KEY `tags_value_index` (`value`), + ADD KEY `tags_order_index` (`order`), + ADD KEY `tags_entity_id_entity_type_index` (`entity_id`,`entity_type`); + +-- +-- Indexes for table `users` +-- +ALTER TABLE `users` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `users_email_unique` (`email`), + ADD UNIQUE KEY `users_slug_unique` (`slug`), + ADD KEY `users_external_auth_id_index` (`external_auth_id`), + ADD KEY `users_system_name_index` (`system_name`); + +-- +-- Indexes for table `user_invites` +-- +ALTER TABLE `user_invites` + ADD PRIMARY KEY (`id`), + ADD KEY `user_invites_user_id_index` (`user_id`), + ADD KEY `user_invites_token_index` (`token`); + +-- +-- Indexes for table `views` +-- +ALTER TABLE `views` + ADD PRIMARY KEY (`id`), + ADD KEY `views_user_id_index` (`user_id`), + ADD KEY `views_viewable_id_index` (`viewable_id`); + +-- +-- Indexes for table `webhooks` +-- +ALTER TABLE `webhooks` + ADD PRIMARY KEY (`id`), + ADD KEY `webhooks_name_index` (`name`), + ADD KEY `webhooks_active_index` (`active`); + +-- +-- Indexes for table `webhook_tracked_events` +-- +ALTER TABLE `webhook_tracked_events` + ADD PRIMARY KEY (`id`), + ADD KEY `webhook_tracked_events_event_index` (`event`), + ADD KEY `webhook_tracked_events_webhook_id_index` (`webhook_id`); + +-- +-- AUTO_INCREMENT for dumped tables +-- + +-- +-- AUTO_INCREMENT for table `activities` +-- +ALTER TABLE `activities` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=123; + +-- +-- AUTO_INCREMENT for table `api_tokens` +-- +ALTER TABLE `api_tokens` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `attachments` +-- +ALTER TABLE `attachments` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `books` +-- +ALTER TABLE `books` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=20; + +-- +-- AUTO_INCREMENT for table `bookshelves` +-- +ALTER TABLE `bookshelves` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10; + +-- +-- AUTO_INCREMENT for table `chapters` +-- +ALTER TABLE `chapters` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; + +-- +-- AUTO_INCREMENT for table `comments` +-- +ALTER TABLE `comments` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `deletions` +-- +ALTER TABLE `deletions` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; + +-- +-- AUTO_INCREMENT for table `email_confirmations` +-- +ALTER TABLE `email_confirmations` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `entity_permissions` +-- +ALTER TABLE `entity_permissions` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `failed_jobs` +-- +ALTER TABLE `failed_jobs` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `favourites` +-- +ALTER TABLE `favourites` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `images` +-- +ALTER TABLE `images` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5; + +-- +-- AUTO_INCREMENT for table `jobs` +-- +ALTER TABLE `jobs` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `mfa_values` +-- +ALTER TABLE `mfa_values` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `migrations` +-- +ALTER TABLE `migrations` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=75; + +-- +-- AUTO_INCREMENT for table `pages` +-- +ALTER TABLE `pages` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=40; + +-- +-- AUTO_INCREMENT for table `page_revisions` +-- +ALTER TABLE `page_revisions` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=50; + +-- +-- AUTO_INCREMENT for table `references` +-- +ALTER TABLE `references` + MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `roles` +-- +ALTER TABLE `roles` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5; + +-- +-- AUTO_INCREMENT for table `role_permissions` +-- +ALTER TABLE `role_permissions` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=78; + +-- +-- AUTO_INCREMENT for table `search_terms` +-- +ALTER TABLE `search_terms` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12259; + +-- +-- AUTO_INCREMENT for table `social_accounts` +-- +ALTER TABLE `social_accounts` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `tags` +-- +ALTER TABLE `tags` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12; + +-- +-- AUTO_INCREMENT for table `users` +-- +ALTER TABLE `users` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; + +-- +-- AUTO_INCREMENT for table `user_invites` +-- +ALTER TABLE `user_invites` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `views` +-- +ALTER TABLE `views` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=73; + +-- +-- AUTO_INCREMENT for table `webhooks` +-- +ALTER TABLE `webhooks` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `webhook_tracked_events` +-- +ALTER TABLE `webhook_tracked_events` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- Constraints for dumped tables +-- + +-- +-- Constraints for table `bookshelves_books` +-- +ALTER TABLE `bookshelves_books` + ADD CONSTRAINT `bookshelves_books_book_id_foreign` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `bookshelves_books_bookshelf_id_foreign` FOREIGN KEY (`bookshelf_id`) REFERENCES `bookshelves` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Constraints for table `permission_role` +-- +ALTER TABLE `permission_role` + ADD CONSTRAINT `permission_role_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `role_permissions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `permission_role_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Constraints for table `role_user` +-- +ALTER TABLE `role_user` + ADD CONSTRAINT `role_user_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `role_user_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/src/content/docs/products/art-gallery/Documentation/Guidance/2023T2-handover.md b/src/content/docs/products/art-gallery/Documentation/Guidance/2023T2-handover.md new file mode 100644 index 00000000..d159f337 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Guidance/2023T2-handover.md @@ -0,0 +1,38 @@ +--- +title: 2023 T2 Handover - Art Gallery Project +--- + +Author: Chloe Hulme (Product Lead) + +## What we have accomplished + +- Preparation for deployment (including selecting GCP and GitHub Actions for CI/CD and deployment, + preparaing cybersecutiy policies for deployment, documenting all deployment knowledge - please see + deployment documentation) +- Migrating the API to .NET 8 (including migrating containers) +- Implementing asynchrony across the Repository Pattern of the API +- Creating collection with automated testing for API in Postman (see: README in documentation repo - + there may be issues with numbers of accounts in the workspace, speak to staff to resolve) +- Research on IIIF (see documentation repo) +- Improving lighthouse scores after reviewing Lighthouse report +- Preliminary designs made in Figma to redo front end + +## What we need to do next (in order of priority) + +- Update contributing document to require screenshot of working code before merge (otherwise faulty + code will break the application) +- Build additional functional components into the frontend (uploading artworks, artist profiles, + differentiating between account privileges - Admin, User, Artist etc.) +- Finishing redesigns for website (with UCD in mind) +- Create VS Code Dev containers to streamline development (current containers need to be rebuilt + with every change made to code) +- Integrating Postman tests into CI pipeline on GitHub Actions +- Build out full CI pipeline (with robust testing) to protect integrity of the code in repository +- Integrate CD pipeline in GitHub Actions +- Go through code and remove all secret information (connection strings, variables in docker-compose + (db passwords + connection strings) and Dockerfiles, app-settings.json (backend), vue.config.js + (frontend), any secrets in CI workflow) +- Deploy to GCP +- Continue improving Lighthouse scores +- Implement IIIF in API +- Optimise containers (they run really slow) diff --git a/src/content/docs/products/art-gallery/Documentation/Guidance/Postman.README.md b/src/content/docs/products/art-gallery/Documentation/Guidance/Postman.README.md new file mode 100644 index 00000000..e7c0e436 --- /dev/null +++ b/src/content/docs/products/art-gallery/Documentation/Guidance/Postman.README.md @@ -0,0 +1,126 @@ +--- +title: Postman Workspace and Collection Guide +--- + +Author: Chloe Hulme + +## Introduction + +Hello Team, + +I'm excited to introduce you to the Thoth Tech Postman team space I have set up to streamline API +development and testing processes across all products. Here, you can create a workspace for your +product that is designed to enhance collaboration, simplify testing, and ensure consistency across +API interactions. Below, you will find a brief overview on Postman and instructions on how to create +your own collection in your product's workspace. + +## Postman Workspace Overview + +Our Postman team space will be organised by workspaces. There will be one workspace per product, +which you will be able to create once joining the team. Each workspace can contain various +collections, requests, and environments, making it easy to manage and test APIs effectively: + +### Collections + +Collections are groups of API requests related to a specific service, project, or feature. They help +to organise and structure API tests logically. + +### Requests + +Requests are individual API endpoints that we want to test. Each request contains information about +the HTTP method, URL, headers, parameters, and body. + +### Environments + +Environments allow us to define variables that can be used across different requests. This is +particularly useful when we need to test the same API with different configurations (e.g. +development and production). + +### Automating JavaScript Testing + +Postman goes beyond manual testing. We can also automate JS-based tests using the built-in testing +capabilities. In each request, we can include scripts written in JS to perform automated checks on +the response data. This is useful for regression testing, data validation, and more. + +For example, we can use Postman's scripting environment to: + +- Validate response data structure and content. +- Perform calculations on response data. +- Extract values from responses and use them in subsequent requests. +- Implement conditional logic to handle different scenarios. + +The automation scripts can be added to the 'Tests' tab within a request. Postman provides a variety +of example tests that you can model your own testing scripts off of. + +### Pre-Request Scripts + +You can also create pre-request scripts to alter variables prior to executing the currect request. +This can be useful for PUT requests or other requests where it is possible to encouter a 404 status +code in your API. You can alter the URL parameters prior to executing your request, if you wish to +validate the outcome as a 200/204 status code test, as an example. Please see the Art Gallery +collection as a reference here. + +## Creating Your Own Collection + +Follow these steps to create your own collection within the Postman workspace: + +1. **Sign In or Sign Up**: Sign in to your Postman account and accept the invite to the team's page. + If you don't have an account, you can sign up for free. + +2. **Access the Workspace**: Once you are signed in, access the workspace by clicking on the + "Workspace" tab in the left-hand sidebar. Alternatively, you can create your product's workspace + here by selecting 'Create Workspace'. + +3. **Create a Collection**: + + - Click the 'New' button within the workspace. + - Choose 'Collection' as the type. + - Give your collection a descriptive name and an optional description to explain its purpose. + - You can also set your authorisation and collection-wide variables here to simplify and + centralise the storage of these details. Please see the Art Gallery's workspace and collection + as an example. + +4. **Add Requests**: + + - Within your newly created collection, click the 'Add Request' button. + - Provide a name for your request and specify the HTTP method and URL. + - Configure any headers, parameters, and request body as needed. + +5. **Save and Organise**: + + - Be sure to save each request by clicking 'Save', or `ctrl+s`. + - You can organise your collection by creating folders within it. This is helpful for grouping + related requests. Please see the Art Gallery's workspace and collection as an example. + +6. **Manual Testing**: + + - Use the 'Send' button within a request to test it against the designated API endpoint. + - View the response to ensure everything is working as expected. + +7. **Automated Testing**: + + - If you have set up automated testing, simply run the collection to initiate these tests. + - View the responses/test summaries to ensure everything is working as expected. + +8. **Environments** (Optional): + - If your API testing requires different environments (e.g. development or production), you can + set up additional environments and define variables/tests to use in your requests. + +## Collaboration and Best Practices + +These workspaces are designed to be collaborative. The best way to ensure this is effective is to +follow these best practices: + +- Use meaningful names and descriptions for requests and collections. +- Keep your collections updated as the API evolves. +- Utilise environments to streamline testing across different setups. +- Comment within requests if there are specific test scenarios or considerations. +- **Ensure that environment variables used in production remain private, as the invite to join our + team is public on this document in GitHub!!!** + +Invite to team: + +If you have any questions or need assistance, please refer to the Art Gallery's workspace and +collection as an example. Otherwise, feel free to reach out! + +Happy testing! diff --git a/src/content/docs/products/art-gallery/Projects/Lighthouse/LighthouseReviewReport.md b/src/content/docs/products/art-gallery/Projects/Lighthouse/LighthouseReviewReport.md new file mode 100644 index 00000000..b0f36264 --- /dev/null +++ b/src/content/docs/products/art-gallery/Projects/Lighthouse/LighthouseReviewReport.md @@ -0,0 +1,83 @@ +--- +title: Review Research from T1 +--- + +I have reviewed two reports on the Lighthouse scores and identified the issues that needed to be +rectified. One report was a review on the desktop app and the other was a review on the mobile app. +Both had many errors so, I had to analyse both reports and did some research on finding +recommendations and solutions for the issue identified. + +## Desktop App + +For the desktop app, here are the problems/recommendations I have identified from the report: + +- Properly size images (add explicit width & height for images) +- Work on reducing network payloads +- Serve static assets with efficient cache policy +- Optimise the Largest Contentful Paint (make it faster): + - Eliminate resource load delay + - Eliminate element render delay + - Reduce resource load time + - Reduce time to first byte +- Reduce the impact of third-party code (identify slow third-party JavaScript) +- Reduce JavaScript execution time: + - Remove unused code + - Minify and compress code + - Implement code splitting + - Cache code with PRPL pattern +- Minimise main thread work: + - Evaluate the script (debounce input handlers, use web workers) + - Check style layout (reduce complexity of style calculations, avoid large, complex layouts). + - Rendering (manage layer count, simplify paint complexity, and reduce paint areas) + - Parse HTML and CSS (extract critical CSS, minify CSS, defer non-critical CSS) +- Reduce resource counts and transfer sizes (CSS & JavaScript, Images, Fonts, Documents, Media) +- Minify JavaScript +- Improve page loading speed: + - Using Preconnect to required origins + - Preload key requests +- Minimise critical request depth: + - Minimise number of critical resources (eliminate them, defer their download, etc) + - Optimize the number of critical bytes and reduce the download time + - Optimize the order for the remaining resources to be loaded (download all critical assets early + to shorten critical path length) + +## Mobile App + +For the mobile app, here are the problems/recommendations I have identified from the report: + +- Properly size images (add explicit width & height for images) +- Work on reducing network payloads +- Serve static assets with efficient cache policy +- Optimise the Largest Contentful Paint (make it faster): + - Eliminate resource load delay + - Eliminate element render delay + - Reduce resource load time + - Reduce time to first byte +- Improve mobile friendliness (appropriately size tap targets) +- Reduce the impact of third-party code (identify slow third-party JavaScript) +- Reduce JavaScript execution time: + - Remove unused code + - Minify and compress code + - Implement code splitting + - Cache code with PRPL pattern +- Minimise main thread work: + - Evaluate the script (debounce input handlers, use web workers) + - Check style layout (reduce complexity of style calculations, avoid large, complex layouts). + - Rendering (manage layer count, simplify paint complexity, and reduce paint areas) + - Parse HTML and CSS (extract critical CSS, minify CSS, defer non-critical CSS) +- Reduce resource counts and transfer sizes (CSS & JavaScript, Images, Fonts, Documents, Media) +- Minify JavaScript +- Improve page loading speed: + - Using Preconnect to required origins + - Preload key requests +- Minimise critical request depth: + - Minimise number of critical resources (eliminate them, defer their download, etc) + - Optimize the number of critical bytes and reduce the download time + - Optimize the order for the remaining resources to be loaded (download all critical assets early + to shorten critical path length) +- Shorten main-thread tasks +- Check and use discernible name for links +- Add meta description to document + +I have added cards and allocated story points for each of these problems and recommendations into +the Trello board under the ‘Lighthouse Project Implementation’ section. diff --git a/src/content/docs/products/art-gallery/Projects/Lighthouse/ProjectReport.md b/src/content/docs/products/art-gallery/Projects/Lighthouse/ProjectReport.md new file mode 100644 index 00000000..8f7582cb --- /dev/null +++ b/src/content/docs/products/art-gallery/Projects/Lighthouse/ProjectReport.md @@ -0,0 +1,106 @@ +--- +title: Project Report +--- + +# _Rhonda Jorgensen_ + +## Capstone SIT374 - Part A + +## Art Gallery - Version 2 + +## Google Lighthouse + +### Objectives + +1. Analyse website with Google lighthouse to identify areas of improvement +2. Identify other front end testing tools that could be used in addition to Lighthouse +3. Compile Report outlining findings and action points derived from this +4. Timeline for implementing actions +5. Implement Improvements +6. What is Outstanding - Handover Tasks in GitHub/Trello + +Team Member Onboarding for Thoth -- Art Gallery -- Lighthouse Project/Front end enhancement + +Teams for Art Gallery Projects + +Testing - Delivery lead - James Burden + +Lighthouse Project/Front end enhancement - Delivery lead - Rhonda Jorgensen, Adrienne Gelbhauer + +Dockerisation/Deployment - Delivery lead - Chloe Hulme + +Cyber Security review - Delivery lead - Dominic Ryzner + +Documentation/Learning Materials - Kyle David Adams + +### GitHub + +Where you will find all company documentation, website, database, procedures. + + + +The code for this project is now in the git repo: + +backend: + + + +frontend: + + + +### Trello + +Where you will find Trello board containing small and large project tasks that involved with the Art +Gallery - Lighthouse Project / Front end enhancement specifically, team members can modify and +action tasks collaboratively in this area to help ensure the team meets the project objectives.. + + + +### Teams + +Meetings, Logbook (log all the work you do including meetings - see under files tab), connect with +team members for support, feedback, offer assistance, etc + +Objectives for Semester 1 2023 + +### Goals/Objectives + +1\. Analyse website with Google lighthouse to identify areas of improvement First round of reports +complete pending upload to GitHub + +2\. Identify other front end testing tools that could be used in addition to Lighthouse + +2\. Compile Report outlining findings and action points derived from this Commenced Reporting +document for presentation + +3\. Timeline for implementing actions Action - SiteMap being built by Adrienne Gelbhauer Action - +Add Lang-en to site pages Action - Optimise images and set instructions (possibly supply to +documentation team) + +4\. Implement Improvements + +5\. What is Outstanding - Handover Tasks in GitHub/Trello Possibly good to implement this in future +requires further research converting lighthouse report into workflow actions + + +This will achieve the following deliverables: + +Cleaner platform, minimising errors (technical and cosmetic), improving overall look and feel of +website increasing companies brand. + +### DDGIT Website + +Our first task, we will need to locate or document website site map, create a file that we can use +to document our findings for each page. We will need comparisons for how it is displaying in +different web browsers and devices. We can collaborate on this excel file in Teams but less work if +we can add it to GitHub and then our contributions will be tracked as was mentioned in class today. + +### Project Status - 30 March 2023 + +We have created our first round of Lighthouse Reports and need to submit to GitHub We have noted +some enhancements for the front-end and improvements for the back-end using our reports and industry +knowledge. We have touched base with our client to confirm our direction and progress. Our team is +moving forward with work on Analysing the report and identifing how these can be implemented in +Thoth - Art Gallery. These improvements are primarily surrounding naming conventions, optimisation, +image scaling, creation of a site-map. diff --git a/src/content/docs/products/art-gallery/Projects/Lighthouse/SEOResearch.md b/src/content/docs/products/art-gallery/Projects/Lighthouse/SEOResearch.md new file mode 100644 index 00000000..51ae4675 --- /dev/null +++ b/src/content/docs/products/art-gallery/Projects/Lighthouse/SEOResearch.md @@ -0,0 +1,83 @@ +--- +title: Identify other front end testing tools - SEO +--- + +## Adrienne Gelbhauer + +## SEO Considerations, Testing and Analysis Tools + +Search Engine Optimisation (SEO) involves optimising a website to improve its accuracy, visibility +and ranking in search engine results, leading to increased traffic to the site. + +In order to improve SEO there are several steps and considerations in how we implement the websites +code and content, as well as testing and analysis tools we can use during development and ongoingly +to monitor website performance, traffic, and trends. + +Search engines can differ in their methods for crawling and indexing websites for search results, +these can also update and change over time. I’ll focus on current considerations for Google’s search +engine as it dominates market share. + +Art Gallery website is built on the Vue.js framework, it will be important to identify the unique +challenge SEO for JavaScript frameworks present. + +## SEO for JavaScript + +When Google’s crawler searches the web for content it does so in two stages: in its first stage it +indexes content and links that it sees and detects, it does this quickly by not executing JavaScript +as this requires more resources; it separates rendering into its second stage which happens at a +later time. + +This can present delays indexing content for client-side frameworks that are not enhanced for SEO. + +Google Search Central contains documentation on improving SEO as well as specific considerations for +JavaScript. Google Search Central YouTube includes a playlist called JavaScript SEO that has short +videos including one specific to Vue.js web apps. + +## Areas to identify / test + +### Navigation and Internal Links + +Identify if sites navigation structure is compatible with Googles crawler. + +Router is set up with specific paths/ URLs for pages; need to identify if we may need to add html a +and href tags in the router links. + +### Meta Tags + +Vue meta plugin can be used to add meta tags to pages and content including title, description and +keyword tags, effective implementation of tags will enhance how information is indexed and improve +visibility in search engine results. + +### Mobile Optimisation + +Check optimisation for mobile devices, Google prioritises mobile-friendly websites in search engine +results. + +Websites optimised for mobile use less resources, Google prioritises indexing these. + +## Testing and Analysis Tools + +To test locally we could consider using a tunnelling solution such as ngrok. + +### Google Mobile-Friendly Test + +Mobile-Friendly Test will allow us to test how mobile-friendly our website is. It analyses +responsiveness and provides recommendations for improvement. Mobile-friendly websites are +prioritised in search engine rankings. + +### Google Search Console + +Google Search Console can monitor site performance and provide insights on traffic and any technical +issues impacting visibility in search results. In testing this can be used to identify areas of +improvement and ways to optimise our site. + +### Google Analytics + +Google Analytics may be more useful once the site is live. It provides insights into traffic to the +website, page popularity and how users interact with the site, we can use this data to improve and +target SEO. + +### Google Lighthouse + +Lighthouse testing looks to improve site performance, relevant to SEO as speed and performance +influence ranking in search results. diff --git a/src/content/docs/products/art-gallery/Projects/Lighthouse/SpikeUpskillingReport.md b/src/content/docs/products/art-gallery/Projects/Lighthouse/SpikeUpskillingReport.md new file mode 100644 index 00000000..d9550c64 --- /dev/null +++ b/src/content/docs/products/art-gallery/Projects/Lighthouse/SpikeUpskillingReport.md @@ -0,0 +1,61 @@ +--- +title: Report on Upskilling +--- + +## JavaScript basics with HTML and CSS + +I have spent some time upskilling to contribute to this project. So far, I have learnt the basics of +using JavaScript with HTML and CSS. I have completed a 7-hour course online and followed through +each chapter of the basics and I understand the basic concepts of working with these languages +together for web development. + +The online courses focused mainly on the fundamentals of JavaScript, HTML and CSS. I have learnt a +few important information from this course: + +- JavaScript basics +- Modifying text styles, text boxes and images using CSS +- Chrome DevTools – tool for debugging and inspecting code +- CSS Box Model – designing and positioning elements on a website. Structure of HTML + +### Courses for this upskilling + +- HTML to CSS Full Course (Beginner) +- JavaScript, HTML & CSS Basics + +## CSS and Javascript, vue.js upskilling + +I have learnt how to modify existing CSS code to remove unnecessary code without changing the +appearance of the website. I have also learnt how vue.js works and how to make changes to existing +code. This is to help with tasks related to improving network payloads, . Here is a list of what I +have learnt during this upskilling: + +- remove unused CSS code +- remove unused JavaScript code +- including webpacks to help with CSS & JS codes +- purpose of vue.js, and how it functions + +### Topics covered + +- Removing unused CSS, JavaScript and HTML code +- Learn webpacks to help minify CSS, JavaScript and HTML +- Vue.js for beginners + +## Lazy loading, TreeShaking and Ant Design upskilling + +I have learnt how to implement lazy routing and TreeShaking into the existing code to help with some +performance issues. I have also learnt about Ant Design, it's purpose and how it works. This +upskilling helps with tasks related to PRPL and modifying/reducing impact of thirs party code. I +have learnt the following: + +- What is lazy routing +- How to properly implement lazy loading +- What is TreeShaking and what does it to +- How to implement TreeShaking +- What is Ant Design and why is it used + +### Topics covered for this upskilling + +- Vue router tutorial +- Lazy routing and code splitting +- What is TreeShaking and how to implement +- Ant Design courses diff --git a/src/content/docs/products/art-gallery/Projects/Lighthouse/T22023-updated-lighthouse-report.pdf b/src/content/docs/products/art-gallery/Projects/Lighthouse/T22023-updated-lighthouse-report.pdf new file mode 100644 index 00000000..f606ce8b Binary files /dev/null and b/src/content/docs/products/art-gallery/Projects/Lighthouse/T22023-updated-lighthouse-report.pdf differ diff --git a/src/content/docs/products/art-gallery/Projects/Lighthouse/art-gallery-lighhouse-desktop-report-V1032023.pdf b/src/content/docs/products/art-gallery/Projects/Lighthouse/art-gallery-lighhouse-desktop-report-V1032023.pdf new file mode 100644 index 00000000..f15f33c8 Binary files /dev/null and b/src/content/docs/products/art-gallery/Projects/Lighthouse/art-gallery-lighhouse-desktop-report-V1032023.pdf differ diff --git a/src/content/docs/products/art-gallery/Projects/Lighthouse/art-gallery-lighhouse-mobile-report-V1032023.pdf b/src/content/docs/products/art-gallery/Projects/Lighthouse/art-gallery-lighhouse-mobile-report-V1032023.pdf new file mode 100644 index 00000000..ac842d28 Binary files /dev/null and b/src/content/docs/products/art-gallery/Projects/Lighthouse/art-gallery-lighhouse-mobile-report-V1032023.pdf differ diff --git a/src/content/docs/products/art-gallery/Projects/Testing Project/Art gallery back-end testing Xunit.md b/src/content/docs/products/art-gallery/Projects/Testing Project/Art gallery back-end testing Xunit.md new file mode 100644 index 00000000..2df6e4b2 --- /dev/null +++ b/src/content/docs/products/art-gallery/Projects/Testing Project/Art gallery back-end testing Xunit.md @@ -0,0 +1,60 @@ +--- +title: Technical notes for the backend testing +--- + +#### Information and Dependencies + +Programming Language and Framework: programming language and framework used in the backend project +or by me as well is C# language and Microsoft .Net framework. APIs and External Services: external +services or APIs integrated into the project. These include image hosting services, or any other +third-party services used by the backend. Authentication and Authorisation: Authentication and +authorisation mechanisms implemented in the project. This involve technologies like OAuth, JSON Web +Tokens (JWT), or session-based authentication. Dependencies: external libraries, frameworks, or +packages used in the project such as : Frameworks :Microsoft. AspNetCore. App 6.0.15 & Microsoft. +NETCore. App 6.0.15 Packages : NuGet Packages such as – + +- BCrypt. Net-Next +- DateOnlyTimeOnly. AspNet +- DateOnlyTimeOnly. AspNet. Swashbuckle +- FastMember +- Microsoft. AspNetCore. Authentication. JwtBearer +- Microsoft. AspNetCore. Mvc. Testing +- System. IdentityModel. Tokens. Jwt +- Xunit +- xunit.abstractions +- xunit.analyzers +- xunit.assert +- xunit.assert.source +- xunit.core +- xunit.extensibility.execution +- xunit.runner.msbuild +- xunit.runner.visualstudio And many other packages used in this project for backend testing. All + these packages and frameworks can be download in Microsoft visual studio from solution explorer + --> dependencies and right click on it you will see option called as manage NuGet packages. Search + these packages and all other required for backend testing and install them. + +#### How to run the tests + +To document the codebase and provide instructions for building, testing, and deploying the project, +follow these steps: README: Read project's README file which provides comprehensive instructions on +how to set up the development environment, install dependencies, and run the application locally. +Code Documentation: If the project contains inline code comments or a separate documentation folder, +encourage the new team members to review and update the documentation as needed. Build Instructions: + +- First download GitHub desktop and install it. +- Download Microsoft visual studio and install it. +- Open GitHub desktop and clone this repository into local system : + +- Open Microsoft visual studio and then load the repository and open solution explorer. +- Add dependencies from solution explorer and you will see manage NuGet packages then download all + the required packages from there for backend xunit-testing. +- When done with successfully tested code open GitHub desktop and commit the code file from there to + online GitHub repositories. +- Before committing to online repositories first create fork with the main online repository. +- And you will see create a new pull request from there create new pull request of the committed + file and done !! Testing Instructions: I used Xunit testing suite and Microsoft studio’s framework + and libraries. + +#### Additional Notes + +Around 20% of the tests currently fail. diff --git a/src/content/docs/products/art-gallery/Projects/Testing Project/Art gallery front-end E2E teststing Cypress.md b/src/content/docs/products/art-gallery/Projects/Testing Project/Art gallery front-end E2E teststing Cypress.md new file mode 100644 index 00000000..0b951575 --- /dev/null +++ b/src/content/docs/products/art-gallery/Projects/Testing Project/Art gallery front-end E2E teststing Cypress.md @@ -0,0 +1,70 @@ +--- +title: Running the Art Gallery site – Window +--- + +## Cypress has been added to the project develpoment and requires no addtional dependancies. + +[Cypress](https://www.cypress.io/) + +- npm install cypress -D + +## Running the tests + +Follow the instructions in the Art Gallery setup guide or refer to new docker setup to run the +project. + +NB You must have the project running in order to run the tests. + +In the terminal run + +- npx cypress open + +This will open the intro winodw to cypress + +Select E2E testing and choose the browser that you wish to use to run the tests. + +Select the test you want to run from the list in the Spec directory. + +## Adding or creating new tests + +All tests are stored in the project in the \art-gallery\cypress\e2e\ folder + +File naming convention + +- pagename.spec.cy.js + +File name is based on the html page name e.g. exhibition.spec.cy.js + +#### List of current tests + +| Test ID | Test | Page | Local URL | Test file | Expected Result | +| ------- | ---------------------------------------------------- | --------------- | ---------------------------------- | -------------------------- | --------------- | +| 1 | diplays the correct subheading - Artist | art and culture | http://localhost:8080/culture | artandculture.spec.cy.js | Success | +| 2 | displays the correct image - Artist | art and culture | http://localhost:8080/culture | artandculture.spec.cy.js | Success | +| 3 | displays the correct details -Artist | art and culture | http://localhost:8080/culture | artandculture.spec.cy.js | Success | +| 4 | diplays the correct subheading - Artwork | art and culture | http://localhost:8080/culture | artandculture.spec.cy.js | Success | +| 5 | displays the correct image - Artwork | art and culture | http://localhost:8080/culture | artandculture.spec.cy.js | Success | +| 6 | displays the correct details -Artwork | art and culture | http://localhost:8080/culture | artandculture.spec.cy.js | Success | +| 7 | diplays the correct subheading - Artist | artistoftheday | http://localhost:8080/artistofday | artistoftheday.spec.cy.js | Success | +| 8 | displays the correct image - Artist | artistoftheday | http://localhost:8080/artistofday | artistoftheday.spec.cy.js | Success | +| 9 | displays the correct details -Artist | artistoftheday | http://localhost:8080/artistofday | artistoftheday.spec.cy.js | Success | +| 10 | diplays the correct subheading - Artwork | artworkoftheday | http://localhost:8080/artworkofday | artworkoftheday.spec.cy.js | Success | +| 11 | displays the correct image - Artwork | artworkoftheday | http://localhost:8080/artworkofday | artworkoftheday.spec.cy.js | Success | +| 12 | displays the correct details -Artwork | artworkoftheday | http://localhost:8080/artworkofday | artworkoftheday.spec.cy.js | Success | +| 13 | loads artworks | artworks | http://localhost:8080/artworks | artworks.spec.cy.js | Success | +| 14 | searches and returns artwork if exists | artworks | http://localhost:8080/artworks | artworks.spec.cy.js | Success | +| 15 | searches and returns no artwork if no artwork exists | artworks | http://localhost:8080/artworks | artworks.spec.cy.js | Success | +| 16 | displays the correct heading | exhibitions | http://localhost:8080/exhibitions | exhibitions.spec.cy.js | Success | +| 17 | displays mock data correctly in table | exhibitions | http://localhost:8080/exhibitions | exhibitions.spec.cy.js | Success | +| 18 | displays login modal | login | http://localhost:8080/ | login.spec.cy.js | Success | +| 19 | allows user to log in | login | http://localhost:8080/ | login.spec.cy.js | Success | +| 20 | displays correct heading | homepage | http://localhost:8080/ | mainpage.spec.cy.js | Success | +| 21 | displays banner image | homepage | http://localhost:8080/ | mainpage.spec.cy.js | Success | +| 22 | should display signup page | register | http://localhost:8080/signup | registeruser.spec.cy.js | Success | +| 23 | should allow user to sign up. | register | http://localhost:8080/signup | registeruser.spec.cy.js | Success | + +#### Additional Notes + +To run the user login test, you will need to run the signup test first. +If you need to run the signup test again you will need to delete the user it creates from thebackend +database. diff --git a/src/content/docs/products/art-gallery/Projects/Testing Project/Art gallery front-end Unit testting setup Vitest.md b/src/content/docs/products/art-gallery/Projects/Testing Project/Art gallery front-end Unit testting setup Vitest.md new file mode 100644 index 00000000..9f9de003 --- /dev/null +++ b/src/content/docs/products/art-gallery/Projects/Testing Project/Art gallery front-end Unit testting setup Vitest.md @@ -0,0 +1,89 @@ +--- +title: Requirements for running the front end unit tests +--- + +#### vitest has been added to the project with dependencies listed below + +We have chosen Vitest to run the testing for the Art-Gallery site due to it's integration and +current testing requirements. + +Since the official setup created by create-vue is based on Vite, we recommend using a unit testing +framework that can leverage the same configuration and transform pipeline directly from Vite. Vitest +is a unit testing framework designed specifically for this purpose, created and maintained by Vue / +Vite team members. It integrates with Vite-based projects with minimal effort, and is blazing fast. + +This has been setup in the package.json file under the devdependencies section + +- Installing Vue test utilities npm install --save-dev @vue/test-utils@next + +From + +- Installing Jsdom npm I -D jsdom development install. + +-Installing Vue CLI npm install -g @vue/clinpm + +-Vue Testing Library npm install --save-dev @testing-library/dom + +#### Running the tests in VScode + +Follow the instructions in the Art Gallery setup guide or refer to new docker setup to run the +project. + +The tests are all contained in the + +- art-gallery\src\tests\unit\ Path + +Run the tests from the terminal in VScode + +- npm run test:unit + +To run the tests in the browser with a graphic interface + +- npm run testui + +#### List of Current Unit Tests + +| Test ID | Test | Component | Test file | Expected Result | +| ------- | ----------------------------------------------------------------- | ----------------------- | --------------------------- | --------------- | +| 1 | renders heading correctly | CardComponent.vue | CardComponent.spec.js | Success | +| 2 | renders the image url | CardComponent.vue | CardComponent.spec.js | Success | +| 3 | renders the subheading | CardComponent.vue | CardComponent.spec.js | Success | +| 4 | renders details correctly | CardComponent.vue | CardComponent.spec.js | Success | +| 5 | renders correclty | ColapsibleMenuAntD.vue | ColapsibleMenuAntD.spec.js | Success | +| 6 | renders menu with sub menus | ColapsibleMenuAntD.vue | ColapsibleMenuAntD.spec.js | Success | +| 7 | renders login and signup menu items | ColapsibleMenuAntD.vue | ColapsibleMenuAntD.spec.js | Success | +| 8 | renders correct sub menu titles | ColapsibleMenuAntD.vue | ColapsibleMenuAntD.spec.js | Success | +| 9 | renders correct number of items | ColapsibleMenuAntD.vue | ColapsibleMenuAntD.spec.js | Success | +| 10 | renders correclty | DropdownMenuAntD.vue | DropdownMenuAntD.sepc.js | Success | +| 11 | renders Artworks sub menu | DropdownMenuAntD.vue | DropdownMenuAntD.sepc.js | Success | +| 12 | renders Art & Culture sub menu | DropdownMenuAntD.vue | DropdownMenuAntD.sepc.js | Success | +| 13 | renders exhibitions sub menu | DropdownMenuAntD.vue | DropdownMenuAntD.sepc.js | Success | +| 14 | renders the swagger sub menu If user role is admin | DropdownMenuAntD.vue | DropdownMenuAntD.sepc.js | Success | +| 15 | does not render the swagger menu if user role is not admin | DropdownMenuAntD.vue | DropdownMenuAntD.sepc.js | Success | +| 16 | renders corretly | FeaturedArtist.vue | FeaturedArtist.spec.js | Success | +| 17 | renders the card componenet | FeaturedArtist.vue | FeaturedArtist.spec.js | Success | +| 18 | passes the correct props to Card Component | FeaturedArtist.vue | FeaturedArtist.spec.js | Success | +| 19 | renders the card componenet | FeatuedArtwork.vue | FeaturedArtwork.spec.js | Success | +| 20 | pass the correct props to the Card Componenent | FeatuedArtwork.vue | FeaturedArtwork.spec.js | Success | +| 21 | renders correctly | FooterComponenet.vue | FooterComponenet.spec.js | Success | +| 22 | renders Socials Component | FooterComponenet.vue | FooterComponenet.spec.js | Success | +| 23 | renders footer navigation links | FooterComponenet.vue | FooterComponenet.spec.js | Success | +| 24 | renders correctly | HeaderComponenet.vue | HeaderComponenet.spec.js | Success | +| 25 | renders the logo | HeaderComponenet.vue | HeaderComponenet.spec.js | Success | +| 26 | renders the Socials Componenet | HeaderComponenet.vue | HeaderComponenet.spec.js | Success | +| 27 | render the logo with correct aria-label | HeaderComponenet.vue | HeaderComponenet.spec.js | Success | +| 28 | renders correclty | LoginComponenet.vue | LoginComponent.spec.js | Success | +| 29 | shows an error if the email field is empty | LoginComponenet.vue | LoginComponent.spec.js | Success | +| 30 | shows an error if the password field is empty | LoginComponenet.vue | LoginComponent.spec.js | Success | +| 31 | calls the handelLogin method on form submission | LoginComponenet.vue | LoginComponent.spec.js | Success | +| 32 | displays the correct details | NavigationComponent.vue | NavigationComponent.spec.js | Success | +| 33 | displays the correct detail description | NavigationComponent.vue | NavigationComponent.spec.js | Success | +| 34 | renders correctly | SignupComponent.vue | SignupComponent.spec.js | Success | +| 35 | calls the handelSubmit method on form submission | SignupComponent.vue | SignupComponent.spec.js | Success | +| 36 | calls register action when handleSubmit method is called | SignupComponent.vue | SignupComponent.spec.js | Success | +| 37 | navigates back to the home page when the cancel button is clicked | SignupComponent.vue | SignupComponent.spec.js | Success | +| 39 | check update data event on addExhibition call | TableArtDesign.vue | TableArtDesign.spec.js | Success | + +#### Creating additonal test files + +Test naming convention "componentname.spec.js" diff --git a/src/content/docs/products/art-gallery/Projects/Testing Project/Art gallery site setup guide.md b/src/content/docs/products/art-gallery/Projects/Testing Project/Art gallery site setup guide.md new file mode 100644 index 00000000..5a7484e5 --- /dev/null +++ b/src/content/docs/products/art-gallery/Projects/Testing Project/Art gallery site setup guide.md @@ -0,0 +1,65 @@ +--- +title: Running the Art Gallery site – Windows +--- + +## Programs required: + +**Nodejs** + +[https://nodejs.org/dist/v18.15.0/node-v18.15.0-x64.msi](https://nodejs.org/dist/v18.15.0/node-v18.15.0-x64.msi) + +**Microsoft Visual Studio – Community Edition** + +[https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&channel=Release&version=VS2022&source=VSLandingPage&cid=2030&passive=false](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&channel=Release&version=VS2022&source=VSLandingPage&cid=2030&passive=false) + +**Postgres** + +[https://www.postgresql.org/download/windows/](https://www.postgresql.org/download/windows/) + +_Install notes:_ + +On install of Postgres set the postgres user password to PostgresSQL – to match the backend +credentials + +**Github:** [Thoth Tech (github.com)](https://github.com/thoth-tech) + +Set up your own fork of the Gallery project, both art-gallery-frontend and art-gallery-backend. + +## VS Studio Backend setup + +From VS Studio – File -\> clone repository do this for both front and backend. + +Open the art-gallery-backend project take note of the path to the art-gallery-database folder. + +from the back-end-gallery repo under the art-gallery-database folder copy the +art-gallery-sampledata.sql file into the C:\Program Files\PostgresSQL\15\bin folder + +## Database Setup + +Open PSQL prompt – and run the following + +CREATE DATABASE art_gallery_db; + +Open windows command prompt as Administrator + +Navigate to C:\Program Files\PostgresSQL\15\bin and run the following: + +pg_restore -v -Fc -h localhost -U postgres -p 5432 -d art_gallery_db art-gallery-db-sampledata.sql + +This will populate the database with the sample data. + +On VS Studio from the gallery-backend project, run the art-gallery-backend.sln file + +Run the debugger and this will open the backend site. + +## VS Studio Frontend + +In VS studio open a terminal window and navigate to the art-galley-frontend\art-gallery folder + +run the following to load the frontend of the website. + +Npm run serve + +Open a browser and go to [http://localhost:8080/](http://localhost:8080/) + +The site should now be all running. diff --git a/src/content/docs/products/art-gallery/Projects/Testing Project/Handover notes T1 2023.md b/src/content/docs/products/art-gallery/Projects/Testing Project/Handover notes T1 2023.md new file mode 100644 index 00000000..5cf254d9 --- /dev/null +++ b/src/content/docs/products/art-gallery/Projects/Testing Project/Handover notes T1 2023.md @@ -0,0 +1,24 @@ +--- +title: Handover notes Art Gallery testing team +--- + +**Front End Testing** + +Front end testing guide is listed in the documentation for both the E2E and unit tests. There are +some issues with the login unit test not working correctly that need to be fixed. + +The E2E testing is complete, but if you were looking for additional things to test you could focus +on testing some of the features after the user is logged in. e.g. adding an exhibition to the table. + +Back End Testing + +Back end testing is not working correctly for 20% of the tests it is running. I would be good to +repair this and document further as required. + +#### Additional notes + +There has been a discussion around changing the technology stack for the Art-Gallery Project over to +Angular with a Maria Database for performance. If this was to occur the tests would need to be +reviewed and ported over to the new system. + +A list of all the current tests are in the documentation. diff --git a/src/content/docs/products/company-operations/documentation/Dockerize the Doc Website and Publish to GitHub.md b/src/content/docs/products/company-operations/documentation/Dockerize the Doc Website and Publish to GitHub.md new file mode 100644 index 00000000..f3b22a2c --- /dev/null +++ b/src/content/docs/products/company-operations/documentation/Dockerize the Doc Website and Publish to GitHub.md @@ -0,0 +1,81 @@ +--- +title: Dockerize the Documentation Website and Publish to GitHub +--- + +To dockerize the Thoth Tech Documentation Website and publish it to GitHub packages, the following +steps were followed. + +## Create Docker Compose and Dockerfile + +1. Fork the [ThothTech Documentation](https://github.com/thoth-tech/ThothTech-Documentation-Website) + Repo on GitHub. +2. Open the repository on your local machine using Visual Studio Code. +3. Locate **View** on the toolbar and select **Command Palette** (this is usually located on the top + left hand corner of VS Code). +4. When Command Palette is selected, choose **Docker: Add Docker Files to Workspace**. +5. In **Select Application Platform**, choose Node.js. +6. In **Choose a package.json file** select package.json. +7. Type 4321 as the port that the application/website listens on. +8. Select **Yes** for **Include Optional Docker Compose Files**. +9. Press Enter and Dockerfile and Docker Compase would be generated for your environment. + +## Generate a Personal Access Token on GitHub + +1. Navigate to Thoth Techs GitHub page. +2. In the upper-right corner of any page, click your profile photo, then click Settings. +3. In the left sidebar, click Developer settings. +4. In the left sidebar, under Personal access tokens, click Tokens (classic). +5. Select Generate new token, then click Generate new token (classic). +6. In the "Note" field, give your token a descriptive name. +7. To give your token an expiration, select Expiration, then choose a default option or click Custom + to enter a date. +8. Select the scopes you'd like to grant this token. For this implementation write.packages and + delete.packages was assigned. +9. Click Generate token. +10. Copy the new token to your clipboard. + +## Build Docker Image and Push to GitHub Container Registry + +**NB: For this action you would need Docker Desktop to be installed on your desktop**. + +1. Open Docker Desktop on your laptop +2. On your terminal ensure you are in the directory that has your Dockerfile, run the below command + +``` +docker login --username [Your-GitHub-Name] --password [The generated token] ghcr.io +``` + +3. Build the docker image by running the below command. + +``` +docker build . -t ghcr.io/kachi-okorie/documentationwebsite:latest +``` + +4. Push image to GitHub + +``` +docker push ghcr.io/kachi-okorie/documentationwebsite:latest +``` + +You should now see the docker image being pushed to GitHub package. ![Dockerimage](/dockerimage.png) + +## Test Image Pushed to GitHub + +1. Run the below command to obtain the ID of the image running locally on your machine. + +``` +docker image ls +``` + +2. Delete local image to ensure your run image from the remote GitHub repository. In the command + below, **889** is the first 3 digits of my image ID. + +``` +docker image rm 889 --force +``` + +3. Run the below command to run the image remotely. + +``` +docker run ghcr.io/kachi-okorie/documentationwebsite:latest +``` diff --git a/src/content/docs/products/company-operations/projects/Thoth-Tech-Website/Low-level Prototype.md b/src/content/docs/products/company-operations/projects/Thoth-Tech-Website/Low-level Prototype.md new file mode 100644 index 00000000..76688c5b --- /dev/null +++ b/src/content/docs/products/company-operations/projects/Thoth-Tech-Website/Low-level Prototype.md @@ -0,0 +1,20 @@ +--- +title: Low-Level Prototype +--- + +## How to Navigate the Live Figma Design + +The live link for the figma protoype design can be found here - + + +To navigate through the pages of the website, use the navigation bar menus. + +![Navbar](/website-img1.png) + +After clicking on Products nav menu, you will be directed to the OnTrack page, after which you have +to click Products to navigate through the various product pages. + +![Navbar](/website-img2.png) + +**Note: The PDF design and figma file can be found in the Company Operations Repo >> Projects >> +Thoth Tech Website.** diff --git a/src/content/docs/products/company-operations/projects/onboaring-tool/onboarding.md b/src/content/docs/products/company-operations/projects/onboaring-tool/onboarding.md new file mode 100644 index 00000000..b795b70c --- /dev/null +++ b/src/content/docs/products/company-operations/projects/onboaring-tool/onboarding.md @@ -0,0 +1,317 @@ +--- +title: Getting started with the new onboarding system +--- + +The aim of this document is to create a proof of concept for a tool that new members of thoth tech +could use to join the team that is right for their skills and interests. For a start, that means +getting together all of the technologies each team used, which has kindly been provided by Devanshi +Patel. + +## Some ideas + +there are a couple of ways that the team could go about implementing this into the new company +website, but these two are the most practical: + +- A dynamic system, where the user types in all of their skills and we analyze the input from the + users +- A static system, where we present the user with the tech stack and have them tick off options that + apply to them + +both options have pros and cons, and it is important to consider them. + +### Looking at the dynamic system + +the pros of using a dynamic system are: + +- Unlimited choice +- More personal to the user + +However, the cons are pretty aggressive: + +- Security concerns, mainly injection or XSS (not that the site has any info worth pwning but it + might down the line) +- User input must be filtered by regex or similar +- User might input things that we have not considered, resulting in no way to choose + +### Looking at the static system + +Having a static system provides us with some different pros: + +- Options are presented to the user, making it easier to browse +- Provides a solid overview of the complete tech stack for Thoth Tech to the end user +- Does not require any kind of input filtering +- Does not leave the system vulnerable + +But it does have a couple cons as well + +- User is limited to static options +- Could result in a cluttered UI + +### The big decision + +I believe that the best possible option is to develop the static system, as the dynamic's cons far +outweigh its pros. This is the option that I will be developing. + +## Static system development time + +Great! So now I know what kind of page I want to make, What now? + +### Part 1: complicated solutions + +To start, I thought that the easiest way to approach this would be to separate the tech stack and +qualities each team is looking for into 3 categories: + +- General interests +- Hard skills +- Soft skills + +For example, company operations would be recommended to someone who is interested in documentation, +knows a bit about AstroJS, and a good communicator would be recommended to company operations. + +Initially I wanted each of these skill / interests to be weighted, so for example, each company +would value communication, but company operations might value it a bit higher. This would mean that +each product gives communications a score of 1, but company operations values it at a 2. + +### Part 2: making it a bit more simple + +While I love all of the ideas that I came up with in part 1, the solution proved to be a bit too +much. Some of these ideas are excellent in theory, but proved too hard to do in practice. Weighting +the skills is a great example. While it is definitely a valuable addition, ranking every skill and +interest in relation to the products was just too much. There are just too many tools and skills at +Thoth Tech. + +So the easiest solution I found was to strip it back to being a simple binary choice. That means +either a product needs a skill, or they don't. Similarly, having 3 categories proved a bit much as +well. I decided to go down to two: Areas of interest and skills & tools. This lead to the creation +of this UI design (the colours are beautiful I know. IT students should always do design) + +![Onboarding tool design](/onboardingDesign.png) + +Amazing! and pretty too :) + +Super important though! The decision to cut the more complicated aspects of the tool are purely due +to time constraints of trimester 3. If anyone from trimester one or onwards has the time and energy +to add them back in, please do! Making this page better for everyone is an excellent way to +contribute to the team. + +### Part 3: things get real...ly ugly (my code) + +Now I have everything I need to start developing. I know the direction to take the page, I have a +design, let's get down to business. + +The first solution that I created was very primitive. Basically it just had buttons that all used an +onclick function that would add to to the total of each product. The buttons were also toggled using +their CSS colour value. + +#### JavaScript for demo 1 + +```javascript +const dataButtons = document.getElementsByClassName("toggle"); +//declaring variables for each product +let ontrack = 0; +let companyOps = 0; +let splashkit = 0; +let artGallery = 0; +let courseFlow = 0; + +//toggle function. Arguments as follows: id = array of button in ID. Should be in order. +//ot = ontrack, co = company operations, sk = splashkit, ag = art gallery, cf = courseflow. +function toggleButton(id, ot, co, sk, ag, cf) { + var button = document.getElementById(dataButtons[id].id); + + //if statement uses the value of the button color to determine wether to increase or decrease the values + if (button.style.color === "orange") { + //first change color + button.style.color = "black"; + + //then adjust variables + ontrack -= ot; + companyOps -= co; + splashkit -= sk; + artGallery -= ag; + courseFlow -= cf; + } else { + button.style.color = "orange"; + ontrack += ot; + companyOps += co; + splashkit += sk; + artGallery += ag; + courseFlow += cf; + } +} +``` + +#### HTML for demo 1 + +```html +

General areas of interest

+ + + + +``` + +#### Demo + +![onboarding tool prototype demo](/onboardingDemo.png) + +in this example, documentation is valued by company operations, but software development is only +valued by splashkit. This give splashkit a total score of 2, making it the best choice. + +### Part 4: learning from my mistakes + +while this was a very functional basic solution, it comes with some strong issues. The biggest being +code stability and expansion. Developing code in vanilla javascript means that errors had to be +debugged in runtime. Coming from more of an application development background, I didn't like that +at all and it lead to a LOT of troubleshooting and stability issues. In terms of expansion, the code +I wrote here was very clunky. Buttons needed an ID, IDs needed to be in order, and values had to be +declared directly in the function arguments. All of this is not only pretty bad practice, but also +meant that if future products were added, or if a product needed new software and skills, re writing +teh buttons would be an absolute nightmare. + +So I decided on a couple of solutions. For a start, I moved to using TypeScript instead of vanilla +JS. TypeScript has much more clearly defined variables, and is compiled, meaning that I could check +a lot more of my errors prior to runtime. However, because TypeScript compiles back to vanilla JS, +if a future team decides to move back to that or another framework, the switch would be very easy. + +To fix the concerns about extending the code, I had a few ideas. My first thought was that an excel +spreadsheet would be amazing. Have the leadership teams add new skills to it, and then assign them +each values for their products. We could then parse the excel doc, and use that to create each of +the buttons. This was the perfect solution. Everyone knows how to use excel, and it would make it +much easier to collaborate on. But then I realised just how hard it would be to parse excel in +javascript. Every solution I came up with made some really ugly objects or arrays that were way too +hard to use in practice. + +Something else that I had considered was implementing a backend solution. Using something like +firebase or Jquery, a database could be populated with all of the skills and interests. There are +lots of easy ways to query information from them and return a value based on the user's input. The +biggest issue with going with this solution was cost. The hosting platform we are currently using is +free for pretty much everything as long as it stays in the front end, and using something like +firebase would put us into the paid tier which isn't really worth it at the moment. + +Which brings me to my final consideration: Json. Json is super easy to query from Javascript, it +would allow us to create updates with minimal effort, and it can stay completely in the front end of +the website. For the time being, I just stored the Json as an object variable, but later down the +line, it could be accessed using something like fetch(), as long as it is stored at an HTTPS URL, +not a file path. + +#### JavaScript for demo 2 + +```javascript +//declaring variables for each product +var ontrack = 0; +var companyOps = 0; +var splashkit = 0; +var artGallery = 0; +var courseFlow = 0; + +var onboardingData = [ + { + name: "front end development", + ontrack: 1, + companyOperations: 1, + splashkit: 0, + artGallery: 1, + courseflow: 1, + }, + { + name: "back end development", + ontrack: 1, + companyOperations: 0, + splashkit: 0, + artGallery: 1, + courseflow: 1, + }, + { + name: "documentation", + ontrack: 0, + companyOperations: 1, + splashkit: 1, + artGallery: 0, + courseflow: 0, + }, + { + name: "software development", + ontrack: 0, + companyOperations: 0, + splashkit: 1, + artGallery: 0, + courseflow: 0, + }, +]; + +//new and improved function for toggling variables and setting values +function trueToggleButton(currentButton) { + var button = document.getElementById(currentButton); + if (button.style.color === "orange") { + //first change color + button.style.color = "black"; + //then adjust variables using values in onboardingData + ontrack -= onboardingData[currentButton].ontrack; + companyOps -= onboardingData[currentButton].companyOperations; + splashkit -= onboardingData[currentButton].splashkit; + artGallery -= onboardingData[currentButton].artGallery; + courseFlow -= onboardingData[currentButton].courseflow; + } else { + button.style.color = "orange"; + ontrack += onboardingData[currentButton].ontrack; + companyOps += onboardingData[currentButton].companyOperations; + splashkit += onboardingData[currentButton].splashkit; + artGallery += onboardingData[currentButton].artGallery; + courseFlow += onboardingData[currentButton].courseflow; + } +} + +//function for printing buttons based on the length of onboardingData +function printButton() { + for (var i = 0; i < onboardingData.length; i++) { + //create button. Give it the id of the current loop value + var button = document.createElement("button"); + button.setAttribute("id", i); + + //set onclick to run the toggle button function on the + button.onclick = function () { + trueToggleButton(this.id); + }; + var text = document.createTextNode(onboardingData[i].name); + button.appendChild(text); + document.body.appendChild(button); + } +} +``` + +#### HTML for demo 2 + +```html + +``` + +This code gives the same outputs as last time. However now, the buttons are dynamic generated from +the onboardingData variable, and loaded to the body. + +### Part 5: what now? + +So. Now we have a functional, modular solution. What now? + +- adding the remaining tech stack data is a good place to start. Looking further into Devanshi's + list, as well as talking to some of the products that did not run in T3 like art gallery will be + essential. +- categories should be implemented to cut down on UI clutter. Especially as that data gets added in, + sorting it into smaller chunks will be important so that we don't overwhelm the user. +- the UI could use a lot more theming. CSS and nav elements will be needed. +- if everything else is up and running, adding that weighting system back in would be really cool, + but that's pretty far down the line at the time of writing. +- What ever else you think would be a good idea :) + +As this was one of my first proper JS projects, I'm sure lots of you could run laps around me. Add +features, rewrite code, do whatever! This is a great opportuinity for you to show off your skills. +Develop this page to an amazing tool that will be used for trimesters to come. + +The latest version of my prototype can be found +[on my personal github](https://github.com/QuinnCurtis02/Onboarding-tool-prototype) diff --git a/src/content/docs/products/courseflow/Documentation/About Us.md b/src/content/docs/products/courseflow/Documentation/About Us.md new file mode 100644 index 00000000..5fcbef25 --- /dev/null +++ b/src/content/docs/products/courseflow/Documentation/About Us.md @@ -0,0 +1,11 @@ +--- +title: About Courseflow +--- + +![Courseflow logo](/logo.png) + +CourseFlow is a Thoth Tech product that was founded in T1 2023. It aims to assist students and +course directors in course planning and in comprehending the requirements of certain courses. It +does this by giving users a way to generate a personalized course map that meets the requirements of +their course and by providing a tool that allows users to view the requirements of all units (such +as prerequisite units) visually. diff --git a/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-03-30 1500 - weekly review.md b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-03-30 1500 - weekly review.md new file mode 100644 index 00000000..bd9c8c9a --- /dev/null +++ b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-03-30 1500 - weekly review.md @@ -0,0 +1,42 @@ +--- +title: Meeting Minutes +--- + +## Meeting Minutes + +06/03/2022 + +Present: [Mel David Bugay, Kieron Anthony Boyle, Sharni Sujatha, Ted Wang] + +Apologies: [Rita Wu] + +Next meeting: 06/04/2023 + +Minutes by: Mel Bugay + +## Agenda + +- Progress reports on sprint 1 +- Query on organisational requirements of Thoth Tech and documentation requirements +- Query about mentor + +## Announcements + +No significant announcements were made + +## Discussion + +- 1500: Meeting starts +- 1505: Kieron presented the current progress on the Trello board +- 1507: Kieron presented current progress on the Figma mockup +- 1510: Sharni comments on Trello board. Mel responds to suggestion on asking the company director + about gaining access to Deakin's APIs. +- 1520: Mel asks about company's documentation requirements. Sharni says we should talk to the + company leadership about this since they'll know all the documents we will need. +- 1521: Mel asks who the team should talk to about any technical questions on the project. Sharni + offers to answer them, alternatively the team can talk to the company leader for company tech + stack related questions. +- 1522: Ted asks if the product should use Angular/React or Typescript for the frontend framework. + Sharni says the team should research what the pros and cons of each are and write them in a + document. +- 1523: Meeting ends diff --git a/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-04 2010 - sprint 1 retrospective sprint 2 planning.md b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-04 2010 - sprint 1 retrospective sprint 2 planning.md new file mode 100644 index 00000000..4977675b --- /dev/null +++ b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-04 2010 - sprint 1 retrospective sprint 2 planning.md @@ -0,0 +1,43 @@ +--- +title: Sprint1 Meeting Minutes +--- + +## Thoth Tech Company - CourseFlow + +## Meeting Minutes + +06/03/2022 + +Present: [Ted, Kieron, Mel] + +Apologies: [] + +Next meeting: 06/04/2022 + +Minutes by: [Mel Bugay] + +## Agenda + +- Sprint 1 retrospective +- Sprint 2 planning + +## Announcements + +No significant announcements were made + +## Discussion + +- 2010: Meeting starts +- ----: We discussed creating a sign up view/dashboard +- ----: We discussed the direction we should take in future sprints. For the minimum viable product, + we will aim to create a demo website that has hardcoded data and limited functionality. +- ----: Discussed prototype demonstration idea +- 2057: Discussed idea for optimizing the discovery view +- 2100: Break. Discussing off topic stuff +- 2111: Meeting resumes +- 2115: Meeting ends + +## Action items + +- **Everyone -** [action] +- **[Individual Name] -** [action] diff --git a/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-07 1015 - weekly review.md b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-07 1015 - weekly review.md new file mode 100644 index 00000000..24531f46 --- /dev/null +++ b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-07 1015 - weekly review.md @@ -0,0 +1,46 @@ +--- +title: Meeting Minutes +--- + +## Thoth Tech Company - CourseFlow + +## Meeting Minutes + +06/03/2022 + +Present: [Mel, Ted, Kieron, Sharni] + +Apologies: [Rita] + +Next meeting: 07/03/2022 + +Minutes by: [Mel Bugay] + +## Agenda + +- Weekly progress review + +## Announcements + +No significant announcements were made + +## Discussion + +- 1015: Meeting starts +- 1016: Mel presents the progress on gathering unit information from the handbook. See: + . Sharni re-suggests asking Thoth Tech's + director about gaining access to Deakin's unit handbook API to avoid doing redundant work. Mel + agrees, stating some issues faced with the current approach of gathering data from the handbook. +- 1020: Kieron explains the group's discussion on Tuesday (see the minutes at: "2023-04-04 2010 - + sprint 1 retrospective sprint 2 planning" for details) about the plan to hardcode parts of the + website for the minimum viable product so that it acts like a guided demo. This fits in with the + idea of going as "lean" as possible, which was introduced to us during the RapidX workshops. +- 1026: Ted presents the progress in making a prototype first page/signup page. +- 1029: Mel and Sharni discuss the group's plan for the current sprint. Sharni suggests breaking + tasks in the "in progress" section even further. +- 1035: Meeting ends + +## Action items + +- **Everyone -** [action] +- **[Individual Name] -** [action] diff --git a/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-20 1500 - weekly review.md b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-20 1500 - weekly review.md new file mode 100644 index 00000000..095c0609 --- /dev/null +++ b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-20 1500 - weekly review.md @@ -0,0 +1,35 @@ +--- +title: Meeting Minutes +--- + +## Thoth Tech Company - CourseFlow + +## Meeting Minutes + +20/04/2022 + +Present: [Mel, Kieron, Sharni] + +Apologies: [Ted, Rita] + +Next meeting: 27/04/2023 + +Minutes by: [Mel Bugay] + +## Agenda + +- Weekly review + +## Announcements + +No significant announcements were made + +## Discussion + +- 1505: Meeting starts +- 1505: Discussion about progress on the backend system. Sharni re-iterates asking for access to the + Deakin API to avoid doing redundant work. +- ----: Kieron demonstrates progress from the frontend side, including progress in implementing the + timetable view, login form. +- ----: Discussion about future plans for project +- 1530: Meeting ends diff --git a/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-27 1500 - weekly review.md b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-27 1500 - weekly review.md new file mode 100644 index 00000000..36e8b83f --- /dev/null +++ b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-27 1500 - weekly review.md @@ -0,0 +1,32 @@ +--- +title: Meeting Minutes +--- + +## Thoth Tech Company - CourseFlow + +## Meeting Minutes + +06/03/2022 + +Present: [Mel, Ted, Sharni] + +Apologies: [Kieron, Rita] + +Next meeting: 05/04/2023 + +Minutes by: [Mel Bugay] + +## Agenda + +- Weekly review + +**Announcements** No significant announcements were made + +## Discussion + +- 1502: Meeting starts +- 1503: Ted outlines his progress on working on the webpages +- 1506: Mel discusses progress on the backend system. Mainly about the progress in modelling unit + and course constraints in code and plans to model that in a database. Sharni and Mel discuss ideas + on how this can be modeled into a database. +- 1530: Meeting ends diff --git a/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-28 - general meeting.md b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-28 - general meeting.md new file mode 100644 index 00000000..747aca93 --- /dev/null +++ b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-04-28 - general meeting.md @@ -0,0 +1,29 @@ +--- +title: General Meeting Minutes +--- + +## Thoth Tech Company - CourseFlow + +## Meeting Minutes + +06/03/2022 + +Present: [Mel, Kieron, Ted] + +Next meeting: 30/04/2023 + +Minutes by: [Names here] + +## Agenda + +This is an unscheduled meeting, we're just discussing anything about the project. + +## Announcements + +No significant announcements were made + +## Discussion + +- 1725: Meeting starts +- 1726: Discussion on frontend design decisions. +- 1750: Meeting ends diff --git a/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-05-11 1530 - weekly review.md b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-05-11 1530 - weekly review.md new file mode 100644 index 00000000..0c237afb --- /dev/null +++ b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/2023-05-11 1530 - weekly review.md @@ -0,0 +1,33 @@ +--- +title: Meeting Minutes +--- + +## Thoth Tech Company - CourseFlow + +## Meeting Minutes + +06/03/2022 + +Present: [Mel, Sharni, Kieron, Ted] + +Apologies: [Rita] + +Next meeting: 18/05/2023 + +Minutes by: Mel Bugay + +## Agenda + +- Weekly review + +## Announcements + +No significant announcements were made + +## Discussion + +- 1535: Meeting starts +- ----: Kieron presents weekly progress on implementing the website. +- ----: Mel presents weekly progress on implementing the persistence layer code. +- ----: Discussion about objectives and plan for the last week +- 1555: Meeting ends diff --git a/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/meeting-template.md b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/meeting-template.md new file mode 100644 index 00000000..662bfbb5 --- /dev/null +++ b/src/content/docs/products/courseflow/Documentation/Meeting-Minutes/meeting-template.md @@ -0,0 +1,32 @@ +--- +title: Meeting Minutes Template +--- + +## Thoth Tech Company - CourseFlow + +## Meeting Minutes + +06/03/2022 + +Present: [Names here] + +Apologies: [Names here] + +Next meeting: 07/03/2022 + +Minutes by: [Names here] + +## Agenda + +## Announcements + +No significant announcements were made + +## Discussion + +- Discussion about… + +## Action items + +- **Everyone -** [action] +- **[Individual Name] -** [action] diff --git a/src/content/docs/products/courseflow/Documentation/design/software-design-document.mdx b/src/content/docs/products/courseflow/Documentation/design/software-design-document.mdx new file mode 100644 index 00000000..9fd737f5 --- /dev/null +++ b/src/content/docs/products/courseflow/Documentation/design/software-design-document.mdx @@ -0,0 +1,263 @@ +--- +title: CourseFlow Software Design Document +description: Outlines the overall design of the CourseFlow web application. +--- + +- [1 - Introduction](#1---introduction) + - [1.1 - Problem Definition](#11---problem-definition) + - [1.2 - Solution](#12---solution) + - [1.3 - Target Audience](#13---target-audience) + - [1.4 - Intended Use](#14---intended-use) + - [1.5 - Scope](#15---scope) +- [2 - High-Level Overview and Requirements](#2---high-level-overview-and-requirements) + - [2.1 - User Stories](#21---user-stories) + - [2.2 - High-Level Requirements](#22---high-level-requirements) + - [2.3 - Assumptions](#23---assumptions) +- [3 - System Architecture](#3---system-architecture) + - [3.1 - Overall System Diagrammatic Representation](#31---overall-system-diagrammatic-representation) + - [3.2 - Data Flow Diagrams](#32---data-flow-diagrams) + - [3.3 - Entity Relationship Diagram](#33---entity-relationship-diagram) +- [4 - Detailed System Design](#4---detailed-system-design) + - [4.1 - Feature Requirements](#41---feature-requirements) + - [4.2 - API and Data Requirements](#42---api-and-data-requirements) + - [4.3 - Wireframes](#43---wireframes) +- [5 - Development Plan](#5---development-plan) + +## 1 - Introduction + +--- + +CourseFlow is a clear and easy-to-use course planning platform that helps students navigate through +their course requirements and graduate with confidence. + +This product was initially a RapidX project founded in Trimester 1, 2023 by: + +- Mel David Bugay +- Kieron Anthony Boyle +- Ted Wang + +To fully realize this project as a new feature of OnTrack, this document will utilize previously +established foundational work from diagrams, proof of concepts and prototypes to provide these key +coverage points: + +- A clear outline of the problem to be solved. +- A proposed solution. +- A high level overview of requirements in relation to the problem. +- A detailed break-down of key components of the overall system. + +### 1.1 - Problem Definition + +At Deakin University, a large repertoire of courses are available for potential students to enrol in +to help shape their future career goals. Each of these courses will have a set of requirements +ranging from minimum credit points achieved, completion of core units and completion of minor/major +sequences with required units etc. Additionally, the units themselves can also have certain +requirements/restrictions such as pre-requisites, co-requisites and minimum number of units +completed etc. + +These course and unit requirements can prove to be a challenge to keep track off and manage for some +students. As such, there is a need for a tool that can help students plan their course and help them +manage their course and unit requirements. Ultimately, this allows them to have a seamless +experience with their degree where requirements can easily be managed so that they can focus on +their studies and achieve their goals. + +### 1.2 - Solution + +CourseFlow aims to be a solution to the above defined problem where it will provide as easy-to-use +interface for students to plan their degree and be capable of considering course and unit +requirements. + +### 1.3 - Target Audience + +Students who struggle to or simply desire to keep track of and manage their course and unit +requirements. + +### 1.4 - Intended Use + +To be used by students studying at Deakin University for the purposes of course planning and +tracking. + +### 1.5 - Scope + +A working new feature that aims to have: + +- A functioning editable and saveable course map for each year and trimester. +- Requirements for courses and units defined and displayed. +- Requirements not being met indicated to the user. +- Query system for course and unit selection based on interest area. + +## 2 - High-Level Overview and Requirements + +--- + +This section will provide a high-level overview and key requirements of the product. + +### 2.1 - User Stories + +| User Stories | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| As a student, I want to have my course requirements clearly defined and presented to me so that I know what I need to complete my degree and thus, plan accordingly. | +| As a student, I want to have unit requirements to be clearly defined and presented to me so that I know if I can take a unit or not. | +| As a student, I want to be able to plan ahead for my course and map out all of my units so that I can ensure all requirements of my degree are met. | +| As a student, I want to be able to have flexibility in the number units and trimesters I take part in so that I can allow flexibility in my course due to being a part-time student or for general flexibility due to my commitments. | +| As a student, I want to be able to choose a course or unit based on my interest area so that I can study in areas I have interest in and would like to work in. | + +### 2.2 - High-Level Requirements + +This application requires the following: + +- A selection interface for students to select the course they are studying or want to study with a + query system to filter out courses based on interest area. +- Have course requirements clearly presented to the user with completion indication based on the + current course map. +- An interface for students to be able to add/update/remove units, trimesters and years in their + course map. with indications for requirements being met or not. +- A system for selection of units with a query system to filter out units based on interest area. +- Core units for the course needs to be easily accessible to the user. +- Have the course map state saved at all times. + +### 2.3 - Assumptions + +At this stage, the key assumption will be that there will be no or limited access to Deakin +University’s API to get course and unit information. + +Additionally, as an extension to that, it will be assumed that there will be no or limited access to +student information, including their enrolment information and their unit status. + +These assumptions are subject to change as the project progresses and will be reviewed again at a +later date and updated in this document accordingly. + +## 3 - System Architecture + +--- + +The overall system architecture is shown below. + +### 3.1 - Overall System Diagrammatic Representation + +![CourseFlow System Architecture](/courseflow-system-architecture.png) + +### 3.2 - Data Flow Diagrams + +The image shown below depicts the data flow between a student on the client side and the CourseFlow +system. + +![CourseFlow DFD Level 0](/courseflow-dfd-level-0.png) + +### 3.3 - Entity Relationship Diagram + +The image below depicts an entity relationship diagram of the CourseFlow system. Please refer to the +CourseFlow Enhanced ERD and Data Modelling document within the same design folder as this document +for more detailed explanations. + +![CourseFlow ERD](/courseflow-enhanced-erd.png) + +## 4 - Detailed System Design + +--- + +This section will provide in depth detail of the CourseFlow system with respect to the Frontend and +the Backend components. Since this project will be a part of OnTrack, references to existing systems +in OnTrack will be made where applicable. + +### 4.1 - Feature Requirements + +Features of CourseFlow will be described here in more detail. This will also provide context to the +backend API that will need to be defined and what their role will be in supporting these features. + +**Editable Course Map** + +- The initial presentation of the course map will be based on the course selected. +- Course requirements, along with progression to completing said requirements will need to be + clearly presented to the user. + - This will be achieved by comparing the current set units in the course map against the course + requirements. +- Course map needs to be able to support units being dragged and dropped into slots. + - Additionally, each unit that has been set needs to be able to be dragged and dropped into other + slots or into other units which will trigger a swap between the unit positions. +- Need to be able to add/remove year containers, trimester contains and unit slot containers. +- The exact state of the course map in terms of unit placement in a specific year and trimester + container needs to be saved at all times. + - Containers being added don't need to be saved unless a unit has been placed inside it. +- To cater for units being removed from the map (making some units potentially invalid) and to allow + users to set a unit regardless of validity, the unit display on the course map needs to have a + visual indicator to inform the user of invalid units. +- A panel is required to display a unit's requirements and the progression to meeting those + requirements upon clicking on the respective UI element (button etc.). + +**Course Selection** + +- This feature will require further discussions due to the possibility of associating the student's + enrolled course through mechanisms such as Deakin API or importing of data. +- However, if the above is not possible, a feature can be implemented where courses can be searched + for and selected. + +**Unit Selection** + +- There are two key parts to this feature: + - Core units of any kind will be shown to the user in an easy to access manner. This will shown + via a window/panel with core units already present and ready to be drag and dropped. + - Electives will have a separate interface and much like the course, will also need a query system + to filter units based on user criteria such as unit level and associated specialization etc. +- In both of the above mentioned key parts, units will need to have a clear indicator if they will + be valid for selection based on the current course map settings. + - This is not a restriction in placing a unit and just a visual indicator so that users are aware + they do not meet the requirements with their current settings. + +**Requirements Indicators** + +- Course requirements with the current progress needs to be displayed. +- Unit requirements such as pre-requisites etc. needs to be displayed with current progress to + meeting those requirements where applicable (completing 2 SIT coded units for example). +- To accommodate for these requirements, course and unit data will need to be associated with set + requirements and compared to the current course map settings to update the appropriate visuals. + +### 4.2 - API and Data Requirements + +Due to the large amounts of detail present in this section, this content has been detailed in +another document named "Backend Functional Requirements" within the same design folder with this +document. + +### 4.3 - Wireframes + +**CourseFlow Course Map with Courses Tab Selected** + +This is the wireframe of the course map with the course menu selected. + +A few things to note: + +- Course requirements displayed on the left. +- Containers for years, trimesters and unit slots. +- Unit cards with validity indicators. +- Ability to add/delete the the above mentioned containers + +![CourseFlow Course Map with Course Menu](/course-flow-course-map-1.png) + +**CourseFlow Course Map with Unit Tab Selected** + +This is the same wireframe as above but with the unit side menu selected. This will allow users to +select units based on interest area. + +![CourseFlow Course Map with Unit Menu](/course-flow-course-map-2.png) + +**CourseFlow Detailed Unit Overlay** + +Basically an overlay interface that shows more details about the unit and provides more details on +requirement with progress tracking. + +![CourseFlow Detailed Unit](/course-flow-detailed-unit.png) + +## 5 - Development Plan + +This will be the development plan in order of priorities: + +1. Define the endpoints for the CourseFlow backend. +2. Create some tests in Postman to ensure all endpoints are working properly. +3. Gather course data (will focus on adding one course first which will likely be the Bachelor of + Computer Science) and place the required information in a json file - this will be the default + course data for development. +4. Gather some unit data and add to json file - this will be the default data for development. +5. Make more detailed UI/UX designs that expand on the wireframes already done. +6. Implement the designs for the frontend. +7. Connect the frontend with the backend. + +More detailed tasks that need to be completed will be present in the OnTrack Trello board. diff --git a/src/content/docs/products/courseflow/Projects/2FA - Documentation/2FA - Documentation (Vin, Omar, Ted).md b/src/content/docs/products/courseflow/Projects/2FA - Documentation/2FA - Documentation (Vin, Omar, Ted).md new file mode 100644 index 00000000..fa472acc --- /dev/null +++ b/src/content/docs/products/courseflow/Projects/2FA - Documentation/2FA - Documentation (Vin, Omar, Ted).md @@ -0,0 +1,131 @@ +--- +title: CourseFlow Website - Two Factor Authentication (2FA) +--- + +## Introduction + +2FA, also known as 2 factor authentication. It is an extra layer of security used to protect user +accounts, systems, databases, or applications from unauthorised access and potential attacks. With +2FA, users are required to go through two different types of authentication and verification factors +to verify their identity before they are allowed to access onto their accounts. + +The purpose of installing two-factor authentication in our project is to enhance the security of +user accounts and systems with additional protection, rather than a single layer of password. The +traditional method of authentication involves username and password, which makes the system +vulnerable to cyber-attacks, such as phishing, brute-force attack and password guessing. + +Okta Verify as an example of Two-Factor authentication applications, is being used by Monash +University, it first verifies the first factor, which is an element that users should know, that can +be their username and password recorded in the system. Once it has been verified, Okta Verify app +then generate an one-time passcode(OTP) on the user’s mobile device, where it appears three +different numbers on a timely basis, which it refresh itself within a few seconds. The user needs to +input the correct OTP generated by Okta Verify into the application or the system will refresh +another one for protection purpose. + +Another 2FA example would be Duo Mobile that is used by Deakin University, where it first allow +users to input their username/password as first stage of authentication, then users will be prompt +to complete second step using Duo Mobile App, where the user have two options: 1st to press to +authorise access by 1 click button, 2nd to use the OTP generated by the Duo Mobile on timely basis, +it also auto-refresh itself every few seconds, to increase to difficulties of unknown attacks and +enhances both user’s data and system. + +2FA is crucial to Course Flow as Course Flow is being designed to have database storing all the +clients’ sensitive information, ranging from university students to stakeholders’ collaboration, +which may include their personal details, academic transcripts/records, or even financial data. +These valuable data are very attractive to cybercriminals as they are the best source for launching +cyberattacks. By installing 2FA, Course Flow’s database will have less chance of data breach, and +better defence to cyberattacks, by protecting sensitive and valuable information, Course Flow will +be gaining trust and secureness from its clients and stakeholders. + +## Frontend Design + +An important aspect of the 2FA, is the design, specifically areas of usability as well as +pleasantness. This should be through a user-friendly and an informative interface for the users when +they are prompted to set up the Two Factor Authentication on the CourseFlow website. This would be +done through the language JavaScript. + +## User Interface (UI) Components + +Login Page\_ + +The user is redirected to a login page, here the user would log in and have an easily accessible and +concise way of enabling 2FA. A simple yet effective way of doing this would be to add a checkbox. + +After enabling there would be a form of visual cue that shows the 2FA has been set up for the +specified account, this could be through a visual cue. + +Registration Page\_ + +The registration page is important as the user would set up their account initially. Here the user +would be prompted to turn on 2FA right away. + +## User Experience (UX) Considerations + +There are many things to keep in conideration of the user, such as the simplicity of the information +and to reduce technical jargon to a minimum, to make the instruction simpler to understand. + +The idea here is to make the user guidance as clear as possible so that we reduce the amount of user +error. However, user errors are inevitable, therefore we must be able to control them in some +capacity. Providing clear error messages is one way to help minimise the error in the future. + +However after repeated attempts, an account lockout should be instated with clear explanations as to +why such a lockout has occurred. + +Positive feedback should be given after a successful set up of the 2FA, which would be done through +a simple message. + +To provide a visual aid to our description the following potential Figma prototypes were created. In +these prototypes we envision our 2FA to make use of Duo Mobile/single sign-on, the same 2FA used +currently by Deakin students. The purpose of this is to make the experience of our website more +seamline and connected. However, we are currently working on a prototype using google services. + +## Figma Design Prototypes + +![Courseflow DFD](/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.001.png) + +Figma Design: +[Figma File](https://www.figma.com/file/8ysP7PILvnv8Qensruz7X6/Untitled?type=design&node-id=0-1&mode=design&t=gf1Q60nXWClcf97T-0) + +![Courseflow DFD](/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.002.png) +![Courseflow DFD](/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.003.jpeg) + +## Backend Design + +``We will be using typescript in order to complete this task. The backend designs will be consisted +with the use of Google OAuth 2.0, this is to test the log in client using this method. We will be +able to see if we can integrate and implement this into our Course Flow project afterwards. + +``A prototype has been built for this method, we have successfully used Google API and OAuth 2.0 to +sign in and sign out account successfully, the next step would be to create a working page on the +frontend side and connect it with the backend side that will allow user to use their google account +to log in to Courseflow. + +What we have right now is: + +![Courseflow DFD](/Aspose.Words.c1eaed0e-7d01-4b23-bd08-e2a37f23ccf6.004.jpeg) + +``We have coded and made the early prototype work, now we need to use C# to implement this and +connect it with frontend. + +## Advantages of 2FA + +**Enhanced security:** Beyond just a password, 2FA adds another layer of security, in the case of +someone stealing your password, a person would still need access to the device that receives the 2FA +notification. + +**Protection against Phishing:** as many passwords can be easily guessed or stolen through +cyberattacks such as phishing. This occurs when the attacker uses social engineering in order to +coerce the victim into giving up private information. 2FA would mitigate this as the password alone +would be inadequate to gain access to the account without the second factor. + +## Plans of Google Log In Client and Plans of Deakin Log In + +``As google is trusted by many, it makes sense to implement this in. 2FA is already included in +Gmail, so we do not need to worry about implementing that in our code. In a way, this helps us save +time. However, this will only be the testing part as we will then improve on this and add more ways +for user to log in such as Deakin Log in and single sign on. + +## Single Sign On + +``Our goal at the end will be to implement a single sign on method which allows user to have email +verifications sent of a onetime password. diff --git a/src/content/docs/products/courseflow/Projects/Courseflow-Data-Flow-Diagram.md b/src/content/docs/products/courseflow/Projects/Courseflow-Data-Flow-Diagram.md new file mode 100644 index 00000000..c5b45b7e --- /dev/null +++ b/src/content/docs/products/courseflow/Projects/Courseflow-Data-Flow-Diagram.md @@ -0,0 +1,7 @@ +--- +title: Courseflow Data Flow Digaram +--- + +![Courseflow DFD](/CourseFlow-DFD-0.png) + +![Courseflow DFD](/CourseFlow-DFD-1.png) diff --git a/src/content/docs/products/courseflow/Projects/Courseflow-Entity-Relationship.md b/src/content/docs/products/courseflow/Projects/Courseflow-Entity-Relationship.md new file mode 100644 index 00000000..c5430fae --- /dev/null +++ b/src/content/docs/products/courseflow/Projects/Courseflow-Entity-Relationship.md @@ -0,0 +1,5 @@ +--- +title: Courseflow Entity Relationship Digaram +--- + +![Courseflow DFD](/CourseFlow%20ERD.png) diff --git a/src/content/docs/products/courseflow/Projects/Courseflow-Project-Pitch.md b/src/content/docs/products/courseflow/Projects/Courseflow-Project-Pitch.md new file mode 100644 index 00000000..0bbe2b77 --- /dev/null +++ b/src/content/docs/products/courseflow/Projects/Courseflow-Project-Pitch.md @@ -0,0 +1,72 @@ +--- +title: CourseFlow pitch script +--- + +## The Hook + +Are you feeling lost and overwhelmed with the maze-like university course maps? + +Do you find yourself constantly struggling to navigate through the endless lists of requirements and +prerequisite? If so, you are not alone. + +## The Problem + +Each year, several thousand students enrol in Deakin University. Unfortunately, a lot of these +students struggle with understanding the requirements they need to fulfil in order to graduate. What +electives do you do, have you met prerequisites or other course rules? What exactly will you learn +and benefit from in a unit? + +Universities also have problems with putting out course-relevant information that is easily +digestible. Most information in course maps doesn't apply to students that have transferred from +other degrees or have an altered path to the original map. + +CourseFlow is a clear and easy-to-use course planning platform that helps students navigate their +course requirements and graduate with confidence. + +## The Solution + +CourseFlow is a tool designed to ease the frustrations of both students and universities by offering +a user-friendly course-planning experience. With an intuitive UI, students can easily create a +customized course map tailored to their specific needs, allowing them to visually track their +progress and see how units relate to one another. CourseFlow takes into account important factors +such as electives, prerequisites, and study load, while also generating a skills summary based on +the units taken. + +## The Product Demo + +While there are other course planners on the market, our platform distinguishes itself by providing +a unit discovery feature which displays all available units and courses listed in the handbook and +their requirements visually on a map, making it more accessible and convenient for users. CourseFlow +includes a timetable generation feature, which automatically checks your unit selections against +your course rules, ensuring that you're on track to meet your degree requirements. It also has a +data analytics feature which summarizes the skills you have learnt and key information about your +course progress. + +## Market Size + +At Deakin this project has the potential to assist over 66,000 students. In the long term this +project can extend further into all universities across Australia and help even more. + +## Call for Action + +We welcome anyone with any skillset and experience. As this is a new project, we are looking for +anyone willing to upskill. + +### Frontend + +- Related units: SIT313, SIT216 +- We are looking for at least one person who is experienced and can lead the team in frontend + development tasks. +- Looking for anyone else at any skill level that can contribute to building the website on the + client side. + +### Backend + +- Related units: SIT331 +- Database design (SQL) +- RESTful API + +To make CourseFlow succeed, we are looking for developers and designers to join our team. We want +people with experience in building a strong user interface and user experience to make sure that our +product is user friendly. We also want beta testing from students and course directors to determine +what can be improved on and how we go forward in the future. diff --git a/src/content/docs/products/courseflow/Projects/Courseflow-Software-Architecture.md b/src/content/docs/products/courseflow/Projects/Courseflow-Software-Architecture.md new file mode 100644 index 00000000..17ff12f9 --- /dev/null +++ b/src/content/docs/products/courseflow/Projects/Courseflow-Software-Architecture.md @@ -0,0 +1,5 @@ +--- +title: Courseflow Software Architecture Digaram +--- + +![Courseflow DFD](/CourseFlow-SAD.png) diff --git a/src/content/docs/products/courseflow/Projects/User-Stories and Planned-Features.md b/src/content/docs/products/courseflow/Projects/User-Stories and Planned-Features.md new file mode 100644 index 00000000..e05e4465 --- /dev/null +++ b/src/content/docs/products/courseflow/Projects/User-Stories and Planned-Features.md @@ -0,0 +1,89 @@ +--- +title: Courseflow Potential Users and Planned Features +--- + +## Possible users + +- Students + + - Prospective students + + - New students + + - Transfer students (from other universities) + + - Part time studying students + + - Students with failed units + + - Oversea students + + - Online students + +- University teaching staff + + - Course directors + + - Lecturers + +- University admin staff + +- Other universities thinking of using CourseFlow + +## Planned features + +- Spanning Tree Graph to connect similar units to each other. + +- Course map visually represented. Units are connected to each other based on prerequisites, + different ‘shapes’ for units depending on their requirements. EG: Placement, in person required. + +- WAM calculation + +- Timetable generation feature, showing what units you need to complete in each trimester up until + graduation. Takes into consideration prerequisite units, and the trimesters each unit runs in. + +- Course rule checking. When selecting units for the course map, students will be warned if they are + violating a course rule (e.g.: not selecting all core units, incompatible units, missing + prerequisites, not enough electives) + +- Unit suggestion + +- Remaining units/coursepoints to achieve degree. Estimated time to completion based on current + trajectory. Way for students to see changes in their trajectory based on changes in their + coursemap. + +- Intuitive user interfaces. + +## User Stories + +- As a transfer student, I want to be able to use prior completed units from another university + while planning my course map so that I can clearly understand what I need to complete in my new + course + +- As a student, I want to be able to clearly understand and edit my course map so that I can choose + units for my degree without complications. + +- As an oversea student, I want to be able to access my website with less delays and more + consistency. + +- As a (everyone) I want a user-friendly user interface that I can intuitively understand and use so + that I can get into using CourseFlow without needing an in-depth tutorial. + +- As a course-director, I want a platform that I can quickly upload course information to that can + be easily digested by students. + +- As a fresh-high school graduate, I want a platform that suggests units to me based on what I am + studying and my interests. + +- As an online student, I want a platform that helps me plan my courses to avoid necessary units to + present in person or locally. + +- As a part time student, I want to be able to edit my course map so that I can have a lower + workload while also graduating as quickly as possible. + +- As a lecturer, I want passionate students to enrol in my unit as an elective based on suggestions + made to them regarding their interests so that I can teach passionate students. + +- As a student thinking of reattempting or deferring units, I want to understand how my unit + schedule until graduate will change from reattempting or deferring units so that I can graduate + without further complications. diff --git a/src/content/docs/products/courseflow/Projects/ngx-graph/ngx-graph.md b/src/content/docs/products/courseflow/Projects/ngx-graph/ngx-graph.md new file mode 100644 index 00000000..b2f21a10 --- /dev/null +++ b/src/content/docs/products/courseflow/Projects/ngx-graph/ngx-graph.md @@ -0,0 +1,202 @@ +--- +title: NGX-Graph Research +--- + +Author: Mark Enriquez + +## Introduction + +Ngx-graph is an Anuglar library that is primarily used for creating and displaying graphs. + +## Installation + +There will be different installation requirements depending on how you start up the project. + +### From the Beginning + +If you are not planning to clone the research repository, you will have to install ngx-graph as +described in the documentation: + + + +However, please be aware of a few issues that occurred for me when installing ngx-graph version +8.2.2 and Angular version 16.2.0: + +- You will get 4 high severity security issues related to versions of d3.js libraries used as + dependencies for ngx-graph. +- You will get errors in the browser related to BrowserAnimationModule. +- You will get errors on types. +- Attempts to use previous versions of ngx-graph failed, likely due to the version of Angular being + used. + +The steps I took to resolve the issues are detailed below. + +#### Steps to install and resolve issues + +1. In your terminal, run: + + ```shell + npm install @swimlane/ngx-graph --save + ``` + +2. To resolve the 4 severity issues: + + Add the following overrides to package.json right after the devDpendencies. + + For context, I'll include the devDependencies to make the location clear: + + ```json + "devDependencies": { + "@angular-devkit/build-angular": "^16.1.4", + "@angular/cli": "~16.1.4", + "@angular/compiler-cli": "^16.1.0", + "@types/jasmine": "~4.3.0", + "jasmine-core": "~4.6.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.1.3" + }, + "overrides": { + "@swimlane/ngx-graph": { + "d3-scale": "4.0.2", + "d3-selection":"3.0.0" + } + } + ``` + + Make sure to delete the node modules folder and package-lock (didn't work if not done) and then + run npm install. + +3. To resolve the browser errors: + + Go to your app.module.ts file and do the following import and module addition: + + ```json + import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; + + @NgModule({ + declarations: [ + + ], + imports: [ + BrowserAnimationsModule, + ], + bootstrap: [AppComponent] + }) + ``` + +4. To resolve the typing issues: + + Installing the d3 types fixed these issues for me: + + ```shell + npm i @types/d3 + ``` + +### Clone from CourseFlow Research Branch + +All above modifications have already been handled if cloning from the CourseFlow Repo and switching +the branch to research/discovery-page. + +Simply run the below command once the branch has been switched: + +```shell +npm install +``` + +## Features Explored + +Overall, ngx-graph is quite simple to use due to its out of the box component that can be used to +display different types of graphs. + +All we really need to do is format the data correctly into a list of nodes and create the links we +want between the nodes and then, feed them into the component. + +### Force Directed Graph + +We have two choices for the force directed graph which to my understanding, just uses different +underlying libraries: + +- D3 Force Directed. +- Cola Force Directed. + +To get the force directed graph going, we need to provide the layout property with either +"d3ForceDirected" or "colaForceDirected". + +The screenshot below shows a cut down version of the data using the cola based force directed graph: + +![force-directed-graph](/force-directed-graph.png) + +#### Advantages + +- Simple to use. +- Works nicely for small amounts of nodes. +- By default: + - It comes with zooming and panning capabilities. + - Nodes can be moved upon dragging. + - Collisions are enabled by default, which helps with the layout of the nodes. +- These default capabilities require a fair amount of work in d3.js to get the same functionality. + +#### Disadvantages + +- Extremely slow when dealing with large amounts of data. + +### Custom Layouts for Positioning + +To deal with the extreme slowness of the force directed graph, I tried using a custom layout where I +would set the positions with pre-calculated positions. + +The rendering of the nodes worked but I could not figure out a way to get the links/edges to render. + +There was also strange behaviour where the interface implemented run method was getting called 4 +times. Additionally, while logging the graph edges would show the edges, logging the graph object +itself would not show the edges which is a very unexpected behaviour. + +The screenshot below depicts a simple example with some simple data with pre-calculated positions to +show the nodes. + +![ngx-graph ](/custom-layout.png) + +### Modification of Dagre Layout Positions + +This attempt failed due to strange behaviour when trying to access properties. Similar to the edges +issue mentioned above, the nodes object would show the position array but attempts to access the +specific position array property resulted in undefined. This prevented me from going into the nodes +and updating the positions after the internal calculations were done. + +## Comparison to d3.js + +The table below describes some of the advantages and disadvantages of both libraries. + +| Library | Advantages | Disadvantages | +| --------- | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| d3.js | A lot of flexibility. | Very technical. | +| | Feature rich. | Requires a lot of JavaScript/TypeScript to get things working. | +| | Finer control of parameters. | Force directed graphs are slow when a lot of data is used. | +| ngx-graph | Easy to use. | A lot of problems/errors on installation. | +| | Out of the box component that can change type of graph via different parameters. | Strange results (data missing) in console logs for ngx-graph data types. | +| | | Force directed graphs are extremely slow when a lot of data is used and cannot load (far worse than d3.js). | + +## Conclusions + +Here are a few final remarks regarding ngx-graph and the Discovery Page in general: + +- At this point in time, ngx-graph is not viable for the goals of CourseFlow. +- Not enough documentation around this library. +- Examples online are lacking. +- d3.js, if you know how to use it, is much better and flexible than this library. +- Until ngx-graph is updated, I think it will be better to work with d3.js and make components more + flexible (essentially creating our own version of ngx-graph). +- After working on ngx-graph, I realized that doing the force-simulation on the front end is a bad + idea. + - Despite the d3.js version actually loading unlike the ngx-graph with large amounts of data, + slower devices may not be capable of handling the simulation (even with smaller numbers). + - This led to my decision to use pre-calculated positions. + - Due to issues with ngx-graph and setting positions manually, d3.js will be the better choice for + this. + +If future students would like to continue work on this library, please go to the CourseFlow +repository and find the project inside the research/discovery-page branch. diff --git a/src/content/docs/products/courseflow/documentation/design/backend-functional-requirements.mdx b/src/content/docs/products/courseflow/documentation/design/backend-functional-requirements.mdx new file mode 100644 index 00000000..0ba8a25c --- /dev/null +++ b/src/content/docs/products/courseflow/documentation/design/backend-functional-requirements.mdx @@ -0,0 +1,542 @@ +--- +title: Backend Functional Requirements +description: + Details of what will be required of the backend for CourseFlow within the OnTrack system. +--- + +- [Introduction](#introduction) +- [Course Map](#course-map) + - [Routes](#routes) + - [Model](#model) +- [Course Map Unit](#course-map-unit) + - [Routes](#routes-1) + - [Model](#model-1) +- [Course](#course) + - [Routes](#routes-2) + - [Model](#model-2) +- [Unit](#unit) + - [Routes](#routes-3) + - [Model](#model-3) +- [Specialization](#specialization) + - [Routes](#routes-4) + - [Model](#model-4) +- [Teaching Period](#teaching-period) + - [Routes](#routes-5) + - [Model](#model-5) +- [Requirements](#requirements) + - [Routes](#routes-6) + - [Model](#model-6) +- [RequirementsSet](#requirementsset) + - [Routes](#routes-7) + - [Model](#model-7) + +## Introduction + +--- + +This document will provide an overview of the backend requirements of CourseFlow within OnTrack. +There will be some cross-over of information with other documentation such as the +enhanced-erd-and-data-modelling document and the software design document. + +## Course Map + +--- + +### Routes + +Upon entry to the CourseFlow system within OnTrack, the course map associated with the authenticated +user will need to be fetched or created. + +As such, the backend needs to have the following routes to cater for this: + +| Endpoint | Description | Request Body | Response Body | +| ----------------------------- | ------------------------------------------ | ------------ | ------------- | +| GET /coursemap/userId | Get a user's course map via their userId. | None | CourseMap | +| GET /coursemap/courseId | Get all course maps via the course id. | None | CourseMap[] | +| POST /coursemap | Add a new course map for a user. | CourseMap | CourseMap | +| PUT /coursemap/coursemapId | Updates an existing course map via its id. | CourseMap | CourseMap | +| DELETE /coursemap/coursemapId | Deletes an existing course map via its id. | None | None | + +To further elaborate on each route: + +**GET /coursemap/userId** + +We need a route to get a course map associated with a user - we can do this via the user id. + +**GET /coursemap/courseId** + +This specific route is mostly going to be for templates of a course map. Essentially, if we cannot +find a course map for a user, we will need to trigger a response to add a new course map. Once we +have the associated course for the student (obtained via mechanisms described below), we can use the +course id to fetch all course maps with that id that do not have a user id which will be implied to +be templates (with pre-set course map units at the proper positions). + +As mentioned but worth repeating, for this to work properly, this has to only include course map +data without a user id (we do not want to fetch course maps belonging to other students). When a +template is chosen, we will create a duplicate of the associated data to be added as new entries for +both the course map (with the associated user id this time) and the course map units. + +**POST /coursemap** + +We need to have a way to create a new course map for the user (or a template course map). The client +side interface presenting a list of courses or mechanism connecting with a student's enrollment will +be required to associate the course map with a specific course. + +**PUT /coursemap/coursemapId** + +Technically speaking, there shouldn't be a need to update the course map entry itself since we can +make direct updates to the course map unit entries. However, the route will be included in case it +is ever needed. + +**DELETE /coursemap/coursemapId** + +We need a way to delete a course map. This will also require all course map units associated with +this course map to be deleted as well. + +### Model + +The model for the course map will be as follows: + +| Field | Type | Description | +| ----------- | ------- | ----------------------------------------- | +| courseMapId | Integer | Auto generated id. | +| userId | Integer | OnTrack user id. | +| courseId | Integer | Course id associated with this course map | +| dateAdded | Date | Date this entry was added. | +| dateUpdated | Date | Date this entry was updated. | + +The main thing to note regarding this model is the course id which will need to be obtained before +creating a new course map entry. This will be utilized to fetch information about the course such as +requirements etc. For the purposes of this model and the associated POST route, the mechanism in +getting the associated course itself is not important (as this will be handled separately). The +options at present involves: + +- Getting student enrolment information via an API to Deakin University's systems. +- Importing student enrolment information. +- Manually setting the course via a client side user interface (will be an input box resulting in + best matching courses based on search query). +- Associating a course upon creation of the user and have the course map created at this point in + time. + +This aspect of CourseFlow will require further discussions before more details can be documented +here. + +## Course Map Unit + +--- + +### Routes + +This has a strong association with the course map and upon entry into the CourseFlow system, once we +have the course map associated with the user fetched, we can use the course map id to fetch all +course map units that belongs to the specific course map. + +| Endpoint | Description | Request Body | Response Body | +| ------------------------------------- | -------------------------------------------------------------- | ------------- | --------------- | +| GET /coursemapunit/courseMapId | Get a all course map units associated with the course map id. | None | CourseMapUnit[] | +| POST /coursemapunit | Add a new course map unit for a user. | CourseMapUnit | CourseMapUnit | +| PUT /coursemapunit/courseMapUnitId | Updates an existing course map unit via its id. | CourseMapUnit | CourseMapUnit | +| DELETE /coursemapunit/courseMapUnitId | Deletes an existing course map unit via its id. | None | None | +| DELETE /coursemapunit/courseMapId | Deletes all course map units via the associated course map id. | None | None | + +To further elaborate on each route: + +**GET /coursemapunit/courseMapId** + +Here, we use the course map id to fetch all course map units associated with that id. This will +essentially retrieve user/student specific set course map units. + +An alternative to having this handled as a separate route is potentially a join operation when +fetching the course map. In this situation, we combine the course map units together with the course +map data in the request body. + +**POST /coursemapunit** + +This is needed to add new course map units for a specific course map. + +Please note that for this to be correct, we will not only need to associate this with a course map, +but also to specific instance of a unit (a unit version that belongs to a specific year and teaching +period etc.). This is achievable through the client side processes when dragging and dropping (or +selecting) a unit into the respective slot where the unit Id will be available at that point in +time. + +**PUT /coursemapunit/courseMapUnitId** + +This allows for updating a course map unit. The main use case for this is when a user is moving a +unit around within the course map or performing a swap with another unit. Here, we can make direct +calls to this route and update the data with new positional information (slot positions for year +etc.). + +**DELETE /coursemapunit/courseMapUnitId** + +A simple delete route where we can delete a course map unit via its id. There will be an option +available on the client side to delete course map units from the course map. + +**DELETE /coursemapunit/courseMapId** + +This extra delete route will allow for deleting of all course map units based on the course map id. +This will be useful when deleting the course map which will also require a delete of all course map +units. + +It is worth mentioning that there might be functionality with regards to Ruby on Rails that can +delete all course map units once the course map has been deleted. If this is the case, this route +will be redundant and we only need the delete route for the course map. + +### Model + +The model for the course map unit will be as follows: + +| Field | Type | Description | +| ------------------ | ------- | ---------------------------- | +| courseMapUnitId | Integer | Auto generated id. | +| courseMapId | Integer | Associated course map id. | +| unitId | Integer | Associated unit id. | +| yearSlot | Integer | Year slot. | +| teachingPeriodSlot | Integer | Teaching period slot. | +| unitSlot | Integer | Unit slot. | +| createdAt | Date | Date this entry was added. | +| updatedAt | Date | Date this entry was updated. | + +So, the key factors here are: + +- Course map id which will associate a specific course map to the respective course map units. +- Unit id which will associate the course map unit with a unit. This in itself will allow obtaining + of unit information such as name, unit code, handbook url and requirements etc. +- All three slot fields and their respective values will allow for matching to the correct spot on + the client side visuals. For example: + - If we have 2021 as a year slot value, the unit will go to the 2021 container. + - If teaching period slot is 1, the unit will go to the teaching period container inside the + respective year container associated with that value (in the case of Deakin, this will be + associated to the Trimester 1 slot). + - If the unit slot is 4, this will go to the 4th unit slot within the respective teaching period + container. + +## Course + +--- + +### Routes + +The routes involved with this will be relatively straightforward. + +| Endpoint | Description | Request Body | Response Body | +| ----------------------- | --------------------------------------------------- | ------------ | ------------- | +| GET /course | Get all course data. | None | Course[] | +| GET /course/courseId | Get a course by id. | None | Course | +| GET /course/search | Get courses that partially match the search params. | None | Course[] | +| POST /course | Add a new course. | Course | Course | +| PUT /course/courseId | Updates an existing course via its id. | Course | Course | +| DELETE /course/courseId | Deletes an existing course via its id. | None | None | + +The table above covers the function of each route quite well and thus, further explanation for each +will be excluded here. + +### Model + +The Course model will be as follows: + +| Field | Type | Description | +| --------- | ------- | ---------------------------- | +| courseId | Integer | Auto generated id. | +| name | String | Name of course. | +| code | String | Course code. | +| year | Integer | Respective year of course. | +| version | String | Course version number. | +| url | String | Link to the course webpage. | +| createdAt | Date | Date this entry was added. | +| updatedAt | Date | Date this entry was updated. | + +Here, the main thing worth mentioning is the year, version and url. + +In terms of the year and version, this is the way the system keeps track of different versions of +courses. Technically speaking, a course would likely only have different versions on a per year +basis. However, to cater for the possibility that a course of a particular year gets updated, it +would be a good idea to keep a history of this. The course map will keep track of a specific entry +of a Course which will allow students to load up the correct version of the course (which by +extension, will allow loading of the correct course requirements which will also be tied to specific +course versions). + +The url will link to the course page which will provide more information about the course (that +don't need to be present in CourseFlow such as contacts and entry requirements etc.). This can +either be presented on the client side as a simple link or used to embed the course page within an +IFrame element. + +## Unit + +--- + +### Routes + +| Endpoint | Description | Request Body | Response Body | +| ------------------- | ------------------------------------ | ------------ | ------------- | +| GET /unit | Get all units | None | Unit[] | +| GET /unit/unitId | Get a unit by id. | None | Unit | +| GET /unit/search | Get all units by search params | None | Unit[] | +| POST /unit | Add a new unit. | Unit | Unit | +| PUT /unit/uniteId | Updates an existing unit via its id. | Unit | Unit | +| DELETE /unit/unitId | Deletes an existing unit via its id. | None | None | + +With the exception of this route: "GET /unit/specializationId", all other routes can be explained by +the table above. + +**GET /unit/specializationId** + +The aim of this route is to cater for the functionality of returning a list of units based on search +criteria. The search criteria will at this point in time, consist of: + +- specializations +- year +- level +- teaching period + +In terms of year and level, these fields will be present within the Unit model and we can perform a +query to include data within the table that conforms to these criteria. + +Searching for specializations will require additional considerations. The data modelling for this +consists of: + +- Specializations +- UnitSpecializations +- Units + +Firstly, we will have a specializations table (more details on routes and model later) which will +consist of a list of different specializations. The ids for these specializations are used in +conjunction with the unit id to create a unit specialization entry. In other words, within the +UnitSpecializations, we can have a single unit marked by the same unit id, appear multiple times, +each with different specialization ids. This will essentially create the list of specializations +associated with a specific version of a unit. + +On the client side, we would have performed a fetch for all specializations to populate a drop down +menu or some kind of list where we can select the specializations we want to search for. The data +here will contain the specialization ids. As such, an approach for this searching functionality is +to include the list of specialization ids which can be used to query the UnitSpecializations table +to return back all unit ids which match the specialization ids. + +The teaching period search will follow a similar process where teaching periods will be loaded on +the client side with their ids. Upon selection, we can use the ids and search the Units table for +all units that match the teaching period ids. + +Ultimately, the end result will be a list of units that need to take into consideration all of the +search parameters and include/exclude units accordingly. + +### Model + +The model will be as follows: + +| Field | Type | Description | +| ---------------- | ------- | -------------------------------------------------------------- | +| unitId | Integer | Auto generated id. | +| unitOfferingId | Integer | Unit offering id. | +| year | Integer | Respective year of unit. | +| version | String | Unit version number. | +| level | Integer | Unit level. | +| teachingPeriodId | Integer | Id of the teaching period for this specific entry of the unit. | +| url | String | Link to the unit webpage. | +| createdAt | Date | Date this entry was added. | +| updatedAt | Date | Date this entry was updated. | + +The main thing to note here is that each entry of the unit needs to keep track of the Unit Offering +that it will be based off. Other fields are explained within the description of the table above. + +This unit will form the basis of the course map unit which will contain specific course map related +properties. + +## Specialization + +--- + +### Routes + +This will be relatively straightforward. We simply need routes that can get/add/update/delete +specializations. + +| Endpoint | Description | Request Body | Response Body | +| --------------------------------------- | ---------------------------------------------- | -------------- | ---------------- | +| GET /specialization | Get all specializations. | None | Specialization[] | +| GET /specialization/specializationId | Get specialization by id. | None | Specialization | +| POST /specialization | Add a new specialization. | Specialization | Specialization | +| PUT /specialization/specializationId | Updates an existing specialization via its id. | Specialization | Specialization | +| DELETE /specialization/specializationId | Deletes an existing specialization via its id. | None | None | + +### Model + +The model will be as follows: + +| Field | Type | Description | +| ---------------- | ------- | ---------------------------- | +| specializationId | Integer | Auto generated id. | +| specialization | String | Specialization name. | +| createdAt | Date | Date this entry was added. | +| updatedAt | Date | Date this entry was updated. | + +## Teaching Period + +--- + +### Routes + +This will also be relatively straightforward. We simply need routes that can get/add/update/delete +teaching periods. + +| Endpoint | Description | Request Body | Response Body | +| --------------------------------------- | ----------------------------------------------- | -------------- | ---------------- | +| GET /teachingperiod | Get all teaching periods. | None | TeachingPeriod[] | +| GET /teachingperiod/teachingperiodId | Get teaching period via its id. | None | TeachingPeriod | +| POST /teachingperiod | Add a new teaching period. | TeachingPeriod | TeachingPeriod | +| PUT /teachingperiod/teachingperiodId | Updates an existing teaching period via its id. | TeachingPeriod | TeachingPeriod | +| DELETE /teachingperiod/teachingperiodId | Deletes an existing teaching period via its id. | None | None | + +### Model + +The model will be as follows: + +| Field | Type | Description | +| ------------------- | ------- | ---------------------------- | +| teachingPeriodId | Integer | Auto generated id. | +| teachingPeriodLabel | String | Name of the teaching period. | +| year | Integer | Year of the teaching period. | +| teachingStart | Date | Teaching start date. | +| teachingEnd | Date | Teaching end date. | +| createdAt | Date | Date this entry was added. | +| updatedAt | Date | Date this entry was updated. | + +The main thing to note here is that having this model lets us associate units to a specific teaching +period of a particular year. + +## Requirements + +--- + +### Routes + +The core factor with the Requirement routes is the ability to fetch requirements based on the unitId +or courseId. + +| Endpoint | Description | Request Body | Response Body | +| --------------------------------- | ------------------------------------------- | ------------ | ------------- | +| GET /requirement/ | Get all requirements. | None | Requirement[] | +| GET /requirement/unitId | Get all requirements for a given unit id. | None | Requirement[] | +| GET /requirement/courseId | Get all requirements for a given course id | None | Requirement[] | +| POST /requirement | Add a new requirement. | Requirement | Requirement | +| PUT /requirement/requirementId | Updates an existing requirement via its id. | Requirement | Requirement | +| DELETE /requirement/requirementId | Deletes an existing requirement via its id. | None | None | + +**GET /requirement/unitId and GET /requirement/courseId** + +Basically, when we obtain the course data when loading up CourseFlow upon user entry or when loading +up a specific unit's data, we need to obtain their respective requirements. + +This is achievable by using the unitId or courseId and fetching all the requirements in this manner. +Each requirement will then chain into the respective requirement set through separate requests (or +through a join operation to retrieve the requirement set together with the requirement itself) which +will contain more information such as the required list of units to complete. + +**POST /requirement** + +Adding requirements can be done in the respective sections where we can add new courses or new +units. + +Since some courses (and perhaps some units) can share similar requirements such as the same major +and minor sequences, it would be worthwhile to include within the interface, a drop down list of +pre-set requirements. In a similar fashion to the course map templates mentioned earlier, we can +make use of empty unit and course id entries as a mechanism to indicate that it is a template +requirement. We can then create an entry based on the template and have the course or unit id added +on to the data. + +### Model + +The model of this will be as follows: + +| Field | Type | Description | +| --------------------- | ------- | ---------------------------------------------------- | +| requirementsId | Integer | Auto generated id. | +| unitId | Integer | Associated unit id. | +| courseId | Integer | Associated course id. | +| type | String | The requirement type (count, minimum constrain etc.) | +| category | String | Category of the requirement (pre-requisite etc.) | +| description | String | A description of what this requirement is. | +| minimum | Integer | The minimum number of units to complete. | +| maximum | Integer | The maximum number of units to complete. | +| requirementSetGroupId | Integer | Id of the associated requirement group set. | +| createdAt | Date | Date this entry was added. | +| updatedAt | Date | Date this entry was updated. | + +This model has a few key factors to consider. + +As mentioned, the unit and course id will be how we associate each requirement to the respective +instance/entry of a unit or course. + +The type is an indicator of what type of requirement we are dealing with. We can use the type within +the client side code to influence the type of checking that needs to be done to update the visuals. +For example, if we have a Count type where the requirement is completion of Introduction to +Programming: + +- We can set the minimum to 1 and have the requirement set contain the specific unit which the + client side will check against with the course map to see if the unit has been set before the unit + that requires it. +- We can also break down the count type to MinimumCount and do the same thing if more specificity is + required in the logic handling in the front-end. + +Category and description will be utilized by the client side to provide headings and information +respectively. + +Minimum and maximum will be used in conjunction with the type where logic on the client side will +utilize to see if requirements have been met. + +The requirement set group id will be used to fetch all of the entries in the respective table. The +purpose of this is to get back either a list of units or requirement ids which will be used to chain +requirements (further information for this provided in the Enhanced erd and data modelling +document). + +It is worth pointing out that at this point in time, the current progress of a student in achieving +the requirement (complete 5 out of 21 units for example) will not be recorded in the database. The +primary aim is to have the client side utilize the requirement data in conjunction with the units +set on the course map (and potentially units marked as complete) to provide visual indicators on the +client side to show requirement progression. + +## RequirementsSet + +--- + +### Routes + +This particular entity works in conjunction with Requirements where this provides a mechanism to +list out required units that belong to a requirement. Additionally, this also provides a way to +chain requirements to handle requirement choices. The routes will be as follow: + +| Endpoint | Description | Request Body | Response Body | +| ----------------------------------------- | ----------------------------------------------- | ------------ | ---------------- | +| GET /requirementset/ | Get all requirement sets. | None | RequirementSet[] | +| GET /requirementset/requirementSetGroupId | Get all requirements set for a given group id. | None | RequirementSet[] | +| POST /requirementset | Add a new requirement set. | Requirement | RequirementSet | +| PUT /requirementset/requirementSetId | Updates an existing requirement set via its id. | Requirement | RequirementSet | +| DELETE /requirementset/requirementSetId | Deletes an existing requirement set via its id. | None | None | + +**GET /requirementset/requirementSetGroupId ** + +The only route worth elaborating on is this route where we obtain requirement set entries based on +the group id. Here, we use the group id recorded with a requirement to find all entries associated +with this id. + +For example, if a unit has 2 pre-requisites as a minimum count requirement, the entries of this +table associated with this requirement will have 2 entries with the same group id. Each entry will +reference the respective unit id. + +### Model + +The model will be as follows: + +| Field | Type | Description | +| --------------------- | ------- | ----------------------------------------------------------------- | +| requirementSetId | Integer | Auto generated id. | +| requirementSetGroupId | Integer | Associated requirement set group id. | +| description | String | Description/message of the requirement set if needed. | +| unitId | Integer | Id of the associated unit. | +| requirementId | Integer | Id of a chained requirement associated with this requirement set. | +| createdAt | Date | Date this entry was added. | +| updatedAt | Date | Date this entry was updated. | + +Most of the explanations regarding how this model will work has already been mentioned. Just to +further emphasize the point, each instance of this entity will be associated to a requirement and it +will be our way of tracking a list of units associated with a requirement or chaining to another +requirement to essentially create a group of selectable requirements. diff --git a/src/content/docs/products/courseflow/documentation/design/enhanced-erd-and-data-modelling.mdx b/src/content/docs/products/courseflow/documentation/design/enhanced-erd-and-data-modelling.mdx new file mode 100644 index 00000000..e8625b68 --- /dev/null +++ b/src/content/docs/products/courseflow/documentation/design/enhanced-erd-and-data-modelling.mdx @@ -0,0 +1,203 @@ +--- +title: CourseFlow Enhanced ERD and Data Modelling +description: + In-depth explanation of the ERD and handling of data in CourseFlow within the context of OnTrack. +--- + +- [Introduction](#introduction) +- [Diagrams](#diagrams) +- [Analysis of the Entity Relationships](#analysis-of-the-entity-relationships) + - [User and Course Map](#user-and-course-map) + - [Course Map and Course](#course-map-and-course) + - [Course Map and Course Map Unit](#course-map-and-course-map-unit) + - [Unit Offering, Unit and Course Map Unit](#unit-offering-unit-and-course-map-unit) + - [Unit and Teaching period](#unit-and-teaching-period) + - [Unit, Unit Specialization and Specialization](#unit-unit-specialization-and-specialization) + - [Course, Units and Requirements](#course-units-and-requirements) + +## Introduction + +This document aims to provide a detailed overview of the data that will be required for CourseFlow +through the use of diagrams and text based explanations. + +## Diagrams + +--- + +This section will present some diagrams that will be referenced multiple times throughout the +document. + +The diagram below provides an easier to digest, high-level overview of the more detailed Entity +Relationship Diagram (ERD). + +![Courseflow High Level Entity Relationship](/courseflow-high-level-entity-relationship.png) + +The next diagram is the fully fleshed out ERD with the different fields and relationships to other +entities. + +![Courseflow Enhanced ERD](/courseflow-enhanced-erd.png) + +## Analysis of the Entity Relationships + +--- + +This section will provide a detailed analysis of the key entities of CourseFlow and how they will +relate to each other. + +### User and Course Map + +The users entity already exists within OnTrack and it represents the users of the system (students +etc.). Since CourseFlow will be a new feature of OnTrack, it can utilize this entity for association +to a CourseMap. The aim of this relationship is to associate a student with a single course map and +this is achieved by referencing the user id of the User entity within the CourseMap entity. + +Functionally, a student entering the CourseFlow section of OnTrack can use their user id in the API +request and fetch their respective course map. If a course map for that student does not exist, we +would then have a POST request to add a new course map. Additional functionality with the +appropriate route can be added to handle templates for the course map where we can return +pre-defined course maps where a lack of a user id marks them as templates. Once a template is +selected, we can make a POST request with that pre-defined data to add a new entry to the respective +entities (CourseMap and CourseMapUnit). + +### Course Map and Course + +This is a simple association. Essentially, each course map will be associated with a single course +that the student is enrolled in. + +Functionally, when the course map data is received, a different API request can be made to a course +related route to retrieve the course data via the course id which will be stored with the course map +entity. This data will then be used to load up course related information on the client side (since +requirements is in another table, we would make a separate request for all course requirements using +the course id). + +Adding new courses to the system can be done via the POST route where data can be imported or added +manually in an admin panel (possible communication with Student Connect in the future). However, +considerations will need to be made in terms of how a course will be associated to a student who +does not have a course map and therefore, does not have an attached course id (which also prevents +getting templates). This association can be created upon creation of the course map through +communication with Deakin's API. However, in the case where we don't have access to a student's +enrolment, an alternative is to introduce a client side interface for a student to chose their +enrolled course. A simple search functionality with some filters for year etc. can facilitate this +functionality. + +It is worth mentioning just for extra clarity that the course version the course map is referencing +will be important due to possible changes in the course in each year. For example, students who +enrolled in the 2021 version of Computer Science need to follow requirements specific to that +intake. The 2022 version of Computer Science introduced major/minor sequences which is not +applicable to 2021 enrolled students. This requirement is catered for by having a separate entry +within the course data for different years and versions (technically speaking, each new year would +count as a different version but this field is present just incase a change is made within the year +itself and we might need to keep track of the older versions). + +### Course Map and Course Map Unit + +Each course map will consist of course map units which will form a core aspect of CourseFlow as this +is what students will be dragging and dropping into slots on the client side to construct their +course map. + +As such, this system needs to store the course map units and have them all associated to their +respective course map. In this specific CourseMapUnits entity, each entry will represent a single +unit which will reference the course map they belong to. So, upon loading the course map, we can use +the course map id and fetch all the respective units. Entry specific ids can then be used for any +updates made to the course map unit (updating their placement in the trimester on year containers). +Adding new course map units will involve the usage of the Unit entity and creating instances of it +upon selection or drag and drop operations on the client side. + +In terms of the course map unit itself, we simply need to keep track of which year, teaching period +and unit slot they were contained in when originally set by the student (or within the template). +This will allow the unit to appear in the correct slot when loaded and can be used for logic to +restrict placement of the unit in incorrect spots. + +### Unit Offering, Unit and Course Map Unit + +The handling of units can be relatively complex. + +The idea behind what the diagrams represent is that we are creating instances of a unit based on a +base unit. Units Offering is a proposed name change of an existing table in OnTrack for units with +has information such as the name and unit code. The idea here is to have this entity as the base +unit. + +The Unit entity will then be instantiating the base unit information from Unit Offering and will +have more information such as the year, version, teaching period and url to the handbook which will +all be represented as a new entry in the data. Similar to courses, we need to keep track of each +version of a unit so that the course map unit references the correct version of the unit a student +would have taken. This could be further extended to utilize OnTrack's Project Entity to keep track +of the correct unit enrolment and to perhaps use to see if the student has passed the unit. This +approach however will require further considerations for units not used with OnTrack and as such, +will be left out of the diagrams for now. + +Finally, the course map unit will be an instance of a specific unit instance (with the specific year +and teaching period) per coursemap and in itself, will contain its own relevant information +regarding slot positions. This way, the course map will always retain the correct version of the +unit that a student would have taken. + +In terms of adding new units to the system, we can leverage out OnTrack's admin panel and add in an +additional interface for unit variants (different teaching periods, years etc.). Fetching specific +versions of units will be done via presentation of unit requirements (which will tie to a unit +instance) or presentation of electives in the respective interfaces on the client side (which will +allow for filtering based on specializations, teaching periods and years). + +### Unit and Teaching period + +This relationship is relatively simple. We need to keep track of each teaching period and keep the +naming generic to be used by other Universities. Here, we simply keep track of the label (trimester +1 etc.), the year and the teaching time frame. + +Each unit entry will then reference a teaching period id. For example, "Introduction to Programming" +in 2021 could be taken in either trimester 1 or 2. So, in the units table, we would have two +entries, each of them referencing the teaching period relevant to them for the given year. + +### Unit, Unit Specialization and Specialization + +The idea behind the Unit Specialization entity is to associate multiple specializations to a +specific instance/entry of a unit. To avoid having to have the same specialization label appear +multiple times across different units and to make it easier to fetch a list of specializations, a +Specialization entity was created to hold all specializations. This way, the Unit Specialization +entity can reference the respective specialization id. This also opens up possibilities for +associating courses to specializations if ever required down the line. + +Functionally, when we proceed to add a new unit, we would have a specific panel for associating the +specializations. Here, we can fetch the specializations and present them as a drop down menu (or any +other kind of list based UI element) and as we select the specializations, we can make POST requests +to the Unit Specialization and create separate entries associating the specific unit instance to the +specialization/s. We can introduce an input box for adding completely new specializations here too. + +### Course, Units and Requirements + +The requirements related entities will by far, be the most complex aspect of CourseFlow. However, +this forms a crucial and core aspect of the system and as such, needs to be explored and analyzed +properly. + +The idea behind the Requirements entity is that each requirement for a course or unit will be +treated as a single entry. For example, we can have these as separate entries: + +- Complete Introduction to Programming as a pre-requisite to the Object Oriented Programming unit. +- Complete a minimum of these 18 core units for Bachelor of Computer Science. + +These would be classified as count based requirements where you need to complete a minimum number of +units linked to an actual list of units based on the requirement set group id. This is another +entity where each entry would contain a unit id or requirement id for a respective requirement set +group id. This can then be used in conjunction with the requirement to see if units have been +placed/completed within the course map. + +The possible point of confusion will be the above mentioned requirement id within the Requirement +Set entity. The idea behind this a nesting/chaining of requirements to build a group of requirements +that can be chosen out of the given options. As an example, for recent versions of the Computer +Science degree, major/minor sequences are part of the requirements. Here, we can chain the +requirements for picking a major sequence: + +1. The Requirement table would have an entry for completing a minimum of 1 where we reference a + requirement set. +2. The requirement set would have entries referencing requirement ids corresponding to different + major sequences. +3. These requirement entries making up the major sequence would be a minimum count and then + reference another requirement set containing the required units for that major (each entry would + have the respective unit id and the same group id). + +Overall, we can build a requirements table where each unit or course will have multiple requirements +referenced by the unit or course id. + +In terms of updating and adding new requirements, this would be an interface present in the +course/unit admin panel where we will fill this out. The good thing about this approach is that we +can fetch existing requirements and requirement sets and then re-use them for other courses and +units by using the data to create new entries. diff --git a/src/content/docs/products/courseflow/documentation/research/uni-melb-course-planner-research.mdx b/src/content/docs/products/courseflow/documentation/research/uni-melb-course-planner-research.mdx new file mode 100644 index 00000000..6139dd05 --- /dev/null +++ b/src/content/docs/products/courseflow/documentation/research/uni-melb-course-planner-research.mdx @@ -0,0 +1,250 @@ +--- +title: University of Melbourne Course Planner Research +description: + Research spike covering analysis of the course planner provided by the University of Melbourne. +--- + +- [1 - Introduction](#1---introduction) +- [2 - Features of the Course Planner](#2---features-of-the-course-planner) + - [2.1 - Entry Point](#21---entry-point) + - [2.2 - On Creation of Course Planner](#22---on-creation-of-course-planner) + - [2.3 - Main Page](#23---main-page) + - [2.4 - Subject Cards](#24---subject-cards) + - [2.5 - Detailed Subject Panels](#25---detailed-subject-panels) + - [2.6 - Subject Panel](#26---subject-panel) +- [3 - Data analysis](#3---data-analysis) + - [3.1 - Subjects Data](#31---subjects-data) + - [3.2 - Requirements/Rules Data](#32---requirementsrules-data) +- [4 - Key Takeaways in Context of CourseFlow](#4---key-takeaways-in-context-of-courseflow) + - [4.1 - Unit Modelling](#41---unit-modelling) + - [4.2 - Requirements Modelling](#42---requirements-modelling) +- [5 - Final Remarks](#5---final-remarks) + +## 1 - Introduction + +--- + +This document will provide an analysis of the University of Melbourne's course planner system. + +For reference, the URL to the course planner is: + +[University of Melbourne Course Planner](https://course-planner.unimelb.edu.au/) + +To avoid any potential issues in terms of including images from a University of Melbourne owned +website, please use the above link to explore the course planner tool while following this document. + +## 2 - Features of the Course Planner + +--- + +This section will describe the key features of the course planner. + +### 2.1 - Entry Point + +The entry point of the course planner allows you to create a new plan. Here, you have the ability to +select your course level (Undergraduate or Graduate), the course itself, commenced year and which +portion of the year you started (start or mid-way). + +Since CourseFlow will be included as a feature of OnTrack, and students will therefore already have +an assigned course, these features present in the UoM course planner will likely be redundant for +CourseFlow in the near future. + +### 2.2 - On Creation of Course Planner + +This initial transition is important to capture as it will be relevant to CourseFlow and the +discussions around course templates. + +On creation of a new course planner, an overlay window will appear and present a number of samples +that can be used to populate the course planner. For this run, Bachelor of Science was selected and +the samples covered numerous majors in different specializations such as Bioengineering and Data +Science etc. + +Upon selection of Computing and Software Systems, the course planner was auto populated with units +associated with that major. + +A similar feature was discussed for CourseFlow to auto-populate a new course map with core units for +a particular course. + +### 2.3 - Main Page + +The main page is similar to CourseFlow in terms of intended functionality. Here, users can see +course requirements, add/update/remove/move units and have them clearly grouped by the study period +and year. + +Key things to note: + +- User has ability to select a slot and choose a unit. +- Slots are grouped by semester and semesters are grouped by year. + - You can overload and add an additional slot. +- No indication of ability to add extra years. However, you can add additional semesters (for UoM, + they are known as summer and winter term). +- Course requirements has a panel with subsections (accordions) and visuals to indicate if you meet + that requirement or not. + +### 2.4 - Subject Cards + +These are the cards representing a subject. + +Key observations: + +- Heading to indicate if subject is compulsory, discipline specific or a breadth subject for the + course. +- Other information also include subject code, level, credit points, name of unit and the semesters + they are available in. +- Clicking the 3 dotted button will show more options such as details, change and remove. +- Visual indicator (in the form of an x) will tell users if rules of the subject has not been met. + +Unit cards are a planned feature for CourseFlow with likely less information populating the cards. + +### 2.5 - Detailed Subject Panels + +This essentially provides a full description of the subject, along with assessment information and +subject rules (basically subject requirements). + +Similar to the main page, there are visuals to indicate if you meet the subject requirements. + +The key things to note: + +- In cases where users have a choice of different prerequisite pathways to take, the system simply + displays this in the rules panel and rules being met will update independently. +- Some subjects have VCE related prerequisite which is tracked manually by the user via a slide + toggle. + +Given the focus of CourseFlow will be on course planning and seeing if requirements are met for +course/units, it will not follow the same system here in displaying other information such as the +full description, coordinate information (equivalent to unit chairs) and assessment etc. Instead, +CourseFlow will utilize the unit information website and simply provide the link or embed the page +via an IFrame. + +Requirements/rules of the unit for CourseFlow will still need to be displayed with progression +tracking. + +### 2.6 - Subject Panel + +Upon clicking the add a subject button, a window/panel will pop out and provide the user to select a +subject. The main thing to note regarding this is that you can filter subjects by level, study +period and area of study, with the toggles to only show breadth and/or discipline subjects. + +Courseflow will be implementing a similar feature where users can filter units based on interest +areas. Additional filters can be considered. + +## 3 - Data analysis + +--- + +To help rationalize how this course planner works and relate it to CourseFlow to draw in inspiration +for CourseFlow's data modelling, an analysis of the data needs to be done. + +Upon adding a subject in the course planner, json data is returned which can be used for this +analysis. + +### 3.1 - Subjects Data + +The key and relevant data include: + +- Course planner itself with subject assignment with reference to a subject record id. +- Full subject information for the subjects that have been placed on the course planner: +- There is a published year and version field which might be a good way to keep track of different + versions of a subject (2023.3). +- In terms of the subject data itself, one key thing to note that is going to be important for + CourseFlow is the availability field that contains an array of JSON objects which detail + information such as: + - Campus + - Mode of delivery (on campus etc.) + - Study period (semester 1 etc.) + - Period start and end date. + - Year + +### 3.2 - Requirements/Rules Data + +In terms of subject requirements, it seems that this system keeps track of individual requirements +for a subject via the recordId. This also applies to the course requirements where it is tracked as +an individual entry via the recordId of the course. + +Other key factors to note include: + +- Each rule has a rule type such as progression, points constraint or count-constraint etc. +- Each rule has a section that the rule falls under such as pre-requisites. +- Some rules have a progress field that keeps track of information relevant to the rule. + - For example, a count constraint for adding of two subjects into the course map will have a + minimum, maximum and current count field where current count keeps track of those subjects being + present or not. + - In addition to this, there is a field for an array referencing each of those required units. + +## 4 - Key Takeaways in Context of CourseFlow + +--- + +There are two major takeaways from this analysis that can be beneficial to the data modelling in +CourseFlow. + +### 4.1 - Unit Modelling + +One of the challenges with CourseFlow was the handling of unit data with the following +considerations: + +- OnTrack already has a unit table for unit definitions. +- Keeping track of multiple versions of the same unit. + - Unit information and requirements could change in future trimesters. + - Not sure if this has happened before but this could have an impact on students depending on when + they started their course and the units taken leading up to the changed unit in question where + changes could impact their eligibility. + - Also, completed/placed units from previous trimesters or years would still need to be available + despite the change purely for the course map. + - This means the system needs to keep track of unit "history". +- Unit offerings in different teaching periods also need to be tracked. + +Based on the analysis of the course planner data, possible solutions to explore include: + +- Maintaining the OnTrack unit table as the ground truth of the current unit. +- Maintaining a separate course flow unit table with instances of the OnTrack unit: + - This can also keep track of the version of the unit. Depending on the rules set (previously + taken units, course commencement), this version field can allow for units with the relevant + versions to be sent to the client side for setting in the course map. + - More likely than not though, we will only be tracking each unit instance on a per study period + and year basis. Different version numbers will exist just in case. +- We can either have the same version of the unit appear multiple times for different teaching + periods or have a separate table that instantiates different unit versions for the available + teaching periods. + +### 4.2 - Requirements Modelling + +Basically, we can follow a similar procedure to UoM's course planner where: + +- Have a generic requirements table that can cover multiple requirement types (or we can split into + separate tables if it clutters too much). +- For example, if we have something similar to the count constraint for a unit's pre-requisite: + - We keep track of a progress json object inside a field which contains the minimum, maximum and + current count (exactly like the data from UoM course planner) or have them as separate fields in + the table. + - We keep track of the required units. + - If we have two unit requirements, then the minimum will be set to 2, meaning both need to be + completed. + - The requirement visuals for the unit on the client side will track each unit individually based + on their presence in the course map and update a progression visual. +- If we have a situation where we can choose between two units for a unit's pre-requisite: + - Then we do exactly as above but set the minimum to 1. +- Handling of requirement options where the user can choose between requirements (for example, + picking a major sequence out of multiple options): + - Similar to the UoM system, each requirement will have an entry. + - The progression to completing the major sequence based on units placed in the course map will be + tracked on an individual basis. + - Users won't need to "choose/commit" to an option. + - This means that you could have a situation where progression to multiple major sequences will be + seen. + - Much like how pre-requisites can be referenced in a count constraint, we could introduce the + same for a group of choice based requirements and utilize the progress field in a similar + fashion. + - It would be good if a solution can be obtained for users to choose an option for a choice based + requirement (such as picking a major sequence out of the given options) and have those + requirements solely displayed. This will make the requirements less cluttered and more concise. + +## 5 - Final Remarks + +--- + +Overall, the analysis of UoM's course planner was incredibly insightful and has provided inspiration +for possible approaches to modelling of data for CourseFlow, especially with units and requirements. + +More details with concrete descriptions and entity relationship diagrams will be provided in a new +document. diff --git a/src/content/docs/products/ontrack/Documentation/Deployment/Enhanced_Authentication/LDAP-and-devise-research-documentation.md b/src/content/docs/products/ontrack/Documentation/Deployment/Enhanced_Authentication/LDAP-and-devise-research-documentation.md new file mode 100644 index 00000000..c48696fa --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Deployment/Enhanced_Authentication/LDAP-and-devise-research-documentation.md @@ -0,0 +1,270 @@ +--- +title: Research Documentation:LDAP Server & Devise +--- + +[Introduction](#introduction) + +[Research Aims](#research-aims) + +[Research Findings](#research-findings) + +- [LDAP Servers](#ldap-servers) +- [Devise](#devise) +- [Devise LDAP Authentication](#devise-ldap-authentication) +- [Angular (TypeScript) UI & Devise Integration](#angular-typescript-ui--devise-integration) +- [Devise LDAP Server Setup & Integration](#devise-ldap-server-setup--integration) + +[Research Outcomes](#research-outcomes) + +[Reference List](#reference-list) + +[Links to Relevant Resources](#links-to-relevant-resources) + +--- + +## Introduction + +The current distribution of OnTrack supports numerous authentication methods, but all such methods +use external resources to provide the authentication services. As such, it has been proposed that a +**Lightweight Directory Access Protocol (LDAP) server** be created and added to the current Docker +container mix used for OnTrack. This would allow hosting and testing of the LDAP server’s +authentication capabilities. How to implement an LDAP server to suit these needs, however, is +uncertain. + +Within this, it has been suggested that **Devise**, an authentication solution that can be +integrated with LDAP server, could be used as part of achieving this goal of creating an in-house +authentication methodology. There are also Devise modules that are already configured to work +seamlessly with an LDAP server setup. However, it is uncertain whether Devise is needed to achieve +the full goals of the Enhance Authentication team (as outlined on the team Trello Card) and whether +Devise can be used without its Ruby on Rails-based UI (as OnTrack makes use of Angular on the +frontend to communicate with the backend). + +Hence, it is clear that there needs to be some research conducted into the LDAP servers and Devise +to determine the best course of action when integrating these features into the pre-established +OnTrack architecture. + +--- + +## Research Aims + +The aims of this research and its concurrent documentation are as follows: + +1. Gain a better understanding of what an LDAP server is; +2. Understand how an LDAP server could be used to reach our in-house authentication goals; +3. Gain a better understanding of what Devise is and what services it provides; +4. Gain insight into how a Devise LDAP server would be set up and integrated into the current + OnTrack architecture, including adding it to the Docker container mix; +5. Determine whether Devise’s use of a Ruby on Rails UI will impede the ability to utilise it, given + that OnTrack’s frontend uses Angular and communicates with the backend via the Application + Programming Interface (API); +6. If (from _Research Aim 5_) it is determined that Devise **_can_** be used with the current + OnTrack frontend and backend setup, investigate how it will be set up and integrated. + +--- + +## Research Findings + +### LDAP Servers + +A Lightweight Directory Access Protocol server facilitates client-server queries of directories over +the TCP/IP Internet protocol [1]. Similar to a database, the directories stored by the LDAP database +contain attribute-based information which can be queried by clients and responded to by the server +to achieve information-checking goals [1]. In the case of the OnTrack system, the LDAP server would +store relevant user details which would be queried by clients in order to approve or deny the +specific user access to the OnTrack systems – providing an authentication system. + +The LDAP protocol allows for the following operations to be conducted within the database/directory +accessed by the LDAP server [2]: + +- Add: Adds new files and/or entries; +- Delete: Removes files and/or entries; +- Search: Query the files and entries; +- Compare: Determine the similarities and differences between files; and +- Modify: alter an existing file/entry. + +All of these operations are essential to adding the appropriate user details which are used during +the OnTrack authentication process. Additionally, the lightweight nature of LDAP and directories +results in the ability to handle high volumes of traffic and quick response times to client-server +queries [1] [2]. These two elements of LDAP servers make it ideal for the OnTrack authentication +process, especially due to the high number of users of the service. + +Hence, an LDAP server could be utilised to achieve our in-house authentication goals through: + +- Utilising the current user information database or creating a new database purely for + authentication queries. +- Coding the LDAP server to respond to client requests for access to the systems by accessing the + user information database and cross-referencing the details provided by the client and those + stored in the database, giving appropriate responses based on whether the data matches (success – + the user has been authenticated and access can be provided) or whether the data is mismatched + (failure – the user is unable to be authenticated and access is denied). +- The creation and use of the LDAP server results in the OnTrack authentication process becoming + fully independent – meeting the primary authentication goal of in-house authentication. + +### Devise + +Devise is a module-based authentication solution created in the Ruby on Rails programming language +[3]. Taken directly from the [Devise GitHub Repo] (), the 10 +modules within Devise are outlined by the creators as follows: + +> - Database Authenticatable: hashes and stores a password in the database to validate the +> authenticity of a user while signing in. The authentication can be done both through POST +> requests or HTTP Basic Authentication. +> - Omniauthable: adds OmniAuth () support. +> - Confirmable: sends emails with confirmation instructions and verifies whether an account is +> already confirmed during sign in. +> - Recoverable: resets the user password and sends reset instructions. +> - Registerable: handles signing up users through a registration process, also allowing them to +> edit and destroy their account. +> - Rememberable: manages generating and clearing a token for remembering the user from a saved +> cookie. +> - Trackable: tracks sign in count, timestamps and IP address. +> - Timeoutable: expires sessions that have not been active in a specified period of time. +> - Validatable: provides validations of email and password. It's optional and can be customized, so +> you're able to define your own validations. +> - Lockable: locks an account after a specified number of failed sign-in attempts. Can unlock via +> email or after a specified time period. (Source: +> [Devise GitHub Repo](https://github.com/heartcombo/devise)) + +Hence, the Devise authentication solution provides a wholistic authentication service, one which +would be highly suitable to meet the OnTrack authentication goals. + +### Devise LDAP Authentication + +Devise can be used concurrently with LDAP servers to provide complete authentication solutions. In +fact, GitHub user Curtis Schiewek has already created an integrated Devise LDAP authentication +solution called [Devise LDAP Authenticatable] +(). Devise LDAP Authenticatable is a +plugin which allows for the services of Devise to be used with a pre-existing LDAP server (which we +aim to create) and in line with the Devise framework [4]. However, due to this plugin making use of +the Ruby on Rails programming within Devise, it must first be determined if Devise (and, hence, the +Devise LDAP Authenticatable) can be used as part of the OnTrack architecture. + +Devise utilises Ruby on Rails (shortened to “Rails”) as the language framework for the web +applications user interface (UI) that use its authentication services [4]. As such, the credentials +entered into the Rails UI would be those which are authenticated by the Devise back-end +authentication service; the communication is Rails-to-Rails [4]. However, the OnTrack architecture +currently utilises the AngularJS programming language as the framework for the web application +front-end UI, making use of a Rails-based API to communicate with the backend. Additionally, there +is a current migration underway within the OnTrack architecture which will result in the change from +utilising AngularJS to having the UI programmed using Angular (TypesScript). + +As such, a solution to the UI/backend communication based on AngularJS would be redundant due to +this language migration occuring, especially as the Devise LDAP server would likely not be ready to +implement until after the conclusion of this migration. Hence, the research conducted needs to +determine the following: whether it is possible to utilise the Rails-based authentication services +of Devise within an Angular (TypeScript) UI and Rails API architecture. + +### Angular (TypeScript) UI & Devise Integration + +From extensive research regarding _if_ and, if it can, _how_ Devise can be used in an application +architecture which has an Angular (TypeScript) UI, it was found that **there are solutions available +to facilitate this**. + +There are numerous token-based authentication solutions available through GitHub which enable Devise +to communicate with a variety of programming languages which may be used within the architecture of +applications. Of relevance to our proposed implementation are the +[Devise Token Auth](https://github.com/lynndylanhurley/devise_token_auth) and +[Angular Token](https://github.com/neroniaky/angular-token) GitHub repositories. Devise Token Auth +implements a token-based method of authentication for use with Devise, its functionalities being +able to be harnessed through referencing the solution within the appropriate Gemfile [5]. This type +of token-based authentication can be implemented as part of our solution to meet the authentication +goals. More importantly, Angular Token works to facilitate communication between Angular +(TypeScript) solutions and the Rail-based services of Devise [6]. It seamlessly works in conjunction +with the Devise Token Auth service, with the Devise Token Auth repository even providing a demo of +these two solutions successfully integrated [5] [6]. + +Hence, to facilitate the communication between OnTrack’s Angular (TypeScript) UI and the Rails-based +services of Devise, it is suggested that these two token-based authentication solutions be +integrated within the application architecture as demonstrated in the ‘Setup’ sections of their +respective repositories. + +### Devise LDAP Server Setup & Integration + +The following briefly outline the steps that will be involved in setting up and implementing the +Devise LDAP server authentication solution as part of the OnTrack architecture: + +- Run the [OpenLDAP Docker image](https://github.com/osixia/docker-openldap) and follow the + instructions for setting up a new LDAP server. OpenLDAP has been selected due to it being + open-source, reliable, and also its being used as part of the Devise LDAP Authenticatable solution + which we will also be using. Additionally, using a Docker image of an OpenLDAP server which allows + for the creation of new LDAP servers suited to the needs of the company will allow for development + to begin with a solid base and make adding the authentication server solution to the Docker + container mix easier; +- Setup and perform an initial configuration of [Devise](https://github.com/heartcombo/devise) + through adding it to the appropriate Gemfile and following the instructions detailed in the + [Devise README.md] () file; +- Setup and perform an initial configuration of [Devise LDAP Authenticatable] + () through following the processes + outlined in the + [Devise LDAP Authenticatable README.md](https://github.com/cschiewek/devise_ldap_authenticatable/blob/default/README.md) + file; +- Initially configure and integrate both the + [Devise Token Auth](https://github.com/lynndylanhurley/devise_token_auth) and + [Angular Token](https://github.com/neroniaky/angular-token) token-based solutions by following the + installation and configuration information detailed in their respective README.md files: + found[here]( \_token_auth/blob/ master/README.md) and + [here](https://github.com/neroniaky/angular-token/blob/master/README.md); +- Finish the configuration of these elements by populating them with real data and integrating the + elements into the OnTrack architecture, ensuring that they all communicate correctly and respond + as expected. + +As the OpenLDAP server created is drawn from a Docker Image, it is thought that this will simplify +the process of adding the finished server to the Docker container mix used for the OnTrack +deployment. + +Again, this is a very high-level view of the expected setup and integration flow of how the Devise +LDAP server will be developed. As upskilling surrounding these technologies and their respective +code/languages is conducted, this methodology may be made redundant or be found to have missing +items. However, this will be the current basis of how development will occur for now. + +--- + +## Research Outcomes + +Through an examination of the Research Findings documented, understandings of what LDAP servers are +and how they work; what Devise is and what services it offers; and how LDAP and Devise can be +harnessed to provide an authentication solution have been vastly improved. + +Most importantly, from this conducted research, it has been found that **Devise can be used as part +of the OnTrack in-house authentication solution**. As previously detailed, two token-based services +work to facilitate communication between OnTrack’s Angular UI and Devise’s Rails-based and, as such, +integrating these services will allow for the use of Devise within our authentication solution. + +A high-level overview of how the Devise LDAP server solution will be developed has also been given. +However, as mentioned, future upskilling into the practical elements of these technologies may +result in the actual implementation methodologies being found to be much different. However, as +determining whether Devise can be used _at all_ was deemed to be the most important aspect of this +research (as it impacts all other aspects of developing the in-house authentication solution), such +a broad overview will be sufficient for now. + +--- + +## Reference List + +[1] L.E.P. Malère (2007, Mar. 18). What's LDAP? [Webpage]. Available: + + +[2] Okta (n.d.). What Is LDAP & How Does It Work? [Webpage]. Available: + + +[3] heartcombo (n.d.) Devise [GitHub repository]. Available: + +[4] C. Schiewek (2020, Jul. 24). Devise LDAP Authenticatable [GitHub repository]. Available: + + +[5] L. D. Hurley (n.d.). Devise Token Auth [GitHub repository]. Available: + + +[6] J. P. Riethmacher (n.d). Angular Token [GitHub repository]. Available: + + +--- + +## Links to Relevant Resources + +- [Trello card containing aims for the Enhance Authentication team](https://trello.com/c/WeElomXn/6-enhance-authentication) +- [GitHub repo for Devise](https://github.com/heartcombo/devise) +- [GitHub repo for a Devise LDAP authentication module](https://github.com/cschiewek/devise_ldap_authenticatable) +- [GitHub repo for Devise Token authentication solution](https://github.com/lynndylanhurley/devise_token_auth) +- [GitHub repo for Angular UI token integration with Devise (to be used in conjunction with Devise Token Auth)](https://github.com/neroniaky/angular-token) +- [GitHub version of Docker image which can be used to create an OpenLDAP server](https://github.com/osixia/docker-openldap) diff --git a/src/content/docs/products/ontrack/Documentation/Deployment/Enhanced_Authentication/current-and-proposed-authentication-evaluation-5.1.md b/src/content/docs/products/ontrack/Documentation/Deployment/Enhanced_Authentication/current-and-proposed-authentication-evaluation-5.1.md new file mode 100644 index 00000000..030efeeb --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Deployment/Enhanced_Authentication/current-and-proposed-authentication-evaluation-5.1.md @@ -0,0 +1,162 @@ +--- +title: Review of Current and Proposed Authentication Solutions +--- + +[Overview](#overview) + +[The State of the Current Authentication Mechanisms](#the-state-of-the-current-authentication-mechanisms) + +- [The Current Authentication Setup](#the-current-authentication-setup) +- [Risks and Issues](#risks-and-issues) + +[Proposed Authentication Enhancements](#proposed-authentication-enhancements) + +- [The Proposed Authentication Mechanism](#the-proposed-authentication-mechanism) +- [Advancements of the Previous Authentication Mechanisms and how it Addresses Issues of the Old + Method] + (#advancements-of-the-previous-authentication-mechanisms-and-how-it-addresses-issues-of-the-old-method) +- [Potential Issues and Concerns that must be Considered](#potential-issues-and-concerns-that-must-be-considered) + +## Overview + +The purpose of this documentation is to formally review the current authentication mechanisms which +are in place within the OnTrack architecture and compare this to the proposed authentication +solution in development by the Deployment project team (Enhance Authentication). Within this +evaluation, the current authentication setup and mechanisms will be described, and then analysed in +terms of the risks and issues encompassed within such a setup. The new authentication solution which +is proposed to be developed and implemented will then be described, analysing how this new system +aims to advance the authentication capabilities of its predecessor and how it will work to mitigate +the risks and issues of the current system which it will replace. Additionally, the issues and +concerns which may develop as a result of the implementation of the proposed authentication system +will be examined, including the regulatory and compliance considerations which must be addressed +during the development of the new system. + +## The State of the Current Authentication Mechanisms + +### The Current Authentication Setup + +Currently, the OnTrack system relies upon the authentication provided by its client, Deakin +University. The authentication mechanism utilised by Deakin University is a Single Sign On (SSO) +system which utilises Multi-Factor Authentication (MFA) technology through _Duo Security_. As part +of the SSO process, the user is prompted to enter their username and password to log in to the +Deakin SSO system and, as such, to allow access to OnTrack. Once the username and password have been +verified, the MFA system requires the user to confirm that they are the rightful owner of the +account through responding to a “login request” sent to their allocated personal device. Once this +test is passed, access is granted to the OnTrack system. In the case where the user is already +logged in to Deakin SSO, has been accessing other Deakin services and then chooses to visit the +OnTrack site, they are automatically logged in through the SSO functionality. Hence, the current +authentication system is reliant upon third-party authentication, whose MFA capabilities have been +outsourced (to Duo Security). + +### Risks and Issues + +An analysis of the current authentication system presented the following issues and risks: + +As OnTrack relies upon Deakin SSO services, it is assumed that both the login and logout +functionalities would be handled by this service. However, even after a user has logged out Deakin +SSO and (supposedly) all concurrent accounts accessed through the single login, a user’s OnTrack +account remains logged in and accessible for a period of days (perhaps weeks). This security flaw +means that the token used to access the OnTrack account first through the Deakin SSO technology +continues to be stored within the user’s browser for an extended time period, allowing the OnTrack +account to be repeatedly accessed even when the user is not currently signed in to Deakin SSO. For +cases where the user is on a shared computer, this is a high risk for unfiltered access into the +user’s account by other actors. Currently, the only method to properly sign out of the OnTrack +system is for a user to select their avatar icon and, from the displayed drop-down menu, to choose +“sign out” from there. This is often overlooked, especially as it would be assumed that the logout +process would be handled by Deakin SSO services. Even when the user does follow the OnTrack process +to sign out of the account, the user is redirected to a broken link where the page cannot be +displayed – the token is cleared from the browser. Although this does solve the issue at hand, it is +not an ideal user experience + +A second risk is that this current method of authentication relies on third-party and outsourced +authentication technologies. Deakin SSO and MFA is facilitated by Duo Security, although these +technologies may be highly efficient, secure and reliable, such a reliance on third-party software +means that the backend workings of this software is not able to be accessed and understood by the +OnTrack team. Additionally, use of third-party software requires additional sharing, transmission, +and storage of user information on systems which are not able to be managed by the OnTrack team. In +the case of a security breach, the OnTrack team are also forced to rely upon the providers of these +technologies to: + +- Report that the breach happened +- Report which details and systems have been compromised +- Fix the issues which lead to the breach +- Secure the system and continue normal business operations + +Having to rely upon other vendors for these processes removes the control and information +transparency OnTrack has regarding the scale and nature of security breaches. This leaves the +company “in the dark” about what has occurred and is frustrating, especially when there are capable +members within the company who would be able to respond to such events, perhaps more efficiently +than these vendors. + +Hence, from these risks and issues associated with the current OnTrack authentication mechanisms, it +is clear why new technologies and methods of authentication have been proposed to be developed and +implemented. + +## Proposed Authentication Enhancements + +This section will detail the proposed authentication elements to be added to the OnTrack +architecture in order to improve the state of the authentication mechanisms and to alleviate some of +the risks and errors in the described current setup. + +### The Proposed Authentication Mechanism + +The proposed solution to be implemented by the Enhance Authentication team has several elements, as +follows: + +- An extension of the current OnTrack API, adding functionality to facilitate user management +- Password management features, for users and admin manipulation. Users can either send a request to + the admin to authorise the password or do so themselves. It is important that, as part of this + feature, the admin is able to manipulate the password (i.e. send the request for a password + change). The password is never transferred in plaintext at any time during this process. +- A Devise LDAP server option which handles the authentication processes for OnTrack, allowing the + authentication to be performed fully “in-house” rather than outsourced to other authentication + mechanisms. + +### Advancements of the Previous Authentication Mechanisms and how it Addresses + +### Issues of the Old Method + +From the proposed elements to be added to the authentication mechanisms, the following advancements +and addressing of issues relevant to the current system are achieved: + +| Element | Advancement | +| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| User Password Management | Allows for users to change passwords themselves to something more secure and/or easier to remember (though it is important that proper password policies, practices and recommendations are followed), rather than being forced to use the same password set for their Deakin account. By changing the password for OnTrack, this follows recommended password procedures which suggests that passwords should not be reused across various accounts | +| User Password Management | Allows users to request a password change from the administrator in the event that they have forgotten their password and cannot gain access to their account. This is a useful feature for account management and access, ensuring that users are able to regain access to their account swiftly and easily | +| Additional API User Management Functions | Improves upon the current authentication setup through allowing more user qualities to be managed independently by the admins and, for some features, by the users themselves. Overall, this adds additional flexibility and ease of change for certain parameters or information | +| LDAP Devise Server | Allows the OnTrack system to have its own in-house authentication mechanisms with complete control over how it is set up, integrated, and deployed. As the current authentication mechanism relies on third-party “Single Sign On” (SSO) authentication protocols provided by Deakin University, OnTrack is limited to utilising the mechanisms provided by this third-party system. Developing an in-house authentication solution using LDAP and Devise results in the OnTrack architecture being fully independent, and allows for additional sign-in options to be added in future (for example, using a Google Account to sign in) | +| LDAP Devise Server | Allows for the authentication systems to be fully managed by the OnTrack team, allowing for complete control over the code and features included as part of the authentication processes. This is an improvement as reliance on third-party software or processes in any circumstance increase the difficulty in understanding how the systems operate and what has occurred in the instance of an error or breach. Having an independent authentication solution streamlines the control and medication of the services provided by it, allowing for access and control to be granted solely to the OnTrack team on the backend of the project. In this way, the LDAP and Devise features used can be customised to suit the specific (and changing) needs of the OnTrack system, using only features that are necessary and relevant to the OnTrack system and user authentication needs, rather than accepting all services provided by third-party authentication mechanisms | +| LDAP Devise Server | As stated, the OnTrack team will be granted full control over the authentication systems and elements of the OnTrack software. This will solve the issue of the redirection to the broken Deakin SSO link as explored in previous sections, as the team will be able to control the flow towards other pages after the successful signing out of a user | + +### Potential Issues and Concerns that must be Considered + +Within the development and deployment phases related to implementing these proposed authentication +mechanisms, the following must be closely considered and addressed: + +- It must be ensured that, while system admins have the ability to grant access to change the + passwords, that they cannot directly access the passwords themselves. There must be a clear + separation of information, and passwords must have secure encryption applied to them. +- Password change requests must be validated to ensure that they are coming from the user, and not + someone pretending to be the user in order to gain control over the account. A security mechanism + such as requiring the requestee’s date of birth, or an answer to a security question set by the + user, is suggested. Additionally, sending an automatic email or text to inform the user of the + request for a change of password is also recommended +- The developed authentication system, including how user information is stored, transmitted, and + later deleted (which includes considerations of retention laws) must adhere to the appropriate + laws and guidelines set out by the Australian Federal Government (including the _Privacy Act + 1988_), as well as other specifications mandated within each of the Australian states and + territories. +- Additionally, as OnTrack provides its services to international users (both in terms of + international students studying online at Deakin and through providing its services to + international clients), OnTrack’s authentication and information storage processes must also + adhere to the laws enacted within the relevant international jurisdictions. For example, the data + protection laws enacted within the GDPR must be adhered to by companies who provide services to + citizens protected under the GDPR, regardless of where the company is situated (see + )。 +- Finally, as all code used within the OnTrack architecture is open-source and publicly available + through the Thoth Tech company site, how this effects the security of the proposed authentication + system once developed and added to the site must be considered. Specifically, it must be examined + whether public access to the internal workings of the authentication system increases the threat + of a data breach as anyone can view the code, find vulnerabilities, and then create exploits to + leverage such vulnerabilities. Hence, it is recommended that thorough vulnerability analysis is + conducted on the code and systems to be included within the proposed authentication solutions。 diff --git a/src/content/docs/products/ontrack/Documentation/Deployment/Enhanced_Authentication/testing-strategy-enhance-authentication.md b/src/content/docs/products/ontrack/Documentation/Deployment/Enhanced_Authentication/testing-strategy-enhance-authentication.md new file mode 100644 index 00000000..a3af5afe --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Deployment/Enhanced_Authentication/testing-strategy-enhance-authentication.md @@ -0,0 +1,127 @@ +--- +title: Testing Strategy for Enhance Authentication +--- + +[Introduction](#introduction) + +[Overview of Deliverables to be Tested](#overview-of-deliverables-to-be-tested) + +[References](#references) + +[Test Management](#test-management) + +[Scope of Testing](#scope-of-testing) + +--- + +## Introduction + +This testing strategy describes the features and artifacts that the Enhance Authentication team will +be contributing to the OnTrack architecture, particularly focusing on the specifics regarding the +testing of these elements once developed. Conducting testing according to this Testing Strategy is +paramount to ensure that the created elements are functioning as expected before they are added to +the main OnTrack GitHub repository and associated Docker containers for deployment. + +## Overview of Deliverables to be Tested + +As part of the development of elements conducted by the Enhance Authentication team, the following +features will be created and will require testing: + +- Extend the current features within the OnTrack API to allow for user management to be achieved +- Add a feature to allow users and admins to change user passwords, facilitating users being able to + request admin to change the user’s password due to it being forgotten +- Add a Devise LDAP server option to facilitate in-house authentication of users of the OnTrack + system + +These features, once functioning, will be the deliverables of the Enhance Authentication team. +Additionally, this testing strategy will also be a deliverable, as will any research documentation +conducted in the process of implementing these features. + +## References + +The following resources are relevant to the work that is to be done by the Enhance Authentication +team. + +Links to resources used for as part of development and testing: + +- GitHub: +- Visual Studio Code: +- Docker: + +Links to the relevant OnTrack repositories which will be accessed and altered by the team to +implement the new authentication features: + +- Doubtfire-Web: +- Doubtfire-Deploy: +- Doubtfire-API: + +Links to resources describing the coding languages used: + +- Ruby-on-Rails for updating of the API to add new features: +- Angular/Typescript for front-end development: + +Links to resources relevant to the Devise LDAP server: + +- GitHub repo for Devise: +- GitHub repo for a Devise LDAP authentication module: + +- Research documentation regarding how to implement the server solution: + + Deployment/Enhanced%20Authentication/Research%20%26%20Findings/LDAP-and-devise-research-documentation.md + +## QA Deliverables + +As part of the processes to provide Quality Assurance within our deliverables, the following +artifacts will be produced in line with our development processes: + +- Testing Plan: This is official recording and documentation of the processes undertaken as part of + the testing phase. Included within the testing plan is details of each specific test undertaken on + a developed feature, and documents the test number, scenario, inputs, and the expected versus + actual results. This allows for our team to ensure that the final testing outcomes meet all + requirements and expectations of the deliverables, and allows the testing processes and outcomes + to be viewed and understood by others, both within the team and wider company. A template of the + Thoth Tech Testing Plan can be found here: + +- Test Case documentation: This is an official recording of the details regarding a specific testing + scenario and will be different depending on the feature to be tested ( for example, the Test Case + for the extension of the API management features will be different from that of the LDAP Devise + Server). The Test Case includes further details regarding the environment which the testing was + conducted (including details regarding operating systems and versions of software) and the + sequence of steps which were performed to create the test and implement it. Overall, this + documentation provides detail into the specifics of each test on the developed features, including + suffice detail for others to understand the conditions of the testing process and, if applicable, + to replicate the test themselves. It is closely linked to the information recorded within the + Testing Plan. + +## Test Management + +This section outlines the resources that will be used during the testing processes for the API user +management extension and the integration of a Devise LDAP server into the OnTrack architecture: + +- GitHub will be used to facilitate version control of the tests developed +- Visual Studio code will be used to create tests relevant to both the user management/API extension + and the Devise LDAP server integration, ensuring that all components of the expected functionality + are tested +- Ruby-on-Rails will be used to create tests for functionality of features integrated within the API +- The data used within the testing will be users and data that have been created specifically for + the testing processes. The functionality of the users and their data simulate the real users and + data of the OnTrack system to facilitate realistic testing without effecting the actual users + during the testing phase +- Docker will be used to build the OnTrack environment to allow for testing to be conducted within + it, and to view the effects of the added features on how the environment runs + +## Scope of Testing + +This section outlines the type of tests which exist within the OnTrack project. + +- There are API test files and processes written in Rails which already exist which are relevant to + testing other processes within the OnTrack system. While these tests are not able to be used for + our testing purposes, they do provide examples of how to write the testing processes and provide + sample user accounts and data which can be utilised within the testing of our features +- New testing processes will be written by the Enhance Authentication developers as part of the + development and testing phases, based on pre-existing test files within the OnTrack architecture + and using some of the testing processes that have already been developed +- Regarding the Devise LDAP server, the respective GitHub pages for these technologies (referenced + above) also include processes for testing their implementation. These guidelines may also be + consulted within the testing phases, especially in the earlier parts of interacting with these new + technologies diff --git a/src/content/docs/products/ontrack/Documentation/Deployment/Google_Cloud/google-cloud-research.md b/src/content/docs/products/ontrack/Documentation/Deployment/Google_Cloud/google-cloud-research.md new file mode 100644 index 00000000..3d783ded --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Deployment/Google_Cloud/google-cloud-research.md @@ -0,0 +1,154 @@ +--- +title: Google Cloud - Research Documentation +--- + +[Introduction](#introduction) + +[Aims](#aims) + +[Findings](#findings) + +- [Google Cloud](#google-cloud) +- [CI/CD Deployments](#cicd-deployments) +- [Docker containers](#docker-containers) +- [Artifact Registry](#artifact-registry) +- [OnTrack/Doubtfire deployment and components](#ontrackdoubtfire-deployment-and-components) + +[Learnings](#learnings) + +[Outcomes](#outcomes) + +[References](#references) + +[Links](#links) + +--- + +## Introduction + +The Deployment project aim is to create an employee-run deployment of OnTrack separated from the +existing Deakin version and hosted on Google Cloud. + +## Aims + +1. Understanding of Google Cloud services, Deployments; +2. Understanding of Docker containers; +3. Understanding of the overall OnTrack deployment and components; + +## Findings + +### Google Cloud + +**Google Cloud Platform (GCP)** is a cloud service platform that allows you to build cloud resources +and platforms, leveraging cloud native services and features. + +Google Compute Engine (GCE) is the Infrastructure as a Service (IaaS) component of Google CLoud +Platform (GCP) [1]. It is the service that provides virtual machines (VMs) as server resources in +the cloud. + +Cloud Build and Cloud Run are services offered by Google Cloud to achieve part of the CI/CD +deployment. Cloud Build is designed to help you execute your builds on Google Cloud from your source +code in your git repositories. Cloud Run is designed to run containers as a serverless, compute +platform. + +Once your Google Cloud account and project is setup, there are IAM users & roles which will need to +be setup to access Google Cloud services. The account administrator would also need to enable the +desired Google Cloud services, such as Cloud Build and Cloud Run, as they are not enabled by +default. IAM users & roles will then need to be assigned to the enabled services. + +### CI/CD Deployments + +Once you are setup with a Google Cloud account and project, you can setup a CI/CD pipeline to +perform the steps of build, test, and deploy to Google Cloud. The source code will need to be in a +git repository and Google Cloud will need access to monitor the actions of the git repository. For +example, you can setup either commits or pull requests to be monitored which will trigger a build +within Cloud Build. + +### Docker containers + +**Docker** allows you to package and run an application in a loosely isolated environment [2] +referred to as a container. The container is a portable and lightweight image that contains +everything needed to run an application without any reliance of installed apps or components on the +host server. + +Docker compose is the tool to define and run Docker applications. A `Dockerfile` defines the app's +environment. A `docker-compose.yaml` file defines the services that make up your app in YAML. And +`docker compose up` starts and runs your entire app [3]. + +### Artifact Registry + +Initially, we reviewed the use of Google Container Registry (GCR) service in Google Cloud as a +repository for container images. However upon reading Google Cloud's documentation, it highlighted +that Artifact Registry is the recommended service for managing container images [4] artifacts for +Google Cloud projects. Private images can be pushed to a GCR repository and pulled for use within +GCP. + +### OnTrack/Doubtfire deployment and components + +The **Doubtfire** (commonly known as **OnTrack**) deployment guide we referred to outlines that +Doubtfire is deployed using Docker containers described in a docker compose [5]. The application +involves the following components: + +> - a proxy, based on nginx, that handles HTTPS and routes traffic to the webserver or apiserver +> containers. +> - a webserver, based on nginx, that serves the static html/css/javascript/etc files. +> - an apiserver, based on rails, that serves the restful API used by the application. +> - an application server (pdfgen), based on rails, that uses cron jobs to periodically generate +> PDFs from student submissions, and send status emails. +> - a database server, based on Maria DB or MySql used by the api and application servers to persist +> data +> - file storage connected to the apiserver and application server for storing student work +> - an external mail server to send emails +> - an external authentication server to authenticate users. (Source: +> [doubtfire-deploy GitHub repo](https://github.com/thoth-tech/doubtfire-deploy/blob/main/DEPLOYING.md)) + +There are quite a few steps that will need to be performed to configure the above components. The +team will require a high-level understanding of the components, services, and frameworks used for +the setup and changes required. + +### Learnings + +- After a couple of discussions with the Pipelines team and Andrew Cain, it was determined that + Cloud Build and Cloud Run had some limitations and may not be ideal to be able to cater for the + wider team at Thoth-Tech. As a result, the Google Cloud and Pipelines teams have moved on to + consider other options that would be more viable and aligned to the goals of the project. +- In order to use Artifact Registry, the service will need to be enabled in your Google Cloud + Platform (GCP) project. +- In order to push or pull a container image, Docker will need to be installed and configured. +- The team will need a high-level understanding of components such as nginx, rails, pdfgen, database + servers (MariaDB or MySql), Action Mailer, Dockerfile, and `docker-compose.yaml`. + +## Outcomes + +Following the team's research of Google Cloud and its services, deployments, and Docker +containers,the team have determined the following outcomes: + +1. Provide a high-level design and document architecture overview of how Google Cloud Platform (GCP) + will be used to support overall deployment and CI/CD pipelines to run resources for this project; +2. Organise the team's access to GCP and GCP project; +3. Create user stories / Trello cards for configuration of components required for the Doubtfire + deployment; +4. Plan to build the platform requirements to deploy an instance of Doubtfire within GCP; + +## References + +[1] Wikipedia (n.d.). Google Compute Engine [Webpage]. Available: + + +[2] Docker (n.d.). Docker overview [Webpage]. Available: + + +[3] Docker (n.d.). Overview of Docker Compose [Webpage]. Available: + + +[4] Google Cloud (n.d.). Container Registry [Webpage]. Available: + + +[5] Thoth-Tech (n.d.). Doubtfire-deploy [Webpage]. Available: + + +## Links + +- [GitHub repo for Thoth-Tech/Doubtfire-deploy](https://github.com/thoth-tech/doubtfire-deploy) +- [GitHub repo for Thoth-Tech/Doubtfire-deploy/DEPLOYING.md](https://github.com/thoth-tech/doubtfire-deploy/blob/main/DEPLOYING.md) +- [Trello board for Deployment - Google Cloud epic](https://trello.com/b/dI1yx9A1/deployment) diff --git a/src/content/docs/products/ontrack/Documentation/Documentation/OnTrack Documentation Template.md b/src/content/docs/products/ontrack/Documentation/Documentation/OnTrack Documentation Template.md new file mode 100644 index 00000000..ea202ba0 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Documentation/OnTrack Documentation Template.md @@ -0,0 +1,52 @@ +--- +title: Thoth Tech Documentation Template +--- + +## Author Information + +--- + +- Author(s): +- Team: +- Team (Delivery and/or Product) Lead: + +## Document Summary + +--- + +- Documentation Title: +- Documentation Type: { Informative/Technical } +- Documentation Information Summary: + +## Document Review Information + +--- + +- Date of Original Document Submission to GitHub: +- Documentation Version: +- Date of Previous Documentation Review: +- Date of Next Documentation Review + +## Key Terms + +--- + +Enter Key Terms here + +## Key Links/Resources + +--- + +Enter Key Links/Resources here + +## Contacts for further information + +--- + +Enter Contacts here + +## Related Documents + +--- + +Enter Related Documents here diff --git a/src/content/docs/products/ontrack/Documentation/Documentation/OnTrack-Documentation-Template-Guide.md b/src/content/docs/products/ontrack/Documentation/Documentation/OnTrack-Documentation-Template-Guide.md new file mode 100644 index 00000000..396e2b7a --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Documentation/OnTrack-Documentation-Template-Guide.md @@ -0,0 +1,217 @@ +--- +title: OnTrack Documentation Template Guide +--- + +## Purpose of this Guide + +--- + +The purpose of this guide is to explain how to properly use the +[OnTrack Documentation Template](https://github.com/thoth-tech/documentation/blob/main/docs/OnTrack/Documentation/OnTrack%20Documentation%20Template.md). + +Documentation is all about informing others. By using the documentation template, you will be able +to provide all the information needed for others to understand your work. This guide will show you +why each line of data in the template is included. That way, you can better understand the template +in general. + +Let's get started! + +## The Sections of the Template + +--- + +There are seven sections to the template: + +- Author Information +- Document Summary +- Document Review Information +- Key Terms +- Key Links/Resources +- Contacts for further information +- Related Documents + +Each of these sections have been included because they give your reader important information about +your documentation. Therefore, having this important information at the very start of your +documentation will help the reader to better understand what you have to say. + +Let's look at each section more closely. + +### Author Information + +--- + +The Author Information section is all about the author, or authors, of the documentation. When +reading something that has been written, it's often very helpful to know who wrote it. That way, if +the reader has more questions about it, or has some suggestions on the documentation itself, they +know who to talk to. + +This section contains the following information: + +- Author(s) +- Team +- Team (Delivery and/or Product) Lead + +An **Author**, or **Authors** when there is more than one, should be included to let the reader know +who wrote the document. This also gives the reader someone to contact about the documentation if +they need/want more information. Conversely, they can contact the author if the document ever needs +to be edited, altered or updated. + +The **Team** responsible for the document should also be included. This informs the reader about +which team/project the document relates to. Hence, it would also give the reader more understanding +about how the documentation relates to the company as a whole. + +The **Team (Delivery and/or Product) Lead** should be listed. This gives the reader an understanding +of who is responsible for the team that the documentation relates to. Similar to the **authors**, +this gives the reader a second point of contact. They could be contacted to get more information on +the topic, or if the document needs to be edited, altered or updated. + +### Document Summary + +--- + +The Document Summary section contains information about the content of the document. In other words, +it's all about what the documentation is trying to inform the reader about. In this section, the +reader will be able to understand the general purpose of your documentation, and what it is about. + +This section contains the following information: + +- Documentation Title +- Documentation Type +- Documentation Information Summary + +A **Documentation Title** should be included within any documentation to let readers know what the +document is about. Similar to the title of a book, this will let readers know what the information +contained within relates to. + +The **Documentation Type** denotes to the reader what type of documentation your document is. An +**Informative** document would explain a topic to your reader, similar to this guide. A +**Technical** document however, would require or assume in-depth knowledge of the documentation's +subject. This might be used for explaining specific pieces of code. + +Lastly, the **Documentation Information Summary** section is included to give the reader a general +understanding of the document itself. Here, you can write some text about what information is +contained within the document. This gives the reader more of an idea of what your document is about +before they start reading, helping them to better understand. + +In the template, using this guide as an example, this section could look like this: + +- **Documentation Title**: OnTrack Documentation Template Guide +- **Documentation Type**: Informative +- **Documentation Information Summary**: + - This document outlines how to use the OnTrack Documentation Template. It explains each data + point and each section of the template, giving readers a better understanding of how to utilise + the template. + +### Document Review Information + +--- + +This section of the template is included to inform your reader about how up-to-date a document is. +Any documentation, regardless of what it is about, should always be as up-to-date as possible. This +ensures the information your document conveys to the reader is useful and understandable to them. + +This section contains the following information: + +- Date of Original Document Submission to GitHub +- Documentation Version +- Date of Previous Documentation Review +- Date of Next Documentation Review + +All documentation for Thoth Tech is housed within an online website called GitHub. Thoth Tech has +numerous file structures in GitHub to which documents are uploaded to. The **Date of Original +Document Submission to GitHub** should therefore be supplied. This gives the reader an understanding +of when the document was first uploaded to GitHub. This knowledge will inform the reader of how old +the document is, regardless of how many versions or iterations there are. + +A **Documentation Version** (i.e. Version 1.0 or V1.0) should also be included where there have been +multiple versions or iterations of a particular document. A Version Number would help readers in +working out which version of the documentation they are reading. This could come in handy if the +reader needed to review a long-ago written (legacy) version, or if two versions needed to be +compared. + +The **Date of Previous Documentation Review** should be included to show when the last review of the +document was done. This would inform readers as to how long ago the documentation was last confirmed +as up-to-date. Therefore, the reader gains a better understanding of whether the information is +still current. + +A **Date of Next Documentation Review** should be included to give readers the date when the +document will/could/should next be reviewed. This could be recorded either by the author(s), or an +authorised company member. Including this data ensures that the document can be reviewed +periodically to ensure continuing accuracy. Depending on how often the data in the document may +change or become obsolete, this could be altered. + +An example could look like this: + +- **Date of Original Document Submission to GitHub**: 23rd March 2023 +- **Documentation Version**: v1.0 +- **Date of Previous Documentation Review**: N/A (first version) +- **Date of Next Documentation Review**: 1st June 2023 + +### Key Terms + +--- + +A **Key Terms** section could be included within your document to give the definitions of terms or +phrases important to your documentation. This list could provide your reader with the background +knowledge they need to gain the best understanding of what you are trying to say. This might be +particularly helpful in technical documents, where a number of terms might need to be defined. + +### Key Links/Resources + +--- + +Similarly, a list of **Key Links or Resources** could also help your reader in understanding your +documentation better. In this section you could include hyperlinks to webpages or even other Thoth +Tech documents in GitHub to give your reader necessary background information. Having these links at +the start of your documentation also saves the reader looking for them throughout the entire +document. With this background information and links, this list will assist your reader in +understanding what you have to say. + +### Contacts for further information + +--- + +Including a list of **Contacts for further information** could be beneficial to your reader. This +list would include people who can be contacted if the reader would like more information about: + +- your documentation +- the information within your documentation +- the subject of your documentation. + +Given Thoth Tech's teams come and go each trimester, it might be a good idea to list more constant +contacts, like Deakin staff. Listing staff, or other company members not within the Capstone +unit(s), would ensure new teams have a point of contact for more information each trimester. The +list of contacts would ensure the new teams have an idea of who would best help them understand your +documentation. Also, it shows the most suitable people they can ask questions to regarding the +document. + +### Related Documents + +--- + +Listing **Related Documents** to your documentation could also help the reader better understand +what you are trying to say. This section could list other documents that might aid the reader in +understanding your work. This could include documents that: + +- are related to the subject of your documentation +- would provide the reader with necessary background information +- could otherwise help your reader in understanding your document. + +For example, the beginning of this guide contains a link to the Documentation template, as it +relates to this document. Supplying a link to the template itself will aid readers with +understanding this guide. + +## Helpful Information + +--- + +When writing your documentation, the following links may be useful: + +- Thoth Tech has some general rules on how we would like documentation to be written. These can be + found + [here](https://github.com/thoth-tech/handbook/blob/main/docs/processes/documentation/writing-style-guide.md) +- Thoth Tech also uses a markup language called Markdown to write documentation in. Thoth Tech has a + document outlining what Markdown is, and how to write it, which can be found + [here](https://github.com/thoth-tech/handbook/blob/main/docs/learning/training/markdown-guide.md). +- Thoth Tech's Documentation Template can be found + [here](https://github.com/thoth-tech/documentation/blob/main/docs/OnTrack/Documentation/OnTrack%20Documentation%20Template.md). diff --git a/src/content/docs/products/ontrack/Documentation/Documentation/Privacy Policies.md b/src/content/docs/products/ontrack/Documentation/Documentation/Privacy Policies.md new file mode 100644 index 00000000..22270301 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Documentation/Privacy Policies.md @@ -0,0 +1,123 @@ +--- +title: Privacy Policies +--- + +### **(A) This Policy** + +This Policy is issued by each of the Controller entities listed in Section P below (" **we**", " +**us**" or " **our**"). This Policy is addressed to individuals outside our organisation with whom +we interact, including students, staff (together, " **you** ) + +This Policy may be amended or updated from time to time to reflect changes in our practices with +respect to the Processing of Personal Data, or changes in applicable law. We encourage you to read +this Policy carefully, and to regularly check this page to review any changes we might make in +accordance with the terms of this Policy. + +### **(B) Processing your Personal Data** + +Collection of Personal Data: We collect or obtain Personal Data about you from the following +sources: + +Data provided to us: University login credentials + +Relationship data: In the ordinary course of our relationship with you. + +Website data: required personal information is collected while signup/sign in procedures. + +Creation of Personal Data: \*\* \*\* In providing our Services, we may also create Personal Data +about you, such as records of your interactions with host organisation and details of your +interaction on our website and we may record your track on tasks given to you. + +Categories of Personal Data: The categories of Personal Data about you that we Process include: + +Personal details: names; gender; date of birth / Domestic or International, course details etc. + +Contact details: Deakin email address. + +Course Assessment: Your Assessment task details, your progress on tasks and results of tasks. + +#### **Sensitive Personal Data** + +We do collect your personal details, course details to provide you with the assessment tasks. In +Processing your Sensitive Personal Data in connection with the purposes set out in this Policy, we +may rely on one or more of the following legal bases, depending on the circumstances: + +we have obtained your prior express consent to the Processing (this legal basis is only used in +relation to Process that is entirely voluntary – it is not used for Processing that is necessary or +obligatory in any way); + +the Processing is required or permitted by applicable law + +the Processing is necessary to protect the vital interests of any individual; or + +we have a legitimate interest in carrying out the Processing for the purpose of managing, operating. + +### **(C) Data Security** + +We have implemented appropriate technical and organisational security measures designed to protect +your Personal Data against accidental or unlawful destruction, loss, alteration, unauthorised +disclosure, unauthorised access, and other unlawful, or unauthorised forms of Processing, in +accordance with applicable law. + +Because the internet is an open system, the transmission of information via the internet is not +completely secure. Although we implement all reasonable measures to protect your Personal Data, we +cannot guarantee the security of your data transmitted to us using the internet – any such +transmission is at your own risk, and you are responsible for ensuring that any Personal Data that +you send to us are sent securely. + +### **(D) Data Accuracy** + +We take every reasonable step to ensure that: + +your Personal Data that we Process are accurate and, where necessary, kept up to date; and + +Any of your Personal Data that we Process that are inaccurate (having regard to the purposes for +which they are Processed) are erased or rectified without delay. + +### **(E) Data Minimisation** + +We take every reasonable step to ensure that your Personal Data that we Process are limited to the +Personal Data reasonably required in connection with the purposes set out in this Policy (including +the provision of Services to you). + +### **(F) Data Retention** + +We take every reasonable step to ensure that your Personal Data is only Processed for the minimum +period necessary for the purposes set out in this Policy. We retain copies of your Personal Data in +a form that permits identification only for as long as: + +We maintain an ongoing relationship with (for example, when you are using the site for your tasks) +your Personal Data are necessary in connection with the lawful purposes set out in this Policy + +We receive your consent to store the data for a longer period of time (for example, in the case of +application documents for your assessment records.). + +### **(G) Your Legal rights** + +Subject to applicable law, you may have several rights regarding the Processing of your Personal + +Data, including: + +The right not to provide your Personal Data to us (however, we are unable to provide you with your +course assessment tasks until you provide us with your personal and course details) + +The right to request access to, or copies of, your Personal Data that we Process, or control, +together with information regarding the source, purpose and nature of processing and disclosure of +those Personal Data; + +the right to request rectification of any inaccuracies in your Personal Data that we Process or +control; + +the right to request, on legitimate grounds: + +erasure of your Personal Data that we Process or control; or + +restriction of Processing of your Personal Data that we Process or control; + +the right to object, on legitimate grounds, to the Processing of your Personal Data by us, or on our +behalf; + +The right to withdraw your consent to Processing, where the lawfulness of processing is based on +consent (noting that such withdrawal does not affect the lawfulness of any Processing performed +prior to the date on which we receive notice of such withdrawal, and does not prevent the Processing +of your Personal Data in reliance upon any other available legal bases); diff --git a/src/content/docs/products/ontrack/Documentation/Documentation/Report_On_Data_Analytics_Tools.md b/src/content/docs/products/ontrack/Documentation/Documentation/Report_On_Data_Analytics_Tools.md new file mode 100644 index 00000000..a4884924 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Documentation/Report_On_Data_Analytics_Tools.md @@ -0,0 +1,117 @@ +--- +title: Research Spike - Report on Data Analytics Tools +--- + +## Introduction + +In today's data-driven educational landscape, schools and universities rely on advanced analytics +tools to gain insights, make informed decisions, and optimize operations. This report offers an +in-depth comparison of three prominent analytics tools: OctopusBI, Tableau, and Track One. The focus +is on their features, potential integration with the OnTrack platform, and alignment with the +specific needs of educational institutions. + +## OctopusBI + +OctopusBI is a robust business intelligence platform with a range of features designed to facilitate +data exploration, visualization, and reporting. It offers the following key features: + +- Customizable Dashboards and Reports: OctopusBI provides a user-friendly interface for creating and + customizing dashboards and reports, allowing educational institutions to tailor their data + representations to specific requirements. +- Data Integration: OctopusBI supports integration with various data sources, enabling seamless + connectivity to student information systems, learning management systems, and other relevant + databases. +- Interactive Data Visualization: The platform offers interactive charting tools and visualizations, + enabling stakeholders to explore data trends and insights more effectively. +- Collaboration and Sharing: OctopusBI facilitates collaboration through commenting and sharing + functionalities, enhancing communication among faculty and staff members. + +## Tableau + +Tableau is a renowned data visualization and analytics tool known for its user-friendly interface +and comprehensive capabilities. Key features include: + +- Advanced Data Visualization: Tableau's drag-and-drop interface empowers users to create + sophisticated visualizations, aiding educational institutions in presenting complex data in an + easily understandable manner. +- Wide Range of Connectors: Tableau offers an extensive library of connectors, enabling seamless + data integration from various sources, including cloud platforms, databases, and spreadsheets. +- Predictive Analytics and Forecasting: Educational institutions can leverage Tableau's advanced + analytics and forecasting tools to identify trends, patterns, and future scenarios, enhancing + proactive decision-making. +- Scalability and Performance: Tableau's scalable architecture ensures that as data volumes grow, + the system remains efficient and capable of handling increasing demands. + +## Track One Studio + +Track One Studio appears to be a comprehensive data analytics and business intelligence platform +designed to help organizations transform their data into actionable insights. It offers a range of +features that can benefit educational institutions and other sectors: + +- Data Integration: Track One Studio supports data integration from various sources, allowing + educational institutions to consolidate and analyse data from student information systems, + academic records, financial databases, and more. +- Visualization and Dashboards: The platform offers tools for creating interactive dashboards and + visualizations, enabling users to explore data trends and patterns visually. Customizable + dashboards can provide insights into student performance, enrolment data, resource allocation, and + more. +- Advanced Analytics: Track One Studio may provide advanced analytics capabilities, such as + predictive modelling, forecasting, and statistical analysis. These features can help educational + institutions make data-driven decisions to improve student outcomes and optimize operations. +- Collaboration and Sharing: The platform seems to facilitate collaboration among stakeholders by + allowing users to share reports, dashboards, and insights. This can enhance communication and + decision-making across departments. +- User-Friendly Interface: Track One Studio's user-friendly interface aims to make data analysis + accessible to users with varying levels of technical expertise, empowering educators and + administrators to harness the power of data. +- Security: Data security is crucial for educational institutions. Track One Studio might offer + security features to protect sensitive student information and comply with data privacy + regulations. +- Customization: Educational institutions often have unique data requirements. Track One Studio may + provide customization options to tailor the platform to the specific needs of schools and + universities. + +## Integration with OnTrack + +The successful integration of an analytics tool with the OnTrack platform is crucial for maximizing +data utilization in educational institutions. Integration considerations include data compatibility, +API availability, and seamless workflow alignment. Each tool's integration potential with OnTrack +needs to be assessed based on the platform's requirements and APIs provided by the analytics tools. + +## What Schools and Universities Seek + +Educational institutions commonly seek the following attributes in a data analytics system: + +- Data Consolidation: The ability to integrate data from disparate sources to provide a + comprehensive view. +- Customization: Tailoring dashboards and reports to meet the unique needs of different departments + and stakeholders. +- User-Friendly Interface: Intuitive tools that empower non-technical users to explore data and + generate insights. +- Predictive Capabilities: Tools for predictive modelling and forecasting to support data-driven + decision-making. +- Security: Robust security measures to protect sensitive student and institutional data. + +## Comparison Table: OctopusBI vs. Tableau vs. Track One Studio + +| **Feature** | **OctopusBI** | **Tableau** | **Track One Studio** | +| ----------------------- | -------------------------- | ------------------------ | ------------------------ | +| Data Integration | Multiple sources | Wide range of connectors | Data integration support | +| Visualization | Customizable dashboards | Advanced visualizations | Interactive dashboards | +| Analytics | Basic capabilities | Advanced analytics | Predictive modelling | +| User-Friendly Interface | User-friendly | Intuitive UI | User-friendly | +| Collaboration | Sharing & commenting | Collaboration features | Collaboration features | +| Data Customization | Customizable reports | Tailored dashboards | Customizable | +| Predictive Analytics | Limited capabilities | Advanced forecasting | Predictive capabilities | +| Scalability | Suitable for growth | Scalable architecture | Scalable solution | +| Security | Standard security measures | Robust security measures | Data security | + +## Conclusion + +After analyzing the features and capabilities of OctopusBI, Tableau, and Track One Studio, it's +evident that each tool offers distinct advantages that can benefit educational institutions seeking +to leverage data analytics for better decision-making. + +When considering integration with the OnTrack platform, it's essential to assess the compatibility +and integration options provided by each tool. Additionally, budget, user preferences, and specific +institutional requirements should be taken into account when making a decision. diff --git a/src/content/docs/products/ontrack/Documentation/Documentation/Spelling-And-Grammar-Template.md b/src/content/docs/products/ontrack/Documentation/Documentation/Spelling-And-Grammar-Template.md new file mode 100644 index 00000000..f0950a48 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Documentation/Spelling-And-Grammar-Template.md @@ -0,0 +1,244 @@ +--- +title: Spelling and Grammar Errors Template +--- + +## Document Information + +--- + +### Author Information + +--- + +- Author: Matt Clark +- Team: OnTrack Documentation +- Team (Delivery and/or Product) Lead: Shaine Christmas + +### Document Summary + +--- + +- Documentation Title: Spelling and Grammar Errors Template +- Documentation Type: Informative +- Documentation Information Summary: + - This document is a template teams can use to both identify and fix spelling and grammar issues + in documentation related to or handled by their respective team. + +### Document Review Information + +--- + +- Date of Original Document Submission to GitHub: 2nd October 2022 +- Documentation Version: v1.0 +- Date of Previous Documentation Review: N/A, first version. +- Date of Next Documentation Review: To Be Determined + +### Key Terms + +--- + +- Markdown: markup language used by Thoth Tech in documentation creation. +- GitHub: online repository system where Thoth Tech keeps their data and information, including + documentation. +- Prettier, Vale: tools used to ensure documentation written meets required standards. The + installation guide in the Key Links/Resources section below explains more about these + technologies. + +### Key Links/Resources + +--- + +Information on writing documentation for Thoth Tech: + +- [Thoth Tech Markdown Guide](https://github.com/thoth-tech/handbook/blob/main/docs/learning/training/markdown-guide.md). +- [Thoth Tech Writing Style Guide](https://github.com/thoth-tech/handbook/blob/main/docs/processes/documentation/writing-style-guide.md) +- [Thoth Tech Installation Guide for Prettier and Vale](https://github.com/thoth-tech/handbook/blob/main/docs/learning/useful-resources/setup-prettier-and-vale.md) + +OnTrack Documentation Template: + +- [Thoth Tech OnTrack Documentation Template](https://github.com/thoth-tech/documentation/blob/main/docs/OnTrack/Documentation/OnTrack%20Documentation%20Template.md) +- [Thoth Tech OnTrack Documentation Template Guide](https://github.com/thoth-tech/documentation/blob/main/docs/OnTrack/Documentation/OnTrack-Documentation-Template-Guide.md) + +### Contacts for further information + +--- + +- Documentation Team + +### Related Documents + +--- + +See Key Links/Resources section above. + +## How To Use This Template + +--- + +This template has been provided as a way for your team to both log and fix spelling and grammar +errors. These errors are those which you and your team find in documentation that your team is +either responsible for, or which relates to your team. For example, let's say a particular team's +document has an error. The error should be added to that team's version of this template. This way, +the team responsible for the document can be made aware of the error. The team which the document +relates to can then evaluate whether it must be fixed or not. + +### How To Create Your New Spelling And Grammar File + +--- + +The following steps outline how this document can be set up for your team. + +**NOTE:** As this is a template, when **_{Insert Team Here}_** appears, replace it with your team +name/area. For example, a team named "Critical Issues" or whose area is "Critical Issues" would +replace "**_{Insert Team Here}_**" with "Critical Issues". + +1. Create an empty Markdown file in a space your team can access. This should be named something + like "**_{Insert Team Here}_** Spelling and Grammar Errors." +2. Copy this template into the new file, _starting from the_ "**_{Insert Team Here}_** Spelling and + Grammar Errors List" _heading below this section._ Information on how to contribute to the + template is also included below as well. +3. Certain sections below contain the text "**_{Insert Team Here}_**". Ensure these are replaced + with your team's name and/or section. +4. That's all. You now have a document in which your team can add errors to. + +### Further Steps **_ONLY For Teams Working With OnTrack_** + +--- + +For teams **working with OnTrack**, Thoth Tech has a special template for OnTrack Documentation. +This template helps your reader understand your work by concentrating all of the important +information of your document in one place. This allows your reader to get the most important +information out of your documentation as quickly as possible. + +To incorporate the OnTrack Documentation Template into your new Spelling and Grammar file, follow +these steps. + +1. After copying the below sections of the Spelling and Grammar template into your new file, open + the + [OnTrack Documentation Template](https://github.com/thoth-tech/documentation/blob/main/docs/OnTrack/Documentation/OnTrack%20Documentation%20Template.md). +2. Copy the contents of the OnTrack Documentation Template into your new Spelling and Grammar file. + The contents of the OnTrack Documentation Template should come before (precede) the contents of + the Spelling and Grammar Template in your new file. +3. Fill out the relevant sections of the OnTrack Documentation Template in your new Spelling and + Grammar file. + - Thoth Tech has an + [OnTrack Documentation Template Guide](https://github.com/thoth-tech/documentation/blob/main/docs/OnTrack/Documentation/OnTrack-Documentation-Template-Guide.md), + which explains how to do this. It also explains in more detail why the template is used, and + contains some links on writing documentation for Thoth Tech. + +## **_{Insert Team Here}_** Spelling and Grammar Errors List + +## Document Purpose + +--- + +The purpose of this document is to form a list wherein spelling and grammar issues in current +**_{Insert Team Here}_** documentation can be identified. They can then be subsequently assessed, +and if need be, fixed. + +Fixing these spelling and grammar mistakes increases the effectiveness and efficiency of the +documentation in question. This erases the potential for confusion as a result of any erroneous +words or phrases. + +## Data Required For Each Entry + +--- + +The following data points are recorded for each entry: + +- Document Name + - The document name allows the reader to understand in which file you have found an error, or + something that must be checked over. +- Document File Path (in GitHub) + - Most all of Thoth Tech's documentation can be found in it's GitHub repositories. Including the + document file path helps the reader find the document quickly, instead of searching through all + of Thoth Tech's GitHub repositories for it. The reader could instead follow this file path to + identify where the document is that you are referring to. For example, the file path of the + OnTrack Documentation is: _documentation/docs/OnTrack/Documentation_. +- Erroneous Words/Phrases + - Listing the erroneous words or phrases your entry refers to informs the reader as to where the + problems are in the document. +- Corrective Suggestions + - Listing these indicates to your reader why you think the mentioned words and/or phrases must be + changed. They can then take these suggestions into consideration when proofreading the document. + +## How This Document Is Formatted + +--- + +Entries into this document are made through the use of tables written in Markdown. The table appears +as shown below: + +| Document Name | Document File Path (in GitHub) | Erroneous Words/Phrases | Corrective Suggestions | +| ------------- | ------------------------------ | ----------------------------------- | ----------------------------------------------------------- | +| "Example-1" | documents/Example-1 | "...their is a document called..." | In this context, "there" should be used instead of "their". | +| "Example-2" | documents/Example-2 | "... When's the meeting today> ..." | ">" should be replaced with "?". | + +For further information on Markdown, what it is and how to use it, Thoth Tech has a +[Markdown Guide](https://github.com/thoth-tech/handbook/blob/main/docs/learning/training/markdown-guide.md). + +### Adding A New Entry + +--- + +To add an entry to an existing table, each bit of data you enter should be separated by a '|'. For +example, the first entry of the above table, in Markdown, is therefore written like this: + +> | "Example-1" | documents/Example-1 | "...their is a document called..." | In this context, +> "there" should be used instead of "their". | + +As you can see, each column's data in the entry is separated by a "|". A "|" is also needed on each +end of the table as well. In the above example, this is before "Example-1" and after "Meeting is +spelt incorrectly". + +## Found Spelling and Grammar Instances In GitHub + +--- + +### Important Considerations When **_Making New Additions_** To This Document + +--- + +- To save readers having to go in between many different files when looking through this list, + _order entries by document_. +- Tables written in Markdown do not allow dot points in their data. Therefore, if more than one + corrective suggestion is written, these must be numbered to help the reader differentiate them. + For example: 1. First suggestion. 2. Second suggestion. +- Where corrective suggestions are small changes, for example, the changing of one letter/character, + highlighting the changes in your suggestions may better help readers understand them. This can be + done through the use of italics or bold text. + - _Italics_ can be written by including one asterisk ("\*") on either side of the text you wish to + be in italics. + - **Bold** text can be written by including two asterisks ("\*\*") on either side of the text you + wish to be in bold. +- Ensure entries are written so that any reader, regardless of their level of contextual knowledge, + could understand what your suggestions mean. +- Thoth Tech uses a **set of rules** when **writing documentation**. The + [Writing Style Guide](https://github.com/thoth-tech/handbook/blob/main/docs/processes/documentation/writing-style-guide.md) + outlines these. +- Thoth Tech also uses the tools "Prettier" and "Vale" for **writing documentation**. Thoth Tech has + an + [Installation Guide](https://github.com/thoth-tech/handbook/blob/main/docs/learning/useful-resources/setup-prettier-and-vale.md) + for both of these technologies. + +### Important Considerations When **_Fixing Items_** In This List + +--- + +- If you are not a member of the team to which this list belongs to, ensure you have their + permission **_before_** editing documentation. + - You may not understand their workings and could hinder their progress if you make unannounced + and/or unverified changes. Changing their work without their knowledge could have unforesee + consequences. + - What you perceive as spelling and/or grammar errors in a document may be correct in the context + of that document. It would be beneficial to ask whether something is an error, instead of + assuming it is and editing the document. +- Once an error is fixed and verified as correct, delete it from this list. + +### List of Known Instances + +--- + +| Document Name | Document File Path (in GitHub) | Erroneous Words/Phrases | Corrective Suggestions | +| ------------- | ------------------------------ | ----------------------- | ---------------------- | +| Document 1 | File Path | Words and Phrases | Suggestions | diff --git a/src/content/docs/products/ontrack/Documentation/Documentation/Spike-Frontend-Documentation-Investigation.md b/src/content/docs/products/ontrack/Documentation/Documentation/Spike-Frontend-Documentation-Investigation.md new file mode 100644 index 00000000..3c75fa82 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Documentation/Spike-Frontend-Documentation-Investigation.md @@ -0,0 +1,71 @@ +--- +title: Spike Outcomes +--- + +**Spike:** 1 + +**Title:** Frontend Documentation Investigation + +**Author:** Devanshi Patel, + +## Goal / Deliverables + +- The goal is to create a document which outlines desire tools and format of document that can be + used to document angular component and service, which can be used for improving developer + efficiency. + +- Add any documentation tasks in the Frontend Documentation Backlog. + +## Technologies, Tools, and Resources used + +- Internet Browser; Google Chrome, Firefox, Safari + +- Programming Language: TypeScript, Ruby + +- Code Editor: VsCode + +- Supporting Application: Docker + +- Technologies: JSDoc Comments, Compodoc + +## Tasks undertaken + +- Have basic knowledge of Angular and what its main elements are and how they interact with other + applications within the system. + +- Learn how to use JSDoc comment in angular application. Know that JSDoc comment is a standard way + to document code in TypeScript. + +- Install Compodoc into VsCode application. Installation guide can be found on google. + +## What we found out + +- We found many ways that angular can be documented to improve developer experience and efficiency. + However, we ended up picking only two applications that can help us document the whole system. + +- JSDoc Comments can be used into TypeScript code to provide better understanding to developers on + how to use components that are already in place or even how to extend them. If we want to create + JSDoc comment we can use ‘/\*\*’ and press entry, which indicated the opening delimiter for the + comment. ‘\*’ indicates that the comment is part of the documentation. The actual documentation + + happens by using some of the common JSDoc tags like '@returns', '@private' and many more. Lastly, + we will close and mark the end of comment by using ‘\*’ symbol. + +1. Download compodoc in your system by running this command: npm install -g @compodoc/compodoc into + VsCode terminal. + +1. Configure compodoc by making tsconfig.docs.json file into the root directory. + +1. In order to generate a document, we are going to use ‘compodoc -p sconfig.docs.json -s’ command. + +1. After the installation is done, it would generate a URL where we can access the documentation. + +1. After we are doing with installing the application, we can view the documentation by visiting + + or what the URL was generated in the terminal. + +- If we were to implement compodoc into our project, it would help us to generate documentation for + modules, component, routes, any directives, pips, interface and many more. + +- So, the main idea behind is that we would first write JSDoc comment in our TypeScript code and + later create a document using compodoc which can be shared very easily among teams and developers. diff --git a/src/content/docs/products/ontrack/Documentation/Documentation/architecture-doc.md b/src/content/docs/products/ontrack/Documentation/Documentation/architecture-doc.md new file mode 100644 index 00000000..119249bd --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Documentation/architecture-doc.md @@ -0,0 +1,80 @@ +--- +title: Architecture Document +--- + +![Tooth_Tech](https://user-images.githubusercontent.com/110685225/191164124-c9e36722-378e-496c-8984-59b4ff6fd1db.png) + +--- + +## Author Information + +### Author(s): Jasdeep Singh(Jassingh27), Adrienne Gelbhauer(agelb21) + +### Team: OnTrack Documentation + +### Team (Delivery and/or Product) Lead: Shaine Christmas + +### Date of Writing: 20/09/2022 + +--- + +## Document Summary + +### Documentation Title: \*\*Architecture Document + +### Documentation Type + +[Informative/Technical] + +### Documentation Information Summary + +This document is visual report for architecture for OnTrack consist of context and container diagram +which explains its working. + +--- + +## Introduction + +### Purpose This document provides a high-level overview of the OnTrack system + +it intends tocommunicate the project structure and architecture to varying levels of complexity +appropriate for various stakeholders withing the organisation and varying levels of technical +literacy. + +### Scope This Architecture document uses a context diagram + +and container diagram to provide ahigh-level overview of the system,both are highly visual and aim +to be easy to comprehend, the context diagram aims to be non-technical, and the container diagram +provides further information to understand system structures. + +--- + +## Context diagram + +![Context_Diagram](https://user-images.githubusercontent.com/110685225/191164865-672927d8-7f16-47f4-865f-4a413bd249ab.png) + +--- + +## Container Diagram + +![OnTrack Container Diagram](https://user-images.githubusercontent.com/110685225/191168107-472c363d-2007-4409-81d5-6bd5800639c4.png) + +## Architectural Goals and Constraints + +- Maintaining a base system that supports future work towards developing new or enhancing + currentfeatures that improve the teaching and learning experience. +- front-end components are clear to understand, user friendly, and straightforward to use. +- System allows tutors to upload assessment tasks, resources, and assign learning outcomes to each + task. +- Students can set a learning outcome goal and filter tasks required for this goal, they can then + view each task and download the related task resources. +- Through the same task view, students can check deadlines, submit extension requests, send query's + to tutors, and make task submissions. +- Tutors can view and download submissions, manage extension requests, respond to queries and leave + feedback. +- System generates progress reports that are sent through email system, users can also track + progress relating to each unit and their set learning outcome goals. + +## Use-Case View + +![Use case view](https://user-images.githubusercontent.com/110685225/192712777-1d306d7d-380a-48a6-be08-8dbbc14ab492.jpeg) diff --git a/src/content/docs/products/ontrack/Documentation/File Submission Enhancements/ProjectSummaryDocument.md b/src/content/docs/products/ontrack/Documentation/File Submission Enhancements/ProjectSummaryDocument.md new file mode 100644 index 00000000..649cfed2 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/File Submission Enhancements/ProjectSummaryDocument.md @@ -0,0 +1,171 @@ +--- +title: OnTrack Word Document Submission Tea +--- + +## Author Information + +- Authors: Matt Kinnia and Simon Agahi +- Team: OnTrack - Word Document Submission +- Team (Delivery and/or Product) Lead: Simon Agahi and Nelson Lai + +## Document Summary + +- Documentation Title: OnTrack Word Document Submission Team +- Documentation Type: Technical +- Documentation Information Summary: Document detailing the original project aim, new project aim + for our trimester, information on the two containers researched, performance KPI's and evaluating + results, and a future students section for important information. + +## Document Review Information + +- Date of Original Document Submission to GitHub: 18/12/2022 +- Documentation Version: 1.0 +- Date of Previous Documentation Review: 18/12/2022 +- Date of Next Documentation Review: to be decided + +## Key Links/Resources + +- +- +- +- +- + +## Contacts for further information + +See . + +## Project Aim + +\ +Overall, the aim of this project is to extend the Doubtfire (OnTrack) Learning Management System by allowing +students to upload word documents against a task submission. \ +\ +Word documents must be converted to the Portable Document Format (PDF) so it can be made accessible to +the tutors and unit convenors for assessment. \ +\ +Currently, Doubtfire only supports code, PDF and image task submissions. + +## Project Aim for Trimester 3, 2022 + +\ +This trimester, our aim is to research, compare and decide on the technology implementation that will +be used to convert the word document submissions to PDF. \ +As a number of the team members are new to the capstone program, and/or new to the Doubtfire +architecture, a significant amount of time is dedicated to research and upskilling. + +## Introduction + +This trimester, we have focused on researching and comparing two Docker images which can be used for +converting word documents to PDFs; Pandoc and LibreOffice Writer. Specifically, these images are: \ +\ + +- pandoc/latex:2.17 +- instructure/libreoffice:6.3 + +## Pandoc + +\ + is a Command Line Interface (CLI) document converter which supports an impressive +number of conversion input and output permutations, including word processing file extensions such as +.docx, .rtf and .odt. Pandoc is well documented and easy to use. Pandoc CLI is available as a Docker +image, so it can be executed in isolation or installed natively within an existing container. + +## LibreOffice + +\ + is an open source productivity suite which contains a number of standalone +applications which are used to author documents, spreadsheets and presentations. While working with LibreOffice +typically involves a graphical user interface, headless interactions are possible via the CLI. Being +an open sourced software, many implementations or flavours are available on the internet. Because of +this, we found it challenging to navigate and find documentation that best fit our use case. LibreOffice +CLI is also available in a Docker image. + +## Performance + +\ +In an effort to make an informed decision on which technology we should utilise going forward, we had +established three Key Performance Indicators (KPIs) in which we evaluated each technology against. \ +\ + +- Speed; the time it took for a conversion to occur. +- Quality; the condition of the conversion output in comparison to the input. +- Footprint; the size of the technology implementation. \ + \ + In order to measure the technologies against the KPIs mentioned above, we had created a + benchmarking tool in Python/Jupyter Notebook which allowed us to perform the evaluation. \ + \ + As a base case (it can be easily extended), the benchmarking tool converts three different sized + ".docx" files, being 100kb, 500kb and 1MB, to ".pdf" and compares the time it took for each of the + technologies. Whereby each file is converted three times so we can report on the best, worst and + average cases. \ + \ The benchmarking tool and its outputs are available at “./Performance Benchmarking/runner.ipynb”. + +## Performance Conclusions + +\ +More detail is available in the benchmarking tool itself, a summary is provided below. \ +\ +![figure 1](/figure1.PNG) \ +\ + +- \*An average of three conversions of a 1MB .docx file. Speed should be used as an indicator only, + this largely depends on the available resources on the executing machine. \ + \ + Notes on Quality \ + \ + Quality is a subjective KPI, and can’t be effectively measured using a discrete value. In this + case, we are using quality as a measurement of likeness between the input and the output. \ + \ + See below for comments regarding conversion quality. \ + \ + ![figure 2](/figure2.PNG) + +## Future Students + +\ +For future students, reflect on the overall project aim, and start thinking in which creative ways you +can help to contribute to this project team. Ultimately by integrating the chosen container into OnTrack +successfully, the original project aim will be complete. \ +\ +A project which was new to the whole team during trimester 3 2022, as well as being condensed into a +very short period of time, was ultimately what allowed us to achieve what we could and overcoming challenges. +With these resources being created with the intention to serve great future reference to future students +and try help them get a head start as much as possible, it is important to take some time and read/understand +all the information provided and available. \ +\ +So have a read of some of the important project information below, and hopefully clears up a lot of questions +you would’ve had, to give a head start into the Capstone unit. \ +\ +**First Steps:** understand the structure of OnTrack, what it is, and how it works. \ +\ +In brief, Doubtfire (OnTrack) can be described as a “modern, lightweight LMS” (Learning Management System) +that helps students submit work and receive feedback on it. \ +\ +![figure 3](/figure3.PNG) \ +\ +When looking at the OnTrack Architecture diagram, the red box, representing the API, is where most of +our work will be in, as it is mainly backend work that needs to be done. \ +\ +Doubtfire’s API is done in an open-source framework known as Ruby on Rails. Rails is written in Ruby +and provides default structures for a database and a web page. \ +\ +If you’re not familiar with the language or framework, learning and upskilling in these areas can be +included in the hours dedicated to upskilling. \ +\ +**NOTE:** minimum 30 hours of upskilling required, as explained by the directors of the capstone unit. +Could be subject to change for future trimesters, so please check with unit team first. \ +\ +**Deploy OnTrack Locally:** should be your priority if you are not a returning student to the project. +The link below will include three markdown files explaining everything you need to do to successfully +set Doubtfire up on your local computer, and so that you can get started working on it. \ +\ +**Link:** +\ +\ +**Direction Moving Forwards & Deliverables:** now that you have Doubtfire setup and working locally, +you can start thinking about solutions and ways in which to contribute. \ +\ +I would recommend now that you have understood a bit of the structure of OnTrack, to then understand +how the API works, and finding the related code for the API to be able to start working on that. The +two kind of go hand in hand, understanding the backend of OnTrack’s API, alongside the overall structure. diff --git a/src/content/docs/products/ontrack/Documentation/Incorporate Content Ontrack/Design_Document.md b/src/content/docs/products/ontrack/Documentation/Incorporate Content Ontrack/Design_Document.md new file mode 100644 index 00000000..0263b8ea --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Incorporate Content Ontrack/Design_Document.md @@ -0,0 +1,173 @@ +--- +title: Design Documentation:Incorporate Content in OnTrack +--- + +Author: Devanshi Patel + +Company: Thoth Tech + +## Introduction + +This document outlines the design approach for the feature called ‘Incorporate Content in OnTrack.’ +This feature will be implemented in Ontrack application, which is known as the main source for +course management system for students. This feature aims to provide better flexibility and +performance by allowing unit chair to host content within Ontrack for students to access. This +feature will not only enable unit chair to host content within OnTrack but also organise content, +search content and update content all within OnTrack. This design document will outline error +handling and validations, testing and technical aspects of the application. + +## User Story + +As a unit chair I want to host content within OnTrack and as a student I want to access the content +within OnTrack. + +## Architecture + +The feature ‘incorporate content in OnTrack’ will be smoothly added to the existing architecture of +the system. This architecture will have frontend and backend component which will uphold the feature +flexibility. + +## Frontend Implementation + +In the frontend, an additional button will be added under the dashboard for both unit chair and +students. For unit chair, the button will open the content page within OnTrack, which allow unit +chair to add content, and make any updates to the content which has been hosted. Additionally, unit +chair can set time and date to when the content should go live, which falls under the organise +content. For students, under the dashboard a new button will be added which will allow them to +access the content as well as search any content and lastly download relevant content to their +device. + +### UI Integration + +When building the application, make sure the design follows the Tailwind CSS, which can provide +better user-friendly experience. Additionally, use Angular component when adding the user interface +element in the application. + +## Backend Implementation + +Make changes to the API endpoint which validates user inputs, along with those API that allows unit +chair to host content, organise content, update content and also access permission. In terms of +student, make changes to API which allows them to access the content, download content and search +content. + +### Database + +Should keep a record of when unit chair add content and last made changes to the content. Use Maria +DB for data management. + +### User Authentication + +Make sure that only authenticate unit chair for certain unit is allowed to host the content. + +## Database Design + +- **Table:** Create a table called ‘ContentRecord’ which stores all the information about when the + unit chair hosted content within OnTrack and when last modified. + +**Column:** + +- **Unit_chair_Id:** The unit chair who hosted the content. +- **time:** What time the content was hosted within OnTrack. +- **date:** The day the content was hosted within OnTrack. +- **Last_modified:** The date and time unit chair made changes to the content. + +## Validation + +- **Error messages:** Display error messages in its relevant place when unit chair puts irrelevant + date for when the content should be seen on the OnTrack application. +- **API validation:** Validate that the input from the frontend is appropriate and that it meets the + requirement. + +## Exception handling + +Ensure that server-side error is implemented in its place for handling errors that can occur during +the process. Additionally, keep record of the errors that occur during the process for debugging +purposes. + +## Testing + +### Test Case 1: Add content within OnTrack + +Description: Making sure that unit chair can add content in the system + +Steps: + +1. Open Ontrack +1. Go to Dashboard, click on add content. +1. Pick the files which you want to upload. +1. Pick the date you want to upload the content. +1. Click Host. + +Expected outcome: Adding content is successful and now students will be able to view the content +within OnTrack. + +### Test Case 2: Edit content within OnTrack + +Description: Allow unit chair to edit the content within OnTrack. + +Steps: + +1. Access the content which needs editing. +1. Click on the content and start editing. +1. Click save once done. + +Expected Outcome: New version will be uploaded in OnTrack which can be viewed by the student. + +### Test case 3: Unauthorized Access + +Description: Making sure that only unit chair can host the content within OnTrack. + +Steps: + +1. If anyone attempts to access the host content functionality without any authentication. + +Expected Outcome: A error message will display on the screen. + +### Test Case 4: Student can view content + +Description: Making sure that students can view the content within OnTrack + +Steps: + +1. Login to OnTrack +1. Navigate to dashboard and click on content. +1. Start viewing certain content. + +Expected Outcome: It will allow students to have access to the content which was added by the unit +chair. Additionally have the task sheet and the content in one place. + +## Deployment + +Deployment plan will outline how steadily the new feature called ‘Incorporate Content in OnTrack’ +will be introduced in the current system of OnTrack. + +- Have a backup copy of the existing system for any risk that can occur during the deployment stage. +- Run testing for both frontend and backend to identify any issues. +- Ensure that the code follows the standards and its best practices. +- Make announcement to students and unit chairs about the new feature, along with any downtime when + the deployment process is taking place. +- Include instructions for unit chair on how to use the new feature. +- Record the new feature during the first few days for any problems that can occur. + +### Frontend Deployment + +Deploy frontend into production server and ensure that the new feature is smoothly integrated into +the existing system. + +### Backend Deployment + +Deploy backend into production server and keep record of any errors that can occur during the +process of deployment. Additionally ensure that the new feature is smoothly integrated into the +existing system. + +## Conclusion + +The new feature ‘incorporate content in OnTrack’ will allow unit chairs to host content within +OnTrack, which will be accessible by the students. Additionally, it will allow unit chair to make +changes to the content that is already visible to the students, along with organising when certain +content should be make visible in the OnTrack application. This design documents outlines how the +feature will be integrated into OnTrack system. The design documents shows that performance, +reliability, and usability will be upheld for better user experience. + +By incorporating this new feature within the existing OnTrack, allows students to view both the +content and task sheet for that unit in place, which upheld the flexibility aspect of this feature. diff --git a/src/content/docs/products/ontrack/Documentation/Incorporate Content Ontrack/Gather_Requirements.md b/src/content/docs/products/ontrack/Documentation/Incorporate Content Ontrack/Gather_Requirements.md new file mode 100644 index 00000000..f4bb187d --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Incorporate Content Ontrack/Gather_Requirements.md @@ -0,0 +1,122 @@ +--- +title: Gather Requirements:Incorporate content in OnTrack +--- + +Author: Devanshi Patel + +Company: Thoth Tech + +## Introduction + +This documentation outlines the requirements for implementing a feature called ‘Incorporate content +in OnTrack.’ This feature will be implemented in the OnTrack application. This feature aims to +provide better flexibility by allowing unit chair to add content in one place where it makes easier +for students to access both the content and the task sheet for the unit in one place. + +## User Story + +As an OnTrack unit chair I want to be able to host content within Ontrack and as a student I want to +able to access the content within Ontrack. + +## Functional Requirements + +### Backend + +- Adjust the maria DB that are already in place. +- Keep all the record of when the unit chair adds content within Ontrack. + +### Frontend + +- Under the dashboard an interface should be added to the unit chair Ontrack screen that will allow + them to add content and hide certain content. +- Under the dashboard an interface should be added in the student end that will allow them to view + content. +- An interface should be added for searching relevant content. + +## Non-Functional Requirements + +### Performance + +- The feature should run smoothly and provide the best experience for both students and unit chairs. + +### Reliability + +- The feature should be able to handle failures and should recover quickly. +- ``Additionally, the feature should perform without failure for 95% of use cases. + +### Usability + +- The user interface should be consistent with its navigation and the overall design. +- The user interface should be user-friendly. +- The feature should require only minimum training for Unit chair. + +## Test cases + +### Test Case 1: Add content within OnTrack + +Description: Making sure that unit chair can add content in the system + +Steps: + +1. Open Ontrack +1. Go to Dashboard, click on add content. +1. Pick the files which you want to upload. +1. Pick the date you want to upload the content. +1. Click Host. + +Expected outcome: Adding content is successful and now students will be able to view the content +within OnTrack. + +### Test Case 2: Edit content within OnTrack + +Description: Allow unit chair to edit the content within OnTrack. + +Steps: + +1. Access the content which needs editing. +1. Click on the content and start editing. +1. Click save once done. + +Expected Outcome: New version will be uploaded in OnTrack which can be viewed by the student. + +### Test case 3: Unauthorized Access + +Description: Making sure that only unit chair can host the content within OnTrack. + +Steps: + +1. If anyone attempts to access the host content functionality without any authentication. + +Expected Outcome: A error message will display on the screen. + +### Test Case 4: Student can view content + +Description: Making sure that students can view the content within OnTrack + +Steps: + +1. Login to OnTrack +1. Navigate to dashboard and click on content. +1. Start viewing certain content. + +Expected Outcome: It will allow students to have access to the content which was added by the unit +chair. Additionally have the task sheet and the content in one place. + +## Testing + +- Setting up the environment for testing and ensuring that its functional. +- Opening terminal and navigate to the correct directory. +- Run the test. +- If all the tests are successful a message will display. +- If the tests are failed an error message will display, along with a description of why it failed. +- When troubleshooting, if the tests fail, review the error message, and identify what the issue + might be. +- Rerun the tests to see if it solved the issue. + +## Conclusion + +To conclude, this new feature ‘Incorporate content in Ontrack’ will allow unit chairs to host +content within OnTrack. Which can be accessible by the students who are enrolled in the unit. +Therefore, this document outlines functional, non-functional requirements along with test cases +which can be used for testing the system amongst various scenarios. This document also outlines what +steps needs to be taken when performing the tests and how to handle issues when running the tests. diff --git a/src/content/docs/products/ontrack/Documentation/Incorporate Content Ontrack/Incorporate_doc.md b/src/content/docs/products/ontrack/Documentation/Incorporate Content Ontrack/Incorporate_doc.md new file mode 100644 index 00000000..8bbb2380 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Incorporate Content Ontrack/Incorporate_doc.md @@ -0,0 +1,42 @@ +--- +title: Incorporate content in OnTrack +--- + +Author: Devanshi Patel + +This documentation outlines the functionality and the way the new feature is going to be implemented +on OnTrack that will enable unit chairs to host content on OnTrack, which can be accessible from the +students end. This feature aims to provide better flexibility by adding the content in one place +where it makes it easier for students to access both the content and the tasksheet for the unit in +one place. This documentation will outline what needs to be done to achieve this feature. + +## Requirements + +- Clearly define what the feature meant to do and the use case. +- Describe how the feature will interact with front-end and the back end? +- What changes need to be done in the backend to add this new feature. + +## Front end design + +- Design the overview of the front-end interface. +- Make adjustment to API, to ensure that the response is accurate. +- Create a test case for front end that upheld the user experience of the feature. + +## UML Diagram + +- Create a UML diagram that will show the flow of incorporating content on Ontrack and the flow + during the process. +- How it will interact with front end, backend as well as with other features that are already in + place. + +## Coding + +- Code the new feature, that will allow unit chairs to host content and make it accessible for + students to view. +- Code the part where it will allow student to access content from their end. + +## Testing + +- Create a test case for the backend, to ensure the data are correctly handled and ensure that the + request is handle in correct manner. +- Create a documentation that will outline the steps on how to conduct the test. diff --git a/src/content/docs/products/ontrack/Documentation/Incorporate Content Ontrack/UML_Diagram.md b/src/content/docs/products/ontrack/Documentation/Incorporate Content Ontrack/UML_Diagram.md new file mode 100644 index 00000000..bd87459d --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Incorporate Content Ontrack/UML_Diagram.md @@ -0,0 +1,21 @@ +--- +title: UML diagram:Incorporate content in OnTrack +--- + +Author: Devanshi Patel + +Company: Thoth Tech + +## Introduction + +This Document outlines the flow of the new feature 'incorporate Content' into Ontrack. + +## Use Case Diagram + +- [UML - Incorporate Content] + () + +## UML Diagram + +- [UML - Incorporate Content] + () diff --git a/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Docker-Containers-SRS.md b/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Docker-Containers-SRS.md new file mode 100644 index 00000000..3ce36f26 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Docker-Containers-SRS.md @@ -0,0 +1,102 @@ +--- +title: + Jupyter Notebook/Word Document Docker Containers Software Requirement Specification (SRS) Document +--- + +## 1. Introduction + +### 1.1 Purpose + +Currently, when an end user wishes to upload a Jupyter Notebook file to OnTrack, they must first +manually convert the file to a PDF. The purpose of the Jupyter Notebook conversion feature is to +automatically perform the conversion of Jupyter Notebook files to PDF during the submission process. +During research for this feature it was determined that converting Word documents to PDF was an +extensible feature of the Jupyter Notebook conversion feature. Depending on the type of file that an +end user submits - if it is a Word document or a Jupyter Notebook file - one container will provide +the conversion function for the Jupyter Notebook, and the other container will provide the +conversion function for the Word document. Both containers will output a PDF file. + +### 1.2 Intended Audience + +The intended audience of this feature is all users of the OnTrack system (students and teachers). +This feature will allow all users to submit Jupyter Notebook and Word Document files to OnTrack +directly, instead of having to first manually convert the file to PDF and then submit that to +OnTrack. The feature will also allow users to view their converted file for review or marking. + +### 1.3 Intended Use + +The intended use of this feature is to provide the functionality for the mentioned conversions. The +user will submit either a Jupyter Notebook or a Word document file to OnTrack, and each container +will be used, depending on the file type, to make the necessary conversion of the submitted file to +PDF format. + +### 1.4 Scope + +This feature will be developed in steps: firstly we aim to develop standalone containers which +provide the feature, secondly they will be integrated into OnTrack thus completing the feature. The +scope during this trimester will be to create standalone Docker containers which can provide the +function of converting Jupyter Notebook or Word Document files to PDF format. Also within scope is +testing the containers and ensuring they conform to a testing strategy. + +### 1.5 Definitions and Acronyms + +- OnTrack – an online learning management system that provides task work to users and allows them to + submit work for feedback and assessment purposes. +- DOCX/DOC - a DOCX/DOC file is a document created by Microsoft Word, a word processor. DOCX/DOC + files typically contain text. +- IPYNB – an IPYNB (IPython notebook) file is a document created by Jupyter Notebook, an interactive + computational environment. IPYNB files can contain code input and output, formatted text, + mathematical functions, and images. +- PDF – a PDF (portable document format) file is a multi-platform document commonly used for saving + documents to be viewed on multiple platforms. +- Docker Container Image – a Docker Container Image is a lightweight, stand-alone, executable + package of software that includes everything needed to run an application: code, runtime, system + tools, system libraries and settings. + +## 2. Overall Description + +### 2.1 User Needs + +Users will need to be able to directly submit Jupyter Notebook and Word document files to OnTrack. +Both of these functionalities will be provided by the proposed containers. + +### 2.2 Assumptions and Dependencies + +- It is assumed that: + - The user submits a valid Jupyter Notebook/Word Document file to the OnTrack system. + - The user has a valid internet connection + - The user is aware of how to submit files to OnTrack +- The following dependencies are relied upon: + - The code of the OnTrack system + - Interface + +## 3. System Features and Requirements + +### 3.1 Functional Requirements + +- The successful conversion of Jupyter Notebook files to PDF format +- The successful conversion of Word document files to PDF format +- Redownloading submitted Jupyter Notebook files as a PDF +- Redownloading submitted Word document files as a PDF +- Viewing converted Jupyter Notebook file in Ontrack as a PDF +- Viewing converted Word document file in Ontrack as a PDF + +### 3.2 External Interface Requirements + +- nbconvert library +- Apache library +- Existing OnTrack libraries + +### 3.3 System Features + +- The ability to submit Jupyter Notebook files to OnTrack directly +- The ability to submit Word document files to OnTrack directly +- The ability to download/export converted files from OnTrack + +### 3.4 Nonfunctional Requirements + +- Reliability – The ability of the system to consistently perform its required functions under + stated conditions. +- Scalability – ability of software to be scaled to encompass project scope in its entirety +- Maintainability – ability of software to be maintained, ensuring consistent and upmost performance +- Usability – User standards diff --git a/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Docker-Documentation-Research-T1-2022.md b/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Docker-Documentation-Research-T1-2022.md new file mode 100644 index 00000000..15a19613 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Docker-Documentation-Research-T1-2022.md @@ -0,0 +1,65 @@ +--- +title: Docker Documentation and Research (WIP) T1-2022 +--- + +[Back to Jupyter Notebook Documentation Index](Index.md) + +## Intro + +The Jupyter Notebook conversion feature will occur via processes inside Docker containers. In this +document we will discuss the main architecture of this structure in relation to OnTrack. + +OnTrack is deployed through two main containers, they are: + +- The front-end container which hosts the logic behind the user interface of OnTrack (mostly + unrelated to this feature) +- The back-end container which hosts the logic related to database interactions and other processes + +A new container will be created to achieve the Jupyter Notebook conversion feature. This contains +all of the dependencies (Python, TeX, etc.) needed for a .ipynb(Jupyter Notebook File) to PDF +conversion, and performing the conversion process within this container. This allows us to have a +standalone software package that is extendable if required, for example if new Python libraries are +required by a unit. It also means that we are able to create as many standalone containers as +required for different conversion processes, such as: + +- Docx to PDF conversion using Apache POI +- Powerpoint presentation to PDF conversion using Apache POI + +## Overview of Conversion Process + +![ ](/docker_flow.png) + +When the OnTrack front-end sends a new file to the OnTrack back-end, the back-end will be able to +determine the file type, and if the file needs to be converted. If the OnTrack back-end recieves a +.ipynb file, it will run the Jupyter to PDF conversion container to perform the conversion process. + +This is done via a shell command that does several things: + +1. Firstly, it ensures that the file to be converted is renamed to "input.ipynb". +2. It then instructs the container to run AND it mounts the file's directory as a Docker volume. As + the container runs it will execute the conversion process via its `ENTRYPOINT` command. The + converted file will be output to the volume. After the container has run, it will be removed. +3. Finally, it removes the temporary files to ensure there is always free space. + +The `docker run` command provides several options for this type of use-case: we are able to specify +a volume using the `-v` option, and we are able to ask that the container is removed after it has +finished its process with the `--rm` option. + +**Note: we may need to have some process in place to read whether the conversion was a success or a +failure.** + +## Conversion Container Requirements + +For a container to function in this architecture, there are some requirements that have to be met: + +- The container will run the conversion as its `ENTRYPOINT` command _without any user input + required_. +- The container will always look in a single directory (mounted as a volume when the container is + run) for **one** file that will be called "input" (+ whatever file extension is required). +- The container will always output the converted file to the **same** directory (mounted as a volumn + when the container is run) and call it "output.pdf". + +These requirements allow the containers to remain isolated while the file conversion logic is +handled seperately by the OnTrack backend. This is necessary to follow the Single-responsibility +Principle: the container itself is responsible for only one task - that is, performing the +conversion process. diff --git a/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Index.md b/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Index.md new file mode 100644 index 00000000..e36192a2 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Index.md @@ -0,0 +1,26 @@ +--- +title: Jupyter Notebook Documentation Index +--- + +## [Jupyter Notebook Epic](Jupyter-Notebook-Epic-T1-2022.md) + +Epic for Jupyter Notebook support feature. + +## Meeting Minutes + +Meeting minutes for each of our meetings. + +- [28/03/2022](Meeting%20Minutes/28.3.22.md) +- [4/04/2022](Meeting%20Minutes/4.4.22.md) +- [11/04/2022](Meeting%20Minutes/11.4.22.md) +- [14/04/2022](Meeting%20Minutes/14.4.22.md) +- [18/04/2022](Meeting%20Minutes/18.4.22.md) +- [22/04/2022](Meeting%20Minutes/22.4.22.md) + +## [Docker Documentation and Research](Docker-Documentation-Research-T1-2022.md) + +Docker documentation + +## [Prototype SRS (Software Requirements Specification)]() + +Software requirements specification for prototype application. diff --git a/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Jupyter-Notebook-Epic-T1-2022.md b/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Jupyter-Notebook-Epic-T1-2022.md new file mode 100644 index 00000000..747389cc --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Jupyter-Notebook-Epic-T1-2022.md @@ -0,0 +1,70 @@ +--- +title: Jupyter Notebook Support Epic +--- + +### Background + +- Students who use OnTrack currently are limited in the way they can upload their Jupyter notebook + files to OnTrack. Students must download their notebook as a HTML through Jupyter notebook and use + an online PDF converter to convert the HTML file to PDF, so their work can be submitted to + OnTrack. + +### Business Value + +- To minimise students needing to use outside sources to be able to upload their work, students must + be able to download their work from a Jupyter notebook, which is saved as a file with ‘.ipynb’ + file, and upload to OnTrack, where it will be converted to a PDF for submission. This will make it + much more efficient for students to upload their work, which will save time for tutors having to + explain the process of having to outsource to a PDF conversion website. This will increase trust + in our product and improve user experience. + +### In scope + +- Review of previous work +- PDF conversion functionality +- Feature documentation +- User guide documentation + +### Out of scope + +- New features + +### What needs to happen + +- Review of existing work to find what is usable and then plan out what work is still to be done. + - Allow for ipynb files to be accepted for Ontrack + - Convert ipynb files to PDF via LaTeX + - Test files are converted from ipynb to PDF + +### Assumptions / Dependencies + +- Code added doesn’t affect any other parts of OnTrack + +### Analytics Considerations + +- How often is this feature being used? +- Track failed conversions + +### Reg & Compliance Considerations + +- N/A + +### Operations/Support + +- Team members may need training/upskilling in technologies such as Ruby, Ruby on Rails, Docker and + GitHub. +- User guide documentation will need to be release simultaneously with the new feature, so users + know how to use this new feature. + +### What are the challenges? + +- Team members will need to understand existing code contributions and understand what is usable to + integrate their Jupyter notebook support project work. Team members may also need to learn new + technologies used in the integration of Jupyter notebook support + +### Acceptance criteria + +- Validate planning documentation with managing directors +- Documentation is accurate to current version of products +- All functionally of Jupyter notebook support must be tested +- Data is collected on usage to inform future decisions diff --git a/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Prototype SRS (Software Requirements Specification).md b/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Prototype SRS (Software Requirements Specification).md new file mode 100644 index 00000000..a0487328 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Jupyter Notebook/Prototype SRS (Software Requirements Specification).md @@ -0,0 +1,110 @@ +--- +title: Jupyter Notebook Week 6 Prototype - Software Requirement Specification (SRS) +--- + +- [Back to Jupyter Notebook Documentation Index](Index.md) + +## 1. Introduction + +### 1.1 Purpose + +- The purpose of this prototype is to ensure the code written thus far by team members sufficiently + completes the two key functionalities of converting both Jupyter Notebook files and Word document + files into PDF format. The successful implementation will ensure the team is on the right track in + terms of both their ideas and their coding work. + +### 1.2 Intended Audience + +- Students +- Teachers/Tutors/Lectures + +### 1.3 Intended Use + +- The intended use of this prototype is to be a more-basic first draft of the logic the team wishes + to implement in the final product of the project scope. It will test the conversion to PDF for + both Jupyter Notebook and Word document files. The successful implementation of this prototype + will give the team the knowledge that the code they’ve written works on a smaller scale than + OnTrack. + +### 1.4 Scope + +- The scope of the prototype is to create a simple front-end interface similar to that of OnTrack + and, through the use of command-line commands, allow for the following functionalities: + - Converting a Jupyter Notebook file into PDF format + - Converting a Word file into PDF format + +### 1.5 Definitions and Acronyms + +- Jupyter Notebook – a web application that allows users write and run live code, equations, + visualizations, and plain text in various languages. +- .ipynb – Jupyter Notebook file type +- .doc – Microsoft Word file +- .docx – Microsoft Word file +- PDF – Portable Document Format +- Library – A library is a collection of pre-written code that provide further access to system + functionality such as file I/O that would otherwise be inaccessible. This is done importing the + library at the beginning of the program. +- HTML – HyperText Markup Language +- RubyOnRails – a server-side web application framework written in Ruby. +- Nbconvert – is a library of pre-written code used to convert Jupyter Notebook file to PDF. +- Backend – Is development that happens behind the scenes, it is all the parts of a computer system + or application that is not directly accessed by the user, it is responsible for storing and + manipulating data through code. +- Frontend – Is development on what the user can see and/or directly interact with (i.e., what can + be seen on the computer screen, such as a window, or buttons and input fields/boxes) + +## 2. Overall Description + +### 2.1 User Needs + +- As a student, I want to be able to upload Jupyter Notebook (.ipynb) files without having to go + through the extra step of converting them to a PDF first. +- As a tutor, I want students to be able to upload any file they are working on so they can focus on + the quality of the work. + +### 2.2 Assumptions and Dependencies + +- Assumptions include: + - The user has a working and valid Jupyter Notebook/Word Document ready to be converted to PDF. + - The user wants the input file to be converted as uploaded. +- The user has access to OnTrack. +- Key project member’s availability +- Key project member’s performance +- Key project member’s skills +- Dependencies include: + - Input of a valid Jupyter Notebook/Word Document file. + - A valid internet connection, to interact with OnTrack environment + - A Docker container must be created first before testing of Jupyter Notebook/Word Document + conversion can be tested. + - Approval of project expansion must be given before work on expansion begins + +## 3. System Features and Requirements + +### 3.1 Functional Requirements + +- Convert Jupyter Notebook files to PDF format +- Convert a Word Document to PDF format +- Compatibility with existing code + +### 3.2 External Interface Requirements + +- nbconvert library +- Apache library +- Forked repositories +- User interface (interaction logic between software and user) + +### 3.3 System Features + +- Basic front-end user interface for user to trigger logic +- Ability to convert Jupyter Notebook file to PDF file +- Ability to convert Word document file to PDF file + +### 3.4 Non-functional Requirements + +- Usability – User standards +- Scalability – ability of software to be scaled to encompass project scope in its entirety +- Maintainability – ability of software to be maintained, ensuring consistent and upmost performance +- Reliability – The ability of the system to consistently perform its required functions under + stated conditions. +- Documentation – User documentation, testing results, meeting minutes and notes, contribution + notes, discussions. diff --git a/src/content/docs/products/ontrack/Documentation/Multiple Organisations/Design Documentation.md b/src/content/docs/products/ontrack/Documentation/Multiple Organisations/Design Documentation.md new file mode 100644 index 00000000..35787f5b --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Multiple Organisations/Design Documentation.md @@ -0,0 +1,141 @@ +--- +title: Design Document:OnTrack - Incorporating Multiple Organisati +--- + +Author: Sanah Quazi + +Company: Thoth Tech + +## Introduction + +This design document outlines the approach for incorporating multiple organisations into the OnTrack +server, enhancing its functionality to accommodate various organisations within a single system +instance. The goal is to provide a comprehensive solution that enables effective organisation +management, user assignment, and access control while maintaining the integrity and security of the +OnTrack system. + +## User Story + +As a Site administrator, I want to be able to manage multiple organisations within the OnTrack +system. This will allow me to efficiently organise users and data, ensuring that each organisation +operates independently. + +## Acceptance Criteria + +- Site administrators can create new organisations, providing details such as name and description. +- Organisations can be edited to update their details. +- Organisations can be disabled when they are no longer in use. +- Users can be associated with specific organisations. +- Users with access to multiple organisations can smoothly switch between them. +- Data access is restricted based on a user's associated organisation. + +## System Architecture + +## Frontend Architecture + +The frontend of the system incorporates the following components: + +- Organisation Management UI: This component allows administrators to create, edit, and disable + organisations. It includes a user-friendly interface for managing organisation details. +- User Management UI: Users are associated with organisations through this interface. It provides a + seamless experience for assigning users to organisations and managing user profiles. +- Organisation Switching UI: Users with access to multiple organisations can easily switch between + them using this interface. It ensures a smooth transition from one organisation's context to + another. + +## Backend Architecture + +The backend of the system handles data management and access control: + +- Organisation Management: Backend services manage the creation, editing, and disabling of + organisations. Data is stored securely in the database, and appropriate permissions are enforced. +- User Organisation Assignment: Backend processes allow site administrators to associate users with + specific organisations. These associations are maintained in the database. +- Access Control: The backend enforces access control rules to ensure that users can only access + data within their associated organisation. This is achieved through role-based access control + mechanisms where site administrator is a new role. + +## Technical Implementation- + +## Frontend Implementation + +Organisation Management UI: + +- Create user interfaces for creating, editing, and disabling organisations. +- Implement forms for entering organisation details. +- Ensure responsive design using modern frontend technologies. + +User Management UI: + +- Develop interfaces for assigning users to organisations and managing user profiles. +- Implement user-friendly features for easy association and disassociation of users with + organisations. + +Organisation Switching UI: + +- Create an intuitive interface for users to switch between organisations. +- Implement secure mechanisms for handling organisation context switches. + +## Backend Implementation + +Organisation Management: + +- Develop API endpoints for creating, editing, and disabling organisations. +- Implement data validation to ensure the integrity of organisation details. +- Ensure data is securely stored and updated in the database. + +User Organisation Assignment: + +- Create API endpoints for associating and disassociating users with organisations. +- Implement validation checks to prevent unauthorized assignments. +- Update user profiles to reflect organisation associations. + +Access Control: + +- Enforce access control rules based on user roles and organisation associations. +- Implement middleware to check permissions before granting access to data. +- Securely manage data queries to ensure isolation between organisations. +- The technical implementation aims to provide a seamless user experience while ensuring data + security and access control across multiple organisations. + +## Database Design + +The database design ensures that organisations can be efficiently managed, users can be associated +with organisations, and access control can be enforced based on these associations. The database +design for incorporating multiple organisations includes the following elements: + +- Organisations Table: Create a table named ‘organisations’ to store organisation-specific details. + +Columns: + +- organisation_id: Unique identifier for each organisation (primary key). +- name: Name of the organisation. +- description: Description of the organisation. +- Email: official email id of the organisation. +- is_enabled: Flag indicating whether the organisation is active or disabled. + +- Users Table: Update the existing ‘users’ table to include organisation_id as the foreign key. + +## Error Handling and Validation + +Robust error handling and validation mechanisms are essential for ensuring data integrity and user +satisfaction. Frontend and backend components should implement validation checks and provide clear +error messages to users. + +## Testing Strategy + +Testing is crucial to verify the functionality and security of the system. Both frontend and backend +components should undergo thorough testing to identify and address issues. + +## Deployment Plan + +The deployment plan outlines the steps for introducing the multiple organisations feature into the +OnTrack system, ensuring a smooth transition for users. + +## Conclusion + +The incorporation of multiple organisations into the OnTrack server is a significant enhancement +that enhances the system's flexibility and scalability. By following the design outlined in this +document and implementing it effectively, OnTrack will provide a powerful solution for managing +multiple organisations while maintaining data security and access control. This design document +serves as a roadmap for achieving these goals and delivering a feature-rich, user-friendly system. diff --git a/src/content/docs/products/ontrack/Documentation/Multiple Organisations/Gather requirements for multiple organisations.md b/src/content/docs/products/ontrack/Documentation/Multiple Organisations/Gather requirements for multiple organisations.md new file mode 100644 index 00000000..8b2f6206 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Multiple Organisations/Gather requirements for multiple organisations.md @@ -0,0 +1,132 @@ +--- +title: Incorporate Multiple Organisations on a Single OnTrack Server +--- + +**Author:** Sanah Quazi + +**Company:** Thoth Tech + +## Introduction + +This documentation outlines the requirements for implementing a feature that enables the +ncorporation of multiple organisations within a single OnTrack server. This feature aims to enhance +the administrative capabilities of the OnTrack application by allowing server operators to manage +and segregate multiple organisations efficiently. + +## User Story + +As an OnTrack server operator, I want to be able to host multiple organisations within my server. + +## Functional Requirements + +### Backend + +- Design a flexible organisational structure to accommodate multiple organisations. +- Develop functionality to create, edit, and disable organisations, including providing a unique + identifier for each organisation. +- Implement a new user role named "Site Administrator" with permissions to manage organisations, + including the ability to add, disable, and edit them. +- Enhance the user profile system to associate users with specific organisations and allow users to + switch between organisations. + +### Frontend + +- Design intuitive user interfaces for organisation creation, modification, and disabling. +- Create a dedicated dashboard for Site Administrators to manage organisations, including options to + add, disable, and edit organisations. +- Update user profile pages to display and allow modification of the associated organisation. + +## Non-Functional Requirements + +### Performance + +- Ensure that the system can handle a significant number of organisations and users without + compromising performance. +- Optimize database queries and access patterns to maintain responsive user experience even with + increased organisational complexity. + +### Reliability + +- Implement data isolation mechanisms to prevent cross-organisation data leaks or unauthorized + access. +- Apply robust error handling to prevent disruptions due to organisational changes. + +## Test Cases + +### Test Case 1:Organisation Creation + +Description: Verify the system allows the creation of a new organisation with a unique name and +identifier. + +### Steps + +- Log in as a Site Administrator. +- Navigate to the organisation creation page. +- Enter a unique organisation name and identifier. +- Submit the form. + +### Expected Outcome + +The organisation is created, and its details are stored in the database. + +### Test Case 2: Organisation Management + +### Description + +Verify the Site Administrator can edit organisation details. + +### `Steps + +- Log in as a Site Administrator. +- Access the organisation management dashboard. +- Select an organisation to edit. +- Modify organisation details and save changes. + +### `Expected Outcome + +Organisation details are updated and reflected in the system. + +### Test Case 3: User Organisation Assignment + +### `Description + +Verify users can be associated with specific organisations. + +### Steps` + +- Log in as a user. +- Access the user profile page. +- Choose an organisation to associate with. +- Save changes. + +### Expected Outcome`` + +The user is now associated with the selected organisation. + +### Test Case 4: Access Control\*\* + +Description: Verify users can access only the resources within their organisation. + +### Steps`` + +- Log in as a user from Organisation A. +- Attempt to access resources belonging to Organisation B. + +### `Expected Outcome`` + +Access is denied, and the user can only access resources within their own organisation. + +### Testing`` + +- Perform unit testing on each component, ensuring that organisation-related functionalities work as + expected. +- Conduct integration testing to ensure smooth interaction between different parts of the system. +- Implement user acceptance testing involving Site Administrators and regular users to validate the + feature's usability and correctness. + +## Conclusion + +In conclusion, the incorporation of multiple organisations within a single OnTrack server brings a +significant enhancement to the application's administrative capabilities. By following the outlined +requirements and test cases, this feature will enable server operators to effectively manage and +segregate various organisations, ensuring a more streamlined and organised user experience. diff --git a/src/content/docs/products/ontrack/Documentation/Multiple Organisations/Test Scenario Requirements.md b/src/content/docs/products/ontrack/Documentation/Multiple Organisations/Test Scenario Requirements.md new file mode 100644 index 00000000..8854e853 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Multiple Organisations/Test Scenario Requirements.md @@ -0,0 +1,232 @@ +--- +title: Test Cases for Incorporating Multiple Organisations on OnTrack Server +--- + +**Author:** Sanah Quazi + +**Company:** Thoth Tech + +## Introduction + +This document outlines test cases for incorporating multiple organisations on the OnTrack server, +enhancing its functionality to accommodate various organizations within a single system instance. + +## Backend Functionality + +## Organisation Management + +Test Case 1: Creating an Organisation + +Description: Verify the system's ability to create a new organisation. + +Steps: + +1\. Log in as a Site Administrator. + +2\. Access the organisation creation feature. + +3\. Enter valid details for the new organisation (name, description). + +4\. Submit the form. + +Expected Outcome: A new organisation is created, and it appears in the list of organisations managed +by the Site Administrator. + +Test Case 2: Editing an Organisation + +Description: Test the ability to edit an existing organisation's details. + +Steps: + +1\. Log in as a Site Administrator. + +2\. Access the organisation editing feature. + +3\. Select an existing organisation. + +4\. Modify the organisation's details (e.g., description). + +5\. Save the changes. + +Expected Outcome: The organisation's details are updated, and the changes are reflected in the +system. + +Test Case 3: Disabling an Organisation + +Description: Verify the process of disabling an organisation. + +Steps: + +1\. Log in as a Site Administrator. + +2\. Access the organisation management feature. + +3\. Select an existing organisation. + +4\. Disable the organisation. + +Expected Outcome: The organisation is disabled and no longer accessible to users. It is removed from +active use but remains in the system for reference. + +## User Organisation Assignment + +Test Case 4: Associating a User with an Organisation + +Description: Test the capability to associate a user with a specific organisation. + +Steps: + +1\. Log in as a Site Administrator. + +2\. Access the user management feature. + +3\. Select a user. + +4\. Assign the user to an organisation. + +Expected Outcome: The user is associated with the chosen organisation, and their profile reflects +the change. + +Test Case 5: User Switching Between Organisations + +Description: Confirm that users can successfully switch between organisations when they have access +to multiple organizations. + +Steps: + +1\. Log in as a user associated with multiple organisations. + +2\. Access the organisation switch feature. + +3\. Select a different organisation to switch to. + +Expected Outcome: The user's context changes to the selected organisation, and they can access its +resources and functionalities. + +## Access Control + +## Data Access Based on Organisation + +Test Case 6: User Data Access Control + +Description: Ensure that users can access data only within their associated organisation and are +restricted from accessing data from other organisations. + +Steps: + +1\. Log in as a user from Organisation A. + +2\. Attempt to access resources belonging to Organisation B. + +Expected Outcome: Access to resources of Organisation B is denied for the user from Organisation A. + +Test Case 7: Site Administrator Data Access Control + +Description: Verify that Site Administrators can access data only from their organisation while +being restricted from accessing data outside their organisation. + +Steps: + +1\. Log in as a Site Administrator from Organisation A. + +2\. Attempt to access resources belonging to Organisation B. + +Expected Outcome: Access to resources of Organisation B is denied for the Site Administrator from +Organisation A. + +## Frontend Functionality + +## Organisation Management` + +Test Case 8: Frontend - Creating an Organisation + +Description: Verify the frontend functionality for creating a new organisation. + +Steps: + +1\. Log in as a Site Administrator. + +2\. Navigate to the relevant page for organisation creation. + +3\. Enter valid details for the new organisation (name, description). + +4\. Submit the form. + +Expected Outcome: A new organisation is created, and it is displayed in the list of organisations +managed by the Site Administrator. + +Test Case 9: Frontend - Editing an Organisation + +Description: Test the frontend capability to edit an existing organisation's details + +Steps: + +1\. Log in as a Site Administrator. + +2\. Navigate to the organisation editing page. + +3\. Select an existing organisation. + +4\. Modify the organisation's details (e.g., description). + +5\. Save the changes. + +Expected Outcome: The organisation's details are updated in the frontend, and the changes are +reflected in the system. + +Test Case 10: Frontend - Disabling an Organisation + +Description: Verify the frontend process for disabling an organisation. + +Steps: + +1\. Log in as a Site Administrator. + +2\. Access the organisation management feature. + +3\. Select an existing organisation. + +4\. Disable the organisation using the frontend interface. + +Expected Outcome: The organisation is visually disabled and no longer accessible to users via the +frontend. It remains in the system for reference. + +## User Organisation Assignment`` + +Test Case 11: Frontend - Associating a User with an Organisation + +Description: Test the frontend functionality to associate a user with a specific organisation. + +Steps: + +1\. Log in as a Site Administrator. + +2\. Access the user management feature from the frontend. + +3\. Select a user. + +4\. Assign the user to an organisation using the frontend interface. + +Expected Outcome: The user's association with the chosen organisation is visually represented in the +frontend, and their profile reflects the change. + +Test Case 12: Frontend - User Switching Between Organisations + +Description: Confirm that users can successfully switch between organisations via the frontend when +they have access to multiple organisations. + +Steps: + +1\. Log in as a user associated with multiple organisations. + +2\. Use the frontend organisation switch feature. + +3\. Select a different organisation to switch to. + +Expected Outcome: The user's context visually changes to the selected organisation in the frontend, +and they can access its resources and functionalities. + +## Conclusion + +These test cases cover both backend and frontend functionalities comprehensively to ensure that the +multi-organisation feature functions correctly and provides a seamless experience for the users. diff --git a/src/content/docs/products/ontrack/Documentation/Multiple Organisations/UML Design.md b/src/content/docs/products/ontrack/Documentation/Multiple Organisations/UML Design.md new file mode 100644 index 00000000..5338b526 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Multiple Organisations/UML Design.md @@ -0,0 +1,42 @@ +--- +title: Requirements to incorporate multiple organisations on a single OnTrack server – UML Design +--- + +Author: Sanah Quazi + +Company: Thoth tech + +![a]/(uml.png) + +The UML diagram presented above focuses on achieving efficient organisation management, user +association with organisations, and robust access control. It outlines the database structure for +accommodating multiple organisations, which consists of two main elements: + +Organisations Table: This table, labelled 'organisations,' is responsible for storing +organisation-specific information. It includes the following key columns: + +- organisation_id: This column serves as a unique identifier for each organisation and acts as the + primary key for this table. +- name: The 'name' column holds the organisation's name. +- description: In the 'description' column, you can find detailed descriptions of each organisation. +- email: This column stores the official email address associated with the organisation. +- is_enabled: The 'is_enabled' column is a flag that indicates whether the organisation is currently + active or disabled. + +Users Table: In addition to the 'organisations' table, the diagram illustrates an update to the +existing 'users' table. This update includes the addition of an organisation_id column, which serves +as a foreign key. This column establishes a link between users and their associated organisations, +allowing for efficient organisation assignment and access control enforcement. + +This database design is crucial for the successful implementation of the feature that enables +multiple organisations within the OnTrack system. It ensures data integrity and provides the +necessary structure for managing and securing organisational data. + +## The relationships between these classes are as follows + +- organisations to users: This association indicates a multiplicity of one-to-many (1..\*). It means + that each organisation in the 'organisations' table can be associated with zero to multiple users + from the 'users' table. +- users to organisations: This association specifies a multiplicity of one-to-one (1..1). It + signifies that each user in the 'users' table is uniquely associated with one organisation in the + 'organisations' table. diff --git a/src/content/docs/products/ontrack/Documentation/Voice Verification/Architecture-Document.md b/src/content/docs/products/ontrack/Documentation/Voice Verification/Architecture-Document.md new file mode 100644 index 00000000..9329f950 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Voice Verification/Architecture-Document.md @@ -0,0 +1,95 @@ +--- +title: Architecture Document | Voice Verification for OnTrack Delivery +--- + +## Introduction + +### Purpose + +This document provides a comprehensive architectural overview of the Voice Verification system, +using a few different architectural views to depict different aspects of the system. It is intended +to capture and convey the significant architectural decisions which have been made on the system. + +### Scope + +This Architecture Document provides an architectural overview of Voice Verification System. The +Voice Verification System is being developed to address the issues concerning contract cheating on +online learning management platforms. + +## Architectural Goals and Constraints + +### Goals + +- Students can register their voice on OnTrack using the Speaker Verification system. +- Upon task submission, the attached voice file is analysed for verification. +- Deployed on the OnTrack instance in a docker container format. +- Support for gathering both front and backend telemetry should be present in the system to allow + for analysis of user interaction, and system performance. + +### Constraints + +- Speaker Verification system must have compatibility for voice recording across multiple browsers. +- Front-end components should comply with existing OnTrack requirements. +- System should adhere to existing OnTrack privacy/compliance requirements in addition to existing + OnTrack security requirements. + +## Use-Case View + +### Architecturally Significant Use Cases + +![Figure 1: Architecturally Significant Use Cases](/Use%20Cases.png) + +1. As a student, I want Ontrack to have a function that can identifies me by my voice. + **Description:** The feature highlighted through this user story is having a "Enrol the + voiceprint". This feature allows a student to register a voiceprint for later verification + +2. As a student submitting my assignments, I want able to upload audio files to Ontrack. + **Description:** The feature highlighted through this user story is having a "Submit a voice + file”. This feature allows a student to submit an assignment audio to Ontrack System. +3. As a Deep Speaker Classifier, “I” can recognise student by their voice at a confidence level. + **Description:** The Deep Speaker Model is an actor involved within “Compare two audio samples” + which will automatically confirm student’s identity by comparing their new voice submission to + their voiceprint. This takes place within the Voice Verification Container. + +4. As a tutor/student, I want to receive the result of voice verification to be aware of the outcome + of the verification. **Description:** Voice Verification system will return/export the voice + verification result to the Tutor and Student (a confidence score of how likely it is that the + voice in the recording is the student in question) in a readable way. + +## Logical View + +### Architecture + +![Figure 2: High Level Architecture](/Architecture%20Diagram.png) + +### Detailed description of the architecture diagram + +The diagram shows the communication types between each of the systems of the project. The User +interacts with both the frontend website OnTrack and the voice verification system through a Ruby +app. The voice verification method used takes advantage of Deep Speaker. Deep Speaker is a deep +learning model that can be used to verify a user's identity by comparing their voice to a +voiceprint. The voice verification system is deployed in a docker container format. + +### General Flow diagram + +![Figure 3: General Flow Diagram](/Flow%20Diagram.png) + +The User has its requests go through the existing OnTrack system, with the OnTrack system sending +further requests to the Voice Verification API. The sends the voice files to the docker container. + +## Size and Performance + +The Size and Performance as of this stage cannot be calculated. However, the following information +should be recorded when the system has been developed: + +- Size of Voice Files for enrolment and verification. +- Response time for API calls +- Throughput of API calls + +## Quality + +The Quality of the system must be further measured. The required information is as follows: + +- Quality of Voice Validation results +- Testing of Voice Submissions (placing multiple speakers in the audio file, placing the speech at + different stage of the audio file) diff --git a/src/content/docs/products/ontrack/Documentation/Voice Verification/Audio System Interface Design.md b/src/content/docs/products/ontrack/Documentation/Voice Verification/Audio System Interface Design.md new file mode 100644 index 00000000..13a8d719 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Voice Verification/Audio System Interface Design.md @@ -0,0 +1,92 @@ +--- +title: Audio System Interface Design Document +--- + +## Author Information + +--- + +- Author: [agahis](https://github.com/agahis) +- Team: OnTrack – Voice Verification +- Team (Delivery and/or Product) Lead: [Shae Christmas](https://github.com/ShaeChristmas) + +## Document Summary + +--- + +- Documentation Title: Audio System Interface Design Document +- Documentation Type: Technical +- Documentation Information Summary: Design document detailing the implementation of the OnTrack + Voice Verification audio system interface, showcased by wire frames for frontend development. + Interface to allow tutors to see the results from the voice verification test with the new OnTrack + Overseer system as well. The perspective is from a tutors as they are the only ones who have + access to it. + +## Document Review Information + +--- + +- Date of Original Document Submission to GitHub: 26/09/2022 +- Documentation Version: 1.0 +- Date of Previous Documentation Review: 26/09/2022 +- Date of Next Documentation Review: to be decided + +## Key Links/Resources + +--- + +- [OnTrack Overseer Repository](https://github.com/thoth-tech/doubtfire-overseer) +- [OnTrack Web Repository](https://github.com/thoth-tech/doubtfire-web) +- [OnTrack API Repository](https://github.com/thoth-tech/doubtfire-api) +- [OnTrack Voice Verification Python Container Repository](https://github.com/thoth-tech/speaker-verification) +- [OnTrack Voice Verification API Repository](https://github.com/thoth-tech/speaker-verification-api) +- [Thoth Tech Documentation Template](https://github.com/thoth-tech/documentation/blob/main/docs/OnTrack/Documentation/OnTrack%20Documentation%20Template.md) +- [OnTrack Documentation Template Guide](https://github.com/thoth-tech/documentation/blob/main/docs/OnTrack/Documentation/OnTrack-Documentation-Template-Guide.md) +- [Software Requirements Specifications Document](https://github.com/thoth-tech/documentation/blob/main/docs/OnTrack/Voice%20Verification/Voice%20Verification%20SRS%20Document.md) + +## Contacts for further information + +--- + +See [Thoth Tech Handbook](https://github.com/thoth-tech/handbook/blob/main/README.md). + +## Low Fidelity Designs + +--- + +**Figure 1** below shows the initial sketches and brainstorming put into place for the tutors +interface when accessing the voice verification results. + +![figure 1](/figure1.jpeg) + +**Figure 2** below shows a digital draft design for the flowchart between the three different +results and visualisations shown in Figure 1. The visualisations are shown for the results and +similar conventions used for display. Branching off to the main processes that would subsequently +become an output from clicking on these results. + +![figure 2](/figure2.PNG) + +## High Fidelity Designs + +--- + +**Figures 3 and 4** below shows the process and results when the tutor clicks on an audio file. +These figures show files that are still pending. + +![figure 2](/figure3.PNG) + +![figure 3](/figure4.PNG) + +**Figures 5 and 6** below shows the process and results of when the tutor clicks on an verification +pending audio file. + +![figure 5](/figure5.PNG) + +![figure 6](/figure6.PNG) + +**Figures 7 and 8** shows the process and results of when the tutor clicks on an audio file that has +completed the Verification process. + +![figure 7](/figure7.PNG) + +![figure 8](/figure8.PNG) diff --git a/src/content/docs/products/ontrack/Documentation/Voice Verification/Voice Verification Design Document.md b/src/content/docs/products/ontrack/Documentation/Voice Verification/Voice Verification Design Document.md new file mode 100644 index 00000000..28adf164 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Voice Verification/Voice Verification Design Document.md @@ -0,0 +1,201 @@ +--- +title: OnTrack Voice Verification Design Document +--- + +## Author Information + +--- + +- Author: [ShaeChristmas](https://github.com/ShaeChristmas) +- Team: OnTrack - Voice Verification +- Team (Delivery and/or Product) Lead: Shae Christmas + +## Document Summary + +--- + +- Documentation Title: Voice Verification Design Document +- Documentation Type: Technical +- Documentation Information Summary: Design Document detailing implementation of Voice Verification + system in the OnTrack Project + +## Document Review Information + +--- + +- Date of Original Document Submission to GitHub: 14/09/2022 +- Documentation Version: 1.1 +- Date of Previous Documentation Review: 30/09/2022 +- Date of Next Documentation Review: to be decided + +## Key Terms + +--- + +CLI: Command Line Interface; Interacting with something through the terminal + +Docker Container: A small program contained inside a virtual machine. The containerisation program +used is called Docker. + +RabbitMQ: A message broker that allows for the communication between different programs. + +## Key Links/Resources + +--- + +- [OnTrack Overseer Repository](https://github.com/thoth-tech/doubtfire-overseer) +- [OnTrack Web Repository](https://github.com/thoth-tech/doubtfire-web) +- [OnTrack API Repository](https://github.com/thoth-tech/doubtfire-api) +- [OnTrack Voice Verification Python Container Repository](https://github.com/thoth-tech/speaker-verification) +- [OnTrack Voice Verification API Repository](https://github.com/thoth-tech/speaker-verification-api) + +## Contacts for further information + +--- + +See [Thoth Tech Handbook](https://github.com/thoth-tech/handbook/blob/main/README.md). + +## Related Documents + +--- + +- [Voice Verification Software Requirements and Specifications Document](Voice%20Verification%20SRS%20Document.md) + +## Delivery Description + +--- + +OnTrack as a platform allows for students to track assessments for enrolled subjects, and submit +their work once completed. Audio submissions have been a substitute for in-person discussions in +recent years. + +The OnTrack Voice Verification system aims to verify audio submissions, to ensure that the speaker +in the submission is the correct student. + +This system would be implemented inside the existing OnTrack Project, and integrated into OnTrack by +using the pre-existing audio submission system. + +## Problem Statement + +--- + +When submitting an assessment with an oral component, the student may take advantage of the OnTrack +audio submissions system. + +However, any audio file may be submitted through this system; it is not verified at any stage in the +current OnTrack implementation. Contract cheating or other methods of cheating could be used, and +would not be picked up by the system automatically. + +A possible method to cheat by taking advantage of the pre-existing system would be to pay someone +else to answer audio questions. As no verification process is taking place, tutors may not identify +that the person speaking is not the student who is being assessed. + +A verification system for testing audio submissions against a baseline audio sample would make this +type of cheating more difficult. + +The voice verification system would give a confidence in the speakers identity, which could then be +verified by an assessor if necessary. + +As such, this allows for greater verification of submissions, and ensuring that cheating using the +audio submission system can be minimised. + +## Current Works + +--- + +The current voice verification system is not linked to the OnTrack architecture. Instead, the system +is implemented as a Docker Container, that can accept audio inputs, and produces a confidence +variable with certainty of the speakers identity. + +At this stage, the system receives a known sample, and a new audio file. These must be manually +submitted to the container through the CLI. + +As such, a system to link the existing Docker container to the OnTrack system must be implemented +for automatic verification and display of results. + +## Design + +--- + +The Voice Verification Architecture uses similar to a system in place within OnTrack called OnTrack +Overseer. + +When an audio file is received in the database, a trigger is sent to the Message Queue system that +the Voice Verification architecture employs. This system uses RabbitMQ as a message queue, to send +files to be verified to the main Voice Verification container. This container uses Deep Speaker +verification to test the new file against the baseline file collected for that student. Then, the +confidence value appended to the message on the message queue, and saved in the database. + +After the confidence value is saved in the database alongside the file, this can be retrieved by the +system. This retrieval takes place when the file is requested for marking. + +### Architecture + +![Proposed Architecture of Voice Verification implementation](/Voice-Verification-Architecture-Diagram.png) + +### Data Formats + +The Voice Verification system uses similar data formats to the OnTrack system. The audio files are +stored in an SQLite database, attached to the OnTrack API. In the database, three new values are +appended to audio submissions: + +| Database Tag | Purpose | Possible Values | Example | +| ------------ | ---------------------------------------------------------------------------------------- | --------------- | ------- | +| `Verified` | To determine if the file has already been verified | Boolean | `True` | +| `Baseline` | To determine if this is the baseline file to verify new submissions | Boolean | `False` | +| `Confidence` | Returned confidence values from verification. Number between 0-1. 0 if not yet verified. | Real | `0.87` | + +These values are appended to the existing documents in the SQLite Database. + +### Data Flow + +The messages in the Voice Verification Message Queue should follow the same structure as the OnTrack +Overseer Message Queue. Requests to the database have the following parameters: + +- `task_id`: task associated with the submission +- `submission`: path to the submission zip file or folder +- `overseer_assessment_id`: id of the overseer message. used to keep track of individual + assessments. + +Messages to the Voice Verification system also contain a `baseline` parameter, which is the file +path to the baseline audio sample for that student. + +Messages from the Voice Verification system have the following parameters: + +- `task_id`: task associated with the submission +- `submission`: path to the submission zip file or folder +- `overseer_assessment_id`: id of the overseer message. used to keep track of individual + assessments. +- `confidence`: confidence value returned from the verification system +- `verification time`: when the verification was completed. + +These values are then appended to the existing documents in the SQLite Database. + +### User Interaction + +Ideally, students wont no interaction with the verification system. Once an audio file has been +submitted, it is automatically be queued for verification. Once verified, the assessor can listen to +the audio submission, and view the confidence value. + +### Testing + +Testing for the implemented system would must include the following strategies: + +- Validation of files with the same speakers. +- Verification of files with different speakers. +- Verification of files with multiple different speakers. +- Verification of files with no speakers. + +Additionally, other methods of bypassing the system should be investigated. This would include +testing database security; more specifically where the validation results are stored. + +Finally, testing different values for confidence thresholds would allow for more refined use of the +voice verification system. + +## Success metrics + +--- + +To measure the success of the system, a Confusion Matrix should be generated to determine the false +positive and false negative rate of the system. As results would be validated by an assessor, this +information can be tracked per assessor, and collated for review. diff --git a/src/content/docs/products/ontrack/Documentation/Voice Verification/Voice Verification SRS Document.md b/src/content/docs/products/ontrack/Documentation/Voice Verification/Voice Verification SRS Document.md new file mode 100644 index 00000000..5b21046b --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Voice Verification/Voice Verification SRS Document.md @@ -0,0 +1,146 @@ +--- +title: Software Requirements Specifications Document +--- + +### Voice Verification for OnTrack Delivery + +## Product Purpose + +The purpose of the Voice Verification System for OnTrack is to add the ability for Voice Samples +that are submitted to OnTrack to undergo a verification process to ensure that the speaker in the +sample is the same as the person taking part in the unit. Specifically, this is to identify when a +student is contract cheating, or if the person in the specific submission is also the person +undertaking the unit. + +The intended audience for this project is the users of OnTrack; both students for using the system +to submit and verify their own audio files, as well as Tutors, who would be able to see the results +of the verification and verify that the student has undertaken the task themselves. + +The systems intended use is for the verification of Audio files that are submitted as part of Deakin +assessments to OnTrack, to further verify that the student has done the work themselves and is not +taking part in cheating; more specifically, to verify that the student has not hired someone else to +do the task for them, as is the case with Contract Cheating. + +The ccope of the project is to verify and validate a Python Container that can compare two voice +samples and give the confidence level that the person speaking is the same in both voice samples. +This requires a deployment to a testing system, as well as deployment to the OnTrack staging +platform for Thoth Tech. + +## Description of overall System + +## User requirements + +The user requirements of the system are that the system needs to be usable by both Students and +Tutors. These requirements include: + +- Ability to submit voice files for Enrolment and Verification +- Attainment of results for Students and Tutors to show the validity of the voice file in the + context of the assessment. +- Ease of use +- Secure system + +These requirements are mainly focused on the user experience, and how the user will interact with +the system. + +## Assumptions and Dependencies + +This system has a few assumptions. These include: + +- Users has access to OnTrack and a valid internet connection + +- Students do submit an enrolment voice file for later comparison. +- Tutors use the system whenever a voice submission is required. +- The same person is speaking throughout the entirety of the voice files. + +Each of these assumptions is important for the use and requirements of the system. The system should +be able to deal with multiple requests in quick succession, be actively deployed to the OnTrack +System, and have strict requirements for the initial voice file. + +Furthermore, a few different aspects are relied upon for the project to function. These include: + +- OnTrack as a deployment platform +- Deployment of the full connected system (OnTrack, plus API, and the Python Container) + +These assumptions are that OnTrack is used as the deployment platform for the voice verification +system, mainly as this is where it is being more properly integrated and developed for. +Additionally, for OnTrack to function correctly, the full system (Frontend and API) needs to be +deployed and using the Python Container effectively. + +## System Requirements + +## Functional Requirements + +The functional requirements of the system are as follows: + +- The system should be able to accept an enrolment voice file for later comparison. +- The system should be able to accept a new voice file to validate against the enrolment file. +- The system should return readable results to the users (Both Student and Tutor). + +## Interface Requirements + +The interface for the system will be entirely within the OnTrack platform. As such, it will have the +following requirements: + +- The system's interface should be following the same format and design as other sections of the + OnTrack Platform. +- The system should be easy to use for both Tutors and Students. +- The system should return results in a readable way and be clear about the results of the + verification. + +## Hardware Interfaces + +This project is completely software based. + +## Communication Interfaces + +A basic internet connection is required to view the site. + +## Software Interfaces + +The speaker verification system includes the following components: + +- A Python library for audio file validation (Python 3.8) +- Speaker Verification API: contain the backend RESTful API implemented in Django and Python +- Doubtfire and Speaker Verification Integration: Ruby app that integrates the Speaker Verification + API with OnTrack (Doubtfire LMS) via RabbitMQ queue +- Docker-compose: contain the most likely setup for development setups + +## System Features + +The system mainly focuses on the verification of voice files. As such, the features of the system +are as follows: + +- The system will accept voice files for the enrolment of a student in a Unit. +- The system can accept new voice files to verify that the same student is speaking in both files. +- The system will compare two voice files and produce a confidence rating, outlining how confident + it is that the speaker is the same in both voice files. +- The system will return the results to the Tutor and Student to ensure that the users are aware of + the outcome of the verification. + +## Non-functional requirements + +The non-functional requirements of the system largely revolve around the data storage and security +of the system. These include: + +- The system will only keep track of Enrolment files, for later verification use. +- The system will not store voice files for submission and verification. +- The system will be secure. +- The system should be easy to use. +- The system should be in line with other OnTrack systems. + +## Definitions, Acronyms, Abbreviations + +- Docker: a simple container that specify a complete package of components needed to run your + software, or an application build and deployment tool +- RabbitMQ: a message-queueing software also known as a message broker or queue manager. It is + software where queues are defined, to which applications connect in order to transfer a message or + messages. +- Python Library: a library is a collection of pre-written code in Python language that provide + further access to system +- Ruby On Rails: a server-side web application framework written in Ruby. +- Backend: development that happens behind the scenes, it is all the parts of a computer system or + application that is not directly accessed by the user, it is responsible for storing and + manipulating data through code (language use: Python, Ruby) +- Frontend: development on what the user can see and/or directly interact with (language uses: + Angular JS and TypeScript) +- API: Application Programming Interface diff --git a/src/content/docs/products/ontrack/Documentation/Voice Verification/Voice Verification User Design Document.md b/src/content/docs/products/ontrack/Documentation/Voice Verification/Voice Verification User Design Document.md new file mode 100644 index 00000000..47bcff8c --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/Voice Verification/Voice Verification User Design Document.md @@ -0,0 +1,111 @@ +--- +title: OnTrack Voice Verification User Document +--- + +## Author Information + +--- + +- Author: [Ha Nguyen](https://github.com/hantt-8) +- Team: OnTrack - Voice Verification +- Team (Delivery and/or Product) Lead: ShaeChristmas + +## Document Summary + +--- + +- Documentation Title: Voice Verification User Document +- Documentation Type: Documentation +- Documentation Information Summary: User Design Document detailing guide on Enrolment - How + Students can register their voice to Voice Verification System + +## Document Review Information + +--- + +- Date of Original Document Submission to GitHub: 28/09/2022 +- Documentation Version: 1.0 +- Date of Previous Documentation Review: 28/09/2022 +- Date of Next Documentation Review: to be decided + +## Key Terms + +--- + +A voiceprint is another way to use your unique features to identify who you are, similar to a +fingerprint. + +## Key Links/Resources + +--- + +- [OnTrack Overseer Repository](https://github.com/thoth-tech/doubtfire-overseer) +- [OnTrack Web Repository](https://github.com/thoth-tech/doubtfire-web) +- [OnTrack API Repository](https://github.com/thoth-tech/doubtfire-api) +- [OnTrack Voice Verification Python Container Repository](https://github.com/thoth-tech/speaker-verification) +- [OnTrack Voice Verification API Repository](https://github.com/thoth-tech/speaker-verification-api) + +## Contacts for further information + +--- + +See [Thoth Tech Handbook](https://github.com/thoth-tech/handbook/blob/main/README.md). + +## Related Documents + +--- + +- [Voice Verification Software Requirements and Specifications Document](Voice%20Verification%20SRS%20Document.md) +- [Voice Verification Design Document](https://github.com/thoth-tech/documentation/blob/6354f1f7e1a161d865d408d9d263c36c2e2e73aa/docs/OnTrack/Voice%20Verification/Voice%20Verification%20Design%20Document.md) + +## Delivery Description + +--- + +The OnTrack Voice Verification system allows student to enrol their voice and use their voice print +to verify their identity when discussing or submitting works + +This system would be implemented inside the existing OnTrack Project, and integrated into OnTrack by +using the pre-existing audio submission system. + +Voice Verification system has two phases: + +- Enrolment - Student's voice is recorded and specific voice features are extracted into a voice + print. + +- Verification - Student's audio submission is compared against a previously created voice print. + +## Main Process + +![Proposed how voice verification system work](/Voice-Verification-Overview-Process.png) + +- Verified: The audio file passed a certain confidence value and concluded as same person +- Unverified:The audio file is under a confidence value range and concluded as not a same person +- Pending: The audio is pending/in awaiting queue for comparing + +## Constraints + +--- + +1. Login to OnTrack site as an Deakin student +2. Allow browser use device's microphone +3. Speaking language: English +4. The voice must be between three seconds and one minute +5. The volumes must not exceed 5 MB +6. Supported file types: .wav, mp3, m4a, .flac (now the voice system only accepts .flac type files) + +Tips: Speak at a normal cadence and clearly. + +## Detailed Process + +### Voice Enrolment Check Flow + +![Voice Enrolment GUI](/Voice-Enrolment-Process-Flow.png) + +### Voice Enrolment GUI + +![Voice Enrolment GUI](/Voiceprint-Enrolment-GUI.png) + +## References + +[Speaker Verification Enrolment Flow Example](https://techdocs.audiocodes.com/voice-ai-connect/Content/VAIG_Combined/speaker-verification.htm#:~:text=Each%20speaker%20recognition%20system%20has%20two%20phases%3A%20Enrollment,is%20compared%20against%20a%20previously%20created%20voice%20print.) diff --git a/src/content/docs/products/ontrack/Documentation/deployment/Deployment Epic.md b/src/content/docs/products/ontrack/Documentation/deployment/Deployment Epic.md new file mode 100644 index 00000000..cc593f10 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/deployment/Deployment Epic.md @@ -0,0 +1,77 @@ +--- +title: Deployment Epic +--- + +## Background + +A live implementation of the OnTrack platform is accessible through Deakin University and other +organisations around the world. Currently, there is no separately hosted platform for Thoth Tech's +code implementation to operate on. + +## Business Value + +Now that Thoth Tech has been established and development work on OnTrack will start to increase, we +need a Thoth Tech hosted deployment of OnTrack. This will provide greater freedom to develop OnTrack +to the evolving vision of the company. + +## In scope + +- Thoth Tech Ontrack deployment to Google Cloud +- Documentation of deployment +- CI/CD Pipeline +- Documentation of pipeline +- Authentication +- Documentation of authentication + +## Out of scope + +New features + +## What needs to happen + +The deployment team will need to create an employee-run/hosted version of OnTrack to Google Cloud, +which will be separate to the Deakin version. This will be completed by three teams, which will all +be working together to migrate to google cloud, build a CI/CD pipeline, and create the +authentication for the platform for students. + +- Thoth Tech Ontrack deployment to Google Cloud +- CI/CD Pipeline built +- Add LDAP server option +- Extend API with user management +- Provide password management for LDAP and database implementations. + +## Assumptions / Dependencies + +- All functions will be working when OnTrack is migrated to student version +- The deployment won’t create any additional security risks + +## Analytics Considerations + +N/A + +## Reg & Compliance Considerations + +- Storage and privacy of user’s data +- Security +- Retention policy + +## Operations/Support + +Team members may need training/upskilling in technologies such as Google Cloud, Ruby on Rails, +Docker, etc. Members will also need testing skills to make sure all the new functionality works and +to be able to fix any bugs/problems. + +## What are the challenges? + +Team members have no existing code to work off, as this is new project that is being implemented +however they may be able to use the OnTrack deployment architecture as a guide. Team members may +have also not had the opportunity to work with the technologies they will be using for the +deployment of OnTrack to Google Cloud. + +## Acceptance criteria + +- Validate architecture and planning documentation with leadership +- CI/CD pipeline has testing, linting and security built into it +- Documentation is accurate to current version of products +- Thoth Tech deployment is successfully hosted on Google Cloud and functions as expected +- Allow for admins to change passwords (but cannot access passwords) diff --git a/src/content/docs/products/ontrack/Documentation/deployment/Index.md b/src/content/docs/products/ontrack/Documentation/deployment/Index.md new file mode 100644 index 00000000..5509017a --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/deployment/Index.md @@ -0,0 +1,27 @@ +--- +title: Google Cloud - Documentation Index +--- + +## [Overview](Overview.md) + +Google Cloud team's overview and high-level documentation. + +## [Research & Findings](/google-cloud-research.md) + +Google Cloud team's research and findings - + +- Aims +- Findings +- Learnings +- Outcomes +- References +- Links + +## Links + +- [GitHub repo for Thoth-Tech/Doubtfire-deploy](https://github.com/thoth-tech/doubtfire-deploy) +- [GitHub repo for Thoth-Tech/Doubtfire-deploy/DEPLOYING.md](https://github.com/thoth-tech/doubtfire-deploy/blob/main/DEPLOYING.md) +- [Trello board for Deployment - Google Cloud epic](https://trello.com/b/dI1yx9A1/deployment) +- [GitHub repo for Thoth-Tech/Doubtfir-deploy-GCP](https://github.com/thoth-tech/doubtfire-deploy-GCP) +- [Miro for Google Cloud - Doubtfire](https://miro.com/app/board/uXjVO0h8ZSE=/?share_link_id=62396987373) +- [Miro for Google Cloud - CI/CD](https://miro.com/app/board/uXjVO64xoQw=/?share_link_id=57734801709) diff --git a/src/content/docs/products/ontrack/Documentation/deployment/Overview.md b/src/content/docs/products/ontrack/Documentation/deployment/Overview.md new file mode 100644 index 00000000..1190c8d6 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/deployment/Overview.md @@ -0,0 +1,144 @@ +--- +title: Google Cloud - Overview +--- + +[Overview](#overview) + +[Initial stages](#initial-stages) + +- [Tests via localhost](#tests-via-localhost) +- [Google Compute Engine instance](#google-compute-engine-instance) +- [Deploying OnTrack](#deploying-ontrack) + +[Next stages](#next-stages) + +[Links] (#links) + +[Assets] (#assets) + +## Overview + +The Google Cloud team's main deliverable for the project is to deploy a student- run version of +OnTrack which is hosted on Google Cloud Platform (GCP). The goal is for Thoth Tech to have their own +deployment to develop OnTrack that is separate to Deakin's deployment. + +![Google Cloud - Doubtfire](/GoogleCloud_Doubtfire.jpg "Google Cloud - Doubtfire") + +The Google cloud team have deployed a functional instance of Doubtfire (also known as OnTrack) +hosted on GCP. + +Our GCP project is centrally managed by Deakin IT where the team have been granted access using our +Deakin Google Workspace accounts. + +- GCP Project Name: sit-22t1-ontrack-deplo-d026375 +- GCP Project ID: sit-22t1-ontrack-deplo-d026375 + +In Google Compute Engine, we have created server instance running Linux (Centos 7.x). The instance +is a small, initial footprint that has a publicly facing network and accessible over the internet +via HTTPS (port 443). + +We have used the source code from the Thoth Tech repository for the deployment into GCP, where we +used docker compose to deploy the images for the components required to run Doubtfire (api server, +app server, doubtfire-web, mariadb, nginx). + +## Initial stages + +Initially, the Google Cloud team had spent time understanding GCP, Docker, and the Doubtfire +deployment. + +### Tests via localhost + +Prior to deploying to GCP, we ran several tests locally (localhost) on our own workstations to +determine the configuration changes required deploy Doubtfire successfully. On our individual +workstations, we cloned the [Doubtfire-deploy-GCP repository] + and modified the necessary files. We then used +docker compose and Docker to run and deploy containers. + +![doubtfire-localhost-compose](/doubtfire-localhost-compose.png "docker compose output") + +Success! We have Docker containers running locally. + +![doubtfire-localhost-docker](/doubtfire-localhost-docker.png "Docker containers running") + +Success again! We have OnTrack being hosted locally and is accessible via . + +![doubtfire-localhost](/doubtfire-localhost.png "Doubtfire running on localhost") + +### Google Compute Engine instance + +Once we determined the configuration changes required to be able to run locally (localhost), we then +needed to determine how to create and deploy a Compute Engine server instance in GCP that we could +use to deploy Doubtfire. + +We started with a small, initial footprint and deployed a basic virtual machine (VM) instance with +following details; + +- Name: instance-1 +- Zone: australia-southeast2-a +- Machine type: e2-micro +- CPU platform: Intel Broadwell +- OS Image: Centos 7 (Image name centos-7-v20220406) +- Boot disk: 20GB SCSI (Balanced persistent disk, Google-managed encryption) +- Network interfaces: nic0 (with internal & external IP addresses) +- Firewalls: HTTP, HTTPS enabled +- GPUs/Display device: None, disabled + +Once we had the instance up and running, we connected to the instance using command-line shell via +SSH. In the Google Cloud console, you can view the options to connect by clicking the drop-down menu +beside _Connect SSH_ on the instance view. + +![gcp-instance-connect](/gcp-instance-connect.png "Instance connection options") + +Alternatively, you can SSH to the instance via gcloud CLI - + +```shell +gcloud compute ssh --zone "australia-southeast2-a" "instance-1" --project "sit-22t1-ontrack-deplo-d026375" +``` + +There were a few packages that needed to be installed on the host, such as - + +- yum-utils +- yum-config-manager (required to setup docker-ce repo, see + [Docker docs](https://docs.docker.com/engine/install/centos/) for Centos) +- docker-ce, docker-ce-cli, containerd.io, docker-complose-plugin +- git +- openssl +- nano (optional) + +Once installed using `yum`, we had the minimum requirements to get started on the Doubtfire +deployment. + +### Deploying OnTrack + +From here, we pulled down the doubtfire-deploy repository, generated a new certificate and private +key for the host, and ran docker compose to deploy the containers for the OnTrack deployment. + +![gcp-instance-docker](/gcp-instance-docker.png "Instance running docker containers") + +And we can browse to OnTrack over the internet using our public IP address via HTTPS (port 443). + +![ontrack-login](/ontrack-login.png "OnTrack Login") + +## Next stages + +Since we have a functional and publicly accessible instance of Doubtfire running in GCP, the next +stages would be to focus on the Deployment team project objectives, such as - + +- Create a CI/CD pipeline that automates the building, deployment, and validation of the Thoth Tech + OnTrack deployment onto GCP. +- LDAP authentication for OnTrack. +- Email notifications configured with an SMTP server. +- Review security posture and instance sizing of the Thoth Tech OnTrack deployment in GCP. + +Here's a high-level diagram of using CI/CD pipeline to automate the deployment of OnTrack onto GCP - + +![Google Cloud - CI/CD](/GoogleCloud_CICD.jpg "Google Cloud - CICD") + +## Links + +- [GitHub repo for Thoth-Tech/Doubtfire-deploy-GCP](https://github.com/thoth-tech/doubtfire-deploy-GCP) +- [GitHub repo for Thoth-Tech/Doubtfire-deploy/DEPLOYING.md](https://github.com/thoth-tech/doubtfire-deploy/blob/main/DEPLOYING.md) +- [Trello board for Deployment - Google Cloud epic](https://trello.com/b/dI1yx9A1/deployment) +- [Miro for Google Cloud - Doubtfire](https://miro.com/app/board/uXjVO0h8ZSE=/?share_link_id=62396987373) +- [Miro for Google Cloud - CI/CD](https://miro.com/app/board/uXjVO64xoQw=/?share_link_id=57734801709) +- [Pull Request - OnTrack deployment on GCP](https://github.com/thoth-tech/doubtfire-deploy-GCP/pull/5) diff --git a/src/content/docs/products/ontrack/Documentation/deployment/Software Requirements Specifications Document.md b/src/content/docs/products/ontrack/Documentation/deployment/Software Requirements Specifications Document.md new file mode 100644 index 00000000..b50b74dd --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/deployment/Software Requirements Specifications Document.md @@ -0,0 +1,101 @@ +--- +title: Software Requirements Specifications Document +--- + +## 1.Introduction + +1.1 Product purpose + +Currently, there are three different product purposes within the deployment deliverable. The first +of which is the google cloud team, and their focus is creating a student-run / student-hosted +deployment of Ontrack separate from the Deakin Version. The second team is working on developing a +pipeline between the two versions of the OnTrack system, that will streamline development and +functionality. Lastly, the Enhance authentication team is working on creating new authentication +systems for students to access their OnTrack account. + +1.2 & 1.3 Intended audience / use + +The intended audience is both system admins and users of OnTrack. Both the google cloud and pipeline +team will focus on a product that intended for the use of product owners only, but the enhance +authentication team will focus on a product that both system admins and users can use, as system +admins will be able to reset students' passwords and Provide password management for LDAP and +database implementations. The product users will also have enhanced functionality with +authentication, as they will have new features which will allow them to create a new or obtain their +old password. + +1.4 Scope + +The scope of the project is to create an upgraded deployment of the OnTrack system, in which, the +system will be student-run/ hosted via google cloud, A pipeline build that will focus on version +control, acceptance testing, independent deployment and production deployment. Lastly, the inclusion +of a refreshed authentication system that will assist both product users and system admins of the +OnTrack system. + +## 2.Description of overall System + +2.1 User requirements + +The requirements below are what is needed for both system admins and product users. + +users + +- Ability to access and check my passwords, including previously used ones, and change + currentlyusing +- Assurance that the authentication solution is secure, so that my passwords and other information + is not publicly disclosed. +- An authentication solution to be reliable and respond swiftly, so that I can access my account as + needed and on-demand. +- Ability to reset my Ontrack password myself, so I don't need to contact a system administrator +- up-to-date version of OnTrack hosted on GCP so that I won't have to wait for the service to be + manually updated. + +System admin + +- Have user's passwords stored in a secure +- have a database that is easy and low costing to maintenance and easy to be consistent with future + add-ons +- in-house authentication solution developed that meets all our authentication needs +- Ability for students to reset their Ontrack password themself, so they don't need to contact a + system administrator +- access the OnTrack via a link to see what different developers have done. +- student hosted version of OnTrack, as it will make it easier to complete more tasks +- pipeline to be as simple and maintainable as possible +- generic deployment pipeline that can be changed in future + + 2.2 Assumptions and dependencies + +Assumptions and dependencies of the product user include: + +students will forget their password to OnTrack, students' passwords will be secure, students +will need to change their passwords, students will need a copy of their current password, system +will be able to deal with multiple password requests at once + +Assumptions and dependencies of the system admin include: + +Students will have the skillset to maintain a student deployed version of OnTrack, future iterations +will be made to the current system, system admins will need acceptance testing, students will have +the skillset to develop future iterations, system will handle multiple iteration updates at once + +## 3.System Requirements + +Google cloud + +- Allow dev ops engineer to deploy the docker container on Google cloud Platform. +- Allow access to OnTrack users via URL from anywhere. +- Allow OnTrack developers to package Doubtfire api and Doubtfire Web into the standalone + applications. + +Pipeline build + +- Allow for version control +- Allow for system admins to use acceptance testing +- independent deployment +- production deployment + +Enhance Authentication + +- Allow users to simply access and reset their passwords +- Allow administrator to send request to reset other users' passwords +- Securely manage user information and passwords +- Securely and accurately authenticate users +- Operates fully in-house and without third-party usage or dependencies diff --git a/src/content/docs/products/ontrack/documentation/front-end-migration/deploy-ontrack-using-docker/docker-compose-with-wsl2.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/Deploy OnTrack/docker-compose-with-wsl2.md similarity index 93% rename from src/content/docs/products/ontrack/documentation/front-end-migration/deploy-ontrack-using-docker/docker-compose-with-wsl2.md rename to src/content/docs/products/ontrack/Documentation/front-end-migration/Deploy OnTrack/docker-compose-with-wsl2.md index d64e3c1c..07e5a277 100644 --- a/src/content/docs/products/ontrack/documentation/front-end-migration/deploy-ontrack-using-docker/docker-compose-with-wsl2.md +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/Deploy OnTrack/docker-compose-with-wsl2.md @@ -73,9 +73,10 @@ sudo apt-get install net-tools (windows/linux installation) ## Converting WSL 1 Operating Systems to WSL 2 on Windows If you are using WSL1 You will need Windows 10 build 18917 or higher to be able to use WSL 2. Please -note, you will need to have the Powershell Administrator window up. If you are converting WSL 1 to -WSL 2 I’d assume you have Linux Subsystem for Windows installed. If not, the following command will -install it for you. +note, you will need to have the Powershell + +Administrator window up. If you are converting WSL 1 to WSL 2 I’d assume you have Linux Subsystem +for Windows installed. If not, the following command will install it for you. ```console Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux diff --git a/src/content/docs/products/ontrack/documentation/front-end-migration/deploy-ontrack-using-docker/docker-setup-tutorial.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/Deploy OnTrack/docker-setup-tutorial.md similarity index 93% rename from src/content/docs/products/ontrack/documentation/front-end-migration/deploy-ontrack-using-docker/docker-setup-tutorial.md rename to src/content/docs/products/ontrack/Documentation/front-end-migration/Deploy OnTrack/docker-setup-tutorial.md index c6f44c8c..8ce3fd35 100644 --- a/src/content/docs/products/ontrack/documentation/front-end-migration/deploy-ontrack-using-docker/docker-setup-tutorial.md +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/Deploy OnTrack/docker-setup-tutorial.md @@ -33,7 +33,8 @@ title: Docker Setup Tutorial ```console cd development docker compose up -d - docker compose run --rm doubtfire-api bash -c "bundle exec rails db:environment:set RAILS_ENV=development && bundle exec rake db:populate" + docker compose run --rm doubtfire-api bash -c "bundle exec rails db: + environment:set RAILS_ENV=development && bundle exec rake db:populate" ``` 5. Change into the development directory and use Docker Compose to setup the database. Run in the diff --git a/src/content/docs/products/ontrack/documentation/front-end-migration/deploy-ontrack-using-docker/setting-up-doubtfire.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/Deploy OnTrack/setting-up-doubtfire.md similarity index 100% rename from src/content/docs/products/ontrack/documentation/front-end-migration/deploy-ontrack-using-docker/setting-up-doubtfire.md rename to src/content/docs/products/ontrack/Documentation/front-end-migration/Deploy OnTrack/setting-up-doubtfire.md diff --git a/src/content/docs/products/ontrack/Documentation/front-end-migration/Framework/Angular_and_AngularJS.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/Framework/Angular_and_AngularJS.md new file mode 100644 index 00000000..39062c85 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/Framework/Angular_and_AngularJS.md @@ -0,0 +1,55 @@ +--- +title: Different between Angular and AngularJS +--- + +## Definition + +**AngularJS** is an open-source, JavaScript-based, front-end web application framework for dynamic +web app development. It utilizes HTML as a template language. By extending HTML attributes with +directives and binding data to HTML with expressions, AngularJS creates an environment that is +readable, extraordinarily expressive, and quick to develop. + +**Angular 2** is the blanket term used to refer to Angular 2, Angular 4 and all other versions that +come after AngularJS. Both Angular 2 and 4 are open-source, TypeScript-based front-end web +application platforms. + +**Angular 4** is the latest version of Angular. Although Angular 2 was a complete rewrite of +AngularJS, there are no major differences between Angular 2 and Angular 4. Angular 4 is only an +improvement and is backward compatible with Angular 2. + +## Angular JS vs Angular + +Angular uses TypeScript and has components as its main building blocks. It is component-based, +whereas AngularJS uses directives. + +Angular's operation employs a hierarchy of components, while AngularJS has directives that allow +code reusability. So, The AngularJS framework provides reusable components for its users. + +**Why Angular?** + +- It has a mobile support framework. +- The latest Angular version supports TypeScript and enables code optimization and modularity by + employing the OOPS concept. +- It supports the changes for an increased hierarchical dependencies system. +- A developer can use various features such as syntax for type checking, Dart, TypeScript, ES5, + iterators, Angular CLI, ES6, and lambda operators. +- Angular opts for semantic versioning that has a major-minor-patch arrangement. +- Amongst its best benefits is its provision for the event of simplest routing. +- Are you new to Angular? Check out the Angular tutorial here. + +**Why AngularJS?** + +- It's secure MVC (Model-View-Controller) data binding makes application performance dynamic. +- A developer can easily perform unit testing or change detection at any point. +- It provides several helpful features for web developers, like declarative template language with + HTML to allow them to make it more intuitive. +- The open-source framework allows well-structured front-end development. It doesn't require any + plugin or other platforms to work. +- The AngularJS application runs on Android and iOS phones and tablets. + +## Reference + +Simplilearn.com. (2018). AngularJS Vs. Angular 2 Vs. Angular 4: Understanding the Differences. +[online] Available at: + [Accessed 20 +Sep. 2022]. diff --git a/src/content/docs/products/ontrack/Documentation/front-end-migration/Migration/Create_Branch_and_Initial_Migration.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/Migration/Create_Branch_and_Initial_Migration.md new file mode 100644 index 00000000..c0a487b6 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/Migration/Create_Branch_and_Initial_Migration.md @@ -0,0 +1,120 @@ +--- +title: Create Brance and Initial Migration +--- + +> Trimester 3 2022 + +**IMPORTANT!!! Make sure you already deploy OnTrack locally following +[Docker Setup Tutorial](../Deploy%20OnTrack%20using%20Docker/Docker_Setup_Tutorial.md).** + +--- + +## Create Branch in your Repo + +--- + +```console +git checkout development # make sure you are on develop +git pull --rebase upstream development # sync your local develop with upstream's +develop +``` + +```console +git fetch origin +``` + +![fetch thoth](/fetch_thoth.png) + +```console +cd doubtfire-web +git checkout -b migrate/not-found +``` + +![create branch](/create_branch.png) + +When click into the branch, you should see the newly created branch. + +![vscode_change_branch_1](/vscode_change_branch_1.png) +![vscode_change_branch_1](/vscode_change_branch_2.png) + +```console +git remote -v +``` + +![git remote](/git_remote.png) + +## Initial Migration + +--- + +### **1. Create a typescript, scss (if exists), and html file** + +For the Task Description Card we had the files: + +- not-found.coffee +- not-found.tpl.html +- not-found.scss + +**In the same folder we can start by creating the following files:** + +- not-found.component.ts +- not-found.component.html +- not-found.component.scss + +Notice the naming convention. When migrating a component we use the format name.component.extension. +Add the start of the TypeScript using something based on the following: + +![Start of the TypeScript](/start_typescript.png) + +We can’t see any of these changes yet, but it is a good clean start so let’s commit this before we +move on. + +```console +git add . +git commit -m "build: create initial files for migration” +git push --set-upstream origin touth/migrate/not-found +``` + +Then we should make sure to push this back to GitHub so others can see our progress. As this is a +new branch you will need to set the upstram branch, but if you forget the `git push` will remind you +anyway. + +![Push to origin](/push_to_origin.png) + +Run checkout to see the change. + +```console +git checkout +``` + +![git checkout](/git_checkout.png) + +### **2. Linking New and Unlink Old Module** + +In the ./src/app you should see + +![Dependency Injection](/Dependency_Injection.png) + +Because we want to migrate AngularJS to Angular, therefore we need to unlink the module from +AngularJS and link to Angular. + +1. Delete the import from related module from (doubtfire-web/src/app.doubtfire-angularjs.module.ts) + - ![delete import](/delete_import.png) +2. Import the newly created TypeScript component + - ![import new TS](/Import_TS_component.png) +3. Downgrade the TypeScript Component from (doubtfire-web/src/app.doubtfire-angularjs.module.ts) + - ![Downgrade](/downgrade.png) +4. Import the new Component to Angular + - ![Import new component to Angular](/import_to_angular.png) +5. Add to the Ng Module + - ![Inject to Ng module](/import_to_ng_module.png) +6. Delete module injection if neccessary (parent_folder_name/parent_folder_name.coffee) + - ![Delete injection](/delete_injection.png) + +--- + +## **Congratulations** + +It is **DONE** for the initial migration. At this stage, you will need to upskill yourself about +TypeScript, Angular and AngularJS and working in the code base and read the document about Regular +Migration. Good Luck! diff --git a/src/content/docs/products/ontrack/Documentation/front-end-migration/Migration/Regular_Migration_Step.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/Migration/Regular_Migration_Step.md new file mode 100644 index 00000000..2e893379 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/Migration/Regular_Migration_Step.md @@ -0,0 +1,43 @@ +--- +title: You should do this after Create the Branch and Finish the Initial Migration +--- + +> Trimester 2 2022 – SIT374 + +## Ensure you have your author credentials set up + +You should ensure your git user config details are set to the email address you use with GitHub: + +```shell +git config --global user.email "my-github-email@gmail.com" +git config --global user.name "Freddy Smith" +``` + +## Workflow Summary + +**Step 1.** Set up for new feature branch: + +````shell +git checkout development # make sure you are on develop +git pull --rebase upstream development # sync your local develop with + upstream's develop +git fetch thoth +git checkout -b my-new-branch # create your new feature branch``` +```` + +**Step 2.** Make changes, and repeat until you are done: + +````shell +git add ... +git commit +git push # make changes, commit, and push to origin``` +```` + +**Step 3.** Submit a pull request and if unable to merge: + +```shell +git pull --ff upstream development # merge upstream's develop in your feature branch +git add ... +git commit # resolve merge conflicts and commit +git push origin # push your merge conflict resolution to origin +``` diff --git a/src/content/docs/products/ontrack/Documentation/front-end-migration/Migration/readme.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/Migration/readme.md new file mode 100644 index 00000000..ba879ee6 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/Migration/readme.md @@ -0,0 +1,10 @@ +--- +title: Steps For Migration +--- + +We have **two steps** for migration a component. + +## Steps + +1. [Create Branch](Create_Branch_and_Initial_Migration.md) +2. [Regular Commit](Regular_Migration_Step.md) diff --git a/src/content/docs/products/ontrack/Documentation/front-end-migration/Research & Findings/SpikeOutcome - Data Analytics.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/Research & Findings/SpikeOutcome - Data Analytics.md new file mode 100644 index 00000000..83a13a9a --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/Research & Findings/SpikeOutcome - Data Analytics.md @@ -0,0 +1,46 @@ +--- +title: Spike Outcomes +--- + +================== + +**Spike:** Spike_No + +**Title:** Data Analytics Spike + +**Author:** Dylan Sutherland, + +## Goals / Deliverables + +Summarise from the spike plan goal*Besides this report, what else was created ie UML, code, reports* + +- Data Analytics backlog on Trello + +## Technologies, Tools, and Resources used + +List of information needed by someone trying to reproduce this work\ + +- Internet Browser; Google Chrome, FireFox, Safari + +## Tasks undertaken + +List key tasks likely to help another developer + +- Engaged in Discussion with Andrew Cain +- Created a Trello backlog for the continued development of Data Analytics + +## What we found out + +The Data Analytics feature as it currently exists in OnTrack provides a limited set of +visualisations given the data available. The current visualisations are: Target Grade Pie Chart, +Task Status Pie Chart & Task Completion Box Plot. For the future development of Data Analytics, +although integrated visualisations will continue to play a key role in providing a quick overview of +the data, the ability to export the data to a third party tool such as Tableau or PowerBI will be a +key feature. This will allow for more complex visualisations to be created and for the data to be +analysed in more depth. The current visualisations will need to be migrated to the latest version of +Angular and maintained as they provide a quick overview of the data. One particular area where the +current visualisations are lacking is the ability to track interaction time such as tutor time to +provide task feedback, this is a key visualisation which could be added to the existing +visualisations. In parallel to extending the current visualisations, the requirements of the export +feature will be investigated including a questionnaire to understand the needs of Unit chairs and +tutors, before designing UML diagrams and implementing the feature. diff --git a/src/content/docs/products/ontrack/Documentation/front-end-migration/Research & Findings/Testing Decision.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/Research & Findings/Testing Decision.md new file mode 100644 index 00000000..2c9a053c --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/Research & Findings/Testing Decision.md @@ -0,0 +1,101 @@ +--- +title: What is the current state of testing? +--- + +In this issue, we will discuss the current state of testing and what tools are we proposing. While +there are some existing unit tests for components written in TypeScript, there are no existing unit +tests for the CoffeeScript components. Existing tests use Karma test runner integrated with Jasmine. +Currently, the ng test command (Runs unit tests in a project) and npm install are not working due to +dependencies issues, which are getting fixed. + +## Comparing different alternatives + +## Cypress + +## Pros + +-Selenium involves implementing browser drivers for the script to communicate with the web elements +on the page. -Cypress is used by both developers and QA engineers -In Cypress, there is no +additional IDE overhead. When you launch Cypress, it asks you to select an IDE to modify the test +script. -The Cypress framework produces more accurate results. It’s because Cypress has greater +control over the entire automation process. -Cypress instances respond in real-time to application +events and commands. -Cypress does not utilize WebDriver for testing or doesn't send the command to +the browser using a specific driver. If your language can someway be transpiled to JS, it can use +DOM events to send the click command to the button or such. This results in a much faster execution +of test results + +## Cons + +-Cypress is a test runner mainly focused on end-to-end tests. For unit testing, there are better, +faster alternatives. -Cypress is currently only supported for the Chrome, Firefox, Edge, Brave, and +Electron browsers. -As a result, Cypress is a less favoured option for cross-browser testing. -For +the building of test cases, it only supports the JavaScript framework. -Cypress doesn’t support +remote execution. + +## Selenium + +### \*Pros + +-Selenium is an Open Source Software. -Selenium supports various programming languages to write +programs (Test scripts) -Selenium supports various operating systems (MS Windows, Linux, Macintosh +etc...) -Selenium supports various Browsers (Mozilla Firefox, Google Chrome, IE, Opera, Safari +etc...) -Selenium supports Parallel Test Execution. -Selenium uses fewer Hardware resources. -Good +choice for ongoing regression testing and end to end testing. + +### \*Cons + +-No reliable Technical Support from anybody. -It supports Web-based applications only. -Difficult to +use, and takes more time to create Test cases. Takes more time to learn. -Difficult to set up Test +Environment when it compares to Vendor Tools like UFT, RFT, SilkTest etc... -Limited support for +Image Testing. -No Built-in Reporting facility. -Slow -Better choice for end-to-end testing than +unit testing. + +## Jest + +### -Pros + +-The biggest advantage of using Jest is minimal setup or configuration. -It comes with an assertion +library and mocking support -The tests are written in BDD style -You can put your tests inside of a +directory called tests or name them with a .spec.js or .test.js - extension, then run jest and it +works -Jest also supports snapshot testing + +### -Cons + +-Jest’s biggest weaknesses stem from being newer and less widely used among JavaScript developers. +-It has less tooling and library support available compared to more mature libraries (like Mocha). +-WebStorm didn’t even support running Jest tests. -Due to its young age, it may also be more +difficult to use Jest across the board for larger projects that utilize different types of testing. +-Slower due to auto mocking -Poor documentation + +## Karma + Jasmine + +### `Pros + +-When creating Angular projects using the Angular CLI, Jasmine and Karma are used to create and run +unit tests by default. -Karma is a test runner built by the angularJS to make TDD easy in Angular +Project Testing. -Karma is a JavaScript test runner that fits the needs of an AngularJS developer. +-Jasmine is compatible with almost every framework or library of your choice - The Jasmine BDD +library makes it easy to define tests, run them, and integrate them -Jasmine does not rely on any +JavaScript framework, DOM, or browsers. -We can run Jasmine tests in a browser ourselves by setting +up and loading an HTML file, but more commonly we use a command-line tool called Karma. -Karma +handles the process of creating HTML files, opening browsers and running tests and returning the +results of those tests to the command line. -If you use the Angular CLI to manage projects it +automatically creates stub Jasmine spec files for you when generating code. -It also handles the +Karma configuration, transpilation and bundling of your files -It offers clean and polished syntax. +-Jasmine provides a rich set of built-in matchers that can match expectations and add asserts to the +test cases + +## `Cons + +-Asynchronous testing can be a bit of a headache -js is required for running Karma -Expects a +specific suffix to all test files (\*spec.js by default) + +## Proposal + +Karma handles the process of creating HTML files, opening browsers and running tests and returning +the results of those tests to the command line. When using Angular CLI to manage projects it +automatically creates stub Jasmine spec files for you when generating code. On top of that, it is +already implemented in our code base. It goes well with our TDD approach. It will also be efficient +for unit testing and requires minimal configurations so that we can spend more time on coding and +quality testing itself. Additionally, there is also good online documentation and resources +available for training. diff --git a/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/ComponentReviewCreateUnitModal.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/ComponentReviewCreateUnitModal.md new file mode 100644 index 00000000..50e10e4e --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/ComponentReviewCreateUnitModal.md @@ -0,0 +1,54 @@ +--- +title: Component Review - Create unit Modal +--- + +## Student Name: Gaganjeet Singh + +## Student ID: 220032936 + +First select a component to review from the list below: + +[https://deakin365.sharepoint.com/:x:/r/sites/ThothTech2/Shared%20Documents/OnTrack%20-%20UI%20Enhancement/T3_2022/Management%20%5BT3_2022%5D/selected_task(revised).xlsx?d=wac02013da5224c958ac60fd96fac7b20&csf=1&web=1&e=UfCmZ5]() + +## Component Name + +\*\*\*\*./src/app/admin/modals/create-unit-modal/create-unit-modal.coffee + +File Name: create-unit-modal.coffee + +## Component purpose + +It is used to create a new unit + +## Component outcomes/interactions + +It creates a new unit. + +![existing modal](/Image/ComponentReviewCreateUnitModal.png) + +Currently, the modal had 2 text input fields unit code and unit name. In the new modal a 3rd dorp +down field is to be added, teaching period. + +So, in the updated modal the user provides the following: + +1. Unit Code +2. Unit Name +3. Teaching period + +New design sketch: Existing UI components are to be used for the input fields and button etc. + +![new modal sketch](/Image/ComponentReviewCreateUnitModal.png) + +Link to figma: +[here]() + +**Component migration Check list** – What is needs to be checked for this component to work once +migrated? + +[ ] ability to collect details from the user + +[ ] succeeds when data is valid + +[ ] handles errors - duplicate unit code in the teaching period, or invalid dates + +[ ] created unit is shown on success diff --git a/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/local_storage.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/local_storage.md new file mode 100644 index 00000000..1abd3c74 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/local_storage.md @@ -0,0 +1,46 @@ +--- +title: Ontrack Component review +--- + +## Student Name: Aryan Bagoria + +## Student ID: 22107150 + +First select a component to review from the list below: + +[https://deakin365.sharepoint.com/:x:/r/sites/ThothTech2/Shared%20Documents/OnTrack%20-%20UI%20Enhancement/T3_2022/Management%20%5BT3_2022%5D/selected_task(revised).xlsx?d=wac02013da5224c958ac60fd96fac7b20&csf=1&web=1&e=UfCmZ5]() + +## Component Name + +local-storage.coffee - doubtfire-web/src/app/config/local-storage/local-storage.coffee + +Relevant files: + +- `local-storage.component.ts` + +## Component purpose + +this component local-storage.coffee is used to configures 'localstorage' usage in the application + +![local-congig](/local-config.png) + +## Component outcomes/interactions + +Basically, this component is used to configure the "localstorage" usage, which is used to set up the +prefix on the key-value pair that gets stored in the web browser's local storage. for example: (user +id, email), (login time), and (credentials token). + +## Component migration plan + +As this is a non visual componet which just configures local-storage, so for that i will be creating +a new Typescript file local-storage.component.ts and remove the old local-storage.coffee file. + +**Component review checklist** – What is needs to be checked for this component to work once +migrated? + +once migrated we need to check whether the code compiles without any errors or warnings. + +## Discussion with Client (Andrew Cain) + +See if the component is still needed and present this document so Andrew can review if all the +outcomes and interactions are correct prior to the migration and build of this component. diff --git a/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/on-long-press.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/on-long-press.md new file mode 100644 index 00000000..4d4b0af9 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/on-long-press.md @@ -0,0 +1,50 @@ +--- +title: Ontrack Component review +--- + +## Student Name: Aryan Bagoria + +## Student ID: 221071501 + +First select a component to review from the list below: + +[https://deakin365.sharepoint.com/:x:/r/sites/ThothTech2/Shared%20Documents/OnTrack%20-%20UI%20Enhancement/T3_2022/Management%20%5BT3_2022%5D/selected_task(revised).xlsx?d=wac02013da5224c958ac60fd96fac7b20&csf=1&web=1&e=UfCmZ5]() + +## Component Name + +on-long-press - doubtfire-web/src/app/common/long-press/on-long-press.coffee + +Relevant files: + +- `on-long-press.component.ts` +- `on-long-press.coponent.html` +- `on-long-press.coponent.scss` + +## Component purpose + +this component on-long-press can detect when a user touches and holds a button for a certain amount +of time (600 milliseconds by default). When this happens it can trigger certain action.this +functionality can be added to any element as an attribute. + +## Component outcomes/interactions + +Basically, this component is used to trigger a special action that can be defined for any element +such as a button. This is useful for touch-based 、interfaces for example on mobile devices, where +holding down on an element can perform a specific action. + +## Component migration plan + +As this is a non visual componet that has a functionality to detect long presses which can be added +to any element as an attribute So I will be converting the old coffee file into .ts file and an html +file to create a button that uses the onLongPress directive to trigger a long press event. + +## Component review checklist + +What is needs to be checked for this component 、to work once migrated? + +once migrated we need to check whether the code compiles without any errors or warnings. + +## Discussion with Client (Andrew Cain) + +See if the component is still needed and present this document so Andrew can review if all the +outcomes and interactions are correct prior to the migration and build of this component. diff --git a/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/teching-period-breaks.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/teching-period-breaks.md new file mode 100644 index 00000000..0d861b30 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/teching-period-breaks.md @@ -0,0 +1,54 @@ +--- +title: OnTrack Component Review +--- + +## Team Member + +Matt Kinnia + +## Component + +`teaching-period-breaks` + +Relevant files: + +- `teaching-period-breaks.coffee` +- `teaching-period-breaks.tpl.html` + +## Component Purpose + +The purpose of the component is to display the breaks that have been registered against a teaching +period. It also allows the user to sort the list by different criteria. + +![teaching-period-breaks](/teaching-period-breaks.png) + +## Component Outcomes and Interactions + +The expected outcome of the component is to provide a user-friendly interface for managing breaks +registered against a teaching period, allowing the user to quickly find and view information about +specific breaks. + +Interaction occurs with the user through filtering and pagination controls. A button is clickable +which invokes the `CreateBreakModal` (which is out of scope for this review). + +The component takes in a `teachingPeriod` object where its properties are used to display +information in the user interface. + +## Component Migration Plan + +The migration plan is to review similar tabular based components that have already been migrated to +TypeScript and Material UI. + +For example, the `unit-students-editor` component. Based on this review, migrate the component in +such a way that is in line with the previous works to maintain consistency. + +`unit-students-editor` + +![unit-students-editor](/unit-students-editor.png) + +## Component Post-Migration + +The work required to migrate the component is now complete and the migrated component is shown +below. + +![teaching-period-breaks-migrated](/teaching-period-breaks-migrated.png) diff --git a/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/teching-period-details-editor.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/teching-period-details-editor.md new file mode 100644 index 00000000..50b7a616 --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/teching-period-details-editor.md @@ -0,0 +1,49 @@ +--- +title: OnTrack Component Review +--- + +## Team Member + +Matt Kinnia + +## Component + +`teaching-period-details-editor` + +Relevant files: + +- `teaching-period-details-editor.coffee` +- `teaching-period-details-editor.tpl.html` + +## Component Purpose + +The purpose of the component is to edit the details for a teaching period. It also allows the user +to update key properties of a teaching period, such as the name and length. + +![teaching-period-details-editor](/teaching-period-details-editor.png) + +## Component Outcomes and Interactions + +The expected outcome of the component is to provide a user-friendly interface for updating the key +properties of a teaching period. + +Interaction occurs with the user through a form which contains a series of text and date inputs. + +## Component Migration Plan + +The migration plan is to review similar form based components that have already been migrated to +TypeScript and Material UI. + +For example, the `edit-profile-form` component. Based on this review, migrate the component in such +a way that is in line with the previous works to maintain consistency. + +`edit-profile-form` + +![edit-profile-form](/edit-profile-form.png) + +## Component Post-Migration + +The work required to migrate the component is now complete and the migrated component is shown +below. + +![teaching-period-details-editor-migrated](/teaching-period-details-editor-migrated.png) diff --git a/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/teching-period-units.md b/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/teching-period-units.md new file mode 100644 index 00000000..e4513c3e --- /dev/null +++ b/src/content/docs/products/ontrack/Documentation/front-end-migration/UI Enhancement/teching-period-units.md @@ -0,0 +1,56 @@ +--- +title: OnTrack Component Review +--- + +## Team Member + +Matt Kinnia + +## Component + +`teaching-period-units` + +Relevant files: + +- `teaching-period-units.coffee` +- `teaching-period-units.tpl.html` + +## Component Purpose + +The purpose of the component is to display the units that have been registered against a teaching +period. It also allows the user to search for specific units, sort the list by different criteria, +and navigate to a unit detail view. + +![teaching-period-units](/teaching-period-units.png) + +## Component Outcomes and Interactions + +The expected outcome of the component is to provide a user-friendly interface for managing units +registered against a teaching period, allowing the user to quickly find and view information about +specific units. + +Interaction occurs with the user through filtering and pagination controls. Each table row is +clickable, which links to the unit detail page. A button is clickable which invokes the +`RolloverTeachingPeriodModal` (which is out of scope for this review). + +The component takes in a `teachingPeriod` object where its properties are used to display +information in the user interface. + +## Component Migration Plan + +The migration plan is to review similar tabular based components that have already been migrated to +TypeScript and Material UI. + +For example, the `unit-students-editor` component. Based on this review, migrate the component in +such a way that is in line with the previous works to maintain consistency. + +`unit-students-editor` + +![unit-students-editor](/unit-students-editor.png) + +## Component Post-Migration + +The work required to migrate the component is now complete and the migrated component is shown +below. + +![teaching-period-units-migrated](/teaching-period-units-migrated.png) diff --git a/src/content/docs/products/ontrack/Ontrack-setup/How to Run OnTrack with Ubuntu.md b/src/content/docs/products/ontrack/Ontrack-setup/How to Run OnTrack with Ubuntu.md new file mode 100644 index 00000000..af104157 --- /dev/null +++ b/src/content/docs/products/ontrack/Ontrack-setup/How to Run OnTrack with Ubuntu.md @@ -0,0 +1,137 @@ +--- +title: How to Run OnTrack with Ubuntu on an External SSD +--- + +## Requirements + +- A PC with Windows 10 installed. +- An external SSD with at least 64GB of storage. +- A USB drive with at least 8GB of storage. (Recommended) + +## 1. Download Ubuntu and Rufus + +- Download [Ubuntu](https://ubuntu.com/download/desktop) from the official website. +- Download [Rufus](https://rufus.ie/en/). + +## 2. Create a Bootable USB Drive + +1. Open Rufus. +2. Select the USB drive from the 'Device' dropdown. +3. Click the 'SELECT' button to choose the Ubuntu ISO (should be in your downloads folder). +4. Click the 'START' button at the bottom. + + ![Rufus Start](/rufus_screenshot.png) + +## 3. Prepare Booting + +1. Plug the USB or SSD into your PC. +2. Restart your PC and continually hit the boot menu key to open BIOS settings. + + ![Boot Keys](/bootkeys.png) + +3. There should be a list of boot options including Windows Boot Manager. Select the bootable USB + with the Ubuntu ISO. +4. The Ubuntu OS will load in portable mode from the USB. + +## 4. Install Ubuntu on External SSD + +1. After booting into Ubuntu you should be provided with the option to Try Ubuntu or Install Ubuntu. + Select Install Ubuntu. + + ![Ubuntu Boot Options](/ubuntu_options.png) + +2. If not prompted, open the "Install Ubuntu" application from the desktop. + + ![Ubuntu Desktop](/install_ubuntu.png) + +3. Proceed through the initial steps until you reach the "Installation type" step. +4. Choose the "Something else" option to manually configure partitions. +5. Identify the external SSD as a device like `/dev/sdb`. + + ![Installation Type](/installation_type.png) + +## 5. Partitioning + +1. Create the root partition: + + - Use as: Ext4 journaling file system. + - Mount point: / + - Tick the box to format. + + ![Root Partition](/root_partition.png) + +2. Click OK to start the installation. +3. Select your timezone. + +## 7. Deakin WiFi Setup (Optional) + +1. Connect to the Deakin Setup WiFi network. +2. It should launch this webpage in your browser. + + ![Deakin Setup Page](/deakin_setup_page.png) + +3. Click the JoinNow button to download the setup wizard. +4. Change directory into the `Downloads` folder in the terminal. + + ```shell + cd Downloads + ``` + +5. Enter the following command in the terminal to connect to the wifi network and follow the prompts + to enter your Deakin username and password. + + ```shell + sh SecureW2_JoinNow.run + ``` + + ![Deakin Setup Terminal](/deakin_setup_terminal.png) + +## 6. Install Additional Software + +1. After installation, open a terminal. +2. Install Git: + + ```shell + sudo apt install git + ``` + +3. Install Docker + + ```shell + sudo apt install docker.io + ``` + +4. Install vscode + + ```shell + sudo snap install --classic code + ``` + +## 7. Clone OnTrack Repository + +1. Clone the OnTrack repository (change `YOUR_USERNAME` to your GitHub username): + + ```shell + git clone --recurse-submodules git clone https://github.com/YOUR_USERNAME/doubtfire-deploy + ``` + +2. Open the `doubtfire-deploy` folder in vscode: + + ```shell + cd doubtfire-deploy + code . + ``` + +3. Run change remotes script in the integrated terminal to change the remote to your own repository. + + ```shell + ./change-remotes.sh + ``` + + and follow the prompts to enter your GitHub username. + +## 8. Run OnTrack + +1. After re-opening vscode, the script should automatically run and open the OnTrack application in + your browser. +2. Happy coding! diff --git a/src/content/docs/products/ontrack/Projects/Group_Task_Submission/Group_Task_Submission_doc.md b/src/content/docs/products/ontrack/Projects/Group_Task_Submission/Group_Task_Submission_doc.md new file mode 100644 index 00000000..78730c6a --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Group_Task_Submission/Group_Task_Submission_doc.md @@ -0,0 +1,118 @@ +--- +title: Design a way to improve the group Task submission - Documen +--- + +## Solution 1: Selecting Students Who Can Submit + +Solution 1 requires certain changes to be made in the frontend and backend which are described as +follows: + +## Frontend Changes + +- **User Interface Updates:** + +The frontend interface needs to be updated to allow instructors to select which students are +eligible to submit a particular task. This could involve adding a checkbox or similar UI element for +each student when creating or configuring a task. + +- **Task Submission:** + +The task submission process for students should include a check to determine if they are eligible to +submit based on the CanSubmitTask attribute. If they are not eligible, an appropriate error message +should be displayed. + +- **Task Status Display:** + +The frontend should display the submission status of each task, showing whether it has been +submitted or not. + +**Backend Changes:** + +- **Database Schema Updates:** + +The database schema needs to be updated to include the CanSubmitTask attribute in the User table. + +- **Task Submission Logic:** + +The backend logic for task submission should check the CanSubmitTask attribute of the user to +determine whether the submission is allowed. If allowed, update the SubmissionStatus attribute of +the associated task to "Submitted." + +- **API Endpoints:** + +New API endpoints might be needed to manage task submission eligibility, such as updating the +CanSubmitTask attribute for users. + +- **Data Validation:** + +Backend logic should validate that only eligible students can be associated with tasks when creating +or updating tasks. + +- **Error Handling:** + +Proper error handling and status codes should be implemented to handle cases where submission is not +allowed. + +- **Notifications:** + +Instructors may want to be notified when a student submits a task, or when a submission is rejected +due to eligibility. + +## Solution 2: Adding Password for Certain Students + +Solution 2 requires certain changes to be made in the frontend and backend which are described as +follows: + +## Frontend Changes`` + +- **User Interface Updates:** + +Modify the user interface to prompt students for their submission password when attempting to submit +a task. + +- **Task Submission Form:** + +Add a field for students to enter their submission password while submitting a task. + +- **Submission Validation:** + +Implement frontend logic to validate the submission password before allowing the task submission. +Display appropriate messages if the password is incorrect. + +## Backend Changes + +- **Database Schema Updates:** + +Update the database schema to include the SubmissionPassword attribute in the User and Task tables. + +- **Task Submission Logic:** + +Implement backend logic to compare the user's submitted password with the stored password. If they +match, update the SubmissionStatus attribute of the associated task to "Submitted." + +- **API Endpoints:** + +Create new API endpoints to handle the password validation during task submission. + +- **Data Validation:** + +Implement backend data validation to ensure that only eligible users with the correct password can +submit tasks. + +- **Error Handling:** + +Implement proper error handling for password validation and submission process. + +- **Notifications:** + +Consider implementing notifications to inform users about successful or unsuccessful task +submissions. + +- **Security Measures:** + +Implement secure password storage practices (such as hashing and salting) to protect user passwords. + +- **Password Management:** + +Provide a way for users to reset their submission password if needed and, ensure secure password +reset procedures. diff --git a/src/content/docs/products/ontrack/Projects/Group_Task_Submission/Group_Task_Submission_uml_design.md b/src/content/docs/products/ontrack/Projects/Group_Task_Submission/Group_Task_Submission_uml_design.md new file mode 100644 index 00000000..87cdbb01 --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Group_Task_Submission/Group_Task_Submission_uml_design.md @@ -0,0 +1,29 @@ +--- +title: Design a way to improve the group Task submission – UML design +--- + +## Solution 1: Selecting Students Who Can Submit + +In this solution, the system allows the instructor to specify which students are eligible to +submitthe group task. Each user (student) is associated with a task through a one-to-one +relationship, indicated by the "1" multiplicity on both sides of the association line. The +CanSubmitTask attribute is a boolean alue indicating whether a user can submit the task. The +SubmissionStatus attribute in the Task class reflects whether a task has been submitted or not. When +a user submits the task, the system checks the CanSubmitTask attribute to determine if the +submission is allowed. If allowed, the SubmissionStatus attribute of the task is updated to +"Submitted." If not, the submission is rejected. + +![solution](/Solution_1.png) + +## Solution 2: Adding Password for Certain Students + +In this solution, a password-based approach is used to control task submissions. Each user (student) +is associated with a task through a one-to-one relationship, indicated by the "1" multiplicity on +both sides of the association line. Each user has a unique SubmissionPassword attribute acting as a +password for task submission. Similarly, the Task class also has a SubmissionPassword attribute. +When a user attempts to submit a task, they need to provide their SubmissionPassword. The system +validates this password against the user's stored password. If the passwords match, the task is +considered submitted, and the SubmissionStatus attribute of the task is updated to "Submitted." +Otherwise, the submission is rejected. + +![solution](/Solution_2.png) diff --git a/src/content/docs/products/ontrack/documentation/numbas/Numbas Feasibility Check.md b/src/content/docs/products/ontrack/Projects/Numbas/NumbasFeasabilityCheck.md similarity index 95% rename from src/content/docs/products/ontrack/documentation/numbas/Numbas Feasibility Check.md rename to src/content/docs/products/ontrack/Projects/Numbas/NumbasFeasabilityCheck.md index ca9a7aef..26317c3c 100644 --- a/src/content/docs/products/ontrack/documentation/numbas/Numbas Feasibility Check.md +++ b/src/content/docs/products/ontrack/Projects/Numbas/NumbasFeasabilityCheck.md @@ -8,14 +8,14 @@ title: Project feasability study document **Ontrack**. -**Numbas feasibility check**. +## Numbas feasibility check -**Preamble**. +## Preamble The aim of this study is to check the feasibility of setting up or linking Numbas into Ontrack a live production environment running on Rails/Angular. -**Research information**: +## Research information For this project I have been reviewing several links and pages of information to ensure we take the correct direction. As well as to upskill to ensure I have the key skills required for this project. @@ -30,7 +30,7 @@ correct direction. As well as to upskill to ensure I have the key skills require [https://community.dataminer.services/information-security-research-unsafe-attribute-bindings-on-iframe-elements-in-angular/](https://community.dataminer.services/information-security-research-unsafe-attribute-bindings-on-iframe-elements-in-angular/) -**Outcome**. +## Outcome So after some research the two main ways we can approach this task is to embed an iframe, then later capture the test objecet and store it. @@ -41,7 +41,7 @@ natively. The second option initially looks more secure and longer to setup, I was concerned about iFrame from a security risk related to XSS, however it looks like in Angular 15 this was resolved. -**Plan**. +## Plan I will look at configuring both solutions and see which one performs best and gives us the best features moving forward. Hopefully by week 6 a have a trial version of both and make the final diff --git a/src/content/docs/products/ontrack/Projects/Numbas/NumbasProjectGuideline.md b/src/content/docs/products/ontrack/Projects/Numbas/NumbasProjectGuideline.md new file mode 100644 index 00000000..7fada546 --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Numbas/NumbasProjectGuideline.md @@ -0,0 +1,43 @@ +--- +title: Project guideline document +--- + +## Daniel Maddern + +## Project guideline – Numbas Integration to Ontrack + +## Aim + +The aim is to introduce Numbas tests into the Ontrack platform, to ultimately save these results in +the Database. + +The first part of the project will be to enable the creation and use of a Numbas test, without +storing the data, then time dependent we will look at enhancing this to saving the data to the +backend and a means to access that information. + +## Key Outcomes + +- Feasibility report of product – Check how this can be achieved and the potential problems with the + possible solutions. +- Front end integration to either host or link an existing numbas test for students to complete. +- Back-end configuration to store the numbas test +- Security check of the component + +## Delivery Time frames + +I will be aiming to have the feasibility report and the Front end integration working to a standard +of production by the end of T1 2023. + +We will be aiming for Back end configuration and storing of tests by the end of T2 2023. + +## Team Members + +Product : Ontrack + +Deliver Lead – Daniel Maddern + +Team Members – TBA + +Skills required: + +Angular, Ruby on Rails, API integration/Package installation. diff --git a/src/content/docs/products/ontrack/Projects/Numbas/ProjectSignOffNumbas.md b/src/content/docs/products/ontrack/Projects/Numbas/ProjectSignOffNumbas.md new file mode 100644 index 00000000..38f8f7b7 --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Numbas/ProjectSignOffNumbas.md @@ -0,0 +1,90 @@ +--- +title: Project Name:Numbas Integration +--- + +## Delivery Lead: Daniel Maddern + +## Student Name: Daniel Maddern + +## Clients: Julien, Andrew, Jake + +## **Scope** + +The purpose of this project is to integrate Numbas testing into Ontrack. With the aim for a test to +be presented to the student on submission of a task, prior to submitting reflections or other +required documents. The aim is o be able to let the Unit Chair import, setup and assign tests to the +tasks. Also for students to be able to complete tests as part of the submission process. + +## **Outcomes** + +This project will be deliverying: + +- A project scope for the clients to sign off on. +- A feasiblity study of the ways this can be implemented. +- A rough design document including: + - Rough hand drawn design documents for how this intergration will work. + - A data flow diagram of how different data will be accesssed and encapsualted. + - Diagrams showing model changes to the core model + - Backend coding changes to accomodate and store the tests. + - Front end code to support the changes from the Unit chair and student view. +- Unit tests to ensure features work as expected + +## **Delivery** + +### Features + +- Deliverables + - Design document - sketches of new UI, model changes, API changes + - Web and API changes +- Features + - Unit chairs can upload Numbas tests to a task definition + - Unit chairs can validate that the test works + - Unit chairs can set the required pass level for the test + - Unit chairs can set the number of attempts before test needs to be reset by a tutor + - Unit chairs can set the delay between attempts to be a set number of minutes, or a built-in + increasing delay + - Students are required to pass the test before they can submit work for feedback + - Students can view their test attempts (can unit chairs disable this?) + - Tutors can view student test attempts + - Tutors can reset student tests to enable additional attempts - or require resit on resubmission + - Test results are included in the portfolio when generated + +There will need to be a means to upload the test files that are created locally via Numbas. An +Addtional window after "requesting feedback" on a task that will present the test, this will then +either take you to the next stage if you pass or go back to the task screen if you do not pass. + +There will need to be a configuration section within the Unit chair task setup page. + +We will provide different options for the test setup such as: + +1: Restricted / Unlimited test attempts 2: Delays in test attempts - minutes, or built-in +increamenting delay + +We will also need to either enable or disable a test. + +**Student View** ![StudentView](/StudentView.jpg "Student View Design") + +**Unit Chair View** ![UnitChair](/UnitChair.jpg "Unit Chair Design") + +**Data Flow Design** ![DataFlow](/DataFlow.jpg "Data Flow Design") + +In terms of the changes we will require, we will need a new table in the DB to store the tests. + +We will need to create a new API and model to transfer the test data between the front and the back +end. + +We will need to create a new service and model in Angular to accomodate this, we will also need to +adjust the existing services such as Unit/Tasks to include the test objects for a student user. + +Then we will need to create a new componente for taking the test, as well as adjust the Unit Chair +Task Setup component to include the new settings as per the design above. + +## **Sign Off:** + +Delivery Lead Signature: +\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ + +Team Member Signature: +\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ + +Client Signature: \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ diff --git a/src/content/docs/products/ontrack/Projects/Numbas/ProjectSignOffTemplate.md b/src/content/docs/products/ontrack/Projects/Numbas/ProjectSignOffTemplate.md new file mode 100644 index 00000000..2407a9a5 --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Numbas/ProjectSignOffTemplate.md @@ -0,0 +1,36 @@ +--- +title: Project Documentation Template +--- + +## Delivery Lead: \<\\> + +## Student Name:\<\\> + +## Student ID: \<\< Student ID\>\> + +## Client: \<\\> + +## **Scope** + +\<\\> + +## **Outcomes** + +\<\\> + +## **Delivery** + +\<\\> + +\<\< Also include Delivery times for stages of the project\>\> + +## **Sign Off:** + +Delivery Lead Signature: +\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ + +Team Member Signature: +\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ + +Client Signature: \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ diff --git a/src/content/docs/products/ontrack/Projects/Numbas/SpikeOutcome-Scorm2004.md b/src/content/docs/products/ontrack/Projects/Numbas/SpikeOutcome-Scorm2004.md new file mode 100644 index 00000000..e94bd3ac --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Numbas/SpikeOutcome-Scorm2004.md @@ -0,0 +1,114 @@ +--- +title: Spike Outcomes +--- + +**Spike:** 1 + +**Title:** Understanding the SCORM 2004 API structure + +**Author:** Daniel Maddern, + +## Goals & Deliverables + +After several issues with the NUMBAS integration and having to move to SCORM 2004, this Spike is +intended to revise the updated functionality of SCORM 2004 and how it works, how the functions can +be used in the current project. + +## Technologies Tools and Resources used + +List of information needed by someone trying to reproduce this work + +- Internet Browser; Google Chroame, FireFox, Safari +- Programming Languages: +- Angular/TypeScript/JavaScript +- Programming Libraries: +- PipWerks SCORM +- Text Editor: VsCode +- Terminal + +## Tasks undertaken + +Key Tasks + +- Review the key functions available in SCORM 2004 + () + +- See how each function could be applied to NUMBAS + +- Test the functionality out in the PoC + +## What we found out + +There are some big changes between SCORM 1.1 and 2004, the key methods used in 2004 are: + +- Initialize( “” ) : bool – Begins a communication session with the LMS. + +- Terminate( “” ) : bool – Ends a communication session with the LMS. + +- GetValue( element : CMIElement ) : string – Retrieves a value from the LMS. + +- SetValue( element : CMIElement, value : string) : string – Saves a value to the LMS. + +- Commit( “” ) : bool – Indicates to the LMS that all data should be persisted (not required). + +- GetLastError() : CMIErrorCode – Returns the error code that resulted from the last API call. + +- GetErrorString( errorCode : CMIErrorCode ) : string – Returns a short string describing the + specified error code. + +- GetDiagnostic( errorCode : CMIErrorCode ) : string – Returns detailed information about the last + error that occurred. + +They Key Data Model elements for our use are: + +- cmi.entry (ab_initio, resume, “”, RO) Asserts whether the learner has previously accessed the SCO + +- cmi.exit (timeout, suspend, logout, normal, “”, WO) Indicates how or why the learner left the SCO + +- cmi.learner_id (long_identifier_type (SPM: 4000), RO) Identifies the learner on behalf of whom the + SCO was launched + +- cmi.mode (“browse”, “normal”, “review”, RO) Identifies one of three possible modes in which the + SCO may be presented to the learner + +- cmi.score.scaled (real (10,7) range (-1..1), RW) Number that reflects the performance of the + learner + +- cmi.score.raw (real (10,7), RW) Number that reflects the performance of the learner relative to + the range bounded by the values of min and max + +- cmi.score.min (real (10,7), RW) Minimum value in the range for the raw score + +- cmi.score.max (real (10,7), RW) Maximum value in the range for the raw score + +- cmi.suspend_data (characterstring (SPM: 64000), RW) Provides space to store and retrieve data + between learner sessions + +- cmi.total_time (timeinterval (second,10,2), RO) Sum of all of the learner’s session times + accumulated in the current learner attempt + +- cmi.success_status (“passed”, “failed”, “unknown”, RW) Indicates whether the learner has mastered + the SCO + +- cmi.session_time (time interval (second,10,2), WO) Amount of time that the learner has spent in + the current learner session for this SCO + +By making use of the flags in the data model we can implement a resume test functionality, this will +be done by saving the suspend data json string in the DB. + +A new end point will need to be created to store the suspend data json string, as well as the +Attempt number, status and isnew flag. + +## Recommendations + +It is reccomended to build out the new endpoint needed in the PoC and then to implement a resume +test functionality there + +prior to starting the build in Ontrack. The new Endpoint would be in addition to the current Numbas +API that streams the test. + +It would need a get and put functionlaity and would be making use of cmi.mode, cmi.suspend_data +during both Commit and Terminate functions. + +We also need to move the intitaliztion of the Window object outside of the launch test in the front +end Angular code. diff --git a/src/content/docs/products/ontrack/Projects/Staff Grant Extension/DESIGN.md b/src/content/docs/products/ontrack/Projects/Staff Grant Extension/DESIGN.md new file mode 100644 index 00000000..cb2e044f --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Staff Grant Extension/DESIGN.md @@ -0,0 +1,374 @@ +--- +title: Design Document:OnTrack - Staff Grant Extension Featur +--- + +## 1-Introduction + +This document outlines the design approach for integrating the "Staff Grant Extension" feature into +OnTrack, our learning management system. This feature empowers staff members to grant extensions to +students, even without formal requests. The purpose is to cater to unique situations that might +require tailored support. + +The "Staff Grant Extension" feature enables staff to initiate extension requests, define durations, +and create extension records for students. The system automates notifications to students about +granted extensions, fostering transparent communication. + +This design document covers technical implementation, user authentication, UI, error handling, +testing, and deployment aspects. It ensures the feature's smooth integration, responsiveness, +security, and scalability. The goal is to enhance OnTrack's adaptability and communication, +ultimately benefiting both staff and students. + +## 2-Use Case + +### 2-1-User Story + +As a staff member, I want to be able to grant extensions to students, even when no formal extension +requests are submitted through the system. This allows me to accommodate special circumstances that +may have been communicated through other means. + +### 2-2-Acceptance Criteria + +- Staff members can initiate extension requests for specific students. +- Staff members can specify the duration of the extension. +- Extension requests initiated by staff members are recorded in the system for future reference. +- Students receive notifications about granted extensions. + +## 3-High-level Architecture + +The "Staff Grant Extension" feature seamlessly integrates into the existing architecture of the +OnTrack system. This architecture consists of both frontend and backend components, each +contributing to the feature's functionality and user experience. + +### 3-1-Frontend Architecture + +The frontend of the feature is designed to provide an intuitive and user-friendly interface for +staff members to initiate extension requests. The key components include: + +- **Grant Extension Form:** Integrated into the staff dashboard, this form enables staff members to + select a student, specify the extension duration, add relevant notes, and indicate the reason for + the extension. A search interface allows easy student selection. This form is built using Angular + and styled with Tailwind CSS for a consistent and responsive user experience. + +- **Notifications**: The frontend also handles the notifications sent to students. Upon a staff + member's extension grant, notifications are triggered. The frontend ensures these notifications + are displayed to students, either through email or within the system. + +### 3-2 Backend Architecture + +The backend architecture focuses on processing extension requests, managing extension records, and +ensuring data security. Backend components include: + +- **Extension Record Management:** When a staff member grants an extension, the backend stores + extension records in the database. These records are associated with the student and staff member + involved, along with the specified extension duration. Ruby on Rails, the backend framework, + manages data interactions and database updates. + +- **User Authentication and Authorisation:** The backend enforces user authentication to ensure that + only authorised staff members can access the "Grant Extension" functionality. Access controls are + implemented to secure data and maintain system integrity. + +The collaboration between frontend and backend components ensures a cohesive user experience. Staff +members interact with the intuitive form at the frontend, triggering backend processes that record +extension data securely in the database. Meanwhile, students receive notifications regarding granted +extensions, enhancing communication and transparency. + +This architecture underscores the feature's user-centric design, smooth integration with existing +systems, and adherence to best practices for security and usability. The separation of frontend and +backend responsibilities enables efficient development, testing, and maintenance, contributing to +the feature's overall success within the OnTrack system. + +## 4-Technical Implementation + +The implementation of the "Staff Grant Extension" feature involves both frontend and backend +development, utilizing the existing technology stack of the OnTrack system. + +### 4-1 Frontend Implementation + +#### _Grant Extension Form:_ + +The frontend implementation revolves around the creation of the "Grant Extension" form within the +staff dashboard. This involves the following steps: + +- **UI Integration:** Integrate the form seamlessly into the staff dashboard using Angular + components. Ensure its responsive design using Tailwind CSS, providing a user-friendly experience + across devices. + +- **Form Fields:** Implement form fields for selecting students, entering extension duration, adding + notes, and specifying the reason for the extension. Create an interface for searching and + selecting students efficiently. + +#### _Notifications:_ + +The frontend is responsible for handling notifications sent to students: + +- **Notification Trigger:** Upon extension grant, trigger the notification mechanism. Depending on + student preferences, notifications are sent either via email or displayed within the system. + +### 4-2 Backend Implementation + +#### _Extension Record Creation:_ + +Backend implementation focuses on processing extension requests, managing extension records, and +ensuring secure data handling: + +- **API Endpoint:** Create an API endpoint to handle extension grant requests from the frontend. + Validate inputs, including extension duration. + +- **Database Interaction:** Upon successful validation, store extension records in the database. + Associate each record with the relevant student and staff member. Utilize Ruby on Rails' ORM + (Object-Relational Mapping) for seamless data management. + +#### _User Authentication and Authorisation:_ + +Implement user authentication and authorisation to secure the feature: + +- **Authentication:** Leverage existing authentication mechanisms to ensure only authenticated staff + members access the "Grant Extension" functionality. + +- **Authorisation:** Apply access controls to authorise staff members based on their roles and + permissions. This guarantees data security and minimizes unauthorised access. + +The successful integration of the frontend and backend components ensures the seamless operation of +the feature. Staff members interact with the frontend form, which triggers backend processes to +store extension records and handle notifications. This technical implementation enhances the OnTrack +system's capabilities, enabling staff members to provide individualized support to students and +fostering efficient communication within the platform. + +## 5-Database Design + +The database design for the "Staff Grant Extension" feature revolves around efficiently storing +extension records and maintaining the associations between students, staff members, and granted +extensions. + +### _Extension Records:_ + +- **Table:** Create a new table named "ExtensionRecords" to store extension-related information. +- **Columns:** + - **id:** Unique identifier for each extension record. + - **student_id:** Foreign key referencing the student associated with the extension. + - **staff_member_id:** Foreign key pointing to the staff member who granted the extension. + - **duration:** The duration of the extension in days or hours. + - **reason:** The reason provided for granting the extension. + - **created_at:** Timestamp indicating when the extension record was created. + +### _Associations:_ + +- **Student and Staff Member Associations:** Establish relationships between extension records, + students, and staff members using foreign keys. +- **Extensions to Students:** Link extension records to the respective students they apply to. +- **Extensions by Staff Members:** Associate extension records with the staff members who granted + the extensions. + +This database design ensures efficient querying and retrieval of extension data, enabling staff +members to track granted extensions and students to view their extension history. + +By adhering to this structured database design, the "Staff Grant Extension" feature effectively +maintains a historical record of granted extensions and establishes clear relationships between +students, staff members, and extension records. This architecture guarantees data integrity, +simplifies reporting and auditing, and contributes to the seamless operation of the feature within +the OnTrack system. + +[UML - Staff Grant Extension](https://lucid.app/lucidchart/06237ce4-9cd9-4aad-838f-45bff2249059/edit?invitationId=inv_da8c9660-84a6-46a3-9690-f210fc5ceb8d) + +## 6-User Interface Design + +[UI - Staff Grant Extension](https://www.figma.com/team_invite/redeem/MRSQ5n3VRvoVqTm4Eu3sGc) + +## 7-Error Handling and Validation + +Error handling and validation are critical aspects of ensuring the robustness and reliability of the +"Staff Grant Extension" feature. The system must effectively handle user errors and input anomalies +while maintaining data integrity. + +### Frontend Validation + +- **Form Validation:** Implement client-side form validation to prevent invalid data from being + submitted. Validate extension duration to ensure it's a positive numeric value. +- **Error Messages:** Display clear error messages next to the relevant form fields in case of + validation errors. Inform users about the specific issue and guide them towards correcting it. + +### Backend Validation + +- **API Input Validation:** Validate the input received from the frontend at the backend. Ensure + that the duration is a valid positive numeric value and that all required fields are provided. +- **Error Responses:** Return appropriate error responses if validation fails. Include relevant + error codes and messages to guide developers in diagnosing and addressing the issue. + +## Database Integrity + +- **Foreign Key Integrity:** Ensure the integrity of foreign key relationships between extension + records, students, and staff members. Reject extension creation if associated entities do not + exist. +- **Data Consistency:** Maintain consistent data by validating the input against predefined rules + and constraints. Avoid situations where data conflicts or contradictions arise. + +## Exception Handling + +- **Server-Side Errors:** Implement exception handling in the backend to catch unexpected errors + during processing. Log these errors for debugging purposes and provide users with a friendly error + message. + +- **Client-Facing Errors:** Translate backend errors into user-friendly messages on the frontend to + maintain a positive user experience. + +By rigorously implementing error handling and validation mechanisms, the "Staff Grant Extension" +feature ensures that user inputs are accurate, data integrity is maintained, and users are guided +through corrective actions when necessary. This approach contributes to a seamless and +frustration-free experience for both staff members and students, enhancing the overall reliability +of the OnTrack system. + +## 8-Testing Strategy + +Ensuring the robustness, security, and performance of the "Staff Grant Extension" feature is +paramount. The testing strategy encompasses both backend and frontend components. + +### 8-1 Backend Testing + +The backend testing strategy involves validating the functionality, security, and data integrity of +the "Staff Grant Extension" feature. + +### Test Case 1: Successful Extension Granting + +- **Description:** Verify that a staff member can successfully grant an xtension to a student. +- **Steps:** + 1. Authenticate as a staff member. + 2. Select a student. + 3. Enter a valid extension duration. + 4. Submit the form. +- **Expected Outcome:** The extension is granted, a new extension record is created in the database, + and both staff and student receive notifications. + +### Test Case 2: Invalid Extension Duration + +- **Description:** Test the system's response when a staff member enters an invalid extension + duration. +- **Steps:** + 1. Authenticate as a staff member. + 2. Access the "Grant Extension" functionality. + 3. Select a student. + 4. Enter an invalid extension duration. + 5. Submit the form. +- **Expected Outcome:** The system displays an error message, no extension record is created, and + the form remains accessible for correction. + +### Test Case 3: Unauthorised Access + +- **Description:** Verify that unauthorised users cannot access the "Grant Extension" functionality. +- **Steps:** + 1. Attempt to access the "Grant Extension" functionality without proper authentication. +- **Expected Outcome:** The system denies access and displays an appropriate error message. + +### Test Case 4: Notification Sent to Student + +- **Description:** Check if the student receives a notification when an extension is granted. +- **Steps:** + 1. Authenticate as a staff member. + 2. Grant an extension to a student. + 3. Verify the student's notifications. +- **Expected Outcome:** The student receives a notification indicating the granted extension and its + duration. + +## 8-2 Frontend Testing + +Frontend components will undergo testing to ensure a seamless user experience. + +- **Form Validation Testing:** Validate the form's behaviour when inputs are correct and incorrect, + ensuring error messages display appropriately. +- **Integration Testing:** Test the integration of the "Grant Extension" form into the staff + dashboard, ensuring proper rendering and interaction. +- **Notification Testing:** Verify that notifications are triggered and displayed correctly for + students. +- **Responsive Testing:** Test the form's responsiveness across various devices and screen sizes. + +By executing comprehensive backend and frontend tests, we ensure the "Staff Grant Extension" feature +functions accurately, is secure from unauthorised access, and provides a seamless experience to +staff and students. Successful testing will lead to a reliable and user-friendly addition to the +OnTrack system. + +## 9-Deployment Plan + +The deployment plan outlines the steps to smoothly introduce the "Staff Grant Extension" feature +into the OnTrack system, ensuring minimal disruptions and optimal user experience. + +### 9-1-Pre-Deployment Preparation + +- Conduct thorough testing of both frontend and backend components, addressing any identified + issues. +- Review and ensure that the codebase adheres to coding standards and best practices. +- Create a backup of the existing system and database to mitigate potential risks during deployment. + +### 9-2-Deployment Steps + +- **Database Migration:** Apply necessary database migrations to accommodate the new extension + records. + +- **Backend Deployment:** Deploy the backend changes to the production server. Monitor for any + errors or anomalies during deployment. + +- **Frontend Deployment:** Deploy the updated frontend components to the production server. Ensure + that the new form and notifications are integrated seamlessly. + +### 9-3-Post-Deployment Tasks + +- **Data Migration:** If needed, migrate existing data to match the new database schema. +- **Testing:** Conduct thorough testing in the production environment to ensure everything works as + expected. + +### 9-4-Rollback Plan + +- In case of unforeseen issues during deployment, have a rollback plan in place to revert to the + previous version of the system. + +### 9-5-Communication + +- Notify staff members and users about the upcoming feature addition and any potential downtime + during deployment. +- Communicate the benefits and functionality of the "Staff Grant Extension" feature to encourage + user adoption. + +### 9-6-Monitoring and Support + +- Monitor the system closely during the initial days after deployment to detect any unexpected + behaviors. +- Provide quick response and support to address any user issues or inquiries related to the new + feature. + +### 9-7-Documentation Update + +- Update user documentation, guides, and tutorials to reflect the new "Staff Grant Extension" + feature. +- Include instructions for staff members on how to use the new functionality effectively. + +### 9-8-Continuous Improvement + +- Gather feedback from staff members and users about their experience with the new feature. +- Use this feedback to make necessary improvements and enhancements to the feature in future + updates. + +By following this deployment plan, the "Staff Grant Extension" feature will be seamlessly integrated +into the OnTrack system, offering enhanced capabilities to staff members and students while +maintaining the stability and reliability of the platform. + +## 10-Conclusion + +The design document for the "Staff Grant Extension" feature presents a comprehensive blueprint for +integrating this pivotal enhancement into the OnTrack system. By empowering staff members to grant +extensions to students, the feature addresses the evolving needs of educational environments, +ensuring a tailored and adaptable approach to supporting students' unique circumstances. + +The "Staff Grant Extension" feature enriches the OnTrack system by seamlessly bridging frontend and +backend components. Through a user-friendly form, staff members can initiate extension requests, +specifying durations and reasons, which are then securely stored in the system's database +Notifications are triggered, enhancing communication with students. Robust error handling, +validation mechanisms, and stringent security measures ensure data integrity and user confidence. + +The envisioned architecture fosters collaboration between students and staff members, enabling +personalized solutions without disrupting established workflows. The design emphasizes usability, +scalability, and performance, thereby elevating the user experience across the platform. + +Incorporating the "Staff Grant Extension" feature extends OnTrack's capability to adapt and respond +to students' unique circumstances, fostering a more inclusive and flexible educational experience. +By following the outlined design principles and implementation strategies, the feature promises +seamless integration, streamlined functionality, and enhanced communication within the OnTrack +system. This design document serves as a roadmap to achieving these goals and advancing the +educational support provided by the platform. diff --git a/src/content/docs/products/ontrack/Projects/Staff Grant Extension/REQUIREMENTS.md b/src/content/docs/products/ontrack/Projects/Staff Grant Extension/REQUIREMENTS.md new file mode 100644 index 00000000..adc5edad --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Staff Grant Extension/REQUIREMENTS.md @@ -0,0 +1,179 @@ +--- +title: Requirements Document:OnTrack - Staff Grant Extension Feature +--- + +## 1-Introduction + +The purpose of this document is to outline the requirements for the implementation of the "Staff +Grant Extension" feature in the OnTrack (also known as Doubtfire). This feature aims to empower +staff members to grant extensions to students, even in cases where there are no formal extension +requests within the system. + +## 2-Use Case + +### 2-1-User Story + +As a staff member, I want to be able to grant extensions to students, even when no formal extension +requests are submitted through the system. This allows me to accommodate special circumstances that +may have been communicated through other means. + +### 2-2-Acceptance Criteria + +- Staff members can initiate extension requests for specific students. +- Staff members can specify the duration of the extension. +- Extension requests initiated by staff members are recorded in the system for future reference. +- Students receive notifications about granted extensions. + +## 3-Functional Requirements + +### 3-1-Frontend Functionality + +#### _3-1-1-Grant Extension Form_ + +- A new option should be added to the staff dashboard or relevant pages for granting extensions. +- The form should include fields for selecting the student, entering the extension duration, and + adding any relevant notes. +- The reason for the extension to be granted. +- The medium the extension was requested (if not formal). +- An interface to search for and select students should be provided. + +#### _3-1-2-Notifications_ + +- Students should receive notifications via email or within the system when a staff member grants an + extension. +- Notifications should include details about the granted extension and its duration. + +### 3-2-Backend Functionality + +#### _3-2-1-Extension Record_ + +- An extension record should be created and associated with the student, the staff member initiating + the extension, and the specified duration. +- Extension records should be viewable by both staff members and students. + +## 4-Technical Requirements + +### 4-1-Technology Stack + +The "Staff Grant Extension" feature should be implemented using the existing technology stack of the +Doubtfire system. + +- Frontend: Angular and Tailwind CSS +- Backend: Ruby on Rails + +### 4-2-Data Management + +- Extension records should be stored in the system's database, associated with the relevant student + and staff member. + +### 4-3-User Authentication and Authorisation + +- Only authorised staff members should have access to the "Grant Extension" functionality. +- Appropriate access controls should be implemented to ensure data security. + +## 5-Non-Functional Requirements + +### 5-1-Usability + +- The user interface for granting extensions should be intuitive and user-friendly, requiring + minimal training for staff members. + +### 5-2-Performance + +- The feature should be responsive and provide a seamless experience for staff members, even during + periods of high system usage. + +## 6-Future Considerations + +- Integration with existing extension request workflows, if applicable. +- Ability to generate reports on granted extensions for administrative purposes. + +## 7-Testing + +### 7-1-Test Cases for Backend Extension Granting Endpoint + +#### _Test Case 1: Successful Extension Granting_ + +Description: Verify that a staff member can successfully grant an extension to a student. + +Steps: + +1. Authenticate as a staff member. +2. Access the "Grant Extension" functionality. +3. Select a student. +4. Enter a valid extension duration. +5. Submit the form. + +Expected Outcome: The extension is granted, and a new extension record is created in the database. +The student receives a notification, and the staff member can view the granted extension details. + +#### _Test Case 2: Invalid Extension Duration_ + +Description: Test the system's response when a staff member enters an invalid extension duration. + +Steps: + +1. Authenticate as a staff member. +2. Access the "Grant Extension" functionality. +3. Select a student. +4. Enter an invalid extension duration (e.g., a negative value or non-numeric input). +5. Submit the form. + +Expected Outcome: The system displays an error message indicating that the entered duration is +invalid. No extension record is created. + +#### _Test Case 3: Unauthorised Access_ + +Description: Verify that unauthorised users cannot access the "Grant Extension" functionality. + +Steps: + +1. Attempt to access the "Grant Extension" functionality without proper authentication as a staff + member. + +Expected Outcome: The system denies access and displays an appropriate error message. + +#### _Test Case 4: Notification Sent to Student_ + +Description: Check if the student receives a notification when an extension is granted. + +Steps: + +1. Authenticate as a staff member. +2. Grant an extension to a student. +3. Verify the student's notifications. + +Expected Outcome: The student receives a notification indicating the granted extension and its +duration. + +### 7-2-Running Tests and Interpreting Results + +#### _7.2.1. Running Tests_ + +1. Ensure the backend development environment is set up and functional. +2. Open a terminal/command prompt. +3. Navigate to the project's backend directory. +4. Run the test suite using a testing framework. + +#### _7.2.2. Interpreting Results_ + +1. If all tests pass, you will see a success message(s). +2. If any test fails, you will see a descriptive error message indicating the test that failed and + the reason for failure. + +#### _7.2.3. Troubleshooting_ + +1. If tests fail, review the error messages and stack traces to identify the issue. +2. Check the backend code related to the failing test to diagnose and fix the problem. +3. Rerun the tests after making changes to verify that the issue has been resolved. + +## 8-Conclusion + +The "Staff Grant Extension" feature enhances the flexibility and responsiveness of the OnTrack +learning management system by allowing staff members to grant extensions to students based on +individual circumstances. This document outlines the functional, technical, and non-functional +requirements for the successful implementation of this feature. Thorough testing of the backend +extension granting endpoint ensures that the "Staff Grant Extension" feature functions as expected. +The test cases cover various scenarios, including successful extension granting, error handling, and +notifications. Running the tests and interpreting the results helps identify and address issues +before deploying the feature to production. diff --git a/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/2022-T3-Hand-Over-Document.md b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/2022-T3-Hand-Over-Document.md new file mode 100644 index 00000000..851a8605 --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/2022-T3-Hand-Over-Document.md @@ -0,0 +1,64 @@ +--- +title: 2022 T3 Hand-Over Document +--- + +[Back to Index](Index.md) + +## Purpose of Document + +The purpose of this document is to explain to future collaborators of this project what has been +accomplished. This document is a guide for future collaborators, on what their next course of action +ought to be. + +## State of Project When Received + +- Several key stakeholders had been identified. +- Several features had been derived from the stakeholder personas. +- Two designs had been handed to us. +- A so-called "back-end emulator" and "front-end simulator" was handed to us, which was supposed to + be an educationally assistive technology. + +## State of Project at Hand-Over + +- The so-called "back-end emulator" and "front-end simulator" were redefined as an API, the + "`chathistorydisplayer-api`" application, and a web interface geared towards testing the API, the + "`chathistorydisplayer-web`" application. + - The `chathistorydisplayer-api` application is located in the directory called `emulator` in the + [thoth-tech/ChatHistoryDisplayer](https://github.com/thoth-tech/ChatHistoryDisplayer) + repository. + - The `chathistorydisplayer-web` application is located in the directory called + `frontEndSimulator` in the + [thoth-tech/ChatHistoryDisplayer](https://github.com/thoth-tech/ChatHistoryDisplayer) + repository. +- The `chathistorydisplayer-api` application had its containerisation refactored. +- The `chathistorydisplayer-web` application was containerised. +- `Docker Compose` was integrated and configured to handle spinning up both the + `chathistorydisplayer-api` and `chathistorydisplayer-web` applications. +- Quality of life features were integrated into the `chathistorydisplayer-api` application. Namely, + a static code analyser and linter (`rubocop`) and a testing suite (`RSpec` and `Capybara`). +- 83 offenses in the `chathistorydisplayer-api`, as detected by the newly integrated static code + analyser, were fixed manually. +- The `chathistorydisplayer-api` application was altered to facilitate the creation of user + directories, project directories, and write files from JSON payloads. In comparison, it formerly + only created user directories and initialised those are git repositories. The back-end team deemed + it appropriate to change this, so that each project is handled as a git repository; this will + allow each project to have its history queries for integration into a chat interface. +- An API end-point was created in the `chathistorydisplayer-api` application to fetch the most + recent `git diff` of a file. +- API end-points were created in the `chathistorydisplayer-api` application to handle the deletion + of user directories, project directories, and files in project directories. +- A diagram, which acts as a proposition, was created on how the [thoth-tech/ChatHistoryDisplayer] + may be integrated into + [thoth-tech/doubtfire-api](https://github.com/thoth-tech/doubtfire-api). +- The `chathistorydisplayer-web` application had a React component library integrated and it was + then leveraged. This resulted in a visual overhaul of the web application. +- The `chathistorydisplayer-web` application had visual buttons created for the deletion of user + directories, project directories, and files in project directories. +- The `chathistorydisplayer-web` application had `Javascript` events integrated into the text input + fields, so that it would be clearer what variables were set to during testing. +- The `chathistorydisplayer-web` application had `Javascript` events integrated into the buttons, so + that appropriate API end-points were called. + +## What Next? + +- Read [Project On-boarding](Project-On-Boarding.md) diff --git a/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/2023-T1-Hand-Over-Document.md b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/2023-T1-Hand-Over-Document.md new file mode 100644 index 00000000..69aa6cf8 --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/2023-T1-Hand-Over-Document.md @@ -0,0 +1,176 @@ +--- +title: 2023 T1 Hand-Over Document +--- + +[Back to Index](Index.md) + +## Purpose of Document + +This document aims to inform potential collaborators about the project progress and accomplishments. +It guides collaborators by outlining the next steps and actions they should take. The document +ensures project continuity and coherence by detailing previous work. It helps newcollaborators +understand the project status and build on it. This document also helps future collaborators make +strategic and informed decisions. It helps themidentify gaps, challenges, and opportunities and +suggests next steps. It streamlines projectefforts, and empowers future collaborators to effectively +contribute to project success byleveraging past successes and experiences. + +## Project Overview, Goals, and Objectives + +The Task Submission and Redesign Project, which is a component of the Ontrack Project, has clear +goals and objectives aimed at enhancing the functionality and efficiency of the existing product. +The primary objective of the project is to modify the current system in a way that allows each +submitted artifact to be easily displayed and interpreted by users. + +The project also helps markers inspect these artefacts, who evaluate and provide feedback. The +project aims to speed up marking by helping markers quickly evaluate artefacts, and hence improve +evaluation efficiency. The Task Submission and Redesign Project aims to streamline marking and add a +chatbot. The chatbot will mediate marker-student activities. The chatbot may help, answer questions, +guide, and facilitate communication. + +Overall, the Task Submission and Redesign Project optimizes artefact submission and evaluation. The +project aims to improve user experience, efficiency, and collaboration between markers and students +in the Ontrack Project by introducing different submitted artefact display, efficient marking +procedures, and a chatbot. + +## Project Deliverables + +This sections outlines project deliverables for 2023 T1. For overall project deliverables, please +check the markdown docment in +[thoth-tech/documentation](https://github.com/thoth-tech/documentation/blob/main/docs/OnTrack/Task%20Submission%20%26%20Redesign/Deliverables.md). + +### Short-term (2023 T1) + +### Documentation Oriented + +- [x] Update the project epic (make it relevant to T1/2023). + + - A modification to a markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +- [x] Update the document that outlines the deliverable items of the project. + + - A markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/blob/main/docs/OnTrack/Task%20Submission%20%26%20Redesign/Deliverables.md). + +- [x] Create a T1/2023 hand-over document. + + - A markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +- [x] Update the project Index (make it relevant to T1/2023). + + - A modification to a markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +- [x] Update the project Onboarding (make it relevant to T1/2023). + + - A modification to a markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +- [x] Update the project Scope Sign Off Document (to reflect scope changes relevant to T1/2023). + + - A modification to a markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +### Front-end Oriented + +#### Design + +- [x] Create frame-by-frame flows of tutors using the primary design. + + - Multiple images and a video showcase, as output from [Figma] ,in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign/design_images), + + - Additional information: These flows should determine whether an alteration to the single, + primary design is required and what specific alteration is required. This could be broken down + into tasks regarding specific flows for showing the use of specific features. + +- [x] Create `TaskSubmissionEnhancement` new Features to the student-view design. + + - Multiple images and a video showcase in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign/design_images), + as output from [Figma](https://www.figma.com/). + + - A markdown document that explains the functions and implementation of the new features in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +#### Code + +- [x] Create `Submission enhancement test environment` for the new features on Student View. + + - A source code of the test environment, demonstration video to showcase the new features and how + it could present in Ontrack with additional documentation in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +### Cyber-security Oriented + +- [x] Create a document that outlines the cybersecurity concerns of the current changes. + + - A markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +- [x] Create a document that introduce administrators to potential cyber security threats or issues. + + - A markdown document (or multiple) in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +- [x] Create a code script of malware-detection software to implement for the new feature. + + - A markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +## State of Project When Received + +- Several key stakeholders had been identified and several user stories and features had been + derived from the stakeholder personas. +- Two designs (Student and Tutor) had been found in Figma. +- The "`chathistorydisplayer-api`" and "`chathistorydisplayer-web`" applications were redefined as + an API and a web interface geared towards testing the API. +- The "`chathistorydisplayer-api`" application had its containerisation refactored, the + "`chathistorydisplayer-web`" application was containerised, Docker Compose was integrated, quality + of life features were integrated, and 83 offenses were fixed manually. +- The "`chathistorydisplayer-api`" application was altered to facilitate the creation of user + directories, project directories, and write files from JSON payloads. An API end-point was created + to fetch the most recent git diff of a file, and API end-points were created to handle the + deletion of user directories, project directories, and files in project directories. +- The `chathistorydisplayer-api` application was located in the directory called `emulator` in the + [thoth-tech/ChatHistoryDisplayer] repository. +- The `chathistorydisplayer-web` application is located in the directory called `frontEndSimulator` + in the [thoth-tech/ChatHistoryDisplayer](https://github.com/thoth-tech/ChatHistoryDisplayer) + repository. +- More information can be found in the 2022 T3 Handover Document: A markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +## State of Project at Hand-Over + +- Frame-by-frame flows of tutors performing current and new proposed features using the primary + design have been created. +- The design enhancements, specifically the `TaskSubmissionEnhancement`, have been incorporated into + the student-view design. +- A test environment for `TaskSubmissionEnhancement` has been created for the new features on the + Student View. The source code, a demonstration video showcasing the new features, and additional + documentation are provided. +- A document outlining the cyber-security concerns related to propositional changes has been + created. +- Documents introducing potential cyber-security threats or issues to OnTrack administrators have + been prepared. +- A code script for malware-detection software implementation for the new feature has been provided. +- These completed deliverables demonstrate progress in different aspects of the project, including + documentation updates, front-end design enhancements, code implementation, and consideration of + cyber-security concerns. The project is now ready for handover, with comprehensive documentation + and tangible outcomes that can serve as a foundation for future development and collaboration. + +## What Next? + +- Finalise Figma design for component student-views with client and UI enhancement team. +- Iterate on component source code and add ROR implementation if necessary. +- Implement submission enhancement features for production. +- Expand scope features such as automated task stage changing; for exxample if task is in Task not + yet started stage, upload of a file will automatically change it to Working on it. +- Based on the student-views new components progress, work on integrating the new features into + tutor-views after finalizing the Figma prototype for tutor-views with client to UI enhancement + team. +- Read 2023 T1 Project Weekly updates, Meeting Minutes and other documents in the project TEAMS + channel. + +- Read [Project On-boarding](Project-On-Boarding.md) diff --git a/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Deliverables.md b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Deliverables.md new file mode 100644 index 00000000..257f3c55 --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Deliverables.md @@ -0,0 +1,212 @@ +--- +title: Deliverable Items +--- + +## Purpose of this Document + +This document outlines the deliverable items the Task View and Submission Redesign project intends +to deliver upon. Each trimester, this document is to be reassessed. All team members are expected to +express their expertise by breaking down deliverable items into smaller, actionable tasks on a +collaborative technology such as Trello. + +## Structure of the Deliverable Items Document + +All deliverable items are grouped into roles, but team members are allowed (and encouraged) to +operate outside of their selected roles. + +All deliverable items have the common form: + +- [ ] What needs to be done. + - What evidence needs to be produced to show this is completed or on-going. + - (OPTIONAL) Pre-requisites: The pre-requisite deliverable items for this deliverable. + - (OPTIONAL) Additional information: Any additional information that may inform a reader about the + deliverable. + +These deliverable items should then be decomposed into constituting tasks, mediated by some +collaborative technology (for example, [Trello](https://trello.com/)). + +All team members should participate in the decomposition of deliverable items. Team members are also +encouraged to contribute ideas for deliverable items, as informed by their CLOs. + +## Deliverable Items + +### Purely Documentation Oriented + +- [x] Modify the project epic (make it relevant to T1/2023). + + - A modification to a markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + +- [x] Modify/Update a document that outlines the deliverable items of the project. + + - A markdown document in [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + +- [x] Create a T1/2023 hand-over document. + - A markdown document in [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + +### Front-end Oriented + +#### Design + +- [ ] Create frame-by-frame flows of tutors performing current and new features. + + - Multiple images and a video showcase, as output from [Figma](https://www.figma.com/), in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/), as output from + [Figma](https://www.figma.com/). + + - Pre-requisite: A single, primary design must be selected for this to be followed through with. + +- [ ] Create frame-by-frame flows of students performing current and new features. + + - Multiple images, as output from [Figma](https://www.figma.com/), in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + + - Pre-requisite: A single, primary design must be selected for this to be followed through with. + + - Additional information: These flows should determine whether an alteration to the single, + primary design is required and what specific alteration is required. This could be broken down + into tasks regarding specific flows for showing the use of specific features. + +- [ ] Complete the tutor-view design on [Figma](https://www.figma.com/). + + - An image, as output from [Figma](https://www.figma.com/), in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + + - Pre-requisite: The creation of all the flows of the single, primary tutor-view design. + + - Additional information: This deliverable item is completed once all changes, as informed by + usability and smart default problems obtained from the construction of the flows, are fixed. + +- [x] Complete the student-view design on [Figma](https://www.figma.com/). + + - An image, as output from [Figma](https://www.figma.com/), in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/) + + - Pre-requisite: The creation of all the flows of the single, primary student-view design. + + - Additional information: This deliverable item is completed once all changes, as informed by + usability and smart default problems obtained from the construction of the flows, are fixed. + +- [ ] Create new `TaskSubmissionEnhancement` Features to the student-view + [Figma](https://www.figma.com/) design. + + - An image and video showcase, as output from [Figma](https://www.figma.com/), in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + +- [ ] Create an administrator-view [Figma](https://www.figma.com/) design. + + - An image, as output from [Figma](https://www.figma.com/), in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + +- [ ] Create a convenor-view [Figma](https://www.figma.com/) design. + + - An image, as output from [Figma](https://www.figma.com/), in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + +- [ ] Create frame-by-frame flows of administrators performing current and new features. + + - Multiple images, as output from [Figma](https://www.figma.com/), in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + - Pre-requisite: The administrator-view deliverable item from this deliverable document must be + completed. + + - Additional information: This could be broken down into tasks regarding specific flows for + showing the use of specific features. + +- [ ] Create frame-by-frame flows of convenors performing current and new features. + + - Multiple images, as output from [Figma](https://www.figma.com/), in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + + - Pre-requisite: The conventor-view deliverable item from this deliverable document must be + completed. + + - Additional information: This could be broken down into tasks regarding specific flows for + showing the use of specific features. + +#### Code + +- [ ] Modify the existing front-end implementation of OnTrack to conform with any of the completed + designs. + +- [x] Expand the `chathistorydisplayer-web` web application. + +### Back-end Oriented + +#### Documentation + +- [x] Create design propositions on how the `ChatHistoryDisplayer` integrates with the OnTrack + platform. + + - An image file in [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + +#### `ChatHistoryDisplayer` + +- [x] Refactor the implementation of Docker at `chathistorydisplayer-api`. + +- [x] Implement Docker at `chathistorydisplayer-web`. + +- [x] Integrate Docker Compose at the root of the [thoth-tech/ChatHistoryDisplayer] repository. + +- [x] Add functionality to `chathistorydisplayer-api`: create user directories. + +- [x] Add functionality to `chathistorydisplayer-api`: create project directories in user + directories. + + - Additional information: Project directories must be initialised as git repositories. + +- [x] Add functionality to `chathistorydisplayer-api`: write file from JSON payload. + + - Additional information: Pertains to text files. + +- [x] Add functionality to `chathistorydisplayer-api`: API end-point that retrieves the last + `git diff` of a text file. + +- [ ] Add functionality to `chathistorydisplayer-api`: authorisation at API end-points. + +- [ ] Add functionality to `chathistorydisplayer-api`: version control of PDF documents using the + `git gem`. + +#### `TaskSubmissionEnhancement` + +- [ ] Create a prototype of `TaskSubmissionEnhancement` Component of the Ontrack platform that adds + the following four features that would benefit both students and teaching staff: + - The ability to submit files regardless of the task state. + - The ability to submit individual task files. + - The ability to submit optional additional files outside of the task requirements. + - The ability to observe task file upload differences. + +#### `Doubtfire` + +- [ ] Modify OnTrack to serve raw files, where appropriate. + + - Additional information: This contributes towards the integration of the + `chathistorydisplayer-api` into the OnTrack platform, as the OnTrack platform needs PDF + processing removed and separate handling for different classes of files (text files and PDFs + come to mind). + +- [ ] The integration of `chathistorydisplayer-api` into the Docker environment of the OnTrack + platform. + +- [ ] Integrate `TaskSubmissionEnhancement` into the OnTrack platform. + +### Cyber-security Oriented + +- [ ] Create a document that outlines the cyber-security protocols for project group members. + + - A markdown document in [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + +- [ ] Create a document, or documents, that introduce OnTrack administrators to potential + cyber-security threats or issues. + + - A markdown document (or multiple) in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + +- [ ] Create a document outlining the security concerns of propositional changes (or current enacted + changes). + + - A markdown document in [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). + +- [ ] Create a document that surveys group member compliance with security protocols. + + - A markdown document in [thoth-tech/documentation](https://github.com/thoth-tech/documentation/). diff --git a/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Epic.md b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Epic.md new file mode 100644 index 00000000..047c8a0a --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Epic.md @@ -0,0 +1,149 @@ +--- +title: Author Information +--- + +[Back to index](Index.md) + +- Authors: [Yaser Deeb](https://github.com/YADEEB21) +- Team: OnTrack - Task View and Submission Redesign +- Team Delivery Lead: Yaser Deeb + +## Document Summary + +--- + +- Documentation Title: Epic Document +- Documentation Type: Technical +- Documentation Information Summary: Critical links and resources; the background, context, and + business value of the project; and the acceptance criteria. + +## Document Review Information + +--- + +- Date of modified Document Submission to GitHub: 15/05/2023 +- Documentation Version: 3.0 +- Date of Previous Documentation Review: 22/09/2022 +- Date of Next Documentation Review: T2/2023 + +## Key Terms + +--- + +Trello: A web-based list-making application designed with a focus on teams that implement a scrum +style of organisation. + +Figma: A web-based application for user interface and user experience design. + +UI: User Interface; the means by which a human interacts with a machine, these are typically +graphical interfaces that accept input from an end-user. + +UX: User Experience; all aspects of the end-user's interactions with an application or device. + +Flow: A frame-by-frame image of a user (a student, tutor, convenor, or administrator) performing a +necessary function from beginning to end. Flows allow designers to think critically about how the +usability of a design. It may save the project from investing time and resources into unusable +dead-ends. + +## Key Links/Resources + +--- + +- [T1/2023 Trello Board](https://trello.com/b/FWyBUYG8/task-view-re-design-team-ontrack-project) +- [OnTrack Overseer Repository](https://github.com/thoth-tech/doubtfire-overseer) +- [OnTrack Web Repository](https://github.com/thoth-tech/doubtfire-web) +- [OnTrack API Repository](https://github.com/thoth-tech/doubtfire-api) +- [thoth-tech/ChatHistoryDisplayer](https://github.com/thoth-tech/ChatHistoryDisplayer) +- [T3/2022 Delivery Lead's ChatHistoryDisplayer](https://github.com/rickydodd/ChatHistoryDisplayer) +- [T1/2023 Figma](https://www.figma.com/files/project/61538483/Team-project?fuid=1226098815565608315) + +## Contacts for further information + +--- + +see [Thoth Tech Handbook](https://github.com/thoth-tech/handbook/blob/main/README.md) + +## Related Documents + +--- + +- [Task Submission redesign requirements and specifications document](Requirements.md) + +## View Task and Submission Epic Document + +## Background / Context + +OnTrack is employed by multiple institutions as a learning management system. The View Task and +Submission project intends to create user-centric modifications to existing features, addition of +new features to the task submission and view in the OnTrack platform. + +## Business Value + +By further modernising OnTrack, institutions can deploy the OnTrack platform to satisfy the needs of +their students, markers, assessors, and auditors. The platform can support all stakeholders to +fulfil their obligations and, in the case of the student, support the learning of essential +concepts. By streamlining the experience of markers, then associated costs may decrease. +Additionally, the feedback loop for students (the learning feedback loop) may shorten. + +## In Scope + +- Design planning and documentation +- Removal of redundant features +- Modification of existing features +- Addition of new features +- Task view for students +- Task submission for students +- Task view for markers +- Front-end +- Back-end +- Security +- Database + +## Out of Scope + +- Visual flavour +- Logo + +## UI/UX Considerations + +- Navigability + - Can all features be navigated to? + - New features? + - Previous features that were retained? + - Navigability can be gauged by the creation of multiple flows. +- Accessibility + +## Regulation & Compliance Considerations + +- Storage and privacy of user's data. +- Security +- Retention policy. + +## Operations / Support / Training Considerations + +Team members may require training/up-skilling in applications, technologies, and languages, such as: + +- [git](https://git-scm.com/) +- [GitHub](https://github.com/), +- [Figma](https://figma.com/), +- [Docker](https://www.docker.com/), +- [Ruby](https://www.ruby-lang.org/en/), +- [Ruby on Rails](https://rubyonrails.org/), +- [Python](https://www.python.org/), +- [TypeScript](https://www.typescriptlang.org/), +- [Bootstrap](https://getbootstrap.com/), +- [Angular](https://angular.io/), +- [Sinatra](https://sinatrarb.com/), +- [React](https://reactjs.org/), +- [MUI](https://mui.com/). + +Team members must express testing skills by use of various testing tools to ensure functionalitie +work as intended. They also must be able to fix and/or document and report on issues or bugs as they +arise. + +## Acceptance Criteria + +- Managing director must approve of the design before implementation. +- If a change is required, then an alteration to the design (with approval from the managine + director) must be completed first. +- All code must be tested before an attempt to pull into the upstream repositories. diff --git a/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Index.md b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Index.md new file mode 100644 index 00000000..a37d303f --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Index.md @@ -0,0 +1,32 @@ +--- +title: View Task and Submission Redesign Documentation Index +--- + +## [T1, 2023 Hand-over Document](2023-T1-Hand-Over-Document.md) + +A document created to reflect what has been so far accomplished in the project. + +## [T1, 2023 Project Scope Sign Off Document](ProjectScope-SignOff-Document.md) + +A document created to reflect the scope of the project and its deliverables for T1 / 2023. + +## [T2, 2022 Hand-over Document](2022-T2-Hand-Over-Document.md) + +A document created to be the first document read on the project. + +## [Project On-boarding](Project-On-Boarding.md) + +A document created to assist with the on-boarding process of new contributors to the Task View and +Submission Redesign project. + +## [View Task and Submission Redesign Epic](Epic.md) + +The epic for the View Task and Submission Redesign project. + +## [User Stories and Features](User-Stories-and-Features.md) + +The user stories and the features generated by said user stories. + +## [Requirements](Requirements.md) + +The requirements for the Task View and Submission Redesign project. diff --git a/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Project-On-Boarding.md b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Project-On-Boarding.md new file mode 100644 index 00000000..6790603e --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Project-On-Boarding.md @@ -0,0 +1,127 @@ +--- +title: Project On-boarding +--- + +[Back to Index](Index.md) + +## Purpose of Document + +The purpose of this document is to position you, the potential contributor, such that you can +contribute to the project. Regardless of your selected role, it is paramount that you join and +configure all facets of the project. You are encouraged to work outside of your role. + +## Notice + +All team members are expected to have all facets of the project set up, irrespective of your +selected or designated roles. This increases the team agility. + +## Trello + +- Register a [Trello](https://trello.com/signup) account. +- Confirm your Trello account by email (may go to Trash, so be sure to check there). +- Join the Trello board that is assigned by your delivery Lead. The previous team's + [Trello board](https://trello.com/b/FWyBUYG8/task-view-re-design-team-ontrack-project) + +## Figma + +- Register a [Figma](https://www.figma.com/) account. +- Confirm your Figma account by email (may go to Trash, so be sure to check there). +- Join the + [Figma project](https://www.figma.com/files/project/61538483/Team-project?fuid=1226098815565608315). + +## Configuring git (global) + +If you haven't already, you must configure git. + +1. Set your git username by `git config --global user.name "FIRST_NAME LAST_NAME"`, + where`FIRST_NAME` is your first name and `LAST_NAME` is your last name. +1. Set your git email by `git config --global user.email "YOUR_EMAIL"`, where `YOUR_EMAIL` is your + email. It is advised that you use your `@users.noreply.github.com` email address, which is, by + default, `@users.noreply.github.com`, where `` is your GitHub username. + +## Cloning the Documentation + +This enables you to contribute to the project documentation. You should also read the +[documentation contribution guidelines](https://github.com/thoth-tech/documentation/blob/main/CONTRIBUTING.md). + +```shell +git clone -b doc/view-task-and-submission-redesign --single-branch https://github.com/thoth-tech/documentation.git +``` + +## WSL2 + +If you are on a Windows machine, then we recommend that you install WSL2. + +## Get OnTrack Running on Local Machine + +You need a terminal that supports shell scripts (on Windows, you need WSL2, Msys2, or Cygwin). + +1. Fork [doubtfire-deploy](https://github.com/doubtfire-lms/doubtfire-deploy), + [doubtfire-api](https://github.com/doubtfire-lms/doubtfire-api), and + [doubtfire-web](https://github.com/doubtfire-lms/doubtfire-web) + +2. Clone your [doubtfire-deploy](https://github.com/doubtfire-lms/doubtfire-deploy). Make sure to + fetch submodules to get the sub-projects. + + ```shell + git clone --recurse-submodules https://github.com/YOUR_USERNAME/doubtfire-deploy + ``` + +3. `cd` into the directory. + + ```shell + cd doubtfire-deploy + ``` + +4. Open a terminal that supports `sh` scripts (on Windows, you require WSL2, Msys2, or Cygwin). Run + the following command to set your fork as the remote. + + ```shell + ./change_remotes.sh + ``` + +5. Your delivery lead provides you with the GitHub username to use in this command. This allows you + to use `git fetch task-view-submission`, `git pull task-view-submission`, and + `git push task-view-submission`. + + ```shell + git remote add task-view-submission https://github.com/PROVIDED_USERNAME/doubtfire-deploy + ``` + +6. You can now follow the remaining instructions, from instruction four, in the `doubtfire-deploy` + [contributing file](https://github.com/doubtfire-lms/doubtfire-deploy/blob/development/CONTRIBUTING.md#working-with-docker-compose). + +## What Next? + +- Become familiar with [the project epic](Epic.md) +- Become familiar with [the user stories and features](User-Stories-and-Features.md) + - Are there any users that are not served in the user stories or by the features? +- Become familiar with [the requirements](Requirements.md) + - Are all stakeholders sufficiently provided for, with this set of requirements? +- Become familiar with [the deliverables](Deliverables.md) + - Are there deliverable items that should be added? + - Are there deliverable items that should be removed? + - Are there deliverable items that can be decomposed into smaller deliverable items? +- Examine [the first proposed design](design_images/T2-2022/iteration-3-design-1.png) and ensure all + requirements are met, and that the inclusion of the features are user-friendly. +- Examine [the second proposed design](design_images/T2-2022/iteration-3-design-2.png) and ensure + all requirements are met, and that the inclusion of the features are user-friendly. + - Examine + [the second design's prototype](https://www.figma.com/proto/XmKxWQ43MwrD6Red1DvYq6/Wire-Frame-Designs?node-id=478%3A4466&scaling=min-zoom&page-id=476%3A4327&starting-point-node-id=478%3A4466). +- Select a front-end design to modify, improve, extend, or implement. +- Examine the back-end emulator. + - Has it successfully passed proof-of-concept? + - How can git be implemented on the back-end of the OnTrack product? +- Work on implementing the front-end and back-end. +- If somebody on your team is well-versed in cyber-security, then an examination of the security of + the implementation is required. +- If somebody on the team is well-versed in databases and database administration, then a model of + the database is required. + +## Helpful Points + +- If you are using Windows as your primary operating system and you have not downloaded, installed, + and/or set-up MinGW, then a former team found the Linux subsystem + [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install) and + [Docker Desktop WSL 2 backend](https://docs.docker.com/desktop/windows/wsl/) as a helpful + development environment. diff --git a/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/ProjectScope-SignOff-Document.md b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/ProjectScope-SignOff-Document.md new file mode 100644 index 00000000..b1229930 --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/ProjectScope-SignOff-Document.md @@ -0,0 +1,107 @@ +--- +title: Project Scope SignOff Document +--- + +## Project Information + +- Project Name: Task View Re-design +- Project Client: Julien, Andrew, Jake +- Delivery Lead: Yaser Deeb +- Team Members: Yaser Deeb, William Lowe, Sivasamyuktha A Selvarajuh + +## Purpose of Document + +The purpose of this document is to give an overiew of the scope of the project at the kick-off and +verify with the client the project scope for T1 2023. It includes client-approved deliverables, and +acceptance criteria. + +## State of Project When Received + +- Several key stakeholders had been identified. +- Several features had been derived from the stakeholder personas. +- Two designs and one design Prototype had been handed. +- Enhanced ChatHistoryDisplayer: Implemented MUI, Docker Integration. The ChatHistoryDisplayer + consists of two parts: the server, which is being developed as an API, and the front-end, which + tests the API. The server is situated in the emulator directory, while the front-end is situated + in the frontEndSimulator directory. The mission of the API is to be integrated into the OnTrack + platform. + +## Deliverables Verification for T1 2023 + +The following items will be completed to verify that the project scope has been met: + +### Purely Documentation Oriented + +- [x] Modify the project epic and other related documents (make it relevant to T1/2023). + + - A modification to a markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +- [x] Update the document that outlines the deliverable items of the project. + + - A markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +- [x] Create a T1/2023 hand-over document. + - A markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +### Front-end Oriented + +#### Design + +- [x] Create frame-by-frame flows of tutors using the primary design. + + - Multiple images and a video showcase, as output from [Figma](https://www.figma.com/), in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign/design_images), + + - Additional information: These flows should determine whether an alteration to the single, + primary design is required and what specific alteration is required. This could be broken down + into tasks regarding specific flows for showing the use of specific features. + +- [x] Create `TaskSubmissionEnhancement` new Features to the student-view design. + + - Multiple images and a video showcase in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign/design_images), + as output from [Figma](https://www.figma.com/). + + - A markdown document that explains the functions and implementation of the new features in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +### Back-end Oriented + +#### `TaskSubmissionEnhancement` + +- [x] Create a prototype of `TaskSubmissionEnhancement` Component of the Ontrack platform that adds: + + - The ability to submit files regardless of the task state. + - The ability to submit individual task files. + - The ability to submit optional additional files outside of the task requirements. + - The ability to observe task file upload differences. + +- [x] Create `Submission enhancement test environment` for the new features on Student View. + +### Cyber-security Oriented + +- [x] Create a document that outlines the cybersecurity concerns of the current changes. + + - A markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +- [x] Create a document that introduce administrators to potential cyber security threats or issues. + + - A markdown document (or multiple) in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +- [x] Create a code script of malware-detection software to implement for the new feature. + + - A markdown document in + [thoth-tech/documentation](https://github.com/thoth-tech/documentation/tree/main/docs/OnTrack/Task%20Submission%20%26%20Redesign). + +## Sign Off + +- Client: Andrew Cain + +- Team Lead: Yaser Deeb + +- Code Guru Team: William Lowe, Sivasamyuktha A Selvarajuh 🔥 diff --git a/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Requirements.md b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Requirements.md new file mode 100644 index 00000000..5d9c653d --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Requirements.md @@ -0,0 +1,78 @@ +--- +title: Requirements +--- + +[Back to index](Index.md) + +- [Feature requirements](#feature-requirements) +- [Resources](#resources) + +## Feature Requirements + +Features: + +- [Chat bot](#chat-bot) +- [Require tutor interaction](#require-tutor-interaction) +- [Time-based log](#time-based-log) +- [Stages for tasks](#stages-for-tasks) +- [Commit system for uploads and comments](#commit-system) +- [Selective file replacer](#file-replacer) +- [Diff viewer](#diff-viewer) +- [Testing environment](#testing-environment) + +### Chat bot + +A chat bot that takes on existing features and mediates new features: + +### Require tutor interaction + +When a new upload event occurs, the tutor is required to send a substantive message to their +student. This can be communicated to the tutor via the [chat bot](#chat-bot). + +### Time-based log + +Displaying student/tutor and teacher events in a time-based log with the ability to scroll back and +view previous events. This uses a git-based ruby backend to store submission files. There is a +repository created for each individual submission task. + +### Stages for tasks + +The implementation of stages as extra resources for students who require more resources and +confidence. This enables students to tackle the task in different ways to help support their +learning. + +### Commit system + +The implementation of a commit system for tasks, enabling a set of mandatory core files to be +uploaded in the form of a commit. + +### File replacer + +The ability for students, tutors/teachers to view submitted files in their browser as well as write +and view submitted comments regarding those files. The file replacer is supported by the uplifted +file management system. + +### Diff viewer + +The ability for tutors to be able to compare code files submitted by students via a difference +viewer. + +### Testing environment + +An emulation of the back-end is required as a proof-of-concept. The emulation also serves as an +education piece for future collaborators. + +## Resources + +### Front-end development resources + +- [Google Font Icons](https://fonts.google.com/icons) +- [Figma Material Symbols](https://www.figma.com/community/plugin/1088610476491668236/Material-Symbols) +- [Figma Angular Materials](https://www.figma.com/community/file/967106164617088179) + +### Back-end development resources + +- [How to serve and manipulate git repositories from rails](https://stackoverflow.com/questions/67791598/how-to-serve-manipulate-git-repo-from-rails) +- [Rugged, a library for accessing libgit2 in Ruby](https://github.com/libgit2/rugged) +- [Ruby git](https://github.com/ruby-git/ruby-git) +- [Building a HTTP server in Ruby](https://blog.appsignal.com/2016/11/23/ruby-magic-building-a-30-line-http-server-in-ruby.html) diff --git a/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Submission-Enhancement-Overview-Doc.md b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Submission-Enhancement-Overview-Doc.md new file mode 100644 index 00000000..50477dee --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/Submission-Enhancement-Overview-Doc.md @@ -0,0 +1,104 @@ +--- +title: Submission Enhancement Overview Document +--- + +## Component Overview + +During Week 5 of the trimester, the team was able to secure a meeting with the client Andrew Cain +who suggested a pivoted focus towards enhancement for the Task Submission Component of the Ontrack +platform. The client outlined four features that he believes would benefit both students and +teaching staff. The features include: + +- The ability to submit files regardless of the task state. +- The ability to submit individual task files. +- The ability to submit optional additional files outside of the task requirements. +- The ability to observe task file upload differences. + +## Feature: The ability to submit files, regardless of the task state + +### Feature 1 Current Implementation + +Currently, the Ontrack platform only allows students to submit their files when the task state is +changed to ‘Ready for Feedback’. + +### Feature 1 Proposal + +Presented as a new button within the task card, the enhancement would allow for students to submit +their task files regardless of the task state (‘Not Started’, ‘Working On It’, ‘Need Help’ and +‘Ready for Feedback’). Future iterations of this feature could include automated task state changing +depending on conditional statements. E.g. Task remain as ‘Not Started’ until a file is uploaded +where it is then changed to ‘Working on It’ and then automatically changed to ’Ready for Feedback’ +when all files are uploaded. + +### Feature 1 Value + +In conjunction with the ability to submit individual task files, teaching staff will be able to +observe the progression of a student through the task. The ability to submit files during any stage +would allow for students to request help from the teaching staff for already submitted files so +discussion can be more targeted to the submissions in question. + +## Feature: The ability to submit individual task files + +### Feature 2 Current Implementation + +Currently, the Ontrack platform requires students to submit all the required task files, and in a +specific order, when completing the tasks. + +### Feature 2 Proposal + +Implemented alongside the ability to submit task files, regardless of the task state, the +enhancement will be present as a new upload dialog in which files can be upload in any order and +won’t require all files to be uploaded at once. Future iterations of this feature could include +individual task states (‘Working On It’, ‘Need Help’, and ‘Completed’) for each uploaded task. + +### Feature 2 Value + +The ability to submit individual files will benefit students by allowing them to submit portions of +their task. For tasks that require multiple files to be submitted for completion, this means that +students can submit their files a number of times as a form of version control, minimising the +potential for file loss if technical difficulties occur. + +## Feature: The ability to submit optional additional outside of the task requirements + +### Feature 3 Current Implementation + +Currently, the Ontrack platform does not allow for the upload of additional files outside of the +comment section for attachments. Students are only able to submit the required task files. + +### Feature 3 Proposal + +Implemented within the ability to submit individual files and in conjunction with the added freedom +to upload tasks in any order, the feature will present as a new submission item alongside the +required files, allowing students to submit files that are outside of the task’s requirements. + +### Feature 3 Value + +The feature will add value to both students and teaching staff as the students will be able to +submit files that they believe to be complementary to the task (e.g. Learning summaries, output +files, etc). Teaching staff will also be able to request additional files (expanded explanations, +output files, additional tasks) from the students during feedback, without having the need to use +the comment section’s attachments. + +## Feature: The ability to observe task file upload differences + +### Feature 4 Current Implementation + +Currently, the Ontrack platform does not support upload file diff-viewing. + +### Feature 4 Proposal + +The feature will be presented as a new tab or button or button to open a new display where task +submission files can be viewed as a side-by-side view with differences highlighted, akin to GitHub +pull-requests. + +### Feature 4 Value + +Primarily of value to the teaching staff, tasks that may have been marked as ‘Fix/Resubmit’ will be +able to be compared to their resubmitted task file. This will allow for easier identification of the +changes made, ensuring that appropriate fixes have been made by the student without the need to +review the entire upload. + +## Additional Notes + +No design choices have been finalised and should be iterated upon with input from the client and the +UI Enhancement team. diff --git a/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/User-Stories-and-Features.md b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/User-Stories-and-Features.md new file mode 100644 index 00000000..fb88668b --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Task Submission & Redesign/User-Stories-and-Features.md @@ -0,0 +1,71 @@ +--- +title: User Stories and Features +--- + +[Back to index](Index.md) + +The personas, user stories, and features (as derived from the user stories) for the Task View and +Submission Redesign project. + +## Identified Personas + +- Students +- Tutors +- Convenors +- Developers + +## User Stories + +In the form, "As a \[persona\], I \[want to\], \[so that\]." + +### Students + +1. As a \[student\], I \[want to be able to traverse OnTrack in a sensible way\], so that I \[can + submit my work with ease\]. +1. As a student, I \[want to be able to re-submit some of many files\], so that I \[do not have to + re-upload all files related to a task\]. +1. As a student, I \[want to be able to see a history of events\], so that I \ + [can see the last time a file was uploaded or a message was sent by the tutor\]. +1. As a student, I \[want to be able to include comments with my uploads\], so that I \[may discuss + the task with my tutor\]. +1. As a student, I \[want to be able to view my submissions in my browser\], so that I \[don't have + to keep downloading copies of my submissions\]. + +### Tutors + +1. As a tutor, I \[want to make sure that my students understand a concept\], so that \[they can + succeed at their studies\]. +1. As a tutor, I \[want to see a clear log of my interactions\], so that I \ + [can orient quicker\]. +1. As a tutor, I \[want to be able to compare student code files they have submitted\]. +1. As a masker, I \[want to be able to highlight and leave notes on files\], so that I \[can provide + feedback to my students\]. + +### Convenors + +1. As a convenor, I \[want tutors to interact with their students before marking\], so that \[they + interact with their students\]. + +### Developers + +1. As a developer, I \[want a high-fidelity wire-frame\], so that I \[can create a design that + further incorporates OnTrack/Doubtfire's visual style and nuance\]. +1. As a developer, I \[want a UI\UX prototype of the product\], so that I \[can create documentation + on the design\]. +1. As a developer, I \[want a UI/UX prototype of the product\], so that I \[can create a prototype + of the design\]. +1. As a developer, I \[want more interaction facilitated by a chat-bot\], so that \[interactions are + streamlined and feel modern\]. + +## Features + +1. A time-based log. + - Derived from student user story no. 3 and tutor user story no. 2. +1. Stages for tasks. + - Derived from tutor user story no. 1. +1. In-browser file viewer with comment appending capabilities. + - Derived from student user story no. 5 and tutor user story no. 4. +1. Selective file replacement. + - Derived from student user story no. 2. +1. Diff viewer + - Derived from tutor user story no. 3. diff --git a/src/content/docs/products/ontrack/Projects/Tutor Times/Documentation/DESIGN-BACK-END.md b/src/content/docs/products/ontrack/Projects/Tutor Times/Documentation/DESIGN-BACK-END.md new file mode 100644 index 00000000..c33ef58e --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Tutor Times/Documentation/DESIGN-BACK-END.md @@ -0,0 +1,145 @@ +--- +title: Backend Design Document for "Tutor Times" Feature in OnTrack +--- + +## 1. Introduction + +### 1.1 Purpose + +This document outlines the design of the backend for the "Tutor Times" feature in OnTrack (formerly +known as Doubtfire). The purpose is to establish the architectural and functional aspects of the +backend necessary to support efficient time tracking and management for tutors. + +### 1.2 Scope + +The scope of this design document covers the following aspects of the backend development for the +"Tutor Times" feature: + +- Data Models and Schema +- API Endpoints +- Authentication and Authorisation +- Background Jobs/Triggers +- Data Integrity Constraints +- Performance Optimization +- Security Measures +- Compatibility with Frontend and Other Modules + +### 1.3 Intended Audience + +This document is intended for backend developers, database administrators, and stakeholders involved +in the implementation of the "Tutor Times" feature. + +## 2. Architecture and Data Models + +- A link for UML diagrams will be provided here in future to illustrate the architecture and data + models for the "Tutor Times" feature. + +### 2.1 Data Storage + +- Create a new database table named `tutor_times` or modify an existing one to store marking time + data for tutors and students. +- Define fields such as `tutor_id`, `student_id`, `task_id`, `start_time`, and `end_time` to record + marking session details. + +### 2.2 Data Schema + +- Define a comprehensive data schema that includes relationships between tables to support the + required functionality. +- Ensure that the schema accommodates storing marking time data at both the student and task levels. + +### 2.3 Database Relationships + +- Establish relationships between tables to associate marking time data with tutors, students, and + tasks. +- Define foreign keys and indices to optimize query performance. + +## 3. API Design + +### 3.1 API Endpoints + +- Develop a set of RESTful API endpoints to interact with marking time data. +- Implement the following endpoints: + - `POST /api/tutor-times`: Create a new marking session record. + - `GET /api/tutor-times/:id`: Retrieve a specific marking session record. + - `GET /api/tutor-times/tutor/:tutor_id`: Retrieve all marking session records for a specific + tutor. + - `GET /api/tutor-times/student/:student_id`: Retrieve all marking session records for a specific + student. + - `PUT /api/tutor-times/:id`: Update an existing marking session record. + - `DELETE /api/tutor-times/:id`: Delete a marking session record. + +### 3.2 Authentication and Authorisation + +- Implement user authentication and authorisation to secure access to marking time data. +- Ensure that only authorised users (tutors and unit chairs) can perform CRUD operations on marking + session records. + +## 4. Background Jobs/Triggers + +### 4.1 Calculation of Marking Time Totals + +- Develop background jobs or database triggers to calculate and update total marking time for each + tutor and student. +- The system should automatically update marking time totals when new marking session records are + added or modified. + +## 5. Data Integrity and Validation + +### 5.1 Data Integrity Constraints + +- Implement data integrity constraints to ensure the accuracy and consistency of data. +- Enforce rules such as referential integrity and data type validation to maintain data quality. + +## 6. Non-Functional Requirements + +### 6.1 Performance Optimization + +- Optimize database queries and operations to ensure fast data retrieval, even as the volume of + marking time records grows. +- Implement caching mechanisms to reduce query load and enhance system performance. + +### 6.2 Security Measures + +- Implement necessary security measures to protect marking time data and prevent unauthorized + access. +- Use encryption to secure sensitive data, such as user credentials. + +### 6.3 Compatibility + +- Ensure compatibility with the frontend and other system components. +- Verify that the API endpoints work seamlessly with modern web browsers and other clients. + +## 7. Testing Strategy + +### 7.1 Unit Testing + +- Develop comprehensive unit tests for API endpoints, database interactions, and background jobs to + ensure the correctness and reliability of backend components. + +### 7.2 Integration Testing + +- Perform integration testing to verify the seamless integration of backend components with the + frontend and other system modules. + +## 8. Deployment Plan + +### 8.1 Deployment Environment + +- Deploy the backend of the "Tutor Times" feature to the production environment of OnTrack. + +### 8.2 Deployment Process + +- Follow a systematic deployment process to release backend updates, including version control and + continuous integration practices. + +## 9. Conclusion + +This design document provides a detailed plan for the backend implementation of the "Tutor Times" +feature in OnTrack. It covers the architectural aspects, data models, API design, security measures, +testing strategies, and deployment plans. By following this design, we ensure the reliable and +efficient operation of the "Tutor Times" feature, enhancing the user experience for tutors and +students. + +## 10. Appendices + +- Include any additional information, diagrams, or references that support the design document. diff --git a/src/content/docs/products/ontrack/Projects/Tutor Times/Documentation/DESIGN-FRONT-END.md b/src/content/docs/products/ontrack/Projects/Tutor Times/Documentation/DESIGN-FRONT-END.md new file mode 100644 index 00000000..7135b73a --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Tutor Times/Documentation/DESIGN-FRONT-END.md @@ -0,0 +1,210 @@ +--- +title: Frontend Design Document for "Tutor Times" Feature in OnTrack +--- + +## 1. Introduction + +### 1.1 Purpose + +This document outlines the design of the frontend for the "Tutor Times" feature in OnTrack (formerly +known as Doubtfire). The purpose is to provide an intuitive and user-friendly interface for tutors +to track and manage the time spent on providing feedback to students. + +### 1.2 Scope + +The scope of this design document covers the user interface (UI) and user experience (UX) aspects of +the "Tutor Times" feature within the OnTrack Learning Management System. This feature will enhance +the skill-based course delivery model by enabling tutors to monitor their time management +efficiently. + +### 1.3 Intended Audience + +This document is intended for frontend developers, designers, and stakeholders involved in the +implementation of the "Tutor Times" feature. + +## 2. User Interface (UI) Design + +### 2.1 Overview + +The "Tutor Times" feature will seamlessly integrate into the existing OnTrack UI, maintaining a +cohesive visual identity and navigation structure. + +### 2.2 Wireframes and Mockups + +#### 2.2.1 Dashboard + +- A link will be provided here in future to the mockup for the Dashboard. + +- The dashboard provides an overview of marking time statistics, including total time spent, average + time per student, and notifications. + +#### 2.2.2 Student Feedback Page + +- A link will be provided here in future to the mockup for the Student Feedback Page. + +- The Student Feedback Page displays a list of students and their respective marking times. Tutors + can start, stop, or manually input time for each student. + +### 2.3 Responsive Design + +The UI will be responsive to ensure a consistent user experience across various devices, including +desktops, tablets, and mobile phones. + +### 2.4 Colour Scheme + +- **Primary Colour**: OnTrack primary colour +- **Secondary Colour**: OnTrack secondary colour +- **Text Colour**: OnTrack text colours + +### 2.5 Typography + +- **Headings**: OnTrack head text font (Bold) +- **Body Text**: OnTrack body text font (Regular) +- **Buttons**: OnTrack button text (Semi-Bold) + +### 2.6 Icons + +Standard icons will be used for actions such as starting and stopping timers, along with custom +icons for notifications. + +### 2.7 Navigation + +The "Tutor Times" feature will be accessible through the main navigation menu within OnTrack. Clear +breadcrumbs will guide users through the application. + +### 2.8 Forms and Inputs + +Input forms will include text fields for manual time input, along with start and stop buttons for +timers. Error handling will include validation and user-friendly error messages. + +### 2.9 Notifications + +Notifications will be displayed at the top of the dashboard, providing real-time feedback on marking +progress and milestones. + +### 2.10 User Profiles + +Tutors will have access to their profiles to view personal information and settings. + +## 3. User Experience (UX) Design + +### 3.1 User Flows + +#### 3.1.1 Tracking Marking Time + +1. Tutors log in to OnTrack. +2. Tutors access the "Tutor Times" feature from the dashboard. +3. Tutors start a timer for a specific student. +4. Tutors stop the timer when finished. +5. Tutors can manually input time if needed. +6. Tutors receive notifications for milestones and progress. + +### 3.2 Accessibility + +Accessibility features will be implemented, including alt text for images, keyboard navigation, and +screen reader compatibility. + +### 3.3 Usability + +The UI will prioritize usability, with clear and intuitive interactions, ensuring tutors can +efficiently manage marking times. + +### 3.4 User Feedback + +A feedback mechanism will be incorporated for users to report issues or suggest improvements, +enhancing the feature over time. + +## 4. Interactive Features + +### 4.1 Timer/Stopwatch Feature + +- Tutors can start, stop, and reset timers to track marking time for each student accurately. + +### 4.2 Manual Time Input + +- Tutors have the option to manually input marking time for students, providing flexibility in time + tracking. + +### 4.3 Notification System + +- Real-time notifications will alert tutors of milestones and progress, enhancing user engagement. + +## 5. Performance Considerations + +### 5.1 Page Load Times + +Efforts will be made to optimize page load times to ensure a seamless user experience. + +### 5.2 Caching + +Caching mechanisms will be implemented to reduce load times and improve overall performance. + +## 6. Compatibility + +### 6.1 Browser Compatibility + +- Supported browsers: Chrome, Firefox, Safari, Edge +- Cross-browser compatibility will be ensured. + +### 6.2 Device Compatibility + +Responsive design will ensure compatibility with various devices, including desktops, tablets, and +mobile phones. + +## 7. Security + +### 7.1 Data Security + +- User data will be securely stored and protected against unauthorized access. + +### 7.2 HTTPS + +- HTTPS will be enforced to secure data transmission between the frontend and backend. + +## 8. Version Control and Collaboration + +### 8.1 Version Control + +- Git will be used for version control, following a branching strategy for collaborative + development. + +### 8.2 Collaboration Tools + +- Tools like Slack and project management software will facilitate communication among team members. + +## 9. Testing Plan + +### 9.1 Unit Testing + +- Unit tests will be developed for frontend components, including timers, input forms, and + notifications. + +### 9.2 User Acceptance Testing + +- User acceptance testing (UAT) will ensure that the "Tutor Times" feature meets user requirements + and expectations. + +## 10. Deployment Plan + +### 10.1 Deployment Environment + +- The feature will be deployed to the OnTrack production environment. + +### 10.2 Deployment Process + +- A systematic deployment process will be followed to release frontend updates to the live + environment. + +## 11. Conclusion + +This design document provides a comprehensive plan for the frontend implementation of the "Tutor +Times" feature in OnTrack. It outlines the UI/UX design, interactive features, performance +considerations, compatibility, security measures, and testing strategies. This design will enhance +the learning experience for tutors and students, promoting efficient time management and feedback +delivery. + +## 12. Appendices + +- Once the UI and UX designs are finalized, links will be provided to the mockups. +- Once the UML diagrams are finalized, links will be provided to the diagrams. +- Once the feature is implemented, a link will be provided to the frontend repository. diff --git a/src/content/docs/products/ontrack/Projects/Tutor Times/Documentation/REQUIREMENTS-BACK-END.md b/src/content/docs/products/ontrack/Projects/Tutor Times/Documentation/REQUIREMENTS-BACK-END.md new file mode 100644 index 00000000..b029b0fe --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Tutor Times/Documentation/REQUIREMENTS-BACK-END.md @@ -0,0 +1,153 @@ +--- +title: Backend Requirements Document +--- + +## Project Overview + +## Table of Contents + +1. [Introduction](#1-introduction) 1.1 [Purpose](#11-purpose) 1.2 [Scope] (#12-scope) 1.3 + [Intended Audience](#13-intended-audience) + +2. [Functional Requirements](#2-functional-requirements) 2.1 [Data Storage] (#21-data-storage) 2.2 + [API Endpoints](#22-api-endpoints) 2.3 + [Authentication and Authorisation](#23-authentication-and-authorisation) 2.4 + [Background Jobs/Triggers](#24-background-jobstriggers) 2.5 [Data Schema](#25-data-schema) + +3. [Non-Functional Requirements](#3-non-functional-requirements) 3.1 [Performance](#31-performance) + 3.2 [Security](#32-security) 3.3 [Compatibility](#33-compatibility) + +4. [User Stories](#4-user-stories) 4.1 [As a tutor...](#41-as-a-tutor) 4.2 + [As a unit chair...](#42-as-a-unit-chair) 4.3 [As a unit chair...](#43-as-a-unit-chair) + +5. [Database Schema](#5-database-schema) 5.1 [Tables and Fields] (#51-tables-and-fields) 5.2 + [Relationships](#52-relationships) 5.3 + [Data Integrity Constraints](#53-data-integrity-constraints) + +6. [Testing Requirements](#6-testing-requirements) 6.1 [Unit Testing] (#61-unit-testing) 6.2 + [Integration Testing](#62-integration-testing) + +## 1. Introduction + +### 1.1 Purpose + +The purpose of this document is to outline the requirements for the backend development of the +"Tutor Times" feature. This feature will enable the storage and retrieval of marking time data for +tutors and students. + +### 1.2 Scope + +The scope of this document covers the functional and non-functional requirements for the backend +implementation of the "Tutor Times" feature. + +### 1.3 Intended Audience + +This document is intended for backend developers and the development team responsible for +implementing the "Tutor Times" feature. + +## 2. Functional Requirements + +### 2.1 Data Storage + +- Create a new database table named `tutor_times` or modify an existing one to store marking time + data for tutors and students. +- Define fields such as `tutor_id`, `student_id`, `task_id`, `start_time`, and `end_time` to record + marking session details. + +### 2.2 API Endpoints + +- Develop a set of RESTful API endpoints to interact with marking time data. +- Implement the following endpoints: + - `POST /api/tutor-times`: Create a new marking session record. + - `GET /api/tutor-times/:id`: Retrieve a specific marking session record. + - `GET /api/tutor-times/tutor/:tutor_id`: Retrieve all marking session records for a specific + tutor. + - `GET /api/tutor-times/student/:student_id`: Retrieve all marking session records for a specific + student. + - `PUT /api/tutor-times/:id`: Update an existing marking session record. + - `DELETE /api/tutor-times/:id`: Delete a marking session record. + +### 2.3 Authentication and Authorisation + +- Implement user authentication and authorisation to secure access to marking time data. +- Ensure that only authorised users (tutors and unit chairs) can perform CRUD operations on marking + session records. + +### 2.4 Background Jobs/Triggers + +- Develop background jobs or database triggers to calculate and update total marking time for each + tutor and student. +- The system should automatically update marking time totals when new marking session records are + added or modified. + +### 2.5 Data Schema + +- Define a comprehensive data schema that includes relationships between tables to support the + required functionality. +- Ensure that the schema accommodates storing marking time data at both the student and task levels. + +## 3. Non-Functional Requirements + +### 3.1 Performance + +- Optimize database queries and operations to ensure fast data retrieval, even as the volume of + marking time records grows. +- Implement caching mechanisms to reduce query load and enhance system performance. + +### 3.2 Security + +- Implement necessary security measures to protect marking time data and prevent unauthorised + access. +- Use encryption to secure sensitive data, such as user credentials. + +### 3.3 Compatibility + +- Ensure compatibility with the frontend and other system components. +- Verify that the API endpoints work seamlessly with modern web browsers and other clients. + +## 4. User Stories + +### 4.1 As a tutor + +- Tutors should be able to view their marking time data on the frontend interface, which is + retrieved from the backend via API calls. + +### 4.2 As a unit chair + +- Unit chairs should have access to total marking time data for each tutor through the frontend + interface. + +### 4.3 As a unit chair + +- Unit chairs should be able to see marking time data at the task level through the frontend + interface. + +## 5. Database Schema + +- Will include a database schema diagram here in future. + +### 5.1 Tables and Fields + +- Create or modify database tables according to the defined schema. +- Define fields, data types, constraints, and relationships between tables. + +### 5.2 Relationships + +- Establish relationships between tables to associate marking time data with tutors, students, and + tasks. + +### 5.3 Data Integrity Constraints + +- Implement data integrity constraints to ensure the accuracy and consistency of data. + +## 6. Testing Requirements + +### 6.1 Unit Testing + +- Develop comprehensive unit tests for API endpoints, database interactions, and background jobs to + ensure the correctness and reliability of backend components. + +### 6.2 Integration Testing + +- Perform integration testing to verify the seamless integration of backend components with the + frontend and other system modules. diff --git a/src/content/docs/products/ontrack/Projects/Tutor Times/Documentation/REQUIREMENTS-FRONT-END.md b/src/content/docs/products/ontrack/Projects/Tutor Times/Documentation/REQUIREMENTS-FRONT-END.md new file mode 100644 index 00000000..9149d7cc --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Tutor Times/Documentation/REQUIREMENTS-FRONT-END.md @@ -0,0 +1,150 @@ +--- +title: Frontend Requirements Document +--- + +## Project Overview + +## Table of Contents + +[1. Introduction](#1-introduction) + +- [1.1 Purpose] +- [1.2 Scope] +- [1.3 Intended Audience] + +[2. Functional Requirements] + +- [2.1 Tutor's Marking Progress Page] +- [2.2 User Interface] +- [2.3 Timer/Stopwatch Feature] +- [2.4 Manual Time Input] +- [2.5 Notification System] + +[3. Non-Functional Requirements](#3-non-functional-requirements) + +- [3.1 Performance] +- [3.2 Usability] +- [3.3 Compatibility] +- [3.4 Security] + +[4. User Stories](#4-user-stories) + +- [4.1 User Story 1] +- [4.2 User Story 2] +- [4.3 User Story 3] + +[5. Design Mockups](#5-design-mockups) + +[6. Testing Requirements](#6-testing-requirements) + +- [6.1 Unit Testing] +- [6.2 User Acceptance Testing] + +## 1. Introduction + +### 1.1 Purpose + +The purpose of this document is to outline the requirements for the frontend development of the +"Tutor Times" feature. This feature will enable tutors to track and manage the time spent on +providing feedback to students. + +### 1.2 Scope + +The scope of this document covers the functional and non-functional requirements for the frontend +implementation of the "Tutor Times" feature. + +### 1.3 Intended Audience + +This document is intended for frontend developers and the development team responsible for +implementing the "Tutor Times" feature. + +## 2. Functional Requirements + +### 2.1 Tutor's Marking Progress Page + +- Create a dedicated page/dashboard where tutors can view their marking progress. +- Display the time spent providing feedback to each student. + +### 2.2 User Interface + +- Design an intuitive and user-friendly interface for the Tutor's Marking Progress Page. +- Ensure responsive design for various screen sizes and devices. +- Provide an option for tutors to manually input marking time. + +### 2.3 Timer/Stopwatch Feature + +- Implement a timer or stopwatch feature that tutors can start and stop to track time spent on each + student. +- Ensure accuracy in time tracking. + +### 2.4 Manual Time Input + +- Allow tutors to manually input marking time for each student in case they forget to start or stop + the timer. + +### 2.5 Notification System + +- Implement a notification system to alert tutors when they reach specific time milestones. + +### 3. Non-Functional Requirements + +## 3.1 Performance + +- Ensure that the Tutor's Marking Progress Page loads quickly. +- Minimize any performance impact on the overall application. + +## 3.2 Usability + +- The user interface should be intuitive and easy to use for tutors. +- Ensure that the feature is accessible to all users. + +## 3.3 Compatibility + +- Ensure compatibility with modern web browsers (e.g., Chrome, Firefox, Safari). +- Verify cross-browser compatibility and address any compatibility issues. + +## 3.4 Security + +- Implement necessary security measures to protect user data and prevent unauthorized access to + arking time records. + +## 4. User Stories + +### 4.1 User Story 1 + +**# As a tutor, I want to see how long I have spent providing feedback to each student.** + +- Tutors should be able to view the time spent on each student's feedback on the Tutor's Marking + Progress Page. + +### 4.2 User Story 2 + +### As a unit chair, I want to see how long each tutor has spent providing + +feedback to each student.\*\* + +- Unit chairs should have access to view the total marking time for each tutor on the Tutor's + Marking Progress Page. + +## 4.3 User Story 3 + +**As a unit chair, I want to see how long each tutor has spent providing feedback to each task.** + +- Unit chairs should be able to see the time spent by each tutor on specific tasks on the Tutor's + Marking Progress Page. + +## 5. Design Mockups + +- Link will be provided to the design mockups for the Tutor's Marking Progress Page. + +## 6. Testing Requirements + +## 6.1 Unit Testing + +- Develop unit tests to ensure the correctness and reliability of frontend components, including + timers, manual input, and notifications. + +## 6.2 User Acceptance Testing + +- Conduct user acceptance testing to verify that the "Tutor Times" feature meets the requirement and + user expectations. diff --git a/src/content/docs/products/ontrack/Projects/Tutor Times/UML Diagrams/UML_DIAGRAM.md b/src/content/docs/products/ontrack/Projects/Tutor Times/UML Diagrams/UML_DIAGRAM.md new file mode 100644 index 00000000..8e845235 --- /dev/null +++ b/src/content/docs/products/ontrack/Projects/Tutor Times/UML Diagrams/UML_DIAGRAM.md @@ -0,0 +1,21 @@ +--- +title: UML diagram:New feature 'Tutor Times' in OnTrack +--- + +Author: Devanshi Patel + +Company: Thoth Tech + +## Introduction + +This Document outlines the flow of the new feature 'Tutor Time' into Ontrack. + +## Use Case Diagram + +- [UML - Tutor Time] + () + +## UML Diagram + +- [UML - Tutor Time] + () diff --git a/src/content/docs/products/ontrack/documentation/Review-ontrack-github.md b/src/content/docs/products/ontrack/documentation/Review-ontrack-github.md new file mode 100644 index 00000000..97e23f53 --- /dev/null +++ b/src/content/docs/products/ontrack/documentation/Review-ontrack-github.md @@ -0,0 +1,27 @@ +--- +title: Review of OnTrack folder in GitHub Document +--- + +This document reviews the folders within OnTrack repository and determines which folders fall under +what categories. + +| **Projects** | **Documentation** | +| ---------------------------------------------- | --------------------------------------------------------------------- | +| Group task submission | Deployment –Enhanced Authentication | +| Numbas | Deployment – Google Cloud | +| Staff Grant Extension | Deployment | +| Task Submission& Redesign-Design_Images | Documentation | +| Task Submission& Redesign – misc_media T3-2022 | File Submission Enhancements-Word Document Submission Project Summary | +| Task Submission & Redesign Arrangement | Front End Migration – Framework | +| Tutor Times | Front End Migration - Migration | +| | Front End Migration – Research & Findings | +| | Front End Migration – Testing | +| | Incorporate Content Ontrack | +| | Jupyter Notebook \* Don’t include Meeting Minutes | +| | Multiple Organisations | +| | UI Enhancement \* put under the Front End Migration | +| | Voice Verification | + +| **OnTrack SetUp** | +| ----------------- | +| Local SetUp | diff --git a/src/content/docs/products/ontrack/documentation/deployment/User Stories.md b/src/content/docs/products/ontrack/documentation/deployment/User Stories.md new file mode 100644 index 00000000..a09b4e00 --- /dev/null +++ b/src/content/docs/products/ontrack/documentation/deployment/User Stories.md @@ -0,0 +1,64 @@ +--- +title: User Stories +--- + +## Provide password management for LDAP and database implementations + +As a user, I want to be able to easily access and check my password, and change it when I need, so I +can avoid my information being leaked. + +As a product owner, I want to have my user's passwords stored in a secure way, so that they can +avoid data breaches and unnecessary legal consequences. + +As a product owner, I want to have a database that is easy and low costing to maintenance, easy to +be consistent with future add-ons, so that can save my efforts. + +## Add LDAP Server Option + +As a product owner, I want an in-house authentication solution developed that meets all our +authentication needs, so that we do not have to rely on third-party authentication solutions within +the OnTrack architecture. + +As a user, I want to be assured that the authentication solution is secure, so that my passwords and +other information is not publicly disclosed. + +As a user, I want the authentication solution to be reliable and respond swiftly, so that I can +access my account as needed and on-demand. + +## Extend API with user management + +As a user, I want to be able to reset my Ontrack password myself, so I do not need to contact a +system administrator. + +As a system administrator, I want users to be able to reset their passwords without my input. I also +want the ability to send a password reset request to users. This will save me time and increase +security by allowing insecure/exposed passwords to be easily changed. + +## Thoth Tech Ontrack deployment to Google Cloud + +As a product owner, I want to have more freedom in OnTrack development of the company's evolving +vision separated from the Deakin version. + +As a student/admin, I want to access the OnTrack via the URL from anywhere and should be able to +perform all actions those are performed by students on Deakin version of track. + +As a product owner, I want separation of roles as available in Deakin version of OnTrack. + +As a product owner, I want an email sent every time there is a successful build sent to production + +## Ontrack Pipeline CI/CD + +As a system admin, I want to have OnTrack built and deployed automatically with minimal user +intervention in the process, so that the latest version is available. All the building processes +should be automated so all I must do is initiate the building. + +As a user, I want to access an up-to-date version of OnTrack hosted on GCP (Google Cloud Platform) +so that I will not have to wait for the service to be manually updated. + +As a developer, I want the pipeline to be as simple and maintainable as possible so that it can +easily be updated to support future versions of OnTrack. Different versions should be obvious and +labelled appropriately. + +As a developer, I want a generic deployment pipeline that can be simply changed out in the future, +so that deployment targets for different services can be used. This should be done with +environmental variables. diff --git a/src/content/docs/products/ontrack/documentation/sidekiq-investigation/Sidekick-investigation.md.txt b/src/content/docs/products/ontrack/documentation/sidekiq-investigation/Sidekick-investigation.md.txt new file mode 100644 index 00000000..25047817 --- /dev/null +++ b/src/content/docs/products/ontrack/documentation/sidekiq-investigation/Sidekick-investigation.md.txt @@ -0,0 +1,68 @@ +--- +title: "Spike Research: Integrating Sidekiq with Ruby on Rails" +--- + +# Spike Research Document: Integrating Sidekiq with Ruby on Rails + +## Objective + +The purpose of this spike is to explore the integration of Sidekiq for background job processing in +our Ruby on Rails application, understand its setup and configuration, and identify any potential +issues that may arise during its implementation and deployment. + +## Introduction + +Background job processing is an essential component of modern web applications, allowing +long-running tasks to be handled asynchronously to improve user experience and system performance. +Sidekiq is a Ruby background job processor that uses threads to handle many jobs at the same time in +the same process. + +## Methodology + +Research for this spike was conducted by reviewing Sidekiq's official documentation, community +forums, and GitHub issues. Additionally, a prototype was created in a development environment to +test the integration points and monitor the behavior of Sidekiq within the context of our +application. + +## Findings + +1. Installation and Configuration + +- Sidekiq is easily installable as a gem in Ruby on Rails. +- Configuration is straightforward, with the need to set up a sidekiq.yml file and initialize the + Redis server, which Sidekiq uses for job storage. +- Sidekiq's dashboard provides a web interface to monitor job queues, which can be mounted within + Rails routes. + +2. Operational Insights + +- Sidekiq requires Redis to be available and properly configured. +- Memory usage is manageable, but careful monitoring is required to prevent leaks over time. +- Concurrency settings and job prioritization are critical for optimal performance. + +3. Deployment Considerations + +- Deployment to platforms like Heroku requires additional add-ons for Redis. +- Environment variables need to be managed securely, especially for the Redis URL. +- Sidekiq can be scaled independently by increasing worker dynos. + +4. Best Practices + +- Regularly update the Sidekiq gem to benefit from the latest improvements and security patches. +- Ensure idempotency of jobs to avoid duplicating work in case of retries. +- Monitor Sidekiq with tools like New Relic or Sentry to track failures and performance issues. + +## Challenges and Solutions + +1. - Challenge: Ensuring jobs are retried correctly after failures. + - Solution: Implementing custom retry logic within jobs and leveraging Sidekiq's middleware for + error handling. +2. - Challenge: Handling large job volumes without overloading the Redis instance. + - Solution: Scaling Redis and optimizing job size and complexity. + +## Conclusion + +The integration of Sidekiq into our Ruby on Rails application appears to be a robust solution for +our background processing needs. With its ease of use, extensive documentation, and active +community, Sidekiq offers the features we require to improve our application's performance and +reliability. \ No newline at end of file diff --git a/src/content/docs/products/ontrack/issues-and-resolutions/Doubtfire in CodeSpaces.md b/src/content/docs/products/ontrack/issues-and-resolutions/Doubtfire in CodeSpaces.md new file mode 100644 index 00000000..2963d1de --- /dev/null +++ b/src/content/docs/products/ontrack/issues-and-resolutions/Doubtfire in CodeSpaces.md @@ -0,0 +1,143 @@ +--- +title: Spike - Investigate running Dev container and code base in CodeSpaces +--- + +**Spike:** 01 + +**Title:** Investigate running Dev container and code base in CodeSpaces + +**Author:** Brian Caldera, + +![GitHub CodeSpaces Logo](/spike-cover-1.jpg) + +## Goals / Deliverables + +Creating a cloud-based development environment using GitHub Codespaces to run Ontrack is a valuable +initiative to streamline the setup process for students struggling with local development +environments. To explore this, here's a step-by-step guide on setting up Ontrack in a Codespace. + +Codespaces offer a flexible, cloud-based development environment but might have limitations +depending on the specific requirements of the application. Testing and validation are crucial to +ensure it meets the needs of running Ontrack effectively. + +## Technologies, Tools, and Resources used + +- Internet Browser; Google Chroame, FireFox, Safari +- GitHub Account +- GitHub Codespaces +- Docker +- Docker-in-Docker +- GitHub Repository: thoth-tech/dotfire-deploy, thoth-tech/doubtfire-web and + thoth-tech/doubtfire-api +- Text Editor: VsCode +- Terminal: zsh + +## Tasks undertaken + +1. Creating a Codespace + + - Sign in to GitHub and navigate to the repository containing Ontrack. (Make sure you fork the + repository first from thoth-tech/dotfire-deploy, thoth-tech/doubtfire-web and + thoth-tech/doubtfire-api) + - Click on the "Code" button and select "Open with Codespaces" or navigate to "Code" > "New + Codespace." + + ![figure-1](/codespaces-8.png) + +2. Install Docker-in-Docker in Codespace + + - Confirm that Docker is installed and running in the Codespace by running the following command + in the terminal: wihch docker + + ![figure-2](/codespaces-1.png) + +3. Configuring Codespace for Ontrack: + + - Codespaces use a configuration file called .devcontainer to define the development environment. + Create a .devcontainer folder in the root of the Ontrack repository if it doesn’t exist. + (Replace this folder with the existing .devcontainer folder in the repository) + +4. Running Ontrack in Codespace: + + - Codespaces will use the defined configuration to create a containerized environment. It will + automatically install dependencies, clone the repository, and set up Ontrack based on the + configuration provided. + + ![figure-3](/codespaces-3.png) + + ![figure-4](/codespaces-4.png) + + ![figure-5](/codespaces-2.png) + +## What we found out + +The front-end seemed to run fine, but the back-end was not working as expected. The back-end server +was not running, and the database was not connected. The following error was displayed in the +terminal: + +```bash +ERROR: ActionDispatch::HostAuthorization::DefaultResponseApp Blocked host: +``` + +![figure-6](/codespaces-7.png) + +![figure-7](/codespaces-6.png) + +![figure-8](/public/codespaces-5.png) + +## Open issues/risks + +Typically this error occurs when the Rails application is configured to allow requests only from +specific hosts for security reasons. When attempting to access the application from an unauthorized +host (in this case, the Codespace), this error is triggered. + +To resolve this issue when running a Rails application in a Codespace, you can modify the +configuration to allow requests from the Codespace host. Here are steps you can take: + +- Step 1: Find the Codespace host name. (To determine the host that your Codespace is using, you can + usually find it in the browser's address bar when you access the application.) +- Step 2: Add the host name to the list of allowed hosts in the Rails application. (To do this, you + can add the host name to the config.hosts array in the config/environments/development.rb file.) +- Step 3: Restart the Rails server. (To restart the Rails server, you can run the following command + in the terminal: `rails s`) + +**Note**: + +Always ensure that the hosts allowed in the config.hosts array are trusted and secured. Adding a +Codespace host should be done cautiously, especially in a production environment. + +By adding the Codespace host to the allowed hosts in your Rails application's configuration, you +should be able to resolve the Blocked host error and access the application within the Codespace +without issues. + +**Important**: + +![figure-9](/codespaces-9.png) + +Ontrack demands substantial resources, specifically a minimum of a 4-core, 16GB RAM, 32GB virtual +machine for smooth operation. This high resource demand could pose a potential issue with +cost-effectiveness, as provisioning Codespaces meeting these specifications might lead to increased +expenses, especially for extended use or multiple concurrent instances. Evaluating the cost +implications alongside performance requirements is crucial before deciding to utilize GitHub +Codespaces for running Ontrack's development environment. Further optimization or alternative +hosting solutions might need consideration to balance performance needs and cost efficiency +effectively. + +## Recommendations + +Despite encountering challenges related to the initial setup and resource requirements, this spike +has significantly increased the team's confidence in the feasibility of deploying Ontrack on GitHub +Codespaces. While there were hurdles to overcome regarding security configurations and +resource-intensive demands, the successful resolution of these issues demonstrates the adaptability +and potential of utilizing Codespaces for development purposes. + +It is recommended that the team proceed with caution and further exploration of deploying Ontrack on +GitHub Codespaces. However, before full implementation, a comprehensive cost-benefit analysis should +be conducted to assess the long-term financial implications of maintaining Codespaces meeting +Ontrack's resource demands. Additionally, ongoing optimizations and adjustments to streamline the +development environment within Codespaces could enhance efficiency and mitigate potential cost +concerns. + +With careful consideration of costs, continuous optimization efforts, and confidence gained from +this spike, the team can move forward confidently toward leveraging GitHub Codespaces for Ontrack's +development environment, recognizing its potential benefits for the development workflow. diff --git a/src/content/docs/products/ontrack/issues-and-resolution/troubleshooting doubtfire setup.md b/src/content/docs/products/ontrack/issues-and-resolutions/troubleshooting doubtfire setup.md similarity index 100% rename from src/content/docs/products/ontrack/issues-and-resolution/troubleshooting doubtfire setup.md rename to src/content/docs/products/ontrack/issues-and-resolutions/troubleshooting doubtfire setup.md diff --git a/src/content/docs/products/splashkit/applications/Applications Epic-T12022.md b/src/content/docs/products/splashkit/applications/Applications Epic-T12022.md deleted file mode 100644 index 5f4ab21a..00000000 --- a/src/content/docs/products/splashkit/applications/Applications Epic-T12022.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Application Epic T1-2022 ---- - -## Background/Context - -SplashKit is widely used to create 2D games. It is proposed to extend this for games to be set up -and added to a physical arcade machine where they can be played and showcased. - -## Business value - -Games are an attraction to different age groups, this functionality of providing games and an -article including content to help create similar games would be helpful for interested individuals. - -## What needs to happen - -Creating a method to upload games and store them locally on a system, have them be selected and -played at the user’s leisure. Validation checks on all uploaded games before being playable -(manually, at least initially) for malice/inappropriate content. Create a cool game demonstrating -all functionality of SplashKit. A step-by-step article guide of How to create a Cool game. Guide -should be uploaded to the SplashKit.io website. Document design decisions, process and -how-to-guides. - -## In-Scope - -The first game of Arcade machine. Article guide. - -## Out-Scope - -Building the hardware (presently; may be in scope for future trimesters) - -## Assumptions/Dependencies - -First game needs to be ready, in order to add it to the arcade/showcase. Raspberry Pi will merge -with preconfigured controls without too much complication - -## UI/UX considerations - -- Arcade layout -- Arcade gallery/selection menu UI needs to fit the SplashKit design palette, consistent with - existing SplashKit style (matches website style, etc) -- UI should be user friendly - -## Analytics considerations - -Comparison of different game functionality and time management, upload/download statistics? - -## Regulation & Compliance considerations - -- Secure channels, hardware safety, adequate encryptions and system protection. -- User and publisher consent - -## Operation/Training/Support considerations - -Team members will need to become familiar with SplashKit, C++, potentially Clang (compiler). Advise -teams 2 weeks in advance of planned release - -## What are the challenges? - -- Existing skill gaps (team members needing to learn new languages). -- Creating the physical arcade while remote (for later stages – can't currently implement physical - arcade aspect) -- Creating a game without knowing physical requirements - -## Acceptance criteria - -- Successful execution of building arcade (a user should be able to select and play a game to - completion on a physical arcade machine) -- Functional game (written using SplashKit) -- Step by step guide on how to create game -- Channel exists for users to upload/download validated games diff --git a/src/content/docs/products/splashkit/documentation/expansions/splashkit-online-research-outcome.md b/src/content/docs/products/splashkit/documentation/expansions/splashkit-online-research-outcome.md new file mode 100644 index 00000000..97cda309 --- /dev/null +++ b/src/content/docs/products/splashkit/documentation/expansions/splashkit-online-research-outcome.md @@ -0,0 +1,212 @@ +--- +title: SplashKit Online Research Spike Outcome +--- + +**Spike:** NA + +**Title:** SplashKit Online Research Spike Plan + +**Author:** Sean Boettger, sboettger@deakin.edu.au, sean@whypenguins.com + +## Goals / Deliverables + +The goal of this spike was to investigate whether Emscripten and Emception could be used to compile +and run SplashKit online via WASM, and in doing so produce this report. In the process, a fork of +SplashKit-Core was made to improve reproducibility. This can be found here: +https://github.com/WhyPenguins/splashkit-core/tree/EmscriptenTest + +## Technologies, Tools, and Resources used + +- Internet Browser: Firefox +- Programming Languages: C++, Python, Javascript +- Compilers: Emscripten +- Docker +- Emception +- Programming Libraries: SplashKit +- Text Editor: Notepad++ +- Terminal + +## Tasks undertaken + +Here are the key tasks that were performed to produce the main results. The actual path taken took a +bit more research and experimentation. + +### Testing Emscripten + +- Installed and activated Emscripten using emsdk (see + https://emscripten.org/docs/getting_started/downloads.html) +- Tried compiling some simple SDL code (such as that found here + https://blog.conan.io/2023/07/20/introduction-to-game-dev-with-sdl2.html) with the command + `emcc -sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='["bmp","png","xpm"]' sdl_test.cpp -o sdl_test.html`. + Emscripten already has ports for many libraries such as SDL, which was found out about here + (https://emscripten.org/docs/compiling/Building-Projects.html) +- Ran a python web server with `python -m http.server` +- Navigated to localhost:8000 - the program was running in the browser. + +### Compiling SplashKit to WASM + +- This took a few changes to SplashKit's source code. To make this easier to reproduce, a fork of + SplashKit-Core has been created that has a branch with the changes required to make SplashKit + compile a simple example under Emscripten. See here: + https://github.com/WhyPenguins/splashkit-core/tree/EmscriptenTest + +#### The following is a brief list of changes + +- Cloned SplashKit-Core +- Modified CMakeLists.txt as follows: - Appended `set(CMAKE_C_COMPILER "emcc") ` + `set(CMAKE_CXX_COMPILER "emcc")` at the top. - Appended `-sUSE_SDL=2` to the make flags. - + Appended the following to be linked: - `-sUSE_SDL=2` - `-sUSE_SDL_TTF=2` - `-sUSE_SDL_GFX=2` - + `-sUSE_SDL_NET=2` - `-sUSE_SDL_MIXER=2` - `-sUSE_SDL_IMAGE=2` - + `-sSDL2_IMAGE_FORMATS='["bmp","png","xpm"]'` and removed any existing duplicates. - Modified a few + of the files and dependencies to either use Windows or Linux headers depending on what they + required (perhaps the build environment was unusual). - Commented out tests +- Modified web_driver.cpp and terminal.cpp so they were stubs without includes. +- At this point running `cmake -G "Unix Makefiles" . && make` built. +- To test functionality simply, the code from the starting tutorial + (https://splashkit.io/articles/guides/tags/starter/get-started-drawing/) was brought across and + replaced the Tests in the test folder. The test target in the makefile was modified to output this + test. `set(CMAKE_EXECUTABLE_SUFFIX ".html")` was also important to make it output properly. +- From here, the Python webserver was started in the output directory, and the starting tutorial + could be ran in the browser. + +### Compiling Emception + +- First Docker was installed, and WSL2 setup. +- Next, Emception was cloned and built following the instructions + (https://github.com/jprendes/emception) +- Unfortunately, a number of issues were encountered. Compiling LLVM took approximately 16GB of RAM, + and so the VM's RAM and swap limits needed to be adjusted; otherwise the compilation process was + killed. It also took approximately a day. +- Compilation errors were encountered later on. These have been reported already on the repository + (https://github.com/jprendes/emception/issues/24), and no fix nor work around has been proposed + yet. In order to not spend too long, Emception was shelved for now to work on interfacing + SplashKit with Javascript. + +### Using SplashKit as a Library in Javascript + +- There were three different approaches that could be taken - each one was tested along with + pros/cons examined. +- First step was to test 'cwrap'ing. +- The Main function was renamed, and wrapped in `extern "C"` +- An additional 'rerender' function was added, to test multiple calls. +- `-sEXPORTED_RUNTIME_METHODS=ccall,cwrap` was added to the makefile +- From here, the file was loaded in the browser, and the following executed on the brower's console: + +``` +start_main = Module.cwrap('start_main', 'number', []) +start_main()` +different_render = Module.cwrap('different_render', 'number', []) +different_render() +``` + +- This method worked easily, however wrapping create_window immediately posed issues as it takes a + C++ string (not a primitive), and also returns something other than a primitive. Methods involving + manual allocation were investigated, but instead the two binding implementations Embind and WebIDL + Binder seemed more promising. +- Embind bindings for color and a few functions were created. They look as follows: + +``` +EMSCRIPTEN_BINDINGS(color) { + emscripten::value_object("color") + .field("r", &color::r) + .field("g", &color::g) + .field("b", &color::b) + .field("a", &color::a); +} +EMSCRIPTEN_BINDINGS(my_module) { + emscripten::function("open_window", (window (*)(std::string, int, int)){&open_window}, emscripten::allow_raw_pointers()); + emscripten::function("clear_screen", (void (*)(void)){&clear_screen}); + emscripten::function("clear_screen_color", (void (*)(color)){&clear_screen}); + emscripten::function("refresh_screen", (void (*)(void)){&refresh_screen_}); +} +``` + +- Unfortunately it seems Embind has issues with raw pointers, which SplashKit uses a lot of. + Apparently it should only have issues with pointers to primitive types, but the same error was + encountered even with structures (such as \_window_data\*). +- Finally WebIDL Binder was tried out. +- SplashKitWasm.idl was created and filled out with some simple prototypes. +- The C++ and Javascript glue was created by running + `python ../../emsdk/upstream/emscripten/tools/webidl_binder.py SplashKitWasm.idl SplashKitWasmGlue` +- It was tested at the console with the following commands: + +``` +SK = new Module.SplashKitJavascript() +SK.open_window("Testing!", 800, 600) +SK.clear_screen(SK.color(0.7,0,1,1)) +SK.refresh_screen() +``` + +``` +SK.clear_screen(SK.color(1,1,1,1)); +SK.fill_ellipse(SK.color(0,1,0,1), 0, 400, 800, 400); +SK.fill_rectangle(SK.color(0.4,0.4,0.4,1), 300, 300, 200, 200); +SK.fill_triangle(SK.color(1,0,0,1), 250, 300, 400, 150, 550, 300); +SK.refresh_screen() +``` + +- It was here that testing was ended and this report was written up. The results can be seen in the + final commit on the EmscriptenTest branch. + +This report took a bit longer to write up than it should have, as initially all the tests with +Emscripten were performed using a personal compilation tool in order to make initial testing quick. +That tool continued to be used to compile SplashKit-Core. Migrating to using SplashKit-Core's own +compilation method took longer, but hopefully by doing so the results can be more easily reproduced +and expanded on in the future. + +## What we found out + +### Code using SplashKit can be compiled with Emscripten and run in the browser. + +#### What worked + +During testing, the majority of SplashKit was compiled and linked successfully, and basic +functionality (opening a window, drawing shapes) was confirmed to work. In the SDL test, SDL input +was confirmed to work, making it likely it does in SplashKit as well. + +#### What wasn't tested + +Any functionality outside of that was not tested, including sound, animation, etc. Twitter, +terminal, serial and JSON functionality was also not tested/replaced with stubs. + +#### What didn't work + +Web functionality was replaced with stubs due to the usage of cURL which is not currently compilable +under Emscripten. See (https://github.com/emscripten-core/emscripten/issues/3270) + +### SplashKit can be compiled as a library and used in Javascript. + +Embind seemed promising but due to issues with raw pointers WebIDL Binder was investigated further +and is plausibly the better alternative for this project. It has issues with functions in global +scope unfortunately (https://github.com/emscripten-core/emscripten/issues/8390), requiring the +majority of SplashKit's functions to be wrapped in a class. + +### Emception was unable to be compiled. + +Until the bug here (https://github.com/jprendes/emception/issues/24) is fixed, it seems like it will +be difficult to compile Emception without really digging into how it works and correcting the +problem ourselves. Whether this is worth it or not is hard to say. + +## Open issues/risks + +As Emception was unable to be compiled, it is difficult to evaluate whether it would have been a +good solution. There is risk that continuing to try and use it would just consume more time. + +Much of SplashKit is also yet to be tested; perhaps there are yet unknown issues regarding sound and +other interactivity. Testing of larger codebases using SplashKit should be conducted. + +## Recommendation + +One way forward would be to continue developing SplashKit Online as a Javascript based scripting +environment; it has been confirmed SplashKit can be used as a library via Javascript, and this +ensures no load on the server regarding compiling, and also no uncertainty regarding whether it will +be possible to get Emception working. + +Another way forward is to use Emscripten as a back-end compiler to the web IDE, similar to the +original SplashKit Online repository. This introduces more complexity on the server side, but would +allow users to develop using C++ just as they would on their own computer. + +Finally, it might be worth continuing to investigate Emception and try to get it to compile. Several +unknowns exist - how long will it take to understand and make compile, and if it runs whether it be +able to compile well enough (there are concerns regarding speed). If it is successful however this +would probably give the best result, but there are many unknowns. diff --git a/src/content/docs/products/splashkit/documentation/expansions/splashkit-online-research-plan.md b/src/content/docs/products/splashkit/documentation/expansions/splashkit-online-research-plan.md new file mode 100644 index 00000000..09a92967 --- /dev/null +++ b/src/content/docs/products/splashkit/documentation/expansions/splashkit-online-research-plan.md @@ -0,0 +1,70 @@ +--- +title: SplashKit Online Research Spike Plan +--- + +**Name:** SplashKit Online Research Spike Plan + +## Context + +It would be useful if SplashKit could be used directly in-browser, in order to make it easier for +people to get started without difficulties setting it up locally on their own machine. Last +trimester the SplashKit Online project was started, however due to its difficulty was placed on +hold. + +The purpose of this spike is to investigate technologies that may make running it online more +viable, and explore which ways seem most promising. The main technology to be investigated here is +WebAssembly (or WASM), which was mentioned in the readme for the SplashKit-Online repository +(https://github.com/thoth-tech/SplashkitOnline). The technology itself doesn't appear to have been +used in the project; instead it seems that that project relied on both compiling _and_ executing the +code on a back-end server. This could be considered an extension of that initial research. + +**Knowledge Gap:** + +- It is currently unknown how well certain technologies like WASM could be used to compile/run code + using SplashKit in a browser. +- It is unknown if code can be compiled quick enough within the browser. +- It is unknown if and how effectively SplashKit can be compiled as a library to be used within the + browser. + +**Skill Gap:** + +- There is a lack of experience with technology like WASM, + +**Technology Gap:** + +- Ability to compile SplashKit to WASM. + +It is unsure whether projects like Emscripten or Emception are able to compile SplashKit and run the +result in a browser interactively; this will need to be investigated. It is also uncertain whether +it would be better to compile within the browser itself, or on a back-end server. + +## Goals/Deliverables + +- Report on possible ways to continue developing SplashKit Online + - Confirm whether code using SplashKit can be compiled with Emscripten (C/C++ to WASM compiler) + and executed in a browser + - Confirm whether SplashKit can be compiled and used as a library via Javascript in a browser + - Confirm SplashKit code can be compiled in-browser using Emception (self hosted Emscripten) + +**Planned start date:** Week 1 T3 2023 + +**Deadline:** Week 2 T3 2023 + +## Planning notes + +- Setup Emscripten +- Confirm code using SDL can be compiled with Emscripten and executed in a browser + - Setup simple SDL example + - Compile with Emscripten + - Run in browser and check result +- Confirm code using SplashKit can be compiled with Emscripten and executed in a browser + - Setup simple SplashKit example + - Compile with Emscripten + - Run in browser and check result +- (Optional) Test whether SplashKit can be compiled and used as a library via Javascript in a + browser + - Investigate methods of binding + - Test binding methods +- Build and setup Emception + - Confirm SDL code can be compiled in-browser using Emception + - Confirm SplashKit code can be compiled in-browser using Emception diff --git a/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/classes/ExecutionEnvironment.md b/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/classes/ExecutionEnvironment.md new file mode 100644 index 00000000..f7fda184 --- /dev/null +++ b/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/classes/ExecutionEnvironment.md @@ -0,0 +1,100 @@ +--- +title: ExecutionEnvironment - Code Documentation +description: An explanation of what ExecutionEnvironment is, its methods, members, and events. +--- + +[_executionEnvironment.js_](https://github.com/thoth-tech/SplashkitOnline/blob/main/Browser_IDE/executionEnvironment.js) + +ExecutionEnvironment is a class designed to abstract out running the user's code, and also handle +the environment itself (such as resetting variables, preloading files, etc). It contains functions +to 'compile' user code, run the main program, reset itself, and create directories/files inside the +environment. + +The actual implementation can be found inside `executionEnvironment.js`. Upon creation, it creates +an iFrame (which can be thought of as a page inside the page) - and this is where all the user's +code will be run. + +## Why create an iFrame? + +The iFrame it creates is sandboxed so that it cannot access anything inside the main page. This is +important, since while we can likely trust code the user writes themselves, we cannot trust code +they may receive from other people. If we ran the code the user writes directly inside the main +page, it could access and manipulate the IDE itself, along with accessing cookies and other things +it shouldn't have access to. By running it inside the iFrame, we can be sure it can't access +anything it shouldn't. + +It also makes it clear which files are part of the project (since those exist outside the iFrame), +and which parts are only transient, such as logs (that only exist inside the iFrame and are +destroyed on reloads). It means user code can not permanently overwrite resources. + +Additionally, it gives us a way to completely reset the environment the code is running in, as we +can destroy and recreate the iFrame without having to reload the main page itself. + +To communicate with the iFrame, we can only send and receive messages, which also limits the number +of potential escape routes from the iFrame. + +## Members + +- `hasRunOnce` - has the program been run yet? Is reset with `resetEnvironment()` +- `executionStatus` - current status of the program, can be: + - `ExecutionStatus.Unstarted` + - `ExecutionStatus.Running` + - `ExecutionStatus.Paused` + +## Methods + +- `constructor(container)` - takes a container element to load the iFrame inside. + +### Initializing user's code + +- `runCodeBlock(block, source)` - takes a code block (which has the block name `block`, and the + source code `source`, syntax checks it, and if it passes, sends the code to the iFrame via a + message. +- `runCodeBlocks(blocks)` - takes an array of dictionaries with the keys {name, code}, and calls + `runCodeBlock` for each one. + +### Running user's code + +- `runProgram()` - sends a message to the iFrame to run the user's `main` (if it exists). +- `pauseProgram()` - sends a message to pause the user's program - returns a `promise`, that + resolves once the program pauses, or fails after 2 seconds. +- `continueProgram()` - sends a message to continue the user's program (if it has been paused) +- `stopProgram()` - sends a message to stop the user's program completely - returns a `promise`, + that resolves once the program stops, or fails after 2 seconds. + +### Handling the environment + +- `resetEnvironment()` - completely resets the environment, by destroying and recreating the iFrame. + All files inside the environment will also be lost. +- `cleanEnvironment()` - Does a 'best-efforts' attempt to tidy the environment, such as removing + user created global variables. Much faster than `resetEnvironment()`, and does not reset the file + system. + +### Filesystem + +- `mkdir(path)` - sends a message to create a directory at `path` +- `writeFile(path, data)` - sends a message to write `data` to a file `path`, creating it if it does + not exist + +## Events + +The events can be listened to by attaching with `addEventListener(event, callback)` + +- `initialized` - the ExecutionEnvironment is setup and ready to execute code. +- `error` - an error has occurred in user code. Members: + - `message` - the error message + - `line` - the line number of the error + - `block` - the name of the code block the error occurred in. +- `programStarted` - the program has started running +- `programStopped` - the program has stopped running +- `programPaused` - the program has paused +- `programContinued` - the program has resumed running +- `onMovePath` - A file or directory has been moved. Members: + - `oldPath` - the original path + - `newPath` - the path it was moved to +- `onMakeDirectory` - A directory has been made. Members: + - `path` - the path to the new directory +- `onDeletePath` - A file or directory has been deleted. Members: - `path` - the path to the + file/directory +- `onOpenFile` - A file has been opened, possibly for reading or writing. Members: + - `path` - the path to the file diff --git a/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/classes/IDBStoredProject.md b/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/classes/IDBStoredProject.md new file mode 100644 index 00000000..062ebf8f --- /dev/null +++ b/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/classes/IDBStoredProject.md @@ -0,0 +1,100 @@ +--- +title: IDBStoredProject - Code Documentation +description: An explanation of what IDBStoredProject is, its methods, members, and events. +--- + +[_IDBStoredProject.js_](https://github.com/thoth-tech/SplashkitOnline/blob/main/Browser_IDE/IDBStoredProject.js) + +IDBStoredProject is a class that handles saving/loading the user's project within the browser +itself. It uses +[IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB) storage, +which allows it to store large amounts of data in a simplified database structure. + +It stores a single project inside a single database, creating a new one for each project. It has +functions to read and write files to a virtual filesystem saved inside the database (for storing +user code, and uploaded resources like sprites and sounds). It also has an area for config, and +keeps track of its lastWriteTime inside there. + +## Database layout + +There are two tables: + +- `project` - contains information about the project, such as the last write time. Simple key-value, + with the key's name being 'category'. +- `files` - stores all the user's files and directories. Each entry contains the following: + - `nodeID` - a numerical identifier for the node (file/directory), automatically increments. + - `name` - name of the file/directory + - `type` - either `"FILE"` or `"DIR"` - file or directory + - `data` - the file's contents - a binary blob of data. Or `null` if it's a directory. + - `parent` - the `nodeID` of the parent of the file/directory (what directory is it inside). -1 + means it is inside the root directory. + +## Members + +- `initializer` - a function that can be called to initialize the database - performs the equivalent + of `skm new` +- `projectName` - the name of the project (and therefore database) it is currently attached to. + `null` if detached. +- `lastKnownWriteTime` - the last time the project was written to within this tab. + +## Methods + +- `constructor(initializer)` - takes an initializer function, used when initializing a project's + database for the first time. +- `attachToProject(storeName)` - attaches it to a project with the name `storeName`. Initializes the + database, and emits an `attached` event. +- `detachFromProject()` - detaches itself from the project, resets its internal state and emits a + `detached` event. +- `deleteProject(storeName)` - deletes the project named `storeName`, and returns a promise which + resolves once the database is truly deleted. +- `checkForWriteConflicts()` - checks the `lastKnownWriteTime` against the actual `lastWriteTime` + inside the database - if they conflict in a way that suggests another tab has written to the + database, throws a `timeConflict` event. +- `access(func)` - a bit of a special function. This function is the only entry point to + reading/writing to the IDBStoredProject. It takes a function, which it will call, passing in a new + object (internally a `__IDBStoredProjectRW`), which has many more methods for reading/writing. + This is done, so that the opening/closing of the database can be wrapped around the user function, + without them having to handle it manually (and potentially leave open connections causing issues + later on). Here's an example of usage: + +```javascript +let storedProject = new StoredProject(...) +... +// we get passed a new object, which we called "project", and can use it to get the lastWriteTime. +// this is all performed asynchronously, so we need to "await" it to get the result +let storedTime = await storedProject.access((project)=>project.getLastWriteTime()); +// in non-lambda syntax +let storedTime = await storedProject.access(function(project){ return project.getLastWriteTime()}); +``` + +**The following functions are ones accessible from inside the callback to `access` only** + +- `getLastWriteTime()` - get the last write time. +- `updateLastWriteTime(time = null)` - set the last write time - defaults to the current time + (stored in unix time) +- `mkdir(path)` - make a directory at path, does nothing if it already exists. Emits + `onMakeDirectory` event. +- `writeFile(path, data)` - overwrites the data inside the file at `path` with `data` - creates the + file if it doesn't exist. Emits `onOpenFile` event. Also emits `onWriteToFile` event. +- `rename(oldPath, newPath)` - moves a file/directory to a new path and/or name. Emits `onMovePath` + event. +- `readFile(path)` - reads a file at `path` and returns the data inside. Returns `null` if the file + doesn't exist. +- `getFileTree()` - returns a complete tree of the file system, in a structure digestible by the + `TreeView`. + +## Events + +The events can be listened to by attaching with `addEventListener(event, callback)` + +- `attached` - Is attached and can be used. +- `detached` - Has been detached. +- `onMovePath` - A file or directory has been moved. Members: + - `oldPath` - the original path + - `newPath` - the path it was moved to +- `onMakeDirectory` - A directory has been made. Members: + - `path` - the path to the new directory +- `onDeletePath` - A file or directory has been deleted. Members: + - `path` - the path to the file/directory +- `onOpenFile` - A file has been opened, possibly for reading or writing. Members: + - `path` - the path to the file diff --git a/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/classes/TreeView.md b/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/classes/TreeView.md new file mode 100644 index 00000000..d334bbcd --- /dev/null +++ b/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/classes/TreeView.md @@ -0,0 +1,83 @@ +--- +title: TreeView - Code Documentation +description: An explanation of what TreeView is, its methods, members, and events. +--- + +[_treeview.js_](https://github.com/thoth-tech/SplashkitOnline/blob/main/Browser_IDE/treeview.js) + +TreeView is a class used for displaying and updating a tree view, designed specifically around +file/directory manipulation. It allows viewing multiple filesystems at once in an overlapping +fashion (important since we have the files in the user's project that will be saved/loaded, and also +the live files inside the ExecutionEnvironment, which may be different). It allows files/folders to +be dragged around and organized, and folders to have a button on the side for uploading new files. + +The way it is intended to be used, is to make it listen to events from the target filesystems (such +as file moves/deletes), and update itself accordingly. When it is interacted with by the user, it +will emit its own events - these events should be listened to, and the target filesystem updated +accordingly. It should then look like this : + +1. A file is created in the target filesystem and an event is emitted +2. The TreeView reacts to this event and creates a node in its tree with the same name. +3. The user now drags that node to inside another node (directory), and the TreeView emits an event. + Note that it does _not_ change itself here. The node inside the tree has not actually moved yet. +4. A function is called back from this event, that then tells the target filesystem to move the + file. +5. The target filesystem moves the file, and an event is emitted. +6. The TreeView reacts to this event, and moves the node to inside the directory. + +See how the TreeView never updates itself - it relies on an event coming _back_ from the target +filesystem. This means that if the target filesystem fails to do the operation for whatever reason, +the TreeView also remains in the same state, meaning the two remain synchronized effectively. + +See example usage of it inside `fileview.js` +([here](https://github.com/thoth-tech/SplashkitOnline/blob/main/Browser_IDE/fileview.js)), where it +is attached to both the `IDBStoredProject` filesystem, and also the filesystem inside the +`ExecutionEnvironment`. + +### Limitations + +Currently there is no way to delete files/folders, or rename files/folders in the interface itself. +This shouldn't be hard to add, however. + +## Members + +None publicly available. + +## Methods + +- `constructor(container, FSes)` - takes a container to place the TreeView's elements into, and a + list of FSes, which are the filesystems it will support. An example list looks like this + `{"persistent":"node-persistent", "transient":"node-transient"}`, key-value pairs where the key is + the filesystems name, and the value is a css style to apply to nodes inside this filesystem. +- `moveNode(oldPath, newPath, index = -1, FS)` - moves a node to a new path and/or name. Allows one + to set the index the node will appear at, and also which filesystem(s) (a list) the move occurred + in. +- `deleteNode(path, FS)` - deletes a node from a set of filesystem(s) (a list) +- `addDirectory(path, FS)` - make a directory at path, does nothing if it already exists. Allows one + to set which filesystem(s) (a list) the directory add occurred in. +- `addFile(path, data)` - make a file at path, does nothing if it already exists. Allows one to set + which filesystem(s) (a list) the file was added in. +- `reset(path)` - Deletes all nodes. +- `populatefileView(files, FS)` - Populates the tree with a list of files in a particular structure + (the same one `IDBStoredProject.getFileTree()` returns). Allows one to set which filesystem(s) (a + list) the directory add occurred in. + +## Events + +The events can be listened to by attaching with `addEventListener(event, callback)` + +- `nodeMoveRequest` - A file or directory has been moved. Members: + - `treeView` - the TreeView object + - `oldPath` - the original path + - `newPath` - the path it was moved to + - `FS` - the filesystem(s) the change occurred in. + - `accept` - a function that can be called to announce that the change was successful - + **currently unused**. +- `folderUploadRequest` - The 'add file' button was clicked on on a directory. Members: + - `treeView` - the TreeView object + - `path` - path to the directory + - `FS` - the filesystem(s) the directory exists in. +- `nodeDoubleClick` - A file node has been double clicked. Members: + - `treeView` - the TreeView object + - `path` - path to the file + - `FS` - the filesystem(s) the directory exists in. diff --git a/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/other/FolderStructureOverview.md b/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/other/FolderStructureOverview.md new file mode 100644 index 00000000..b89c4a54 --- /dev/null +++ b/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/other/FolderStructureOverview.md @@ -0,0 +1,124 @@ +--- +title: Overview of SplashKit Online's Folders and Files +description: + An overview of what all of SplashKit Online's folders and files contain, and how they relate. +--- + +## Introduction + +This document is a brief overview of how SplashKit Online's folders are structured, with short +descriptions on what each file contains. If you're looking for a particular piece of code, maybe +this will help! + +## Structure + +### Browser_IDE + +This folder contains all the files relevant to the in-browser IDE. This includes front-end and +back-end Javascript, html, css, libraries, etc. + +#### Folders + +`node_modules` - All the installed node libraries. + +`splashkit` - Where the SplashKit WebAssembly library build goes! Compiled from the SplashKitWasm +folder. + +#### Files + +##### Node Files + +The following files are used when running as a node project + +`server.js` - serves the main index, and sets up routing for the libraries. + +`package.json` - The list of packages/libraries and versions that the project uses. + +##### Main Editor + +The following files are used inside the main page (`index.html`) + +`index.html` - The editor's html itself - contains a simple layout and some placeholder elements for +the file view, ExecutionEnvironment, and code editors to load into. + +`editorMain.js` - The main file that handles setting up the IDE. It loads the code editors, the +project, shows/updates the run/stop buttons, and also performs saving, loading, and file mirroring. +It also creates the ExecutionEnvironment, and IDBStoredProject on startup. + +`IDBStoredProject.js` - Holds the IDBStoredProject class, which handles saving/loading the user's +project to/from internal browser storage. See [IDBStoredProject](../../classes/idbstoredproject/) +for internal documentation. + +`executionEnvironment.js` - Holds the ExecutionEnvironment class, which handles 'compiling' and +running the user's code in a safe way. See +[ExecutionEnvironment](../../classes/executionenvironment/) for internal documentation. + +`treeview.js` - Holds the TreeView class, used to display a tree view targeted at showing a +filesystem. See [TreeView](../../classes/treeview/) for internal documentation. + +`fileview.js` - Creates an instance of the TreeView class, hooks it into the IDBStoredProject and +ExecutionEnvironment's filesystems, and places it on the main page. + +`modal.js` - A utility file with a function for creating modals. + +`projectInitializer.js` - Contains demo code (as text) and the function used to initialize the +default project - does something similar to `skm new`. + +`stylesheet.css` - Contains the styles for the editor, primarily related to the TreeView but also +the code editors and other areas. + +`splashkit-javascript-hint.js` - Contains code to handle autocompletion in the code editors, +including loading `splashkit_autocomplete.json` + +`splashkit_autocomplete.json` - Contains data on all the SplashKit functions, classes and enums. + +##### Internal Execution Environment + +The following files are used inside the isolated iFrame (inside the Execution Environment) +(`executionEnvironment.html`) + +`executionEnvironment.html` - The Execution Environment's main page, contains a simple layout with +placeholders for where the canvas and terminal should go. + +`executionEnvironment_Internal.js` - Internal code for the ExecutionEnvironment. Handles receiving +messages from the main page's ExecutionEnvironment object, 'compiling', and running the user's code. + +`executionEnvironment_CodeProcessor.js` - Handles processing the user's code, transforming and +modifying it so that it can be properly paused, restarted, etc. + +`loadsplashkit.js` - used to load the SplashKit Wasm library. + +`fsevents.js` - creates an eventTarget that can be used to listen to filesystem events inside the +virtual filesystem (that the SplashKit Wasm library can access). + +`stylesheet.css` - Same as in [Main Editor](#main-editor). + +### SplashKitWasm + +This folder contains the files related to _building_ SplashKit so that it can run inside the +browser - the output from this build is then copied into Browser_IDE, where the library is used! + +`cmake` - The cmake project - used to build the SplashKit Wasm library! + +`external` - Contains the `splashkit-core` submodule, which contains all of SplashKit's code. + +`stubs` - A couple of stubs (files with empty functions) used to help compile SplashKit despite +certain functionality missing. + +`tools` - Tools used during compilation, particularly in relation to generating C++ to Javascript +bindings. + +`generated` - Files generated during the build process. + +`out` - Contains the built library! This is also copied straight into `Browser_IDE/splashkit` during +the build. + +### DemoProjects + +This folder contains a set of demo projects (just zip files) that can be loaded into the IDE for +testing, demonstration, or learning purposes. + +### .archive + +This folder contains an archive of previous trimester's work, primarily around some sort of login +system. currently unneeded but perhaps can be repurposed at some point. diff --git a/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/processes/HowSplashKitOnlineRunsCode.md b/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/processes/HowSplashKitOnlineRunsCode.md new file mode 100644 index 00000000..95455a99 --- /dev/null +++ b/src/content/docs/products/splashkit/documentation/splashkit-online/code-documentation/processes/HowSplashKitOnlineRunsCode.md @@ -0,0 +1,813 @@ +--- +title: How SplashKit Online runs the user's code! +description: + A detailed explanation as to all the steps SplashKit Online takes to execute the user's code. +--- + +## Introduction + +This document is a deep dive into how SplashKit Online runs the user's code. This is a multi-step +process that will take us through much of SplashKit Online's code, so get ready! + +## Overview + +Here's a _very_ brief overview of how it works. Don't worry if you don't understand what this means +yet! Each part will be explained in due time - but feel free to use this as a reference of the +overall process. + +1. Before the user does anything... + 1. The IDE starts up, and creates an ExecutionEnvironment. + 2. The ExecutionEnvironment creates an iFrame, and loads SplashKit inside it. +2. User writes code into the code editor (currently there are two 'code blocks', General and Main). +3. User presses the Run button. First we have to run the code blocks, to create all the user's + functions/classes and initialize global variables. +4. Pressing run calls `ExecutionEnvironment.runCodeBlocks`, passing in the General Code and Main + Code code blocks. For each code block: 1. The code block's text is sent as an argument to + `ExecutionEnvironment.runCodeBlock(block, source)` 2. The source code gets syntax checked. 3. If + it is syntactically correct, it is then sent as a `message` into the ExecutionEnvironment's + iFrame. +5. The following steps all happen inside the iFrame (for security purposes) + 1. The iFrame receives the message. + 2. The code is transformed to make it runnable within the environment + 3. A real function is created from the transformed code. + 4. **The code is run!** +6. Now it needs to run the user's main: `ExecutionEnvironment.runProgram()` is called. +7. This sends a message into the iFrame. +8. The following steps all happen inside the iFrame (for security purposes) + 1. The iFrame check if the user has created a `main()` + 2. **If so, `main()` is run!** + +:::note + +If you're wondering why the user's 'code blocks' get run, and only _then_ the user's main program +gets run, here's why. JavaScript is a completely dynamic language, so unlike compiled languages like +C++, functions and classes and so on aren't known ahead of time. Instead, the creation of a +function/class itself is runtime code. The code + +```javascript +function myFunction() { + return 4; +} +myFunction(); +``` + +is _run_, to create a function called `myFunction`, that can now be called later on. + +In a similar way, functions themselves are just objects, and can be assigned as follows: + +```javascript +let myFunction = function () { + return 4; +}; +myFunction(); +``` + +When we first run the user's code blocks, we are creating all their functions and classes and global +variables. + +Only after this is done, can we then call `main()`, and start the program itself. But as you know +now, in a way it was running the whole time. + +::: + +## Before the user does anything... + +Looking inside `editorMain.js` + +```javascript +// ------ Setup Project and Execution Environment ------ +let executionEnviroment = new ExecutionEnvironment(document.getElementById("ExecutionEnvironment")); +``` + +_from +[editorMain.js](https://github.com/thoth-tech/SplashkitOnline/blob/main/Browser_IDE/editorMain.js)_ + +First, an `ExecutionEnvironment` is created. + +From the [Source Code Documentation](../../classes/executionenvironment/) + +> ExecutionEnvironment is a class designed to abstract out running the user's code, and also handle +> the environment itself (such as resetting variables, preloading files, etc). It contains functions +> to 'compile' user code, run the main program, reset itself, and create directories/files inside +> the environment. + +When created, an important thing it does is create an iFrame (sort of a page inside the page), which +is where all code execution will take place. This is done for security, see +[here](../../classes/executionenvironment/#why-create-an-iframe) for a more detailed explanation. + +Inside the iFrame, the page `executionEnvironment.html` is loaded, which loads in things like the +SplashKit library itself, and also the executionEnvironment internal scripts, like +`executionEnvironment_Internal.js` and `executionEnvironment_CodeProcessor.js` + +Once the environment finishes loading, it sends out an `initialized` event - this is when all the +green buttons in the interface become usable, and code can be executed! + +## User writes their code, then presses run + +Pressing the run button does three things: + +```javascript +clearErrorLines(); + +runAllCodeBlocks(); +/* This is what it looks like inside "runAllCodeBlocks": +executionEnviroment.runCodeBlocks([ + {name: "GeneralCode", code: editorInit.getValue()}, + {name: "MainCode", code: editorMainLoop.getValue()} +]); +*/ + +executionEnviroment.runProgram(); +``` + +_from +[editorMain.js - runProgram()](https://github.com/thoth-tech/SplashkitOnline/blob/ddb06cec6296d6de905ee0a90084a4c1a71c7a58/Browser_IDE/editorMain.js#L194C6-L194C6)_ + +1. First it clears the error lines from the code editors. +2. Next, it calls `executionEnviroment.runCodeBlocks`, and gives it the two code blocks and the + source code inside the code editors; this runs the user's code, which really means runs all the + function/variable/class initialization. +3. Finally it runs the program - this runs the user's `main` function. Let's look at step 2 more + closely. + +## Pressing run calls `ExecutionEnvironment.runCodeBlocks`, passing in the General Code and Main Code code blocks. + +We can see by looking at the source code, that `runCodeBlocks` just calls `runCodeBlock` for each +block passed in. + +```javascript +runCodeBlocks(blocks){ + for (let block of blocks){ + this.runCodeBlock(block.name, block.code); + } +} +``` + +_from +[executionEnvironment.js](https://github.com/thoth-tech/SplashkitOnline/blob/main/Browser_IDE/executionEnvironment.js)_ + +So let's have a look at `runCodeBlock` + +```javascript +runCodeBlock(block, source){ + // Syntax check code - will throw if fails. + this._syntaxCheckCode(block, source); + + this.iFrame.contentWindow.postMessage({ + type: "RunCodeBlock", + name: block, + code: source, + }, "*"); +} +``` + +_from +[executionEnvironment.js](https://github.com/thoth-tech/SplashkitOnline/blob/main/Browser_IDE/executionEnvironment.js)_ + +First thing it does is call the internal function `_syntaxCheckCode(block, source)`, which as the +name says, will syntax check the code. The way this syntax checking works is somewhat complicated, +but let's step through it. + +### Some backstory (optional reading) + +Just as a precursor, in JavaScript there are multiple ways to execute code that the user provides as +text. One way is to use the function `eval`, for example you can run + +```javascript +eval("alert('Hello!');"); +``` + +and this will pop up a box, as if you had directly run + +```javascript +alert("Hello!"); +``` + +This method combines syntax checking and running together - first the browser syntax checks the +code, and then it runs it. However, we want to syntax check the code _before_ running it. The main +way to do this, is to create a _`Function` object_ from the source code. The browser will syntax +check the code when making it, without running it yet. As will be explained later, it turns out we +actually _need_ to make a `Function` object anyway, for certain important features like pausing the +code and allowing while loops. + +This can be as simple as + +```javascript +let myFunction = new Function("alert('Hello!');"); +``` + +However, we also need to be notified of any errors that occur, so we can tell the user about them. +If you are familiar with JavaScript, you might suggest a `try/catch` block, like this: + +```javascript +try { + let myFunction = new Function("alert('Hello!');"); +} catch (error) { + // tell the user about the error +} +``` + +It 'tries' to create the new function, and if it fails, we catch the error. It turns out we can get +the error message and line number from that `error`, so this seems like it will work. The problem +with this, is that the actual 'error' that occurred, technically happened on the line where +`new Function(...)` was called, and not the line inside the user's code, meaning the line number we +get back is useless. So instead the method described next is what was used. + +### Syntax Checking + +The method used for syntax checking is to create a `Function` object from the user's source code, +which lets us do the syntax check without running the code. For reasons that will be explained +later, we actually create an `AsyncFunction`, which will let us run the code in a more flexible way +later on. + +To retrieve any syntax errors that might occur when checking, we listen to the main window's `error` +event, which reports any errors that happen, and where they happened. + +So the code to perform the syntax check looks a bit like this: + +``` +Attach to the "error" event + If the event gets called next, report the error to the user. + +Create the function - if the syntax check fails, the "error" event will get called, and the function will fail here. + +Detach from the "error event" +``` + +One important aspect of implementing this, is that inside the sandboxed iFrame, the information we +get in the `error` event is very unhelpful - the line number is always 0, and the error message is +very generic. Luckily, since we are just syntax checking (and not _running_) the code, we can just +do the syntax check inside the main page instead of the iFrame - so this is what happens. + +Once the code passes syntax checking, it is sent into the iFrame for the next steps. Let's have a +look at the code running inside the iFrame that receives the code: + +```javascript +if (m.data.type == "RunCodeBlock") { + let processedCode = ""; + try { + processedCode = processCodeForExecutionEnvironment( + m.data.code, + "mainLoopStop", + "mainLoopPause", + "mainLoopContinuer", + "onProgramPause", + ); + + tryEvalSource(m.data.name, processedCode); + } catch (e) { + ReportError(userCodeBlockIdentifier + m.data.name, "Unknown syntax error.", null); + } +} +``` + +_from +[executionEnvironment_Internal.js](https://github.com/thoth-tech/SplashkitOnline/blob/ddb06cec6296d6de905ee0a90084a4c1a71c7a58/Browser_IDE/executionEnvironment_Internal.js#L248C10-L248C10)_ + +Let's break this down. First, it tries to run `processCodeForExecutionEnvironment`, passing in the +user's code and some other parameters. We'll see what that does in a moment, but for now, know that +it takes the user's code, and _changes it_, to allow us to pause it, resume it, reset it, etc. +Assuming it's successful, then we move to `tryEvalSource`, which makes a new `AsyncFunction` from +this modified source code, and then runs it! Remember, these stages all take place securely inside +the iFrame. + +Let's look at how the code modification/transformation works, and why we do it. + +## The code is transformed to make it runnable within the environment + +### Code Transformation + +#### Why do we modify/transform the user's code? + +There are a couple of things that we want the user's code to be able to do, that's impossible to +support without modifying their code. + +##### We want them to be able to have infinite while loops + +It's pretty normal to have code that looks like this in a C program: + +```c +void main(){ + bool quit = false; + while(!quit){ + ...do stuff... + } +} +``` + +where it just loops and loops until the user quits. However, in a browser, JavaScript is executed on +the same thread as the page. So normally the browser might do something like this: + +1. Check for user input +2. Update the page +3. If the user clicks the button, **run some JavaScript** +4. Goto 1 + +Which works fine if the 'run some JavaScript' part ends quickly. But if it enters a loop, like in +the code above, then the browser won't be able to check for input or even update the page until the +code ends - if it's an infinite loop like above, the page can only crash. + +What's the solution? We modify loops inside the user's code, so that they give control _back_ to the +browser periodically. This is done with JavaScript's `async` function support, and requires all user +functions to be marked as `async`, to have calls to those functions marked with `await`, to have +code inserted in every loop to handle the control passing, and to have user classes have some +changes (since constructors can't be async). + +Here are some more specific details (optional reading): + +- All loops automatically await a timeout of 0 seconds after executing for more than ~25ms. +- screen_refresh (and other similar functions) await a window.requestAnimationFrame +- All user functions are marked as async, so that they can use await. +- Similarly, all calls to user functions are marked with await. +- Constructors cannot be async, so rename all constructors of user classes to `__constructor`, and + call it when user classes are newed. `let player = new Player()` becomes + `let player = (new Player()).__constructor()` + +This same setup is used to enable code pausing, and stopping, by simply listening for +\*pause/stop/continue **flags\*** when it does the awaits. To stop, we simply throw a +'ForceBreakLoop' error. To pause, we create a promise and await it. To continue, we call that +promise. + +_Here's something important to note, for those wondering why we just don't use `eval` instead of +putting the user's code in a new `Function` object. We couldn't do this transformation if we didn't +put the user's code inside a function, because you cannot `eval` asynchronous code! Meaning the user +couldn't write while loops, or any long running code at all!_ + +##### We want the user to be able to declare global functions, variables, and classes in one block and be able to access them in another. + +When we evaluate the user's code, we are technically sticking it inside a function, then running it. +As such, the variables, functions and classes declared are actually scoped to that function, meaning +they vanish once the function ends. This obviously isn't very helpful - the user couldn't define +things in one code block, and use them in another, because they're in different scopes! In fact, we +couldn't even run the user's main, since it would vanish just after the code that creates it +finishes evaluating. + +We could just combine the user's code together into a single piece that executes in the same scope, +but then we couldn't have hot-reloading, where the user can update their code _while_ the program +runs. + +So what we do, is modify the user's code, so that declarations made inside the "global" scope, are +manually assigned to the _real_ global scope outside the function that the user's code is written +in. Just as an example, imagine the user has written the following code. + +General Code: + +```javascript +let globalVariable = "Hello!"; +``` + +Main: + +```javascript +function main() { + write_line(globalVariable); +} +``` + +If we evaluated each block by putting the block's code directly into a new `Function` and running +the function, it would be equivalent to the following: + +```javascript +function GeneralCode() { + let globalVariable = "Hello!"; +} +function MainCode() { + function main() { + write_line(globalVariable); + } +} + +// Init the user's functions, variables, etc +GeneralCode(); +MainCode(); + +// Start the program! +main(); +``` + +Hopefully it's clear why this wouldn't work. + +Here's how we transform it: + +```javascript +function GeneralCode() { + window.globalVariable = "Hello!"; +} +function MainCode() { + window.main = function main() { + write_line(globalVariable); + }; +} + +// Init the user's functions, variables, etc +GeneralCode(); +MainCode(); + +// Start the program! +main(); +``` + +Notice how every time we define something that should be in the global scope, we assign it to +`window`? This is (_one name for_) the global scope in JavaScript. So now the +variables/functions/classes are actually in the global scope, and everything works as expected. + +##### We also want them to be able to restart their program without old variables and functions being left behind. + +Now that we have the variables in the global scope, we have a problem. Let's say the user runs the +program above once. They then remove the line of code defining `globalVariable`. If they restart +their program, you'd expect that an error occurs when they reach the line +`write_line(globalVariable);`, since `globalVariable` isn't defined right? + +But no error occurs! This is because, the global variable was already set the _first_ time they ran +the program, and when they 'restarted' it, all we did was call `main()` again, meaning the global +variable stayed in existence! We could fully reset the executionEnvironment with +`resetEnvironment()`, but this takes a long time (up to 20 seconds), so doing this every time the +user runs their code would be a poor user experience. + +Luckily, we already know what the global variables are - we already transform them after all. So +what we can do is keep a list of them, and then when the user restarts the program, we can `delete` +all the variables from the global `window` object, and then we get a clean run; hence the function +`cleanEnvironment()` exists. Now when the user runs, they'll get an error as they should! + +#### How do we modify the code? + +While we could just modify the text as a string, this is error prone and kind of hacky. Instead, we +use a JavaScript library called **Babel**, which parses the user's JavaScript, and creates what's +called an AST (or abstract-syntax-tree), which lets us treat each part of the code as separate +objects we can manipulate. For example: + +```javascript +let a = 10; +``` + +might become something like + +```javascript +VariableDeclaration(Identifier("a"), NumericLiteral(10), (type = "let")); +``` + +There's no need to understand this too deeply, but it's just good to know. + +#### Putting it all together + +Now we have all the pieces needed to understand the `processCodeForExecutionEnvironment` function. + +```javascript +function processCodeForExecutionEnvironment( + userCode, + asyncStopName, + asyncPauseName, + asyncContinueName, + asyncOnPauseName, +) { + asyncifyTransform__asyncStopName = asyncStopName; + asyncifyTransform__asyncPauseName = asyncPauseName; + asyncifyTransform__asyncContinueName = asyncContinueName; + asyncifyTransform__asyncOnPauseName = asyncOnPauseName; + + // Find the user's global declarations - important for next step + // Couldn't find a way to return extra information, so they are stored + // in the global 'findGlobalDeclarationsTransform__userScope' + Babel.transform(userCode, { + plugins: ["findGlobalDeclarationsTransform"], + }); + + // Now do the actual transforms! + userCode = Babel.transform(userCode, { + plugins: ["makeFunctionsAsyncAwaitTransform", "asyncify"], + retainLines: true, + }); + + return userCode.code; +} +``` + +_from +[executionEnvironment_CodeProcessor.js](https://github.com/thoth-tech/SplashkitOnline/blob/ddb06cec6296d6de905ee0a90084a4c1a71c7a58/Browser_IDE/executionEnvironment_CodeProcessor.js#L275)_ + +We can see it takes the user's code, and also some _names_ for the variables that will handle making +the code stop/pause/continue - these are the _flags_ mentioned earlier. It also takes the name of a +callback to call, when the user's code actually pauses. + +We can see the first thing it does is assign these to some variables - you can ignore that part for +now, it's just an implementation detail (it doesn't seem possible to pass parameters into Babel +transforms, so I just used global variables...). But after that, it calls Babel with the +`"findGlobalDeclarationsTransform"`, this handles updating the list of global variables that we +clear when restarting the program. Then we run it again with two more passes - +`"makeFunctionsAsyncAwaitTransform"`, and `"asyncify"`, which handle making functions/calls +async/await along with the scope changes, and inserting the yielding back to the browser during +loops, respectively. + +## A real function is created from the transformed code. + +```javascript +processedCode = processCodeForExecutionEnvironment( + m.data.code, + "mainLoopStop", + "mainLoopPause", + "mainLoopContinuer", + "onProgramPause", +); + +tryEvalSource(m.data.name, processedCode); +``` + +Hopefully we now understand what the first line here does. Now we get to actually run the processed +code! First we have to turn it into a real function, and this is exactly what `tryEvalSource` does +first. Let's have a look inside: + +```javascript +async function tryEvalSource(block, source) { + // First create and syntax check the function + let blockFunction = await createEvalFunctionAndSyntaxCheck(block, source); + + if (blockFunction.state != "success") return blockFunction; + + return await tryRunFunction(blockFunction.value, reportError); +} +``` + +_from +[executionEnvironment_Internal.js](https://github.com/thoth-tech/SplashkitOnline/blob/ddb06cec6296d6de905ee0a90084a4c1a71c7a58/Browser_IDE/executionEnvironment_Internal.js#L191)_ + +As can be seen, the first thing that happens is that we call `createEvalFunctionAndSyntaxCheck`, +which does exactly what it says. You'll notice we're syntax checking here as well - this isn't +exactly deliberate, it just happens automatically when the `Function` object is created. Still, it's +helpful if the Babel output had a syntax error, for instance. The important part is inside +`createEvalFunctionAndSyntaxCheck`, here: + +```javascript +return Object.getPrototypeOf(async function () {}).constructor( + '"use strict";' + source + "\n//# sourceURL=" + userCodeBlockIdentifier + block, +); +``` + +_from +[executionEnvironment_Internal.js](https://github.com/thoth-tech/SplashkitOnline/blob/ddb06cec6296d6de905ee0a90084a4c1a71c7a58/Browser_IDE/executionEnvironment_Internal.js#L179C44-L179C44)_ + +Here's where the user's code _finally_ becomes a real function, that will actually be called! Notice +it looks a little different to the `new Function("...")` example earlier. This is because, it's +creating an `AsyncFunction`, which doesn't have a nice constructor, so we access it directly. The +`AsyncFunction` is important, because all of that work we did before modifying the user's code to +give control back to the browser when it loops, won't work without it being an `AsyncFunction`! + +You'll also notice that we modify the user's code slightly; we don't just pass `source` directly, we +add `"use strict";` at the start, and `//# sourceURL=...` at the end. What do these do? + +- `"use strict;"` makes the user's JavaScript code execute in strict mode, which tidies up a lot of + the language's semantics, forces variable declarations to be explicit, and overall improves code + quality and makes errors easier to track down. We couldn't turn on `"use strict";` without the + manual scoping fixes either! +- `//# sourceURL=...` tells the browser what 'source file' the code is from. This means that when + the browser reports an error, we'll be able to tell what code block it came from! Notice we add + `userCodeBlockIdentifier` at the start? This is just a short string that we can use to help us + tell if an error came from user code, or if it came from code in the IDE itself. An example might + look like this `//# sourceURL=__USERCODE__MainCode`, and so if an error occurs, we will see it + came from `__USERCODE__MainCode`, and tell the user it came from their "Main Code" block! + +Now we can finally call this function to run the user's code! Remember, this won't run their +_program_ but it will run the code which creates all their functions, global variables, classes, and +of course their `main()` function. Actually running the code happens inside `tryRunFunction`, and +we'll look at that in just a short bit. But just know now that the code has been run (or failed with +an error); let's assume it successfully ran, and so we can actually run the user's `main`! + +## Now it needs to run the user's main + +If we recall, this all started with the user pressing the Run button, which looked like this: + +```javascript +clearErrorLines(); + +runAllCodeBlocks(); +/* This is what it looks like inside "runAllCodeBlocks": +executionEnviroment.runCodeBlocks([ + {name: "GeneralCode", code: editorInit.getValue()}, + {name: "MainCode", code: editorMainLoop.getValue()} +]); +*/ + +executionEnviroment.runProgram(); +``` + +_from +[editorMain.js - runProgram()](https://github.com/thoth-tech/SplashkitOnline/blob/ddb06cec6296d6de905ee0a90084a4c1a71c7a58/Browser_IDE/editorMain.js#L194C6-L194C6)_ + +We now know what `runAllCodeBlocks` does quite well - it syntax checks the code, sends it to the +iFrame, the code gets transformed, stuffed into a function, and then run! So what does +`executionEnviroment.runProgram()` do? It's comparatively _much_ simpler! + +First thing it does is send a message to the iFrame, telling it to run the program - we definitely +don't want to run the program in the main page, so this is all secured inside the iFrame, like the +execution earlier. Upon receiving this message, it then calls its own internal `runProgram()` + +```javascript +async function runProgram() { + if (window.main === undefined || !(window.main instanceof Function)) { + ReportError(userCodeBlockIdentifier + "Program", "There is no main() function to run!", null); + return; + } + if (!mainIsRunning) { + mainLoopStop = false; + + mainIsRunning = true; + parent.postMessage({ type: "programStarted" }, "*"); + await tryRunFunction(window.main); + mainIsRunning = false; + parent.postMessage({ type: "programStopped" }, "*"); + } +} +``` + +_from +[executionEnvironment_Internal.js](https://github.com/thoth-tech/SplashkitOnline/blob/ddb06cec6296d6de905ee0a90084a4c1a71c7a58/Browser_IDE/executionEnvironment_Internal.js#L223)_ + +Let's break this down. + +First, it checks to see if the main program even exists: + +```javascript +if (window.main === undefined || !(window.main instanceof Function)) +``` + +We can see how it's just checking the 'global' scope of `window` - which is the same one we know the +user's functions get assigned to! So if the use created a `main` function, we'll be able to find it. +We also make sure it _is_ actually a function, and that they didn't do something like +`let main = 10;` + +Next we make sure it isn't already running. If it was, we could end up with `main()` running +multiple times simultaneously, not ideal! + +```javascript +if (!mainIsRunning){ + mainLoopStop = false; +``` + +If it wasn't already running, it's time to start it! First turn off the `mainLoopStop` flag. +Remember the async control flags mentioned earlier - this is one of them! If it's `true`, the +program will stop as soon as it can, so we make sure it's `false`. + +```javascript +mainIsRunning = true; +parent.postMessage({ type: "programStarted" }, "*"); +await tryRunFunction(window.main); +mainIsRunning = false; +parent.postMessage({ type: "programStopped" }, "*"); +``` + +Now we set `mainIsRunning` to `true` (so that we can't start it multiple times at the same time), +and post a message to the outside window `"programStarted"` - there's a listener in the main page +that will then change the green buttons accordingly. + +Finally, the moment of truth: `await tryRunFunction(window.main);` We run the program! It's called +with `await`, which means that the code will _wait_ for it to finish before continuing. Remember we +made all the user functions `async`? This allows them to give control back to the browser +momentarily, but it also means that they can't stop things that call them from continuing to the +next line of code - so we `await` to make sure we wait for the program to completely stop. + +Once it does finally end (which will happen if we set `mainLoopStop` to `true`), we set +`mainIsRunning` back to `false`, so the user can start it again, and then post a message back to the +main window `"programStopped"`, which will again update the buttons accordingly. + +### `tryRunFunction(func)` - what does it do? + +The responsibility of `tryRunFunction` - which is used when running the code blocks earlier as well, +is to run the user's code, and then detect when it has errors and report them to the user. + +These aren't syntax errors in this case, these are runtime errors (for instance if the user tries to +call a function that doesn't exist, or access outside the bounds of an array), and so we go about +detecting them in a way a bit different to the syntax errors before. + +And after all, we can't use the window's `error` callback for the same reasons mentioned earlier - +inside the iFrame, the error message is generic, and line number reported is always 0! And we +certainly can't run the code outside the iFrame, or that would defeat the entire point of having it. + +If we look inside `tryRunFunction`, we'll see it actually ends up calling `tryRunFunction_Internal`, +which is a bit more interesting. Here's a simplified version: + +```javascript +async function tryRunFunction_Internal(func) { + try { + await func(); + return "success!"; + } catch (err) { + if (err instanceof ForceBreakLoop) { + return "Stopped"; + } + + let error = parseErrorStack(err); + return error; + } +} +``` + +_from +[executionEnvironment_Internal.js](https://github.com/thoth-tech/SplashkitOnline/blob/ddb06cec6296d6de905ee0a90084a4c1a71c7a58/Browser_IDE/executionEnvironment_Internal.js#L138)_ + +We can see it takes the user's function (for instance, the user's `main()`, or the `AsyncFunctions` +we made from their code blocks), and tries to run it. It waits for it to finish with `await`, and if +it finishes without issues, it returns "success!". + +However, if an error was thrown, we catch it. If it was a `ForceBreakLoop` error, then we know it +threw it because the user pressed the Stop button, not because it crashed, and so we just report +back that it "Stopped". However, if that didn't happen, we figure out information about the error +(such as its line number and what code block it happened in) with `parseErrorStack(err)`, and then +return information about the error. + +This information is received by the original `tryRunFunction`, and if an error occurred it reports +it to the user via `ReportError`. + +Let's take a closer look at `parseErrorStack`, as the last stop on our journey. + +### parseErrorStack - what does _it_ do? + +Once we catch an error, the problem becomes "how do we report it to the user?" We need to give them +the error message, and at least a line number and code block to look at. If the error message had +members like `err.lineNumber` or `err.fileName` it'd be great, but they don't (unless you're using +Firefox...). However, all modern browsers support `err.stack`, which gives us a piece of text +describing the error and where it happened. It looks a bit like this: + +```javascript +gameInnerLoop@Init.js;:25:25 +main@Main.js;:25:11 +async*tryRunFunction_Internal@http://localhost:8000/executionEnvironment_Internal.js:57:21 +tryRunFunction@http://localhost:8000/executionEnvironment_Internal.js:89:21 +runProgram@http://localhost:8000/executionEnvironment_Internal.js:132:15 +@http://localhost:8000/executionEnvironment_Internal.js:167:9 +EventListener.handleEvent*@http://localhost:8000/executionEnvironment_Internal.js:144:8 +``` + +We can see on each line, the function, filename, line number, and even column number! The problem, +is that `stack` is actually non-standardized JavaScript, and so each browser implements it slightly +differently. Additionally, we still have to actually parse (read) the string, to get all the +information out of it. This is the job that `parseErrorStack` performs. + +The actual method isn't that complicated. It uses a regex that is designed to work across both +Firefox and Chrome based browsers (including Edge), that reads out the file name and line number. It +then returns these! Not too hard overall. One thing to note, is there are two lines inside +`parseErrorStack` that might be confusing: + +```javascript +if (file.startsWith(userCodeBlockIdentifier)) lineNumber -= userCodeStartLineOffset; +``` + +_from +[executionEnvironment_Internal.js - parseErrorStack](https://github.com/thoth-tech/SplashkitOnline/blob/ddb06cec6296d6de905ee0a90084a4c1a71c7a58/Browser_IDE/executionEnvironment_Internal.js#L123)_ + +Once we have extracted the line number, we check to see if the file name starts with the +`userCodeBlockIdentifier` (remember this from earlier, when we added the `//# sourceURL=` to the +user's code to help identify it?). If it starts with this, we know it's user code. And then we +subtract `userCodeStartLineOffset` from it. Why do we do that? The answer is that when we create the +`AsyncFunction` object, Firefox actually adds some lines to the start. For example, let's say we +create a simple function from text: + +```javascript +let myFunc = new Function("console.log('Hi!');"); +``` + +If we were to look at the function's source code with: + +```javascript +myFunc.toString(); +``` + +We get the following (at least in Firefox): + +```javascript +function anonymous() { + console.log("Hi!"); +} +``` + +See how there are two extra lines at the start? When the ExecutionEnvironment starts, it actually +detects how many lines the browser adds at the start, and stores it inside +`userCodeStartLineOffset` - so in Firefox, `userCodeStartLineOffset` is equal to `2`. Subtracting +this from `lineNumber` then gives us the _actual_ line number of the error, so that we can highlight +it in the user's code editor. + +## Recap + +Hopefully having read all of that, you have a decent understanding of the steps SplashKit Online +takes to run the user's code! As a recap, let's have one more look at the overview, which hopefully +makes a lot more sense now. + +1. Before the user does anything... + 1. The IDE starts up, and creates an ExecutionEnvironment. + 2. The ExecutionEnvironment creates an iFrame, and loads SplashKit inside it. +2. User writes code into the code editor (currently there are two 'code blocks', General and Main). +3. User presses the Run button. First we have to run the code blocks, to create all the user's + functions/classes and initialize global variables. +4. Pressing run calls `ExecutionEnvironment.runCodeBlocks`, passing in the General Code and Main + Code code blocks. For each code block: 1. The code block's text is sent as an argument to + `ExecutionEnvironment.runCodeBlock(block, source)` 2. The source code gets syntax checked. 3. If + it is syntactically correct, it is then sent as a `message` into the ExecutionEnvironment's + iFrame. +5. The following steps all happen inside the iFrame (for security purposes) + 1. The iFrame receives the message. + 2. The code is transformed to make it runnable within the environment + 3. A real function is created from the transformed code. + 4. **The code is run!** +6. Now it needs to run the user's main: `ExecutionEnvironment.runProgram()` is called. +7. This sends a message into the iFrame. +8. The following steps all happen inside the iFrame (for security purposes) + 1. The iFrame check if the user has created a `main()` + 2. **If so, `main()` is run!** diff --git a/src/content/docs/products/splashkit/documentation/tutorials/SplashKitTutorials.md b/src/content/docs/products/splashkit/documentation/tutorials/SplashKitTutorials.md new file mode 100644 index 00000000..795e15b9 --- /dev/null +++ b/src/content/docs/products/splashkit/documentation/tutorials/SplashKitTutorials.md @@ -0,0 +1,610 @@ +--- +title: SplashKit Tutorials +description: A compilation of SplashKit tutorials with recommendations for improvement. +--- + +On this page is a compilation of SplashKit tutorials and tutorial proposals. Areas of potential +improvement have been marked. + +The tutorials have been layed out in categories that seem reasonable for further development. There +is a need for both tutorials that focus on specific areas (such as sprites, or audio), along with +tutorials that bring these concepts together cohesively (like the Metroidvania series). + +## Current Tutorials + +--- + +### Starter + +#### _Installation_ + +- Overview: Installation guides for SplashKit for different operating systems. +- Status: Completed +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/installation/) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/tree/master/src/content/docs/installation/) +- Website Links: [_Live_](https://splashkit.io/installation/) + +#### _Getting Started Drawing using Procedures_ + +- Overview: An introduction to the basics of SplashKit. +- Status: Completed +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2018-05-30-get-started-drawing.html.md.erb) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Starter/get-started-drawing.mdx) +- Website Links: [_Live_](https://splashkit.io/guides/starter/get-started-drawing/) + +#### _Understanding Double Buffering_ + +- Overview: An explanation of double buffering. +- Status: Needs Improvement/Checking + - Explaining that without double buffering, the in-between states while drawing could end up + visible to the user would be good. +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2018-05-30-basic-drawing.html.md.erb) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Starter/double-buffering.mdx) +- Website Links: [_Live_](https://splashkit.io/guides/starter/double-buffering/) + +#### _Loading Resources with Bundles_ + +- Overview: An explanation of bundles. +- Status: Completed +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2018-06-05-bundles.html.md.erb) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Starter/Bundles.mdx) +- Website Links: [_Live_](https://splashkit.io/guides/starter/bundles/) + +#### _Reading Text_ + +- Overview: How to read text from the terminal or from a graphical application. +- Status: Completed +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2018-10-02-reading-text.html.md.erb) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Starter/reading-text.mdx) +- Website Links: [_Live_](https://splashkit.io/guides/starter/reading-text/) + +#### _Getting Started With SplashKit - Windows C#/C++_ + +- Overview: Covers installing MSYS2, SplashKit and VSCode + project setup. +- Status: Completed +- Repo Links: + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Tutorial%20Markdowns/Getting%20Started%20With%20SplashKit%20-%20C%23-C%2B%2B/Getting%20Started%20With%20Splashkit%20-%20C%23-C%2B%2B.md) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Starter/Getting%20Started%20With%20Splashkit.md) +- Website Links: [_Live_](https://splashkit.io/guides/starter/getting-started-with-splashkit/) + +--- + +### Input + +#### _Getting Started With Mouse Button and Inputs_ + +- Overview: Covers mouse inputs, coordinates and visibility. +- Status: Completed +- Repo Links: + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Tutorial%20Markdowns/Getting%20Started%20With%20Mouse%20Button%20and%20Inputs.md) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Inputs/Getting%20Started%20With%20Mouse%20Button%20and%20Inputs.md) +- Proposal Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Getting%20Started%20With%20Mouse%20Button%20and%20Inputs.md) +- Website Links: + [_Live_](https://splashkit.io/guides/inputs/getting-started-with-mouse-button-and-inputs/) + +#### _Using Key Callbacks_ + +- Overview: Covers registering and deregistering key callbacks. +- Status: Completed +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/kcb/2023-07-30-using-keycallbacks.html.md) + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/kcb/2023-07-30-using-keycallbacks.html.md) + +#### _Introduction to Key Codes_ + +- Overview: A list of keycodes + example. +- Status: Completed +- Repo Links: + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Tutorial%20Markdowns/Introduction%20to%20Key%20Codes.md) +- Proposal Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Introduction%20to%20Key%20Codes.md) + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Introduction%20to%20Key%20Codes.md) + +--- + +### Sprites + +#### _Sprite Layering tutorial C++_ + +- Overview: Explanation of what sprite layering is with code and video of result. +- Status: Completed +- Repo Links: + [_SplashKit-Tutorial_]() + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Sprites/Sprite%20Layering%20Tutorial.md) +- Website Links: [_Live_](https://splashkit.io/guides/sprites/sprite-layering-tutorial/) + +#### _Getting Started With Sprites in Splashkit - C#_ + +- Overview: Explanation of what sprites are in SplashKit. +- Status: Needs Improvement/Checking + - Is quite good! One thing that might make it better is to just improve the explanation of what a + sprite is, since a sprite isn't really a bitmap, it's closer to an instantiation of a bitmap (as + mentioned later on in it). +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/Tutorial%20Markdowns/Getting%20Started%20With%20Sprites%20in%20Splashkit%20Tutorial%20-%20C%23/Getting%20Started%20With%20Sprites%20in%20Splashkit%20Tutorial%20-%20CSharp.md) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Sprites/Getting%20Started%20With%20Sprites%20csharp.md) +- Proposal Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Getting%20Started%20With%20Sprites%20in%20Splashkit%20Outline%20-%20C%23.md) + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Getting%20Started%20With%20Sprites%20in%20Splashkit%20Outline%20-%20C%23.md) +- Website Links: [_Live_](https://splashkit.io/guides/sprites/getting-started-with-sprites-csharp/) + +#### _Getting Started With Sprite layering in Splashkit - C#_ + +- Overview: Explanation of what sprite layering is with code and video of result. Slightly more + technical than 'Sprite Layering tutorial C++'. +- Status: Completed +- Repo Links: + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Tutorial%20Markdowns/Getting%20Started%20With%20Sprite%20Layering%20in%20Splashkit%20Tutorial%20-%20C%23/Sprite%20layering%20in%20Splashkit%20Tutorial%20-%20C%23.md) +- Proposal Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Getting%20Started%20With%20Sprite%20Layering%20In%20Splashkit%20-%20C%23.md) + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Getting%20Started%20With%20Sprite%20Layering%20In%20Splashkit%20-%20C%23.md) + +#### _Sprite Pack Documentation_ + +- Overview: An API reference for Sprite Packs. +- Status: Needs Improvement/Checking + - As mentioned, not really a tutorial. Would be good as part of an API page. +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Sprite%20Pack%20Documentation.md) + +--- + +### Camera + +#### _Using the Splashkit Camera_ + +- Overview: A guide on SplashKit's coordinate system and camera. +- Status: Completed +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2018-08-16-about-camera.html.md.erb) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Camera/about-camera.mdx) +- Website Links: [_Live_](https://splashkit.io/guides/camera/about-camera/) + +--- + +### Audio + +#### _Get started with SplashKit Audio_ + +- Overview: A guide on playing sound effects and music. +- Status: Needs improvement + - A bit bare-bones. See the proposal 'Introduction to Splashkit Audio and Music Functions' for + perhaps a good replacement. +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2018-06-10-about-audio.html.md.erb) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Audio/GettingStartedAudio.mdx) +- Website Links: [_Live_](https://splashkit.io/guides/audio/gettingstartedaudio/) + +--- + +### Animations + +#### _Using Animations_ + +- Overview: A guide to animation frames and scripts. +- Status: Completed +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2018-05-29-animation.html.md.erb) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Animations/Using%20Animation.mdx) +- Website Links: [_Live_](https://splashkit.io/guides/animations/using-animation/) + +#### _Sprite Animation_ + +- Overview: Builds upon the "Using Animations", cover similar functionality (animations, movement, + etc) +- Status: Completed +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/Sprite%20Animation%20Tutorial/Sprite%20Animation%20Tutorial.md) + +--- + +### Networking + +:::note[Thoughts] + +While these tutorials are quite good, they feel very disconnected from the rest of SplashKit. +Wouldn't creating a (very simple) multiplayer game have been a better subject? I don't think anyone +is going to make a website using SplashKit. + +::: + +#### _Getting Started With Servers_ + +- Overview: A detailed tutorial about creating a web server that serves a file. +- Status: Completed +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2018-07-14-getting-started-with-servers.html.md.erb) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Networking/getting-started-with-servers.mdx) +- Website Links: [_Live_](https://splashkit.io/guides/networking/getting-started-with-servers/) + +#### _Routing With Servers_ + +- Overview: A continuation of the previous tutorial, serving different pages to different routes. +- Status: Completed +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2018-08-10-routing-with-servers.html.md.erb) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Networking/routing-with-servers.mdx) +- Website Links: [_Live_](https://splashkit.io/guides/networking/routing-with-servers/) + +#### _How to make a RESTful API call using Splashkit_ + +- Overview: A tutorial on making requests to RESTful APIs. +- Status: Completed +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2018-10-03-restful-api-call.html.md.erb) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Networking/index.mdx) +- Website Links: [_Live_](https://splashkit.io/guides/networking/restful-api-call/) + +--- + +### Databases + +#### _Using Databases_ + +- Overview: An introduction to interacting with databases via SplashKit. +- Status: Needs Improvement/Checking + - The tutorial is well written and engaging. Only thing missing perhaps is a better explanation of + what a database is, since SplashKit is targetted at beginnners who may not know what they are. A + visual example with tables might be good? +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2017-10-03-using-databases.html.md) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Database/using-databases.mdx) +- Website Links: [_Live_](https://splashkit.io/guides/database/using-databases/) + +#### _Getting Started With SplashKit Database_ + +- Overview: A much more in-depth tutorial on the database functions (closer to an API reference). +- Status: Completed +- Repo Links: + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Tutorial%20Markdowns/Getting%20Started%20With%20SplashKit%20Database.md) +- Proposal Repo Links: + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Getting%20Started%20With%20SplashKit%20Database.md) + +--- + +### JSON + +#### _Using JSON_ + +- Overview: A short explanation of JSON with a code example. +- Status: Needs improvement + - Doesn't provide much explanation of JSON nor why one would want to use it. The code example + clearly demonstrates writing, but is missing reading that data back in. +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2017-10-03-using-json.html.md) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/JSON/using-json.mdx) +- Website Links: [_Live_](https://splashkit.io/guides/json/using-json/) + +--- + +### Utilities + +#### _Useful Utilities_ + +- Overview: Explanation of string convertion utilities. +- Status: Completed +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/2017-10-03-useful-utilities.html.md) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Utilities/useful-utilities.md) +- Website Links: [_Live_](https://splashkit.io/guides/utilities/useful-utilities/) + +--- + +### Game Creation + +:::note[Thoughts] + +While these tutorials are quite decent, they suffer from what seems to be a big problem. There isn't +actually a completed project that the tutorials are leading up to, and since some of the parts are +written by different people, there is a lack of continuity. Something introduced by one tutorial (as +an example: creating a floor using sprites), is then forgotten about in a future tutorial (which +then opts to quickly add a ground by drawing rectangles).
It would be good if there was a +'source-of-truth' codebase for the finished game, that can then be used as a base to keep the +tutorials cohesive even when written by different people. + +::: + +#### _Creating a 2D Metroidvania Game (1, 2, 5, 6, 12)_ + +- Overview: A series on producing a Metroidvania game, have only skim read. Seems quite thorough and + well written. +- Status: Completed +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/Creating%20a%202D%20Metroidvania%20Game%20Using%20Splashkit/) + +#### _Creating a 2D Metroidvania Game (2)_ + +- Overview: See above. + +**Note:** There are **two** 'Part 2's, with somewhat overlapping content. Someone will need to +choose which one to use in the final series, or merge bits of them together. While this tutorial +suggests it comes after the _other_ part 2, I would recommend putting this one first, since this one +covers project creation with `skm new`, and doesn't go into as much detail about drawing graphics. + +- Status: Completed +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/Creating%20a%202D%20Metroidvania%20Game%20Project%20Structure%20and%20Initialization/Creating%20a%202D%20%22Metroidvania%22%20Game%20-%20Project%20Structure%20and%20Initialization.md) + +#### _Creating a 2D Metroidvania Game (3)_ + +- Overview: See above +- Status: Completed +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Creating%20a%202D%20_Metroidvania_%20Game%20-%20Player%20Character%20Basics.md) + +#### _Creating a 2D Metroidvania Game (4)_ + +- Overview: See above +- Status: Completed +- Repo Links: + [_SplashKit-Tutorial_]() + +#### _Creating a 2D Metroidvania Game (9)_ + +- Overview: See above +- Status: Completed +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Creating%20a%202D%20_Metroidvania_%20Game%20-%20Power-Ups%20and%20Items.md) + +#### _Creating a 2D Metroidvania Game (11)_ + +- Overview: See above +- Status: Completed +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Creating%20a%202D%20_Metroidvania_%20Game%20-%20Audio%20and%20Sound%20Effects.md) + +--- + +### Meta + +#### _Writing a SplashKit Guide_ + +- Overview: A guide to contributing to SplashKit's tutorials. +- Status: Completed +- Repo Links: + [_splashkit.io_](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/contributing/index.html.md.erb) + +--- + +### Debugging, Compilation and Publishing + +#### _Debugging Your Application in Visual Studio Code (VSCode)_ + +- Overview: Debugging in VSCode; watches and breakpoints. +- Status: Completed +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/VScodeDEbuggerTut.md) + +#### _CMake Tutorials 1 to 8_ + +- Overview: Tutorials on the syntax of CMake. +- Status: Needs Improvement/Checking + - While these are well written, they don't have a whole lot to do with SplashKit aside from the + final one (see below). Should they use and reference the SplashKit cmake file as an example each + time? +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/Cmake%20Tutorial/) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Others/Cmake/) +- Proposal Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Building%20the%20SplashKit%20Core%20Library%20with%20CMake.md) + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Building%20the%20SplashKit%20Core%20Library%20with%20CMake.md) +- Website Links: [_Live_](https://splashkit.io/guides/others/cmake/1-get-started/) + +#### _CMake #9. Building the SplashKit Core Library with CMake_ + +- Overview: Final tutorial on CMake, covering compiling SplashKit Core with it. +- Status: Completed +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/Cmake%20Tutorial/9.%20Cmake%20with%20SplashKit.md) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Others/Cmake/9.%20Cmake%20with%20SplashKit.md) +- Proposal Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Building%20the%20SplashKit%20Core%20Library%20with%20CMake.md) + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Building%20the%20SplashKit%20Core%20Library%20with%20CMake.md) +- Website Links: [_Live_](https://splashkit.io/guides/others/cmake/9-cmake-with-splashkit/) + +#### _Publishing in SplashKit - C# / C++_ + +- Overview: Short tutorial explaining how to publish a game made in SplashKit, with regards to + assets and such. +- Status: Completed +- Repo Links: + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Tutorial%20Markdowns/Publishing%20with%20SplashKit%20-%20C%23) + [_splashkit.io-starlight_](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Others/Publishing%20with%20SplashKit%20Csharp.md) +- Website Links: [_Live_](https://splashkit.io/guides/others/publishing-with-splashkit-csharp/) + +--- + +### General Programming Via SplashKit (possibly irrelevant) + +#### _The Programmers Field Guide Part 0-3_ + +- Overview: Uses SplashKit while teaching general programming. +- Status: Completed +- Repo Links: + [_the-programmers-field-guide_](https://github.com/splashkit/the-programmers-field-guide/tree/main/src/content/docs/book/part-0-getting-started/3-building-programs/) + +--- + +### Other (are these actually proposals?) + +#### _Game Concept Ideas_ + +- Overview: An article on resources to help with coming up with game concepts and resources. +- Status: Needs improvement + - While it's solid as an article, the way it presents itself as the first tutorial in a series + (which as far as I can tell does not exist) makes its actual goal confusing. Unless further + tutorials in this series will be made, I suggest re-writing parts of it to make it self + contained. Is it actually a proposal? If so, why is it so long? +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/Game%20Concept.md) + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Game%20Concept.md) + +#### _Design Tutorial for 2D racer_ + +- Overview: An article describing some principles of UX/UI +- Status: Needs improvement + - Same thoughts as above. It's solid as an introductory article, but it isn't a tutorial. Again, + perhaps it's a proposal? +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/2d%20Racer%20Design%20tutorial.md) + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/2d%20Racer%20Design%20tutorial.md) + +#### _Controls_ + +- Overview: A list of the controls needed to be compatible with the arcade machine. Not a tutorial. +- Status: Needs improvement + - The file itself is fine, but it shouldn't be in tutorials. +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/arcade_controls.md) + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/arcade_controls.md.md) + [_arcade-games_](https://github.com/thoth-tech/arcade-games/blob/master/README.md) + +## Proposals + +--- + +### Incomplete (On Trello) + +#### _Creating a 2D Metroidvania Game (7, 8, 10, 13)_ + +- Overview: The remaining parts in a series on producing a Metroidvania game. +- Status: Incomplete + +#### _Introduction to Splashkit Audio and Music Functions_ + +- Overview: Proposal for introduction to audio and music functions. +- Status: Incomplete + - Seems to overlap with 'Get started with SplashKit Audio' but much more in-depth. Possibly a good + replacement. +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Audio%20Series/Basic%20Audio%20Manipulation%20in%20Splashkit.md) + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Basic%20Audio%20Manipulation%20in%20Splashkit.md) + +#### _Managing Audio Resources in Splashkit_ + +- Overview: Covers sound and music resource management. +- Status: Incomplete + - Seems to overlap with 'Get started with SplashKit Audio' but much more in-depth. Possibly a good + replacement. +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Audio%20Series/Managing%20Audio%20Resources%20in%20Splashkit.md) + +#### _Working with Sound Effects in Splashkit_ + +- Overview: Covers specifically sound effects, playing them, etc. +- Status: Incomplete + - Seems to overlap with 'Get started with SplashKit Audio' but much more in-depth. Possibly a good + replacement. +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Audio%20Series/Working%20with%20Sound%20Effects%20in%20Splashkit.md) + +#### _Software Requirements Specification for Mario-Like Game Tutorial Using Splashkit_ + +- Overview: Proposal for a Mario-like game tutorial. +- Status: Probably incomplete. +- Repo Links: + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Splash%20World%20Adventures.md) + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Splash%20World%20Adventures.md) + +#### _Understanding SplashKit Manager (SKM) Shell Commands_ + +- Overview: Covers SplashKit project setup + other commands. +- Status: Probably incomplete. + - Overlaps with 'Getting Started: C++, C#, Python, and Pascal - Windows'. See above. Also mostly + already covered by 'Getting Started With SplashKit - Windows C#/C++' +- Repo Links: + [_SplashKit-Tutorial_]() + [_documentation_]() + +--- + +### Incomplete (Not on Trello) + +#### _Using JSON Files_ + +- Overview: Proposal for a more complete JSON tutorial. +- Status: Incomplete +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Proposal%20for%20SplashKit%20JSON%20Functionality%20Tutorial%20Series.md) + +#### _2 D Racer - Features to keep & add_ + +- Overview: Proposal for features in 2D Racer? +- Status: Probably incomplete. +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/2%20D%20Racer%20-%20Features%20to%20keep%20%26%20add.md) + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/2%20D%20Racer%20-%20Features%20to%20keep%20%26%20add.md) + +### Incomplete (Archived/Deleted) + +#### _Getting Started: C++, C#, Python, and Pascal - Windows_ + +- Overview: Covers installing MSYS2, SplashKit and VSCode + project setup. +- Status: Archived - too much overlap. + - Overlaps with 'Understanding SplashKit Manager (SKM) Shell Commands'. See below. Also mostly + already covered by 'Getting Started With SplashKit - Windows C#/C++' +- Repo Links: + [_SplashKit-Tutorial_](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Getting%20Started%20in%20Splashkit%20Outline.md) + [_documentation_](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Getting%20Started%20in%20Splashkit%20Outline.md) + +## [For Reference] Current SplashKit Tutorial/Proposal Directories + +All the directories listed below contain either tutorials or proposals (or both). In its current +state, tutorials and proposals seem to be mixed together and files from the same series are +scattered across folders. There is also a lot of duplication. + +The current plan for future tutorials seems to be to store all tutorials under +[splashkit.io-starlight](https://github.com/thoth-tech/splashkit.io-starlight), and all tutorial +proposals under +[ThothTech-Documentation-Website](https://github.com/thoth-tech/ThothTech-Documentation-Website). We +should attempt to migrate all tutorials to fit under that structure at some point. There are also +some completed tutorials that are not currently live on any site - it should be investigated if +there is a reason for this. + +### Tutorials + +- [https://github.com/splashkit/splashkit.io/tree/develop/source](https://github.com/splashkit/splashkit.io/tree/develop/source/) + - [articles/contributing](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/contributing/) + - [articles/guides](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/guides/) + - [articles/installation](https://github.com/splashkit/splashkit.io/tree/develop/source/articles/installation/) +- [https://github.com/thoth-tech/SplashKit-Tutorial/blob/main](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/) + - [Tutorial Proposals](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/) + - [kcb](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/kcb/) + - [Tutorials](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/) + - [Cmake Tutorial](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/Cmake%20Tutorial/) + - [Creating a 2D Metroidvania Game Using Splashkit](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/Creating%20a%202D%20Metroidvania%20Game%20Using%20Splashkit/) + - [Sprite Layering Tutorial (C++)]() + - [Tutorial Markdowns/Getting Started With Sprites in Splashkit Tutorial - C#](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/Tutorial%20Markdowns/Getting%20Started%20With%20Sprites%20in%20Splashkit%20Tutorial%20-%20C%23/) +- [https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials and Research](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/) + - [Tutorial Proposals/Tutorial Markdowns](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Tutorial%20Markdowns/) + - [Getting Started With SplashKit - C#-C++](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Tutorial%20Markdowns/Getting%20Started%20With%20SplashKit%20-%20C%23-C%2B%2B/) + - [Getting Started With Sprite Layering in Splashkit Tutorial - C#](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/Tutorial%20Markdowns/Getting%20Started%20With%20Sprite%20Layering%20in%20Splashkit%20Tutorial%20-%20C%23/) + - [Tutorial Proposals/kcb](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/kcb/) +- [https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/) + - [Animations](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Animations/) + - [Audio](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Audio/) + - [Camera](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Camera/) + - [Database](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Database/) + - [Inputs](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Inputs/) + - [JSON](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/JSON/) + - [Networking](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Networking/) + - [Others](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Others/) + - [Cmake](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Others/Cmake/) + - [Sprites](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Sprites/) + - [Starter](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Starter/) + - [Utilities](https://github.com/thoth-tech/splashkit.io-starlight/blob/master/src/content/docs/guides/Utilities/) +- [https://github.com/thoth-tech/splashkit.io-starlight/tree/master/src/content/docs/installation](https://github.com/thoth-tech/splashkit.io-starlight/tree/master/src/content/docs/installation/) + +### Tutorial Proposals + +- [https://github.com/thoth-tech/SplashKit-Tutorial/blob/main](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/) + - [Tutorial Proposals](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/) + - [Audio Series](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorial%20Proposals/Audio%20Series/) + - [Tutorials](https://github.com/thoth-tech/SplashKit-Tutorial/blob/main/Tutorials/) +- [https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials and Research/Tutorial Proposals](https://github.com/thoth-tech/documentation/blob/main/docs/Splashkit/Applications/Tutorials%20and%20Research/Tutorial%20Proposals/) diff --git a/src/content/docs/reference/example.md b/src/content/docs/reference/example.md deleted file mode 100644 index c00dfd8d..00000000 --- a/src/content/docs/reference/example.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Example Reference -description: A reference page in my new Starlight docs site. ---- - -Reference pages are ideal for outlining how things work in terse and clear terms. Less concerned -with telling a story or addressing a specific use case, they should give a comprehensive outline of -what your documenting. - -## Further reading - -- Read [about reference](https://diataxis.fr/reference/) in the Diátaxis framework diff --git a/src/content/docs/reference/faq.mdx b/src/content/docs/reference/faq.mdx new file mode 100644 index 00000000..f8e4a0bc --- /dev/null +++ b/src/content/docs/reference/faq.mdx @@ -0,0 +1,84 @@ +--- +title: Frequently Asked Questions (FAQ) +description: Frequently Asked Questions +--- + +Welcome to Thoth Techs Frequently Asked Questions (FAQ) section! We understand that you might have +queries about contributing in Thoth Tech or seek clarification on how to use certain tools. Our aim +is to provide you with comprehensive and straightforward answers to address your concerns promptly. + +
+ Where can I find the link to Thoth Tech GitHub channel + + Find link [here](https://github.com/thoth-tech/). +
+ +
+ Which Thoth Tech repository should I clone to contribute to the Documentation Website + + To contribute to the Documentation Website, locate the ["Thothtech-Documentation-Website" repository](https://github.com/thoth-tech/ThothTech-Documentation-Website/tree/main), + navigate to the src/content/docs, and upload your .md or .mdx file to the relevant folder. +
+ +
+ When I attempt to run the documentation website locally, it says "The .nvmrc file is using a + version of node that is not supported by astro anymore". Please how do I fix this? + + Re-install or upgrade the version of Node.js software on your laptop. +
+ +
+ How do I make a newly created folder to appear on the side navbar of the Documentation website? + + On the astro.config.mjs file, create a new label (if main folder) or item(if sub folder). You do not + need to reinvent the will, you can copy from what already exists on the astro.config.mjs file, insert + the copied block into the right location, and modify the labels and directory link. +
+ +
+ Is there a video that helps me understand how to migrate documents to the Documentation website? + + Yes, there is. Find some helpful links below. + - [Instructional video](https://deakin365.sharepoint.com/:v:/r/sites/ThothTech2/Shared%20Documents/General/Instructional%20Video%20-%20How%20To%20Upload%20Documents%20to%20Starlight.mp4?csf=1&web=1&e=s26lMo). + - [Help hub session recording](https://deakin365-my.sharepoint.com/:v:/g/personal/s221460489_deakin_edu_au/EXib27xJI2hCkHpzBXOxxYQBOfDGhhQJ1A23ciisMROeRA?xsdata=MDV8MDF8fDgxMTZlNDYzMzAyZTQxYTZhNGE2MDhkYmYyMWMwMGY1fGQwMjM3OGVjMTY4ODQ2ZDU4NTQwMWMyOGI1ZjQ3MGY2fDB8MHw2MzgzNjk5NzQyOTIxNjE3MDJ8VW5rbm93bnxWR1ZoYlhOVFpXTjFjbWwwZVZObGNuWnBZMlY4ZXlKV0lqb2lNQzR3TGpBd01EQWlMQ0pRSWpvaVYybHVNeklpTENKQlRpSTZJazkwYUdWeUlpd2lWMVFpT2pFeGZRPT18MXxMM1JsWVcxekx6RTVPbEZtZUY5VFZFaFZPVEJQYzFaWlFraFdXVXRvYzFKUk5XZHRSV1V3Y3psUk5tdFBjRUptTm1Kc2FUZ3hRSFJvY21WaFpDNTBZV04yTWk5amFHRnVibVZzY3k4eE9UcFJabmhmVTFSSVZUa3dUM05XV1VKSVZsbExhSE5TVVRWbmJVVmxNSE01VVRaclQzQkNaalppYkdrNE1VQjBhSEpsWVdRdWRHRmpkakl2YldWemMyRm5aWE12TVRjd01UUXdNRFl5T0RNd01nPT18NTg0ZjIwNWZmZjA3NGZlZTQyNjQwOGRiZjIxYzAwZjN8ZTU2N2Y4NzA4YjFlNDI1YWIzYjRhM2I1NmExY2QwMjE%3D&sdata=TldtNGVnTDJWWlVnb2lBMGlZZXlLNEI1M2p5emU3ZndBYmpSTkV6MnN0QT0%3D) +
+ +
+ What do I do to resolve Linelint issues in the CI build checks for my Pull Request? + + Identify the file which has the lint issue from the details section of the CI Build check. Open the + identified file on Visual Studio code or your editor of choice, right click on the document and select + Format document with markdownlint. Ensure that you have the markdownlint extension installed on your + code editor. +
+ +
+ What do I do to resolve Prettier issues in the CI build checks for my Pull Request? + + Identify the file which has the prettier issue from the details section of the CI Build check. Open + the identified file on Visual Studio code or your editor of choice, right click on the document and + select Format document with Prettier. Ensure that you have the Prettier extension installed on your + code editor. +
+ +
+ My Pull request keeps failing the netlify checks + + In such instances, the primary reason is often due to the absence of a title block at the start of your markdown file. + For example. + ``` + title: Frequently Asked Questions (FAQ) + description: Frequently Asked Questions + ``` +
+ +
+ I currently have a Pull Request that is still under Review, when I make a commit for a new change, + I am unable to create another Pull Request. Why is that? + +Because your Pull Request is still under Review and you are pushing changes from the same GitHub +account (which is your personal one) your new commit will still fall under your old PR. No cause for +alarm, if all checks in your PR has passed, then reach out to your approver to approve it so you can +create a new PR for new commits. + +
diff --git a/src/content/docs/teams-and-leadership/leadership-t1-2024.md b/src/content/docs/teams-and-leadership/leadership-t1-2024.md new file mode 100644 index 00000000..903bd309 --- /dev/null +++ b/src/content/docs/teams-and-leadership/leadership-t1-2024.md @@ -0,0 +1,32 @@ +--- +title: Leadership T1 2024 +--- + +### Company Directors + +- Glory Lee - Acting Director, Product Owner (Company Operation) +- Andrew Cain - Productor Owner (OnTrack & SplashKit) + +### Product Mentors + +- OnTrack: Daniel Maddern & Nebula Alam +- SplashKit: Olivia McKeon & Quoc Tien Pham +- Company Operations: Quoc Tien Pham + +### Student Leadership + +- Satika Jayawardena - Student Lead (OnTrack), Communications Lead +- Josh Kilinc - Student Lead (OnTrack), Code Lea (OnTrack) +- Sean Boettger - Student Lead (SplashKit), Code Lead (SplashKit) +- Aditya Parmar - Student Lead (SplashKit) +- Eisen Lai - Student Lead (Company Operations), Coordination Lead + +## Roles and Responsibilities + +| Roles | Description | Responsibilities | Skills | +| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Acting Director | The role of the acting director is to oversee the Thoth Tech company executive leadership team to ensure they are running the company effectively and value is being added to the Thoth Tech products by the projects they are supporting. |
  • Provide guidance to executive leadership team.
  • Provide high-level vision for the ongoing goals of the company
  • Provide a consistent company strategy due to low retention
|
  • Leadership
  • Communication
  • Mentor
  • Decision-making
| +| Product Owner | The role of the product owner at Thoth Tech serves as the vital link between the development team and stakeholders, ensuring that the product meets customer needs and aligns with company objectives. |
  • Define and communicated the product vision to development team.
  • Work with mentors to make informed decisions considering technical feasibility and goals.
  • Provide leadership to the development team, fostering collaboration and innovation.
|
  • Leadership
  • Communication
  • Product Visioning
  • Stakeholder Management
  • Prioritization
  • Continuous Improvement
  • Decision-making
| +| Product Mentor | The role of the Product Mentor is to lead and support delivery leads in projects related to their product to ensure ongoing success. |
  • Drive the product in the direction determined by the Managing Directors and Area Leads.
  • Strong drive towards toward objectives with bias for action
  • Proactively identify blockers and opportunities
  • Support delivery leads where needed
  • Make thoughtful decisions motivated by data and research
  • Be transparent and accountable by visualising objectives
|
  • Leadership
  • Communication
  • Empathy
  • Interpersonal-Savvy
  • Collaborative
  • Stakeholder Management
| +| Student Lead | The role of the Delivery lead is to lead, organise and support their project teams to ensure ongoing success. |
  • Establish a team cadence
  • Build rapport with all team members to foster a cohesive and collaborative environment
  • Strong drive towards objectives with bias for action.
  • Proactively identify blockers and opportunities
|
  • Leadership
  • Communication
  • Empathy
  • Interpersonal-Savvy
  • Collaborative
  • Stakeholder Management
| +| Team Member | The role of all team members is to contribute to their respective products/projects. Take the initiative in finding work and solving problems, as well as to communicate with the Seniors about their progress and issues. |
  • Work with the project leads to meet the goals for this trimester.
  • Attend to assigned tasks in a timely manner.
  • Work in collaboration with other team members to produce a viable product.
|
  • Technical skills as per project
  • Team collaboration
  • Competence in GitHub
  • Time Management
  • Knowledge of Agile model
| diff --git a/src/content/docs/teams-and-leadership/organizational-structure-t3-2023.md b/src/content/docs/teams-and-leadership/organizational-structure-t3-2023.md new file mode 100644 index 00000000..cc2e50b8 --- /dev/null +++ b/src/content/docs/teams-and-leadership/organizational-structure-t3-2023.md @@ -0,0 +1,5 @@ +--- +title: Organizational Structure T3 2023 +--- + +![Org chart](/Orgchart_t3.png) diff --git a/src/content/docs/teams-and-leadership/team-members-t1-2024.md b/src/content/docs/teams-and-leadership/team-members-t1-2024.md new file mode 100644 index 00000000..3f18dad0 --- /dev/null +++ b/src/content/docs/teams-and-leadership/team-members-t1-2024.md @@ -0,0 +1,64 @@ +--- +title: Team Members T1 2024 +--- + +## Company Operations + +| Project Member | Role | Responsibilities | +| ----------------------------- | ------------ | -------------------------------------------------------------------------------------- | +| Eisen Lai | Product Lead | Organise meeting, create technical documents, assign tasks to team members, and so on. | +| Shiyu Chen | Team Member | Work on assigned cards on Trello | +| Shyama Chandrashekaran Pillai | Team Member | Work on assigned cards on Trello | +| Yuyang Yang | Team Member | Work on assigned cards on Trello | +| Minu Nediyapalackal Sunil | Team Member | Work on assigned cards on Trello | + +## OnTrack + +| Project Member | Role | Responsibilities | +| ---------------------------------------- | ------------------ | ------------------------------------------- | +| Satika Jayawardena | Communication Lead | Distribute Tasks, Implement Numbas project. | +| Josh Kilinc | Code Lead | Distribute Tasks, Implement Numbas project. | +| Minh Tho Duong | Team Member | Work on Trello tasks for various projects | +| Jayani Vimukthika Vithanage | Team Member | Work on Trello tasks for various projects | +| Withanage Samadhi Dhananjana Weerasingha | Team Member | Work on Trello tasks for various projects | +| Taiming Xu | Team Member | Work on Trello tasks for various projects | +| Bowen Yan | Team Member | Work on Trello tasks for various projects | +| Samuel William Rolfe | Team Member | Work on Trello tasks for various projects | +| Jake Edward Mansfield | Team Member | Work on Trello tasks for various projects | +| Joshua Luke Bourquin | Team Member | Work on Trello tasks for various projects | +| Prabhjot Singh | Team Member | Work on Trello tasks for various projects | +| Riley Cameron Helmore | Team Member | Work on Trello tasks for various projects | +| Darren Marchiano Sunandar | Team Member | Work on Trello tasks for various projects | +| Zhongyu Zhang | Team Member | Work on Trello tasks for various projects | +| Mounika Angadipeta | Team Member | Work on Trello tasks for various projects | +| Ethan Mark Holley | Team Member | Work on Trello tasks for various projects | +| Riley Ambrose Shannon | Team Member | Work on Trello tasks for various projects | +| Daniel Piscioneri | Team Member | Work on Trello tasks for various projects | + +## SplashKit + +| Project Member | Role | Responsibilities | +| ------------------------ | ------------ | ------------------------------------ | +| Aditya Parmar | Product Lead | Team management, Code, Documentation | +| Sean Boettger | Product Lead | Team management, Code, Documentation | +| Satyam Raina | Team member | Code, Documentation | +| Hayley Hughes | Team member | Code, Documentation | +| Ashley Thompson | Team member | Code, Documentation | +| Wenzong Xuan | Team member | Code, Documentation | +| Avenue Joju | Team member | Code, Documentation | +| Ben Mathew Thomas | Team member | Code, Documentation | +| Amos Saji | Team member | Code, Documentation | +| Edwin Shibu | Team member | Code, Documentation | +| Nidhisha Ravindra Pahade | Team member | Code, Documentation | +| Khushi Laddi | Team member | Code, Documentation | +| Castiel Mordred Mclntosh | Team member | Code, Documentation | +| Wenxuan Song | Team member | Code, Documentation | +| William Robert Saunders | Team member | Code, Documentation | +| Oscar Harris | Team member | Code, Documentation | +| Jonathan James Tynan | Team member | Code, Documentation | +| Jake Andrew Oxley | Team member | Code, Documentation | +| Sharvani Kandala | Team member | Code, Documentation | +| Kartik Kaushik | Team member | Code, Documentation | +| Thomas James Shanahan | Team member | Code, Documentation | +| Ka Chun Lam | Team member | Code, Documentation | +| Jess Balsillie | Team member | Code, Documentation |