<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://homeostasis.scs.carleton.ca/wiki/index.php?action=history&amp;feed=atom&amp;title=WebFund_2024F_Lecture_14</id>
	<title>WebFund 2024F Lecture 14 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://homeostasis.scs.carleton.ca/wiki/index.php?action=history&amp;feed=atom&amp;title=WebFund_2024F_Lecture_14"/>
	<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2024F_Lecture_14&amp;action=history"/>
	<updated>2026-04-06T10:15:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2024F_Lecture_14&amp;diff=24817&amp;oldid=prev</id>
		<title>Soma: /* Code */</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2024F_Lecture_14&amp;diff=24817&amp;oldid=prev"/>
		<updated>2024-11-05T20:43:29Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Code&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 20:43, 5 November 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l542&quot;&gt;Line 542:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 542:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;===static/index.html===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;syntaxhighlight lang=&quot;html&quot; line&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;html&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &amp;lt;head&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &amp;lt;title&amp;gt;COMP 2406 DOM Demo&amp;lt;/title&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;/style.css&quot;&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &amp;lt;/head&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &amp;lt;body&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &amp;lt;h1&amp;gt;COMP 2406 DOM Demo&amp;lt;/h1&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &amp;lt;p&amp;gt;Please select what you would like to do:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &amp;lt;ol&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;/add.html&quot;&amp;gt;Add a record.&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;/list.html&quot;&amp;gt;List records.&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;/analyze&quot;&amp;gt;Analyze records.&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;        &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;/tut-validator.html&quot;&amp;gt;Tutorial Validator.&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;        &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &amp;lt;/ol&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &amp;lt;/p&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &amp;lt;/body&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;===tut-validator.html===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;syntaxhighlight lang=&quot;html&quot; line&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;html&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &amp;lt;head&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &amp;lt;title&amp;gt;COMP 2406 2024F Tutorial Validator&amp;lt;/title&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;/style.css&quot;&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &amp;lt;script type=&quot;text/javascript&quot; src=&quot;/validator.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &amp;lt;/head&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &amp;lt;body onload=&quot;hideAnalysis()&quot;&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &amp;lt;h1&amp;gt;COMP 2406 2024F Tutorial Validator&amp;lt;/h1&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &amp;lt;form&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &amp;lt;input type=&quot;file&quot; id=&quot;assignmentFile&quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	     onchange=&quot;loadAssignment(this, false)&quot; /&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &amp;lt;button type=&quot;button&quot; onclick=&quot;uploadSubmission()&quot;&amp;gt;Submit&amp;lt;/button&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &amp;lt;/form&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &amp;lt;div id=&quot;analysis&quot;&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Status:&amp;lt;/b&amp;gt; &amp;lt;span id=&quot;status&quot;&amp;gt;UNKNOWN&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &amp;lt;p&amp;gt;Filename: &amp;lt;span id=&quot;filename&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &amp;lt;p&amp;gt;Name: &amp;lt;span id=&quot;name&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        Student ID: &amp;lt;span id=&quot;studentID&quot;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;i&amp;gt;(Please check that your ID number is correct!)&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &amp;lt;hr&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &amp;lt;div id=&quot;questions&quot;&amp;gt;&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Questions:&amp;lt;/b&amp;gt; &amp;lt;i&amp;gt;(Please check that your answers are numbered correctly!)&amp;lt;/i&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &amp;lt;/div&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &amp;lt;/body&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Soma</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2024F_Lecture_14&amp;diff=24816&amp;oldid=prev</id>
		<title>Soma: Created page with &quot;==Video==  Video from the lecture for November 5, 2024 is now available: * [https://homeostasis.scs.carleton.ca/~soma/webfund-2024f/lectures/comp2406-2024f-lec14-20241105.m4v video] * [https://homeostasis.scs.carleton.ca/~soma/webfund-2024f/lectures/comp2406-2024f-lec14-20241105.cc.vtt auto-generated captions]  ==Notes==  &lt;pre&gt; Lecture 14 ----------  - Assignment 2 grades should be out by end of tomorrow  - Midterms should be graded by middle of next week, interviews...&quot;</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2024F_Lecture_14&amp;diff=24816&amp;oldid=prev"/>
		<updated>2024-11-05T20:40:54Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==Video==  Video from the lecture for November 5, 2024 is now available: * [https://homeostasis.scs.carleton.ca/~soma/webfund-2024f/lectures/comp2406-2024f-lec14-20241105.m4v video] * [https://homeostasis.scs.carleton.ca/~soma/webfund-2024f/lectures/comp2406-2024f-lec14-20241105.cc.vtt auto-generated captions]  ==Notes==  &amp;lt;pre&amp;gt; Lecture 14 ----------  - Assignment 2 grades should be out by end of tomorrow  - Midterms should be graded by middle of next week, interviews...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
Video from the lecture for November 5, 2024 is now available:&lt;br /&gt;
* [https://homeostasis.scs.carleton.ca/~soma/webfund-2024f/lectures/comp2406-2024f-lec14-20241105.m4v video]&lt;br /&gt;
* [https://homeostasis.scs.carleton.ca/~soma/webfund-2024f/lectures/comp2406-2024f-lec14-20241105.cc.vtt auto-generated captions]&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 14&lt;br /&gt;
----------&lt;br /&gt;
 - Assignment 2 grades should be out by end of tomorrow&lt;br /&gt;
 - Midterms should be graded by middle of next week, interviews&lt;br /&gt;
   will be scheduled afterwards&lt;br /&gt;
   - will be scheduled at arbitrary times that work for everyone&lt;br /&gt;
      - TAs will try to keep it to their tutorials &amp;amp; office hours&lt;br /&gt;
   - TAs will do a few each, I will do many&lt;br /&gt;
 - We will go through midterm solutions once they are graded&lt;br /&gt;
&lt;br /&gt;
 - Tutorial 7 will come out Thursday, A3 soon after&lt;br /&gt;
    - A3 will be based on T7 code&lt;br /&gt;
&lt;br /&gt;
 - we&amp;#039;re going to start developing T7 code today in class&lt;br /&gt;
&lt;br /&gt;
A3 is due Nov. 20th&lt;br /&gt;
T5, 6 due Nov. 13th&lt;br /&gt;
T7 due around Nov 15th&lt;br /&gt;
 - note how compressed this timeframe is&lt;br /&gt;
 - get caught up on tutorials!&lt;br /&gt;
&lt;br /&gt;
Today, the plan is to merge the code from T5 &amp;amp; T6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&lt;br /&gt;
Note: This code is a work in progress!&lt;br /&gt;
&lt;br /&gt;
===domdemo.js===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; line&amp;gt;&lt;br /&gt;
// SPDX-License-Identifier: GPL-3.0-or-later&lt;br /&gt;
// Copyright (C) 2024 Anil Somayaji&lt;br /&gt;
//&lt;br /&gt;
// dbdemo.js&lt;br /&gt;
// for COMP 2406 (Fall 2024), Carleton University&lt;br /&gt;
// &lt;br /&gt;
// Initial version: October 9, 2024&lt;br /&gt;
//&lt;br /&gt;
// run with the following command:&lt;br /&gt;
//    deno run --allow-net --allow-read --allow-write domdemo.js&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
import { DB } from &amp;quot;https://deno.land/x/sqlite/mod.ts&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const status_NOT_FOUND = 404;&lt;br /&gt;
const status_OK = 200;&lt;br /&gt;
const status_NOT_IMPLEMENTED = 501;&lt;br /&gt;
const appTitle = &amp;quot;COMP 2406 DOM Demo&amp;quot;;&lt;br /&gt;
const dbFile = &amp;quot;people.db&amp;quot;;&lt;br /&gt;
const table = &amp;quot;people&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const db = new DB(dbFile);&lt;br /&gt;
&lt;br /&gt;
db.execute(`&lt;br /&gt;
  CREATE TABLE IF NOT EXISTS ${table} (&lt;br /&gt;
    id INTEGER PRIMARY KEY AUTOINCREMENT,&lt;br /&gt;
    name TEXT,&lt;br /&gt;
    city TEXT,&lt;br /&gt;
    country TEXT,&lt;br /&gt;
    birthday TEXT,&lt;br /&gt;
    email TEXT&lt;br /&gt;
  )&lt;br /&gt;
`);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function addRecordDB(db, table, r) {&lt;br /&gt;
    return db.query(`INSERT INTO ${table} ` +&lt;br /&gt;
                    &amp;quot;(name, city, country, birthday, email) &amp;quot; +&lt;br /&gt;
                    &amp;quot;VALUES (?, ?, ?, ?, ?)&amp;quot;,&lt;br /&gt;
                    [r.name, r.city, r.country, r.birthday, r.email]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function getAllRecordsDB(db, table) {&lt;br /&gt;
    var state = [];&lt;br /&gt;
    const query =&lt;br /&gt;
          db.prepareQuery(&lt;br /&gt;
              &amp;quot;SELECT id, name, city, country, birthday, email FROM &amp;quot; +&lt;br /&gt;
                  table + &amp;quot; ORDER BY name ASC LIMIT 50&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (const [id, name, city, country, birthday, email] of query.iter()) {&lt;br /&gt;
        state.push({id, name, city, country, birthday, email});&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    query.finalize();&lt;br /&gt;
    &lt;br /&gt;
    return state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function analyzeRecordsDB(db, table) {&lt;br /&gt;
    var analysis = {};&lt;br /&gt;
&lt;br /&gt;
    analysis.count = db.query(&amp;quot;SELECT COUNT(*) FROM &amp;quot; + table);&lt;br /&gt;
    analysis.cityList = db.query(&amp;quot;SELECT DISTINCT CITY FROM &amp;quot; + table);&lt;br /&gt;
    &lt;br /&gt;
    return analysis;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function MIMEtype(filename) {&lt;br /&gt;
&lt;br /&gt;
    const MIME_TYPES = {&lt;br /&gt;
        &amp;#039;css&amp;#039;: &amp;#039;text/css&amp;#039;,&lt;br /&gt;
        &amp;#039;gif&amp;#039;: &amp;#039;image/gif&amp;#039;,&lt;br /&gt;
        &amp;#039;htm&amp;#039;: &amp;#039;text/html&amp;#039;,&lt;br /&gt;
        &amp;#039;html&amp;#039;: &amp;#039;text/html&amp;#039;,&lt;br /&gt;
        &amp;#039;ico&amp;#039;: &amp;#039;image/x-icon&amp;#039;,&lt;br /&gt;
        &amp;#039;jpeg&amp;#039;: &amp;#039;image/jpeg&amp;#039;,&lt;br /&gt;
        &amp;#039;jpg&amp;#039;: &amp;#039;image/jpeg&amp;#039;,&lt;br /&gt;
        &amp;#039;js&amp;#039;: &amp;#039;text/javascript&amp;#039;,&lt;br /&gt;
        &amp;#039;json&amp;#039;: &amp;#039;application/json&amp;#039;,&lt;br /&gt;
        &amp;#039;pdf&amp;#039;: &amp;#039;application/pdf&amp;#039;,&lt;br /&gt;
        &amp;#039;png&amp;#039;: &amp;#039;image/png&amp;#039;,&lt;br /&gt;
        &amp;#039;txt&amp;#039;: &amp;#039;text/text&amp;#039;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var extension = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    if (filename) {&lt;br /&gt;
        extension = filename.slice(filename.lastIndexOf(&amp;#039;.&amp;#039;)+1).toLowerCase();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return MIME_TYPES[extension] || &amp;quot;application/octet-stream&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function template_header(title) {&lt;br /&gt;
    const fullTitle = appTitle + &amp;quot;: &amp;quot; + title;&lt;br /&gt;
    &lt;br /&gt;
    return `&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;${fullTitle}&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/style.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
`&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function template_notFound(path) {&lt;br /&gt;
    return template_header(&amp;quot;Page not found&amp;quot;) +&lt;br /&gt;
        `&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Page not found&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Sorry, the requested page was not found.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
`&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function template_addRecord(obj) {&lt;br /&gt;
    return template_header(&amp;quot;Record just added&amp;quot;) +&lt;br /&gt;
        `&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Person just added&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Name: ${obj.name}&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;City: ${obj.city}&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Country: ${obj.country}&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Birthday: ${obj.birthday}&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Email: ${obj.email}&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Home&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
`&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function listRecords() {&lt;br /&gt;
    var state = getAllRecordsDB(db, table);&lt;br /&gt;
    &lt;br /&gt;
    var response = { contentType: &amp;quot;application/JSON&amp;quot;,&lt;br /&gt;
                     status: status_OK,&lt;br /&gt;
                     contents: JSON.stringify(state),&lt;br /&gt;
                   };&lt;br /&gt;
&lt;br /&gt;
    return response;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
async function routeGet(req) {&lt;br /&gt;
    const path = new URL(req.url).pathname;&lt;br /&gt;
    if (path === &amp;quot;/list&amp;quot;) {&lt;br /&gt;
        return listRecords();&lt;br /&gt;
    } else if (path === &amp;quot;/analyze&amp;quot;) {&lt;br /&gt;
        return await showAnalysis();&lt;br /&gt;
    }  else {&lt;br /&gt;
        return null;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
async function addRecord(req) {&lt;br /&gt;
    var body = await req.formData();&lt;br /&gt;
    var obj = { name: body.get(&amp;quot;name&amp;quot;),&lt;br /&gt;
                city: body.get(&amp;quot;city&amp;quot;),&lt;br /&gt;
                country: body.get(&amp;quot;country&amp;quot;),&lt;br /&gt;
                birthday: body.get(&amp;quot;birthday&amp;quot;),&lt;br /&gt;
                email: body.get(&amp;quot;email&amp;quot;) };&lt;br /&gt;
&lt;br /&gt;
    addRecordDB(db, table, obj);&lt;br /&gt;
&lt;br /&gt;
    var response = { contentType: &amp;quot;text/html&amp;quot;,&lt;br /&gt;
                     status: status_OK,&lt;br /&gt;
                     contents: template_addRecord(obj),&lt;br /&gt;
                   };&lt;br /&gt;
&lt;br /&gt;
    return response;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
async function showAnalysis() {&lt;br /&gt;
    var analysis = analyzeRecordsDB(db, table);&lt;br /&gt;
    var cityList = &amp;#039;&amp;lt;li&amp;gt;&amp;#039; + analysis.cityList.join(&amp;#039;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;#039;) + &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
    &lt;br /&gt;
    var analysisBody = `  &amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Database analysis&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;# Records: ${analysis.count}&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Cities:&lt;br /&gt;
      &amp;lt;ol&amp;gt;&lt;br /&gt;
       ${cityList}&lt;br /&gt;
      &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form method=&amp;quot;get&amp;quot; action=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Home&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;`&lt;br /&gt;
&lt;br /&gt;
    var contents = template_header(&amp;quot;Analysis&amp;quot;) + analysisBody;&lt;br /&gt;
&lt;br /&gt;
    var response = { contentType: &amp;quot;text/html&amp;quot;,&lt;br /&gt;
                     status: status_OK,&lt;br /&gt;
                     contents: contents,&lt;br /&gt;
                   };&lt;br /&gt;
    &lt;br /&gt;
    return response;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
async function addSubmission(req) {&lt;br /&gt;
    //var body = await req.formData();&lt;br /&gt;
    //var obj = JSON.parse(body);&lt;br /&gt;
&lt;br /&gt;
    console.log(&amp;quot;Got following request object.&amp;quot;);&lt;br /&gt;
    console.log(req);&lt;br /&gt;
&lt;br /&gt;
    var response = { contentType: &amp;quot;text/plain&amp;quot;,&lt;br /&gt;
                     status: status_OK,&lt;br /&gt;
                     contents: &amp;quot;Got the data&amp;quot;,&lt;br /&gt;
                   };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function routePost(req) {&lt;br /&gt;
    const path = new URL(req.url).pathname;    &lt;br /&gt;
&lt;br /&gt;
    if (path === &amp;quot;/add&amp;quot;) {&lt;br /&gt;
        return await addRecord(req);&lt;br /&gt;
    } else if (path === &amp;quot;/uploadSubmission&amp;quot;) {&lt;br /&gt;
        return await addSubmission(req);&lt;br /&gt;
    } else {&lt;br /&gt;
        return null;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
async function route(req) {&lt;br /&gt;
&lt;br /&gt;
    if (req.method === &amp;quot;GET&amp;quot;) {&lt;br /&gt;
        return await routeGet(req);&lt;br /&gt;
    } else if (req.method === &amp;quot;POST&amp;quot;) {&lt;br /&gt;
        return await routePost(req);&lt;br /&gt;
    } else {&lt;br /&gt;
        return {&lt;br /&gt;
            contents: &amp;quot;Method not implemented.&amp;quot;,&lt;br /&gt;
            status: status_NOT_IMPLEMENTED,&lt;br /&gt;
            contentType: &amp;quot;text/plain&amp;quot;&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
async function fileData(path) {&lt;br /&gt;
    var contents, status, contentType;&lt;br /&gt;
    &lt;br /&gt;
    try {&lt;br /&gt;
        contents = await Deno.readFile(&amp;quot;./static&amp;quot; + path);&lt;br /&gt;
        status = status_OK;&lt;br /&gt;
        contentType = MIMEtype(path);&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
        contents = template_notFound(path);&lt;br /&gt;
        status = status_NOT_FOUND;&lt;br /&gt;
        contentType = &amp;quot;text/html&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return { contents, status, contentType };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
async function handler(req) {&lt;br /&gt;
&lt;br /&gt;
    var origpath = new URL(req.url).pathname;&lt;br /&gt;
    var path = origpath;&lt;br /&gt;
    var r =  await route(req);&lt;br /&gt;
    &lt;br /&gt;
    if (!r) {&lt;br /&gt;
        if (path === &amp;quot;/&amp;quot;) {&lt;br /&gt;
            path = &amp;quot;/index.html&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        r = await fileData(path);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    console.log(`${r.status} ${req.method} ${r.contentType} ${origpath}`); &lt;br /&gt;
&lt;br /&gt;
    return new Response(r.contents,&lt;br /&gt;
                        {status: r.status,&lt;br /&gt;
                         headers: {&lt;br /&gt;
                             &amp;quot;content-type&amp;quot;: r.contentType,&lt;br /&gt;
                         }});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const ac = new AbortController();&lt;br /&gt;
&lt;br /&gt;
const server = Deno.serve(&lt;br /&gt;
    {&lt;br /&gt;
        signal: ac.signal,&lt;br /&gt;
        port: 8000,&lt;br /&gt;
        hostname: &amp;quot;0.0.0.0&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    handler);&lt;br /&gt;
&lt;br /&gt;
Deno.addSignalListener(&amp;quot;SIGINT&amp;quot;, () =&amp;gt; {&lt;br /&gt;
    console.log(&amp;quot;SIGINT received, terminating...&amp;quot;);&lt;br /&gt;
    ac.abort();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
server.finished.then(() =&amp;gt; {&lt;br /&gt;
    console.log(&amp;quot;Server terminating, closing database.&amp;quot;)&lt;br /&gt;
    db.close();&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===validator.js===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; line&amp;gt;&lt;br /&gt;
// validator.js&lt;br /&gt;
&lt;br /&gt;
const filePrefix = &amp;quot;comp2406-tutorial6&amp;quot;;&lt;br /&gt;
const submissionName = &amp;quot;COMP 2406 2024F Tutorial 6&amp;quot;&lt;br /&gt;
const expectedQuestionList = &amp;quot;1,2,3,4,5&amp;quot;;&lt;br /&gt;
var analysisSection;&lt;br /&gt;
&lt;br /&gt;
function loadAssignment(fileInput, upload) {&lt;br /&gt;
    analysisSection.hidden = false;&lt;br /&gt;
&lt;br /&gt;
    if(fileInput.files[0] == undefined) {&lt;br /&gt;
        updateTag(&amp;quot;status&amp;quot;, &amp;quot;ERROR: No files to examine.&amp;quot;)&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var reader = new FileReader();&lt;br /&gt;
    reader.onload = function(ev) {&lt;br /&gt;
        var content = ev.target.result;&lt;br /&gt;
        var q = checkSubmission(fileInput.files[0].name, content);&lt;br /&gt;
        if (upload) {&lt;br /&gt;
            console.log(&amp;quot;Trying to upload the submission...&amp;quot;);&lt;br /&gt;
            doUploadSubmission(q);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    reader.onerror = function(err) {&lt;br /&gt;
        updateTag(&amp;quot;status&amp;quot;, &amp;quot;ERROR: Failed to read file&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    reader.readAsText(fileInput.files[0]);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var numQuestions = expectedQuestionList.split(&amp;quot;,&amp;quot;).length;&lt;br /&gt;
&lt;br /&gt;
function updateTag(id, val) {&lt;br /&gt;
    document.getElementById(id).innerHTML = val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function lineEncoding(lines) {&lt;br /&gt;
    var n, i, s;&lt;br /&gt;
    &lt;br /&gt;
    for (i = 0; i &amp;lt; lines.length; i++) {&lt;br /&gt;
        s = lines[i];&lt;br /&gt;
        n = s.length;&lt;br /&gt;
        if (s[n-1] === &amp;#039;\r&amp;#039;) {&lt;br /&gt;
            return &amp;quot;DOS/Windows Text (CR/LF)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return &amp;quot;UNIX&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function checkSubmission(fn, f) {&lt;br /&gt;
    var lines = f.split(&amp;#039;\n&amp;#039;)&lt;br /&gt;
    var c = 0;&lt;br /&gt;
    var questionList = [];&lt;br /&gt;
    var questionString;&lt;br /&gt;
    var q = {};&lt;br /&gt;
    var e = {};&lt;br /&gt;
    var i;&lt;br /&gt;
    var lastQuestion = null;&lt;br /&gt;
    const fnPattern = filePrefix + &amp;quot;-[a-zA-Z0-9]+\.txt&amp;quot;;&lt;br /&gt;
    const fnRexp = new RegExp(fnPattern);&lt;br /&gt;
    &lt;br /&gt;
    if (!fnRexp.test(fn)) {&lt;br /&gt;
        updateTag(&amp;quot;status&amp;quot;, &amp;quot;ERROR &amp;quot; + fn +&lt;br /&gt;
                  &amp;quot; doesn&amp;#039;t follow the pattern &amp;quot; + fnRexp);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (fn === filePrefix + &amp;quot;-template.txt&amp;quot;) {&lt;br /&gt;
        updateTag(&amp;quot;status&amp;quot;, &amp;quot;ERROR &amp;quot; + fn +&lt;br /&gt;
                  &amp;quot; has the default name, please change template to your mycarletonone username&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    updateTag(&amp;quot;filename&amp;quot;, fn);&lt;br /&gt;
    &lt;br /&gt;
    let encoding = lineEncoding(lines);&lt;br /&gt;
    if (encoding !== &amp;quot;UNIX&amp;quot;) {&lt;br /&gt;
        updateTag(&amp;quot;status&amp;quot;, &amp;quot;ERROR &amp;quot; + fn +&lt;br /&gt;
                  &amp;quot; is not a UNIX textfile, it is a &amp;quot;&lt;br /&gt;
                  + encoding + &amp;quot; file.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (submissionName !== lines[0]) {&lt;br /&gt;
        updateTag(&amp;quot;status&amp;quot;, &amp;quot;ERROR &amp;quot; + fn +&lt;br /&gt;
                  &amp;quot; doesn&amp;#039;t start with \&amp;quot;&amp;quot; + submissionName + &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    try {&lt;br /&gt;
        e.name = lines[1].match(/^Name:(.+)/m)[1].trim();&lt;br /&gt;
        e.id = lines[2].match(/^Student ID:(.+)/m)[1].trim();&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
        updateTag(&amp;quot;status&amp;quot;, &amp;quot;ERROR &amp;quot; + fn +&lt;br /&gt;
                  &amp;quot; has bad Name or Student ID field&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateTag(&amp;quot;name&amp;quot;, e.name);&lt;br /&gt;
    updateTag(&amp;quot;studentID&amp;quot;, e.id);&lt;br /&gt;
    &lt;br /&gt;
    var questionRE = /^([0-9a-g]+)\.(.*)/;&lt;br /&gt;
    &lt;br /&gt;
    for (i = 4; i &amp;lt; lines.length; i++) {&lt;br /&gt;
        if (typeof(lines[i]) === &amp;#039;string&amp;#039;) {&lt;br /&gt;
            lines[i] = lines[i].replace(&amp;#039;\r&amp;#039;,&amp;#039;&amp;#039;);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        let m = lines[i].match(questionRE);&lt;br /&gt;
        if (m) {&lt;br /&gt;
            c++;&lt;br /&gt;
            questionList.push(m[1]);&lt;br /&gt;
            q[m[1]] = m[2];&lt;br /&gt;
            lastQuestion = m[1];&lt;br /&gt;
        } else {&lt;br /&gt;
            if (lastQuestion !== null) {&lt;br /&gt;
                if ((q[lastQuestion] === &amp;#039;&amp;#039;) || (q[lastQuestion] === &amp;#039; &amp;#039;)) {&lt;br /&gt;
                    q[lastQuestion] = lines[i];&lt;br /&gt;
                } else {&lt;br /&gt;
                    q[lastQuestion] = q[lastQuestion] + &amp;quot;\n&amp;quot; + lines[i];&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    console.log(JSON.stringify(q, null, &amp;#039;   &amp;#039;));&lt;br /&gt;
&lt;br /&gt;
    questionString = questionList.toString();&lt;br /&gt;
    if (questionString !== expectedQuestionList) {&lt;br /&gt;
        updateTag(&amp;quot;status&amp;quot;, &amp;quot;ERROR expected questions &amp;quot; +&lt;br /&gt;
                  expectedQuestionList + &amp;quot; but got questions &amp;quot; +&lt;br /&gt;
                  questionString);&lt;br /&gt;
    } else {&lt;br /&gt;
        updateTag(&amp;quot;status&amp;quot;, &amp;quot;PASSED &amp;quot; +&lt;br /&gt;
                  fn + &amp;quot;: &amp;quot; + e.name + &amp;quot; (&amp;quot; + e.id + &amp;quot;)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var newP, newText, newPre, newPreText;&lt;br /&gt;
    let questionDiv = document.getElementById(&amp;quot;questions&amp;quot;);&lt;br /&gt;
    for (let qName of questionList) {&lt;br /&gt;
        let qText = q[qName];&lt;br /&gt;
        newP = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
        newText = document.createTextNode(qName + &amp;quot;:&amp;quot;);&lt;br /&gt;
        newP.appendChild(newText);&lt;br /&gt;
        questionDiv.appendChild(newP);&lt;br /&gt;
        newPre = document.createElement(&amp;quot;pre&amp;quot;);&lt;br /&gt;
        newPreText = document.createTextNode(qText);&lt;br /&gt;
        newPre.appendChild(newPreText);&lt;br /&gt;
        newP.appendChild(newPre);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return q;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function hideAnalysis() {&lt;br /&gt;
    analysisSection = document.getElementById(&amp;quot;analysis&amp;quot;);&lt;br /&gt;
    analysisSection.hidden = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function uploadSubmission() {&lt;br /&gt;
    var assignmentFile = document.getElementById(&amp;quot;assignmentFile&amp;quot;);&lt;br /&gt;
    loadAssignment(assignmentFile, true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function doUploadSubmission(q) {&lt;br /&gt;
    console.log(&amp;quot;sending data to server...&amp;quot;);&lt;br /&gt;
    if (q) {&lt;br /&gt;
        const request = new Request(&amp;quot;/uploadSubmission&amp;quot;, {&lt;br /&gt;
            method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
            body: JSON.stringify(q),&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        console.log(request);&lt;br /&gt;
&lt;br /&gt;
        const response = fetch(request).then(() =&amp;gt; {&lt;br /&gt;
            console.log(&amp;quot;upload status: &amp;quot; + response.status);&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        console.log(&amp;quot;No data to upload!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Soma</name></author>
	</entry>
</feed>