From 77f85800f3dd5d04797c94d9ca199488bb14f855 Mon Sep 17 00:00:00 2001
From: William Billingsley <wbillingsley@cantab.net>
Date: Sun, 16 Jul 2023 16:03:29 +1000
Subject: [PATCH] Created minimal site

---
 courses.js |  629 ++++++++++++++++++++++++++++++++
 home.js    |   59 +++
 index.html |   37 ++
 units.js   | 1019 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 1744 insertions(+)
 create mode 100644 courses.js
 create mode 100644 home.js
 create mode 100644 index.html
 create mode 100644 units.js

diff --git a/courses.js b/courses.js
new file mode 100644
index 0000000..202148b
--- /dev/null
+++ b/courses.js
@@ -0,0 +1,629 @@
+"use strict";
+
+console.log("Loading courses")
+
+// Sets a function that can link to the Handbook for a course. 
+// If this isn't set, the "Link to handbook" will not be shown on course pages
+setHandbookUrl((code) => `https://handbook.une.edu.au/courses/2022/${code}?year=2022`)
+
+addCourses([
+  
+  {
+    code: "BCOMP(2024)",
+    name: "Bachelor of Computer Science 2024 draft",
+    structure: [
+
+      {
+        name: "Core CS",
+        units: [
+          "AMTH140", "COSC110", "COSC120", "COSC130",
+          "COSC210", "COSC220", "COSC230", "COSC240",
+          "COSC310", "COSC320"
+        ]
+      },
+
+      {
+        name: "Software Development major",
+        units: [
+          or("MTHS120", "STAT100"),
+          choose(6, "COSC101", "COSC250", "COSC260", "COSC330", "COSC340", "COSC350", "COSC360", "COSC370", "COSC484")
+        ]
+      },
+      {
+        name: "Data Science major",
+        units: [
+          "MTHS120", "STAT100", "STAT210", 
+          choose(1, "COSC102", "MTHS130", "MATH260", "COSC250"),
+          choose(3, "COSC330", "COSC350", "COSC380", "STAT320", "STAT330")
+        ]
+      },
+
+      {
+        name: "Cybersecurity major",
+        units: [
+          "STAT100", 
+          choose(1, "COSC101", "COSC102", "MTHS120"),
+          "COSC340", "COSC350", "COSC372",
+          choose(2, "COSC481", "COSC482", "COSC483", "COSC484")
+        ]
+      },
+
+      {
+        name: "Artificial Intelligence major",
+        units: [
+          "MTHS120", "STAT100",
+          choose(2, "COSC102", "COSC250", "MATH260"),
+          choose(3, "COSC331", "COSC350", "COSC351", "COSC352", "COSC380", "COSC483")
+        ]
+      },
+
+      {
+        name: "Preparatory Minor",
+        units: [
+          choose(4, "MTHS100", "MTHS110", "ICT100", "ICT101", "MM105")
+        ]
+      },
+
+      {
+        name: "Computational Science Minor",
+        units: [
+          choose(4, "MTHS120", "MTHS130", "AMTH250", "MATH260", "SCI310")
+        ]
+      },
+
+
+      {
+        name: "Elective space (or second major / minors)",
+        units: [
+          "Elective", "Elective", "Elective", "Elective", "Elective", "Elective", "Elective"
+        ]
+      },
+
+    ],
+    plans: {
+      "Full-time, T1 start": [
+        { name: "Y1 Trimester 1", units: [ "COSC101", "COSC110", "MTHS120", or("ICT101", "Elective") ] },
+        { name: "Y1 Trimester 2", units: [ "AMTH140", "COSC102", "COSC120", or("STAT100", "MTHS130") ] },
+        { name: "Y2 Trimester 1", units: [ "COSC210", "COSC230", or("COSC250", "Elective"), "Elective" ] },
+        { name: "Y2 Trimester 2", units: [ "COSC220", "COSC240", or("COSC260", "Elective"), "Elective" ] },
+        { name: "Y3 Trimester 1", units: [ "COSC310", choose(3, "COSC340", "COSC370", "Elective", "Elective") ] },
+        { name: "Y3 Trimester 2", units: [ "COSC320", choose(3, "COSC330", "COSC350", "COSC360", "Elective") ] },
+      ]
+    }
+  },
+
+  {
+    code: "DIT",
+    name: "Diploma in Information Technology",
+    structure: [
+      {
+        name: "Core",
+        units: [ "ICT101", "COSC110", "COSC130", or("ICT100", "COSC120"), or("COSC101", "COSC102") ]
+      },
+      {
+        name: "Listed",
+        units: [ choose(3, "AMTH140", "AMTH250", "MTHS100", "MTHS120", "STAT100", "STAT210", "SCI210",
+          "COSC101", "COSC102",
+          "COSC210", "COSC220", "COSC230", "COSC240", "COSC250", "COSC260",
+          "MM105") ]
+      }
+    ],
+    plans: {
+      "Full-time, T3 start": [
+        { name: "Y1 Trimester 3", units: [ "ICT100", "ICT101" ] },
+        { name: "Y1 Trimester 1", units: [ "COSC110", "MTHS110", "COSC101" ] },
+        { name: "Y1 Trimester 2", units: [ "AMTH140", "STAT100", "COSC102" ] },
+      ]
+    }
+  },
+
+  
+    {
+      code: "BCOMP(SD)",
+      name: "Bachelor of Computer Science (Software Development)",
+      structure: [
+        {
+          name: "Core",
+          units: [
+            "AMTH140", "MTHS120", or("MTHS130", "STAT100"),
+            "COSC110",
+            or("COSC101", "COSC102"), "COSC120",
+            "COSC210", "COSC220", "COSC230", "COSC240",
+            "COSC310", "COSC320"
+          ]
+        },
+
+        {
+          name: "Software Development major",
+          units: [
+            choose(5, "COSC250", "COSC260", "COSC330", "COSC340", "COSC350", "COSC360", "COSC370")
+          ]
+        },
+
+        {
+          name: "Listed & Elective",
+          units: [ 
+            choose(5, 
+              "ICT100", "ICT101", "COSC301", "COSC372", "COSC380",
+              "Listed elective", "Listed elective", "Listed elective", "Listed elective", "Listed elective"
+            ),
+            "Elective", "Elective"
+          ]
+        }
+      ],
+      plans: {
+        "Full-time, T1 start": [
+          { name: "Y1 Trimester 1", units: [ "COSC101", "COSC110", "MTHS120", "Elective" ] },
+          { name: "Y1 Trimester 2", units: [ "AMTH140", "COSC102", "COSC120", or("STAT100", "MTHS130") ] },
+          { name: "Y2 Trimester 1", units: [ "COSC210", "COSC230", "COSC250", "Elective" ] },
+          { name: "Y2 Trimester 2", units: [ "COSC220", "COSC240", "COSC260", "Listed Elective" ] },
+          { name: "Y3 Trimester 1", units: [ "COSC310", "COSC340", "COSC370", "Listed Elective" ] },
+          { name: "Y3 Trimester 2", units: [ "COSC320", "COSC330", "COSC350", "COSC360" ] },
+        ]
+      }
+    },
+
+    {
+      code: "BCOMP single major sd (ACS diagram)",
+      name: "Bachelor of Computer Science",
+      structure: [
+        {
+          name: "Core",
+          units: [
+            "AMTH140", "MTHS120", or("MTHS130", "STAT100"),
+            "COSC110",
+            or("COSC101", "COSC102"), "COSC120",
+            "COSC210", "COSC220", "COSC230", "COSC240",
+            "COSC310", "COSC320"
+          ]
+        },
+
+        {
+          name: "Major",
+          units: [
+            choose(5, "Prescribed 300-level", "Prescribed 300-level", "Prescribed 300-level", "Prescribed 300-level", "Prescribed 300-level", "Prescribed", "Prescribed")
+          ]
+        },
+
+        {
+          name: "Listed & Elective",
+          units: [ 
+            choose(5, 
+              "Listed", "Listed", "Listed", "Listed", "Listed",
+            ),
+            choose(2, 
+              "Elective", "Elective"
+            )
+          ]
+        }
+      ],
+      plans: {
+        "Full-time, T1 start": [
+          { name: "Y1 Trimester 1", units: [ or("COSC101", "Elective"), "COSC110", "MTHS120", "Elective", ] },
+          { name: "Y1 Trimester 2", units: [ or("COSC102", "Elective"), "AMTH140", "COSC120", or("STAT100", "MTHS130"),   ] },
+          { name: "Y2 Trimester 1", units: [ "COSC210", "COSC230", "Listed", "Listed" ] },
+          { name: "Y2 Trimester 2", units: [ "COSC240", "COSC220", "Prescribed", "Listed" ] },
+          { name: "Y3 Trimester 1", units: [ "COSC310", "Prescribed 300-level", "Prescribed 300-level", "Listed" ] },
+          { name: "Y3 Trimester 2", units: [ "COSC320", "Prescribed 300-level", "Prescribed 300-level", "Listed", ] },
+        ]
+      }
+    },
+
+
+    {
+      code: "BCOMP single major (ACS diagram)",
+      name: "Bachelor of Computer Science",
+      structure: [
+        {
+          name: "Core",
+          units: [
+            "AMTH140", "MTHS120", or("MTHS130", "STAT100"),
+            "COSC110",
+            or("COSC101", "COSC102"), "COSC120",
+            "COSC210", "COSC220", "COSC230", "COSC240",
+            "COSC310", "COSC320"
+          ]
+        },
+
+        {
+          name: "Major",
+          units: [
+            choose(5, "Prescribed 300-level", "Prescribed 300-level", "Prescribed 300-level", "Prescribed 300-level", "Prescribed 300-level", "Prescribed", "Prescribed")
+          ]
+        },
+
+        {
+          name: "Listed & Elective",
+          units: [ 
+            choose(5, 
+              "Listed", "Listed", "Listed", "Listed", "Listed 300-level COSC",
+            ),
+            choose(2, 
+              "Elective", "Elective"
+            )
+          ]
+        }
+      ],
+      plans: {
+        "Full-time, T1 start": [
+          { name: "Y1 Trimester 1", units: [ or("COSC101", "Elective"), "COSC110", "MTHS120", "Elective", ] },
+          { name: "Y1 Trimester 2", units: [ or("COSC102", "Elective"), "AMTH140", "COSC120", or("STAT100", "MTHS130"),   ] },
+          { name: "Y2 Trimester 1", units: [ "COSC210", "COSC230", "Listed", "Listed" ] },
+          { name: "Y2 Trimester 2", units: [ "COSC240", "COSC220", "Prescribed", "Listed" ] },
+          { name: "Y3 Trimester 1", units: [ "COSC310", "Prescribed 300-level", "Prescribed", "Listed" ] },
+          { name: "Y3 Trimester 2", units: [ "COSC320", "Prescribed 300-level", "Prescribed 300-level", "Listed 300-level COSC", ] },
+        ]
+      }
+    },
+
+    {
+      code: "BCOMP(DS)",
+      name: "Bachelor of Computer Science (Data Science)",
+      structure: [
+        {
+          name: "Core",
+          units: [
+            "AMTH140", "MTHS120", "STAT100",
+            "COSC110",
+            or("COSC101", "COSC102"), "COSC120",
+            "COSC210", "COSC220", "COSC230", "COSC240",
+            "COSC310", "COSC320"
+          ]
+        },
+
+        {
+          name: "Data Science major",
+          units: [
+            choose(5, "STAT210", "STAT330", "COSC250", "COSC330", "COSC350", "COSC380")
+          ]
+        },
+
+        {
+          name: "Listed & Elective",
+          units: [ 
+            choose(5,
+              "ICT100", "ICT101", "COSC260", "COSC301", "COSC340", "COSC360", "COSC370", "COSC372",
+              "Listed elective", "Listed elective", "Listed elective", "Listed elective", "Listed elective"
+            ),
+            "Elective", "Elective"
+          ]
+        }
+
+      ],
+      plans: {
+        "Full-time, T1 start": [
+          { name: "Y1 Trimester 1", units: [ "COSC101", "COSC110", "MTHS120", "Elective" ] },
+          { name: "Y1 Trimester 2", units: [ "AMTH140", "COSC102", "COSC120", "STAT100" ] },
+          { name: "Y2 Trimester 1", units: [ "COSC210", "COSC230", "COSC250", "STAT210" ] },
+          { name: "Y2 Trimester 2", units: [ "COSC220", "COSC240", "Listed Elective", "Elective" ] },
+          { name: "Y3 Trimester 1", units: [ "COSC310", "STAT330", "Listed Elective", "Listed Elective" ] },
+          { name: "Y3 Trimester 2", units: [ "COSC320", "COSC330", "COSC350", "COSC380" ] },
+        ]
+      }
+    },
+
+    {
+      code: "BCOMP(dbl)",
+      name: "Bachelor of Computer Science (Software Development & Data Science)",
+      structure: [
+        {
+          name: "Core",
+          units: [
+            "AMTH140", "MTHS120", "STAT100",
+            "COSC110",
+            or("COSC101", "COSC102"), "COSC120",
+            "COSC210", "COSC220", "COSC230", "COSC240",
+            "COSC310", "COSC320"
+          ]
+        },
+
+        {
+          name: "Data Science major",
+          units: [
+            "STAT210", "STAT330", "COSC250", "COSC350", "COSC380"
+          ]
+        },
+
+        {
+          name: "Software Development major",
+          units: [
+            "COSC260", "COSC330", "COSC340", "COSC360", "COSC370"
+          ]
+        },
+
+        {
+          name: "Listed & Elective",
+          units: [ 
+            "Elective", "Elective"
+          ]
+        }
+
+      ],
+      plans: {
+        "Full-time, T1 start": [
+          { name: "Y1 Trimester 1", units: [  "COSC110", "MTHS120", "Elective", or("COSC101", "Elective") ] },
+          { name: "Y1 Trimester 2", units: [ "AMTH140", "COSC120", "STAT100", or("COSC102", "Elective") ] },
+          { name: "Y2 Trimester 1", units: [ "COSC210", "COSC230", "COSC250", "STAT210" ] },
+          { name: "Y2 Trimester 2", units: [ "COSC220", "COSC240", "COSC260", "COSC350" ] },
+          { name: "Y3 Trimester 1", units: [ "COSC310", "COSC340", "COSC370", "STAT330" ] },
+          { name: "Y3 Trimester 2", units: [ "COSC320", "COSC330", "COSC360", "COSC380" ] },
+        ]
+      }
+    },
+
+    {
+      code: "BCSLAW",
+      name: "Bachelor of Computer Science / Bacherlor of Laws",
+      structure: [
+        {
+          name: "Computer Science Core",
+          units: [
+            "AMTH140",
+            "COSC101", "COSC110", "COSC120", "COSC210", "COSC220", "COSC230", "COSC240", "COSC310", "COSC320",
+            or("MTHS120", "STAT100")
+          ]
+        },
+        {
+          name: "Computer Science Listed",
+          units: [
+            choose(5, "COSC250", "COSC260", "COSC301", "COSC330", "COSC340", "COSC350", "COSC360", "COSC370", "COSC380", "STAT210", "STAT330")
+          ]
+        },
+        {
+          name: "Law component",
+          units: [
+            "Law unit", "Law unit", "Law unit", "Law unit", "Law unit", "Law unit", "Law unit", "Law unit", "Law unit", "Law unit", 
+            "Law unit", "Law unit", "Law unit", "Law unit", "Law unit", "Law unit", 
+          ]
+        }
+      ],
+      plans: {
+        "Full-time, T1 start": [
+          { name: "Y1 Trimester 1", units: [ "COSC110", "COSC101", "Law unit", "Law unit" ] },
+          { name: "Y1 Trimester 2", units: [ "AMTH140", "COSC120", "Law unit", or("MTHS120", "STAT100") ] },
+          { name: "Y2 Trimester 1", units: [ "COSC210", "COSC230", "Law unit", choose(1, "COSC250", "STAT210") ] },
+          { name: "Y2 Trimester 2", units: [ "COSC220", "COSC240", "Law unit", "COSC260" ] },
+          { name: "Y3 Trimester 1", units: [ "COSC310", "Law unit", choose(2, "COSC340", "COSC370", "STAT330") ] },
+          { name: "Y3 Trimester 2", units: [ "COSC320", "Law unit", "Law unit", choose(1, "COSC330", "COSC350", "COSC360", "COSC380") ] },
+          { name: "Y4 Trimester 1", units: [ "Law unit", "Law unit", "Law unit", "Law unit",  ] },
+          { name: "Y4 Trimester 2", units: [ "Law unit", "Law unit", "Law unit", "Law unit",  ] },
+          { name: "Y5 Trimester 1", units: [ "Law unit", "Law unit", "Law unit", "Law unit",  ] },
+          { name: "Y5 Trimester 2", units: [ "Law unit", "Law unit", "Law unit", "Law unit",  ] },
+        ]
+      }
+    },
+
+
+    {
+      code: "MIT",
+      name: "Master of Information Technology",
+      structure: [
+        {
+          name: "Core",
+          units: [
+            "COSC101", "COSC110", "COSC120", "COSC210", "COSC220", "COSC260", "COSC510", "COSC560", "COSC570"
+          ]
+        },
+        {
+          name: "Research and Capstone",
+          units: [
+            "COSC594", "COSC595"
+          ]
+        },
+        {
+          name: "Listed group 1",
+          units: [
+            choose(3, "COSC530", "COSC540", "COSC550", "COSC572")
+          ]
+        },
+        {
+          name: "Listed group 2",
+          units: [
+            choose(2,
+              "AMTH250", "COSC240", "COSC250", "SCI410", 
+              "COSC530", "COSC540", "COSC550", "COSC572", "Listed elective", "Listed elective"
+            )
+          ]
+        }
+      ],
+      plans: {
+        "Full-time, T1 start": [
+          { name: "Y1 Trimester 1", units: [ "COSC101", "COSC110", "COSC120", "COSC210" ] },
+          { name: "Y1 Trimester 2", units: [ "COSC220", "COSC260", "COSC572", "Listed elective" ] },
+          { name: "Y2 Trimester 1", units: [ "COSC510", "COSC540", "COSC570", "COSC594" ] },
+          { name: "Y2 Trimester 2", units: [ "COSC240", "COSC550", "COSC560", "COSC595" ] },
+        ]
+      }
+    },
+
+    {
+      code: "MDSC",
+      name: "Master of Data Science",
+      structure: [
+        {
+          name: "Core",
+          units: [
+            "COSC110", "COSC210", "COSC510", "COSC550", "COSC572", "COSC580", "MTHS120", "SCI410", 
+            "STAT100", or("STAT210", "STAT410"), "STAT430"
+          ]
+        },
+        {
+          name: "Research and Capstone",
+          units: [
+            "COSC591", "SCI501"
+          ]
+        },
+        {
+          name: "Listed units",
+          units: [
+            choose(3, "AMTH250", "COSC230", "COSC250", "COSC240", "COSC260", "COSC530", "COSC540", "COSC560", "COSC570", "STAT420",
+              "Listed elective", "Listed elective", "Listed elective")
+          ]
+        }
+      ],
+      plans: {
+        "Full-time, T1 start": [
+          { name: "Y1 Trimester 1", units: [ "COSC110", "COSC210", "COSC510", "SCI410" ] },
+          { name: "Y1 Trimester 2", units: [ "STAT100", "MTHS120", "COSC572", "Listed elective" ] },
+          { name: "Y2 Trimester 1", units: [ "STAT210", "STAT430", "Listed elective", "Listed elective" ] },
+          { name: "Y2 Trimester 2", units: [ "COSC550", "COSC580", "SCI501", "COSC591" ] },
+        ]
+      }
+    },
+
+    {
+      code: "MDSC",
+      name: "Master of Data Science",
+      structure: [
+        {
+          name: "Core",
+          units: [
+            "COSC110", "COSC210", "COSC510", "COSC550", "COSC572", "COSC580", "MTHS120", "SCI410", 
+            "STAT100", or("STAT210", "STAT410"), "STAT430"
+          ]
+        },
+        {
+          name: "Research and Capstone",
+          units: [
+            "COSC591", "SCI501"
+          ]
+        },
+        {
+          name: "Listed units",
+          units: [
+            choose(3, "Listed 500-level", "Listed 500-level", "Listed")
+          ]
+        }
+      ],
+      plans: {
+        "Full-time, T1 start": [
+          { name: "Y1 Trimester 1", units: [ "SCI410", "COSC110", "COSC210", "COSC510",  ] },
+          { name: "Y1 Trimester 2", units: [ "MTHS120", "COSC572", "STAT100", "Listed" ] },
+          { name: "Y2 Trimester 1", units: [ or("STAT210", "STAT410"), "STAT430", "Listed 500-level", "Listed 500-level" ] },
+          { name: "Y2 Trimester 2", units: ["COSC591", "SCI501", "COSC580", "COSC550",   ] },
+        ]
+      }
+    },
+
+
+    {
+      code: "MIT(ACS diagram)",
+      name: "Master of Information Technology",
+      structure: [
+        {
+          name: "Core",
+          units: [
+            "COSC101", "COSC110", "COSC120", "COSC210", "COSC220", "COSC260", "COSC510", "COSC560", "COSC570"
+          ]
+        },
+        {
+          name: "Research and Capstone",
+          units: [
+            "COSC594", "COSC595"
+          ]
+        },
+        {
+          name: "Listed group 1",
+          units: [
+            choose(3, "COSC530", "COSC540", "COSC550", "COSC572")
+          ]
+        },
+        {
+          name: "Listed group 2",
+          units: [
+            choose(2,
+              "AMTH250", "COSC240", "COSC250", "SCI410", 
+              "COSC530", "COSC540", "COSC550", "COSC572", "Listed elective", "Listed elective"
+            )
+          ]
+        }
+      ],
+      plans: {
+        "Full-time, T1 start": [
+          { name: "Y1 Trimester 1", units: [ "COSC101", "COSC110", "COSC120", "COSC210" ] },
+          { name: "Y1 Trimester 2", units: [ "COSC220", "COSC260", "Listed Group 1", "Listed Group 2" ] },
+          { name: "Y2 Trimester 1", units: [ "COSC510", "Listed Group 1", "COSC570",    "COSC594",] },
+          { name: "Y2 Trimester 2", units: [  "COSC560",  "Listed Group 2", "Listed Group 1", "COSC595",] },
+        ]
+      }
+    },
+
+
+
+])
+
+// Top 3 for BCOMP
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.Ethics, ["COSC110", "COSC310", "COSC320"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.ProfExpectations, ["COSC110", "COSC220", "COSC320"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.Teamwork, ["COSC101", "COSC102", "COSC220", "COSC320"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.Communication, ["COSC101", "COSC102", "COSC220", "COSC320"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.Societal, ["COSC110", "COSC210", "COSC240"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.Understanding, ["COSC110", "COSC220", "COSC240"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.ProblemSolving, ["COSC101", "COSC102", "COSC220", "COSC320"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.Fundamentals, ["COSC110", "COSC230", "COSC240"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.Data, ["COSC210", "COSC220", "STAT100"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.Networking, ["COSC210", "COSC220", "COSC240"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.HumanFactors, ["COSC101", "COSC102", "COSC220"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.Programming, ["COSC110", "COSC120", "COSC230"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.Systems, ["COSC210", "COSC220", "COSC310"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.Governance, ["COSC310"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.ProjectManagement, ["COSC220", "COSC310", "COSC320"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.ServiceManagement, ["COSC220"])
+limitCBOK([ "BCOMP(SD)", "BCOMP(DS)", "BCOMP(dbl)", "BCSLAW" ], cbok.Cybersecurity, ["AMTH140", "COSC210", "COSC240"])
+
+// Top 3 for MIT
+limitCBOK([ "MIT" ], cbok.Ethics, ["COSC110", "COSC510", "COSC594", "COSC595"])
+limitCBOK([ "MIT" ], cbok.ProfExpectations, ["COSC110", "COSC220", "COSC594", "COSC595"])
+limitCBOK([ "MIT" ], cbok.Teamwork, ["COSC101", "COSC220", "COSC594", "COSC595"])
+limitCBOK([ "MIT" ], cbok.Communication, ["COSC220", "COSC570", "COSC594", "COSC595"])
+limitCBOK([ "MIT" ], cbok.Societal, ["COSC110", "COSC210", "COSC570"])
+limitCBOK([ "MIT" ], cbok.Understanding, ["COSC110", "COSC220", "COSC594", "COSC595"])
+limitCBOK([ "MIT" ], cbok.ProblemSolving, ["COSC101", "COSC102", "COSC220", "COSC594", "COSC595"])
+limitCBOK([ "MIT" ], cbok.Fundamentals, ["COSC110" ])
+limitCBOK([ "MIT" ], cbok.Data, ["COSC210", "COSC220", "STAT100"])
+limitCBOK([ "MIT" ], cbok.Networking, ["COSC210", "COSC260", "COSC560"])
+limitCBOK([ "MIT" ], cbok.HumanFactors, ["COSC101", "COSC510", "COSC570"])
+limitCBOK([ "MIT" ], cbok.Programming, ["COSC110", "COSC120", "COSC560"])
+limitCBOK([ "MIT" ], cbok.Systems, ["COSC210", "COSC220", "COSC510"])
+limitCBOK([ "MIT" ], cbok.Governance, ["COSC510"])
+limitCBOK([ "MIT" ], cbok.ProjectManagement, ["COSC220", "COSC510", "COSC594", "COSC595"])
+limitCBOK([ "MIT" ], cbok.ServiceManagement, ["COSC220"])
+limitCBOK([ "MIT" ], cbok.Cybersecurity, ["COSC210", "COSC260", "COSC560"])
+
+// Top 3 for MIT
+limitCBOK([ "MDSC" ], cbok.Ethics, ["COSC110", "COSC510", "COSC591"])
+limitCBOK([ "MDSC" ], cbok.ProfExpectations, ["COSC110", "COSC510", "COSC591" ])
+limitCBOK([ "MDSC" ], cbok.Teamwork, ["COSC110", "COSC510", "COSC591", "SCI501"])
+limitCBOK([ "MDSC" ], cbok.Communication, ["COSC110", "COSC510", "COSC591"])
+limitCBOK([ "MDSC" ], cbok.Societal, ["COSC110", "COSC210", "COSC572"])
+limitCBOK([ "MDSC" ], cbok.Understanding, ["COSC110", "COSC572", "COSC591"])
+limitCBOK([ "MDSC" ], cbok.ProblemSolving, [ "COSC210", "COSC550", "COSC591", "SCI501"])
+limitCBOK([ "MDSC" ], cbok.Fundamentals, ["COSC110" ])
+limitCBOK([ "MDSC" ], cbok.Data, ["COSC210", "COSC572", "STAT430"])
+limitCBOK([ "MDSC" ], cbok.Networking, ["COSC210", "COSC572"])
+limitCBOK([ "MDSC" ], cbok.HumanFactors, ["COSC101", "COSC510", "COSC572"])
+limitCBOK([ "MDSC" ], cbok.Programming, ["COSC110", "COSC580", "SCI410"])
+limitCBOK([ "MDSC" ], cbok.Systems, ["COSC210", "COSC572", "COSC510"])
+limitCBOK([ "MDSC" ], cbok.Governance, ["COSC510"])
+limitCBOK([ "MDSC" ], cbok.ProjectManagement, ["COSC510", "COSC591", "COSC572"])
+limitCBOK([ "MDSC" ], cbok.ServiceManagement, ["COSC572"])
+limitCBOK([ "MDSC" ], cbok.Cybersecurity, ["COSC210", "COSC572" ])
+
+// limits for the DIT, though these are moot (not accredited)
+limitCBOK([ "DIT" ], cbok.Ethics, [ "ICT100", "COSC110", "COSC220"])
+limitCBOK([ "DIT" ], cbok.ProfExpectations, [ "COSC110", "COSC220"])
+limitCBOK([ "DIT" ], cbok.Teamwork, [ "COSC110", "COSC101", "COSC102", "COSC220"])
+limitCBOK([ "DIT" ], cbok.Communication, [ "COSC101", "COSC102", "MM105"])
+limitCBOK([ "DIT" ], cbok.Societal, ["ICT100", "COSC110", "COSC210"])
+limitCBOK([ "DIT" ], cbok.Understanding, [ "ICT101", "COSC110", "COSC220"])
+limitCBOK([ "DIT" ], cbok.ProblemSolving, [ "ICT100", "COSC120", "COSC101", "COSC102"])
+limitCBOK([ "DIT" ], cbok.Fundamentals, ["ICT101", "COSC110", "COSC240"])
+limitCBOK([ "DIT" ], cbok.Data, [ "ICT101", "COSC102", "COSC210"])
+limitCBOK([ "DIT" ], cbok.Networking, [ "COSC101", "COSC210", "COSC240"])
+limitCBOK([ "DIT" ], cbok.HumanFactors, ["COSC101", "COSC102", "ICT100"])
+limitCBOK([ "DIT" ], cbok.Programming, ["ICT100", "COSC110", "COSC120" ])
+limitCBOK([ "DIT" ], cbok.Systems, ["COSC210", "COSC220", "COSC260"])
+limitCBOK([ "DIT" ], cbok.Governance, [ "ICT100 "])
+limitCBOK([ "DIT" ], cbok.ProjectManagement, ["COSC220" ])
+limitCBOK([ "DIT" ], cbok.ServiceManagement, ["COSC220"])
+limitCBOK([ "DIT" ], cbok.Cybersecurity, ["COSC210", "COSC240", "COSC260"])
diff --git a/home.js b/home.js
new file mode 100644
index 0000000..0155fa9
--- /dev/null
+++ b/home.js
@@ -0,0 +1,59 @@
+/**
+ * This contains the Markdown text for the homepage. 
+ * 
+ * It's done as a js file rather than raw md so that it will still work if loaded from a file:// url
+ * (If index.html is loaded from file:// then Chrome will regard the origin as null and dom.fetch would
+ * refuse to access .md file content. Instead, we load it as a script from a script tag)
+ */
+
+let text = `
+### Lightweight mappings for CBoK, SWEBOK, DSBOK, and Identity Verification
+
+*(Micro edition!)*
+
+This site generates mappings and tabulations of various mappings for our courses. The rationale is described in 
+
+> Billingsley, W. (2022). Lightweight Mapping of Identify Verification Methods and Secondary Course Aspects: “Swiss Cheese” Modelling.
+> In S. Wilson, N. Arthars, D.Wardak, P. Yeoman, E. Kalman, & D.Y.T. Liu (Eds.), Reconnecting relationships through technology. 
+> *Proceedings of the 39thInternational Conference on Innovation, Practice and Research in the Use of Educational Technologies in Tertiary Education, ASCILITE 2022 in Sydney*: 
+> e22199. [https://doi.org/10.14742/apubs.2022.199](https://doi.org/10.14742/apubs.2022.199)
+
+The navigation in the left sidebar provides tables for each course, as well as a short
+summary of this information for each unit.
+
+### Minimal repository
+
+This is the minimal repository. (Apart from README, .gitignore, etc) it contains just four files: just HTML to load the site
+and the JS definitions of the units and courses you want mapped.
+
+The category definitions (e.g. what is in CBoK) and the rendering framework are loaded from 
+http://tweaked.info/lightweight-mappings-site/
+
+Whose source is defined in
+https://github.com/tweakedinfo/lightweight-mappings-site
+
+## Editing courses, units, and this page
+
+The site is generated from a minimal amount of additional information about units and courses.
+The text of this homepage is set in
+
+* [home.js](home.js)
+
+The bespoke data for this site can be found in:
+* [units.js](units.js)
+* [courses.js](courses.js)
+
+To edit the tables, edit those files and hit refresh.
+
+The entries in those files are *intentionally sparse* - we are not aiming to reproduce the
+course handbook here, only to generate the additional mappings required for ACS.
+
+A small amount of duplication of content is necessary - for instance, the code files need
+the pre-requisites (and course structures) in order to generate the tables.
+
+If a unit or a course hasn't loaded, maybe check the console log for errors (F12).
+Or, we might not have written it into units.js or courses.js yet.
+
+`
+
+setHomePage(text)
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..ecc0f4f
--- /dev/null
+++ b/index.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Lightweight mappings for CS courses</title>
+
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+    <link href="https://fonts.googleapis.com/css2?family=Lato:wght@400;700&family=Tangerine:wght@400;700&family=WindSong:wght@400;500&display=swap" rel="stylesheet">
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
+    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
+    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
+    <link rel="stylesheet" href="https://tweakedinfo.github.io/lightweight-mappings-site/veautiful-docs.css" rel="stylesheet">
+
+</head>
+<body>
+
+<div id="render-here">
+    <p>Loading. Built with Veautiful.</p>
+</div>
+
+    <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
+
+    <!-- Location deployed to by CI -->
+    <script type="text/javascript" src="https://tweakedinfo.github.io/lightweight-mappings-site/deployscripts/compiled.js"></script>
+
+    <!-- Load the courses, units, and homepage text -->
+    <script type="text/javascript" src="./units.js"></script>
+    <script type="text/javascript" src="./courses.js"></script>
+    <script type="text/javascript" src="./home.js"></script>
+
+    <script>
+        document.documentElement.style.zoom = 1
+        ITICSESite.main()
+    </script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/units.js b/units.js
new file mode 100644
index 0000000..dca439d
--- /dev/null
+++ b/units.js
@@ -0,0 +1,1019 @@
+"use strict";
+
+console.log("Loading units")
+
+addUnits([
+    {
+      code: "AMTH140",
+      name: "Discrete Mathematics",
+      prereq: [],
+      cbok: [ problemSolving(2), understanding(1), fundamentals(2), cybersecurity(1) ],
+      sfia: [],
+      dsbok: [ ccdsc.CCF, ccdsc.PDA,
+        edison.SDMA, // Discrete Mathematics is KU1.01.12 within this category
+        edison.SEC, // Cryptography
+      ],
+      swebok: [swebok.MathFoundations ],
+      other: [ ]
+    },
+
+
+    {
+      code: "AMTH246",
+      name: "Mathematical Methods in the Sciences",
+      prereq: [ "PMTH212" ],
+      cbok: [ programming(1) ], sfia: [],
+      dsbok: [ 
+        ccdsc.PDA,
+        edison.SMDA, // KU1.01.14 Mathematical software and tools (Matlab) 
+      ],
+      other: [ idverify.ProctoredExam ]
+    },
+
+    {
+      code: "AMTH250",
+      name: "Introduction to Programming in the Sciences",
+      prereq: [ or("MTHS120", "MTHS130")],
+      cbok: [ programming(1) ], sfia: [],
+      dsbok: [ 
+        ccdsc.PDA,
+        edison.SMDA, // KU1.01.14 Mathematical software and tools (Matlab) 
+      ],
+      other: [ idverify.ProctoredExam ]
+    },
+
+    {
+      code: "SCI210",
+      name: "Introduction to Scientific Programming",
+      prereq: [ choose(1, "MTHS110", "MTHS120", "MTHS130")],
+      cbok: [ programming(1) ], sfia: [],
+      dsbok: [ ccdsc.AP, 
+        edison.SDMA, // KU1.01.14 Mathematical software and tools (Matlab) 
+      ],
+      other: [ idverify.ProctoredExam ]
+    },
+
+    {
+      code: "MTHS100",
+      name: "Introduction to Quantitative Skills",
+      prereq: [], cbok: [ ], 
+      swebok: [ swebok.MathFoundations ],
+      sfia: [], 
+      other: [ idverify.ProctoredExam ]
+    },
+
+    {
+      code: "MTHS110",
+      name: "Quantitative Skills with Applications",
+      prereq: [], cbok: [ ], 
+      swebok: [ swebok.MathFoundations ],
+      sfia: [], 
+      other: [ idverify.ProctoredExam ]
+    },
+
+
+    {
+      code: "MTHS120",
+      name: "Calculus & Linear Algebra 1",
+      prereq: [], cbok: [ ], 
+      swebok: [ swebok.MathFoundations ],
+      dsbok: [ ccdsc.AP, edison.SMDA ],
+      sfia: [],
+      other: [ idverify.ProctoredExam ]
+    },
+
+    {
+      code: "MTHS130",
+      name: "Calculus & Linear Algebra 2",
+      prereq: [ "MTHS120" ], cbok: [ ], 
+      swebok: [ swebok.MathFoundations ],
+      dsbok: [ ccdsc.AP, edison.SMDA ],
+      sfia: [],
+      other: [ idverify.ProctoredExam ]
+    },
+
+    {
+      code: "PMTH212",
+      name: "Multivariable Calculus",
+      prereq: [ "MTHS120", "MTHS130" ], cbok: [ ], sfia: [],
+      dsbok: [ ccdsc.AP, edison.SMDA ],
+      other: [ ]
+    },
+
+
+    {
+      code: "PMTH213",
+      name: "Linear Algebra",
+      prereq: [ "MTHS120", "MTHS130" ], cbok: [ ], sfia: [],
+      dsbok: [ ccdsc.AP, edison.SMDA ],
+      other: [ ]
+    },
+
+    {
+      code: "MM105",
+      name: "Communication for Business",
+      prereq: [ ], cbok: [ communication(1) ], sfia: [], 
+      other: [ idverify.TurnItIn ]
+    },
+
+    {
+      code: "MM203",
+      name: "Management Practices in Responsible Organisations",
+      prereq: [ ], cbok: [ communication(1), teamwork(1) ], sfia: [],
+      other: [ idverify.TurnItIn, idverify.ProctoredExam ]
+    },
+
+
+    {
+      code: "STAT100",
+      name: "Introduction to Statistical Modelling",
+      prereq: [], cbok: [ data(2) ], 
+      swebok: [ swebok.MathFoundations, swebok.EngFoundations ],
+      dsbok: [ ccdsc.AP, edison.SMDA ],
+      sfia: [],
+      other: [ idverify.PersonalisedAssessment, idverify.TurnItIn ] 
+    },
+
+    {
+      code: "STAT210",
+      name: "Statistical Modelling & Experimental Design",
+      prereq: [ choose(1, "STAT100", "AMTH250", "SCI210") ],
+      cbok: [ data(2) ], sfia: [], 
+      swebok: [ swebok.MathFoundations, swebok.EngFoundations ],
+      dsbok: [ ccdsc.AP, ccdsc.DM, 
+        edison.SMDA,
+        edison.ML, // KU1.01.02 Regression
+        edison.RM,
+        edison.DM,
+        edison.DSDA, 
+      ],
+      other: [ idverify.PersonalisedAssessment, idverify.TurnItIn ]
+    },
+
+    {
+      code: "STAT410",
+      name: "Statistical Modelling & Experimental Design",
+      prereq: [ "candidature in a pg award" ],
+      cbok: [ data(2) ], sfia: [], 
+      dsbok: [ ccdsc.AP, ccdsc.DM, 
+        edison.SMDA, 
+        edison.ML, // KU1.01.02 Regression
+        edison.RM,
+        edison.DM,
+        edison.DSDA, 
+      ],
+      other: [ idverify.PersonalisedAssessment, idverify.TurnItIn ]
+    },
+
+    {
+      code: "STAT420",
+      name: "Advanced Statistical Modelling",
+      prereq: [ "candidature in a pg award" ],
+      cbok: [ data(2) ], sfia: [], 
+      dsbok: [ ccdsc.AP, ccdsc.DM, 
+        edison.SMDA, 
+        edison.RM,
+        edison.DM,
+        edison.MODSIM,
+      ],
+      other: [ idverify.PersonalisedAssessment, idverify.TurnItIn ]
+    },
+
+    {
+      code: "MATH260",
+      name: "Probability and Simulation",
+      prereq: [ "MTHS120", "MTHS130" ],
+      cbok: [ data(3) ], sfia: [], 
+      dsbok: [ ccdsc.AP, ccdsc.AI, 
+        edison.SDMA,
+        edison.ML, // KU1.01.05 Probabilistic reasoning 
+        edison.MODSIM,
+      ],
+      other: [ idverify.PersonalisedAssessment, idverify.TurnItIn ]
+    },
+
+    {
+      code: "STAT270",
+      name: "Inference",
+      prereq: [ "MATH260" ],
+      cbok: [ data(3) ], sfia: [], 
+      dsbok: [ ccdsc.AP, ccdsc.AI, 
+        edison.SDMA, 
+        edison.ML, // KU1.01.05 Probabilistic reasoning 
+      ],
+      other: [ idverify.TurnItIn ]
+    },
+
+    {
+      code: "STAT320",
+      name: "Advanced Statistical Modelling",
+      prereq: [ "STAT210" ],
+      cbok: [ data(3) ], sfia: [], 
+      dsbok: [ ccdsc.AP, ccdsc.AI, ccdsc.DM, 
+        edison.SDMA, 
+        edison.ML, // KU1.01.05 Probabilistic reasoning 
+        edison.MODSIM,
+      ],
+      other: [ idverify.TurnItIn ]
+    },
+
+    {
+      code: "STAT330",
+      name: "Statistical Learning",
+      prereq: [ "STAT210" ],
+      cbok: [ data(3) ], sfia: [], 
+      swebok: [ swebok.MathFoundations, swebok.EngFoundations, swebok.Construction ],
+      dsbok: [ ccdsc.AP, ccdsc.DM, ccdsc.ML, 
+        edison.SDMA, edison.ML, edison.DM
+      ],
+      tags: ["Advanced"], 
+      other: [ idverify.TurnItIn, idverify.Oral ]
+    },
+
+    {
+      code: "STAT430",
+      name: "Statistical Learning",
+      prereq: [ "STAT100", "candidature in MDatSci or pg award" ],
+      cbok: [ data(3) ], sfia: [], tags: ["Advanced"],
+      dsbok: [ ccdsc.AP, ccdsc.DM, ccdsc.ML, 
+        edison.SDMA, edison.ML, edison.DM
+      ],
+      other: [ idverify.TurnItIn, idverify.Oral ]
+    },
+
+
+    {
+      code: "SCI410",
+      name: "Introduction to Scientific Programming",
+      prereq: [ cp(96), "or enrolment in pg award" ],
+      cbok: [ programming(2), data(2) ], sfia: [], tags: ["Advanced"],
+      dsbok: [ ccdsc.AP, ccdsc.PDA, ccdsc.CCF, edison.SMDA ],
+      other: [ idverify.ProctoredExam ]
+    },
+
+
+    {
+      code: "SCI501",
+      name: "Special Topics in Science A",
+      prereq: [ cp(48), "permission of HoS"],
+      cbok: [ data(3), problemSolving(3) ], sfia: [],
+      dsbok: [ edison.RM ],
+      tags: [ "Advanced", "Capstone" ],
+      other: [ idverify.TurnItIn, idverify.Project, idverify.PersonalisedAssessment ]
+    },
+
+    {
+      code: "QM161",
+      name: "Business Statistics",
+      prereq: [], cbok: [ data(2) ], sfia: [],
+      dsbok: [ ccdsc.AP, edison.SDMA ],
+      other: [ idverify.ProctoredExam ]
+    },
+
+    {
+      code: "QM262",
+      name: "Introduction to Business Analytics",
+      prereq: [], cbok: [ data(2) ], sfia: [],
+      dsbok: [ ccdsc.AP, edison.SDMA ],
+      other: [ idverify.ProctoredExam ]
+    },
+
+    {
+      code: "ICT100",
+      name: "Computational Thinking",
+      prereq: [],
+      cbok: [ ethics(1), societal(1), humanFactors(1), problemSolving(1), programming(1) ],
+      swebok: [ swebok.MathFoundations, swebok.CompFoundations, swebok.EngFoundations, swebok.Construction ],
+      sfia: [],
+      dsbok: [ ccdsc.CCF, ccdsc.PDA,
+        edison.TDM, // text processing of Beatrix Potter in "Little Data"
+      ],
+      other: []
+    },
+
+    {
+      code: "ICT101",
+      name: "From Logic to Data Processing",
+      prereq: [],
+      cbok: [ fundamentals(1), understanding(1), data(1) ],
+      swebok: [ swebok.MathFoundations, swebok.CompFoundations ],
+      sfia: [],
+      dsbok: [ ccdsc.CCF ],
+      other: []
+    },
+
+    {
+      code: "COSC101",
+      name: "Software Development Studio 1",
+      prereq: [],
+      cbok: [ problemSolving(2), teamwork(2), communication(2), networking(1), humanFactors(1) ],
+      swebok: [ swebok.MathFoundations, swebok.CompFoundations, swebok.Construction, swebok.ProfPractice ],
+      sfia: [],
+      dsbok: [ ccdsc.CCF, ccdsc.AP, ccdsc.PDA, ccdsc.PR ],
+      other: [ idverify.GroupWork, idverify.Video ]
+    },
+
+    {
+      code: "COSC102",
+      name: "Data Science Studio 1",
+      prereq: [ choose(2, "COSC110", "STAT110") ],
+      cbok: [  programming(2), teamwork(2), communication(2), data(1),problemSolving(1)],
+      swebok: [ swebok.MathFoundations, swebok.CompFoundations, swebok.EngFoundations, swebok.ProfPractice  ],
+      sfia: [],
+      dsbok: [ 
+        ccdsc.CCF, ccdsc.AP, ccdsc.PDA, ccdsc.PR,
+        edison.DSDA,  
+      ],
+      other: [ idverify.GroupWork, idverify.Video ]
+    },
+
+
+    {
+      code: "COSC110",
+      name: "Introduction to Programming and the Unix Environment",
+      prereq: [],
+      cbok: [ ethics(1), expectations(1), teamwork(1), societal(2), understanding(1), communication(1), programming(2), fundamentals(1) ],
+      swebok: [ swebok.CompFoundations, swebok.Construction, swebok.Testing ],
+      sfia: [], 
+      dsbok: [ ccdsc.PDA, ccdsc.PR, ccdsc.CCF, ccdsc.SDM,
+        edison.DSAPPD, // KU2.06.05 Python
+
+      ],
+      other: [ idverify.ProctoredExam, idverify.TurnItIn, idverify.PersonalisedAssessment ]
+    },
+
+    {
+      code: "COSC120",
+      name: "Object Oriented Programming",
+      prereq: [ "COSC110" ],
+      cbok: [ programming(2), problemSolving(1) ],
+      swebok: [ swebok.Construction, swebok.Design, swebok.ModelsAndMethods ],
+      dsbok: [ ccdsc.PDA, ccdsc.CCF, ccdsc.SDM, 
+              
+      ],
+      sfia: [],
+      other: [ idverify.Video ]
+    },
+
+    {
+      code: "COSC210",
+      name: "Database Management Systems",
+      prereq: [ "COSC110" ],
+      cbok: [ problemSolving(1), societal(1), data(3), networking(2), systems(1), cybersecurity(1) ],      
+      swebok: [ swebok.Construction, swebok.Design, swebok.ModelsAndMethods ],
+      sfia: [ ],
+      dsbok: [ ccdsc.DG, ccdsc.SDM,
+        edison.DMS,
+        edison.EDMI,
+
+      ],
+      other: [ idverify.TurnItIn ]
+    },
+
+    {
+      code: "COSC220",
+      name: "Software Development Studio 2",
+      prereq: [ "COSC120" ],
+      cbok: [
+        problemSolving(3), ethics(1), expectations(3), teamwork(2), communication(2), societal(2),
+        understanding(2), data(3), programming(3), humanFactors(2), systems(2), projectManagement(2),
+        serviceManagement(1)
+      ],
+      swebok: [ 
+        swebok.Requirements, swebok.Design, swebok.Construction, swebok.Testing, swebok.Maintenance,
+        swebok.ConfigManagement, swebok.EngManagement, swebok.Process, swebok.ModelsAndMethods, swebok.Quality, 
+        swebok.ProfPractice, swebok.EngFoundations
+      ],
+      sfia: [],
+      dsbok: [ 
+        ccdsc.PR, ccdsc.SDM, ccdsc.CCF, ccdsc.DG,
+        edison.PM, // project management (agile)
+        edison.CCT, // VMs & containers
+        edison.DSAPPD, // Software engineering methods, testing
+      ],
+      other: [ idverify.TurnItIn, idverify.GroupWork, idverify.Project, idverify.DataTrails, idverify.Video ],
+      tags: [ "adv?" ]
+    },
+
+    {
+      code: "COSC222",
+      name: "Data Science Studio 2 ??",
+      prereq: [ "COSC102", "STAT100", "COSC110", "COSC210" ],
+      cbok: [
+        problemSolving(3), ethics(1), expectations(3), teamwork(2), communication(2), societal(2),
+        understanding(2), data(3), programming(3), humanFactors(2), systems(2), projectManagement(2),
+        serviceManagement(1)
+      ],
+      swebok: [ 
+        swebok.Requirements, swebok.Design, swebok.Construction, swebok.Testing, swebok.Maintenance,
+        swebok.ConfigManagement, swebok.EngManagement, swebok.Process, swebok.ModelsAndMethods, swebok.Quality, 
+        swebok.ProfPractice, swebok.EngFoundations
+      ],
+      sfia: [],
+      dsbok: [ 
+        ccdsc.PR, ccdsc.SDM, ccdsc.CCF, ccdsc.DG,
+        edison.PM, // project management (agile)
+        edison.CCT, // VMs & containers
+        edison.DSAPPD, // Software engineering methods, testing
+      ],
+      other: [ idverify.TurnItIn, idverify.GroupWork, idverify.Project, idverify.DataTrails, idverify.Video ]
+    },
+
+    {
+      code: "COSC230",
+      name: "Data Structures & Algorithms",
+      prereq: [ "AMTH140", "COSC120", choose(1, "COSC101", "COSC110", "SCI210", "AMTH250") ],
+      cbok: [ fundamentals(2), programming(2) ],
+      swebok: [ swebok.MathFoundations, swebok.CompFoundations, swebok.Construction, swebok.ModelsAndMethods, swebok.Design ],
+      sfia: [], 
+      dsbok: [ ccdsc.PDA, ccdsc.SDM,
+        edison.BDSE, // software systems development
+      ],
+      other: [ ],
+      tags: ["adv?"]
+    },
+
+    {
+      code: "COSC240",
+      name: "Operating Systems",
+      prereq: [ "COSC120" ],
+      cbok: [ problemSolving(2), societal(1), understanding(2), fundamentals(2), networking(2), programming(3), systems(1), cybersecurity(2) ],
+      sfia: [], 
+      swebok: [ swebok.CompFoundations ],
+      dsbok: [ ccdsc.CCF, ccdsc.DP, edison.SEC ],  
+      other: [ idverify.ProctoredExam, idverify.PersonalisedAssessment ]
+    },
+
+    {
+      code: "COSC250",
+      name: "Functional and Reactive Programming",
+      prereq: [ "COSC120", choose(1, "COSC101", "COSC110", "SCI210", "AMTH250") ],
+      cbok: [ understanding(1), programming(3), systems(2) ],
+      swebok: [ swebok.Design, swebok.Construction, swebok.Testing, swebok.ModelsAndMethods, swebok.MathFoundations, swebok.CompFoundations ],
+      sfia: [],
+      dsbok: [ 
+        ccdsc.BDS, // akka, streams. Functional programming approaches tend to be used in Spark, Kafka 
+        ccdsc.SDM, 
+        ccdsc.PDA, 
+        ccdsc.AI,
+        edison.DSIAPP, // Spark, Kafka
+        edison.BDSE, // Akka
+        edison.DSAPPD, // Scala
+        edison.BDI, // Scalable computing. Parallel and distributed architecture (actors)
+      ],  
+      other: [ idverify.ProctoredExam, idverify.Video ],
+      tags: ["adv?"]
+    },
+
+    {
+      code: "COSC260",
+      name: "Web Programming",
+      prereq: [ choose(2, "COSC101", "COSC110", "COSC120") ],
+      cbok: [ societal(1), networking(2), programming(2), humanFactors(2), systems(2), cybersecurity(2) ],
+      swebok: [ swebok.Construction, swebok.Requirements ],
+      sfia: [], 
+      dsbok: [ ccdsc.CCF, ccdsc.SDM, ccdsc.AP ],
+      other: [ idverify.ProctoredExam ]
+    },
+
+    {
+      code: "COSC301",
+      name: "Special Topic in Computing",
+      prereq: [ cp(48), "permission of HoS" ],
+      cbok: [ ],
+      sfia: [],
+      tags: ["Advanced"],
+      other: [ idverify.PersonalisedAssessment ]
+    },
+
+
+    {
+      code: "COSC310",
+      name: "Software Project Management",
+      prereq: [ choose(1, "COSC210", "COSC220") ],
+      cbok: [ ethics(2), expectations(2), teamwork(2), communication(3), systems(2), governance(3), projectManagement(3), humanFactors(2) ],
+      dsbok: [],
+      swebok: [ swebok.Requirements, swebok.Maintenance, swebok.EngManagement, swebok.Process, swebok.Quality, swebok.ProfPractice, swebok.Economics ],
+      sfia: [],
+      tags: ["Advanced"],
+      dsbok: [ ccdsc.PR, ccdsc.DP,
+        edison.PM,
+        edison.DGOV,      
+      ],
+      other: [ idverify.ProctoredExam, idverify.GroupWork, idverify.TurnItIn, idverify.Video ]
+    },
+
+    {
+      code: "COSC510",
+      name: "Software Project Management",
+      prereq: [ "COSC110", "COSC210" ],
+      cbok: [ ethics(2), expectations(2), teamwork(2), communication(3), systems(2), governance(3), projectManagement(3), humanFactors(2) ],
+      swebok: [ swebok.Requirements, swebok.Maintenance, swebok.EngManagement, swebok.Process, swebok.Quality, swebok.ProfPractice, swebok.Economics ],
+      sfia: [],
+      tags: ["Advanced"],
+      dsbok: [ ccdsc.PR, ccdsc.DP,
+        edison.PM,
+        edison.DGOV,
+      ],
+      other: [ idverify.ProctoredExam, idverify.GroupWork, idverify.TurnItIn, idverify.Video ]
+    },
+
+
+    {
+      code: "COSC320",
+      name: "Information Technology Project",
+      prereq: [ "COSC220", "COSC310", cp(96) ],
+      cbok: [ problemSolving(3), ethics(2), expectations(2), teamwork(3), communication(3), systems(3), projectManagement(3), understanding(2) ],
+      swebok: [ swebok.Requirements, swebok.Construction, swebok.EngManagement, swebok.Process, swebok.Quality, swebok.ProfPractice ],
+      sfia: [],
+      dsbok: [ ccdsc.PR, edison.PM ],
+      tags: [ "Advanced", "Capstone" ],
+      other: [ idverify.GroupWork, idverify.Project, idverify.TurnItIn, idverify.Video, idverify.Oral ]
+    },
+
+    {
+      code: "COSC591",
+      name: "Information Technology Project",
+      prereq: [ "COSC510", choose(1, "COSC530", "COSC540", "COSC550", "COSC560", "COSC570", "COSC572", "COSC580") ],
+      cbok: [ problemSolving(3), ethics(2), expectations(2), teamwork(3), communication(3), systems(3), projectManagement(3), understanding(2) ],
+      sfia: [],
+      dsbok: [ ccdsc.PR, edison.PM ],
+      tags: [ "Advanced", "Capstone" ],
+      other: [ idverify.GroupWork, idverify.Project, idverify.TurnItIn, idverify.Video, idverify.Oral ]
+    },
+
+
+    {
+      code: "COSC594",
+      name: "Information Technology Project: Proposal and Design",
+      prereq: [ "COSC220", cp(48) ],
+      cbok: [ problemSolving(3), ethics(2), expectations(2), teamwork(3), communication(3), systems(3), projectManagement(3), understanding(2) ],
+      sfia: [],
+      dsbok: [ ccdsc.PR, edison.PM  ],
+      tags: [ "Advanced", "Capstone" ],
+      other: [ idverify.GroupWork, idverify.Project, idverify.TurnItIn, idverify.Video, idverify.Oral ]
+    },
+
+    {
+      code: "COSC595",
+      name: "Information Technology Project: Implementation",
+      prereq: [ "COSC220", cp(48) ],
+      cbok: [ problemSolving(3), ethics(2), expectations(2), teamwork(3), communication(3), systems(3), projectManagement(3), understanding(2) ],
+      sfia: [],
+      dsbok: [ ccdsc.PR, edison.PM  ],
+      tags: [ "Advanced", "Capstone" ],
+      other: [ idverify.GroupWork, idverify.Project, idverify.TurnItIn, idverify.Video, idverify.Oral ]
+    },
+
+
+    {
+      code: "COSC330",
+      name: "Parallel and Distributed Computing",
+      prereq: [ or("COSC230", "COSC240") ],
+      cbok: [ fundamentals(3), data(3), networking(3), systems(2) ],
+      swebok: [ swebok.Construction, swebok.CompFoundations, swebok.ModelsAndMethods ],
+      sfia: [],
+      dsbok: [ ccdsc.BDS, ccdsc.PDA,
+        edison.BDI, // parallel computing, HPC
+        edison.DSIAPP, // data processing models
+        edison.DSAPPD, // CUDA
+      ],
+      tags: ["Advanced"],
+      other: [  ]
+    },
+
+    {
+      code: "COSC530",
+      name: "Parallel and Distributed Computing",
+      prereq: [ "COSC110", choose(2, "COSC210", "COSC220", "COSC230", "COSC240", "COSC250", "COSC260", "STAT210") ],
+      cbok: [ fundamentals(3), data(3), networking(3), systems(2) ],
+      swebok: [ swebok.Construction, swebok.CompFoundations, swebok.ModelsAndMethods ],
+      sfia: [],
+      dsbok: [ ccdsc.BDS, ccdsc.PDA,
+        edison.BDI, // parallel computing, HPC
+        edison.DSIAPP, // data processing models
+        edison.DSAPPD, // CUDA
+      ],
+      tags: ["Advanced"],
+      other: [ ]
+    },
+
+    
+    {
+      code: "COSC340",
+      name: "Computer Networks and Network Security",
+      prereq: [ cp(72), "AMTH140", "COSC240" ],
+      cbok: [ societal(1), communication(3), fundamentals(2), understanding(1), data(2), networking(3), programming(3), cybersecurity(3) ],
+      swebok: [ swebok.CompFoundations, swebok.Construction ],
+      sfia: [],
+      dsbok: [ ccdsc.CCF, ccdsc.DP,
+        edison.SEC
+      ],
+      tags: ["Advanced"], 
+      other: [ idverify.ProctoredExam, idverify.PersonalisedAssessment ]
+    },
+
+    {
+      code: "COSC540",
+      name: "Computer Networks and Network Security",
+      prereq: [ "COSC110", choose(2, "COSC210", "COSC220", "COSC230", "COSC240", "COSC250", "COSC260", "STAT210") ],
+      cbok: [ societal(1), communication(3), fundamentals(2), understanding(1), data(2), networking(3), programming(3), cybersecurity(3) ],
+      swebok: [ swebok.CompFoundations, swebok.Construction ],
+      sfia: [],
+      dsbok: [ ccdsc.CCF, ccdsc.DP, 
+        edison.SEC 
+      ],
+      tags: ["Advanced"],
+      other: [ idverify.ProctoredExam, idverify.PersonalisedAssessment ]
+    },
+
+
+    {
+      code: "COSC350",
+      name: "Artificial Intelligence",
+      prereq: [ "COSC230" ],
+      cbok: [ data(3), programming(3), fundamentals(2), systems(2), problemSolving(2) ],
+      swebok: [ swebok.Construction ],
+      sfia: [],
+      dsbok: [ ccdsc.AI, ccdsc.ML, ccdsc.PDA,
+        edison.ML,
+        edison.PA,
+        edison.DM,
+        edison.SDMA,
+      ],
+      tags: ["Advanced"],
+      other: [ idverify.ProctoredExam ]
+    },
+
+    {
+      code: "COSC550",
+      name: "Artificial Intelligence",
+      prereq: [ "COSC110", choose(2, "COSC210", "COSC220", "COSC230", "COSC240", "COSC250", "COSC260", "STAT210") ],
+      cbok: [ data(3), programming(3), fundamentals(2), systems(2), problemSolving(2) ],
+      swebok: [ swebok.Construction ],
+      sfia: [],
+      dsbok: [ ccdsc.AI, ccdsc.ML, ccdsc.PDA,
+        edison.ML,
+        edison.PA,
+        edison.DM,
+        edison.SDMA,
+      ],
+      tags: ["Advanced"],
+      other: [ idverify.ProctoredExam ]
+    },
+
+    {
+      code: "COSC360",
+      name: "Advanced Web Programming",
+      prereq: [ "COSC120", "COSC260" ],
+      cbok: [ communication(2), networking(3), programming(3), humanFactors(2), systems(2), serviceManagement(2), cybersecurity(2) ],
+      swebok: [ swebok.Construction, swebok.Design, swebok.Testing, swebok.Requirements ],
+      sfia: [],
+      dsbok: [ ccdsc.CCF, ccdsc.AP, ccdsc.PDA,
+        edison.BDI, // NoSQL (Mongo)
+      ],
+      tags: ["Advanced"],
+      other: [ idverify.ProctoredExam, idverify.Project, idverify.Video ]
+    },
+
+    {
+      code: "COSC560",
+      name: "Advanced Web Programming",
+      prereq: [ "COSC260", or("COSC110", "COSC120") ],
+      cbok: [ communication(2), networking(3), programming(3), humanFactors(2), systems(2), serviceManagement(2), cybersecurity(2) ],
+      swebok: [ swebok.Construction, swebok.Design, swebok.Testing, swebok.Requirements ],
+      sfia: [],
+      dsbok: [ ccdsc.CCF, ccdsc.AP, ccdsc.PDA,
+        edison.BDI, // NoSQL (Mongo)
+      ],
+      tags: ["Advanced"],
+      other: [ idverify.ProctoredExam, idverify.Project, idverify.Video ]
+    },
+
+
+    {
+      code: "COSC370",
+      name: "User Experience & Interaction Design",
+      prereq: [ cp(72), "COSC220" ],
+      cbok: [ communication(3), societal(3), humanFactors(3), systems(3) ],
+      swebok: [ swebok.Requirements, swebok.Design, swebok.ProfPractice ], 
+      sfia: [],
+      dsbok: [ ccdsc.AP, ccdsc.PR ],
+      tags: ["Advanced"],
+      other: [ idverify.Project, idverify.Video, idverify.TurnItIn ]
+    },
+
+    {
+      code: "COSC570",
+      name: "User Experience & Interaction Design",
+      prereq: [ "COSC110", choose(2, "COSC210", "COSC220", "COSC230", "COSC240", "COSC250", "COSC260", "STAT210") ],
+      cbok: [ communication(3), societal(3), humanFactors(3), systems(3) ],
+      swebok: [ swebok.Requirements, swebok.Design, swebok.ProfPractice ], 
+      sfia: [],
+      dsbok: [ ccdsc.AP, ccdsc.PR ],
+      tags: ["Advanced"],
+      other: [ idverify.Project, idverify.Video, idverify.TurnItIn ]
+    },
+
+
+    {
+      code: "COSC372",
+      name: "Management Information Systems",
+      prereq: [ cp(48) ],
+      cbok: [ societal(2), data(2), systems(3), projectManagement(1), serviceManagement(2), networking(2), humanFactors(2), cybersecurity(1) ],
+      swebok: [ swebok.Economics, swebok.Maintenance, swebok.Quality ],
+      dsbok: [ ccdsc.AP, ccdsc.PR, ccdsc.DG, ccdsc.DP,
+        edison.BAF,
+        edison.BAEM,
+        edison.IS,
+        edison.DMORG,
+        edison.DGOV,
+      ],
+      sfia: [],
+      other: [ idverify.PersonalisedAssessment, idverify.TurnItIn ]
+    },
+
+    {
+      code: "COSC572",
+      name: "Management Information Systems",
+      prereq: [ cp(48) ],
+      cbok: [ societal(2), data(2), systems(3), projectManagement(1), serviceManagement(2), networking(2), humanFactors(2), cybersecurity(1) ],
+      swebok: [ swebok.Economics, swebok.Maintenance, swebok.Quality ],
+      sfia: [],
+      dsbok: [ ccdsc.AP, ccdsc.PR, ccdsc.DG, ccdsc.DP,
+        edison.BAF,
+        edison.BAEM,
+        edison.IS,
+        edison.DMORG,
+        edison.DGOV,
+      ],
+      other: [ idverify.PersonalisedAssessment, idverify.TurnItIn ] 
+    },
+
+
+    {
+      code: "COSC380",
+      name: "Algorithms in Machine Learning",
+      prereq: [ choose(1, "MTHS120", "MTHS130"), choose(1, "COSC230", "AMTH250", "SCI210", "STAT330") ],
+      cbok: [ data(3), programming(2), problemSolving(2) ],
+      swebok: [ swebok.Construction, swebok.MathFoundations ],
+      sfia: [],
+      dsbok: [ ccdsc.ML, ccdsc.PDA,
+        edison.ML,
+        edison.DM, // reinforcement learning
+        edison.PA,
+        edison.SMDA,
+        edison.DSAPPD,
+      ],
+      tags: ["Advanced"],
+      other: [idverify.Project, idverify.TurnItIn]
+    },
+
+    {
+      code: "COSC580",
+      name: "Algorithms in Machine Learning",
+      prereq: [ "MTHS120", or("COSC110", "SCI410") ],
+      cbok: [ data(3), programming(2), problemSolving(2) ],
+      swebok: [ swebok.Construction, swebok.MathFoundations ],
+      sfia: [],
+      dsbok: [ ccdsc.ML, ccdsc.PDA,
+        edison.ML,
+        edison.DM, // reinforcement learning
+        edison.PA,
+        edison.SMDA,
+        edison.DSAPPD,      
+      ],
+      tags: ["Advanced"],
+      other: [idverify.Project, idverify.TurnItIn]
+    },
+
+    {
+      code: "Elective",
+      name: "Non-ICT Elective",
+      prereq: [],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [],
+      other: []
+    },
+
+    {
+      code: "Listed Group 1",
+      name: "ICT Elective",
+      prereq: [],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [],
+      other: []
+    },
+
+    {
+      code: "Listed Group 2",
+      name: "Non-ICT Elective",
+      prereq: [],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [],
+      other: []
+    },
+
+    {
+      code: "Listed",
+      name: "Non-ICT Elective",
+      prereq: [],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [],
+      other: []
+    },
+
+    {
+      code: "Listed 300-level COSC",
+      name: "Advanced ICT Elective",
+      prereq: [],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: ["Advanced"],
+      other: []
+    },
+
+    {
+      code: "Listed 500-level",
+      name: "ICT/Non-ICT Elective",
+      prereq: [],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [],
+      other: []
+    },
+
+    {
+      code: "Prescribed 300-level",
+      name: "Advanced ICT Elective",
+      prereq: [],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: ["Advanced"],
+      other: []
+    },
+
+    {
+      code: "Prescribed 500-level",
+      name: "Advanced ICT Elective",
+      prereq: [],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: ["Advanced"],
+      other: []
+    },
+
+    {
+      code: "Prescribed",
+      name: "ICT Elective",
+      prereq: [],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [],
+      other: []
+    },
+
+    {
+      code: "Listed",
+      name: "Non-ICT Elective",
+      prereq: [],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [],
+      other: []
+    },
+
+    {
+      code: "COSC130",
+      name: "Fundamentals of Cybersecurity and Privacy",
+      prereq: [],
+      cbok: [ ethics(1), cybersecurity(1), expectations(1), understanding(1), societal(1), data(1), governance(1), serviceManagement(1) ],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [ ],
+      other: []
+    },
+
+    {
+      code: "COSC481",
+      name: "Cryptography",
+      prereq: ["AMTH140", "COSC230"],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [ "Advanced" ],
+      other: []
+    },
+
+    {
+      code: "COSC482",
+      name: "Ethical Hacking",
+      prereq: ["COSC220", "COSC240"],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [ "Advanced" ],
+      other: []
+    },
+
+    {
+      code: "COSC483",
+      name: "Cybersecurity Risk and Project Management",
+      prereq: ["COSC220", "COSC240", "COSC340"],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [ "Advanced" ],
+      other: []
+    },
+  
+    {
+      code: "COSC484",
+      name: "Cloud Security",
+      prereq: ["COSC220", "COSC240", "COSC340"],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [ "Advanced" ],
+      other: []
+    },
+
+    {
+      code: "SCI310",
+      name: "Digital Technology Survival Skills",
+      prereq: [],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [ ],
+      other: []
+    },
+
+    {
+      code: "COSC331",
+      name: "Big Data",
+      prereq: [ ],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [ ],
+      other: []
+    },
+
+    {
+      code: "COSC351",
+      name: "Deep Learning",
+      prereq: [ ],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [ ],
+      other: []
+    },
+
+
+    {
+      code: "COSC352",
+      name: "Reinforcement Learning",
+      prereq: [ ],
+      cbok: [],
+      swebok: [],
+      sfia: [],
+      dsbok: [],
+      tags: [ ],
+      other: []
+    },
+
+  ])
\ No newline at end of file
-- 
GitLab