├── .gitignore
├── Examples
├── hello.html
├── hello.js
├── httpserver.js
├── max.js
├── objects.js
├── package-lock.json
├── package.json
└── server.js
├── LICENSE
├── Pasta
├── .eslintrc.js
├── app.js
├── app.test.js
├── client
│ ├── assets
│ │ ├── css
│ │ │ └── index.css
│ │ ├── dist
│ │ │ ├── css
│ │ │ │ ├── bootstrap-grid.css
│ │ │ │ ├── bootstrap-grid.css.map
│ │ │ │ ├── bootstrap-grid.min.css
│ │ │ │ ├── bootstrap-grid.min.css.map
│ │ │ │ ├── bootstrap-grid.rtl.css
│ │ │ │ ├── bootstrap-grid.rtl.css.map
│ │ │ │ ├── bootstrap-grid.rtl.min.css
│ │ │ │ ├── bootstrap-grid.rtl.min.css.map
│ │ │ │ ├── bootstrap-reboot.css
│ │ │ │ ├── bootstrap-reboot.css.map
│ │ │ │ ├── bootstrap-reboot.min.css
│ │ │ │ ├── bootstrap-reboot.min.css.map
│ │ │ │ ├── bootstrap-reboot.rtl.css
│ │ │ │ ├── bootstrap-reboot.rtl.css.map
│ │ │ │ ├── bootstrap-reboot.rtl.min.css
│ │ │ │ ├── bootstrap-reboot.rtl.min.css.map
│ │ │ │ ├── bootstrap-utilities.css
│ │ │ │ ├── bootstrap-utilities.css.map
│ │ │ │ ├── bootstrap-utilities.min.css
│ │ │ │ ├── bootstrap-utilities.min.css.map
│ │ │ │ ├── bootstrap-utilities.rtl.css
│ │ │ │ ├── bootstrap-utilities.rtl.css.map
│ │ │ │ ├── bootstrap-utilities.rtl.min.css
│ │ │ │ ├── bootstrap-utilities.rtl.min.css.map
│ │ │ │ ├── bootstrap.css
│ │ │ │ ├── bootstrap.css.map
│ │ │ │ ├── bootstrap.min.css
│ │ │ │ ├── bootstrap.min.css.map
│ │ │ │ ├── bootstrap.rtl.css
│ │ │ │ ├── bootstrap.rtl.css.map
│ │ │ │ ├── bootstrap.rtl.min.css
│ │ │ │ └── bootstrap.rtl.min.css.map
│ │ │ └── js
│ │ │ │ ├── bootstrap.bundle.js
│ │ │ │ ├── bootstrap.bundle.js.map
│ │ │ │ ├── bootstrap.bundle.min.js
│ │ │ │ ├── bootstrap.bundle.min.js.map
│ │ │ │ ├── bootstrap.esm.js
│ │ │ │ ├── bootstrap.esm.js.map
│ │ │ │ ├── bootstrap.esm.min.js
│ │ │ │ ├── bootstrap.esm.min.js.map
│ │ │ │ ├── bootstrap.js
│ │ │ │ ├── bootstrap.js.map
│ │ │ │ ├── bootstrap.min.js
│ │ │ │ └── bootstrap.min.js.map
│ │ └── images
│ │ │ ├── pastaman.ico
│ │ │ ├── pastaman.jpg
│ │ │ ├── penne.jfif
│ │ │ ├── pennerigate.jpg
│ │ │ └── spaghetti_twirl.png
│ ├── funk.js
│ ├── index.html
│ └── recipe_search.js
├── package-lock.json
├── package.json
├── recipes.json
└── server.js
├── README.txt
├── assets
└── images
│ ├── pastaman.ico
│ ├── pastaman.jpg
│ ├── penne.jfif
│ └── pennerigate.jpg
├── assignment_1
├── FAQ.md
├── FAQ.pdf
├── PITCHME.html
├── PITCHME.md
├── PITCHME.pdf
├── README.md
├── README.pdf
└── build.sh
└── assignment_2
├── PITCHME.html
├── PITCHME.md
├── README.md
├── README.pdf
└── build.sh
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | .vscode/launch.json
3 | node_modules
4 | .DS_Store
5 |
--------------------------------------------------------------------------------
/Examples/hello.html:
--------------------------------------------------------------------------------
1 |
2 |
14 |
--------------------------------------------------------------------------------
/Examples/hello.js:
--------------------------------------------------------------------------------
1 | console.log("hello")
--------------------------------------------------------------------------------
/Examples/httpserver.js:
--------------------------------------------------------------------------------
1 | http = require("http")
2 |
3 | http.createServer(function (request, response) {
4 | response.writeHead(200, {'Content-Type': 'text/plain'});
5 | response.end('Hello World\n');
6 | }).listen(8080);
7 |
8 | console.log('Server running at http://127.0.0.1:8080/');
--------------------------------------------------------------------------------
/Examples/max.js:
--------------------------------------------------------------------------------
1 | var express = require('express')
2 | var app = express()
3 |
4 | app.get('/random/:max', function(req, resp){
5 | max = parseInt(req.params.max)
6 | rand = Math.floor(Math.random()*max) +1
7 | console.log('Max via url is ' + max + ' rand is ' + rand)
8 | resp.send('' + rand)
9 | })
10 |
11 | app.get('/r', function(req, resp){
12 | max = parseInt(req.query.max)
13 | rand = Math.floor(Math.random()*max) +1
14 | console.log('Max via query is ' + max + ' rand is ' + rand)
15 | html = `
${rand} `
16 | resp.send(html)
17 | })
18 |
19 | app.listen(8090)
--------------------------------------------------------------------------------
/Examples/objects.js:
--------------------------------------------------------------------------------
1 | let meal = new Object();
2 | // equivalent
3 | meal = {}
4 |
5 | meal = {"starter": "antipasti"}
--------------------------------------------------------------------------------
/Examples/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "examples",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "examples",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "express": "^4.18.2"
13 | }
14 | },
15 | "node_modules/accepts": {
16 | "version": "1.3.8",
17 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
18 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
19 | "dependencies": {
20 | "mime-types": "~2.1.34",
21 | "negotiator": "0.6.3"
22 | },
23 | "engines": {
24 | "node": ">= 0.6"
25 | }
26 | },
27 | "node_modules/array-flatten": {
28 | "version": "1.1.1",
29 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
30 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
31 | },
32 | "node_modules/body-parser": {
33 | "version": "1.20.1",
34 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
35 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
36 | "dependencies": {
37 | "bytes": "3.1.2",
38 | "content-type": "~1.0.4",
39 | "debug": "2.6.9",
40 | "depd": "2.0.0",
41 | "destroy": "1.2.0",
42 | "http-errors": "2.0.0",
43 | "iconv-lite": "0.4.24",
44 | "on-finished": "2.4.1",
45 | "qs": "6.11.0",
46 | "raw-body": "2.5.1",
47 | "type-is": "~1.6.18",
48 | "unpipe": "1.0.0"
49 | },
50 | "engines": {
51 | "node": ">= 0.8",
52 | "npm": "1.2.8000 || >= 1.4.16"
53 | }
54 | },
55 | "node_modules/bytes": {
56 | "version": "3.1.2",
57 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
58 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
59 | "engines": {
60 | "node": ">= 0.8"
61 | }
62 | },
63 | "node_modules/call-bind": {
64 | "version": "1.0.2",
65 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
66 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
67 | "dependencies": {
68 | "function-bind": "^1.1.1",
69 | "get-intrinsic": "^1.0.2"
70 | },
71 | "funding": {
72 | "url": "https://github.com/sponsors/ljharb"
73 | }
74 | },
75 | "node_modules/content-disposition": {
76 | "version": "0.5.4",
77 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
78 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
79 | "dependencies": {
80 | "safe-buffer": "5.2.1"
81 | },
82 | "engines": {
83 | "node": ">= 0.6"
84 | }
85 | },
86 | "node_modules/content-type": {
87 | "version": "1.0.4",
88 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
89 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
90 | "engines": {
91 | "node": ">= 0.6"
92 | }
93 | },
94 | "node_modules/cookie": {
95 | "version": "0.5.0",
96 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
97 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
98 | "engines": {
99 | "node": ">= 0.6"
100 | }
101 | },
102 | "node_modules/cookie-signature": {
103 | "version": "1.0.6",
104 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
105 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
106 | },
107 | "node_modules/debug": {
108 | "version": "2.6.9",
109 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
110 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
111 | "dependencies": {
112 | "ms": "2.0.0"
113 | }
114 | },
115 | "node_modules/depd": {
116 | "version": "2.0.0",
117 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
118 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
119 | "engines": {
120 | "node": ">= 0.8"
121 | }
122 | },
123 | "node_modules/destroy": {
124 | "version": "1.2.0",
125 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
126 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
127 | "engines": {
128 | "node": ">= 0.8",
129 | "npm": "1.2.8000 || >= 1.4.16"
130 | }
131 | },
132 | "node_modules/ee-first": {
133 | "version": "1.1.1",
134 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
135 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
136 | },
137 | "node_modules/encodeurl": {
138 | "version": "1.0.2",
139 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
140 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
141 | "engines": {
142 | "node": ">= 0.8"
143 | }
144 | },
145 | "node_modules/escape-html": {
146 | "version": "1.0.3",
147 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
148 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
149 | },
150 | "node_modules/etag": {
151 | "version": "1.8.1",
152 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
153 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
154 | "engines": {
155 | "node": ">= 0.6"
156 | }
157 | },
158 | "node_modules/express": {
159 | "version": "4.18.2",
160 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
161 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
162 | "dependencies": {
163 | "accepts": "~1.3.8",
164 | "array-flatten": "1.1.1",
165 | "body-parser": "1.20.1",
166 | "content-disposition": "0.5.4",
167 | "content-type": "~1.0.4",
168 | "cookie": "0.5.0",
169 | "cookie-signature": "1.0.6",
170 | "debug": "2.6.9",
171 | "depd": "2.0.0",
172 | "encodeurl": "~1.0.2",
173 | "escape-html": "~1.0.3",
174 | "etag": "~1.8.1",
175 | "finalhandler": "1.2.0",
176 | "fresh": "0.5.2",
177 | "http-errors": "2.0.0",
178 | "merge-descriptors": "1.0.1",
179 | "methods": "~1.1.2",
180 | "on-finished": "2.4.1",
181 | "parseurl": "~1.3.3",
182 | "path-to-regexp": "0.1.7",
183 | "proxy-addr": "~2.0.7",
184 | "qs": "6.11.0",
185 | "range-parser": "~1.2.1",
186 | "safe-buffer": "5.2.1",
187 | "send": "0.18.0",
188 | "serve-static": "1.15.0",
189 | "setprototypeof": "1.2.0",
190 | "statuses": "2.0.1",
191 | "type-is": "~1.6.18",
192 | "utils-merge": "1.0.1",
193 | "vary": "~1.1.2"
194 | },
195 | "engines": {
196 | "node": ">= 0.10.0"
197 | }
198 | },
199 | "node_modules/finalhandler": {
200 | "version": "1.2.0",
201 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
202 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
203 | "dependencies": {
204 | "debug": "2.6.9",
205 | "encodeurl": "~1.0.2",
206 | "escape-html": "~1.0.3",
207 | "on-finished": "2.4.1",
208 | "parseurl": "~1.3.3",
209 | "statuses": "2.0.1",
210 | "unpipe": "~1.0.0"
211 | },
212 | "engines": {
213 | "node": ">= 0.8"
214 | }
215 | },
216 | "node_modules/forwarded": {
217 | "version": "0.2.0",
218 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
219 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
220 | "engines": {
221 | "node": ">= 0.6"
222 | }
223 | },
224 | "node_modules/fresh": {
225 | "version": "0.5.2",
226 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
227 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
228 | "engines": {
229 | "node": ">= 0.6"
230 | }
231 | },
232 | "node_modules/function-bind": {
233 | "version": "1.1.1",
234 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
235 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
236 | },
237 | "node_modules/get-intrinsic": {
238 | "version": "1.1.3",
239 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
240 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
241 | "dependencies": {
242 | "function-bind": "^1.1.1",
243 | "has": "^1.0.3",
244 | "has-symbols": "^1.0.3"
245 | },
246 | "funding": {
247 | "url": "https://github.com/sponsors/ljharb"
248 | }
249 | },
250 | "node_modules/has": {
251 | "version": "1.0.3",
252 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
253 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
254 | "dependencies": {
255 | "function-bind": "^1.1.1"
256 | },
257 | "engines": {
258 | "node": ">= 0.4.0"
259 | }
260 | },
261 | "node_modules/has-symbols": {
262 | "version": "1.0.3",
263 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
264 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
265 | "engines": {
266 | "node": ">= 0.4"
267 | },
268 | "funding": {
269 | "url": "https://github.com/sponsors/ljharb"
270 | }
271 | },
272 | "node_modules/http-errors": {
273 | "version": "2.0.0",
274 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
275 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
276 | "dependencies": {
277 | "depd": "2.0.0",
278 | "inherits": "2.0.4",
279 | "setprototypeof": "1.2.0",
280 | "statuses": "2.0.1",
281 | "toidentifier": "1.0.1"
282 | },
283 | "engines": {
284 | "node": ">= 0.8"
285 | }
286 | },
287 | "node_modules/iconv-lite": {
288 | "version": "0.4.24",
289 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
290 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
291 | "dependencies": {
292 | "safer-buffer": ">= 2.1.2 < 3"
293 | },
294 | "engines": {
295 | "node": ">=0.10.0"
296 | }
297 | },
298 | "node_modules/inherits": {
299 | "version": "2.0.4",
300 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
301 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
302 | },
303 | "node_modules/ipaddr.js": {
304 | "version": "1.9.1",
305 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
306 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
307 | "engines": {
308 | "node": ">= 0.10"
309 | }
310 | },
311 | "node_modules/media-typer": {
312 | "version": "0.3.0",
313 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
314 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
315 | "engines": {
316 | "node": ">= 0.6"
317 | }
318 | },
319 | "node_modules/merge-descriptors": {
320 | "version": "1.0.1",
321 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
322 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
323 | },
324 | "node_modules/methods": {
325 | "version": "1.1.2",
326 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
327 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
328 | "engines": {
329 | "node": ">= 0.6"
330 | }
331 | },
332 | "node_modules/mime": {
333 | "version": "1.6.0",
334 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
335 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
336 | "bin": {
337 | "mime": "cli.js"
338 | },
339 | "engines": {
340 | "node": ">=4"
341 | }
342 | },
343 | "node_modules/mime-db": {
344 | "version": "1.52.0",
345 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
346 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
347 | "engines": {
348 | "node": ">= 0.6"
349 | }
350 | },
351 | "node_modules/mime-types": {
352 | "version": "2.1.35",
353 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
354 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
355 | "dependencies": {
356 | "mime-db": "1.52.0"
357 | },
358 | "engines": {
359 | "node": ">= 0.6"
360 | }
361 | },
362 | "node_modules/ms": {
363 | "version": "2.0.0",
364 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
365 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
366 | },
367 | "node_modules/negotiator": {
368 | "version": "0.6.3",
369 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
370 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
371 | "engines": {
372 | "node": ">= 0.6"
373 | }
374 | },
375 | "node_modules/object-inspect": {
376 | "version": "1.12.2",
377 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
378 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
379 | "funding": {
380 | "url": "https://github.com/sponsors/ljharb"
381 | }
382 | },
383 | "node_modules/on-finished": {
384 | "version": "2.4.1",
385 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
386 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
387 | "dependencies": {
388 | "ee-first": "1.1.1"
389 | },
390 | "engines": {
391 | "node": ">= 0.8"
392 | }
393 | },
394 | "node_modules/parseurl": {
395 | "version": "1.3.3",
396 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
397 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
398 | "engines": {
399 | "node": ">= 0.8"
400 | }
401 | },
402 | "node_modules/path-to-regexp": {
403 | "version": "0.1.7",
404 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
405 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
406 | },
407 | "node_modules/proxy-addr": {
408 | "version": "2.0.7",
409 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
410 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
411 | "dependencies": {
412 | "forwarded": "0.2.0",
413 | "ipaddr.js": "1.9.1"
414 | },
415 | "engines": {
416 | "node": ">= 0.10"
417 | }
418 | },
419 | "node_modules/qs": {
420 | "version": "6.11.0",
421 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
422 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
423 | "dependencies": {
424 | "side-channel": "^1.0.4"
425 | },
426 | "engines": {
427 | "node": ">=0.6"
428 | },
429 | "funding": {
430 | "url": "https://github.com/sponsors/ljharb"
431 | }
432 | },
433 | "node_modules/range-parser": {
434 | "version": "1.2.1",
435 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
436 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
437 | "engines": {
438 | "node": ">= 0.6"
439 | }
440 | },
441 | "node_modules/raw-body": {
442 | "version": "2.5.1",
443 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
444 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
445 | "dependencies": {
446 | "bytes": "3.1.2",
447 | "http-errors": "2.0.0",
448 | "iconv-lite": "0.4.24",
449 | "unpipe": "1.0.0"
450 | },
451 | "engines": {
452 | "node": ">= 0.8"
453 | }
454 | },
455 | "node_modules/safe-buffer": {
456 | "version": "5.2.1",
457 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
458 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
459 | "funding": [
460 | {
461 | "type": "github",
462 | "url": "https://github.com/sponsors/feross"
463 | },
464 | {
465 | "type": "patreon",
466 | "url": "https://www.patreon.com/feross"
467 | },
468 | {
469 | "type": "consulting",
470 | "url": "https://feross.org/support"
471 | }
472 | ]
473 | },
474 | "node_modules/safer-buffer": {
475 | "version": "2.1.2",
476 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
477 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
478 | },
479 | "node_modules/send": {
480 | "version": "0.18.0",
481 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
482 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
483 | "dependencies": {
484 | "debug": "2.6.9",
485 | "depd": "2.0.0",
486 | "destroy": "1.2.0",
487 | "encodeurl": "~1.0.2",
488 | "escape-html": "~1.0.3",
489 | "etag": "~1.8.1",
490 | "fresh": "0.5.2",
491 | "http-errors": "2.0.0",
492 | "mime": "1.6.0",
493 | "ms": "2.1.3",
494 | "on-finished": "2.4.1",
495 | "range-parser": "~1.2.1",
496 | "statuses": "2.0.1"
497 | },
498 | "engines": {
499 | "node": ">= 0.8.0"
500 | }
501 | },
502 | "node_modules/send/node_modules/ms": {
503 | "version": "2.1.3",
504 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
505 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
506 | },
507 | "node_modules/serve-static": {
508 | "version": "1.15.0",
509 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
510 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
511 | "dependencies": {
512 | "encodeurl": "~1.0.2",
513 | "escape-html": "~1.0.3",
514 | "parseurl": "~1.3.3",
515 | "send": "0.18.0"
516 | },
517 | "engines": {
518 | "node": ">= 0.8.0"
519 | }
520 | },
521 | "node_modules/setprototypeof": {
522 | "version": "1.2.0",
523 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
524 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
525 | },
526 | "node_modules/side-channel": {
527 | "version": "1.0.4",
528 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
529 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
530 | "dependencies": {
531 | "call-bind": "^1.0.0",
532 | "get-intrinsic": "^1.0.2",
533 | "object-inspect": "^1.9.0"
534 | },
535 | "funding": {
536 | "url": "https://github.com/sponsors/ljharb"
537 | }
538 | },
539 | "node_modules/statuses": {
540 | "version": "2.0.1",
541 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
542 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
543 | "engines": {
544 | "node": ">= 0.8"
545 | }
546 | },
547 | "node_modules/toidentifier": {
548 | "version": "1.0.1",
549 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
550 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
551 | "engines": {
552 | "node": ">=0.6"
553 | }
554 | },
555 | "node_modules/type-is": {
556 | "version": "1.6.18",
557 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
558 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
559 | "dependencies": {
560 | "media-typer": "0.3.0",
561 | "mime-types": "~2.1.24"
562 | },
563 | "engines": {
564 | "node": ">= 0.6"
565 | }
566 | },
567 | "node_modules/unpipe": {
568 | "version": "1.0.0",
569 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
570 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
571 | "engines": {
572 | "node": ">= 0.8"
573 | }
574 | },
575 | "node_modules/utils-merge": {
576 | "version": "1.0.1",
577 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
578 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
579 | "engines": {
580 | "node": ">= 0.4.0"
581 | }
582 | },
583 | "node_modules/vary": {
584 | "version": "1.1.2",
585 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
586 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
587 | "engines": {
588 | "node": ">= 0.8"
589 | }
590 | }
591 | },
592 | "dependencies": {
593 | "accepts": {
594 | "version": "1.3.8",
595 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
596 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
597 | "requires": {
598 | "mime-types": "~2.1.34",
599 | "negotiator": "0.6.3"
600 | }
601 | },
602 | "array-flatten": {
603 | "version": "1.1.1",
604 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
605 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
606 | },
607 | "body-parser": {
608 | "version": "1.20.1",
609 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
610 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
611 | "requires": {
612 | "bytes": "3.1.2",
613 | "content-type": "~1.0.4",
614 | "debug": "2.6.9",
615 | "depd": "2.0.0",
616 | "destroy": "1.2.0",
617 | "http-errors": "2.0.0",
618 | "iconv-lite": "0.4.24",
619 | "on-finished": "2.4.1",
620 | "qs": "6.11.0",
621 | "raw-body": "2.5.1",
622 | "type-is": "~1.6.18",
623 | "unpipe": "1.0.0"
624 | }
625 | },
626 | "bytes": {
627 | "version": "3.1.2",
628 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
629 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
630 | },
631 | "call-bind": {
632 | "version": "1.0.2",
633 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
634 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
635 | "requires": {
636 | "function-bind": "^1.1.1",
637 | "get-intrinsic": "^1.0.2"
638 | }
639 | },
640 | "content-disposition": {
641 | "version": "0.5.4",
642 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
643 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
644 | "requires": {
645 | "safe-buffer": "5.2.1"
646 | }
647 | },
648 | "content-type": {
649 | "version": "1.0.4",
650 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
651 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
652 | },
653 | "cookie": {
654 | "version": "0.5.0",
655 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
656 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
657 | },
658 | "cookie-signature": {
659 | "version": "1.0.6",
660 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
661 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
662 | },
663 | "debug": {
664 | "version": "2.6.9",
665 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
666 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
667 | "requires": {
668 | "ms": "2.0.0"
669 | }
670 | },
671 | "depd": {
672 | "version": "2.0.0",
673 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
674 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
675 | },
676 | "destroy": {
677 | "version": "1.2.0",
678 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
679 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
680 | },
681 | "ee-first": {
682 | "version": "1.1.1",
683 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
684 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
685 | },
686 | "encodeurl": {
687 | "version": "1.0.2",
688 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
689 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
690 | },
691 | "escape-html": {
692 | "version": "1.0.3",
693 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
694 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
695 | },
696 | "etag": {
697 | "version": "1.8.1",
698 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
699 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
700 | },
701 | "express": {
702 | "version": "4.18.2",
703 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
704 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
705 | "requires": {
706 | "accepts": "~1.3.8",
707 | "array-flatten": "1.1.1",
708 | "body-parser": "1.20.1",
709 | "content-disposition": "0.5.4",
710 | "content-type": "~1.0.4",
711 | "cookie": "0.5.0",
712 | "cookie-signature": "1.0.6",
713 | "debug": "2.6.9",
714 | "depd": "2.0.0",
715 | "encodeurl": "~1.0.2",
716 | "escape-html": "~1.0.3",
717 | "etag": "~1.8.1",
718 | "finalhandler": "1.2.0",
719 | "fresh": "0.5.2",
720 | "http-errors": "2.0.0",
721 | "merge-descriptors": "1.0.1",
722 | "methods": "~1.1.2",
723 | "on-finished": "2.4.1",
724 | "parseurl": "~1.3.3",
725 | "path-to-regexp": "0.1.7",
726 | "proxy-addr": "~2.0.7",
727 | "qs": "6.11.0",
728 | "range-parser": "~1.2.1",
729 | "safe-buffer": "5.2.1",
730 | "send": "0.18.0",
731 | "serve-static": "1.15.0",
732 | "setprototypeof": "1.2.0",
733 | "statuses": "2.0.1",
734 | "type-is": "~1.6.18",
735 | "utils-merge": "1.0.1",
736 | "vary": "~1.1.2"
737 | }
738 | },
739 | "finalhandler": {
740 | "version": "1.2.0",
741 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
742 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
743 | "requires": {
744 | "debug": "2.6.9",
745 | "encodeurl": "~1.0.2",
746 | "escape-html": "~1.0.3",
747 | "on-finished": "2.4.1",
748 | "parseurl": "~1.3.3",
749 | "statuses": "2.0.1",
750 | "unpipe": "~1.0.0"
751 | }
752 | },
753 | "forwarded": {
754 | "version": "0.2.0",
755 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
756 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
757 | },
758 | "fresh": {
759 | "version": "0.5.2",
760 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
761 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
762 | },
763 | "function-bind": {
764 | "version": "1.1.1",
765 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
766 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
767 | },
768 | "get-intrinsic": {
769 | "version": "1.1.3",
770 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
771 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
772 | "requires": {
773 | "function-bind": "^1.1.1",
774 | "has": "^1.0.3",
775 | "has-symbols": "^1.0.3"
776 | }
777 | },
778 | "has": {
779 | "version": "1.0.3",
780 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
781 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
782 | "requires": {
783 | "function-bind": "^1.1.1"
784 | }
785 | },
786 | "has-symbols": {
787 | "version": "1.0.3",
788 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
789 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
790 | },
791 | "http-errors": {
792 | "version": "2.0.0",
793 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
794 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
795 | "requires": {
796 | "depd": "2.0.0",
797 | "inherits": "2.0.4",
798 | "setprototypeof": "1.2.0",
799 | "statuses": "2.0.1",
800 | "toidentifier": "1.0.1"
801 | }
802 | },
803 | "iconv-lite": {
804 | "version": "0.4.24",
805 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
806 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
807 | "requires": {
808 | "safer-buffer": ">= 2.1.2 < 3"
809 | }
810 | },
811 | "inherits": {
812 | "version": "2.0.4",
813 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
814 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
815 | },
816 | "ipaddr.js": {
817 | "version": "1.9.1",
818 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
819 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
820 | },
821 | "media-typer": {
822 | "version": "0.3.0",
823 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
824 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
825 | },
826 | "merge-descriptors": {
827 | "version": "1.0.1",
828 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
829 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
830 | },
831 | "methods": {
832 | "version": "1.1.2",
833 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
834 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
835 | },
836 | "mime": {
837 | "version": "1.6.0",
838 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
839 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
840 | },
841 | "mime-db": {
842 | "version": "1.52.0",
843 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
844 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
845 | },
846 | "mime-types": {
847 | "version": "2.1.35",
848 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
849 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
850 | "requires": {
851 | "mime-db": "1.52.0"
852 | }
853 | },
854 | "ms": {
855 | "version": "2.0.0",
856 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
857 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
858 | },
859 | "negotiator": {
860 | "version": "0.6.3",
861 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
862 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
863 | },
864 | "object-inspect": {
865 | "version": "1.12.2",
866 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
867 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
868 | },
869 | "on-finished": {
870 | "version": "2.4.1",
871 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
872 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
873 | "requires": {
874 | "ee-first": "1.1.1"
875 | }
876 | },
877 | "parseurl": {
878 | "version": "1.3.3",
879 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
880 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
881 | },
882 | "path-to-regexp": {
883 | "version": "0.1.7",
884 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
885 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
886 | },
887 | "proxy-addr": {
888 | "version": "2.0.7",
889 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
890 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
891 | "requires": {
892 | "forwarded": "0.2.0",
893 | "ipaddr.js": "1.9.1"
894 | }
895 | },
896 | "qs": {
897 | "version": "6.11.0",
898 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
899 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
900 | "requires": {
901 | "side-channel": "^1.0.4"
902 | }
903 | },
904 | "range-parser": {
905 | "version": "1.2.1",
906 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
907 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
908 | },
909 | "raw-body": {
910 | "version": "2.5.1",
911 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
912 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
913 | "requires": {
914 | "bytes": "3.1.2",
915 | "http-errors": "2.0.0",
916 | "iconv-lite": "0.4.24",
917 | "unpipe": "1.0.0"
918 | }
919 | },
920 | "safe-buffer": {
921 | "version": "5.2.1",
922 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
923 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
924 | },
925 | "safer-buffer": {
926 | "version": "2.1.2",
927 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
928 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
929 | },
930 | "send": {
931 | "version": "0.18.0",
932 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
933 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
934 | "requires": {
935 | "debug": "2.6.9",
936 | "depd": "2.0.0",
937 | "destroy": "1.2.0",
938 | "encodeurl": "~1.0.2",
939 | "escape-html": "~1.0.3",
940 | "etag": "~1.8.1",
941 | "fresh": "0.5.2",
942 | "http-errors": "2.0.0",
943 | "mime": "1.6.0",
944 | "ms": "2.1.3",
945 | "on-finished": "2.4.1",
946 | "range-parser": "~1.2.1",
947 | "statuses": "2.0.1"
948 | },
949 | "dependencies": {
950 | "ms": {
951 | "version": "2.1.3",
952 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
953 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
954 | }
955 | }
956 | },
957 | "serve-static": {
958 | "version": "1.15.0",
959 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
960 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
961 | "requires": {
962 | "encodeurl": "~1.0.2",
963 | "escape-html": "~1.0.3",
964 | "parseurl": "~1.3.3",
965 | "send": "0.18.0"
966 | }
967 | },
968 | "setprototypeof": {
969 | "version": "1.2.0",
970 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
971 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
972 | },
973 | "side-channel": {
974 | "version": "1.0.4",
975 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
976 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
977 | "requires": {
978 | "call-bind": "^1.0.0",
979 | "get-intrinsic": "^1.0.2",
980 | "object-inspect": "^1.9.0"
981 | }
982 | },
983 | "statuses": {
984 | "version": "2.0.1",
985 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
986 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
987 | },
988 | "toidentifier": {
989 | "version": "1.0.1",
990 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
991 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
992 | },
993 | "type-is": {
994 | "version": "1.6.18",
995 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
996 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
997 | "requires": {
998 | "media-typer": "0.3.0",
999 | "mime-types": "~2.1.24"
1000 | }
1001 | },
1002 | "unpipe": {
1003 | "version": "1.0.0",
1004 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1005 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
1006 | },
1007 | "utils-merge": {
1008 | "version": "1.0.1",
1009 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1010 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
1011 | },
1012 | "vary": {
1013 | "version": "1.1.2",
1014 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1015 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
1016 | }
1017 | }
1018 | }
1019 |
--------------------------------------------------------------------------------
/Examples/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "examples",
3 | "version": "1.0.0",
4 | "description": "stuff for lectures",
5 | "main": "server.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "author": "s.p.bradley@durham.ac.uk",
10 | "license": "ISC",
11 | "dependencies": {
12 | "express": "^4.18.2"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Examples/server.js:
--------------------------------------------------------------------------------
1 | var express = require('express')
2 | var app = express()
3 |
4 | app.get('/', function(req, resp){
5 | resp.send('Hello world')
6 | })
7 |
8 | app.listen(8090)
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | BSD 3-Clause License
2 |
3 | Copyright (c) 2022, Steven Bradley
4 | All rights reserved.
5 |
6 | Redistribution and use in source and binary forms, with or without
7 | modification, are permitted provided that the following conditions are met:
8 |
9 | 1. Redistributions of source code must retain the above copyright notice, this
10 | list of conditions and the following disclaimer.
11 |
12 | 2. Redistributions in binary form must reproduce the above copyright notice,
13 | this list of conditions and the following disclaimer in the documentation
14 | and/or other materials provided with the distribution.
15 |
16 | 3. Neither the name of the copyright holder nor the names of its
17 | contributors may be used to endorse or promote products derived from
18 | this software without specific prior written permission.
19 |
20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 |
--------------------------------------------------------------------------------
/Pasta/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: {
3 | commonjs: true,
4 | es2021: true
5 | },
6 | extends: 'standard',
7 | overrides: [
8 | ],
9 | parserOptions: {
10 | ecmaVersion: 'latest'
11 | },
12 | rules: {
13 | "semi": [2, "always"],
14 | "indent": "off"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Pasta/app.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const app = express();
3 |
4 | const fs = require('fs');
5 |
6 | const fileNameForJSON = './recipes.json';
7 | app.use(express.json());
8 | const path = require('path');
9 | app.use(express.static(path.join(__dirname, 'client')));
10 |
11 | const recipes = require(fileNameForJSON);
12 |
13 | app.get('/recipe/:recipe', function (req, resp) {
14 | const recipe = req.params.recipe;
15 | const instructions = recipes[recipe];
16 |
17 | resp.send(instructions);
18 | });
19 |
20 | app.get('/recipes', function (req, resp) {
21 | const recipeKeys = Object.keys(recipes);
22 | resp.send(recipeKeys);
23 | });
24 |
25 | app.post('/recipe/new', function (req, resp) {
26 | const key = req.body.key;
27 | const instructions = req.body.instructions;
28 | recipes[key] = instructions;
29 | fs.writeFileSync(fileNameForJSON, JSON.stringify(recipes));
30 | resp.send(recipes);
31 | });
32 |
33 | module.exports = app;
34 |
--------------------------------------------------------------------------------
/Pasta/app.test.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-undef */
2 |
3 | 'use strict';
4 |
5 | const request = require('supertest');
6 | const app = require('./app');
7 |
8 | describe('Test the recipes service', () => {
9 | test('GET /recipes succeeds', () => {
10 | return request(app)
11 | .get('/recipes')
12 | .expect(200);
13 | });
14 |
15 | test('GET /recipes returns JSON', () => {
16 | return request(app)
17 | .get('/recipes')
18 | .expect('Content-type', /json/);
19 | });
20 |
21 | test('GET /recipes includes carbonara', () => {
22 | return request(app)
23 | .get('/recipes')
24 | .expect(/carbonara/);
25 | });
26 |
27 | test('GET /recipe/carbonara succeeds', () => {
28 | return request(app)
29 | .get('/recipe/carbonara')
30 | .expect(200);
31 | });
32 |
33 | test('POST /recipe/new', () => {
34 | const params = { key: 'santa', instructions: 'Mix holly, cranberries and carrots for an unresonably long time and dress in ridiculous clothes' };
35 | return request(app)
36 | .post('/recipe/new')
37 | .send(params)
38 | .expect(200);
39 | });
40 | });
41 |
--------------------------------------------------------------------------------
/Pasta/client/assets/css/index.css:
--------------------------------------------------------------------------------
1 | .bd-placeholder-img {
2 | font-size: 1.125rem;
3 | text-anchor: middle;
4 | -webkit-user-select: none;
5 | -moz-user-select: none;
6 | user-select: none;
7 | }
8 |
9 | @media (min-width: 768px) {
10 | .bd-placeholder-img-lg {
11 | font-size: 3.5rem;
12 | }
13 | }
14 |
15 | #yummerino {
16 | float: right;
17 | margin: 0 0 0 15px;
18 | }
19 |
20 | img {
21 | display: block;
22 | margin-left: auto;
23 | }
24 |
25 | .b-example-divider {
26 | height: 3rem;
27 | background-color: rgba(0, 0, 0, .1);
28 | border: solid rgba(0, 0, 0, .15);
29 | border-width: 1px 0;
30 | box-shadow: inset 0 .5em 1.5em rgba(0, 0, 0, .1), inset 0 .125em .5em rgba(0, 0, 0, .15);
31 | }
32 |
33 | .b-example-vr {
34 | flex-shrink: 0;
35 | width: 1.5rem;
36 | height: 100vh;
37 | }
38 |
39 | .bi {
40 | vertical-align: -.125em;
41 | fill: currentColor;
42 | }
43 |
44 | .nav-scroller {
45 | position: relative;
46 | z-index: 2;
47 | height: 2.75rem;
48 | overflow-y: hidden;
49 | }
50 |
51 | .nav-scroller .nav {
52 | display: flex;
53 | flex-wrap: nowrap;
54 | padding-bottom: 1rem;
55 | margin-top: -1px;
56 | overflow-x: auto;
57 | text-align: center;
58 | white-space: nowrap;
59 | -webkit-overflow-scrolling: touch;
60 | }
61 |
62 | .recipe_list_item {
63 | text-decoration-line: underline;
64 | text-decoration-style: solid;
65 | }
--------------------------------------------------------------------------------
/Pasta/client/assets/dist/css/bootstrap-reboot.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Reboot v5.2.2 (https://getbootstrap.com/)
3 | * Copyright 2011-2022 The Bootstrap Authors
4 | * Copyright 2011-2022 Twitter, Inc.
5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6 | */
7 | :root {
8 | --bs-blue: #0d6efd;
9 | --bs-indigo: #6610f2;
10 | --bs-purple: #6f42c1;
11 | --bs-pink: #d63384;
12 | --bs-red: #dc3545;
13 | --bs-orange: #fd7e14;
14 | --bs-yellow: #ffc107;
15 | --bs-green: #198754;
16 | --bs-teal: #20c997;
17 | --bs-cyan: #0dcaf0;
18 | --bs-black: #000;
19 | --bs-white: #fff;
20 | --bs-gray: #6c757d;
21 | --bs-gray-dark: #343a40;
22 | --bs-gray-100: #f8f9fa;
23 | --bs-gray-200: #e9ecef;
24 | --bs-gray-300: #dee2e6;
25 | --bs-gray-400: #ced4da;
26 | --bs-gray-500: #adb5bd;
27 | --bs-gray-600: #6c757d;
28 | --bs-gray-700: #495057;
29 | --bs-gray-800: #343a40;
30 | --bs-gray-900: #212529;
31 | --bs-primary: #0d6efd;
32 | --bs-secondary: #6c757d;
33 | --bs-success: #198754;
34 | --bs-info: #0dcaf0;
35 | --bs-warning: #ffc107;
36 | --bs-danger: #dc3545;
37 | --bs-light: #f8f9fa;
38 | --bs-dark: #212529;
39 | --bs-primary-rgb: 13, 110, 253;
40 | --bs-secondary-rgb: 108, 117, 125;
41 | --bs-success-rgb: 25, 135, 84;
42 | --bs-info-rgb: 13, 202, 240;
43 | --bs-warning-rgb: 255, 193, 7;
44 | --bs-danger-rgb: 220, 53, 69;
45 | --bs-light-rgb: 248, 249, 250;
46 | --bs-dark-rgb: 33, 37, 41;
47 | --bs-white-rgb: 255, 255, 255;
48 | --bs-black-rgb: 0, 0, 0;
49 | --bs-body-color-rgb: 33, 37, 41;
50 | --bs-body-bg-rgb: 255, 255, 255;
51 | --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
52 | --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
53 | --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
54 | --bs-body-font-family: var(--bs-font-sans-serif);
55 | --bs-body-font-size: 1rem;
56 | --bs-body-font-weight: 400;
57 | --bs-body-line-height: 1.5;
58 | --bs-body-color: #212529;
59 | --bs-body-bg: #fff;
60 | --bs-border-width: 1px;
61 | --bs-border-style: solid;
62 | --bs-border-color: #dee2e6;
63 | --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
64 | --bs-border-radius: 0.375rem;
65 | --bs-border-radius-sm: 0.25rem;
66 | --bs-border-radius-lg: 0.5rem;
67 | --bs-border-radius-xl: 1rem;
68 | --bs-border-radius-2xl: 2rem;
69 | --bs-border-radius-pill: 50rem;
70 | --bs-link-color: #0d6efd;
71 | --bs-link-hover-color: #0a58ca;
72 | --bs-code-color: #d63384;
73 | --bs-highlight-bg: #fff3cd;
74 | }
75 |
76 | *,
77 | *::before,
78 | *::after {
79 | box-sizing: border-box;
80 | }
81 |
82 | @media (prefers-reduced-motion: no-preference) {
83 | :root {
84 | scroll-behavior: smooth;
85 | }
86 | }
87 |
88 | body {
89 | margin: 0;
90 | font-family: var(--bs-body-font-family);
91 | font-size: var(--bs-body-font-size);
92 | font-weight: var(--bs-body-font-weight);
93 | line-height: var(--bs-body-line-height);
94 | color: var(--bs-body-color);
95 | text-align: var(--bs-body-text-align);
96 | background-color: var(--bs-body-bg);
97 | -webkit-text-size-adjust: 100%;
98 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
99 | }
100 |
101 | hr {
102 | margin: 1rem 0;
103 | color: inherit;
104 | border: 0;
105 | border-top: 1px solid;
106 | opacity: 0.25;
107 | }
108 |
109 | h6, h5, h4, h3, h2, h1 {
110 | margin-top: 0;
111 | margin-bottom: 0.5rem;
112 | font-weight: 500;
113 | line-height: 1.2;
114 | }
115 |
116 | h1 {
117 | font-size: calc(1.375rem + 1.5vw);
118 | }
119 | @media (min-width: 1200px) {
120 | h1 {
121 | font-size: 2.5rem;
122 | }
123 | }
124 |
125 | h2 {
126 | font-size: calc(1.325rem + 0.9vw);
127 | }
128 | @media (min-width: 1200px) {
129 | h2 {
130 | font-size: 2rem;
131 | }
132 | }
133 |
134 | h3 {
135 | font-size: calc(1.3rem + 0.6vw);
136 | }
137 | @media (min-width: 1200px) {
138 | h3 {
139 | font-size: 1.75rem;
140 | }
141 | }
142 |
143 | h4 {
144 | font-size: calc(1.275rem + 0.3vw);
145 | }
146 | @media (min-width: 1200px) {
147 | h4 {
148 | font-size: 1.5rem;
149 | }
150 | }
151 |
152 | h5 {
153 | font-size: 1.25rem;
154 | }
155 |
156 | h6 {
157 | font-size: 1rem;
158 | }
159 |
160 | p {
161 | margin-top: 0;
162 | margin-bottom: 1rem;
163 | }
164 |
165 | abbr[title] {
166 | -webkit-text-decoration: underline dotted;
167 | text-decoration: underline dotted;
168 | cursor: help;
169 | -webkit-text-decoration-skip-ink: none;
170 | text-decoration-skip-ink: none;
171 | }
172 |
173 | address {
174 | margin-bottom: 1rem;
175 | font-style: normal;
176 | line-height: inherit;
177 | }
178 |
179 | ol,
180 | ul {
181 | padding-left: 2rem;
182 | }
183 |
184 | ol,
185 | ul,
186 | dl {
187 | margin-top: 0;
188 | margin-bottom: 1rem;
189 | }
190 |
191 | ol ol,
192 | ul ul,
193 | ol ul,
194 | ul ol {
195 | margin-bottom: 0;
196 | }
197 |
198 | dt {
199 | font-weight: 700;
200 | }
201 |
202 | dd {
203 | margin-bottom: 0.5rem;
204 | margin-left: 0;
205 | }
206 |
207 | blockquote {
208 | margin: 0 0 1rem;
209 | }
210 |
211 | b,
212 | strong {
213 | font-weight: bolder;
214 | }
215 |
216 | small {
217 | font-size: 0.875em;
218 | }
219 |
220 | mark {
221 | padding: 0.1875em;
222 | background-color: var(--bs-highlight-bg);
223 | }
224 |
225 | sub,
226 | sup {
227 | position: relative;
228 | font-size: 0.75em;
229 | line-height: 0;
230 | vertical-align: baseline;
231 | }
232 |
233 | sub {
234 | bottom: -0.25em;
235 | }
236 |
237 | sup {
238 | top: -0.5em;
239 | }
240 |
241 | a {
242 | color: var(--bs-link-color);
243 | text-decoration: underline;
244 | }
245 | a:hover {
246 | color: var(--bs-link-hover-color);
247 | }
248 |
249 | a:not([href]):not([class]), a:not([href]):not([class]):hover {
250 | color: inherit;
251 | text-decoration: none;
252 | }
253 |
254 | pre,
255 | code,
256 | kbd,
257 | samp {
258 | font-family: var(--bs-font-monospace);
259 | font-size: 1em;
260 | }
261 |
262 | pre {
263 | display: block;
264 | margin-top: 0;
265 | margin-bottom: 1rem;
266 | overflow: auto;
267 | font-size: 0.875em;
268 | }
269 | pre code {
270 | font-size: inherit;
271 | color: inherit;
272 | word-break: normal;
273 | }
274 |
275 | code {
276 | font-size: 0.875em;
277 | color: var(--bs-code-color);
278 | word-wrap: break-word;
279 | }
280 | a > code {
281 | color: inherit;
282 | }
283 |
284 | kbd {
285 | padding: 0.1875rem 0.375rem;
286 | font-size: 0.875em;
287 | color: var(--bs-body-bg);
288 | background-color: var(--bs-body-color);
289 | border-radius: 0.25rem;
290 | }
291 | kbd kbd {
292 | padding: 0;
293 | font-size: 1em;
294 | }
295 |
296 | figure {
297 | margin: 0 0 1rem;
298 | }
299 |
300 | img,
301 | svg {
302 | vertical-align: middle;
303 | }
304 |
305 | table {
306 | caption-side: bottom;
307 | border-collapse: collapse;
308 | }
309 |
310 | caption {
311 | padding-top: 0.5rem;
312 | padding-bottom: 0.5rem;
313 | color: #6c757d;
314 | text-align: left;
315 | }
316 |
317 | th {
318 | text-align: inherit;
319 | text-align: -webkit-match-parent;
320 | }
321 |
322 | thead,
323 | tbody,
324 | tfoot,
325 | tr,
326 | td,
327 | th {
328 | border-color: inherit;
329 | border-style: solid;
330 | border-width: 0;
331 | }
332 |
333 | label {
334 | display: inline-block;
335 | }
336 |
337 | button {
338 | border-radius: 0;
339 | }
340 |
341 | button:focus:not(:focus-visible) {
342 | outline: 0;
343 | }
344 |
345 | input,
346 | button,
347 | select,
348 | optgroup,
349 | textarea {
350 | margin: 0;
351 | font-family: inherit;
352 | font-size: inherit;
353 | line-height: inherit;
354 | }
355 |
356 | button,
357 | select {
358 | text-transform: none;
359 | }
360 |
361 | [role=button] {
362 | cursor: pointer;
363 | }
364 |
365 | select {
366 | word-wrap: normal;
367 | }
368 | select:disabled {
369 | opacity: 1;
370 | }
371 |
372 | [list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
373 | display: none !important;
374 | }
375 |
376 | button,
377 | [type=button],
378 | [type=reset],
379 | [type=submit] {
380 | -webkit-appearance: button;
381 | }
382 | button:not(:disabled),
383 | [type=button]:not(:disabled),
384 | [type=reset]:not(:disabled),
385 | [type=submit]:not(:disabled) {
386 | cursor: pointer;
387 | }
388 |
389 | ::-moz-focus-inner {
390 | padding: 0;
391 | border-style: none;
392 | }
393 |
394 | textarea {
395 | resize: vertical;
396 | }
397 |
398 | fieldset {
399 | min-width: 0;
400 | padding: 0;
401 | margin: 0;
402 | border: 0;
403 | }
404 |
405 | legend {
406 | float: left;
407 | width: 100%;
408 | padding: 0;
409 | margin-bottom: 0.5rem;
410 | font-size: calc(1.275rem + 0.3vw);
411 | line-height: inherit;
412 | }
413 | @media (min-width: 1200px) {
414 | legend {
415 | font-size: 1.5rem;
416 | }
417 | }
418 | legend + * {
419 | clear: left;
420 | }
421 |
422 | ::-webkit-datetime-edit-fields-wrapper,
423 | ::-webkit-datetime-edit-text,
424 | ::-webkit-datetime-edit-minute,
425 | ::-webkit-datetime-edit-hour-field,
426 | ::-webkit-datetime-edit-day-field,
427 | ::-webkit-datetime-edit-month-field,
428 | ::-webkit-datetime-edit-year-field {
429 | padding: 0;
430 | }
431 |
432 | ::-webkit-inner-spin-button {
433 | height: auto;
434 | }
435 |
436 | [type=search] {
437 | outline-offset: -2px;
438 | -webkit-appearance: textfield;
439 | }
440 |
441 | /* rtl:raw:
442 | [type="tel"],
443 | [type="url"],
444 | [type="email"],
445 | [type="number"] {
446 | direction: ltr;
447 | }
448 | */
449 | ::-webkit-search-decoration {
450 | -webkit-appearance: none;
451 | }
452 |
453 | ::-webkit-color-swatch-wrapper {
454 | padding: 0;
455 | }
456 |
457 | ::-webkit-file-upload-button {
458 | font: inherit;
459 | -webkit-appearance: button;
460 | }
461 |
462 | ::file-selector-button {
463 | font: inherit;
464 | -webkit-appearance: button;
465 | }
466 |
467 | output {
468 | display: inline-block;
469 | }
470 |
471 | iframe {
472 | border: 0;
473 | }
474 |
475 | summary {
476 | display: list-item;
477 | cursor: pointer;
478 | }
479 |
480 | progress {
481 | vertical-align: baseline;
482 | }
483 |
484 | [hidden] {
485 | display: none !important;
486 | }
487 |
488 | /*# sourceMappingURL=bootstrap-reboot.css.map */
--------------------------------------------------------------------------------
/Pasta/client/assets/dist/css/bootstrap-reboot.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Reboot v5.2.2 (https://getbootstrap.com/)
3 | * Copyright 2011-2022 The Bootstrap Authors
4 | * Copyright 2011-2022 Twitter, Inc.
5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6 | */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#0a58ca;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:underline}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}
7 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */
--------------------------------------------------------------------------------
/Pasta/client/assets/dist/css/bootstrap-reboot.min.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_root.scss","../../scss/vendor/_rfs.scss","../../scss/_reboot.scss","dist/css/bootstrap-reboot.css","../../scss/mixins/_border-radius.scss"],"names":[],"mappings":"AACE;;;;;ACDF,MAQI,UAAA,QAAA,YAAA,QAAA,YAAA,QAAA,UAAA,QAAA,SAAA,QAAA,YAAA,QAAA,YAAA,QAAA,WAAA,QAAA,UAAA,QAAA,UAAA,QAAA,WAAA,KAAA,WAAA,KAAA,UAAA,QAAA,eAAA,QAIA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAIA,aAAA,QAAA,eAAA,QAAA,aAAA,QAAA,UAAA,QAAA,aAAA,QAAA,YAAA,QAAA,WAAA,QAAA,UAAA,QAIA,iBAAA,EAAA,CAAA,GAAA,CAAA,IAAA,mBAAA,GAAA,CAAA,GAAA,CAAA,IAAA,iBAAA,EAAA,CAAA,GAAA,CAAA,GAAA,cAAA,EAAA,CAAA,GAAA,CAAA,IAAA,iBAAA,GAAA,CAAA,GAAA,CAAA,EAAA,gBAAA,GAAA,CAAA,EAAA,CAAA,GAAA,eAAA,GAAA,CAAA,GAAA,CAAA,IAAA,cAAA,EAAA,CAAA,EAAA,CAAA,GAGF,eAAA,GAAA,CAAA,GAAA,CAAA,IACA,eAAA,CAAA,CAAA,CAAA,CAAA,EACA,oBAAA,EAAA,CAAA,EAAA,CAAA,GACA,iBAAA,GAAA,CAAA,GAAA,CAAA,IAMA,qBAAA,SAAA,CAAA,aAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,WAAA,CAAA,iBAAA,CAAA,KAAA,CAAA,UAAA,CAAA,mBAAA,CAAA,gBAAA,CAAA,iBAAA,CAAA,mBACA,oBAAA,cAAA,CAAA,KAAA,CAAA,MAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,aAAA,CAAA,UACA,cAAA,2EAOA,sBAAA,0BC4PI,oBAAA,KD1PJ,sBAAA,IACA,sBAAA,IACA,gBAAA,QAIA,aAAA,KAIA,kBAAA,IACA,kBAAA,MACA,kBAAA,QACA,8BAAA,qBAEA,mBAAA,SACA,sBAAA,QACA,sBAAA,OACA,sBAAA,KACA,uBAAA,KACA,wBAAA,MAGA,gBAAA,QACA,sBAAA,QAEA,gBAAA,QAEA,kBAAA,QExDF,EC8DA,QADA,SD1DE,WAAA,WAeE,8CANJ,MAOM,gBAAA,QAcN,KACE,OAAA,EACA,YAAA,2BDmPI,UAAA,yBCjPJ,YAAA,2BACA,YAAA,2BACA,MAAA,qBACA,WAAA,0BACA,iBAAA,kBACA,yBAAA,KACA,4BAAA,YASF,GACE,OAAA,KAAA,EACA,MAAA,QACA,OAAA,EACA,WAAA,IAAA,MACA,QAAA,IAUF,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAGA,YAAA,IACA,YAAA,IAIF,GD6MQ,UAAA,uBAlKJ,0BC3CJ,GDoNQ,UAAA,QC/MR,GDwMQ,UAAA,sBAlKJ,0BCtCJ,GD+MQ,UAAA,MC1MR,GDmMQ,UAAA,oBAlKJ,0BCjCJ,GD0MQ,UAAA,SCrMR,GD8LQ,UAAA,sBAlKJ,0BC5BJ,GDqMQ,UAAA,QChMR,GDqLM,UAAA,QChLN,GDgLM,UAAA,KCrKN,EACE,WAAA,EACA,cAAA,KAUF,YACE,wBAAA,UAAA,OAAA,gBAAA,UAAA,OACA,OAAA,KACA,iCAAA,KAAA,yBAAA,KAMF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QAMF,GCqBA,GDnBE,aAAA,KCyBF,GDtBA,GCqBA,GDlBE,WAAA,EACA,cAAA,KAGF,MCsBA,MACA,MAFA,MDjBE,cAAA,EAGF,GACE,YAAA,IAKF,GACE,cAAA,MACA,YAAA,EAMF,WACE,OAAA,EAAA,EAAA,KAQF,ECWA,ODTE,YAAA,OAQF,MDmFM,UAAA,OC5EN,KACE,QAAA,QACA,iBAAA,uBASF,ICHA,IDKE,SAAA,SD+DI,UAAA,MC7DJ,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAKN,EACE,MAAA,qBACA,gBAAA,UAEA,QACE,MAAA,2BAWF,2BAAA,iCAEE,MAAA,QACA,gBAAA,KCPJ,KACA,IDaA,ICZA,KDgBE,YAAA,yBDqBI,UAAA,ICbN,IACE,QAAA,MACA,WAAA,EACA,cAAA,KACA,SAAA,KDSI,UAAA,OCJJ,SDII,UAAA,QCFF,MAAA,QACA,WAAA,OAIJ,KDHM,UAAA,OCKJ,MAAA,qBACA,UAAA,WAGA,OACE,MAAA,QAIJ,IACE,QAAA,SAAA,QDfI,UAAA,OCiBJ,MAAA,kBACA,iBAAA,qBEpSE,cAAA,OFuSF,QACE,QAAA,EDtBE,UAAA,ICiCN,OACE,OAAA,EAAA,EAAA,KAMF,ICjCA,IDmCE,eAAA,OAQF,MACE,aAAA,OACA,gBAAA,SAGF,QACE,YAAA,MACA,eAAA,MACA,MAAA,QACA,WAAA,KAOF,GAEE,WAAA,QACA,WAAA,qBCxCF,MAGA,GAFA,MAGA,GDuCA,MCzCA,GD+CE,aAAA,QACA,aAAA,MACA,aAAA,EAQF,MACE,QAAA,aAMF,OAEE,cAAA,EAQF,iCACE,QAAA,ECtDF,OD2DA,MCzDA,SADA,OAEA,SD6DE,OAAA,EACA,YAAA,QDrHI,UAAA,QCuHJ,YAAA,QAIF,OC5DA,OD8DE,eAAA,KAKF,cACE,OAAA,QAGF,OAGE,UAAA,OAGA,gBACE,QAAA,EAOJ,0IACE,QAAA,eClEF,cACA,aACA,cDwEA,OAIE,mBAAA,OCxEF,6BACA,4BACA,6BDyEI,sBACE,OAAA,QAON,mBACE,QAAA,EACA,aAAA,KAKF,SACE,OAAA,SAUF,SACE,UAAA,EACA,QAAA,EACA,OAAA,EACA,OAAA,EAQF,OACE,MAAA,KACA,MAAA,KACA,QAAA,EACA,cAAA,MD1MM,UAAA,sBC6MN,YAAA,QD/WE,0BCwWJ,OD/LQ,UAAA,QCwMN,SACE,MAAA,KChFJ,kCDuFA,uCCxFA,mCADA,+BAGA,oCAJA,6BAKA,mCD4FE,QAAA,EAGF,4BACE,OAAA,KASF,cACE,eAAA,KACA,mBAAA,UAmBF,4BACE,mBAAA,KAKF,+BACE,QAAA,EAOF,6BACE,KAAA,QACA,mBAAA,OAFF,uBACE,KAAA,QACA,mBAAA,OAKF,OACE,QAAA,aAKF,OACE,OAAA,EAOF,QACE,QAAA,UACA,OAAA,QAQF,SACE,eAAA,SAQF,SACE,QAAA","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.2.2 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{$font-family-base};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n --#{$prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n --#{$prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-2xl: #{$border-radius-2xl};\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-hover-color: #{$link-hover-color};\n\n --#{$prefix}code-color: #{$code-color};\n\n --#{$prefix}highlight-bg: #{$mark-bg};\n}\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, ``-`` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on ` `s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: var(--#{$prefix}link-color);\n text-decoration: $link-decoration;\n\n &:hover {\n color: var(--#{$prefix}link-hover-color);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `
` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`` buttons\n//\n// Details at https://github.com/twbs/bootstrap/pull/30562\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n // Remove the inheritance of word-wrap in Safari.\n // See https://github.com/twbs/bootstrap/issues/24990\n word-wrap: normal;\n\n // Undo the opacity change from Chrome\n &:disabled {\n opacity: 1;\n }\n}\n\n// Remove the dropdown arrow only from text type inputs built with datalists in Chrome.\n// See https://stackoverflow.com/a/54997118\n\n[list]:not([type=\"date\"]):not([type=\"datetime-local\"]):not([type=\"month\"]):not([type=\"week\"]):not([type=\"time\"])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\n// 3. Opinionated: add \"hand\" cursor to non-disabled button elements.\n\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n\n @if $enable-button-pointers {\n &:not(:disabled) {\n cursor: pointer; // 3\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\n// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.\n\ntextarea {\n resize: vertical; // 1\n}\n\n// 1. Browsers set a default `min-width: min-content;` on fieldsets,\n// unlike e.g. ``s, which have `min-width: 0;` by default.\n// So we reset that to ensure fieldsets behave more like a standard block element.\n// See https://github.com/twbs/bootstrap/issues/12359\n// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.\n\nfieldset {\n min-width: 0; // 1\n padding: 0; // 2\n margin: 0; // 2\n border: 0; // 2\n}\n\n// 1. By using `float: left`, the legend will behave like a block element.\n// This way the border of a fieldset wraps around the legend if present.\n// 2. Fix wrapping bug.\n// See https://github.com/twbs/bootstrap/issues/29712\n\nlegend {\n float: left; // 1\n width: 100%;\n padding: 0;\n margin-bottom: $legend-margin-bottom;\n @include font-size($legend-font-size);\n font-weight: $legend-font-weight;\n line-height: inherit;\n\n + * {\n clear: left; // 2\n }\n}\n\n// Fix height of inputs with a type of datetime-local, date, month, week, or time\n// See https://github.com/twbs/bootstrap/issues/18842\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n// 1. Correct the outline style in Safari.\n// 2. This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\n[type=\"search\"] {\n outline-offset: -2px; // 1\n -webkit-appearance: textfield; // 2\n}\n\n// 1. A few input types should stay LTR\n// See https://rtlstyling.com/posts/rtl-styling#form-inputs\n// 2. RTL only output\n// See https://rtlcss.com/learn/usage-guide/control-directives/#raw\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n\n// Remove the inner padding in Chrome and Safari on macOS.\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n// Remove padding around color pickers in webkit browsers\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n\n// 1. Inherit font family and line height for file input buttons\n// 2. Correct the inability to style clickable types in iOS and Safari.\n\n::file-selector-button {\n font: inherit; // 1\n -webkit-appearance: button; // 2\n}\n\n// Correct element displays\n\noutput {\n display: inline-block;\n}\n\n// Remove border from iframe\n\niframe {\n border: 0;\n}\n\n// Summary\n//\n// 1. Add the correct display in all browsers\n\nsummary {\n display: list-item; // 1\n cursor: pointer;\n}\n\n\n// Progress\n//\n// Add the correct vertical alignment in Chrome, Firefox, and Opera.\n\nprogress {\n vertical-align: baseline;\n}\n\n\n// Hidden attribute\n//\n// Always hide an element with the `hidden` HTML attribute.\n\n[hidden] {\n display: none !important;\n}\n","/*!\n * Bootstrap Reboot v5.2.2 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-black: #000;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-bg: #fff;\n --bs-border-width: 1px;\n --bs-border-style: solid;\n --bs-border-color: #dee2e6;\n --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n --bs-border-radius: 0.375rem;\n --bs-border-radius-sm: 0.25rem;\n --bs-border-radius-lg: 0.5rem;\n --bs-border-radius-xl: 1rem;\n --bs-border-radius-2xl: 2rem;\n --bs-border-radius-pill: 50rem;\n --bs-link-color: #0d6efd;\n --bs-link-hover-color: #0a58ca;\n --bs-code-color: #d63384;\n --bs-highlight-bg: #fff3cd;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n :root {\n scroll-behavior: smooth;\n }\n}\n\nbody {\n margin: 0;\n font-family: var(--bs-body-font-family);\n font-size: var(--bs-body-font-size);\n font-weight: var(--bs-body-font-weight);\n line-height: var(--bs-body-line-height);\n color: var(--bs-body-color);\n text-align: var(--bs-body-text-align);\n background-color: var(--bs-body-bg);\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n margin: 1rem 0;\n color: inherit;\n border: 0;\n border-top: 1px solid;\n opacity: 0.25;\n}\n\nh6, h5, h4, h3, h2, h1 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1 {\n font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n h1 {\n font-size: 2.5rem;\n }\n}\n\nh2 {\n font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n h2 {\n font-size: 2rem;\n }\n}\n\nh3 {\n font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n h3 {\n font-size: 1.75rem;\n }\n}\n\nh4 {\n font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n h4 {\n font-size: 1.5rem;\n }\n}\n\nh5 {\n font-size: 1.25rem;\n}\n\nh6 {\n font-size: 1rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title] {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: 0.5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 0.875em;\n}\n\nmark {\n padding: 0.1875em;\n background-color: var(--bs-highlight-bg);\n}\n\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\na {\n color: var(--bs-link-color);\n text-decoration: underline;\n}\na:hover {\n color: var(--bs-link-hover-color);\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: var(--bs-font-monospace);\n font-size: 1em;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n font-size: 0.875em;\n}\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\ncode {\n font-size: 0.875em;\n color: var(--bs-code-color);\n word-wrap: break-word;\n}\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.1875rem 0.375rem;\n font-size: 0.875em;\n color: var(--bs-body-bg);\n background-color: var(--bs-body-color);\n border-radius: 0.25rem;\n}\nkbd kbd {\n padding: 0;\n font-size: 1em;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: #6c757d;\n text-align: left;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\nlabel {\n display: inline-block;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=button] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\nselect:disabled {\n opacity: 1;\n}\n\n[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n cursor: pointer;\n}\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ntextarea {\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n float: left;\n width: 100%;\n padding: 0;\n margin-bottom: 0.5rem;\n font-size: calc(1.275rem + 0.3vw);\n line-height: inherit;\n}\n@media (min-width: 1200px) {\n legend {\n font-size: 1.5rem;\n }\n}\nlegend + * {\n clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n[type=search] {\n outline-offset: -2px;\n -webkit-appearance: textfield;\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\n::file-selector-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\niframe {\n border: 0;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n"]}
--------------------------------------------------------------------------------
/Pasta/client/assets/dist/css/bootstrap-reboot.rtl.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Reboot v5.2.2 (https://getbootstrap.com/)
3 | * Copyright 2011-2022 The Bootstrap Authors
4 | * Copyright 2011-2022 Twitter, Inc.
5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6 | */
7 | :root {
8 | --bs-blue: #0d6efd;
9 | --bs-indigo: #6610f2;
10 | --bs-purple: #6f42c1;
11 | --bs-pink: #d63384;
12 | --bs-red: #dc3545;
13 | --bs-orange: #fd7e14;
14 | --bs-yellow: #ffc107;
15 | --bs-green: #198754;
16 | --bs-teal: #20c997;
17 | --bs-cyan: #0dcaf0;
18 | --bs-black: #000;
19 | --bs-white: #fff;
20 | --bs-gray: #6c757d;
21 | --bs-gray-dark: #343a40;
22 | --bs-gray-100: #f8f9fa;
23 | --bs-gray-200: #e9ecef;
24 | --bs-gray-300: #dee2e6;
25 | --bs-gray-400: #ced4da;
26 | --bs-gray-500: #adb5bd;
27 | --bs-gray-600: #6c757d;
28 | --bs-gray-700: #495057;
29 | --bs-gray-800: #343a40;
30 | --bs-gray-900: #212529;
31 | --bs-primary: #0d6efd;
32 | --bs-secondary: #6c757d;
33 | --bs-success: #198754;
34 | --bs-info: #0dcaf0;
35 | --bs-warning: #ffc107;
36 | --bs-danger: #dc3545;
37 | --bs-light: #f8f9fa;
38 | --bs-dark: #212529;
39 | --bs-primary-rgb: 13, 110, 253;
40 | --bs-secondary-rgb: 108, 117, 125;
41 | --bs-success-rgb: 25, 135, 84;
42 | --bs-info-rgb: 13, 202, 240;
43 | --bs-warning-rgb: 255, 193, 7;
44 | --bs-danger-rgb: 220, 53, 69;
45 | --bs-light-rgb: 248, 249, 250;
46 | --bs-dark-rgb: 33, 37, 41;
47 | --bs-white-rgb: 255, 255, 255;
48 | --bs-black-rgb: 0, 0, 0;
49 | --bs-body-color-rgb: 33, 37, 41;
50 | --bs-body-bg-rgb: 255, 255, 255;
51 | --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
52 | --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
53 | --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
54 | --bs-body-font-family: var(--bs-font-sans-serif);
55 | --bs-body-font-size: 1rem;
56 | --bs-body-font-weight: 400;
57 | --bs-body-line-height: 1.5;
58 | --bs-body-color: #212529;
59 | --bs-body-bg: #fff;
60 | --bs-border-width: 1px;
61 | --bs-border-style: solid;
62 | --bs-border-color: #dee2e6;
63 | --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
64 | --bs-border-radius: 0.375rem;
65 | --bs-border-radius-sm: 0.25rem;
66 | --bs-border-radius-lg: 0.5rem;
67 | --bs-border-radius-xl: 1rem;
68 | --bs-border-radius-2xl: 2rem;
69 | --bs-border-radius-pill: 50rem;
70 | --bs-link-color: #0d6efd;
71 | --bs-link-hover-color: #0a58ca;
72 | --bs-code-color: #d63384;
73 | --bs-highlight-bg: #fff3cd;
74 | }
75 |
76 | *,
77 | *::before,
78 | *::after {
79 | box-sizing: border-box;
80 | }
81 |
82 | @media (prefers-reduced-motion: no-preference) {
83 | :root {
84 | scroll-behavior: smooth;
85 | }
86 | }
87 |
88 | body {
89 | margin: 0;
90 | font-family: var(--bs-body-font-family);
91 | font-size: var(--bs-body-font-size);
92 | font-weight: var(--bs-body-font-weight);
93 | line-height: var(--bs-body-line-height);
94 | color: var(--bs-body-color);
95 | text-align: var(--bs-body-text-align);
96 | background-color: var(--bs-body-bg);
97 | -webkit-text-size-adjust: 100%;
98 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
99 | }
100 |
101 | hr {
102 | margin: 1rem 0;
103 | color: inherit;
104 | border: 0;
105 | border-top: 1px solid;
106 | opacity: 0.25;
107 | }
108 |
109 | h6, h5, h4, h3, h2, h1 {
110 | margin-top: 0;
111 | margin-bottom: 0.5rem;
112 | font-weight: 500;
113 | line-height: 1.2;
114 | }
115 |
116 | h1 {
117 | font-size: calc(1.375rem + 1.5vw);
118 | }
119 | @media (min-width: 1200px) {
120 | h1 {
121 | font-size: 2.5rem;
122 | }
123 | }
124 |
125 | h2 {
126 | font-size: calc(1.325rem + 0.9vw);
127 | }
128 | @media (min-width: 1200px) {
129 | h2 {
130 | font-size: 2rem;
131 | }
132 | }
133 |
134 | h3 {
135 | font-size: calc(1.3rem + 0.6vw);
136 | }
137 | @media (min-width: 1200px) {
138 | h3 {
139 | font-size: 1.75rem;
140 | }
141 | }
142 |
143 | h4 {
144 | font-size: calc(1.275rem + 0.3vw);
145 | }
146 | @media (min-width: 1200px) {
147 | h4 {
148 | font-size: 1.5rem;
149 | }
150 | }
151 |
152 | h5 {
153 | font-size: 1.25rem;
154 | }
155 |
156 | h6 {
157 | font-size: 1rem;
158 | }
159 |
160 | p {
161 | margin-top: 0;
162 | margin-bottom: 1rem;
163 | }
164 |
165 | abbr[title] {
166 | -webkit-text-decoration: underline dotted;
167 | text-decoration: underline dotted;
168 | cursor: help;
169 | -webkit-text-decoration-skip-ink: none;
170 | text-decoration-skip-ink: none;
171 | }
172 |
173 | address {
174 | margin-bottom: 1rem;
175 | font-style: normal;
176 | line-height: inherit;
177 | }
178 |
179 | ol,
180 | ul {
181 | padding-right: 2rem;
182 | }
183 |
184 | ol,
185 | ul,
186 | dl {
187 | margin-top: 0;
188 | margin-bottom: 1rem;
189 | }
190 |
191 | ol ol,
192 | ul ul,
193 | ol ul,
194 | ul ol {
195 | margin-bottom: 0;
196 | }
197 |
198 | dt {
199 | font-weight: 700;
200 | }
201 |
202 | dd {
203 | margin-bottom: 0.5rem;
204 | margin-right: 0;
205 | }
206 |
207 | blockquote {
208 | margin: 0 0 1rem;
209 | }
210 |
211 | b,
212 | strong {
213 | font-weight: bolder;
214 | }
215 |
216 | small {
217 | font-size: 0.875em;
218 | }
219 |
220 | mark {
221 | padding: 0.1875em;
222 | background-color: var(--bs-highlight-bg);
223 | }
224 |
225 | sub,
226 | sup {
227 | position: relative;
228 | font-size: 0.75em;
229 | line-height: 0;
230 | vertical-align: baseline;
231 | }
232 |
233 | sub {
234 | bottom: -0.25em;
235 | }
236 |
237 | sup {
238 | top: -0.5em;
239 | }
240 |
241 | a {
242 | color: var(--bs-link-color);
243 | text-decoration: underline;
244 | }
245 | a:hover {
246 | color: var(--bs-link-hover-color);
247 | }
248 |
249 | a:not([href]):not([class]), a:not([href]):not([class]):hover {
250 | color: inherit;
251 | text-decoration: none;
252 | }
253 |
254 | pre,
255 | code,
256 | kbd,
257 | samp {
258 | font-family: var(--bs-font-monospace);
259 | font-size: 1em;
260 | }
261 |
262 | pre {
263 | display: block;
264 | margin-top: 0;
265 | margin-bottom: 1rem;
266 | overflow: auto;
267 | font-size: 0.875em;
268 | }
269 | pre code {
270 | font-size: inherit;
271 | color: inherit;
272 | word-break: normal;
273 | }
274 |
275 | code {
276 | font-size: 0.875em;
277 | color: var(--bs-code-color);
278 | word-wrap: break-word;
279 | }
280 | a > code {
281 | color: inherit;
282 | }
283 |
284 | kbd {
285 | padding: 0.1875rem 0.375rem;
286 | font-size: 0.875em;
287 | color: var(--bs-body-bg);
288 | background-color: var(--bs-body-color);
289 | border-radius: 0.25rem;
290 | }
291 | kbd kbd {
292 | padding: 0;
293 | font-size: 1em;
294 | }
295 |
296 | figure {
297 | margin: 0 0 1rem;
298 | }
299 |
300 | img,
301 | svg {
302 | vertical-align: middle;
303 | }
304 |
305 | table {
306 | caption-side: bottom;
307 | border-collapse: collapse;
308 | }
309 |
310 | caption {
311 | padding-top: 0.5rem;
312 | padding-bottom: 0.5rem;
313 | color: #6c757d;
314 | text-align: right;
315 | }
316 |
317 | th {
318 | text-align: inherit;
319 | text-align: -webkit-match-parent;
320 | }
321 |
322 | thead,
323 | tbody,
324 | tfoot,
325 | tr,
326 | td,
327 | th {
328 | border-color: inherit;
329 | border-style: solid;
330 | border-width: 0;
331 | }
332 |
333 | label {
334 | display: inline-block;
335 | }
336 |
337 | button {
338 | border-radius: 0;
339 | }
340 |
341 | button:focus:not(:focus-visible) {
342 | outline: 0;
343 | }
344 |
345 | input,
346 | button,
347 | select,
348 | optgroup,
349 | textarea {
350 | margin: 0;
351 | font-family: inherit;
352 | font-size: inherit;
353 | line-height: inherit;
354 | }
355 |
356 | button,
357 | select {
358 | text-transform: none;
359 | }
360 |
361 | [role=button] {
362 | cursor: pointer;
363 | }
364 |
365 | select {
366 | word-wrap: normal;
367 | }
368 | select:disabled {
369 | opacity: 1;
370 | }
371 |
372 | [list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
373 | display: none !important;
374 | }
375 |
376 | button,
377 | [type=button],
378 | [type=reset],
379 | [type=submit] {
380 | -webkit-appearance: button;
381 | }
382 | button:not(:disabled),
383 | [type=button]:not(:disabled),
384 | [type=reset]:not(:disabled),
385 | [type=submit]:not(:disabled) {
386 | cursor: pointer;
387 | }
388 |
389 | ::-moz-focus-inner {
390 | padding: 0;
391 | border-style: none;
392 | }
393 |
394 | textarea {
395 | resize: vertical;
396 | }
397 |
398 | fieldset {
399 | min-width: 0;
400 | padding: 0;
401 | margin: 0;
402 | border: 0;
403 | }
404 |
405 | legend {
406 | float: right;
407 | width: 100%;
408 | padding: 0;
409 | margin-bottom: 0.5rem;
410 | font-size: calc(1.275rem + 0.3vw);
411 | line-height: inherit;
412 | }
413 | @media (min-width: 1200px) {
414 | legend {
415 | font-size: 1.5rem;
416 | }
417 | }
418 | legend + * {
419 | clear: right;
420 | }
421 |
422 | ::-webkit-datetime-edit-fields-wrapper,
423 | ::-webkit-datetime-edit-text,
424 | ::-webkit-datetime-edit-minute,
425 | ::-webkit-datetime-edit-hour-field,
426 | ::-webkit-datetime-edit-day-field,
427 | ::-webkit-datetime-edit-month-field,
428 | ::-webkit-datetime-edit-year-field {
429 | padding: 0;
430 | }
431 |
432 | ::-webkit-inner-spin-button {
433 | height: auto;
434 | }
435 |
436 | [type=search] {
437 | outline-offset: -2px;
438 | -webkit-appearance: textfield;
439 | }
440 |
441 | [type="tel"],
442 | [type="url"],
443 | [type="email"],
444 | [type="number"] {
445 | direction: ltr;
446 | }
447 | ::-webkit-search-decoration {
448 | -webkit-appearance: none;
449 | }
450 |
451 | ::-webkit-color-swatch-wrapper {
452 | padding: 0;
453 | }
454 |
455 | ::-webkit-file-upload-button {
456 | font: inherit;
457 | -webkit-appearance: button;
458 | }
459 |
460 | ::file-selector-button {
461 | font: inherit;
462 | -webkit-appearance: button;
463 | }
464 |
465 | output {
466 | display: inline-block;
467 | }
468 |
469 | iframe {
470 | border: 0;
471 | }
472 |
473 | summary {
474 | display: list-item;
475 | cursor: pointer;
476 | }
477 |
478 | progress {
479 | vertical-align: baseline;
480 | }
481 |
482 | [hidden] {
483 | display: none !important;
484 | }
485 | /*# sourceMappingURL=bootstrap-reboot.rtl.css.map */
--------------------------------------------------------------------------------
/Pasta/client/assets/dist/css/bootstrap-reboot.rtl.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Reboot v5.2.2 (https://getbootstrap.com/)
3 | * Copyright 2011-2022 The Bootstrap Authors
4 | * Copyright 2011-2022 Twitter, Inc.
5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6 | */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#0a58ca;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-right:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-right:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:underline}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:right}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:right;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:right}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}[type=email],[type=number],[type=tel],[type=url]{direction:ltr}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}
7 | /*# sourceMappingURL=bootstrap-reboot.rtl.min.css.map */
--------------------------------------------------------------------------------
/Pasta/client/assets/images/pastaman.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/Pasta/client/assets/images/pastaman.ico
--------------------------------------------------------------------------------
/Pasta/client/assets/images/pastaman.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/Pasta/client/assets/images/pastaman.jpg
--------------------------------------------------------------------------------
/Pasta/client/assets/images/penne.jfif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/Pasta/client/assets/images/penne.jfif
--------------------------------------------------------------------------------
/Pasta/client/assets/images/pennerigate.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/Pasta/client/assets/images/pennerigate.jpg
--------------------------------------------------------------------------------
/Pasta/client/assets/images/spaghetti_twirl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/Pasta/client/assets/images/spaghetti_twirl.png
--------------------------------------------------------------------------------
/Pasta/client/funk.js:
--------------------------------------------------------------------------------
1 | let primaries = document.querySelectorAll(".text-primary")
2 |
3 | for(let primary of primaries){
4 | primary.addEventListener("mouseover", () => alert("Ooh I love pasta me"))
5 | }
6 |
7 | let h1 = document.querySelector("h1");
8 | h1.innerHTML="PASTA PASTA PASTA"
9 |
10 | let dictionary = document.getElementById("pasta_dictionary");
11 | let newDictElt = document.createElement("li");
12 | dictionary.appendChild(newDictElt);
13 | newDictElt.innerHTML = "Pasta was originally made in China"
14 |
15 | let dElts = document.querySelectorAll("#pasta_dictionary > li")
16 |
17 | for(let dElt of dElts){
18 | dElt.addEventListener("click", () => dElt.classList.add("text-danger"))
19 | }
--------------------------------------------------------------------------------
/Pasta/client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Pasta Appreciation Page
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
38 |
39 |
40 |
41 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page Pasta Appreciation Page
55 |
56 |
57 |
58 |
59 |
60 | Pasta
61 | Students eat a lot of it
62 |
63 |
64 | Pasta World Records
65 | Longest Strand of Pasta
66 | The longest strand of pasta measured 3,776 m (12,388 ft 5 in) and was achieved by LAWSON INC. (Japan) at Time 24 Building, Aomi, Koto-ku, Tokyo , Japan, on 20 October 2010. The whole pasta was cooked.
67 | Sauce: This world record has been shamelessly taken from Guinness World Records on 17/10/2022
68 |
69 |
70 |
71 |
72 |
73 | On the subject of Italy
74 | Some do say that Italy isn't real. Sheeple say we are conspiracy theorists, but have you ever seen a real Italian??????
75 | Don't believe what Big Italy wants you to.
76 |
77 | Pasta Dictionary
78 |
79 |
80 | Al Dente: Translates as "to the tooth" and refers to the ideal tender but firm texture of cooked pasta.
81 | Aglio e Olio: Garlic and oil, a quick sauce often paired with spaghetti.
82 | Pesto: Meaning, literally, 'pounded' or 'crushed', this term which is synonymous with a basil-based pasta sauce describes the method used to make it.
83 | Ebollizione: Bring to a boil.
84 | more to be added
85 |
86 |
87 |
88 |
89 | Pasta Information
90 | Spaghetti, the global pasta type
91 |
92 |
93 |
94 | The notorious Spaghetti Man | Image credit: Thinkstock
95 |
96 | Spaghetti is the quintissential pasta of choice for most households, due to its cheap pricing and versatility.
97 | Spaghetti is produced in bulk and sold in individual packets, with each packet roughly serving around 4 people.
98 | 'Spaghetto' is the singular version of 'spaghetti'.
99 | What makes spaghetti so good is the ability to slurp it down like in all of those Saturday morning cartoons, where the protagonist
100 | has a plate full of spaghetti and meatballs.
101 | It is also considered sacreligious to snap the spaghetti in twain before placing it in boiling water.
102 | Plenty of popular pasta dishes use spaghetti as its base, such as carbonara and bolognese.
103 | You can click on those to find a great recipe for either of those above dishes.
104 |
105 |
106 | Spaghetti itself is exceptionally easy to make, with the dough being pushed through an extruder that turns it into long, thin
107 | strands. These strands are cut to the desired, and long, length required for it to be considered spaghetti. These can then be
108 | turned into dried nests once cut and coated, or can be cooked fresh, and take just a few minutes to boil. The dough itself can be
109 | customised to fit your flavour preferences, the most famous of which being squid ink spaghetti. This uses squid ink inside the dough
110 | to create a distinct, pitch black appearance, which is completely safe to eat.
111 |
112 | Penne: Tasty Tubes in Times of Torment
113 |
114 |
115 | Even during a pandemic, Italians have standards | Image credit: @diodeglizilla on Twitter, from here
116 |
117 |
118 | During the early wave of the COVID-19 pandemic, people around the world rushed to gather supplies, pasta being an important one,
119 | as the majority of commercially available pasta is dried, and is therefore shelf stable and lasts for a long time. Most types
120 | of pasta were flying off the shelves, except for one -- penne lisce. This is a specific type of pasta, rolled into a skewed tube
121 | shape, but was completely smooth on the outside.
122 | According to MOLD ,
123 | 'the original penne was smooth', meaning it didn't have those characteristic ridges on the outside. These ridges were invented
124 | at a later point, since they would 'capture' the sauce, allowing for every bite of a pasta dish to have the sauce within,
125 | so you would never get a piece of pasta with no sauce or flavour.
126 |
127 |
128 | Penne is another common type of pasta, used commonly when spaghetti is not available. Modern cooks and chefs have used penne
129 | pasta in a new trend, known as pasta chips. Michelin star chef and TikTok famous Poppy O'Toole
130 | created these on an Instagram Live, and this contributed to a wealth of trendy social media posts as every food content creator wanted
131 | to try their hand at this curious culinary creation.
132 |
133 | Dynamic Pasta Recipes
134 |
135 | Click on one of the recipes for more details
136 |
137 |
138 |
139 |
140 | Add a new recipe
141 |
146 |
147 |
148 |
149 |
Created in part by the Bootstrap team · © 2022 | Back to top
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
--------------------------------------------------------------------------------
/Pasta/client/recipe_search.js:
--------------------------------------------------------------------------------
1 | const endpointRoot = 'http://127.0.0.1:8090/';
2 |
3 | async function listRecipes () {
4 | const recipeResponse = await fetch(endpointRoot + 'recipes');
5 | const recipeKeysText = await recipeResponse.text();
6 | const recipeKeys = JSON.parse(recipeKeysText);
7 | const recipeListElt = document.getElementById('recipeList');
8 | let list = '';
9 | for (const recipeKey of recipeKeys) {
10 | list += `
${recipeKey} `;
11 | }
12 | recipeListElt.innerHTML = list;
13 | const listItems = document.querySelectorAll('.recipe_list_item');
14 | for (const listItem of listItems) {
15 | listItem.addEventListener('click', (event) => loadRecipe(event.target.textContent));
16 | }
17 | }
18 |
19 | async function loadRecipe (recipeKey) {
20 | const recipeResponse = await fetch(`http://127.0.0.1:8090/recipe/${recipeKey}`);
21 | const recipeContent = await recipeResponse.text();
22 | document.getElementById('recipe_results').innerHTML = recipeContent;
23 | }
24 |
25 | async function addRecipes () {
26 | const recipeForm = document.getElementById('recipe-submit');
27 | recipeForm.addEventListener('submit', async function (event) {
28 | event.preventDefault();
29 | // eslint-disable-next-line no-undef
30 | const data = new FormData(recipeForm);
31 | /* conversion from FormData to JSON at https://stackoverflow.com/questions/41431322/how-to-convert-formdata-html5-object-to-json */
32 | const dataJSON = JSON.stringify(Object.fromEntries(data));
33 | // eslint-disable-next-line no-unused-vars
34 | const response = await fetch(endpointRoot + 'recipe/new',
35 | {
36 | method: 'POST',
37 | headers: {
38 | 'Content-Type': 'application/json'
39 | },
40 | body: dataJSON
41 | });
42 | listRecipes();
43 | recipeForm.reset();
44 | });
45 | }
46 |
47 | document.addEventListener('DOMContentLoaded', listRecipes);
48 | document.addEventListener('DOMContentLoaded', addRecipes);
49 |
--------------------------------------------------------------------------------
/Pasta/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "pasta",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "funk.js",
6 | "scripts": {
7 | "pretest": "eslint server.js",
8 | "start": "nodemon server.js",
9 | "test": "jest"
10 | },
11 | "author": "",
12 | "license": "ISC",
13 | "dependencies": {
14 | "express": "^4.18.2"
15 | },
16 | "devDependencies": {
17 | "eslint": "^8.29.0",
18 | "eslint-config-standard": "^17.0.0",
19 | "eslint-plugin-import": "^2.26.0",
20 | "eslint-plugin-n": "^15.6.0",
21 | "eslint-plugin-promise": "^6.1.1",
22 | "nodemon": "^2.0.20",
23 | "supertest": "^6.3.2"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Pasta/recipes.json:
--------------------------------------------------------------------------------
1 | {"carbonara":"Creamy sauce cheese good with penne","bolognese":"Meaty tomato good with spaghetti","santa":"Mix holly, cranberries and carrots for an unresonably long time and dress in ridiculous clothes"}
--------------------------------------------------------------------------------
/Pasta/server.js:
--------------------------------------------------------------------------------
1 |
2 | const app = require('./app.js');
3 |
4 | const hostname = '127.0.0.1';
5 | const port = 8090;
6 |
7 | app.listen(port, hostname, () => {
8 | console.log(`Server running at http://${hostname}:${port}/ -- yippee!`);
9 | });
10 |
--------------------------------------------------------------------------------
/README.txt:
--------------------------------------------------------------------------------
1 | Pasta pasta pasta
2 |
3 | Issue Etiquette:
4 | - Name the title as something descriptive (so it can be understood at a glance)
5 | - Remove least descriptive duplicates first then keep oldest issue
6 | - Read issues before adding new one to avoid duplicate issues
7 |
--------------------------------------------------------------------------------
/assets/images/pastaman.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/assets/images/pastaman.ico
--------------------------------------------------------------------------------
/assets/images/pastaman.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/assets/images/pastaman.jpg
--------------------------------------------------------------------------------
/assets/images/penne.jfif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/assets/images/penne.jfif
--------------------------------------------------------------------------------
/assets/images/pennerigate.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/assets/images/pennerigate.jpg
--------------------------------------------------------------------------------
/assignment_1/FAQ.md:
--------------------------------------------------------------------------------
1 |
2 | # COMP1101 Programming (Black) Summative Assessment 1 FAQs
3 |
4 | ## General
5 |
6 | ### Can I use code from elsewhere and how should I reference it?
7 |
8 | Using pre-existing code modules on the server side is recommended. As long as it is installed properly with npm so that the dependency is included in your package.json file you don't need to do anything else.
9 |
10 | If you re-use, adapt or modify code taken from other sources (e.g. StackOverflow) then put a comment in your code pointing to the URL of the source.
11 |
12 | ### What about using copyrighted content?
13 |
14 | Work legally. Make sure you follow the terms of the license i.e. provide attribution if required. There are some [exceptions to copyright](https://www.gov.uk/guidance/exceptions-to-copyright) but you might want to share your work publicly (after the June exam board) so be careful not to assume everything is for private study. There is plenty of material out there that you are allowed to use.
15 |
16 | ## Client-side functionality criteria
17 |
18 | ### Do we need an authentication aspect, like username and password?
19 |
20 | Not recommended: if you are going to do authentication you should do it properly, and it's very unlikely that you could write something yourself that would be robust. My usual advice would be to use an external authentication service (e.g. through firebase), but that requires have tokens etc embedded into your code. Sharing that with others would most likely be outside the terms and conditions of its use. So if you want to do authentication, just include a function to authenticate, which maybe pops up an alert saying 'this page is private' or something like that.
21 |
22 | ### Are there marks for complexity?
23 |
24 | Yes, but only up to what is requested in the brief. So, for example, if you provide more than three entities you don't gain marks, but you will lose marks if you have fewer than two entities.
25 |
26 | ### Should we use CDNs for things like bootstrap?
27 |
28 | You can but you don't have to. It will not affect your marks, only your download time (positively) and offline access (negatively).
29 |
30 | ### What is the best way to attach event listeners to multiple buttons?
31 |
32 | Use a class if buttons doing the same action on different things: use the event parameter in the event handler to extract the object. If the actions are all different then add by hand with ids. Do it after DOM is loaded to make sure that all the elements exist, possibly by using `defer` attribute on your [script tag](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script).
33 |
34 | ## Client-side quality criteria
35 |
36 | ### Can I use react to build the web-site?
37 |
38 | Not recommended: peer reviewers probably don't know what this is, and so may find it difficult to assess the quality of your solution.
39 |
40 | ### Can I use jQuery to build the web-site?
41 |
42 | Not recommended: in years gone by jQuery was essential to make things like event handling and AJAX work across browsers. However these days modern browsers offer things like the Fetch API which handle this. Internet Explorer support is not the issue it once was, because it now has such a small market share, and polyfills are available to make it look like it has Fetch. Some systems still do use jQuery (e.g. Bootstrap 4) but many have removed it as a requirement (e.g. Bootstrap 5) so I wouldn't recommend it for a new project.
43 |
44 | ### Will I get marked on documentation of the client-side code?
45 |
46 | No
47 |
48 | ### What do you mean by 'gracefully handles server disconnection'
49 |
50 | Basically your client-side code should do something sensible if the connection to the server goes down (as it might do if it were connected via the internet). It should display an informative message to the user, and maybe try again later. You can test this by stopping the server and trying to interact with it through the client. Once the server is started up again the client should be able to carry on as before. So follow the sequence: start server, load page, stop server, get helpful message, restart server, works again (without reloading page).
51 |
52 | ### Is it possible to use TypeScript or should we just stick with normal JavaScript?
53 |
54 | TypeScript needs transpilation tools to be installed and uses different code quality rules so for this assignment you should stick with plain JavaScript - you are free to do what you want in the second assignment.
55 |
56 | ### Do Alt tags added by users need to be unique?
57 |
58 | No
59 |
60 | ### Does it have to be in British English?
61 |
62 | No
63 |
64 | ## Server-side functionality criteria
65 |
66 | ### Are we allowed to include additional modules via NPM that provide additional functionality?
67 |
68 | Yes this is definitely a good idea, as it makes the code easier to read, more robust and more maintainable. Bear in mind that some frameworks (e.g. react) that are installed via npm essentially use a different language, so are difficult to read for non-experts. They are best avoided.
69 |
70 | ### How are we advised to save the data, i.e using database?
71 |
72 | If this were for real then a database of some kind would be the best way to store data. However, databases are not part of this course. My recommendation would be to write functions for saving the state, which just write to file a JSON string representing the state. This would not work with multiple users but would be enough for simple testing.
73 |
74 | ### How to store entities? Two different files?
75 |
76 | Not necessarily, one is fine, as long as it contains all of the relevant details and relationships.
77 |
78 | ### What do you mean by an 'entity type'?
79 |
80 | If this were object oriented programming they would be referred to classes. It is a 'type' or 'kind' of thing. The different entity types will have different information stored for them. If your app is about poets and their poems then you would have two entitity types: 'poet' and 'poem'. For each poet you might want to store their id, name(s), date of birth, url of image. For each poem you might want to store an id, the title, date of writing, and the text. The relationships between the entities would be of the form poet1 authored poem2. Exactly how you store the information about the relationship is up to you: you could store the author id with the poem, or store a list of poems ids with the author, or have a separate store relating the two. In either case, when you get the details of an entity you should include everything, including the relationships.
81 |
82 | ### Do we need to set up the http server so it's not on the localhost?
83 |
84 | No, although you might like to do that after the June exam board if you would like other people to use your app.
85 |
86 | ### Do GET/POST have to be exactly what it says?
87 |
88 | They should: list (GET), details of one (GET), add one (POST). If not sure, ask me.
89 |
90 | ## Server-side quality criteria
91 |
92 | ### Is the testing solely on the server.js file or on the other js files the website uses also
93 |
94 | You only need to test the server side javascript: client-side testing is a whole different can of worms.
95 |
96 | ### Does automatic testing have to test every component?
97 |
98 | Yes, to get full marks you need to have detailed testing of every GET and POST method you write. You can get some marks by partial testing.
99 |
100 | ### How do you test if it works on another machine?
101 |
102 | The main reasons for it not to work on another machine are if you use absolute paths, or use a back (Windows) or forward (Mac/Linx) to separate directories in the path. `__dirname__` is your friend, and use [path.sep](https://nodejs.org/api/path.html#pathsep) and [path.join](https://nodejs.org/api/path.html#pathjoinpaths). You can always use a CIS lab machine to test whether it works on another machine. Many are dual-boot so you can try out Windows and Linux.
103 |
104 | ### Are we allowed to use an API documentation generator like Postman or must we create our own documentation from scratch?
105 |
106 | Yes, if you have a good tool for API generation such as
that would be fine, and a good idea.
107 |
108 | ### Will adding comments to the API be sufficient for API documentation, or would it be preferable to use something like postman or 'https://www.npmjs.com/package/node-api-doc-generator' (an npm package)?
109 |
110 | You should not have to read the code to see the API documentation. You could write it in HTML by hand, or you could use a tool to do that. The postman tool looks good and well maintained, but the npm tool looks less good: not updated in a long time, virtually no history of maintenance.
111 |
112 | ### What do we need in the API documentation?
113 |
114 | For the API documentation the ideal is something like the documentation of the [Twitter API](https://developer.twitter.com/en/docs/api-reference-index) which lists the methods in the API and then provides the [details for each method](https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/get-statuses-retweets-id) including details of parameters and response.
115 |
116 | ### How should we configure the ESLint file?
117 |
118 |
119 | Unless you have a good reason to do otherwise you should use this
120 |
121 | ```
122 | module.exports = {
123 | "extends": "standard",
124 | "rules": {
125 | "semi": [2, "always"],
126 | "indent": "off"
127 | }
128 | };
129 | ```
130 |
131 | But if you are using something else reasonable that is fine, as long as you include the relevant .eslintrc and it doesn’t require a whole load of work to set up.
132 |
133 | ## Video Presentation
134 |
135 | ### You mentioned that for every 10 seconds after 2 minutes we will be losing 10% of our marks, does this apply if our video is anywhere from 2 mins 1s to 2 mins 9 seconds long ?
136 |
137 | Yes, basically it’s 1% per second.
138 |
139 | ### What information are we supposed to include in the video?
140 |
141 | The video only needs to cover the points that are not peer assessed. Treat it as a sales pitch for the criteria listed under client-side functionality and server-side functionality. You don't need to show every single thing that your site does, just show how it meets the requirements. So things like HTML validation, automated testing and the API documentation do not need to be covered. It is difficult to keep videos anonymous, so your peer assessors will not see the video.
142 |
143 | ### What software should we use to record the presentation, and where could we find it?
144 |
145 | The university provides panopto (which is used for sharing lecture recordings) for recording and simple editing and gives some [instructions for use](https://www.dur.ac.uk/encore/howtouseencore/desktop/). Freely available desktop tools include [OBS Studio](https://obsproject.com/) and [daVinci Resolve](https://www.blackmagicdesign.com/products/davinciresolve/) for recording and editing, which are both powerful but have more of a learning curve. MacOS provides QuickTime player and iMovie for recording and editing. TechRadar have a [list of screen recorder software](https://www.techradar.com/uk/news/the-best-free-screen-recorder) for other alternatives.
146 |
--------------------------------------------------------------------------------
/assignment_1/FAQ.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/assignment_1/FAQ.pdf
--------------------------------------------------------------------------------
/assignment_1/PITCHME.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
PITCHME
7 |
8 |
9 |
10 |
11 |
12 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
39 | COMP1101 Programming (Black)
40 | Summative Assessment 1
41 |
42 |
43 |
44 | Term 1 Programming Exercise Outline
45 |
46 | Submission of code and video by 14:00 26 January 2023
47 | Submission of peer reviews by 14:00 9 February 2023
48 | Return by 23 February 2023
49 | Contributes 50% of module marks
50 | Includes peer review feedback which you will be allocated
51 | This is an individual piece of work
52 |
53 |
54 |
55 |
56 | Subject-specific Knowledge
57 |
58 | Interaction between JavaScript programs and the Document Object
59 | Model (DOM)
60 | Using control statements to loop and make decisions
61 | An understanding of the nature of imperative programming in the
62 | object-oriented style
63 | A knowledge and understanding of good programming practice (for
64 | example, reuse, documentation and style)
65 |
66 |
67 |
68 |
69 |
70 | Building collections of data within a program and using JavaScript
71 | Object Notation (JSON)
72 | Making programs robust through the use of exceptions and exception
73 | handling
74 | A knowledge and understanding of good programming practice (for
75 | example, reuse, documentation and style)
76 |
77 |
78 |
79 |
80 | Subject-Specific Skills
81 |
82 | an ability to realise solutions to problems as working JavaScript
83 | programs
84 | an ability to apply reuse by exploiting predefined components
85 | an ability to use software tools related to programming (programming
86 | environments, code management, documentation tools, etc.)
87 |
88 |
89 |
90 |
91 | Key Skills
92 |
93 | an ability to communicate technical information
94 | an ability to recognise and apply the principles of abstraction and
95 | modelling
96 |
97 |
98 |
99 | Task summary
100 |
101 | Construct a dynamic web site for an application of your
102 | choosing
103 | Use static HTML pages loading dynamic JSON content from server via
104 | AJAX
105 | Server written in nodejs to provide JSON through REST API
106 | Prepare a 2 minute video demonstrating your code
107 | Do a code quality review of four other submissions
108 |
109 |
110 |
111 |
112 | Dynamic web site
113 |
114 | Choose any application domain as long as it includes at least two
115 | kinds of entity e.g.
116 |
117 | pictures
118 | people
119 | places
120 | events
121 | comments
122 |
123 | Could be e.g. club, social, health, gallery
124 | If you are not sure then ask me
125 |
126 |
127 |
128 |
129 | Static HTML loading JSON via
130 | AJAX
131 |
132 | ‘Single page app’: page content loaded as JSON via AJAX
133 | Can have more than one page e.g. for user and admin
134 | Should provide clean and simple User Experience (UX)
135 | Should be responsive i.e. work well on desktop and mobile
136 | Recommend using front-end framework such as Bootstrap,
137 | Foundation
138 |
139 |
140 |
141 |
142 | Message sequence chart
143 |
144 |
147 | Message Sequence Chart showing Client
148 | server interaction with AJAX
149 |
150 |
151 |
152 |
153 | Server provides JSON
154 | through a REST API
155 | Each entity type (e.g. picture) has
156 |
157 | GET method to list/search (returns a list of ids and names)
158 | GET method for individual details (includes details of related
159 | entities)
160 | POST method to add new entity
161 | Document your API in the style of the Twitter
163 | API
164 |
165 |
166 |
167 |
168 |
169 | Response provided as JSON
170 | Content-type needs to be correct
171 | HTTP codes should be correct: use 200, 400 or 403 (if using
172 | authentication)
173 |
174 |
175 |
176 |
177 | Server written in nodejs
178 |
179 | Use npm for management
180 | Make sure you use –save or –save-dev option with packages you
181 | add
182 | Write jest test cases: run with npm test
183 | Use eslint: run with npm run pretest
184 | Recommend using express
185 |
186 |
187 |
188 | Submission
189 | Source code (all zipped)
190 |
191 | HTML and CSS and any media
192 | Client and server side JavaScript
193 | package.json including test and pretest scripts
194 | .eslintrc
195 | jest test cases e.g. app.test.js
196 | documentation of API
197 | demonstration video
198 |
199 | Should not include node_modules
in submission
200 |
201 |
202 | Assessment Criteria
203 | Equally weighted 9% each
204 |
205 | Client-side functionality
206 | Client-side quality
207 | Server-side functionality
208 | Server-side quality
209 | Video presentation
210 |
211 |
212 |
213 |
214 | Client-side functionality
215 | criteria
216 |
217 | User Experience (UX): clean layout and minimal clicks/entry
218 | required
219 | App complexity: entities can be listed and edited
220 | ‘Single page’ style: asynchronous updates
221 | Staff reviewed
222 |
223 |
224 |
225 |
226 | Client-side quality criteria
227 |
228 | Standards compliant (HTML5)
229 | Responsive to different viewport sizes
230 | Gracefully handles server disconnection
231 |
232 | useful error messages
233 | recommences on server restart
234 |
235 | Peer reviewed; staff moderated
236 |
237 |
238 |
239 |
240 | Server-side functionality
241 | criteria
242 |
243 | More than one entity type, with relationships
244 | REST API provides each entity with appropriate GET/POST methods
245 | Installs with npm install
246 | Starts with npm start
247 | Staff reviewed
248 |
249 |
250 |
251 |
252 | Server-side quality criteria
253 |
254 | Successful eslint (run with npm run pretest
)
255 | Successful jest tests with good coverage (run with
256 | npm test
)
257 | Testing includes content-type and HTTP code
258 | Completeness of API documentation
259 | Peer reviewed; staff moderated
260 |
261 |
262 |
263 | Video Presentation
264 |
265 | Submit a 2 minute (max) video demonstrating your software
266 | Include demonstration of how to start the program
267 | All functionality will be assessed by what is demonstrated in the
268 | video
269 | If it is not demonstrated in the video, you will not get a mark for
270 | it
271 | Quality of video presentation will be marked separately from
272 | functionality:
273 |
274 | Structure; Visual Presentation; Audio explanation
275 |
276 | Lose 10% of marks for every 10 seconds over 2 minutes
277 | Staff reviewed
278 |
279 |
280 |
281 | Peer Review Marking
282 | 5% of the module marks are awarded for peer assessment
283 |
284 | 2 marks for completion of four peer reviews
285 | 3 marks for the accuracy of the reviews
286 | Accuracy is based on agreement with peers
287 | Accuracy marks deducted for being over-harsh and over-generous
288 | The average student tends to get about 65%
289 | 65% is on the good/very good boundary of the marking
291 | conventions p15
292 |
293 |
294 |
295 | How to do the assignment
296 |
297 | Design HTML
298 | Design web service
299 | Join with Fetch
300 | Read the FAQ
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
466 |
467 |
468 |
--------------------------------------------------------------------------------
/assignment_1/PITCHME.md:
--------------------------------------------------------------------------------
1 | # COMP1101 Programming (Black) Summative Assessment 1 {data-background-color=#7E317B}
2 |
3 | ---
4 |
5 | ## Term 1 Programming Exercise Outline
6 |
7 | - Submission of code and video by 14:00 26 January 2023
8 | - Submission of peer reviews by 14:00 9 February 2023
9 | - Return by 23 February 2023
10 | - Contributes 50% of module marks
11 | - Includes peer review feedback which you will be allocated
12 | - This is an individual piece of work
13 |
14 | ---
15 |
16 | ### Subject-specific Knowledge
17 |
18 | - Interaction between JavaScript programs and the Document Object Model (DOM)
19 | - Using control statements to loop and make decisions
20 | - An understanding of the nature of imperative programming in the object-oriented style
21 | - A knowledge and understanding of good programming practice (for example, reuse, documentation and style)
22 |
23 | ---
24 |
25 | - Building collections of data within a program and using JavaScript Object Notation (JSON)
26 | - Making programs robust through the use of exceptions and exception handling
27 | - A knowledge and understanding of good programming practice (for example, reuse, documentation and style)
28 |
29 | ---
30 |
31 | ### Subject-Specific Skills
32 |
33 | - an ability to realise solutions to problems as working JavaScript programs
34 | - an ability to apply reuse by exploiting predefined components
35 | - an ability to use software tools related to programming (programming environments, code management, documentation tools, etc.)
36 |
37 | ---
38 |
39 | ### Key Skills
40 |
41 | - an ability to communicate technical information
42 | - an ability to recognise and apply the principles of abstraction and modelling
43 |
44 | ---
45 |
46 |
47 | ## Task summary
48 |
49 | - Construct a dynamic web site for an application of your choosing
50 | - Use static HTML pages loading dynamic JSON content from server via AJAX
51 | - Server written in nodejs to provide JSON through REST API
52 | - Prepare a 2 minute video demonstrating your code
53 | - Do a code quality review of four other submissions
54 |
55 | ---
56 |
57 | ### Dynamic web site
58 |
59 | - Choose any application domain as long as it includes at least two kinds of entity e.g.
60 | - pictures
61 | - people
62 | - places
63 | - events
64 | - comments
65 | - Could be e.g. club, social, health, gallery
66 | - If you are not sure then ask me
67 |
68 | ---
69 |
70 | ### Static HTML loading JSON via AJAX
71 |
72 | - 'Single page app': page content loaded as JSON via AJAX
73 | - Can have more than one page e.g. for user and admin
74 | - Should provide clean and simple User Experience (UX)
75 | - Should be responsive i.e. work well on desktop and mobile
76 | - Recommend using front-end framework such as Bootstrap, Foundation
77 |
78 | ---
79 |
80 | #### Message sequence chart
81 |
82 | 
83 |
84 | ---
85 |
86 | ### Server provides JSON through a REST API
87 |
88 | Each entity type (e.g. picture) has
89 |
90 | - GET method to list/search (returns a list of ids and names)
91 | - GET method for individual details (includes details of related entities)
92 | - POST method to add new entity
93 | - Document your API in the style of the [Twitter API](https://developer.twitter.com/en/docs/twitter-api/api-reference-index)
94 |
95 | ---
96 |
97 | - Response provided as JSON
98 | - Content-type needs to be correct
99 | - HTTP codes should be correct: use 200, 400 or 403 (if using authentication)
100 |
101 | ---
102 |
103 | ### Server written in nodejs
104 |
105 | - Use npm for management
106 | - Make sure you use --save or --save-dev option with packages you add
107 | - Write jest test cases: run with `npm test`
108 | - Use eslint: run with `npm run pretest`
109 | - Recommend using express
110 |
111 | ---
112 |
113 | ## Submission
114 |
115 | Source code (all zipped)
116 |
117 | - HTML and CSS and any media
118 | - Client and server side JavaScript
119 | - package.json including test and pretest scripts
120 | - .eslintrc
121 | - jest test cases e.g. app.test.js
122 | - documentation of API
123 | - demonstration video
124 |
125 | Should not include `node_modules` in submission
126 |
127 | ---
128 |
129 | ## Assessment Criteria
130 |
131 | Equally weighted 9% each
132 |
133 | - Client-side functionality
134 | - Client-side quality
135 | - Server-side functionality
136 | - Server-side quality
137 | - Video presentation
138 |
139 | ---
140 |
141 | ### Client-side functionality criteria
142 |
143 | - User Experience (UX): clean layout and minimal clicks/entry required
144 | - App complexity: entities can be listed and edited
145 | - 'Single page' style: asynchronous updates
146 | - Staff reviewed
147 |
148 | ---
149 |
150 | ### Client-side quality criteria
151 |
152 | - Standards compliant (HTML5)
153 | - Responsive to different viewport sizes
154 | - Gracefully handles server disconnection
155 | - useful error messages
156 | - recommences on server restart
157 | - Peer reviewed; staff moderated
158 |
159 | ---
160 |
161 | ### Server-side functionality criteria
162 |
163 | - More than one entity type, with relationships
164 | - REST API provides each entity with appropriate GET/POST methods
165 | - Installs with `npm install`
166 | - Starts with `npm start`
167 | - Staff reviewed
168 |
169 | ---
170 |
171 | ### Server-side quality criteria
172 |
173 | - Successful eslint (run with `npm run pretest`)
174 | - Successful jest tests with good coverage (run with `npm test`)
175 | - Testing includes content-type and HTTP code
176 | - Completeness of API documentation
177 | - Peer reviewed; staff moderated
178 |
179 | ---
180 |
181 | ## Video Presentation
182 |
183 | - Submit a 2 minute (max) video demonstrating your software
184 | - Include demonstration of how to start the program
185 | - All functionality will be assessed by what is demonstrated in the video
186 | - If it is not demonstrated in the video, you will not get a mark for it
187 | - Quality of video presentation will be marked separately from functionality:
188 | - Structure; Visual Presentation; Audio explanation
189 | - Lose 10% of marks for every 10 seconds over 2 minutes
190 | - Staff reviewed
191 |
192 | ---
193 |
194 | ## Peer Review Marking
195 |
196 | 5% of the module marks are awarded for peer assessment
197 |
198 | * 2 marks for completion of four peer reviews
199 | * 3 marks for the accuracy of the reviews
200 | * Accuracy is based on agreement with peers
201 | * Accuracy marks deducted for being over-harsh and over-generous
202 | * The average student tends to get about 65%
203 | * 65% is on the good/very good boundary of the [marking conventions](https://www.dur.ac.uk/resources/university.calendar/volumeii/2022.2023/coreregsug.pdf) p15
204 |
205 | ---
206 |
207 | ## How to do the assignment
208 |
209 | - Design HTML
210 | - Design web service
211 | - Join with Fetch
212 | - Read the [FAQ](FAQ.md)
213 |
--------------------------------------------------------------------------------
/assignment_1/PITCHME.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/assignment_1/PITCHME.pdf
--------------------------------------------------------------------------------
/assignment_1/README.md:
--------------------------------------------------------------------------------
1 | # COMP1101 Programming (Black) Summative Assessment 1
2 |
3 |
4 | ## Term 1 Programming Exercise Outline
5 |
6 | - Submission of code and video by 14:00 26 January 2023
7 | - Submission of peer reviews by 14:00 9 February 2023
8 | - Return by 23 February 2023
9 | - Contributes 50% of module marks
10 | - Includes peer review feedback which you will be allocated
11 | - This is an individual piece of work
12 |
13 |
14 | ### Subject-specific Knowledge
15 |
16 | - Interaction between JavaScript programs and the Document Object Model (DOM)
17 | - Using control statements to loop and make decisions
18 | - An understanding of the nature of imperative programming in the object-oriented style
19 | - A knowledge and understanding of good programming practice (for example, reuse, documentation and style)
20 |
21 |
22 | - Building collections of data within a program and using JavaScript Object Notation (JSON)
23 | - Making programs robust through the use of exceptions and exception handling
24 | - A knowledge and understanding of good programming practice (for example, reuse, documentation and style)
25 |
26 |
27 | ### Subject-Specific Skills
28 |
29 | - an ability to realise solutions to problems as working JavaScript programs
30 | - an ability to apply reuse by exploiting predefined components
31 | - an ability to use software tools related to programming (programming environments, code management, documentation tools, etc.)
32 |
33 |
34 | ### Key Skills
35 |
36 | - an ability to communicate technical information
37 | - an ability to recognise and apply the principles of abstraction and modelling
38 |
39 |
40 |
41 | ## Task summary
42 |
43 | - Construct a dynamic web site for an application of your choosing
44 | - Use static HTML pages loading dynamic JSON content from server via AJAX
45 | - Server written in nodejs to provide JSON through REST API
46 | - Prepare a 2 minute video demonstrating your code
47 | - Do a code quality review of four other submissions
48 |
49 |
50 | ### Dynamic web site
51 |
52 | - Choose any application domain as long as it includes at least two kinds of entity e.g.
53 | - pictures
54 | - people
55 | - places
56 | - events
57 | - comments
58 | - Could be e.g. club, social, health, gallery
59 | - If you are not sure then ask me
60 |
61 |
62 | ### Static HTML loading JSON via AJAX
63 |
64 | - 'Single page app': page content loaded as JSON via AJAX
65 | - Can have more than one page e.g. for user and admin
66 | - Should provide clean and simple User Experience (UX)
67 | - Should be responsive i.e. work well on desktop and mobile
68 | - Recommend using front-end framework such as Bootstrap, Foundation
69 |
70 |
71 | #### Message sequence chart
72 |
73 | 
74 |
75 |
76 | ### Server provides JSON through a REST API
77 |
78 | Each entity type (e.g. picture) has
79 |
80 | - GET method to list/search (returns a list of ids and names)
81 | - GET method for individual details (includes details of related entities)
82 | - POST method to add new entity
83 | - Document your API in the style of the [Twitter API](https://developer.twitter.com/en/docs/twitter-api/api-reference-index)
84 |
85 |
86 | - Response provided as JSON
87 | - Content-type needs to be correct
88 | - HTTP codes should be correct: use 200, 400 or 403 (if using authentication)
89 |
90 |
91 | ### Server written in nodejs
92 |
93 | - Use npm for management
94 | - Make sure you use --save or --save-dev option with packages you add
95 | - Write jest test cases: run with `npm test`
96 | - Use eslint: run with `npm run pretest`
97 | - Recommend using express
98 |
99 |
100 | ## Submission
101 |
102 | Source code (all zipped)
103 |
104 | - HTML and CSS and any media
105 | - Client and server side JavaScript
106 | - package.json including test and pretest scripts
107 | - .eslintrc
108 | - jest test cases e.g. app.test.js
109 | - documentation of API
110 | - demonstration video
111 |
112 | Should not include `node_modules` in submission
113 |
114 |
115 | ## Assessment Criteria
116 |
117 | Equally weighted 9% each
118 |
119 | - Client-side functionality
120 | - Client-side quality
121 | - Server-side functionality
122 | - Server-side quality
123 | - Video presentation
124 |
125 |
126 | ### Client-side functionality criteria
127 |
128 | - User Experience (UX): clean layout and minimal clicks/entry required
129 | - App complexity: entities can be listed and edited
130 | - 'Single page' style: asynchronous updates
131 | - Staff reviewed
132 |
133 |
134 | ### Client-side quality criteria
135 |
136 | - Standards compliant (HTML5)
137 | - Responsive to different viewport sizes
138 | - Gracefully handles server disconnection
139 | - useful error messages
140 | - recommences on server restart
141 | - Peer reviewed; staff moderated
142 |
143 |
144 | ### Server-side functionality criteria
145 |
146 | - More than one entity type, with relationships
147 | - REST API provides each entity with appropriate GET/POST methods
148 | - Installs with `npm install`
149 | - Starts with `npm start`
150 | - Staff reviewed
151 |
152 |
153 | ### Server-side quality criteria
154 |
155 | - Successful eslint (run with `npm run pretest`)
156 | - Successful jest tests with good coverage (run with `npm test`)
157 | - Testing includes content-type and HTTP code
158 | - Completeness of API documentation
159 | - Peer reviewed; staff moderated
160 |
161 |
162 | ## Video Presentation
163 |
164 | - Submit a 2 minute (max) video demonstrating your software
165 | - Include demonstration of how to start the program
166 | - All functionality will be assessed by what is demonstrated in the video
167 | - If it is not demonstrated in the video, you will not get a mark for it
168 | - Quality of video presentation will be marked separately from functionality:
169 | - Structure; Visual Presentation; Audio explanation
170 | - Lose 10% of marks for every 10 seconds over 2 minutes
171 | - Staff reviewed
172 |
173 |
174 | ## Peer Review Marking
175 |
176 | 5% of the module marks are awarded for peer assessment
177 |
178 | * 2 marks for completion of four peer reviews
179 | * 3 marks for the accuracy of the reviews
180 | * Accuracy is based on agreement with peers
181 | * Accuracy marks deducted for being over-harsh and over-generous
182 | * The average student tends to get about 65%
183 | * 65% is on the good/very good boundary of the [marking conventions](https://www.dur.ac.uk/resources/university.calendar/volumeii/2022.2023/coreregsug.pdf) p15
184 |
185 |
186 | ## How to do the assignment
187 |
188 | - Design HTML
189 | - Design web service
190 | - Join with Fetch
191 | - Read the [FAQ](FAQ.md)
192 |
--------------------------------------------------------------------------------
/assignment_1/README.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/assignment_1/README.pdf
--------------------------------------------------------------------------------
/assignment_1/build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | sed '/^---/ d' PITCHME.md | sed '/^@/ d' | sed '/^:::/ d' | sed 's/{.*}//' > README.md
3 |
4 | PATHEND=$(pwd | rev | cut -d'/' -f-2 | rev)
5 |
6 | pandoc -V theme=simple -t revealjs -s PITCHME.md -o PITCHME.html
7 | pandoc -V fontfamily:ClearSans -V fontfamilyoptions:sfdefault README.md -o README.pdf
8 | pandoc -V fontfamily:ClearSans -V fontfamilyoptions:sfdefault FAQ.md -o FAQ.pdf
9 |
10 | git add .
11 | git commit -m "Working on presentation $PATHEND"
12 | git push -u origin main
13 |
14 |
--------------------------------------------------------------------------------
/assignment_2/PITCHME.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
PITCHME
7 |
8 |
9 |
10 |
11 |
12 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | COMP1101 Programming (Black) Summative Assessment 2
30 |
31 |
32 |
33 | Term 2 Programming Exercise Outline
34 |
35 | Submission by 14:00 27 April 2023
36 | Return after end of exam period
37 | Contributes 50% of module marks
38 |
39 |
40 |
41 |
42 | Subject-specific Knowledge
43 |
44 | A knowledge and understanding of good programming practice (for example, reuse, documentation and style)
45 |
46 |
47 |
48 |
49 | Subject-Specific Skills
50 |
51 | an ability to apply reuse by exploiting predefined components
52 | an ability to use software tools related to programming (programming environments, code management, documentation tools, etc.)
53 | an ability to apply software development tools and skills in real-world scenarios e.g. open-source projects, hackathons, competitions
54 |
55 |
56 |
57 |
58 | Key Skills
59 |
60 | an ability to communicate technical information
61 | an ability to plan and work independently
62 |
63 |
64 |
65 | Task summary
66 |
67 | Choose a skill to develop
68 | Choose a collaborative project to contribute to e.g.
69 |
70 | Open-Source Software
71 | hackathon
72 | (collaborative) competition
73 |
74 | Record your progress in git with a reflective learning log
75 | Write a guide for other learners
76 |
77 |
78 |
79 | Skills to develop
80 |
81 | These are examples only
82 | JavaScript or non-JavaScript
83 |
84 |
85 |
86 |
87 | JavaScript Skills
88 |
99 |
100 |
101 |
102 | Non-JavaScript Skills
103 |
111 |
112 |
113 | Collaborative project ideas
114 |
115 |
116 |
117 | Contribute to Open Source Software
118 |
130 |
131 |
132 |
133 |
134 | For example
135 |
136 |
137 | Review/ translate docs and help
138 | Issue gardening (remove duplicates)
139 | Answer questions on forums e.g. StackOverflow
140 | Make a video of installation process
141 |
142 |
143 |
144 |
149 |
150 |
151 | Or do your own thing
152 |
153 | Start a new project
154 | As long as it is collaborative
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 | # Requirements and Assessment Criteria
163 |
164 |
165 |
166 | Learning log
167 |
168 | Make at least four separate entries reasonably spaced over a period of at least six weeks
169 | The entries can either be separate files or different sections within the same file.
170 | They should be written using Markdown and stored in a private repository on GitHub.
171 | You need to commit and push each entry as you make it so that the dates of the entries are correctly recorded in git.
172 | You can include images and external links.
173 |
174 |
175 |
176 |
177 | For each entry identify
178 |
179 | What you have done (to learn your skill and contribute to your project)
180 | What you have learned
181 | Any changes to your goals (or what your initial goals are for the first entry)
182 | Next step(s) to achieve your goals
183 |
184 | The learning log should have a maximum total word count of 1500 words, as measured by the Microsoft VS Code Word Count plugin and have a reasonable balance between the entries.
185 |
186 |
187 |
188 | Assessment criteria (10% each)
189 |
190 | Number, timing and word count of entries (use of git)
191 | Appropriate development and monitoring of goals
192 | Evidence of increased understanding
193 | Evidence of collaboration
194 | Evidence of criticality about your own actions and assumptions
195 |
196 |
197 |
198 |
199 | Guide for learners
200 | Based on your experience, write a Markdown document which explains to somebody else how to master the skill you have been learning.
201 | You don’t need to explain the details, but identify and pull together useful resources.
202 |
203 |
204 |
205 | Guide for learners structure
206 |
207 | Motivation (10%): Why learn it?
208 | Background (10%): What do you need to know before starting? Include links to material to catch up. Make it clear who your target audience is
209 | Learning materials (10%): Provide appropriate links to external resources with commentary
210 | Evaluation (10%): How useful is the skill, compared with the effort of learning it? What similar alternatives are there?
211 | Presentation (10%)
212 |
213 |
214 |
215 |
216 | The presentation mark (10%) will be awarded on the basis of
217 |
218 | formatting in (GitHub flavored ) Markdown
219 | choice of media (images, video)
220 | clear writing style appropriate for audience
221 |
222 |
223 |
227 |
228 | Submission
229 |
230 | Your learning log and your guide for learners should be held within a single private repository on GitHub.
231 | In the repository you should include a README file including a link to the repository on GitHub.
232 | You should submit the entire content of the repository as a zip file.
233 |
234 |
235 |
236 |
237 | Submission repository
238 |
239 | The repository on GitHub must be accessible by me (username stevenaeola).
240 | Allow access to the repository through Settings - Manage Access - Invite a collaborator.
241 | If you do not allow access you will lose marks.
242 | Note that this does not affect the access to any code you may write, which would most likely be in a public repository.
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 | // reveal.js plugins
251 |
252 |
253 |
254 |
255 |
271 |
272 |
273 |
--------------------------------------------------------------------------------
/assignment_2/PITCHME.md:
--------------------------------------------------------------------------------
1 |
2 | # COMP1101 Programming (Black) Summative Assessment 2{data-background-color=#7E317B}
3 |
4 | ---
5 |
6 | ## Term 2 Programming Exercise Outline
7 |
8 | - Submission by 14:00 27 April 2023
9 | - Return after end of exam period
10 | - Contributes 50% of module marks
11 |
12 | ---
13 |
14 | ## Subject-specific Knowledge
15 |
16 | - A knowledge and understanding of good programming practice (for example, reuse, documentation and style)
17 |
18 | ---
19 |
20 | ## Subject-Specific Skills
21 |
22 | - an ability to apply reuse by exploiting predefined components
23 | - an ability to use software tools related to programming (programming environments, code management, documentation tools, etc.)
24 | - an ability to apply software development tools and skills in real-world scenarios e.g. open-source projects, hackathons, competitions
25 |
26 | ---
27 |
28 | ## Key Skills
29 |
30 | - an ability to communicate technical information
31 | - an ability to plan and work independently
32 |
33 | ---
34 |
35 | # Task summary
36 |
37 | - Choose a skill to develop
38 | - Choose a collaborative project to contribute to e.g.
39 | - Open-Source Software
40 | - hackathon
41 | - (collaborative) competition
42 | - Record your progress in git with a reflective learning log
43 | - Write a guide for other learners
44 |
45 | ---
46 |
47 | # Skills to develop {data-background-color=#00AEEF}
48 |
49 | - These are examples only
50 | - JavaScript or non-JavaScript
51 |
52 | ---
53 |
54 | ## JavaScript Skills
55 |
56 | ::: incremental
57 |
58 | - [TypeScript](https://www.typescriptlang.org/)
59 | - [React](https://reactjs.org/) or [Vue](https://vuejs.org/)
60 | - [Progressive Web Apps](https://web.dev/progressive-web-apps/)
61 | - [d3](https://d3js.org/) with [SVG](https://developer.mozilla.org/en-US/docs/Web/SVG)
62 | - [p5](https://p5js.org/) and [openprocessing](https://www.openprocessing.org/)
63 | - [WebGL](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Getting_started_with_WebGL) / [WebAudio](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API) / [Other APIs](https://developer.mozilla.org/en-US/docs/Web/API)
64 | - [node-RED](https://nodered.org/)
65 | :::
66 |
67 | ---
68 |
69 | ## Non-JavaScript Skills
70 |
71 | ::: incremental
72 |
73 | - [Django](https://www.djangoproject.com/)
74 | - [Continuous Integration (CI/CD)](https://www.atlassian.com/continuous-delivery/continuous-integration)
75 | - Cloud platforms ([AWS](https://aws.amazon.com/) / [Azure](https://azure.microsoft.com/en-gb/) / [Google](https://cloud.google.com/appengine) / [OpenShift](https://www.openshift.com/) / [IBM](https://cloud.ibm.com/docs))
76 | - [Rust](https://www.rust-lang.org/)
77 |
78 | :::
79 | ---
80 |
81 | # Collaborative project ideas {data-background-color=#00AEEF}
82 |
83 | ---
84 |
85 | ## Contribute to Open Source Software
86 |
87 | ::: incremental
88 | - Choose your favourite project
89 | - Or pick from a [list of things up for grabs](https://up-for-grabs.net/#/) for [first timers](https://www.firsttimersonly.com/)
90 | - Or [code for social good](https://app.code4socialgood.org/project/list/projects)
91 | - Make sure the project is
92 | - active (frequent and recent commits, not many open PRs)
93 | - collaborative (multiple contributors)
94 | :::
95 |
96 | ---
97 |
98 | ## [Don't need to commit code](https://opensource.guide/how-to-contribute/)
99 | For example
100 |
101 | ::: incremental
102 | - Review/ translate docs and help
103 | - Issue gardening (remove duplicates)
104 | - Answer questions on forums e.g. StackOverflow
105 | - Make a video of installation process
106 | :::
107 |
108 | ---
109 |
110 | ## Take part in a hackathon
111 |
112 |
113 |
114 | ---
115 |
116 | ## Or do your own thing {data-background-color=#00AEEF}
117 |
118 | - Start a new project
119 | - As long as it is collaborative
120 |
121 | ---
122 | # Requirements and Assessment Criteria
123 |
124 | ---
125 |
126 | ## Learning log
127 |
128 | - Make at least four separate entries reasonably spaced over a period of at least six weeks
129 | - The entries can either be separate files or different sections within the same file.
130 | - They should be written using Markdown and stored in a private repository on GitHub.
131 | - You need to commit and push each entry as you make it so that the dates of the entries are correctly recorded in git.
132 | - You can include images and external links.
133 |
134 | ---
135 |
136 | For each entry identify
137 |
138 | - What you have done (to learn your skill and contribute to your project)
139 | - What you have learned
140 | - Any changes to your goals (or what your initial goals are for the first entry)
141 | - Next step(s) to achieve your goals
142 |
143 | The learning log should have a maximum total word count of 1500 words, as measured by the [Microsoft VS Code Word Count plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.wordcount) and have a reasonable balance between the entries.
144 |
145 | ---
146 |
147 | ### Assessment criteria (10% each)
148 | - Number, timing and word count of entries (use of git)
149 | - Appropriate development and monitoring of goals
150 | - Evidence of increased understanding
151 | - Evidence of collaboration
152 | - Evidence of criticality about your own actions and assumptions
153 |
154 | ---
155 |
156 | ## Guide for learners
157 |
158 | Based on your experience, write a Markdown document which explains to somebody else how to master the skill you have been learning.
159 |
160 | You don't need to explain the details, but identify and pull together useful resources.
161 |
162 | ---
163 |
164 | ## Guide for learners structure
165 |
166 | - Motivation (10%): Why learn it?
167 | - Background (10%): What do you need to know before starting? Include links to material to catch up. Make it clear who your target audience is
168 | - Learning materials (10%): Provide appropriate links to external resources with commentary
169 | - Evaluation (10%): How useful is the skill, compared with the effort of learning it? What similar alternatives are there?
170 | - Presentation (10%)
171 |
172 | ---
173 |
174 | The presentation mark (10%) will be awarded on the basis of
175 |
176 | - formatting in ([GitHub flavored](https://GitHub.GitHub.com/gfm/)) Markdown
177 | - choice of media (images, video)
178 | - clear writing style appropriate for audience
179 |
180 | ---
181 |
182 | The guide for learners should have a maximum total word count of 1500 words, as measured by the [Microsoft VS Code Word Count plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.wordcount)
183 |
184 | ---
185 |
186 | # Submission
187 |
188 | - Your learning log and your guide for learners should be held within a single private repository on GitHub.
189 | - In the repository you should include a README file including a link to the repository on GitHub.
190 | - You should submit the entire content of the repository as a zip file.
191 |
192 | ---
193 |
194 | ## Submission repository
195 |
196 | - The repository on GitHub must be accessible by me (username stevenaeola).
197 | - Allow access to the repository through Settings - Manage Access - Invite a collaborator.
198 | - If you do not allow access you will lose marks.
199 | - Note that this does not affect the access to any code you may write, which would most likely be in a public repository.
200 |
201 |
202 |
--------------------------------------------------------------------------------
/assignment_2/README.md:
--------------------------------------------------------------------------------
1 |
2 | # COMP1101 Programming (Black) Summative Assessment 2
3 |
4 |
5 | ## Term 2 Programming Exercise Outline
6 |
7 | - Submission by 14:00 27 April 2023
8 | - Return after end of exam period
9 | - Contributes 50% of module marks
10 |
11 |
12 | ## Subject-specific Knowledge
13 |
14 | - A knowledge and understanding of good programming practice (for example, reuse, documentation and style)
15 |
16 |
17 | ## Subject-Specific Skills
18 |
19 | - an ability to apply reuse by exploiting predefined components
20 | - an ability to use software tools related to programming (programming environments, code management, documentation tools, etc.)
21 | - an ability to apply software development tools and skills in real-world scenarios e.g. open-source projects, hackathons, competitions
22 |
23 |
24 | ## Key Skills
25 |
26 | - an ability to communicate technical information
27 | - an ability to plan and work independently
28 |
29 |
30 | # Task summary
31 |
32 | - Choose a skill to develop
33 | - Choose a collaborative project to contribute to e.g.
34 | - Open-Source Software
35 | - hackathon
36 | - (collaborative) competition
37 | - Record your progress in git with a reflective learning log
38 | - Write a guide for other learners
39 |
40 |
41 | # Skills to develop
42 |
43 | - These are examples only
44 | - JavaScript or non-JavaScript
45 |
46 |
47 | ## JavaScript Skills
48 |
49 |
50 | - [TypeScript](https://www.typescriptlang.org/)
51 | - [React](https://reactjs.org/) or [Vue](https://vuejs.org/)
52 | - [Progressive Web Apps](https://web.dev/progressive-web-apps/)
53 | - [d3](https://d3js.org/) with [SVG](https://developer.mozilla.org/en-US/docs/Web/SVG)
54 | - [p5](https://p5js.org/) and [openprocessing](https://www.openprocessing.org/)
55 | - [WebGL](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Getting_started_with_WebGL) / [WebAudio](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API) / [Other APIs](https://developer.mozilla.org/en-US/docs/Web/API)
56 | - [node-RED](https://nodered.org/)
57 |
58 |
59 | ## Non-JavaScript Skills
60 |
61 |
62 | - [Django](https://www.djangoproject.com/)
63 | - [Continuous Integration (CI/CD)](https://www.atlassian.com/continuous-delivery/continuous-integration)
64 | - Cloud platforms ([AWS](https://aws.amazon.com/) / [Azure](https://azure.microsoft.com/en-gb/) / [Google](https://cloud.google.com/appengine) / [OpenShift](https://www.openshift.com/) / [IBM](https://cloud.ibm.com/docs))
65 | - [Rust](https://www.rust-lang.org/)
66 |
67 |
68 | # Collaborative project ideas
69 |
70 |
71 | ## Contribute to Open Source Software
72 |
73 | - Choose your favourite project
74 | - Or pick from a [list of things up for grabs](https://up-for-grabs.net/#/) for [first timers](https://www.firsttimersonly.com/)
75 | - Or [code for social good](https://app.code4socialgood.org/project/list/projects)
76 | - Make sure the project is
77 | - active (frequent and recent commits, not many open PRs)
78 | - collaborative (multiple contributors)
79 |
80 |
81 | ## [Don't need to commit code](https://opensource.guide/how-to-contribute/)
82 | For example
83 |
84 | - Review/ translate docs and help
85 | - Issue gardening (remove duplicates)
86 | - Answer questions on forums e.g. StackOverflow
87 | - Make a video of installation process
88 |
89 |
90 | ## Take part in a hackathon
91 |
92 |
93 |
94 |
95 | ## Or do your own thing
96 |
97 | - Start a new project
98 | - As long as it is collaborative
99 |
100 | # Requirements and Assessment Criteria
101 |
102 |
103 | ## Learning log
104 |
105 | - Make at least four separate entries reasonably spaced over a period of at least six weeks
106 | - The entries can either be separate files or different sections within the same file.
107 | - They should be written using Markdown and stored in a private repository on GitHub.
108 | - You need to commit and push each entry as you make it so that the dates of the entries are correctly recorded in git.
109 | - You can include images and external links.
110 |
111 |
112 | For each entry identify
113 |
114 | - What you have done (to learn your skill and contribute to your project)
115 | - What you have learned
116 | - Any changes to your goals (or what your initial goals are for the first entry)
117 | - Next step(s) to achieve your goals
118 |
119 | The learning log should have a maximum total word count of 1500 words, as measured by the [Microsoft VS Code Word Count plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.wordcount) and have a reasonable balance between the entries.
120 |
121 |
122 | ### Assessment criteria (10% each)
123 | - Number, timing and word count of entries (use of git)
124 | - Appropriate development and monitoring of goals
125 | - Evidence of increased understanding
126 | - Evidence of collaboration
127 | - Evidence of criticality about your own actions and assumptions
128 |
129 |
130 | ## Guide for learners
131 |
132 | Based on your experience, write a Markdown document which explains to somebody else how to master the skill you have been learning.
133 |
134 | You don't need to explain the details, but identify and pull together useful resources.
135 |
136 |
137 | ## Guide for learners structure
138 |
139 | - Motivation (10%): Why learn it?
140 | - Background (10%): What do you need to know before starting? Include links to material to catch up. Make it clear who your target audience is
141 | - Learning materials (10%): Provide appropriate links to external resources with commentary
142 | - Evaluation (10%): How useful is the skill, compared with the effort of learning it? What similar alternatives are there?
143 | - Presentation (10%)
144 |
145 |
146 | The presentation mark (10%) will be awarded on the basis of
147 |
148 | - formatting in ([GitHub flavored](https://GitHub.GitHub.com/gfm/)) Markdown
149 | - choice of media (images, video)
150 | - clear writing style appropriate for audience
151 |
152 |
153 | The guide for learners should have a maximum total word count of 1500 words, as measured by the [Microsoft VS Code Word Count plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.wordcount)
154 |
155 |
156 | # Submission
157 |
158 | - Your learning log and your guide for learners should be held within a single private repository on GitHub.
159 | - In the repository you should include a README file including a link to the repository on GitHub.
160 | - You should submit the entire content of the repository as a zip file.
161 |
162 |
163 | ## Submission repository
164 |
165 | - The repository on GitHub must be accessible by me (username stevenaeola).
166 | - Allow access to the repository through Settings - Manage Access - Invite a collaborator.
167 | - If you do not allow access you will lose marks.
168 | - Note that this does not affect the access to any code you may write, which would most likely be in a public repository.
169 |
170 |
171 |
--------------------------------------------------------------------------------
/assignment_2/README.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stevenaeola/progblack_2223/6eb635b41cb9c1441c081615561985a4dae7a481/assignment_2/README.pdf
--------------------------------------------------------------------------------
/assignment_2/build.sh:
--------------------------------------------------------------------------------
1 | ../assignment_1/build.sh
--------------------------------------------------------------------------------