Extract semTimetableFragment to common config module; replace direct usage of json config
Extract fromQueryString into classProperties and rename to fromQueryStringToJSON for clarity
Save query string instead of json representation, namespaced to timetable/:academicYear/sem:semester - same as url
Restore timetable from saved query string, converting from legacy JSON format if saved query string does not exist
Detect if timetable is from shared url, do not save changes if shared
Add shared timetable controls to restore or replace saved timetable
Disable broken show/hide module button. To be replaced by individual lesson hiding