{
  "version": 3,
  "sources": [
    "node_modules/browser-pack/_prelude.js",
    "node_modules/riot/riot.js",
    "wwwroot/js/tags/TimeTablerCommon/Common/TTFooter.tag",
    "wwwroot/js/tags/TimeTablerCommon/Common/TTHeader.tag",
    "wwwroot/js/tags/TimeTablerCommon/Common/TTcommonPopupGeneric.tag",
    "wwwroot/js/tags/TimeTablerCommon/Home/Maintenance.tag",
    "wwwroot/js/tags/TimeTablerCommon/Home/SDHomePage.tag",
    "wwwroot/js/tags/TimeTablerCommon/Home/SDNewHomePage.tag",
    "wwwroot/js/tags/TimeTablerCommon/Home/SDNewHomePageWorkShop.tag",
    "wwwroot/js/tags/TimeTablerCommon/Login/SDSignUp.tag",
    "wwwroot/js/tags/TimeTablerCommon/Login/TTLogin.tag",
    "wwwroot/js/tags/TimeTabler/AboutUs/SDContactUs.tag",
    "wwwroot/js/tags/TimeTabler/AboutUs/SDMedia.tag",
    "wwwroot/js/tags/TimeTabler/CustomerManuals/ManualSectionOne.tag",
    "wwwroot/js/tags/TimeTabler/Packages/CoreBundleCalculator.tag",
    "wwwroot/js/tags/TimeTabler/Packages/MatrixGoldCalculator.tag",
    "wwwroot/js/tags/TimeTabler/SDExpress/SDExpressPage.tag",
    "wwwroot/js/tags/TimeTabler/UserAgreements/PrivacySection.tag",
    "wwwroot/js/tags/TimeTabler/UserAgreements/SampleLicenceAgreement.tag",
    "wwwroot/js/tags/TimeTabler/UserAgreements/SecuritySection.tag",
    "wwwroot/js/tags/TimeTabler/UserAgreements/ServiceLevelsPage.tag",
    "wwwroot/js/tags/TimeTabler/UserAgreements/TroubleshootingGuidePage.tag",
    "wwwroot/js/tags/TimeTabler/UserAgreements/UserAgreementsPage.tag",
    "wwwroot/js/tags/introTags/aboutUs/TTContactUsPopupNotify.tag",
    "wwwroot/js/tags/mixins/eventsystem.js",
    "wwwroot/js/tags/services/constants.js",
    "wwwroot/js/tags/services/eventManager.js",
    "wwwroot/js/tags/tagsIntro.js"
  ],
  "names": [],
  "mappings": "AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9nFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5bA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;;ACFA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
  "file": "generated.js",
  "sourceRoot": "",
  "sourcesContent": [
    "(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()",
    "/* Riot v2.6.9, @license MIT */\n\n;(function(window, undefined) {\n  'use strict';\nvar riot = { version: 'v2.6.9', settings: {} },\n  // be aware, internal usage\n  // ATTENTION: prefix the global dynamic variables with `__`\n\n  // counter to give a unique id to all the Tag instances\n  __uid = 0,\n  // tags instances cache\n  __virtualDom = [],\n  // tags implementation cache\n  __tagImpl = {},\n\n  /**\n   * Const\n   */\n  GLOBAL_MIXIN = '__global_mixin',\n\n  // riot specific prefixes\n  RIOT_PREFIX = 'riot-',\n  RIOT_TAG = RIOT_PREFIX + 'tag',\n  RIOT_TAG_IS = 'data-is',\n\n  // for typeof == '' comparisons\n  T_STRING = 'string',\n  T_OBJECT = 'object',\n  T_UNDEF  = 'undefined',\n  T_FUNCTION = 'function',\n  XLINK_NS = 'http://www.w3.org/1999/xlink',\n  XLINK_REGEX = /^xlink:(\\w+)/,\n  // special native tags that cannot be treated like the others\n  SPECIAL_TAGS_REGEX = /^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?|opt(?:ion|group))$/,\n  RESERVED_WORDS_BLACKLIST = /^(?:_(?:item|id|parent)|update|root|(?:un)?mount|mixin|is(?:Mounted|Loop)|tags|parent|opts|trigger|o(?:n|ff|ne))$/,\n  // SVG tags list https://www.w3.org/TR/SVG/attindex.html#PresentationAttributes\n  SVG_TAGS_LIST = ['altGlyph', 'animate', 'animateColor', 'circle', 'clipPath', 'defs', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feFlood', 'feGaussianBlur', 'feImage', 'feMerge', 'feMorphology', 'feOffset', 'feSpecularLighting', 'feTile', 'feTurbulence', 'filter', 'font', 'foreignObject', 'g', 'glyph', 'glyphRef', 'image', 'line', 'linearGradient', 'marker', 'mask', 'missing-glyph', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'switch', 'symbol', 'text', 'textPath', 'tref', 'tspan', 'use'],\n\n  // version# for IE 8-11, 0 for others\n  IE_VERSION = (window && window.document || {}).documentMode | 0,\n\n  // detect firefox to fix #1374\n  FIREFOX = window && !!window.InstallTrigger\n/* istanbul ignore next */\nriot.observable = function(el) {\n\n  /**\n   * Extend the original object or create a new empty one\n   * @type { Object }\n   */\n\n  el = el || {}\n\n  /**\n   * Private variables\n   */\n  var callbacks = {},\n    slice = Array.prototype.slice\n\n  /**\n   * Private Methods\n   */\n\n  /**\n   * Helper function needed to get and loop all the events in a string\n   * @param   { String }   e - event string\n   * @param   {Function}   fn - callback\n   */\n  function onEachEvent(e, fn) {\n    var es = e.split(' '), l = es.length, i = 0\n    for (; i < l; i++) {\n      var name = es[i]\n      if (name) fn(name, i)\n    }\n  }\n\n  /**\n   * Public Api\n   */\n\n  // extend the el object adding the observable methods\n  Object.defineProperties(el, {\n    /**\n     * Listen to the given space separated list of `events` and\n     * execute the `callback` each time an event is triggered.\n     * @param  { String } events - events ids\n     * @param  { Function } fn - callback function\n     * @returns { Object } el\n     */\n    on: {\n      value: function(events, fn) {\n        if (typeof fn != 'function')  return el\n\n        onEachEvent(events, function(name, pos) {\n          (callbacks[name] = callbacks[name] || []).push(fn)\n          fn.typed = pos > 0\n        })\n\n        return el\n      },\n      enumerable: false,\n      writable: false,\n      configurable: false\n    },\n\n    /**\n     * Removes the given space separated list of `events` listeners\n     * @param   { String } events - events ids\n     * @param   { Function } fn - callback function\n     * @returns { Object } el\n     */\n    off: {\n      value: function(events, fn) {\n        if (events == '*' && !fn) callbacks = {}\n        else {\n          onEachEvent(events, function(name, pos) {\n            if (fn) {\n              var arr = callbacks[name]\n              for (var i = 0, cb; cb = arr && arr[i]; ++i) {\n                if (cb == fn) arr.splice(i--, 1)\n              }\n            } else delete callbacks[name]\n          })\n        }\n        return el\n      },\n      enumerable: false,\n      writable: false,\n      configurable: false\n    },\n\n    /**\n     * Listen to the given space separated list of `events` and\n     * execute the `callback` at most once\n     * @param   { String } events - events ids\n     * @param   { Function } fn - callback function\n     * @returns { Object } el\n     */\n    one: {\n      value: function(events, fn) {\n        function on() {\n          el.off(events, on)\n          fn.apply(el, arguments)\n        }\n        return el.on(events, on)\n      },\n      enumerable: false,\n      writable: false,\n      configurable: false\n    },\n\n    /**\n     * Execute all callback functions that listen to\n     * the given space separated list of `events`\n     * @param   { String } events - events ids\n     * @returns { Object } el\n     */\n    trigger: {\n      value: function(events) {\n\n        // getting the arguments\n        var arglen = arguments.length - 1,\n          args = new Array(arglen),\n          fns\n\n        for (var i = 0; i < arglen; i++) {\n          args[i] = arguments[i + 1] // skip first argument\n        }\n\n        onEachEvent(events, function(name, pos) {\n\n          fns = slice.call(callbacks[name] || [], 0)\n\n          for (var i = 0, fn; fn = fns[i]; ++i) {\n            if (fn.busy) continue\n            fn.busy = 1\n            fn.apply(el, fn.typed ? [name].concat(args) : args)\n            if (fns[i] !== fn) { i-- }\n            fn.busy = 0\n          }\n\n          if (callbacks['*'] && name != '*')\n            el.trigger.apply(el, ['*', name].concat(args))\n\n        })\n\n        return el\n      },\n      enumerable: false,\n      writable: false,\n      configurable: false\n    }\n  })\n\n  return el\n\n}\n/* istanbul ignore next */\n;(function(riot) {\n\n/**\n * Simple client-side router\n * @module riot-route\n */\n\n\nvar RE_ORIGIN = /^.+?\\/\\/+[^\\/]+/,\n  EVENT_LISTENER = 'EventListener',\n  REMOVE_EVENT_LISTENER = 'remove' + EVENT_LISTENER,\n  ADD_EVENT_LISTENER = 'add' + EVENT_LISTENER,\n  HAS_ATTRIBUTE = 'hasAttribute',\n  REPLACE = 'replace',\n  POPSTATE = 'popstate',\n  HASHCHANGE = 'hashchange',\n  TRIGGER = 'trigger',\n  MAX_EMIT_STACK_LEVEL = 3,\n  win = typeof window != 'undefined' && window,\n  doc = typeof document != 'undefined' && document,\n  hist = win && history,\n  loc = win && (hist.location || win.location), // see html5-history-api\n  prot = Router.prototype, // to minify more\n  clickEvent = doc && doc.ontouchstart ? 'touchstart' : 'click',\n  started = false,\n  central = riot.observable(),\n  routeFound = false,\n  debouncedEmit,\n  base, current, parser, secondParser, emitStack = [], emitStackLevel = 0\n\n/**\n * Default parser. You can replace it via router.parser method.\n * @param {string} path - current path (normalized)\n * @returns {array} array\n */\nfunction DEFAULT_PARSER(path) {\n  return path.split(/[/?#]/)\n}\n\n/**\n * Default parser (second). You can replace it via router.parser method.\n * @param {string} path - current path (normalized)\n * @param {string} filter - filter string (normalized)\n * @returns {array} array\n */\nfunction DEFAULT_SECOND_PARSER(path, filter) {\n  var re = new RegExp('^' + filter[REPLACE](/\\*/g, '([^/?#]+?)')[REPLACE](/\\.\\./, '.*') + '$'),\n    args = path.match(re)\n\n  if (args) return args.slice(1)\n}\n\n/**\n * Simple/cheap debounce implementation\n * @param   {function} fn - callback\n * @param   {number} delay - delay in seconds\n * @returns {function} debounced function\n */\nfunction debounce(fn, delay) {\n  var t\n  return function () {\n    clearTimeout(t)\n    t = setTimeout(fn, delay)\n  }\n}\n\n/**\n * Set the window listeners to trigger the routes\n * @param {boolean} autoExec - see route.start\n */\nfunction start(autoExec) {\n  debouncedEmit = debounce(emit, 1)\n  win[ADD_EVENT_LISTENER](POPSTATE, debouncedEmit)\n  win[ADD_EVENT_LISTENER](HASHCHANGE, debouncedEmit)\n  doc[ADD_EVENT_LISTENER](clickEvent, click)\n  if (autoExec) emit(true)\n}\n\n/**\n * Router class\n */\nfunction Router() {\n  this.$ = []\n  riot.observable(this) // make it observable\n  central.on('stop', this.s.bind(this))\n  central.on('emit', this.e.bind(this))\n}\n\nfunction normalize(path) {\n  return path[REPLACE](/^\\/|\\/$/, '')\n}\n\nfunction isString(str) {\n  return typeof str == 'string'\n}\n\n/**\n * Get the part after domain name\n * @param {string} href - fullpath\n * @returns {string} path from root\n */\nfunction getPathFromRoot(href) {\n  return (href || loc.href)[REPLACE](RE_ORIGIN, '')\n}\n\n/**\n * Get the part after base\n * @param {string} href - fullpath\n * @returns {string} path from base\n */\nfunction getPathFromBase(href) {\n  return base[0] == '#'\n    ? (href || loc.href || '').split(base)[1] || ''\n    : (loc ? getPathFromRoot(href) : href || '')[REPLACE](base, '')\n}\n\nfunction emit(force) {\n  // the stack is needed for redirections\n  var isRoot = emitStackLevel == 0, first\n  if (MAX_EMIT_STACK_LEVEL <= emitStackLevel) return\n\n  emitStackLevel++\n  emitStack.push(function() {\n    var path = getPathFromBase()\n    if (force || path != current) {\n      central[TRIGGER]('emit', path)\n      current = path\n    }\n  })\n  if (isRoot) {\n    while (first = emitStack.shift()) first() // stack increses within this call\n    emitStackLevel = 0\n  }\n}\n\nfunction click(e) {\n  if (\n    e.which != 1 // not left click\n    || e.metaKey || e.ctrlKey || e.shiftKey // or meta keys\n    || e.defaultPrevented // or default prevented\n  ) return\n\n  var el = e.target\n  while (el && el.nodeName != 'A') el = el.parentNode\n\n  if (\n    !el || el.nodeName != 'A' // not A tag\n    || el[HAS_ATTRIBUTE]('download') // has download attr\n    || !el[HAS_ATTRIBUTE]('href') // has no href attr\n    || el.target && el.target != '_self' // another window or frame\n    || el.href.indexOf(loc.href.match(RE_ORIGIN)[0]) == -1 // cross origin\n  ) return\n\n  if (el.href != loc.href\n    && (\n      el.href.split('#')[0] == loc.href.split('#')[0] // internal jump\n      || base[0] != '#' && getPathFromRoot(el.href).indexOf(base) !== 0 // outside of base\n      || base[0] == '#' && el.href.split(base)[0] != loc.href.split(base)[0] // outside of #base\n      || !go(getPathFromBase(el.href), el.title || doc.title) // route not found\n    )) return\n\n  e.preventDefault()\n}\n\n/**\n * Go to the path\n * @param {string} path - destination path\n * @param {string} title - page title\n * @param {boolean} shouldReplace - use replaceState or pushState\n * @returns {boolean} - route not found flag\n */\nfunction go(path, title, shouldReplace) {\n  // Server-side usage: directly execute handlers for the path\n  if (!hist) return central[TRIGGER]('emit', getPathFromBase(path))\n\n  path = base + normalize(path)\n  title = title || doc.title\n  // browsers ignores the second parameter `title`\n  shouldReplace\n    ? hist.replaceState(null, title, path)\n    : hist.pushState(null, title, path)\n  // so we need to set it manually\n  doc.title = title\n  routeFound = false\n  emit()\n  return routeFound\n}\n\n/**\n * Go to path or set action\n * a single string:                go there\n * two strings:                    go there with setting a title\n * two strings and boolean:        replace history with setting a title\n * a single function:              set an action on the default route\n * a string/RegExp and a function: set an action on the route\n * @param {(string|function)} first - path / action / filter\n * @param {(string|RegExp|function)} second - title / action\n * @param {boolean} third - replace flag\n */\nprot.m = function(first, second, third) {\n  if (isString(first) && (!second || isString(second))) go(first, second, third || false)\n  else if (second) this.r(first, second)\n  else this.r('@', first)\n}\n\n/**\n * Stop routing\n */\nprot.s = function() {\n  this.off('*')\n  this.$ = []\n}\n\n/**\n * Emit\n * @param {string} path - path\n */\nprot.e = function(path) {\n  this.$.concat('@').some(function(filter) {\n    var args = (filter == '@' ? parser : secondParser)(normalize(path), normalize(filter))\n    if (typeof args != 'undefined') {\n      this[TRIGGER].apply(null, [filter].concat(args))\n      return routeFound = true // exit from loop\n    }\n  }, this)\n}\n\n/**\n * Register route\n * @param {string} filter - filter for matching to url\n * @param {function} action - action to register\n */\nprot.r = function(filter, action) {\n  if (filter != '@') {\n    filter = '/' + normalize(filter)\n    this.$.push(filter)\n  }\n  this.on(filter, action)\n}\n\nvar mainRouter = new Router()\nvar route = mainRouter.m.bind(mainRouter)\n\n/**\n * Create a sub router\n * @returns {function} the method of a new Router object\n */\nroute.create = function() {\n  var newSubRouter = new Router()\n  // assign sub-router's main method\n  var router = newSubRouter.m.bind(newSubRouter)\n  // stop only this sub-router\n  router.stop = newSubRouter.s.bind(newSubRouter)\n  return router\n}\n\n/**\n * Set the base of url\n * @param {(str|RegExp)} arg - a new base or '#' or '#!'\n */\nroute.base = function(arg) {\n  base = arg || '#'\n  current = getPathFromBase() // recalculate current path\n}\n\n/** Exec routing right now **/\nroute.exec = function() {\n  emit(true)\n}\n\n/**\n * Replace the default router to yours\n * @param {function} fn - your parser function\n * @param {function} fn2 - your secondParser function\n */\nroute.parser = function(fn, fn2) {\n  if (!fn && !fn2) {\n    // reset parser for testing...\n    parser = DEFAULT_PARSER\n    secondParser = DEFAULT_SECOND_PARSER\n  }\n  if (fn) parser = fn\n  if (fn2) secondParser = fn2\n}\n\n/**\n * Helper function to get url query as an object\n * @returns {object} parsed query\n */\nroute.query = function() {\n  var q = {}\n  var href = loc.href || current\n  href[REPLACE](/[?&](.+?)=([^&]*)/g, function(_, k, v) { q[k] = v })\n  return q\n}\n\n/** Stop routing **/\nroute.stop = function () {\n  if (started) {\n    if (win) {\n      win[REMOVE_EVENT_LISTENER](POPSTATE, debouncedEmit)\n      win[REMOVE_EVENT_LISTENER](HASHCHANGE, debouncedEmit)\n      doc[REMOVE_EVENT_LISTENER](clickEvent, click)\n    }\n    central[TRIGGER]('stop')\n    started = false\n  }\n}\n\n/**\n * Start routing\n * @param {boolean} autoExec - automatically exec after starting if true\n */\nroute.start = function (autoExec) {\n  if (!started) {\n    if (win) {\n      if (document.readyState == 'complete') start(autoExec)\n      // the timeout is needed to solve\n      // a weird safari bug https://github.com/riot/route/issues/33\n      else win[ADD_EVENT_LISTENER]('load', function() {\n        setTimeout(function() { start(autoExec) }, 1)\n      })\n    }\n    started = true\n  }\n}\n\n/** Prepare the router **/\nroute.base()\nroute.parser()\n\nriot.route = route\n})(riot)\n/* istanbul ignore next */\n\n/**\n * The riot template engine\n * @version v2.4.2\n */\n/**\n * riot.util.brackets\n *\n * - `brackets    ` - Returns a string or regex based on its parameter\n * - `brackets.set` - Change the current riot brackets\n *\n * @module\n */\n\nvar brackets = (function (UNDEF) {\n\n  var\n    REGLOB = 'g',\n\n    R_MLCOMMS = /\\/\\*[^*]*\\*+(?:[^*\\/][^*]*\\*+)*\\//g,\n\n    R_STRINGS = /\"[^\"\\\\]*(?:\\\\[\\S\\s][^\"\\\\]*)*\"|'[^'\\\\]*(?:\\\\[\\S\\s][^'\\\\]*)*'/g,\n\n    S_QBLOCKS = R_STRINGS.source + '|' +\n      /(?:\\breturn\\s+|(?:[$\\w\\)\\]]|\\+\\+|--)\\s*(\\/)(?![*\\/]))/.source + '|' +\n      /\\/(?=[^*\\/])[^[\\/\\\\]*(?:(?:\\[(?:\\\\.|[^\\]\\\\]*)*\\]|\\\\.)[^[\\/\\\\]*)*?(\\/)[gim]*/.source,\n\n    UNSUPPORTED = RegExp('[\\\\' + 'x00-\\\\x1F<>a-zA-Z0-9\\'\",;\\\\\\\\]'),\n\n    NEED_ESCAPE = /(?=[[\\]()*+?.^$|])/g,\n\n    FINDBRACES = {\n      '(': RegExp('([()])|'   + S_QBLOCKS, REGLOB),\n      '[': RegExp('([[\\\\]])|' + S_QBLOCKS, REGLOB),\n      '{': RegExp('([{}])|'   + S_QBLOCKS, REGLOB)\n    },\n\n    DEFAULT = '{ }'\n\n  var _pairs = [\n    '{', '}',\n    '{', '}',\n    /{[^}]*}/,\n    /\\\\([{}])/g,\n    /\\\\({)|{/g,\n    RegExp('\\\\\\\\(})|([[({])|(})|' + S_QBLOCKS, REGLOB),\n    DEFAULT,\n    /^\\s*{\\^?\\s*([$\\w]+)(?:\\s*,\\s*(\\S+))?\\s+in\\s+(\\S.*)\\s*}/,\n    /(^|[^\\\\]){=[\\S\\s]*?}/\n  ]\n\n  var\n    cachedBrackets = UNDEF,\n    _regex,\n    _cache = [],\n    _settings\n\n  function _loopback (re) { return re }\n\n  function _rewrite (re, bp) {\n    if (!bp) bp = _cache\n    return new RegExp(\n      re.source.replace(/{/g, bp[2]).replace(/}/g, bp[3]), re.global ? REGLOB : ''\n    )\n  }\n\n  function _create (pair) {\n    if (pair === DEFAULT) return _pairs\n\n    var arr = pair.split(' ')\n\n    if (arr.length !== 2 || UNSUPPORTED.test(pair)) {\n      throw new Error('Unsupported brackets \"' + pair + '\"')\n    }\n    arr = arr.concat(pair.replace(NEED_ESCAPE, '\\\\').split(' '))\n\n    arr[4] = _rewrite(arr[1].length > 1 ? /{[\\S\\s]*?}/ : _pairs[4], arr)\n    arr[5] = _rewrite(pair.length > 3 ? /\\\\({|})/g : _pairs[5], arr)\n    arr[6] = _rewrite(_pairs[6], arr)\n    arr[7] = RegExp('\\\\\\\\(' + arr[3] + ')|([[({])|(' + arr[3] + ')|' + S_QBLOCKS, REGLOB)\n    arr[8] = pair\n    return arr\n  }\n\n  function _brackets (reOrIdx) {\n    return reOrIdx instanceof RegExp ? _regex(reOrIdx) : _cache[reOrIdx]\n  }\n\n  _brackets.split = function split (str, tmpl, _bp) {\n    // istanbul ignore next: _bp is for the compiler\n    if (!_bp) _bp = _cache\n\n    var\n      parts = [],\n      match,\n      isexpr,\n      start,\n      pos,\n      re = _bp[6]\n\n    isexpr = start = re.lastIndex = 0\n\n    while ((match = re.exec(str))) {\n\n      pos = match.index\n\n      if (isexpr) {\n\n        if (match[2]) {\n          re.lastIndex = skipBraces(str, match[2], re.lastIndex)\n          continue\n        }\n        if (!match[3]) {\n          continue\n        }\n      }\n\n      if (!match[1]) {\n        unescapeStr(str.slice(start, pos))\n        start = re.lastIndex\n        re = _bp[6 + (isexpr ^= 1)]\n        re.lastIndex = start\n      }\n    }\n\n    if (str && start < str.length) {\n      unescapeStr(str.slice(start))\n    }\n\n    return parts\n\n    function unescapeStr (s) {\n      if (tmpl || isexpr) {\n        parts.push(s && s.replace(_bp[5], '$1'))\n      } else {\n        parts.push(s)\n      }\n    }\n\n    function skipBraces (s, ch, ix) {\n      var\n        match,\n        recch = FINDBRACES[ch]\n\n      recch.lastIndex = ix\n      ix = 1\n      while ((match = recch.exec(s))) {\n        if (match[1] &&\n          !(match[1] === ch ? ++ix : --ix)) break\n      }\n      return ix ? s.length : recch.lastIndex\n    }\n  }\n\n  _brackets.hasExpr = function hasExpr (str) {\n    return _cache[4].test(str)\n  }\n\n  _brackets.loopKeys = function loopKeys (expr) {\n    var m = expr.match(_cache[9])\n\n    return m\n      ? { key: m[1], pos: m[2], val: _cache[0] + m[3].trim() + _cache[1] }\n      : { val: expr.trim() }\n  }\n\n  _brackets.array = function array (pair) {\n    return pair ? _create(pair) : _cache\n  }\n\n  function _reset (pair) {\n    if ((pair || (pair = DEFAULT)) !== _cache[8]) {\n      _cache = _create(pair)\n      _regex = pair === DEFAULT ? _loopback : _rewrite\n      _cache[9] = _regex(_pairs[9])\n    }\n    cachedBrackets = pair\n  }\n\n  function _setSettings (o) {\n    var b\n\n    o = o || {}\n    b = o.brackets\n    Object.defineProperty(o, 'brackets', {\n      set: _reset,\n      get: function () { return cachedBrackets },\n      enumerable: true\n    })\n    _settings = o\n    _reset(b)\n  }\n\n  Object.defineProperty(_brackets, 'settings', {\n    set: _setSettings,\n    get: function () { return _settings }\n  })\n\n  /* istanbul ignore next: in the browser riot is always in the scope */\n  _brackets.settings = typeof riot !== 'undefined' && riot.settings || {}\n  _brackets.set = _reset\n\n  _brackets.R_STRINGS = R_STRINGS\n  _brackets.R_MLCOMMS = R_MLCOMMS\n  _brackets.S_QBLOCKS = S_QBLOCKS\n\n  return _brackets\n\n})()\n\n/**\n * @module tmpl\n *\n * tmpl          - Root function, returns the template value, render with data\n * tmpl.hasExpr  - Test the existence of a expression inside a string\n * tmpl.loopKeys - Get the keys for an 'each' loop (used by `_each`)\n */\n\nvar tmpl = (function () {\n\n  var _cache = {}\n\n  function _tmpl (str, data) {\n    if (!str) return str\n\n    return (_cache[str] || (_cache[str] = _create(str))).call(data, _logErr)\n  }\n\n  _tmpl.haveRaw = brackets.hasRaw\n\n  _tmpl.hasExpr = brackets.hasExpr\n\n  _tmpl.loopKeys = brackets.loopKeys\n\n  // istanbul ignore next\n  _tmpl.clearCache = function () { _cache = {} }\n\n  _tmpl.errorHandler = null\n\n  function _logErr (err, ctx) {\n\n    if (_tmpl.errorHandler) {\n\n      err.riotData = {\n        tagName: ctx && ctx.root && ctx.root.tagName,\n        _riot_id: ctx && ctx._riot_id  //eslint-disable-line camelcase\n      }\n      _tmpl.errorHandler(err)\n    }\n  }\n\n  function _create (str) {\n    var expr = _getTmpl(str)\n\n    if (expr.slice(0, 11) !== 'try{return ') expr = 'return ' + expr\n\n    return new Function('E', expr + ';')    // eslint-disable-line no-new-func\n  }\n\n  var\n    CH_IDEXPR = String.fromCharCode(0x2057),\n    RE_CSNAME = /^(?:(-?[_A-Za-z\\xA0-\\xFF][-\\w\\xA0-\\xFF]*)|\\u2057(\\d+)~):/,\n    RE_QBLOCK = RegExp(brackets.S_QBLOCKS, 'g'),\n    RE_DQUOTE = /\\u2057/g,\n    RE_QBMARK = /\\u2057(\\d+)~/g\n\n  function _getTmpl (str) {\n    var\n      qstr = [],\n      expr,\n      parts = brackets.split(str.replace(RE_DQUOTE, '\"'), 1)\n\n    if (parts.length > 2 || parts[0]) {\n      var i, j, list = []\n\n      for (i = j = 0; i < parts.length; ++i) {\n\n        expr = parts[i]\n\n        if (expr && (expr = i & 1\n\n            ? _parseExpr(expr, 1, qstr)\n\n            : '\"' + expr\n                .replace(/\\\\/g, '\\\\\\\\')\n                .replace(/\\r\\n?|\\n/g, '\\\\n')\n                .replace(/\"/g, '\\\\\"') +\n              '\"'\n\n          )) list[j++] = expr\n\n      }\n\n      expr = j < 2 ? list[0]\n           : '[' + list.join(',') + '].join(\"\")'\n\n    } else {\n\n      expr = _parseExpr(parts[1], 0, qstr)\n    }\n\n    if (qstr[0]) {\n      expr = expr.replace(RE_QBMARK, function (_, pos) {\n        return qstr[pos]\n          .replace(/\\r/g, '\\\\r')\n          .replace(/\\n/g, '\\\\n')\n      })\n    }\n    return expr\n  }\n\n  var\n    RE_BREND = {\n      '(': /[()]/g,\n      '[': /[[\\]]/g,\n      '{': /[{}]/g\n    }\n\n  function _parseExpr (expr, asText, qstr) {\n\n    expr = expr\n          .replace(RE_QBLOCK, function (s, div) {\n            return s.length > 2 && !div ? CH_IDEXPR + (qstr.push(s) - 1) + '~' : s\n          })\n          .replace(/\\s+/g, ' ').trim()\n          .replace(/\\ ?([[\\({},?\\.:])\\ ?/g, '$1')\n\n    if (expr) {\n      var\n        list = [],\n        cnt = 0,\n        match\n\n      while (expr &&\n            (match = expr.match(RE_CSNAME)) &&\n            !match.index\n        ) {\n        var\n          key,\n          jsb,\n          re = /,|([[{(])|$/g\n\n        expr = RegExp.rightContext\n        key  = match[2] ? qstr[match[2]].slice(1, -1).trim().replace(/\\s+/g, ' ') : match[1]\n\n        while (jsb = (match = re.exec(expr))[1]) skipBraces(jsb, re)\n\n        jsb  = expr.slice(0, match.index)\n        expr = RegExp.rightContext\n\n        list[cnt++] = _wrapExpr(jsb, 1, key)\n      }\n\n      expr = !cnt ? _wrapExpr(expr, asText)\n           : cnt > 1 ? '[' + list.join(',') + '].join(\" \").trim()' : list[0]\n    }\n    return expr\n\n    function skipBraces (ch, re) {\n      var\n        mm,\n        lv = 1,\n        ir = RE_BREND[ch]\n\n      ir.lastIndex = re.lastIndex\n      while (mm = ir.exec(expr)) {\n        if (mm[0] === ch) ++lv\n        else if (!--lv) break\n      }\n      re.lastIndex = lv ? expr.length : ir.lastIndex\n    }\n  }\n\n  // istanbul ignore next: not both\n  var // eslint-disable-next-line max-len\n    JS_CONTEXT = '\"in this?this:' + (typeof window !== 'object' ? 'global' : 'window') + ').',\n    JS_VARNAME = /[,{][\\$\\w]+(?=:)|(^ *|[^$\\w\\.{])(?!(?:typeof|true|false|null|undefined|in|instanceof|is(?:Finite|NaN)|void|NaN|new|Date|RegExp|Math)(?![$\\w]))([$_A-Za-z][$\\w]*)/g,\n    JS_NOPROPS = /^(?=(\\.[$\\w]+))\\1(?:[^.[(]|$)/\n\n  function _wrapExpr (expr, asText, key) {\n    var tb\n\n    expr = expr.replace(JS_VARNAME, function (match, p, mvar, pos, s) {\n      if (mvar) {\n        pos = tb ? 0 : pos + match.length\n\n        if (mvar !== 'this' && mvar !== 'global' && mvar !== 'window') {\n          match = p + '(\"' + mvar + JS_CONTEXT + mvar\n          if (pos) tb = (s = s[pos]) === '.' || s === '(' || s === '['\n        } else if (pos) {\n          tb = !JS_NOPROPS.test(s.slice(pos))\n        }\n      }\n      return match\n    })\n\n    if (tb) {\n      expr = 'try{return ' + expr + '}catch(e){E(e,this)}'\n    }\n\n    if (key) {\n\n      expr = (tb\n          ? 'function(){' + expr + '}.call(this)' : '(' + expr + ')'\n        ) + '?\"' + key + '\":\"\"'\n\n    } else if (asText) {\n\n      expr = 'function(v){' + (tb\n          ? expr.replace('return ', 'v=') : 'v=(' + expr + ')'\n        ) + ';return v||v===0?v:\"\"}.call(this)'\n    }\n\n    return expr\n  }\n\n  _tmpl.version = brackets.version = 'v2.4.2'\n\n  return _tmpl\n\n})()\n\n/*\n  lib/browser/tag/mkdom.js\n\n  Includes hacks needed for the Internet Explorer version 9 and below\n  See: http://kangax.github.io/compat-table/es5/#ie8\n       http://codeplanet.io/dropping-ie8/\n*/\nvar mkdom = (function _mkdom() {\n  var\n    reHasYield  = /<yield\\b/i,\n    reYieldAll  = /<yield\\s*(?:\\/>|>([\\S\\s]*?)<\\/yield\\s*>|>)/ig,\n    reYieldSrc  = /<yield\\s+to=['\"]([^'\">]*)['\"]\\s*>([\\S\\s]*?)<\\/yield\\s*>/ig,\n    reYieldDest = /<yield\\s+from=['\"]?([-\\w]+)['\"]?\\s*(?:\\/>|>([\\S\\s]*?)<\\/yield\\s*>)/ig\n  var\n    rootEls = { tr: 'tbody', th: 'tr', td: 'tr', col: 'colgroup' },\n    tblTags = IE_VERSION && IE_VERSION < 10\n      ? SPECIAL_TAGS_REGEX : /^(?:t(?:body|head|foot|[rhd])|caption|col(?:group)?)$/\n\n  /**\n   * Creates a DOM element to wrap the given content. Normally an `DIV`, but can be\n   * also a `TABLE`, `SELECT`, `TBODY`, `TR`, or `COLGROUP` element.\n   *\n   * @param   { String } templ  - The template coming from the custom tag definition\n   * @param   { String } [html] - HTML content that comes from the DOM element where you\n   *           will mount the tag, mostly the original tag in the page\n   * @param   { Boolean } checkSvg - flag needed to know if we need to force the svg rendering in case of loop nodes\n   * @returns {HTMLElement} DOM element with _templ_ merged through `YIELD` with the _html_.\n   */\n  function _mkdom(templ, html, checkSvg) {\n    var\n      match   = templ && templ.match(/^\\s*<([-\\w]+)/),\n      tagName = match && match[1].toLowerCase(),\n      el = mkEl('div', checkSvg && isSVGTag(tagName))\n\n    // replace all the yield tags with the tag inner html\n    templ = replaceYield(templ, html)\n\n    /* istanbul ignore next */\n    if (tblTags.test(tagName))\n      el = specialTags(el, templ, tagName)\n    else\n      setInnerHTML(el, templ)\n\n    el.stub = true\n\n    return el\n  }\n\n  /*\n    Creates the root element for table or select child elements:\n    tr/th/td/thead/tfoot/tbody/caption/col/colgroup/option/optgroup\n  */\n  function specialTags(el, templ, tagName) {\n    var\n      select = tagName[0] === 'o',\n      parent = select ? 'select>' : 'table>'\n\n    // trim() is important here, this ensures we don't have artifacts,\n    // so we can check if we have only one element inside the parent\n    el.innerHTML = '<' + parent + templ.trim() + '</' + parent\n    parent = el.firstChild\n\n    // returns the immediate parent if tr/th/td/col is the only element, if not\n    // returns the whole tree, as this can include additional elements\n    if (select) {\n      parent.selectedIndex = -1  // for IE9, compatible w/current riot behavior\n    } else {\n      // avoids insertion of cointainer inside container (ex: tbody inside tbody)\n      var tname = rootEls[tagName]\n      if (tname && parent.childElementCount === 1) parent = $(tname, parent)\n    }\n    return parent\n  }\n\n  /*\n    Replace the yield tag from any tag template with the innerHTML of the\n    original tag in the page\n  */\n  function replaceYield(templ, html) {\n    // do nothing if no yield\n    if (!reHasYield.test(templ)) return templ\n\n    // be careful with #1343 - string on the source having `$1`\n    var src = {}\n\n    html = html && html.replace(reYieldSrc, function (_, ref, text) {\n      src[ref] = src[ref] || text   // preserve first definition\n      return ''\n    }).trim()\n\n    return templ\n      .replace(reYieldDest, function (_, ref, def) {  // yield with from - to attrs\n        return src[ref] || def || ''\n      })\n      .replace(reYieldAll, function (_, def) {        // yield without any \"from\"\n        return html || def || ''\n      })\n  }\n\n  return _mkdom\n\n})()\n\n/**\n * Convert the item looped into an object used to extend the child tag properties\n * @param   { Object } expr - object containing the keys used to extend the children tags\n * @param   { * } key - value to assign to the new object returned\n * @param   { * } val - value containing the position of the item in the array\n * @returns { Object } - new object containing the values of the original item\n *\n * The variables 'key' and 'val' are arbitrary.\n * They depend on the collection type looped (Array, Object)\n * and on the expression used on the each tag\n *\n */\nfunction mkitem(expr, key, val) {\n  var item = {}\n  item[expr.key] = key\n  if (expr.pos) item[expr.pos] = val\n  return item\n}\n\n/**\n * Unmount the redundant tags\n * @param   { Array } items - array containing the current items to loop\n * @param   { Array } tags - array containing all the children tags\n */\nfunction unmountRedundant(items, tags) {\n\n  var i = tags.length,\n    j = items.length,\n    t\n\n  while (i > j) {\n    t = tags[--i]\n    tags.splice(i, 1)\n    t.unmount()\n  }\n}\n\n/**\n * Move the nested custom tags in non custom loop tags\n * @param   { Object } child - non custom loop tag\n * @param   { Number } i - current position of the loop tag\n */\nfunction moveNestedTags(child, i) {\n  Object.keys(child.tags).forEach(function(tagName) {\n    var tag = child.tags[tagName]\n    if (isArray(tag))\n      each(tag, function (t) {\n        moveChildTag(t, tagName, i)\n      })\n    else\n      moveChildTag(tag, tagName, i)\n  })\n}\n\n/**\n * Adds the elements for a virtual tag\n * @param { Tag } tag - the tag whose root's children will be inserted or appended\n * @param { Node } src - the node that will do the inserting or appending\n * @param { Tag } target - only if inserting, insert before this tag's first child\n */\nfunction addVirtual(tag, src, target) {\n  var el = tag._root, sib\n  tag._virts = []\n  while (el) {\n    sib = el.nextSibling\n    if (target)\n      src.insertBefore(el, target._root)\n    else\n      src.appendChild(el)\n\n    tag._virts.push(el) // hold for unmounting\n    el = sib\n  }\n}\n\n/**\n * Move virtual tag and all child nodes\n * @param { Tag } tag - first child reference used to start move\n * @param { Node } src  - the node that will do the inserting\n * @param { Tag } target - insert before this tag's first child\n * @param { Number } len - how many child nodes to move\n */\nfunction moveVirtual(tag, src, target, len) {\n  var el = tag._root, sib, i = 0\n  for (; i < len; i++) {\n    sib = el.nextSibling\n    src.insertBefore(el, target._root)\n    el = sib\n  }\n}\n\n/**\n * Insert a new tag avoiding the insert for the conditional tags\n * @param   {Boolean} isVirtual [description]\n * @param   { Tag }  prevTag - tag instance used as reference to prepend our new tag\n * @param   { Tag }  newTag - new tag to be inserted\n * @param   { HTMLElement }  root - loop parent node\n * @param   { Array }  tags - array containing the current tags list\n * @param   { Function }  virtualFn - callback needed to move or insert virtual DOM\n * @param   { Object } dom - DOM node we need to loop\n */\nfunction insertTag(isVirtual, prevTag, newTag, root, tags, virtualFn, dom) {\n  if (isInStub(prevTag.root)) return\n  if (isVirtual) virtualFn(prevTag, root, newTag, dom.childNodes.length)\n  else root.insertBefore(prevTag.root, newTag.root) // #1374 some browsers reset selected here\n}\n\n\n/**\n * Manage tags having the 'each'\n * @param   { Object } dom - DOM node we need to loop\n * @param   { Tag } parent - parent tag instance where the dom node is contained\n * @param   { String } expr - string contained in the 'each' attribute\n */\nfunction _each(dom, parent, expr) {\n\n  // remove the each property from the original tag\n  remAttr(dom, 'each')\n\n  var mustReorder = typeof getAttr(dom, 'no-reorder') !== T_STRING || remAttr(dom, 'no-reorder'),\n    tagName = getTagName(dom),\n    impl = __tagImpl[tagName] || { tmpl: getOuterHTML(dom) },\n    useRoot = SPECIAL_TAGS_REGEX.test(tagName),\n    root = dom.parentNode,\n    ref = document.createTextNode(''),\n    child = getTag(dom),\n    isOption = tagName.toLowerCase() === 'option', // the option tags must be treated differently\n    tags = [],\n    oldItems = [],\n    hasKeys,\n    isVirtual = dom.tagName == 'VIRTUAL'\n\n  // parse the each expression\n  expr = tmpl.loopKeys(expr)\n\n  // insert a marked where the loop tags will be injected\n  root.insertBefore(ref, dom)\n\n  // clean template code\n  parent.one('before-mount', function () {\n\n    // remove the original DOM node\n    dom.parentNode.removeChild(dom)\n    if (root.stub) root = parent.root\n\n  }).on('update', function () {\n    // get the new items collection\n    var items = tmpl(expr.val, parent),\n      // create a fragment to hold the new DOM nodes to inject in the parent tag\n      frag = document.createDocumentFragment()\n\n    // object loop. any changes cause full redraw\n    if (!isArray(items)) {\n      hasKeys = items || false\n      items = hasKeys ?\n        Object.keys(items).map(function (key) {\n          return mkitem(expr, key, items[key])\n        }) : []\n    }\n\n    // loop all the new items\n    var i = 0,\n      itemsLength = items.length\n\n    for (; i < itemsLength; i++) {\n      // reorder only if the items are objects\n      var\n        item = items[i],\n        _mustReorder = mustReorder && typeof item == T_OBJECT && !hasKeys,\n        oldPos = oldItems.indexOf(item),\n        pos = ~oldPos && _mustReorder ? oldPos : i,\n        // does a tag exist in this position?\n        tag = tags[pos]\n\n      item = !hasKeys && expr.key ? mkitem(expr, item, i) : item\n\n      // new tag\n      if (\n        !_mustReorder && !tag // with no-reorder we just update the old tags\n        ||\n        _mustReorder && !~oldPos || !tag // by default we always try to reorder the DOM elements\n      ) {\n\n        tag = new Tag(impl, {\n          parent: parent,\n          isLoop: true,\n          hasImpl: !!__tagImpl[tagName],\n          root: useRoot ? root : dom.cloneNode(),\n          item: item\n        }, dom.innerHTML)\n\n        tag.mount()\n\n        if (isVirtual) tag._root = tag.root.firstChild // save reference for further moves or inserts\n        // this tag must be appended\n        if (i == tags.length || !tags[i]) { // fix 1581\n          if (isVirtual)\n            addVirtual(tag, frag)\n          else frag.appendChild(tag.root)\n        }\n        // this tag must be insert\n        else {\n          insertTag(isVirtual, tag, tags[i], root, tags, addVirtual, dom)\n          oldItems.splice(i, 0, item)\n        }\n\n        tags.splice(i, 0, tag)\n        pos = i // handled here so no move\n      } else tag.update(item, true)\n\n      // reorder the tag if it's not located in its previous position\n      if (\n        pos !== i && _mustReorder &&\n        tags[i] // fix 1581 unable to reproduce it in a test!\n      ) {\n        // #closes 2040 PLEASE DON'T REMOVE IT!\n        // there are no tests for this feature\n        if (contains(items, oldItems[i]))\n          insertTag(isVirtual, tag, tags[i], root, tags, moveVirtual, dom)\n\n        // update the position attribute if it exists\n        if (expr.pos)\n          tag[expr.pos] = i\n        // move the old tag instance\n        tags.splice(i, 0, tags.splice(pos, 1)[0])\n        // move the old item\n        oldItems.splice(i, 0, oldItems.splice(pos, 1)[0])\n        // if the loop tags are not custom\n        // we need to move all their custom tags into the right position\n        if (!child && tag.tags) moveNestedTags(tag, i)\n      }\n\n      // cache the original item to use it in the events bound to this node\n      // and its children\n      tag._item = item\n      // cache the real parent tag internally\n      defineProperty(tag, '_parent', parent)\n    }\n\n    // remove the redundant tags\n    unmountRedundant(items, tags)\n\n    // insert the new nodes\n    root.insertBefore(frag, ref)\n    if (isOption) {\n\n      // #1374 FireFox bug in <option selected={expression}>\n      if (FIREFOX && !root.multiple) {\n        for (var n = 0; n < root.length; n++) {\n          if (root[n].__riot1374) {\n            root.selectedIndex = n  // clear other options\n            delete root[n].__riot1374\n            break\n          }\n        }\n      }\n    }\n\n    // set the 'tags' property of the parent tag\n    // if child is 'undefined' it means that we don't need to set this property\n    // for example:\n    // we don't need store the `myTag.tags['div']` property if we are looping a div tag\n    // but we need to track the `myTag.tags['child']` property looping a custom child node named `child`\n    if (child) parent.tags[tagName] = tags\n\n    // clone the items array\n    oldItems = items.slice()\n\n  })\n\n}\n/**\n * Object that will be used to inject and manage the css of every tag instance\n */\nvar styleManager = (function(_riot) {\n\n  if (!window) return { // skip injection on the server\n    add: function () {},\n    inject: function () {}\n  }\n\n  var styleNode = (function () {\n    // create a new style element with the correct type\n    var newNode = mkEl('style')\n    setAttr(newNode, 'type', 'text/css')\n\n    // replace any user node or insert the new one into the head\n    var userNode = $('style[type=riot]')\n    if (userNode) {\n      if (userNode.id) newNode.id = userNode.id\n      userNode.parentNode.replaceChild(newNode, userNode)\n    }\n    else document.getElementsByTagName('head')[0].appendChild(newNode)\n\n    return newNode\n  })()\n\n  // Create cache and shortcut to the correct property\n  var cssTextProp = styleNode.styleSheet,\n    stylesToInject = ''\n\n  // Expose the style node in a non-modificable property\n  Object.defineProperty(_riot, 'styleNode', {\n    value: styleNode,\n    writable: true\n  })\n\n  /**\n   * Public api\n   */\n  return {\n    /**\n     * Save a tag style to be later injected into DOM\n     * @param   { String } css [description]\n     */\n    add: function(css) {\n      stylesToInject += css\n    },\n    /**\n     * Inject all previously saved tag styles into DOM\n     * innerHTML seems slow: http://jsperf.com/riot-insert-style\n     */\n    inject: function() {\n      if (stylesToInject) {\n        if (cssTextProp) cssTextProp.cssText += stylesToInject\n        else styleNode.innerHTML += stylesToInject\n        stylesToInject = ''\n      }\n    }\n  }\n\n})(riot)\n\n\nfunction parseNamedElements(root, tag, childTags, forceParsingNamed) {\n\n  walk(root, function(dom) {\n    if (dom.nodeType == 1) {\n      dom.isLoop = dom.isLoop ||\n                  (dom.parentNode && dom.parentNode.isLoop || getAttr(dom, 'each'))\n                    ? 1 : 0\n\n      // custom child tag\n      if (childTags) {\n        var child = getTag(dom)\n\n        if (child && !dom.isLoop)\n          childTags.push(initChildTag(child, {root: dom, parent: tag}, dom.innerHTML, tag))\n      }\n\n      if (!dom.isLoop || forceParsingNamed)\n        setNamed(dom, tag, [])\n    }\n\n  })\n\n}\n\nfunction parseExpressions(root, tag, expressions) {\n\n  function addExpr(dom, val, extra) {\n    if (tmpl.hasExpr(val)) {\n      expressions.push(extend({ dom: dom, expr: val }, extra))\n    }\n  }\n\n  walk(root, function(dom) {\n    var type = dom.nodeType,\n      attr\n\n    // text node\n    if (type == 3 && dom.parentNode.tagName != 'STYLE') addExpr(dom, dom.nodeValue)\n    if (type != 1) return\n\n    /* element */\n\n    // loop\n    attr = getAttr(dom, 'each')\n\n    if (attr) { _each(dom, tag, attr); return false }\n\n    // attribute expressions\n    each(dom.attributes, function(attr) {\n      var name = attr.name,\n        bool = name.split('__')[1]\n\n      addExpr(dom, attr.value, { attr: bool || name, bool: bool })\n      if (bool) { remAttr(dom, name); return false }\n\n    })\n\n    // skip custom tags\n    if (getTag(dom)) return false\n\n  })\n\n}\nfunction Tag(impl, conf, innerHTML) {\n\n  var self = riot.observable(this),\n    opts = inherit(conf.opts) || {},\n    parent = conf.parent,\n    isLoop = conf.isLoop,\n    hasImpl = conf.hasImpl,\n    item = cleanUpData(conf.item),\n    expressions = [],\n    childTags = [],\n    root = conf.root,\n    tagName = root.tagName.toLowerCase(),\n    attr = {},\n    propsInSyncWithParent = [],\n    dom\n\n  // only call unmount if we have a valid __tagImpl (has name property)\n  if (impl.name && root._tag) root._tag.unmount(true)\n\n  // not yet mounted\n  this.isMounted = false\n  root.isLoop = isLoop\n\n  // keep a reference to the tag just created\n  // so we will be able to mount this tag multiple times\n  root._tag = this\n\n  // create a unique id to this tag\n  // it could be handy to use it also to improve the virtual dom rendering speed\n  defineProperty(this, '_riot_id', ++__uid) // base 1 allows test !t._riot_id\n\n  extend(this, { parent: parent, root: root, opts: opts}, item)\n  // protect the \"tags\" property from being overridden\n  defineProperty(this, 'tags', {})\n\n  // grab attributes\n  each(root.attributes, function(el) {\n    var val = el.value\n    // remember attributes with expressions only\n    if (tmpl.hasExpr(val)) attr[el.name] = val\n  })\n\n  dom = mkdom(impl.tmpl, innerHTML, isLoop)\n\n  // options\n  function updateOpts() {\n    var ctx = hasImpl && isLoop ? self : parent || self\n\n    // update opts from current DOM attributes\n    each(root.attributes, function(el) {\n      if (el.name in attr) return\n      var val = el.value\n      opts[toCamel(el.name)] = tmpl.hasExpr(val) ? tmpl(val, ctx) : val\n    })\n    // recover those with expressions\n    each(Object.keys(attr), function(name) {\n      opts[toCamel(name)] = tmpl(attr[name], ctx)\n    })\n  }\n\n  function normalizeData(data) {\n    for (var key in item) {\n      if (typeof self[key] !== T_UNDEF && isWritable(self, key))\n        self[key] = data[key]\n    }\n  }\n\n  function inheritFrom(target) {\n    each(Object.keys(target), function(k) {\n      // some properties must be always in sync with the parent tag\n      var mustSync = !RESERVED_WORDS_BLACKLIST.test(k) && contains(propsInSyncWithParent, k)\n\n      if (typeof self[k] === T_UNDEF || mustSync) {\n        // track the property to keep in sync\n        // so we can keep it updated\n        if (!mustSync) propsInSyncWithParent.push(k)\n        self[k] = target[k]\n      }\n    })\n  }\n\n  /**\n   * Update the tag expressions and options\n   * @param   { * }  data - data we want to use to extend the tag properties\n   * @param   { Boolean } isInherited - is this update coming from a parent tag?\n   * @returns { self }\n   */\n  defineProperty(this, 'update', function(data, isInherited) {\n\n    // make sure the data passed will not override\n    // the component core methods\n    data = cleanUpData(data)\n    // inherit properties from the parent in loop\n    if (isLoop) {\n      inheritFrom(self.parent)\n    }\n    // normalize the tag properties in case an item object was initially passed\n    if (data && isObject(item)) {\n      normalizeData(data)\n      item = data\n    }\n    extend(self, data)\n    updateOpts()\n    self.trigger('update', data)\n    update(expressions, self)\n\n    // the updated event will be triggered\n    // once the DOM will be ready and all the re-flows are completed\n    // this is useful if you want to get the \"real\" root properties\n    // 4 ex: root.offsetWidth ...\n    if (isInherited && self.parent)\n      // closes #1599\n      self.parent.one('updated', function() { self.trigger('updated') })\n    else rAF(function() { self.trigger('updated') })\n\n    return this\n  })\n\n  defineProperty(this, 'mixin', function() {\n    each(arguments, function(mix) {\n      var instance,\n        props = [],\n        obj\n\n      mix = typeof mix === T_STRING ? riot.mixin(mix) : mix\n\n      // check if the mixin is a function\n      if (isFunction(mix)) {\n        // create the new mixin instance\n        instance = new mix()\n      } else instance = mix\n\n      var proto = Object.getPrototypeOf(instance)\n\n      // build multilevel prototype inheritance chain property list\n      do props = props.concat(Object.getOwnPropertyNames(obj || instance))\n      while (obj = Object.getPrototypeOf(obj || instance))\n\n      // loop the keys in the function prototype or the all object keys\n      each(props, function(key) {\n        // bind methods to self\n        // allow mixins to override other properties/parent mixins\n        if (key != 'init' && key != '__proto__') {\n          // check for getters/setters\n          var descriptor = Object.getOwnPropertyDescriptor(instance, key) || Object.getOwnPropertyDescriptor(proto, key)\n          var hasGetterSetter = descriptor && (descriptor.get || descriptor.set)\n\n          // apply method only if it does not already exist on the instance\n          if (!self.hasOwnProperty(key) && hasGetterSetter) {\n            Object.defineProperty(self, key, descriptor)\n          } else {\n            self[key] = isFunction(instance[key]) ?\n              instance[key].bind(self) :\n              instance[key]\n          }\n        }\n      })\n\n      // init method will be called automatically\n      if (instance.init) instance.init.bind(self)()\n    })\n    return this\n  })\n\n  defineProperty(this, 'mount', function() {\n\n    updateOpts()\n\n    // add global mixins\n    var globalMixin = riot.mixin(GLOBAL_MIXIN)\n\n    if (globalMixin)\n      for (var i in globalMixin)\n        if (globalMixin.hasOwnProperty(i))\n          self.mixin(globalMixin[i])\n\n    // children in loop should inherit from true parent\n    if (self._parent && self._parent.root.isLoop) {\n      inheritFrom(self._parent)\n    }\n\n    // initialiation\n    if (impl.fn) impl.fn.call(self, opts)\n\n    // parse layout after init. fn may calculate args for nested custom tags\n    parseExpressions(dom, self, expressions)\n\n    // mount the child tags\n    toggle(true)\n\n    // update the root adding custom attributes coming from the compiler\n    // it fixes also #1087\n    if (impl.attrs)\n      walkAttributes(impl.attrs, function (k, v) { setAttr(root, k, v) })\n    if (impl.attrs || hasImpl)\n      parseExpressions(self.root, self, expressions)\n\n    if (!self.parent || isLoop) self.update(item)\n\n    // internal use only, fixes #403\n    self.trigger('before-mount')\n\n    if (isLoop && !hasImpl) {\n      // update the root attribute for the looped elements\n      root = dom.firstChild\n    } else {\n      while (dom.firstChild) root.appendChild(dom.firstChild)\n      if (root.stub) root = parent.root\n    }\n\n    defineProperty(self, 'root', root)\n\n    // parse the named dom nodes in the looped child\n    // adding them to the parent as well\n    if (isLoop)\n      parseNamedElements(self.root, self.parent, null, true)\n\n    // if it's not a child tag we can trigger its mount event\n    if (!self.parent || self.parent.isMounted) {\n      self.isMounted = true\n      self.trigger('mount')\n    }\n    // otherwise we need to wait that the parent event gets triggered\n    else self.parent.one('mount', function() {\n      // avoid to trigger the `mount` event for the tags\n      // not visible included in an if statement\n      if (!isInStub(self.root)) {\n        self.parent.isMounted = self.isMounted = true\n        self.trigger('mount')\n      }\n    })\n  })\n\n\n  defineProperty(this, 'unmount', function(keepRootTag) {\n    var el = root,\n      p = el.parentNode,\n      ptag,\n      tagIndex = __virtualDom.indexOf(self)\n\n    self.trigger('before-unmount')\n\n    // remove this tag instance from the global virtualDom variable\n    if (~tagIndex)\n      __virtualDom.splice(tagIndex, 1)\n\n    if (p) {\n\n      if (parent) {\n        ptag = getImmediateCustomParentTag(parent)\n        // remove this tag from the parent tags object\n        // if there are multiple nested tags with same name..\n        // remove this element form the array\n        if (isArray(ptag.tags[tagName]))\n          each(ptag.tags[tagName], function(tag, i) {\n            if (tag._riot_id == self._riot_id)\n              ptag.tags[tagName].splice(i, 1)\n          })\n        else\n          // otherwise just delete the tag instance\n          ptag.tags[tagName] = undefined\n      }\n\n      else\n        while (el.firstChild) el.removeChild(el.firstChild)\n\n      if (!keepRootTag)\n        p.removeChild(el)\n      else {\n        // the riot-tag and the data-is attributes aren't needed anymore, remove them\n        remAttr(p, RIOT_TAG_IS)\n        remAttr(p, RIOT_TAG) // this will be removed in riot 3.0.0\n      }\n\n    }\n\n    if (this._virts) {\n      each(this._virts, function(v) {\n        if (v.parentNode) v.parentNode.removeChild(v)\n      })\n    }\n\n    self.trigger('unmount')\n    toggle()\n    self.off('*')\n    self.isMounted = false\n    delete root._tag\n\n  })\n\n  // proxy function to bind updates\n  // dispatched from a parent tag\n  function onChildUpdate(data) { self.update(data, true) }\n\n  function toggle(isMount) {\n\n    // mount/unmount children\n    each(childTags, function(child) { child[isMount ? 'mount' : 'unmount']() })\n\n    // listen/unlisten parent (events flow one way from parent to children)\n    if (!parent) return\n    var evt = isMount ? 'on' : 'off'\n\n    // the loop tags will be always in sync with the parent automatically\n    if (isLoop)\n      parent[evt]('unmount', self.unmount)\n    else {\n      parent[evt]('update', onChildUpdate)[evt]('unmount', self.unmount)\n    }\n  }\n\n\n  // named elements available for fn\n  parseNamedElements(dom, this, childTags)\n\n}\n/**\n * Attach an event to a DOM node\n * @param { String } name - event name\n * @param { Function } handler - event callback\n * @param { Object } dom - dom node\n * @param { Tag } tag - tag instance\n */\nfunction setEventHandler(name, handler, dom, tag) {\n\n  dom[name] = function(e) {\n\n    var ptag = tag._parent,\n      item = tag._item,\n      el\n\n    if (!item)\n      while (ptag && !item) {\n        item = ptag._item\n        ptag = ptag._parent\n      }\n\n    // cross browser event fix\n    e = e || window.event\n\n    // override the event properties\n    if (isWritable(e, 'currentTarget')) e.currentTarget = dom\n    if (isWritable(e, 'target')) e.target = e.srcElement\n    if (isWritable(e, 'which')) e.which = e.charCode || e.keyCode\n\n    e.item = item\n\n    // prevent default behaviour (by default)\n    if (handler.call(tag, e) !== true && !/radio|check/.test(dom.type)) {\n      if (e.preventDefault) e.preventDefault()\n      e.returnValue = false\n    }\n\n    if (!e.preventUpdate) {\n      el = item ? getImmediateCustomParentTag(ptag) : tag\n      el.update()\n    }\n\n  }\n\n}\n\n\n/**\n * Insert a DOM node replacing another one (used by if- attribute)\n * @param   { Object } root - parent node\n * @param   { Object } node - node replaced\n * @param   { Object } before - node added\n */\nfunction insertTo(root, node, before) {\n  if (!root) return\n  root.insertBefore(before, node)\n  root.removeChild(node)\n}\n\n/**\n * Update the expressions in a Tag instance\n * @param   { Array } expressions - expression that must be re evaluated\n * @param   { Tag } tag - tag instance\n */\nfunction update(expressions, tag) {\n\n  each(expressions, function(expr, i) {\n\n    var dom = expr.dom,\n      attrName = expr.attr,\n      value = tmpl(expr.expr, tag),\n      parent = expr.parent || expr.dom.parentNode\n\n    if (expr.bool) {\n      value = !!value\n    } else if (value == null) {\n      value = ''\n    }\n\n    // #1638: regression of #1612, update the dom only if the value of the\n    // expression was changed\n    if (expr.value === value) {\n      return\n    }\n    expr.value = value\n\n    // textarea and text nodes has no attribute name\n    if (!attrName) {\n      // about #815 w/o replace: the browser converts the value to a string,\n      // the comparison by \"==\" does too, but not in the server\n      value += ''\n      // test for parent avoids error with invalid assignment to nodeValue\n      if (parent) {\n        // cache the parent node because somehow it will become null on IE\n        // on the next iteration\n        expr.parent = parent\n        if (parent.tagName === 'TEXTAREA') {\n          parent.value = value                    // #1113\n          if (!IE_VERSION) dom.nodeValue = value  // #1625 IE throws here, nodeValue\n        }                                         // will be available on 'updated'\n        else dom.nodeValue = value\n      }\n      return\n    }\n\n    // ~~#1612: look for changes in dom.value when updating the value~~\n    if (attrName === 'value') {\n      if (dom.value !== value) {\n        dom.value = value\n        setAttr(dom, attrName, value)\n      }\n      return\n    } else {\n      // remove original attribute\n      remAttr(dom, attrName)\n    }\n\n    // event handler\n    if (isFunction(value)) {\n      setEventHandler(attrName, value, dom, tag)\n\n    // if- conditional\n    } else if (attrName == 'if') {\n      var stub = expr.stub,\n        add = function() { insertTo(stub.parentNode, stub, dom) },\n        remove = function() { insertTo(dom.parentNode, dom, stub) }\n\n      // add to DOM\n      if (value) {\n        if (stub) {\n          add()\n          dom.inStub = false\n          // avoid to trigger the mount event if the tags is not visible yet\n          // maybe we can optimize this avoiding to mount the tag at all\n          if (!isInStub(dom)) {\n            walk(dom, function(el) {\n              if (el._tag && !el._tag.isMounted)\n                el._tag.isMounted = !!el._tag.trigger('mount')\n            })\n          }\n        }\n      // remove from DOM\n      } else {\n        stub = expr.stub = stub || document.createTextNode('')\n        // if the parentNode is defined we can easily replace the tag\n        if (dom.parentNode)\n          remove()\n        // otherwise we need to wait the updated event\n        else (tag.parent || tag).one('updated', remove)\n\n        dom.inStub = true\n      }\n    // show / hide\n    } else if (attrName === 'show') {\n      dom.style.display = value ? '' : 'none'\n\n    } else if (attrName === 'hide') {\n      dom.style.display = value ? 'none' : ''\n\n    } else if (expr.bool) {\n      dom[attrName] = value\n      if (value) setAttr(dom, attrName, attrName)\n      if (FIREFOX && attrName === 'selected' && dom.tagName === 'OPTION') {\n        dom.__riot1374 = value   // #1374\n      }\n\n    } else if (value === 0 || value && typeof value !== T_OBJECT) {\n      // <img src=\"{ expr }\">\n      if (startsWith(attrName, RIOT_PREFIX) && attrName != RIOT_TAG) {\n        attrName = attrName.slice(RIOT_PREFIX.length)\n      }\n      setAttr(dom, attrName, value)\n    }\n\n  })\n\n}\n/**\n * Specialized function for looping an array-like collection with `each={}`\n * @param   { Array } els - collection of items\n * @param   {Function} fn - callback function\n * @returns { Array } the array looped\n */\nfunction each(els, fn) {\n  var len = els ? els.length : 0\n\n  for (var i = 0, el; i < len; i++) {\n    el = els[i]\n    // return false -> current item was removed by fn during the loop\n    if (el != null && fn(el, i) === false) i--\n  }\n  return els\n}\n\n/**\n * Detect if the argument passed is a function\n * @param   { * } v - whatever you want to pass to this function\n * @returns { Boolean } -\n */\nfunction isFunction(v) {\n  return typeof v === T_FUNCTION || false   // avoid IE problems\n}\n\n/**\n * Get the outer html of any DOM node SVGs included\n * @param   { Object } el - DOM node to parse\n * @returns { String } el.outerHTML\n */\nfunction getOuterHTML(el) {\n  if (el.outerHTML) return el.outerHTML\n  // some browsers do not support outerHTML on the SVGs tags\n  else {\n    var container = mkEl('div')\n    container.appendChild(el.cloneNode(true))\n    return container.innerHTML\n  }\n}\n\n/**\n * Set the inner html of any DOM node SVGs included\n * @param { Object } container - DOM node where we will inject the new html\n * @param { String } html - html to inject\n */\nfunction setInnerHTML(container, html) {\n  if (typeof container.innerHTML != T_UNDEF) container.innerHTML = html\n  // some browsers do not support innerHTML on the SVGs tags\n  else {\n    var doc = new DOMParser().parseFromString(html, 'application/xml')\n    container.appendChild(\n      container.ownerDocument.importNode(doc.documentElement, true)\n    )\n  }\n}\n\n/**\n * Checks wether a DOM node must be considered part of an svg document\n * @param   { String }  name - tag name\n * @returns { Boolean } -\n */\nfunction isSVGTag(name) {\n  return ~SVG_TAGS_LIST.indexOf(name)\n}\n\n/**\n * Detect if the argument passed is an object, exclude null.\n * NOTE: Use isObject(x) && !isArray(x) to excludes arrays.\n * @param   { * } v - whatever you want to pass to this function\n * @returns { Boolean } -\n */\nfunction isObject(v) {\n  return v && typeof v === T_OBJECT         // typeof null is 'object'\n}\n\n/**\n * Remove any DOM attribute from a node\n * @param   { Object } dom - DOM node we want to update\n * @param   { String } name - name of the property we want to remove\n */\nfunction remAttr(dom, name) {\n  dom.removeAttribute(name)\n}\n\n/**\n * Convert a string containing dashes to camel case\n * @param   { String } string - input string\n * @returns { String } my-string -> myString\n */\nfunction toCamel(string) {\n  return string.replace(/-(\\w)/g, function(_, c) {\n    return c.toUpperCase()\n  })\n}\n\n/**\n * Get the value of any DOM attribute on a node\n * @param   { Object } dom - DOM node we want to parse\n * @param   { String } name - name of the attribute we want to get\n * @returns { String | undefined } name of the node attribute whether it exists\n */\nfunction getAttr(dom, name) {\n  return dom.getAttribute(name)\n}\n\n/**\n * Set any DOM/SVG attribute\n * @param { Object } dom - DOM node we want to update\n * @param { String } name - name of the property we want to set\n * @param { String } val - value of the property we want to set\n */\nfunction setAttr(dom, name, val) {\n  var xlink = XLINK_REGEX.exec(name)\n  if (xlink && xlink[1])\n    dom.setAttributeNS(XLINK_NS, xlink[1], val)\n  else\n    dom.setAttribute(name, val)\n}\n\n/**\n * Detect the tag implementation by a DOM node\n * @param   { Object } dom - DOM node we need to parse to get its tag implementation\n * @returns { Object } it returns an object containing the implementation of a custom tag (template and boot function)\n */\nfunction getTag(dom) {\n  return dom.tagName && __tagImpl[getAttr(dom, RIOT_TAG_IS) ||\n    getAttr(dom, RIOT_TAG) || dom.tagName.toLowerCase()]\n}\n/**\n * Add a child tag to its parent into the `tags` object\n * @param   { Object } tag - child tag instance\n * @param   { String } tagName - key where the new tag will be stored\n * @param   { Object } parent - tag instance where the new child tag will be included\n */\nfunction addChildTag(tag, tagName, parent) {\n  var cachedTag = parent.tags[tagName]\n\n  // if there are multiple children tags having the same name\n  if (cachedTag) {\n    // if the parent tags property is not yet an array\n    // create it adding the first cached tag\n    if (!isArray(cachedTag))\n      // don't add the same tag twice\n      if (cachedTag !== tag)\n        parent.tags[tagName] = [cachedTag]\n    // add the new nested tag to the array\n    if (!contains(parent.tags[tagName], tag))\n      parent.tags[tagName].push(tag)\n  } else {\n    parent.tags[tagName] = tag\n  }\n}\n\n/**\n * Move the position of a custom tag in its parent tag\n * @param   { Object } tag - child tag instance\n * @param   { String } tagName - key where the tag was stored\n * @param   { Number } newPos - index where the new tag will be stored\n */\nfunction moveChildTag(tag, tagName, newPos) {\n  var parent = tag.parent,\n    tags\n  // no parent no move\n  if (!parent) return\n\n  tags = parent.tags[tagName]\n\n  if (isArray(tags))\n    tags.splice(newPos, 0, tags.splice(tags.indexOf(tag), 1)[0])\n  else addChildTag(tag, tagName, parent)\n}\n\n/**\n * Create a new child tag including it correctly into its parent\n * @param   { Object } child - child tag implementation\n * @param   { Object } opts - tag options containing the DOM node where the tag will be mounted\n * @param   { String } innerHTML - inner html of the child node\n * @param   { Object } parent - instance of the parent tag including the child custom tag\n * @returns { Object } instance of the new child tag just created\n */\nfunction initChildTag(child, opts, innerHTML, parent) {\n  var tag = new Tag(child, opts, innerHTML),\n    tagName = getTagName(opts.root),\n    ptag = getImmediateCustomParentTag(parent)\n  // fix for the parent attribute in the looped elements\n  tag.parent = ptag\n  // store the real parent tag\n  // in some cases this could be different from the custom parent tag\n  // for example in nested loops\n  tag._parent = parent\n\n  // add this tag to the custom parent tag\n  addChildTag(tag, tagName, ptag)\n  // and also to the real parent tag\n  if (ptag !== parent)\n    addChildTag(tag, tagName, parent)\n  // empty the child node once we got its template\n  // to avoid that its children get compiled multiple times\n  opts.root.innerHTML = ''\n\n  return tag\n}\n\n/**\n * Loop backward all the parents tree to detect the first custom parent tag\n * @param   { Object } tag - a Tag instance\n * @returns { Object } the instance of the first custom parent tag found\n */\nfunction getImmediateCustomParentTag(tag) {\n  var ptag = tag\n  while (!getTag(ptag.root)) {\n    if (!ptag.parent) break\n    ptag = ptag.parent\n  }\n  return ptag\n}\n\n/**\n * Helper function to set an immutable property\n * @param   { Object } el - object where the new property will be set\n * @param   { String } key - object key where the new property will be stored\n * @param   { * } value - value of the new property\n* @param   { Object } options - set the propery overriding the default options\n * @returns { Object } - the initial object\n */\nfunction defineProperty(el, key, value, options) {\n  Object.defineProperty(el, key, extend({\n    value: value,\n    enumerable: false,\n    writable: false,\n    configurable: true\n  }, options))\n  return el\n}\n\n/**\n * Get the tag name of any DOM node\n * @param   { Object } dom - DOM node we want to parse\n * @returns { String } name to identify this dom node in riot\n */\nfunction getTagName(dom) {\n  var child = getTag(dom),\n    namedTag = getAttr(dom, 'name'),\n    tagName = namedTag && !tmpl.hasExpr(namedTag) ?\n                namedTag :\n              child ? child.name : dom.tagName.toLowerCase()\n\n  return tagName\n}\n\n/**\n * Extend any object with other properties\n * @param   { Object } src - source object\n * @returns { Object } the resulting extended object\n *\n * var obj = { foo: 'baz' }\n * extend(obj, {bar: 'bar', foo: 'bar'})\n * console.log(obj) => {bar: 'bar', foo: 'bar'}\n *\n */\nfunction extend(src) {\n  var obj, args = arguments\n  for (var i = 1; i < args.length; ++i) {\n    if (obj = args[i]) {\n      for (var key in obj) {\n        // check if this property of the source object could be overridden\n        if (isWritable(src, key))\n          src[key] = obj[key]\n      }\n    }\n  }\n  return src\n}\n\n/**\n * Check whether an array contains an item\n * @param   { Array } arr - target array\n * @param   { * } item - item to test\n * @returns { Boolean } Does 'arr' contain 'item'?\n */\nfunction contains(arr, item) {\n  return ~arr.indexOf(item)\n}\n\n/**\n * Check whether an object is a kind of array\n * @param   { * } a - anything\n * @returns {Boolean} is 'a' an array?\n */\nfunction isArray(a) { return Array.isArray(a) || a instanceof Array }\n\n/**\n * Detect whether a property of an object could be overridden\n * @param   { Object }  obj - source object\n * @param   { String }  key - object property\n * @returns { Boolean } is this property writable?\n */\nfunction isWritable(obj, key) {\n  var props = Object.getOwnPropertyDescriptor(obj, key)\n  return typeof obj[key] === T_UNDEF || props && props.writable\n}\n\n\n/**\n * With this function we avoid that the internal Tag methods get overridden\n * @param   { Object } data - options we want to use to extend the tag instance\n * @returns { Object } clean object without containing the riot internal reserved words\n */\nfunction cleanUpData(data) {\n  if (!(data instanceof Tag) && !(data && typeof data.trigger == T_FUNCTION))\n    return data\n\n  var o = {}\n  for (var key in data) {\n    if (!RESERVED_WORDS_BLACKLIST.test(key)) o[key] = data[key]\n  }\n  return o\n}\n\n/**\n * Walk down recursively all the children tags starting dom node\n * @param   { Object }   dom - starting node where we will start the recursion\n * @param   { Function } fn - callback to transform the child node just found\n */\nfunction walk(dom, fn) {\n  if (dom) {\n    // stop the recursion\n    if (fn(dom) === false) return\n    else {\n      dom = dom.firstChild\n\n      while (dom) {\n        walk(dom, fn)\n        dom = dom.nextSibling\n      }\n    }\n  }\n}\n\n/**\n * Minimize risk: only zero or one _space_ between attr & value\n * @param   { String }   html - html string we want to parse\n * @param   { Function } fn - callback function to apply on any attribute found\n */\nfunction walkAttributes(html, fn) {\n  var m,\n    re = /([-\\w]+) ?= ?(?:\"([^\"]*)|'([^']*)|({[^}]*}))/g\n\n  while (m = re.exec(html)) {\n    fn(m[1].toLowerCase(), m[2] || m[3] || m[4])\n  }\n}\n\n/**\n * Check whether a DOM node is in stub mode, useful for the riot 'if' directive\n * @param   { Object }  dom - DOM node we want to parse\n * @returns { Boolean } -\n */\nfunction isInStub(dom) {\n  while (dom) {\n    if (dom.inStub) return true\n    dom = dom.parentNode\n  }\n  return false\n}\n\n/**\n * Create a generic DOM node\n * @param   { String } name - name of the DOM node we want to create\n * @param   { Boolean } isSvg - should we use a SVG as parent node?\n * @returns { Object } DOM node just created\n */\nfunction mkEl(name, isSvg) {\n  return isSvg ?\n    document.createElementNS('http://www.w3.org/2000/svg', 'svg') :\n    document.createElement(name)\n}\n\n/**\n * Shorter and fast way to select multiple nodes in the DOM\n * @param   { String } selector - DOM selector\n * @param   { Object } ctx - DOM node where the targets of our search will is located\n * @returns { Object } dom nodes found\n */\nfunction $$(selector, ctx) {\n  return (ctx || document).querySelectorAll(selector)\n}\n\n/**\n * Shorter and fast way to select a single node in the DOM\n * @param   { String } selector - unique dom selector\n * @param   { Object } ctx - DOM node where the target of our search will is located\n * @returns { Object } dom node found\n */\nfunction $(selector, ctx) {\n  return (ctx || document).querySelector(selector)\n}\n\n/**\n * Simple object prototypal inheritance\n * @param   { Object } parent - parent object\n * @returns { Object } child instance\n */\nfunction inherit(parent) {\n  return Object.create(parent || null)\n}\n\n/**\n * Get the name property needed to identify a DOM node in riot\n * @param   { Object } dom - DOM node we need to parse\n * @returns { String | undefined } give us back a string to identify this dom node\n */\nfunction getNamedKey(dom) {\n  return getAttr(dom, 'id') || getAttr(dom, 'name')\n}\n\n/**\n * Set the named properties of a tag element\n * @param { Object } dom - DOM node we need to parse\n * @param { Object } parent - tag instance where the named dom element will be eventually added\n * @param { Array } keys - list of all the tag instance properties\n */\nfunction setNamed(dom, parent, keys) {\n  // get the key value we want to add to the tag instance\n  var key = getNamedKey(dom),\n    isArr,\n    // add the node detected to a tag instance using the named property\n    add = function(value) {\n      // avoid to override the tag properties already set\n      if (contains(keys, key)) return\n      // check whether this value is an array\n      isArr = isArray(value)\n      // if the key was never set\n      if (!value)\n        // set it once on the tag instance\n        parent[key] = dom\n      // if it was an array and not yet set\n      else if (!isArr || isArr && !contains(value, dom)) {\n        // add the dom node into the array\n        if (isArr)\n          value.push(dom)\n        else\n          parent[key] = [value, dom]\n      }\n    }\n\n  // skip the elements with no named properties\n  if (!key) return\n\n  // check whether this key has been already evaluated\n  if (tmpl.hasExpr(key))\n    // wait the first updated event only once\n    parent.one('mount', function() {\n      key = getNamedKey(dom)\n      add(parent[key])\n    })\n  else\n    add(parent[key])\n\n}\n\n/**\n * Faster String startsWith alternative\n * @param   { String } src - source string\n * @param   { String } str - test string\n * @returns { Boolean } -\n */\nfunction startsWith(src, str) {\n  return src.slice(0, str.length) === str\n}\n\n/**\n * requestAnimationFrame function\n * Adapted from https://gist.github.com/paulirish/1579671, license MIT\n */\nvar rAF = (function (w) {\n  var raf = w.requestAnimationFrame    ||\n            w.mozRequestAnimationFrame || w.webkitRequestAnimationFrame\n\n  if (!raf || /iP(ad|hone|od).*OS 6/.test(w.navigator.userAgent)) {  // buggy iOS6\n    var lastTime = 0\n\n    raf = function (cb) {\n      var nowtime = Date.now(), timeout = Math.max(16 - (nowtime - lastTime), 0)\n      setTimeout(function () { cb(lastTime = nowtime + timeout) }, timeout)\n    }\n  }\n  return raf\n\n})(window || {})\n\n/**\n * Mount a tag creating new Tag instance\n * @param   { Object } root - dom node where the tag will be mounted\n * @param   { String } tagName - name of the riot tag we want to mount\n * @param   { Object } opts - options to pass to the Tag instance\n * @returns { Tag } a new Tag instance\n */\nfunction mountTo(root, tagName, opts) {\n  var tag = __tagImpl[tagName],\n    // cache the inner HTML to fix #855\n    innerHTML = root._innerHTML = root._innerHTML || root.innerHTML\n\n  // clear the inner html\n  root.innerHTML = ''\n\n  if (tag && root) tag = new Tag(tag, { root: root, opts: opts }, innerHTML)\n\n  if (tag && tag.mount) {\n    tag.mount()\n    // add this tag to the virtualDom variable\n    if (!contains(__virtualDom, tag)) __virtualDom.push(tag)\n  }\n\n  return tag\n}\n/**\n * Riot public api\n */\n\n// share methods for other riot parts, e.g. compiler\nriot.util = { brackets: brackets, tmpl: tmpl }\n\n/**\n * Create a mixin that could be globally shared across all the tags\n */\nriot.mixin = (function() {\n  var mixins = {},\n    globals = mixins[GLOBAL_MIXIN] = {},\n    _id = 0\n\n  /**\n   * Create/Return a mixin by its name\n   * @param   { String }  name - mixin name (global mixin if object)\n   * @param   { Object }  mixin - mixin logic\n   * @param   { Boolean } g - is global?\n   * @returns { Object }  the mixin logic\n   */\n  return function(name, mixin, g) {\n    // Unnamed global\n    if (isObject(name)) {\n      riot.mixin('__unnamed_'+_id++, name, true)\n      return\n    }\n\n    var store = g ? globals : mixins\n\n    // Getter\n    if (!mixin) {\n      if (typeof store[name] === T_UNDEF) {\n        throw new Error('Unregistered mixin: ' + name)\n      }\n      return store[name]\n    }\n    // Setter\n    if (isFunction(mixin)) {\n      extend(mixin.prototype, store[name] || {})\n      store[name] = mixin\n    }\n    else {\n      store[name] = extend(store[name] || {}, mixin)\n    }\n  }\n\n})()\n\n/**\n * Create a new riot tag implementation\n * @param   { String }   name - name/id of the new riot tag\n * @param   { String }   html - tag template\n * @param   { String }   css - custom tag css\n * @param   { String }   attrs - root tag attributes\n * @param   { Function } fn - user function\n * @returns { String } name/id of the tag just created\n */\nriot.tag = function(name, html, css, attrs, fn) {\n  if (isFunction(attrs)) {\n    fn = attrs\n    if (/^[\\w\\-]+\\s?=/.test(css)) {\n      attrs = css\n      css = ''\n    } else attrs = ''\n  }\n  if (css) {\n    if (isFunction(css)) fn = css\n    else styleManager.add(css)\n  }\n  name = name.toLowerCase()\n  __tagImpl[name] = { name: name, tmpl: html, attrs: attrs, fn: fn }\n  return name\n}\n\n/**\n * Create a new riot tag implementation (for use by the compiler)\n * @param   { String }   name - name/id of the new riot tag\n * @param   { String }   html - tag template\n * @param   { String }   css - custom tag css\n * @param   { String }   attrs - root tag attributes\n * @param   { Function } fn - user function\n * @returns { String } name/id of the tag just created\n */\nriot.tag2 = function(name, html, css, attrs, fn) {\n  if (css) styleManager.add(css)\n  //if (bpair) riot.settings.brackets = bpair\n  __tagImpl[name] = { name: name, tmpl: html, attrs: attrs, fn: fn }\n  return name\n}\n\n/**\n * Mount a tag using a specific tag implementation\n * @param   { String } selector - tag DOM selector\n * @param   { String } tagName - tag implementation name\n * @param   { Object } opts - tag logic\n * @returns { Array } new tags instances\n */\nriot.mount = function(selector, tagName, opts) {\n\n  var els,\n    allTags,\n    tags = []\n\n  // helper functions\n\n  function addRiotTags(arr) {\n    var list = ''\n    each(arr, function (e) {\n      if (!/[^-\\w]/.test(e)) {\n        e = e.trim().toLowerCase()\n        list += ',[' + RIOT_TAG_IS + '=\"' + e + '\"],[' + RIOT_TAG + '=\"' + e + '\"]'\n      }\n    })\n    return list\n  }\n\n  function selectAllTags() {\n    var keys = Object.keys(__tagImpl)\n    return keys + addRiotTags(keys)\n  }\n\n  function pushTags(root) {\n    if (root.tagName) {\n      var riotTag = getAttr(root, RIOT_TAG_IS) || getAttr(root, RIOT_TAG)\n\n      // have tagName? force riot-tag to be the same\n      if (tagName && riotTag !== tagName) {\n        riotTag = tagName\n        setAttr(root, RIOT_TAG_IS, tagName)\n        setAttr(root, RIOT_TAG, tagName) // this will be removed in riot 3.0.0\n      }\n      var tag = mountTo(root, riotTag || root.tagName.toLowerCase(), opts)\n\n      if (tag) tags.push(tag)\n    } else if (root.length) {\n      each(root, pushTags)   // assume nodeList\n    }\n  }\n\n  // ----- mount code -----\n\n  // inject styles into DOM\n  styleManager.inject()\n\n  if (isObject(tagName)) {\n    opts = tagName\n    tagName = 0\n  }\n\n  // crawl the DOM to find the tag\n  if (typeof selector === T_STRING) {\n    if (selector === '*')\n      // select all the tags registered\n      // and also the tags found with the riot-tag attribute set\n      selector = allTags = selectAllTags()\n    else\n      // or just the ones named like the selector\n      selector += addRiotTags(selector.split(/, */))\n\n    // make sure to pass always a selector\n    // to the querySelectorAll function\n    els = selector ? $$(selector) : []\n  }\n  else\n    // probably you have passed already a tag or a NodeList\n    els = selector\n\n  // select all the registered and mount them inside their root elements\n  if (tagName === '*') {\n    // get all custom tags\n    tagName = allTags || selectAllTags()\n    // if the root els it's just a single tag\n    if (els.tagName)\n      els = $$(tagName, els)\n    else {\n      // select all the children for all the different root elements\n      var nodeList = []\n      each(els, function (_el) {\n        nodeList.push($$(tagName, _el))\n      })\n      els = nodeList\n    }\n    // get rid of the tagName\n    tagName = 0\n  }\n\n  pushTags(els)\n\n  return tags\n}\n\n/**\n * Update all the tags instances created\n * @returns { Array } all the tags instances\n */\nriot.update = function() {\n  return each(__virtualDom, function(tag) {\n    tag.update()\n  })\n}\n\n/**\n * Export the Virtual DOM\n */\nriot.vdom = __virtualDom\n\n/**\n * Export the Tag constructor\n */\nriot.Tag = Tag\n  // support CommonJS, AMD & browser\n  /* istanbul ignore next */\n  if (typeof exports === T_OBJECT)\n    module.exports = riot\n  else if (typeof define === T_FUNCTION && typeof define.amd !== T_UNDEF)\n    define(function() { return riot })\n  else\n    window.riot = riot\n\n})(typeof window != 'undefined' ? window : void 0);\n",
    "var riot = require('riot');\nmodule.exports = riot.tag2('ttfooter', '<div class=\"SDMainFooter\" riot-style=\"{!TabGenMgtLinks ? \\'\\' : \\'background-color: red; color: white;\\'}\"><div class=\"BuildData\"> &copy; 2021 - SchoolData V{Version} - {opts.school}<span show=\"{AccessLevel >= AdminLevel.TTN}\">-{h1}-{w1}</span> - {opts.accesscode} - ServerTime - {opts.servertime} - YearSelected:{opts.yearselected} </div><div class=\"{ShowExtraStats ? \\'TableStatsLessPadding\\' : \\'TableStatsPadding\\'}\" if=\"{ShowRecords}\"><div if=\"{!BlockDetails}\" style=\"display: inline-block;\"><div class=\"ExtraStats\" if=\"{ShowExtraStats}\">{ExtraStats}</div><button type=\"button\" class=\"TableStatisticsbutton\" if=\"{ShowExtraStatsButton}\" onclick=\"{ExtraStatsPopup}\">Stats</button></div> Table Stats - {Records} - Rows </div></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n        this.Constants = require('./../../services/constants.js');\n        this.AdminLevel = this.Constants.AdminLevel;\n        this.Version = \"\";\n        this.ShowRecords = false;\n        this.ShowExtraStats = false;\n        this.ShowExtraStatsButton = false;\n        this.AccessLevel = 0;\n        this.ResizeRefreshBlock = false;\n        this.TimeoutHandle = null;\n        this.TabGenMgtLinks = false;\n        this.IgnoreReLoad = true;\n\n        this.loggedIn = false;\n        this.DebugAdminLevel = \"\";\n\n        this.on('mount', function () {\n\n            this.Version = opts.version;\n\n            if (typeof opts.access !== \"undefined\")\n                this.AccessLevel = parseInt(opts.access, 10);\n\n            var bill = opts.accesscode;\n\n            window.addEventListener('resize', this.ResizeProcess);\n\n            if (opts.compilerenvironment == \"DevCompiler\")\n                this.TabGenMgtLinks = true;\n\n            this.ResizeProcess();\n\n            this.update();\n\n        }.bind(this))\n\n        this.ResizeProcess = function()\n        {\n            this.h1 = $(window).height();\n            this.w1 = $(window).width();\n\n            if (this.TimeoutHandle != null) {\n                clearTimeout(this.TimeoutHandle);\n            }\n\n            this.TimeoutHandle = setTimeout(this.ReCalcResizeView, 1000);\n\n            this.publish('WindowHeightChanged', { Height: this.h1, Width: this.w1 });\n\n            this.update();\n        }.bind(this)\n\n        this.ReCalcResizeView = function()\n        {\n            this.ResizeRefreshBlock = false;\n            if (this.IgnoreReLoad) {\n                this.IgnoreReLoad = false;\n                return;\n            }\n            this.publish(\"RefreshTableData\");\n        }.bind(this)\n\n        this.subscribe('SetTableStats', function (TableStats)\n        {\n            this.ShowRecords = true;\n            this.Records = TableStats.data.RecordCount;\n            this.BlockDetails = TableStats.data.BlockDetails;\n            this.ExtraStats = TableStats.data.ExtraStats;\n            if (typeof this.ExtraStats != \"undefined\") {\n                if (this.ExtraStats != \"\") {\n                    this.ShowExtraStats = true;\n                    if (typeof TableStats.sourceTag.TableName != \"undefined\") {\n                        if (TableStats.sourceTag.TableName.indexOf('grid') != -1)\n                            this.ShowExtraStatsButton = true;\n                    }\n                }\n            }\n\n            this.update();\n        });\n\n        this.ExtraStatsPopup = function()\n        {\n            this.publish('FetchGridReportStatisticsSub', { Type: 'grid' });\n        }.bind(this)\n\n        this.on(\"update\", function () {\n        });\n\n});\n\n\n\n",
    "var riot = require('riot');\nmodule.exports = riot.tag2('ttheader', '<div class=\"SDMainHeader\"><div class=\"topnav\" id=\"idMobileMenu\"><div class=\"topnavBanner\" id=\"idMobileMenuBanner\"><div onclick=\"{ShowMobileMenu}\"><i class=\"fa fa-bars HamburgerIcon\"></i></div><div id=\"idRHHomeMobile\" class=\"SchoolDataHeading\" onclick=\"location.href=\\'/?mode=home\\';\">SchoolData Mobile</div><div class=\"MenuBarLoginCenter\"><div class=\"MenuBarLoginContainer\" id=\"idProfile\" onclick=\"{HandleMobileLoginClick}\"><div class=\"MenuBarLoginIcon\"><i class=\"fas fa-user\" style=\"font-size: 12px; background-color: white; color: #185ccbd4; border-radius: 20px; padding: 10px; margin-right: 0px;\"></i></div><div class=\"MenuBarLoginText\"> {loggedIn ? Username : Login} </div></div><div id=\"idMobileLoginMenu\" class=\"MenuBarLoginDropdown\"><a href=\"/SDMyLoads/MyProfile\">My Account</a><a href=\"/welcome/signout?cb=<%= DateTime.Now.Ticks %>\">Logout</a></div></div></div><div class=\"MobileMenuContainer\" id=\"idMobileLinks\"><a href=\"/Welcome/Media?menuitem=Article2\">Media Bulletin 1</a><a href=\"/Welcome/Media?menuitem=Article1\">Media Bulletin 2</a><div if=\"{!loggedIn}\"><a href=\"/Welcome/MoreInformation\">More Information</a><a href=\"/Welcome/contactus\">Contact Us</a></div><div if=\"{loggedIn}\"><a href=\"/\">My Loads</a><a href=\"/SDForm/MainForm?FormKey=ce2e2edc-1ec3-4b17-b4b5-f24ab77cbae8\" if=\"{accessLevel > AdminLevel.TTT}\">Staff Intentions Form</a><a href=\"/SDForm/MainForm?FormKey=88102bb5-5967-4bc8-8975-738413bb6af7\" if=\"{accessLevel > AdminLevel.TTT}\">Form - OnePicker</a><a href=\"/SDForm/MainForm?FormKey=06b72363-f9ef-44fc-9dbc-d3b91977a606\" if=\"{accessLevel > AdminLevel.TTT}\">Form - Replaform</a><a href=\"/SDForm/MainForm?FormKey=02571b4c-164d-4ba8-b4fd-7b9dcd4467d6\" if=\"{accessLevel >= AdminLevel.TTN}\">Year 12 Subjects Form</a><a id=\"idRHMenu\" href=\"/?mode=home\" if=\"{accessLevel >= AdminLevel.TTN}\">Main Menu</a></div></div></div><div class=\"navbar\" id=\"NavBarDiv\"><img if=\"{WindowWidth >= 1350 && !TabGenMgtLinks}\" src=\"\\\\res\\\\img\\\\SchoolData\\\\SchoolDataLogoTransSmallerWhite.png\" class=\"SchoolDataLogo\" alt=\"Italian Trulli\" onclick=\"{CallBackToHomePage}\"><img if=\"{WindowWidth >= 1350 && TabGenMgtLinks}\" src=\"\\\\res\\\\img\\\\SchoolData\\\\SchoolDataLogoTransSmallerRed.png\" class=\"SchoolDataLogo\" alt=\"Italian Trulli\" onclick=\"{CallBackToHomePage}\"><img if=\"{WindowWidth < 1350}\" src=\"\\\\res\\\\img\\\\SchoolData\\\\SchoolData_White_TB_1617_384.png\" class=\"SchoolDataLogo\" height=\"39\" alt=\"Italian Trulli\" onclick=\"location.href=\\'/?mode=home\\';\"><div id=\"idLoggedOutSection\" if=\"{!loggedIn}\" style=\"margin-top: 10px;\"><a id=\"idNL_XXX\" class=\"ContactUs\" href=\"/SDMyloads/Portal\">HOME</a><a id=\"idNL_ContactUs\" class=\"ContactUs\" href=\"/Welcome/contactus\">CONTACT US</a></div><div class=\"NavMenuItems\" id=\"idLoggedInSection\" if=\"{loggedIn}\"><div class=\"dropdown\" if=\"{NewService}\" onclick=\"{SetPagePortalTarget}\"><button class=\"RibbonItem\"> {RibbonText} </button></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.TTN) && !NewService && ShowAppsLink}\"><button id=\"idSDAppService\" class=\"dropbtn\"><div class=\"HeaderText\" id=\"idAppService\" onclick=\"{TestOp}\"> APPS </div></button></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.TTN || MainAccessControl[\\'RibbonTag_idSDPhase1\\'] == true) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSD01PhaseSetup\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> SETUP <i class=\"fas fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"/SDServices/Phase1Setup?menuitem=empstatus\" if=\"{MainAccessControl[\\'TableTag_identEmpStatusAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Employee Status</a><a href=\"/SDServices/Phase1Setup?menuitem=campusadmin\" if=\"{MainAccessControl[\\'TableTag_identCampusAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Campus Admin</a><a href=\"/SDServices/Phase1Setup?menuitem=leveladmin\" if=\"{MainAccessControl[\\'TableTag_identLevelAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Staff Levels</a><a href=\"/SDServices/Phase1Setup?menuitem=roomadmin\" if=\"{MainAccessControl[\\'TableTag_identRoomAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Room Admin</a><a href=\"/SDServices/Phase1Setup?menuitem=teachadmin\" if=\"{MainAccessControl[\\'TableTag_identTeacherAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Staff Admin</a><a href=\"/SDServices/Phase1Setup?menuitem=teachqualifications\" if=\"{MainAccessControl[\\'TableTag_identTeacherQualifications\\'] == true || accessLevel >= AdminLevel.TTN}\">Staff Qualifications</a><a href=\"/SDServices/Phase1Setup?menuitem=cocurricular\" if=\"{MainAccessControl[\\'TableTag_identCoCurricularAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">CoCurricular Admin</a><a href=\"/SDServices/Phase01GridDuration?menuitem=gridduration\" if=\"{MainAccessControl[\\'TableTag_identGridDuration\\'] == true || accessLevel >= AdminLevel.TTN}\">Course Durations Admin</a><a href=\"/SDServices/Phase01GridDuration?menuitem=griddurationitem\" if=\"{MainAccessControl[\\'TableTag_identGridDurationItem\\'] == true || accessLevel >= AdminLevel.TTN}\">Course Dates Admin</a><a href=\"/SDServices/Phase01GridDuration?menuitem=griddurationadmin\" if=\"{MainAccessControl[\\'TableTag_identGridAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Planner Admin</a><a href=\"/SDServices/Phase1Setup?menuitem=subjects\" if=\"{MainAccessControl[\\'TableTag_identSubjectsAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Subjects Admin</a><a href=\"/SDServices/Phase1Setup?menuitem=gridjoinadmin\" if=\"{MainAccessControl[\\'TableTag_identGridJoinAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Grid Join Admin</a><a href=\"/SDServices/Phase1Setup?menuitem=unitcodeadmin\" if=\"{accessLevel >= AdminLevel.SUP}\">Unit Code Admin</a><a href=\"/SDServices/Phase1Setup?menuitem=subjectsplanner\" if=\"{MainAccessControl[\\'TableTag_identSubjectsPlannerClasses\\'] == true || accessLevel >= AdminLevel.SUPG}\">Subjects Planner Classes</a><a href=\"/SDServices/Phase1Setup?menuitem=subjectsplannerallow\" if=\"{MainAccessControl[\\'TableTag_identSubjectsPlannerAllow\\'] == true || accessLevel >= AdminLevel.SUPG}\">Subjects Planner Allow</a><a href=\"/SDServices/Phase01GridDuration?menuitem=plannerassign\" if=\"{MainAccessControl[\\'TableTag_identGridDurationClasses\\'] == true || accessLevel >= AdminLevel.SUPG}\">Assign Planner Grid Classes</a><a href=\"/SDServices/Phase01GridDuration?menuitem=plannerassignallow\" if=\"{MainAccessControl[\\'TableTag_identGridDurationAllow\\'] == true || accessLevel >= AdminLevel.SUPG}\">Assign Allowances Classes</a><a href=\"/SDResourceLibrary/ResourceLibrary\" if=\"{MainAccessControl[\\'TableTag_identResourceLibrary\\'] == true || accessLevel >= AdminLevel.SUP}\">Resource Library</a><a href=\"/SDServices/SyncfusionTableGeneric?menuitem=sample\" if=\"{MainAccessControl[\\'TableTag_identEmpStatusAdmin\\'] == true || accessLevel >= AdminLevel.SUP}\">Synfusion Tables Example</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.TTN || MainAccessControl[\\'RibbonTag_idSD9PhaseForms\\'] == true) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSD09PhaseForms\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> FORMS <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"/SDServices/Phase9Forms?menuitem=formadmin&FilterKey=staffintentionadmin\" if=\"{MainAccessControl[\\'TableTag_identFormAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Staff Intentions Forms</a><a href=\"/SDServices/Phase9Forms?menuitem=formadmin&FilterKey=subjectchanges\" if=\"{MainAccessControl[\\'TableTag_identFormAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Subject Changes Forms</a><a href=\"/SDServices/Phase9Forms?menuitem=formadmin&FilterKey=preselectionadmin\" if=\"{MainAccessControl[\\'TableTag_identFormAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Pre-Selection Forms</a><a href=\"/SDServices/Phase9Forms?menuitem=formadmin&FilterKey=subjectselection\" if=\"{MainAccessControl[\\'TableTag_identFormAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Subject Selection Forms</a><div if=\"{accessLevel >= AdminLevel.FAC}\"><hr></div><a href=\"/SDServices/Phase9Forms?menuitem=formadmin\" if=\"{MainAccessControl[\\'TableTag_identFormAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">All Forms</a><a href=\"/SDServices/Phase9Forms?menuitem=formtemplate\" if=\"{accessLevel >= AdminLevel.TTN}\">Form Templates</a><div if=\"{opts.teachcode == \\'BH2\\'}\"><hr><a href=\"/SDServices/Phase9Forms?menuitem=formadmin&FilterKey=onboardingforms\" if=\"{accessLevel >= AdminLevel.SUP}\">Onboarding Forms</a></div><a href=\"/SDForm/FormApp\" if=\"{accessLevel >= AdminLevel.SUP}\">Project App</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.TTN || MainAccessControl[\\'RibbonTag_idSDPhase2\\'] == true) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSD02PhaseCurrent\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> CURRENT <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"/SDServices/Phase2Current?menuitem=gridyearnewcurrent\" if=\"{(MainAccessControl[\\'TableTag_identGridCurrent\\'] == true && GridCurrent) || accessLevel >= AdminLevel.TTN}\">Current Grid</a><a href=\"/SDServices/Phase01GridDuration?menuitem=gridcurrentv2\" if=\"{(MainAccessControl[\\'TableTag_identGridCurrentV2\\'] == true && GridCurrentV2) || accessLevel >= AdminLevel.TTN}\">Current GridV2</a><a href=\"/SDServices/Phase01GridDuration?menuitem=staffloadscurrentV2\" if=\"{(MainAccessControl[\\'TableTag_identStaffLoadsCurrentV2\\'] == true && GridCurrentV2) || accessLevel >= AdminLevel.TTN}\">Staff LoadsV2 (Current)</a><a href=\"/SDServices/Loads?menuitem=staffloadscurrent\" if=\"{(MainAccessControl[\\'TableTag_identStaffLoadsCurrent\\'] == true  && GridCurrent) || accessLevel >= AdminLevel.TTN}\">Staff Loads (Current)</a><a href=\"/SDServices/Loads?menuitem=roomloadscurrent\" if=\"{MainAccessControl[\\'TableTag_identRoomLoadsCurrent\\'] == true || accessLevel >= AdminLevel.TTN}\">Room Loads (Current)</a><a href=\"/SDServices/Phase6Reports?menuitem=CurrentV2AllocationsReport\" if=\"{MainAccessControl[\\'TableTag_identSubjectAllocationsCurrent\\'] == true || accessLevel >= AdminLevel.TTN}\">Subject Allocations Report (Current)</a><a href=\"/SDServices/Phase6Reports?menuitem=CurrentV2StaffAllocationsReport\" if=\"{MainAccessControl[\\'TableTag_identStaffAllocationsCurrent\\'] == true || accessLevel >= AdminLevel.TTN}\">Staff Allocations Report (Current)</a><a href=\"/SDServices/Phase6Reports?menuitem=CurrentV2StaffAllocationsReportFTE\" if=\"{MainAccessControl[\\'TableTag_identStaffAllocationsCurrentFTE\\'] == true || accessLevel >= AdminLevel.TTN}\">Staff Faculty Allocations Report (Current)</a><a href=\"/SDServices/Phase2Current?menuitem=staffftereportcurrent\" if=\"{MainAccessControl[\\'TableTag_identStaffFTECurrent\\'] == true || accessLevel >= AdminLevel.TTN}\">Staff FTE (Current)</a><a href=\"/SDServices/Phase2Current?menuitem=gridallocationsreportcurrent\" if=\"{MainAccessControl[\\'TableTag_identGridAllocationsCurrent\\'] == true || accessLevel >= AdminLevel.TTN}\">Grid Current Allocations Report</a><a href=\"/SDServices/Phase2Current?menuitem=teacherAllocationsReportcurrent\" if=\"{MainAccessControl[\\'TableTag_identTeacherAllocationsCurrent\\'] == true || accessLevel >= AdminLevel.TTN}\">Teacher Current Allocations Report</a><a href=\"/SDServices/Setup?menuitem=gridyearadmin\" if=\"{accessLevel >= AdminLevel.SUPG}\">Old Current Grid</a><a href=\"/SDServices/Phase01GridDuration?menuitem=gridcurrentv2Classes\" if=\"{MainAccessControl[\\'TableTag_identGridCurrentV2Classes\\'] == true || accessLevel >= AdminLevel.SUPG}\">Current Grid: Classes</a><a href=\"/SDServices/Phase01GridDuration?menuitem=gridcurrentv2Allow\" if=\"{MainAccessControl[\\'TableTag_identGridCurrentV2Allow\\'] == true || accessLevel >= AdminLevel.SUPG}\">Current Grid: Allowances</a><a href=\"/SDServices/Phase01GridDuration?menuitem=gridcurrentv2Under\" if=\"{MainAccessControl[\\'TableTag_identGridCurrentV2Under\\'] == true || accessLevel >= AdminLevel.SUPG}\">Teacher Current Allocations Report</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.TTN || MainAccessControl[\\'RibbonTag_idSDPhase3\\'] == true) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSD03PhasePlanner\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> PLANNER <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"/SDServices/Phase3Planner?menuitem=gridyearnewplanner\" if=\"{(MainAccessControl[\\'TableTag_identGridPlanner\\'] == true && GridPlanner) || accessLevel >= AdminLevel.SUPG}\">Planner Grid</a><a href=\"/SDServices/Phase01GridDuration?menuitem=plannergridClasses\" if=\"{(MainAccessControl[\\'TableTag_identGridPlannerV2\\'] == true && GridPlannerV2) || accessLevel >= AdminLevel.TTN}\">Planner GridV2</a><a href=\"/SDServices/Phase01GridDuration?menuitem=staffloadsplannerV2\" if=\"{(MainAccessControl[\\'TableTag_identStaffLoadsPlannerV2\\'] == true && GridPlannerV2) || accessLevel >= AdminLevel.TTN}\">Staff LoadsV2 (Planner)</a><a href=\"/SDServices/Loads?menuitem=staffloadsplanner\" if=\"{(MainAccessControl[\\'TableTag_identStaffLoadsPlanner\\'] == true && GridPlanner) || accessLevel >= AdminLevel.SUPG}\">Staff Loads (Planner)</a><a href=\"/SDServices/Loads?menuitem=roomloadsplanner\" if=\"{MainAccessControl[\\'TableTag_identRoomLoadsPlanner\\'] == true || accessLevel >= AdminLevel.SUPG}\">Room Loads (Planner)</a><a href=\"/SDServices/Phase6Reports?menuitem=PlannerV2AllocationsReport\" if=\"{MainAccessControl[\\'TableTag_identSubjectAllocationsPlanner\\'] == true || accessLevel >= AdminLevel.TTN}\">Subject Allocations Report (Planner)</a><a href=\"/SDServices/Phase6Reports?menuitem=PlannerV2StaffAllocationsReport\" if=\"{MainAccessControl[\\'TableTag_identStaffAllocationsPlanner\\'] == true || accessLevel >= AdminLevel.TTN}\">Staff Allocations Report (Planner)</a><a href=\"/SDServices/Phase6Reports?menuitem=PlannerV2StaffAllocationsReportFTE\" if=\"{MainAccessControl[\\'TableTag_identStaffAllocationsPlannerFTE\\'] == true || accessLevel >= AdminLevel.TTN}\">Staff Faculty Allocations Report (Planner)</a><div if=\"{accessLevel >= AdminLevel.TTN}\"><hr><a href=\"/SDServices/Phase01GridDuration?menuitem=GridDevMain\" if=\"{MainAccessControl[\\'TableTag_identGridDevManagement\\'] == true || accessLevel >= AdminLevel.TTN}\">Grid Development Management</a></div><a href=\"/SDServices/Phase3Planner?menuitem=staffftereportplanner\" if=\"{MainAccessControl[\\'TableTag_identStaffFTEPlanner\\'] == true || accessLevel >= AdminLevel.SUPG}\">Staff FTE (Planner)</a><a href=\"/SDServices/Phase3Planner?menuitem=gridallocationsreportplanner\" if=\"{MainAccessControl[\\'TableTag_identGridAllocationsPlanner\\'] == true || accessLevel >= AdminLevel.SUPG}\">Grid Planner Allocations Report</a><a href=\"/SDServices/Phase3Planner?menuitem=teacherAllocationsReportplanner\" if=\"{MainAccessControl[\\'TableTag_identTeacherAllocationsPlanner\\'] == true || accessLevel >= AdminLevel.SUPG}\">Teacher Planner Allocations Report</a><a href=\"/SDServices/Loads?menuitem=staffloadsplannerV2\" if=\"{MainAccessControl[\\'TableTag_identStaffLoadsPlannerDevV2\\'] == true || accessLevel >= AdminLevel.SUPG}\">Staff Loads V2 (Planner) in Dev</a><a href=\"/SDServices/Phase01GridDuration?menuitem=plannergridClasses\" if=\"{MainAccessControl[\\'TableTag_identPlannerGridClasses\\'] == true || accessLevel >= AdminLevel.SUPG}\">Planner Grid Classes</a><a href=\"/SDServices/Phase01GridDuration?menuitem=plannergridallow\" if=\"{MainAccessControl[\\'TableTag_identPlannerGridAllow\\'] == true || accessLevel >= AdminLevel.SUPG}\">Planner Grid Allowance</a><a href=\"/SDServices/Consult?menuitem=gridplanneryear\" if=\"{accessLevel >= AdminLevel.SUPG}\">Old Planner Grid</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.TTN || MainAccessControl[\\'RibbonTag_idSDPhase4\\'] == true) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSD04PhaseSubSel\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> SUBSEL <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"/SDServices/Phase4SubSel?menuitem=students\" if=\"{MainAccessControl[\\'TableTag_identStudentAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Student Admin</a><a href=\"/SDServices/Phase4SubSel?menuitem=subjectrecommendationsadmin\" if=\"{MainAccessControl[\\'TableTag_identSubjectRecommendations\\'] == true || accessLevel >= AdminLevel.TTN}\">Subject Recommendations</a><a href=\"/SDServices/Phase4SubSel?menuitem=subjectrecommendationspermissions\" if=\"{MainAccessControl[\\'TableTag_identSubjectRecommendationsPermissions\\'] == true || accessLevel >= AdminLevel.TTN}\">Subject Recommendations Permissions</a><a href=\"/SDServices/Phase4SubSel?menuitem=studentapprovals&FilterKey=additionalfilter\" if=\"{MainAccessControl[\\'TableTag_identStudentApprovals\\'] == true || accessLevel >= AdminLevel.TTN}\">Student Approvals</a><a href=\"/SDServices/Phase4SubSel?menuitem=approvalsdatabase&FilterKey=additionalfilter\" if=\"{MainAccessControl[\\'TableTag_identApprovalsDatabase\\'] == true || accessLevel >= AdminLevel.TTN}\">Approvals Database</a><a href=\"/SDServices/Phase4SubSel?menuitem=preferences\" if=\"{MainAccessControl[\\'TableTag_identPreferencesImport\\'] == true || accessLevel >= AdminLevel.TTN}\">Preferences Import</a><a href=\"/SDServices/Phase4SubSel?menuitem=prefrepstudents\" if=\"{MainAccessControl[\\'TableTag_identStudentSelections\\'] == true || accessLevel >= AdminLevel.TTN}\">Student Selections</a><a href=\"/SDServices/Phase1Setup?menuitem=studentprefcurrent\" if=\"{MainAccessControl[\\'TableTag_identstudentpreferencecurrent\\'] == true || accessLevel >= AdminLevel.TTN}\">Current Student Preferences</a><a href=\"/SDServices/Phase4SubSel?menuitem=prefrepsubjects\" if=\"{MainAccessControl[\\'TableTag_identSubjectSelections\\'] == true || accessLevel >= AdminLevel.TTN}\">SubSel Report</a><a href=\"/SDServices/Phase13TDF?menuitem=RulesList&&ParentKey=0d3c37fc-a9fa-45d5-8489-55b7282c28f1\" if=\"{MainAccessControl[\\'TableTag_identSubSelRules\\'] == true || accessLevel >= AdminLevel.TTN}\">SubSel Rules</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.SUPG || MainAccessControl[\\'RibbonTag_idSDPhase5\\'] == true) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSD05PhaseFuture\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> FUTURE <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"/SDServices/Phase5Future?menuitem=gridyearnewfuture\" if=\"{MainAccessControl[\\'TableTag_identGridFuture\\'] == true || accessLevel >= AdminLevel.TTN}\">Future Grid</a><a href=\"/SDServices/Loads?menuitem=staffloadsfuture\" if=\"{MainAccessControl[\\'TableTag_identStaffLoadsFuture\\'] == true || accessLevel >= AdminLevel.TTN}\">Staff Loads (Future)</a><a href=\"/SDServices/Loads?menuitem=roomloadsfuture\" if=\"{MainAccessControl[\\'TableTag_identRoomLoadsFuture\\'] == true || accessLevel >= AdminLevel.TTN}\">Room Loads (Future)</a><a href=\"/SDServices/Phase5Future?menuitem=staffftereportfuture\" if=\"{MainAccessControl[\\'TableTag_identStaffFTEFuture\\'] == true || accessLevel >= AdminLevel.TTN}\">Staff FTE (Future)</a><a href=\"/SDServices/Phase5Future?menuitem=gridallocationsreportfuture\" if=\"{MainAccessControl[\\'TableTag_identGridAllocationsFuture\\'] == true || accessLevel >= AdminLevel.TTN}\">Grid Future Allocations Report</a><a href=\"/SDServices/Phase5Future?menuitem=teacherAllocationsReportfuture\" if=\"{MainAccessControl[\\'TableTag_identTeacherAllocationsFuture\\'] == true || accessLevel >= AdminLevel.TTN}\">Teacher Future Allocations Report</a><a href=\"/SDServices/Formulate?menuitem=gridyearfuture\" if=\"{accessLevel >= AdminLevel.SUPG}\">Old Future Grid</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.SUP || MainAccessControl[\\'RibbonTag_idSDPhase6\\'] == true) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSD06PhaseReports\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> REPORTS <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"/SDServices/Phase6Reports?menuitem=gridsummary\" if=\"{MainAccessControl[\\'TableTag_identClassSummary\\'] == true || accessLevel >= AdminLevel.TTN}\">Class Summary</a><a href=\"/SDServices/Phase6Reports?menuitem=gridfaculty\" if=\"{MainAccessControl[\\'TableTag_identFacultyReportByYear\\'] == true || accessLevel >= AdminLevel.TTN}\">Faculty Report (by Year)</a><a href=\"/SDServices/Phase6Reports?menuitem=gridftetotals\" if=\"{MainAccessControl[\\'TableTag_identFacultyReportTotal\\'] == true || accessLevel >= AdminLevel.TTN}\">Faculty Report (Total)</a><a href=\"/SDServices/Phase6Reports?menuitem=gridyear0summary\" if=\"{MainAccessControl[\\'TableTag_identAllowancesReport\\'] == true || accessLevel >= AdminLevel.TTN}\">Allowances Report</a><hr><a id=\"idReportYardDuty\" href=\"/SDServices/Phase6Reports?menuitem=YardDutyReport\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">YardDuty Report</a><hr><a id=\"idGraphRepTest1\" href=\"/SDServices/Graph?menuitem=avgfte\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">Graphs - Average FTE\\'s</a><a id=\"idGraphRepTest2\" href=\"/SDServices/Graph?menuitem=termfte\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">Graphs - Term FTE\\'s</a><a id=\"idGraphRepTest3\" href=\"/SDServices/Graph?menuitem=classsummary\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">Graphs - FTE Comparisons</a><a id=\"idGraphRepTest4\" href=\"/SDServices/Graph?menuitem=facultygrowth\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">Graphs - Faculty Growth</a><hr><a id=\"idGraphRepTest5\" href=\"/SDServices/Graph?menuitem=DataGrid\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">DataGrid</a><hr><a id=\"idGraphRepTest6\" href=\"/SDServices/MainMenu\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">Gantt Chart</a><a id=\"idGraphRepTest7\" href=\"/SDServices/Phase1Setup?menuitem=SideMenuGroups\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">Side Menu Admin</a><a href=\"/SDServices/Phase6Reports?menuitem=CurrentV2AllocationsReport\" if=\"{MainAccessControl[\\'TableTag_identSubjectAllocationsCurrent\\'] == true || accessLevel >= AdminLevel.SUPG}\">Subject Allocations Current: All</a><a href=\"/SDServices/Phase6Reports?menuitem=CurrentV2AllocationsReportSubject\" if=\"{MainAccessControl[\\'TableTag_identSubjectAllocationsCurrentSubject\\'] == true || accessLevel >= AdminLevel.SUPG}\">Subject Allocations Current: Subjects</a><a href=\"/SDServices/Phase6Reports?menuitem=CurrentV2AllocationsReportAllow\" if=\"{MainAccessControl[\\'TableTag_identSubjectAllocationsCurrentAllow\\'] == true || accessLevel >= AdminLevel.SUPG}\">Subject Allocations Current: Allowance</a><a href=\"/SDServices/Phase6Reports?menuitem=CurrentV2AllocationsReportUnder\" if=\"{MainAccessControl[\\'TableTag_identSubjectAllocationsCurrentUnder\\'] == true || accessLevel >= AdminLevel.SUPG}\">Subject Allocations Current: Unders</a><a href=\"/SDServices/Phase6Reports?menuitem=PlannerV2AllocationsReport\" if=\"{MainAccessControl[\\'TableTag_identSubjectAllocationsPlanner\\'] == true || accessLevel >= AdminLevel.SUPG}\">Subject Allocations Planner: All</a><a href=\"/SDServices/Phase6Reports?menuitem=PlannerV2AllocationsReportSubject\" if=\"{MainAccessControl[\\'TableTag_identSubjectAllocationsPlannerSubject\\'] == true || accessLevel >= AdminLevel.SUPG}\">Subject Allocations Planner: Subjects</a><a href=\"/SDServices/Phase6Reports?menuitem=PlannerV2AllocationsReportAllow\" if=\"{MainAccessControl[\\'TableTag_identSubjectAllocationsPlannerAllow\\'] == true || accessLevel >= AdminLevel.SUPG}\">Subject Allocations Planner: Allowance</a><a href=\"/SDServices/Phase6Reports?menuitem=PlannerV2AllocationsReportUnder\" if=\"{MainAccessControl[\\'TableTag_identSubjectAllocationsPlannerUnder\\'] == true || accessLevel >= AdminLevel.SUPG}\">Subject Allocations Planner: Unders</a><a href=\"/SDServices/Phase6Reports?menuitem=CurrentV2StaffAllocationsReport\" if=\"{MainAccessControl[\\'TableTag_identStaffAllocationsCurrent\\'] == true || accessLevel >= AdminLevel.SUPG}\">Staff Allocations Current: All</a><a href=\"/SDServices/Phase6Reports?menuitem=CurrentV2StaffAllocationsReportSubject\" if=\"{MainAccessControl[\\'TableTag_identStaffAllocationsCurrentSubject\\'] == true || accessLevel >= AdminLevel.SUPG}\">Staff Allocations Current: Subjects</a><a href=\"/SDServices/Phase6Reports?menuitem=CurrentV2StaffAllocationsReportAllow\" if=\"{MainAccessControl[\\'TableTag_identStaffAllocationsCurrentAllow\\'] == true || accessLevel >= AdminLevel.SUPG}\">Staff Allocations Current: Allowance</a><a href=\"/SDServices/Phase6Reports?menuitem=CurrentV2StaffAllocationsReportUnder\" if=\"{MainAccessControl[\\'TableTag_identStaffAllocationsCurrentUnder\\'] == true || accessLevel >= AdminLevel.SUPG}\">Staff Allocations Current: Unders</a><a href=\"/SDServices/Phase6Reports?menuitem=PlannerV2StaffAllocationsReport\" if=\"{MainAccessControl[\\'TableTag_identStaffAllocationsPlanner\\'] == true || accessLevel >= AdminLevel.SUPG}\">Staff Allocations Planner: All</a><a href=\"/SDServices/Phase6Reports?menuitem=PlannerV2StaffAllocationsReportSubject\" if=\"{MainAccessControl[\\'TableTag_identStaffAllocationsPlannerSubject\\'] == true || accessLevel >= AdminLevel.SUPG}\">Staff Allocations Planner: Subjects</a><a href=\"/SDServices/Phase6Reports?menuitem=PlannerV2StaffAllocationsReportAllow\" if=\"{MainAccessControl[\\'TableTag_identStaffAllocationsPlannerAllow\\'] == true || accessLevel >= AdminLevel.SUPG}\">Staff Allocations Planner: Allowance</a><a href=\"/SDServices/Phase6Reports?menuitem=PlannerV2StaffAllocationsReportUnder\" if=\"{MainAccessControl[\\'TableTag_identStaffAllocationsPlannerUnder\\'] == true || accessLevel >= AdminLevel.SUPG}\">Staff Allocations Planner: Unders</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.SUP || MainAccessControl[\\'RibbonTag_idSDPhase7\\'] == true) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSDPhase7\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> TIMETABLE <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"/SDServices/FormulateTimeTable?menuitem=blockplanner\" if=\"{MainAccessControl[\\'TableTag_\\'] == true || accessLevel >= AdminLevel.FAC}\">Block Planner</a><a href=\"/SDServices/FormulateTimeTable?menuitem=timetable\" if=\"{MainAccessControl[\\'TableTag_\\'] == true || accessLevel >= AdminLevel.FAC}\">Time Table Visualiser</a><a href=\"/SDServices/Formulate?menuitem=calendarindex\" if=\"{accessLevel >= AdminLevel.SUP}\">Calendar Index</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.SUP && ShowYearMenus) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSD08PhaseExam\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> EXAM TT <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"/SDServices/Phase8Exam?menuitem=exammanagement\" if=\"{accessLevel >= AdminLevel.TTN}\">Exam Management</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.SUP && ShowYearMenus) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSD10PhaseAllocator\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> ALLOCATOR <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"/SDServices/Phase10Allocator?menuitem=allocator\" if=\"{accessLevel >= AdminLevel.TTN}\">Student Class Group Allocator Admin</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.SUPG && ShowYearMenus) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSDPhase8\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> TREND DATA <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"/SDServices/FormulateTimeTable?menuitem=blockplanner\" if=\"{accessLevel >= AdminLevel.COR}\">Classes</a><a href=\"/SDServices/FormulateTimeTable?menuitem=timetable\" if=\"{accessLevel >= AdminLevel.COR}\">Faculties (by Year)</a><a href=\"/SDServices/Formulate?menuitem=calendarindex\" if=\"{accessLevel >= AdminLevel.TTN}\">Faculties (Totals)</a><a href=\"/SDServices/Formulate?menuitem=calendarindex\" if=\"{accessLevel >= AdminLevel.TTN}\">Allowances</a><a href=\"/SDServices/Formulate?menuitem=calendarindex\" if=\"{accessLevel >= AdminLevel.TTN}\">Class Enrolment Trends</a><a href=\"/SDServices/Formulate?menuitem=calendarindex\" if=\"{accessLevel >= AdminLevel.TTN}\">Staff FTEs</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.TTN) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSDAdmin\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> ADMIN <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><div if=\"{accessLevel >= AdminLevel.TTN}\"><a id=\"idRHAdminSchool\" href=\"/SDAdmin/AdminMain?menuitem=schooladmin\" if=\"{accessLevel >= AdminLevel.TTN}\">School Admin</a></div><div if=\"{accessLevel >= AdminLevel.SUP}\"><a id=\"idRHGlobalStaffAdmin\" href=\"/SDAdmin/AdminMain?menuitem=globstaffadmin\" if=\"{accessLevel >= AdminLevel.SUP}\">Global Staff Admin</a></div><a id=\"idRHStaffAdmin\" href=\"/SDAdmin/AdminMain?menuitem=staffadmin\" if=\"{accessLevel >= AdminLevel.TTN}\">School Staff Admin</a><a id=\"idSDCacheAdmin\" href=\"/SDAdmin/Admin?menuitem=schoolcacheadmin\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">School Control</a><a id=\"idtdfparser\" href=\"/SDServices/Phase13TDF?menuitem=TDFParser\" if=\"{accessLevel >= AdminLevel.SUP}\">TDF Parser</a><a id=\"iddofparser\" href=\"/SDServices/Phase13TDF?menuitem=DOFParser\" if=\"{accessLevel >= AdminLevel.SUP}\">DOF Parser</a><a href=\"/SDServices/Phase13TDF?menuitem=TableGeneratorManagementPage\" if=\"{accessLevel >= AdminLevel.SUP}\">Table Generator Management Page</a><a id=\"idSDTTAdmin\" href=\"/SDAdmin/AdminMain?menuitem=TimeTableParser\" if=\"{accessLevel >= AdminLevel.TTN}\">TimeTable TFX Parser</a><a href=\"/SDAdmin/AdminMain?menuitem=sdocadmin\" if=\"{accessLevel >= AdminLevel.SUP}\">SDOC Keys Admin</a><div if=\"{accessLevel >= AdminLevel.TTN && ShowYearMenus}\"><a id=\"idRHEmailer\" href=\"/SDAdmin/Emailer?menuitem=emailadmin\" if=\"{accessLevel >= AdminLevel.TTN}\">Emailer</a></div><div if=\"{accessLevel >= AdminLevel.TTN && ShowYearMenus}\"><a id=\"idRHEmailSchoolAdmin\" href=\"/SDAdmin/AdminMain?menuitem=emailtemplateadmin\" if=\"{accessLevel >= AdminLevel.TTN}\">Email Template Admin</a></div><div if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\"><a id=\"idRHEmailGlobalAdmin\" href=\"/SDAdmin/AdminMain?menuitem=emailglobaltemplateadmin\" if=\"{accessLevel >= AdminLevel.SUP}\">Email Global Template Admin</a></div><a id=\"idRHEmailLogger\" href=\"/SDAdmin/AdminMain?menuitem=emaillogger\" if=\"{accessLevel >= AdminLevel.TTN && ShowYearMenus}\">Email Logs</a><a id=\"idRHAdminInstructions\" href=\"/SDAdmin/AdminMain?menuitem=instructionsadmin\" if=\"{accessLevel >= AdminLevel.SUP}\">Instructions Admin</a><a id=\"idAccessMatrixStaff\" href=\"/SDAdmin/AdminMain?menuitem=accessmatrixstaff\" if=\"{accessLevel >= AdminLevel.TTN}\">Access Matrix Staff Admin</a><a id=\"idAccessMatrixSubItem\" href=\"/SDAdmin/AdminMain?menuitem=accessmatrixsubitem\" if=\"{accessLevel >= AdminLevel.TTN}\">Access Matrix SubItem Admin</a><a id=\"idAccessMatrix\" href=\"/SDAdmin/AdminMain?menuitem=accessmatrix\" if=\"{accessLevel >= AdminLevel.TTN}\">Access Matrix Admin</a><a id=\"idAccessMatrixFilter\" href=\"/SDAdmin/AdminMain?menuitem=accessmatrixfilter\" if=\"{accessLevel >= AdminLevel.TTN}\">Access Matrix Filter Admin</a><a id=\"idAccessMatrixHeader\" href=\"/SDAdmin/AdminMain?menuitem=accessmatrixheader\" if=\"{accessLevel >= AdminLevel.SUP}\">Access Matrix Header Admin</a><a id=\"idSDAuditLog\" href=\"/SDAdmin/AdminMain?menuitem=auditlogadmin\" if=\"{accessLevel >= AdminLevel.TTN}\">Audit Log Admin</a><a id=\"idAllStaffAdmin\" href=\"/SDAdmin/AdminMain?menuitem=allstaffadmin\" if=\"{accessLevel >= AdminLevel.SUP}\">All Staff Admin</a><a id=\"idCodePattern\" href=\"/SDServices/Phase1Setup?menuitem=CodePatternsAdmin\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">Code Pattern Admin</a><a id=\"idTTSParser\" href=\"/SDAdmin/AdminMain?menuitem=XMLParser\" if=\"{accessLevel >= AdminLevel.SUP}\">TFX Parser</a><a id=\"isSFXParser\" href=\"/SDAdmin/AdminMain?menuitem=SFXParser\" if=\"{accessLevel >= AdminLevel.SUP}\">SFX Parser</a><a href=\"/SDAdmin/AdminMain?menuitem=XMLImporter\" if=\"{accessLevel >= AdminLevel.SUPG && ShowYearMenus}\">XMLImporter</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.COR) && !NewService && ShowYear}\" onclick=\"location.href=\\'#\\'\"><button id=\"idYearSelector\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'#\\'\"> YEAR {YearSelected} <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a id=\"idYear2025\" href=\"#\" onclick=\"{ChangeYear}\">2025</a><a id=\"idYear2024\" href=\"#\" onclick=\"{ChangeYear}\">2024</a><a id=\"idYear2023\" href=\"#\" onclick=\"{ChangeYear}\">2023</a><a id=\"idYear2022\" href=\"#\" onclick=\"{ChangeYear}\">2022</a><a id=\"idYear2021\" href=\"#\" onclick=\"{ChangeYear}\">2021</a><a id=\"idYear2020\" href=\"#\" onclick=\"{ChangeYear}\">2020</a><a id=\"idYear2019\" href=\"#\" onclick=\"{ChangeYear}\">2019</a><a id=\"idYear2018\" href=\"#\" onclick=\"{ChangeYear}\">2018</a><a id=\"idYear2017\" href=\"#\" onclick=\"{ChangeYear}\">2017</a><a id=\"idYear2016\" href=\"#\" onclick=\"{ChangeYear}\">2016</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.SUP) && !NewService}\" onclick=\"location.href=\\'#\\'\"><button id=\"idSDAdminDev\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'/home\\'\"> DEV <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"/SDSurveyAdmin/SurveyAdmin?menuitem=surveyadmin\" if=\"{MainAccessControl[\\'TableTag_identSurveyAdmin\\'] == true || accessLevel >= AdminLevel.TTN}\">Survey Admin</a><a href=\"/SDSurveyAdmin/SurveyAdmin?menuitem=surveyresultsadmin\" if=\"{MainAccessControl[\\'TableTag_identSurveyResults\\'] == true || accessLevel >= AdminLevel.TTN}\">Survey Reports</a><hr><div if=\"{TabGenMgtLinks}\"><a href=\"/SDServices/Phase13TDF?menuitem=TableGeneratorManagementPage&TableName=ListAllLocalGroup\" if=\"{accessLevel >= AdminLevel.SUP}\">TabGenMge ProfileRenderGroup Local</a><a href=\"/SDServices/Phase13TDF?menuitem=TableGeneratorEditPage&TableName=ListAllLocalTable\" if=\"{accessLevel >= AdminLevel.SUP}\">TabGenMge ProfileRenderTable Local</a><a href=\"/SDServices/Phase13TDF?menuitem=TableGeneratorManagementPage&TableName=ListAllProdGroup\" if=\"{accessLevel >= AdminLevel.SUP}\">TabGenMge ProfileRenderGroup Prod</a><a href=\"/SDServices/Phase13TDF?menuitem=TableGeneratorEditPage&TableName=ListAllProdTable\" if=\"{accessLevel >= AdminLevel.SUP}\">TabGenMge ProfileRenderTable Prod</a><hr></div><a id=\"idGraphTest1\" href=\"/SDServices/Graph?menuitem=SDExampleColumnChart\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">Example Graph</a><a id=\"idGraphTest2\" href=\"/SDServices/Graph?menuitem=avgfte\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">Work Graph</a><a id=\"idGraphTest3\" href=\"/SDServices/Graph?menuitem=termfte\" if=\"{accessLevel >= AdminLevel.SUP && ShowYearMenus}\">Example Graph</a><a id=\"idRiotTest\" href=\"/SDServices/NewTable?menuitem=examimport\" if=\"{accessLevel >= AdminLevel.SUPG && ShowYearMenus}\">Test Riot</a><a href=\"/Home\" if=\"{accessLevel >= AdminLevel.SUPG && ShowYearMenus}\">NewHome</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= AdminLevel.SUP) && !NewService}\"><button id=\"idSDAdminDev\" class=\"dropbtn\"><div class=\"HeaderText\" id=\"idDelaSalle\" onclick=\"{TestOp}\"> IMP <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a href=\"#\" id=\"idSDCollege\" onclick=\"{TestOp}\">SchoolData College</a></div></div><div class=\"dropdown\" if=\"{accessLevel >= 400}\" onclick=\"{clickOnMenuDropDownRoot}\"><button id=\"idRHTeacher\" class=\"dropbtn\" onclick=\"{clickOnMenuDropDownRoot}\"><div class=\"HeaderText\" onclick=\"location.href=\\'/RHTeacher\\'\"> All Loads <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a id=\"idRHAllLoads1\" href=\"/RHTeacher?menuitem=allloads\">All Loads</a><div if=\"{accessLevel > AdminLevel.TTT}\"><a id=\"idTeacherAdmin\" href=\"/RHTeacher?menuitem=teachadmin\">Teacher Admin</a><a id=\"idTeacherLoads\" href=\"/RHTeacher?menuitem=teachload\">Teacher Loads</a><a id=\"idSDGenericLoads\" href=\"/RHTeacher?menuitem=allloadsnew\" if=\"{accessLevel >= AdminLevel.TTT}\">All Loads New</a></div></div></div><div class=\"dropdown\" if=\"{accessLevel >= 400}\"><button id=\"idRHTeacherServices\" class=\"dropbtn\"><div class=\"HeaderText\" onclick=\"location.href=\\'/SDTeacherServices\\'\"> Teacher Services <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></div></button><div class=\"dropdown-content\"><a id=\"idRHAllLoads2\" href=\"/SDTeacherServices?menuitem=myloads\">My Account</a><a id=\"idTeacherAdmin\" href=\"/SDTeacherServices?menuitem=staffintent\">My Staff Intentions</a><a id=\"idRHAllLoads2\" href=\"/SDTeacherServices?menuitem=myloads\">My SchoolData</a></div></div><div class=\"dropdown\" if=\"{(accessLevel >= 400) && loggedIn}\"><button id=\"idAdmin\" class=\"dropbtn\"> Admin Old <i class=\"fa fa-chevron-down\"></i></button><div class=\"dropdown-content\"><div if=\"{(accessLevel >= 300)}\"><a href=\"/RHEmailAdmin\">Emailer Admin</a></div><div if=\"{(accessLevel >= 400)}\"><a href=\"/RHTermAdmin/TermAdmin\">Term Admin</a><a href=\"/RHCustomerAdmin\">Staff Admin - Do Not Use</a><a href=\"/RHTeacherLoadsAdmin\">Teacher Loads Admin</a></div></div></div><div class=\"dropdown\" if=\"{(accessLevel >= 400) && loggedIn}\"><button id=\"idDeprecatedPages\" class=\"dropbtn\"> Deprecated <i class=\"fa fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px\"></i></button><div class=\"dropdown-content\"><div if=\"{(accessLevel >= 400)}\"><a href=\"/RHUpload/RH_TeachUpload\">Upload Teacher Data</a><a href=\"/RHUpload/RH_GridUpload\">Upload Grid Report</a></div><div if=\"{(accessLevel >= 400)}\"><a href=\"/RHGrid/GridAdmin\">Delete Grid Table</a><a href=\"/RHTeacher/TeacherAdmin\">Delete Teacher Table</a></div></div></div></div><div class=\"MenuBarLoginCenter\"><div class=\"MenuBarLoginContainer\" id=\"idProfile\" onclick=\"location.href=\\'/welcome/login\\';\"><div class=\"MenuBarLoginIcon\"><i class=\"fas fa-user\"></i></div><div class=\"MenuBarLoginText\"> {loggedIn ? Username : Login}{DebugAdminLevel != ⁗⁗ ? \\' - \\' + DebugAdminLevel : \\'\\'} </div></div><div if=\"{loggedIn}\" class=\"MenuBarLoginDropdown\"><a href=\"/SDMyLoads/MyProfile\" if=\"{accessLevel > AdminLevel.STF}\">My Account</a><div if=\"{(opts.testuser == \\'True\\') && opts.sso}\"><a href=\"/welcome/signout?cb={cachebreaker}\">Logout (Session Only)</a><hr></div><a href=\"/Welcome/SignOutAzure?cb={cachebreaker}\">Logout</a><div if=\"{accessLevel >= AdminLevel.SUPG}\"><a href=\"https://login.microsoftonline.com/common/oauth2/v2.0/logout?post_logout_redirect_uri=https://localhost:5000/\">ADSignOutDirect</a></div></div></div></div></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n        this.Constants = require('./../../services/constants.js');\n        this.AdminLevel = this.Constants.AdminLevel;\n\n        this.first = 0;\n        this.last = 0;\n        this.accessLevel = 0;\n        this.loggedIn = false;\n        this.Username = \"\";\n        this.page = \"\";\n        this.School = \"\";\n        this.Header = \"\";\n        this.Login = \"Login\";\n        this.PageName = null;\n        this.HeaderToggle = false;\n        this.TTHeaderFind = true;\n        this.DebugAdminLevel = \"\";\n        this.SubMenuShow1 = false;\n        this.Formatter = opts.formatter;\n        this.YearSelected = \"2024\";\n        this.ShowYearMenus = true;\n        this.ToggleLogoVal = false;\n        this.WindowWidth = 1920;\n        this.Show_empstatus = false;\n        this.cachebreaker = Date.now();\n        this.TabGenMgtLinks = false;\n        this.Student = false;\n        this.HomePageRedirectURL = \"/SDMyloads/Portal\";\n        this.ShowAppsLink = false;\n\n        const GridCurrent = 1;\n        const GridPlanner = 2;\n        const GridCurrentV2 = 4;\n        const GridPlannerV2 = 8;\n\n        this.GridCurrent = false;\n        this.GridPlanner = false;\n        this.GridCurrentV2 = false;\n        this.GridPlannerV2 = false;\n        this.ShowYear = false;\n\n        this.SetGridAccess = function()\n        {\n            if (opts.gridpermissions & GridCurrent) { this.GridCurrent = true; }\n            if (opts.gridpermissions & GridPlanner) { this.GridPlanner = true; }\n            if (opts.gridpermissions & GridCurrentV2) { this.GridCurrentV2 = true; }\n            if (opts.gridpermissions & GridPlannerV2) { this.GridPlannerV2 = true; }\n        }.bind(this)\n\n        this.on('mount', function () {\n            this.idMobileLinks.style.display = \"none\";\n            var optsParameters = this.opts;\n            this.YearSelected = opts.yearselected;\n            this.ShowYearMenus = false;\n\n            this.SetGridAccess();\n\n            if (this.YearSelected != null) {\n                if (this.YearSelected == \"2024\") {\n                    this.ShowYearMenus = true;\n                }\n            }\n\n            if (opts.compilerenvironment == \"DevCompiler\")\n                this.TabGenMgtLinks = true;\n\n            this.NewService = false;\n            if (typeof opts.newservice !== \"undefined\") {\n                this.NewService = (opts.newservice.toLowerCase() === \"true\");\n            }\n\n            if (typeof opts.student !== \"undefined\") {\n                this.Student = (opts.student.toLowerCase() === \"true\");\n                if (this.Student) {\n                    this.HomePageRedirectURL = \"/SDMyDashBoard\";\n                }\n            }\n\n            this.ShowYearMenus = true;\n            this.SetYearHeader();\n\n            this.accessLevel = parseInt(optsParameters.access, 10);\n\n            this.MainAccessControl = {};\n            if (typeof opts.permissions !== \"undefined\") {\n                this.Permissions = opts.permissions;\n\n                this.PermissionsGroups = this.Permissions.split(\":\");\n                if (this.PermissionsGroups[0] != \"\") {\n                    var RibbonTags = this.PermissionsGroups[0].split(\",\");\n                    for (var i = 0; i < RibbonTags.length; i++) {\n                        var RibbonKey = \"RibbonTag_\" + RibbonTags[i];\n                        this.MainAccessControl[RibbonKey] = true;\n                    }\n                }\n\n                if (this.PermissionsGroups[1] != \"\") {\n                    var TableTags = this.PermissionsGroups[1].split(\",\");\n                    for (var i = 0; i < TableTags.length; i++) {\n                        var TableKey = \"TableTag_\" + TableTags[i];\n                        this.MainAccessControl[TableKey] = true;\n                    }\n                }\n            }\n\n            this.StaffIntentionsEnabled = 120;\n            this.loggedIn = (optsParameters.loggedin == 'True');\n            this.Username = optsParameters.username;\n            if (opts.teachcode == 'BH1')\n                this.DebugAdminLevel = opts.debugadminlevel;\n            if (opts.teachcode == 'RBO') {\n                this.ShowAppsLink = true;\n            }\n            this.School = optsParameters.school;\n            this.PageName = $(\"#idPagename\");\n            if (this.PageName.hasOwnProperty('length')) {\n                this.Header = this.PageName[0].value;\n                this.setHighlightedTab();\n            }\n            this.update();\n\n        }.bind(this))\n\n        this.ToggleLogo = function()\n        {\n            if (this.ToggleLogoVal)\n                this.ToggleLogoVal = false;\n            else\n                this.ToggleLogoVal = true;\n        }.bind(this)\n\n        this.HomePageRedirect = function()\n        {\n\n        }.bind(this)\n\n        this.subscribe('WindowHeightChanged', function (passedData) {\n\n            this.WindowWidth = passedData.data.Width;\n            this.update();\n        });\n\n        this.subscribe('TTHeaderSetRibbon', function (passedData) {\n\n            this.RibbonText = passedData.data.PageData.RibbonText;\n            this.RibbonLink = passedData.data.PageData.RibbonLink;\n            this.update();\n        });\n\n        this.SetPagePortalTarget = function()\n        {\n            this.publish('SDPortalSetPagePortalTarget', { Selector: this.RibbonLink });\n        }.bind(this)\n\n        this.ShowSubmenu = function(SourceObject)\n        {\n            this.SubMenuShow1 = true;\n        }.bind(this)\n\n        this.HideSubmenu = function(SourceObject)\n        {\n            this.SubMenuShow1 = false;\n        }.bind(this)\n\n        this.ShowMobileMenu = function()\n        {\n            if (this.idMobileLinks.style.display === \"block\")\n            {\n                this.idMobileLinks.style.display = \"none\";\n            }\n            else\n            {\n                this.idMobileLinks.style.display = \"block\";\n            }\n        }.bind(this)\n\n        this.HandleMobileLoginClick = function()\n        {\n            if (this.loggedIn)\n            {\n                if (this.idMobileLoginMenu.style.display === \"block\")\n                {\n                    this.idMobileLoginMenu.style.display = \"none\";\n                }\n                else\n                {\n                    this.idMobileLoginMenu.style.display = \"block\";\n                }\n            }\n            else {\n                window.location.href = '/Welcome/Login';\n            }\n        }.bind(this)\n\n        this.clickOnMenuDropDownRoot = function(item)\n        {\n            alert(\"Was Clicked\");\n\n        }.bind(this)\n\n        this.changeHeaderColor = function()\n        {\n            if (this.HeaderToggle) {\n                this.NavBarDiv.style.backgroundImage = \"\";\n                this.HeaderToggle = false;\n            }\n            else {\n                this.NavBarDiv.style.backgroundImage = \"linear-gradient(#438bca,#337ab7 60%,#1d9ce5)\"\n                this.HeaderToggle = true;\n            }\n        }.bind(this)\n\n        this.subscribe('SetPageHeadingName', function (pageName) {\n            this.Header = pageName.data.PageHeader;\n            if (typeof pageName.data.MenuGroup !== 'undefined')\n                this.HighlightMenuBarGroupItem(pageName.data.MenuGroup);\n            else\n                this.setHighlightedTab();\n            this.update();\n        });\n\n        this.subscribe('GetPageHeadingName', function (returnDetails)\n        {\n            var Callback = returnDetails.data.CallBack;\n            var PageHeaderDetails = { PageHeading: this.Header };\n            Callback(PageHeaderDetails);\n        });\n\n        this.subscribe('SetPageSchoolName', function (pageName) {\n            this.Header = pageName.data.PageHeader;\n            this.update();\n        });\n\n        this.setHighlightedTab = function()\n        {\n            var tabActivate = \"\";\n            switch (this.Header) {\n                case \"Home\":\n                    tabActivate = \"idRHHome\";\n                    break;\n                case \"Menu\":\n                    tabActivate = \"idRHMenu\";\n                    break;\n                case \"Grid Planner\":\n                    tabActivate = \"idSDGridPlanner\";\n                    break;\n                case \"Grid 2020\":\n                    tabActivate = \"idRHGrid\";\n                    break;\n                case \"Teacher Admin\":\n                    tabActivate = \"idRHTeacher\";\n                    break;\n                case \"Teacher Loads\":\n                    tabActivate = \"idRHTeacher\";\n                    break;\n                case \"All Loads\":\n                    tabActivate = \"idRHTeacher\";\n                    break;\n                case \"Teacher Services\":\n                    tabActivate = \"idRHTeacherServices\";\n                    break;\n                case \"My Loads\":\n                    tabActivate = \"idRHTeacherServices\";\n                    break;\n                case \"Staff Intentions\":\n                    tabActivate = \"idRHTeacherServices\";\n                    break;\n                case \"Faculties\":\n                    tabActivate = \"idRHFaculties\";\n                    break;\n                case \"Rooms\":\n                    tabActivate = \"idRHRooms\";\n                    break;\n                case \"Terms and Conditions\":\n                    tabActivate = \"idLobby\";\n                    break;\n                case \"Privacy Policy\":\n                    tabActivate = \"idLobby\";\n                    break;\n                case \"My Profile\":\n                    tabActivate = \"idProfile\";\n                    break;\n                case \"About Us\":\n                    tabActivate = \"idNL_AboutUs\";\n                    break;\n                case \"Contact Us\":\n                    tabActivate = \"idNL_ContactUs\";\n                    break;\n                case \"Staff Admin\":\n                    tabActivate = \"idAdmin\";\n                    break;\n\n            }\n\n            this.HighlightMenuBarGroupItem(tabActivate)\n\n        }.bind(this)\n\n        this.subscribe('HighlightMenuBarItem', function (pageName) {\n            var MenuItemId = pageName.data.MenuItemId;\n            this.HighlightMenuBarGroupItem(MenuItemId)\n        });\n\n        this.HighlightMenuBarGroupItem = function(ItemToActivate)\n        {\n            if (typeof this[ItemToActivate] !== 'undefined')\n            {\n                if (this[ItemToActivate].className == \"dropbtn\")\n                    this[ItemToActivate].className = \"dropbtnx\";\n                else\n                    this[ItemToActivate].className = this[ItemToActivate].className + \" active\";\n            }\n        }.bind(this)\n\n        this.on(\"update\", function () {\n            this.first = (opts.currentpage - 1) * opts.itemsperpage + 1;\n\n            if (opts.total < (opts.currentpage * opts.itemsperpage))\n                this.last = opts.total;\n            else\n                this.last = opts.currentpage * opts.itemsperpage;\n        });\n\n        this.ChangeYear = function(ObjValue)\n        {\n            this.YearSelected = ObjValue.srcElement.innerText;\n            var containerObject = {\n                OptionCode: this.YearSelected,\n                Controller: \"/SDAdmin/SaveYearSelection\"\n            };\n            this.ChangeYearProcess(containerObject);\n        }.bind(this)\n\n        this.TestOp = function(PayloadIn)\n        {\n            var id = PayloadIn.srcElement.id;\n\n            var PayLoad = {\n                Id: \"a6df0145-cd6f-4e65-9190-e7bce0e2ff62\",\n                ReportType: \"globstaffadmin\",\n                Controller: \"/SDAdmin/TestCustomer\"\n            };\n\n            if (id == \"idSDCollege\") {\n                PayLoad = {\n                    Id: \"b0f8c5ff-90cc-4698-bbb5-551a436f5ce2\",\n                    ReportType: \"globstaffadmin\",\n                    Controller: \"/SDAdmin/TestCustomer\"\n                };\n            } else if (id == \"idAppService\") {\n                var AppService = \"https://app-dev.k8s.schooldata.com.au/hub\";\n                window.location.href = AppService;\n                return;\n            }\n\n            this.ChangeYearProcess(PayLoad);\n        }.bind(this)\n\n        this.ChangeYearProcess = function(PayLoad)\n        {\n\n            var dataToTrans = JSON.stringify(PayLoad);\n\n            $.ajax({\n                type: \"POST\",\n                url: PayLoad.Controller,\n                contentType: 'application/json; charset=utf-8',\n                data: dataToTrans,\n                cache: false,\n                dataType: \"json\",\n                headers: { '__RequestVerificationToken': $(\"input[name='__RequestVerificationToken']\").val() },\n\n                error: function (response) {\n                    if (response.status != 403)\n                        this.publish('TTShowCommonPopupGeneric', { Type: 'Alert', Header: \"SchoolData Alert\", Message: response.Message });\n                    this.update();\n\n                }.bind(this),\n\n                success: function (response) {\n                    if (response.Status == false) {\n                        this.publish('TTShowCommonPopupGeneric', { Type: 'Alert', Header: \"SchoolData Alert\", Message: response.Message, Callback: this.CallBackToHomePage });\n                        this.YearSelected = \"2024\";\n                        return;\n                    }\n\n                    this.SetYearHeader();\n                    this.publish('TTShowCommonPopupGeneric', { Type: 'Alert', Header: \"Request Complete\", Message: response.Message, Callback: this.CallBackToHomePage });\n                    this.publish('YearSelectedChanged', opts.yearselected);\n\n                }.bind(this)\n            });\n\n        }.bind(this)\n\n        this.SetYearHeader = function()\n        {\n            if (this.YearSelected != null) {\n                if (this.YearSelected != \"2025\") {\n                    this.ShowYearMenus = false;\n                    this.idYearSelector.style.backgroundImage = \"linear-gradient(#ca4371, #b73333 60%, #cb9898)\";\n                    this.NavBarDiv.style.backgroundImage = \"linear-gradient(#ca4371, #b73333 60%, #cb9898)\";\n                }\n                else {\n                    this.idYearSelector.style.backgroundImage = \"\";\n                    this.NavBarDiv.style.backgroundImage = \"\";\n                }\n            }\n\n        }.bind(this)\n\n        this.CallBackToHomePage = function()\n        {\n            window.location.href = this.HomePageRedirectURL;\n        }.bind(this)\n\n});\n\n",
    "var riot = require('riot');\nmodule.exports = riot.tag2('ttcommonpopupgeneric', '<div class=\"SDCommonPopupGeneric\"><div id=\"idCommonPopupGeneric\" class=\"modal\"><div class=\"{ModalContentClass}\"><div class=\"{HeaderClass}\"><div class=\"{NewStyles ? \\'newModalHeaderCloseCross\\' : \\'modalHeaderCloseCross\\'}\" if=\"{DisplayMode}\" onclick=\"{discardAction}\"> &times; </div></div><div class=\"{NewStyles ? \\'newModalBody\\' : \\'modalBody\\'}\" id=\"idGenericPopupModalBody\"><p><div if=\"{ShowMessage}\"><div class=\"ModalBodyLeft\"><div if=\"{Icon === \\'circleExclamation\\'}\"><i class=\"fas fa-exclamation-circle\" style=\"color: #F0A81B; font-size: 50px\"></i></div><div if=\"{Icon === \\'triangleExclamation\\'}\"><i class=\"fas fa-exclamation-triangle\" style=\"color: #FF4040; font-size: 50px\"></i></div><div if=\"{Icon === \\'trashCan\\'}\"><i class=\"fas fa-trash-alt\" style=\"color: #E93737; font-size: 50px; margin-left: 10px;\"></i></div><div if=\"{Icon === \\'infoCircle\\'}\"><i class=\"fas fa-info-circle\" style=\"color: #185CCB; font-size: 50px\"></i></div><div if=\"{Icon === \\'infoNotes\\'}\"><i class=\"fas fa-pen-fancy\" style=\"color: #185CCB; font-size: 50px\"></i></div><div if=\"{Icon === \\'bookOpen\\'}\"><i class=\"fas fa-book-open\" style=\"color: #185CCB; font-size: 50px\"></i></div></div><div class=\"ModalBodyRight\"><div class=\"NewModalHeaderText\" id=\"idHeaderText\"></div><div if=\"{!ShowTextArea}\" class=\"modalBodyContainerNormal\" id=\"idMessageBody\"></div></div></div><div if=\"{BusyImage}\" class=\"busyIconContainer\"><img src=\"\\\\res\\\\img\\\\AjaxLoader.gif\" class=\"StatusBarImg\" alt=\"Italian Trulli\"></div><div if=\"{ShowTextArea}\" class=\"TextAreaContainer\"><textarea id=\"idNotesTextArea\" name=\"NotesTextArea\" class=\"TextAreaTag\" rows=\"8\" cols=\"70\"></textarea></div><div class=\"{NewStyles ? \\'newModalBodyContainerNormal\\' : \\'modalBodyContainerNormal\\'}\" if=\"{ShowAcknowledge}\"><div class=\"CheckBoxItem\"><span class=\"CheckBoxTag\">I Acknowledge</span><input class=\"ActiveCheck\" type=\"checkbox\" id=\"idInputAcknowledge\"></div><div class=\"ackfail\" id=\"idAckFail\" if=\"{AckFail}\">You must click \"I Acknowledge\" to enable this operation, or Cancel to Close</div></div><div if=\"{ShowLoads}\"><div class=\"modalBodyContainer\"><div class=\"modalBodyContainerRowHeader\"><div class=\"modalBodyContainerRowHeaderKey\"> {LoadsDetails.HeaderName} </div></div></div><div class=\"modalBodyContainer\"><div class=\"modalBodyContainerRow\" each=\"{DataItem, index in LoadsDetails.DetailsData}\"><div class=\"modalBodyContainerRowKey\"> {DataItem.FieldKey} : </div><div class=\"modalBodyContainerRowData\"> {DataItem.FieldData} </div></div></div></div><div if=\"{MultiCheck}\"><div class=\"modalBodyContainer\"><div class=\"{NewStyles ? \\'newModalBodyContainerNormal\\' : \\'modalBodyContainerNormal\\'}\" id=\"idMultiSelectInstructions\"></div></div><div class=\"modalBodyContainer\"><div class=\"RadioGroupItem\" each=\"{Radio, index in LoadsDetails.DetailsData}\"><div class=\"RadioGroupRadio\"><input type=\"radio\" name=\"SelectionGroup\" class=\"FormRadioBox\" id=\"id{Radio.FieldKey}\" onchange=\"{RadioChanged}\"></div><div class=\"RadioGroupItemLabel\"> {Radio.FieldKey} </div></div></div></div><div class=\"modalDisableCheckContainer\" show=\"{ShowDiscardCheckbox}\"><div if=\"{NewStyles}\" class=\"newCheckBoxItem\"><span class=\"newCheckBoxTag\">Don\\'t show this again</span><input class=\"newActiveCheck\" type=\"checkbox\" onclick=\"{DisablePopup}\"></div><div if=\"{!NewStyles}\" class=\"CheckBoxItem\"><span class=\"CheckBoxTag\">Disable this Message</span><input class=\"ActiveCheck\" type=\"checkbox\" onclick=\"{DisablePopup}\"></div></div></p></div><div class=\"{NewStyles && ModalFooterWithMargin ? \\'modalFooterWithMargin\\' : (NewStyles ? \\'newModalFooter\\' : \\'modalFooter\\')}\" if=\"{DisplayMode}\"><a href=\"#\" show=\"{ShowCancel}\" onclick=\"{discardAction}\" class=\"{NewStyles ? \\'newCommonConfirmCancelbutton\\' : \\'CommonConfirmCancelbutton\\'}\">Cancel</a><a href=\"#\" show=\"{ShowOK}\" onclick=\"{confirmAction}\" class=\"{NewStyles ? \\'newCommonConfirmSavebutton\\' : \\'CommonConfirmSavebutton\\'}\">OK</a><a href=\"#\" show=\"{ShowCallbackCancel}\" onclick=\"{CallbackCancelFunction}\" class=\"{NewStyles ? \\'newCommonConfirmCancelbutton\\' : \\'CommonConfirmCancelbutton\\'}\">Cancel</a><a href=\"#\" show=\"{ShowDelete}\" onclick=\"{confirmAction}\" class=\"{NewStyles ? \\'newCommonConfirmDeletebutton\\' : \\'CommonConfirmSavebutton\\'}\">Delete</a><a href=\"#\" show=\"{ShowBlueOK}\" onclick=\"{confirmAction}\" class=\"{NewStyles ? \\'newCommonConfirmSavebuttonBlue\\' : \\'CommonConfirmSavebutton\\'}\">OK</a></div></div></div></div>', '', '', function(opts) {\n\n        this.mixin('eventSystem');\n        this.Constants = require('./../../services/constants.js');\n        this.Action = this.Constants.Action;\n        this.Message = \"\";\n        this.Callback = null;\n        this.CallbackCancel = null;\n        this.DisplayMode = true;\n        this.PopupType = \"\";\n        this.ExtraData = null;\n        this.ModalFooterWithMargin = false;\n        this.FontAwesomeIcon = \"fa-chess-rook\";\n        this.NewStyles = true;\n\n        this.on('mount', function () {\n\n        }.bind(this));\n\n        this.subscribe('TTShowCommonPopupGeneric', function (payload) {\n            this.idHeaderText.innerHTML = 'Attention';\n            this.HeaderClass = 'modalHeaderAlert';\n            this.ModalContentClass = this.NewStyles ? 'newModalContentAnimated' : 'modalContentAnimated';\n            this.ShowMessage = true;\n            this.ShowLoads = false;\n            this.MultiCheck = false;\n            this.ShowCancel = false;\n            this.ShowCallbackCancel = false;\n            this.ShowDiscardCheckbox = false;\n            this.ShowOK = false;\n            this.ShowAcknowledge = false;\n            this.AckFail = false;\n            this.idGenericPopupModalBody.style.height = \"\";\n            this.RadioResponse = \"\";\n            this.BusyImage = false;\n            this.ExtraData = null;\n            this.DisablePopupTips = false;\n            this.ShowDelete = false;\n            this.ShowBlueOK = true;\n            this.ModalFooterWithMargin = false;\n            this.ShowTextArea = false;\n\n            this.idInputAcknowledge.checked = false;\n\n            if (typeof payload.data.Header !== 'undefined')\n            {\n                this.idHeaderText.innerHTML = payload.data.Header;\n            }\n\n            this.PopupType = payload.data.Type;\n            if (typeof payload.data.Type !== 'undefined')\n            {\n                switch (payload.data.Type) {\n                    case \"Alert\":\n                        this.Icon = \"circleExclamation\";\n                        this.HeaderClass = this.NewStyles ? 'newModalHeader' : 'modalHeader' + payload.data.Type;\n                        this.ShowCancel = false;\n                        this.ShowOK = true;\n                        this.ShowBlueOK = false;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentYellow' : '';\n                        break;\n                    case \"Confirm\":\n                        this.Icon = \"infoCircle\";\n                        this.HeaderClass = this.NewStyles ? 'newModalHeader' : 'modalHeader' + payload.data.Type;\n                        this.ShowCancel = true;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentBlue' : '';\n                        break;\n                    case \"WarningError\":\n                        this.Icon = \"triangleExclamation\";\n                        this.HeaderClass = this.NewStyles ? 'newModalHeader' : 'modalHeader' + payload.data.Type;\n                        this.ShowCancel = true;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentRed' : '';\n                        break;\n                    case \"Warning\":\n                        this.Icon = \"triangleExclamation\";\n                        this.HeaderClass = this.NewStyles ? 'newModalHeader' : 'modalHeader' + payload.data.Type;\n                        this.ShowCancel = false;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentRed' : '';\n                        break;\n                    case \"Delete\":\n                        this.Icon = \"trashCan\";\n                        this.HeaderClass = this.NewStyles ? 'newModalHeader' : 'modalHeader' + payload.data.Type;\n                        this.ShowCancel = true;\n                        this.ShowBlueOK = false;\n                        this.ShowDelete = true;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentRed' : '';\n                        break;\n                    case \"Acknowledge\":\n                        this.Icon = \"infoCircle\";\n                        this.HeaderClass = this.NewStyles ? 'newModalHeader' : 'modalHeader' + payload.data.Type;\n                        this.ShowCancel = true;\n                        this.ShowAcknowledge = true;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentBlue' : '';\n                        break;\n                    case \"Notify\":\n                        this.Icon = \"infoCircle\";\n                        this.ShowOK = false;\n                        this.ShowBlueOK = true;\n                        this.HeaderClass = this.NewStyles ? 'newModalHeader' : 'modalHeader' + payload.data.Type;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentBlue' : '';\n                        break;\n                    case \"Busy\":\n                        this.Icon = \"infoCircle\";\n                        this.HeaderClass = this.NewStyles ? 'newModalHeader' : 'modalHeader' + payload.data.Type;\n                        this.BusyImage = true;\n                        this.ShowOK = false;\n                        this.ShowBlueOK = false;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentBlue' : '';\n                        break;\n                    case \"Offers\":\n                        this.Icon = \"bookOpen\";\n                        this.HeaderClass = this.NewStyles ? 'newModalHeader' : 'modalHeader' + payload.data.Type;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentBlueWider' : '';\n                        this.ModalFooterWithMargin = true;\n                        break;\n                    case \"Loads\":\n                        this.Icon = \"infoCircle\";\n                        this.HeaderClass = this.NewStyles ? 'newModalHeader' : 'modalHeader' + payload.data.Type;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContent' : 'modalContent';\n                        this.LoadsDetails = payload.data.Message\n                        this.ShowMessage = false;\n                        this.ShowLoads = true;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentBlue' : '';\n                        break;\n                    case \"MultiCheck\":\n                        this.Icon = \"infoCircle\";\n                        this.HeaderClass = this.NewStyles ? 'newModalHeader' : 'modalHeader' + payload.data.Type;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContent' : 'modalContent';\n                        this.LoadsDetails = payload.data.Message\n                        this.idMultiSelectInstructions.innerHTML = this.LoadsDetails.MultiSelectInstructions;\n                        this.MultiCheck = true;\n                        this.ShowMessage = false;\n                        this.ShowCancel = true;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentBlue' : '';\n                        break;\n                    case \"Notes\":\n                        this.Icon = \"infoNotes\";\n                        this.HeaderClass = this.NewStyles ? 'newModalHeader' : 'modalHeader' + payload.data.Type;\n                        this.ShowCancel = true;\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentBlue' : '';\n                        this.ShowTextArea = true;\n                        break;\n                    default:\n                        this.HeaderClass = 'newModalHeader';\n                        this.ModalContentClass = this.NewStyles ? 'newModalContent' : 'modalContent';\n                        this.ModalContentClass = this.NewStyles ? 'newModalContentBlue' : '';\n                }\n            }\n\n            if (!this.ShowTextArea) {\n                if (typeof payload.data.Message == \"string\") {\n                    this.idMessageBody.innerHTML = payload.data.Message;\n                    this.update();\n                }\n            }\n            else {\n                this.idNotesTextArea.value = payload.data.Message;\n                this.update();\n            }\n\n            if (typeof payload.data.DisplayMode !== 'undefined')\n            {\n                this.DisplayMode = payload.data.displaymode;\n            }\n\n            if (typeof payload.data.BodyHeight !== 'undefined')\n            {\n                this.idGenericPopupModalBody.style.height = payload.data.BodyHeight;\n            }\n\n            if (payload.data.Callback)\n                this.Callback = payload.data.Callback;\n            else\n                this.Callback = null;\n\n            if (payload.data.CallbackCancel) {\n                this.CallbackCancel = payload.data.CallbackCancel;\n                this.ShowCallbackCancel = true;\n                this.ShowCancel = false;\n            }\n            else\n                this.CallbackCancel = null;\n\n            if (typeof payload.data.ShowDiscardCheckbox !== 'undefined')\n            {\n                this.ShowDiscardCheckbox = payload.data.ShowDiscardCheckbox;\n            }\n\n            if (typeof payload.data.ItemKey !== 'undefined')\n            {\n                this.Parameters = payload.data.ItemKey;\n            }\n\n            if (typeof payload.data.ExtraData !== 'undefined')\n            {\n                this.ExtraData = payload.data.ExtraData;\n            }\n\n            if (typeof payload.data.OvverideHeaderClass !== 'undefined')\n                this.HeaderClass = payload.data.OvverideHeaderClass;\n\n            this.idCommonPopupGeneric.style.display = \"\";\n            this.update();\n\n            this.idCommonPopupGeneric.style.display = \"block\";\n\n        });\n\n        this.subscribe('TTHideCommonPopupGeneric', function (e) {\n            this.idCommonPopupGeneric.style.display = \"\";\n            this.update();\n        });\n\n        this.RadioChanged = function(TagItem)\n        {\n            this.RadioResponse = TagItem.item.Radio.FieldValue;\n        }.bind(this)\n\n        this.confirmAction = function()\n        {\n            if (this.ShowAcknowledge) {\n                if (!this.idInputAcknowledge.checked) {\n                    this.AckFail = true;\n                    this.update();\n                    return;\n                }\n            }\n\n            if (this.PopupType == \"MultiCheck\") {\n                this.Parameters.PermissionSetting = this.RadioResponse;\n            }\n\n            var PopupNotes = \"\";\n            if (typeof this.idNotesTextArea !== \"undefined\") {\n                PopupNotes = this.idNotesTextArea.value;\n            }\n\n            this.idCommonPopupGeneric.style.display = \"\";\n            this.update();\n            if (this.Callback)\n                this.Callback({ action: true, parameter: this.Parameters, ExtraData: this.ExtraData, DisablePopup: this.DisablePopupTips, Notes: PopupNotes });\n        }.bind(this)\n\n        this.discardAction = function()\n        {\n            this.idCommonPopupGeneric.style.display = \"\";\n            this.update();\n            if (this.Callback)\n                this.Callback({ action: false });\n        }.bind(this)\n\n        this.DisablePopup = function(ObjectData)\n        {\n            if (ObjectData.srcElement.checked)\n                this.DisablePopupTips = true;\n            else\n                this.DisablePopupTips = false;\n        }.bind(this)\n\n        this.CallbackCancelFunction = function()\n        {\n            this.idCommonPopupGeneric.style.display = \"\";\n            this.update();\n            this.CallbackCancel();\n        }.bind(this)\n\n});\n\n\n\n",
    "var riot = require('riot');\nmodule.exports = riot.tag2('maintenance', '<ttcommonpopupgeneric></TTcommonPopupGeneric><div class=\"SDHomePage\"><div class=\"SDHomeMenuMainContainer\"><div class=\"SDMenuGroup\" style=\"margin-top: 140px;\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-search SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingMaintText\"> System offline for Maintenance... </div></div><div class=\"SDPhaseStepsContainer\"><div class=\"SDHomePageArticleContainer\"><div class=\"ArticleBasicContentMaint\"><p> The SchoolData platform is temporarily offline for a System Upgrade. </p><p> The upgrade will only take around 10 minutes. </p><p> We apologise for any inconvenience. </p></div></div></div></div></div></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n        this.listMode = true;\n        this.AccessAllowed = false;\n        this.slideIndex = 0;\n\n        this.on('mount', function () {\n\n        }.bind(this));\n\n        this.on('update', function () {\n\n        }.bind(this));\n\n});\n",
    "var riot = require('riot');\nmodule.exports = riot.tag2('sdhomepage', '<ttcommonpopupgeneric></TTcommonPopupGeneric><div class=\"SDHomePage\"><div class=\"SDHomeMenuMainContainer\"><div class=\"SlideShowMain\"><div class=\"slideshow-container\"><div class=\"mySlides fade\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-graduation-cap SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> PLAN your data informed staffing strategy </div></div><img class=\"slideImage\" src=\"\\\\res\\\\img\\\\SchoolData\\\\HomePage\\\\plan.jpg\" alt=\"SchoolData Planning\"></div><div class=\"mySlides fade\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-graduation-cap SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> CONSULT with stakeholders on the press of a button </div></div><img class=\"slideImage\" src=\"\\\\res\\\\img\\\\SchoolData\\\\HomePage\\\\consult.jpg\" alt=\"SchoolData Consultation\"></div><div class=\"mySlides fade\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-graduation-cap SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> COLLABORATE with a seamless multi-user experience </div></div><img class=\"slideImage\" src=\"\\\\res\\\\img\\\\SchoolData\\\\HomePage\\\\collaborate.jpg\" alt=\"SchoolData Collaborate\"></div><div class=\"mySlides fade\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-graduation-cap SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> PUBLISH bespoke reports for your selected audience </div></div><img class=\"slideImage\" src=\"\\\\res\\\\img\\\\SchoolData\\\\HomePage\\\\publish.jpg\" alt=\"SchoolData Publish\"></div><div class=\"mySlides fade\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-graduation-cap SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> ANALYSE your operational efficiency and compare with like schools </div></div><img class=\"slideImage\" src=\"\\\\res\\\\img\\\\SchoolData\\\\HomePage\\\\analyse.jpg\" alt=\"SchoolData Analyse\"></div><a class=\"prev\" onclick=\"{plusSlides}\">&#10094;</a><a class=\"next\" onclick=\"{minusSlides}\">&#10095;</a></div><br><div style=\"text-align:center\"><span class=\"dot\" dataindex=\"1\" onclick=\"{currentSlide}\"></span><span class=\"dot\" dataindex=\"2\" onclick=\"{currentSlide}\"></span><span class=\"dot\" dataindex=\"3\" onclick=\"{currentSlide}\"></span><span class=\"dot\" dataindex=\"4\" onclick=\"{currentSlide}\"></span><span class=\"dot\" dataindex=\"5\" onclick=\"{currentSlide}\"></span></div></div><div class=\"SDMenuGroup\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-search SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> Are you considering a Timetable Review? </div></div><div class=\"SDPhaseStepsContainer\"><div class=\"SDHomePageArticleContainer\"><div class=\"ArticleBasicContent\"> We want to make teaching a more attractive job. We think everyone could benefit from experiencing school as a teacher, not just as a learner. If we get the best and brightest back through the school gates as adults, we\\'re sure that many will be hooked. <br><br> We want to see an improvement in educational outcomes for our children. <br><br> We want to save schools money through optimisation measures, so they can allocate resources to building projects or programs that have a positive impact on student outcomes. <p><a href=\"/Welcome/Media?menuitem=Article1\"><b>Click here to find out why several schools have already booked in their 2024 Timetable Review!</b></a></p></div></div></div></div><div class=\"SDMenuGroup\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-search SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> What does the new Agreement mean for your school? </div></div><div class=\"SDPhaseStepsContainer\"><div class=\"SDHomePageArticleContainer\"><div class=\"ArticleBasicContent\"><p>In case you\\'ve been isolating for more than two years and don\\'t have any children at home, let me tell you that teachers are tired. In lots of ways, the silver lining on the dark cloud of stress, fatigue, and (further) increased expectation that has hovered over the teaching community since late 2019, is that the pandemic has accelerated the urgency with which teacher workload needs to be systematically addressed. Who would\\'ve thought that, in order to secure the health and wellbeing of future generations, we\\'d need to value teachers more and pay scientists more? Teaching wasn\\'t always like this, so what went wrong?</p><p><a href=\"/Welcome/Media?menuitem=Article3\"><b>Read More ....</b></a></p></div></div></div></div><div class=\"SDMenuGroup\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-search SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> 2022: The year of the Timetable Review? </div></div><div class=\"SDPhaseStepsContainer\"><div class=\"SDHomePageArticleContainer\"><div class=\"ArticleBasicContent\"><p>Whenever I find myself chatting to school leaders about timetabling, I invariably hear myself rattle off my timetabling philosophy: \"The Timetabler should be - in equal parts - a servant to the students and to the College Executive\". On each occasion, I hope that it resonates with my audience rather than sounding like a rehearsed slogan. In essence, this statement is a summary of my Terms and Conditions, and it is at the core of my professional raison d\\'etre. It places the students, without whom the school would not exist, at the centre of the conversation about timetabling priorities. It implies that there will likely be a tug of war between the needs and wants of the students - the customers who are paying for a service - and the priorities of those charged with the responsibility of providing that service in and efficient and sustainable way, so that they can continue to provide that service long into the future.</p><p><a href=\"/Welcome/Media?menuitem=Article2\"><b>Read More ....</b></a></p></div></div></div></div><div class=\"SDMenuGroup\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-graduation-cap SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> Packages and Prices </div></div><div class=\"SDPhaseStepsContainer\"><div class=\"SDMenuPhaseItem\"><div class=\"MenuItemHeaderOriginal\" id=\"PPHeadCont_1\" onclick=\"{LinkClickedPP}\"><div class=\"MenuItemHeaderIcon\"><i class=\"fas fa-handshake\"></i></div><div class=\"MenuItemHeaderText\" id=\"PPHead_1\"> SchoolData Site Licence </div></div><div class=\"MenuItemBody\" id=\"PP_1\" onclick=\"{LinkClickedPP}\"> Click here for more details </div></div><div class=\"SDMenuPhaseItem\"><div class=\"MenuItemHeaderOriginal\" id=\"PPHeadCont_2\" onclick=\"{LinkClickedPP}\"><div class=\"MenuItemHeaderIcon\"><i class=\"fas fa-handshake\"></i></div><div class=\"MenuItemHeaderText\" id=\"PPHead_2\"> Daily Organisation Database Licence </div></div><div class=\"MenuItemBody\" id=\"PP_2\" onclick=\"{LinkClickedPP}\"> Click here for more details </div></div><div class=\"SDMenuPhaseItem\"><div class=\"MenuItemHeaderOriginal\" id=\"PPHeadCont_3\" onclick=\"{LinkClickedPP}\"><div class=\"MenuItemHeaderIcon\"><i class=\"fas fa-handshake\"></i></div><div class=\"MenuItemHeaderText\" id=\"PPHead_3\"> Timetable Review Package </div></div><div class=\"MenuItemBody\" id=\"PP_3\" onclick=\"{LinkClickedPP}\"> Click here for more details </div></div><div class=\"SDMenuPhaseItem\"><div class=\"MenuItemHeaderOriginal\" id=\"PPHeadCont_4\" onclick=\"{LinkClickedPP}\"><div class=\"MenuItemHeaderIcon\"><i class=\"fas fa-handshake\"></i></div><div class=\"MenuItemHeaderText\" id=\"PPHead_4\"> Timetable Health Checks </div></div><div class=\"MenuItemBody\" id=\"PP_4\" onclick=\"{LinkClickedPP}\"> Click here for more details </div></div></div></div><div class=\"SDMenuGroup\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-graduation-cap SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> Videos </div></div><div class=\"SDVideoStepsContainer\"><div class=\"SDMenuPhaseItem\"><div class=\"MenuItemHeaderOriginal\" id=\"PPVideoCont_1\" onclick=\"{VideoClicked}\"><div class=\"MenuItemHeaderIcon\"><i class=\"fas fa-video\"></i></div><div class=\"MenuItemHeaderText\" id=\"HeadVid_1\"> Timetable Health Check Report </div></div><video class=\"MenuItemBody\" controls><source src=\"https://schooldatavideos.s3.ap-southeast-2.amazonaws.com/TimetableHealthCheckReport.mp4\" type=\"video/mp4\"> Your browser does not support the video tag. </video></div></div><div class=\"SDVideoStepsContainer\"><div class=\"SDMenuPhaseItem\"><div class=\"MenuItemHeaderOriginal\" id=\"PPVideoCont_1\" onclick=\"{VideoClicked}\"><div class=\"MenuItemHeaderIcon\"><i class=\"fas fa-video\"></i></div><div class=\"MenuItemHeaderText\" id=\"HeadVid_1\"> Why SchoolData? </div></div><video class=\"MenuItemBody\" controls><source src=\"https://schooldatavideos.s3-ap-southeast-2.amazonaws.com/WhySchoolDataTake.mp4\" type=\"video/mp4\"> Your browser does not support the video tag. </video></div></div></div><div class=\"SDMenuGroupBottom\"></div></div></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n        this.listMode = true;\n        this.AccessAllowed = false;\n        this.slideIndex = 0;\n\n        this.on('mount', function () {\n\n            this.publish('SetPageHeadingName', { PageHeader: 'Menu' });\n\n            this.showSlidesAutomatic();\n            this.update();\n            var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;\n\n        }.bind(this));\n\n        this.on('update', function () {\n\n        }.bind(this));\n\n        this.LinkClickedPP = function(eventItem)\n        {\n\n            var SchoolDataLicence = \"SchoolData Licence<br>\";\n            SchoolDataLicence += \"<p>\";\n            SchoolDataLicence += '<img src=\"\\\\res\\\\img\\\\SchoolData\\\\\\Licences\\\\SDAnnualLicence.png\" alt=\"SchoolData Licence\">';\n\n            var DailyOrgLicence = \"Daily Organiser Database Licence<br>\";\n            DailyOrgLicence += \"<p>\";\n            DailyOrgLicence += '<img src=\"\\\\res\\\\img\\\\SchoolData\\\\\\Licences\\\\DODAnnualLicence.png\" alt=\"SchoolData Licence\">';\n\n            var TimeTableReviewFees = \"Timetable Review Fees<br>\";\n            TimeTableReviewFees += \"<p>\";\n            TimeTableReviewFees += '<img src=\"\\\\res\\\\img\\\\SchoolData\\\\\\Licences\\\\TRPFees.png\" alt=\"SchoolData Licence\">';\n\n            var TimeTableHealthCheckLicences = \"Timetable HeathCheck Fees<br>\";\n            TimeTableHealthCheckLicences += \"<p>\";\n            TimeTableHealthCheckLicences += '<img src=\"\\\\res\\\\img\\\\SchoolData\\\\\\Licences\\\\THCFees.png\" alt=\"SchoolData Licence\">';\n\n            var Messages = [\n                SchoolDataLicence,\n                DailyOrgLicence,\n                TimeTableReviewFees,\n                TimeTableHealthCheckLicences\n            ]\n            var ItemIndex = eventItem.currentTarget.id.split(\"_\")[1];\n            var HeaderId = \"PPHeadCont_\" + ItemIndex;\n            var PopupHeader = this[HeaderId].innerText;\n            this.publish('TTShowCommonPopupGeneric', { Type: 'Offers', Header: PopupHeader, Message: Messages[(ItemIndex-1)]});\n        }.bind(this)\n\n        this.plusSlides = function()\n        {\n            this.showSlides(this.slideIndex -= 1);\n        }.bind(this)\n\n        this.minusSlides = function()\n        {\n            this.showSlides(this.slideIndex += 1);\n        }.bind(this)\n\n        this.currentSlide = function(spanObj)\n        {\n            var dotIndex = spanObj.currentTarget.attributes.dataIndex.value;\n            this.showSlides(this.slideIndex = dotIndex);\n        }.bind(this)\n\n        this.showSlides = function(n)\n        {\n            var i;\n            var slides = document.getElementsByClassName(\"mySlides\");\n            var dots = document.getElementsByClassName(\"dot\");\n            if (n > slides.length) { this.slideIndex = 1 }\n            if (n < 1) { this.slideIndex = slides.length }\n            for (i = 0; i < slides.length; i++) {\n                slides[i].style.display = \"none\";\n            }\n            for (i = 0; i < dots.length; i++) {\n                dots[i].className = dots[i].className.replace(\" active\", \"\");\n            }\n            slides[this.slideIndex - 1].style.display = \"block\";\n            dots[this.slideIndex - 1].className += \" active\";\n        }.bind(this)\n\n        this.showSlidesAutomatic = function()\n        {\n            var i;\n            var slides = document.getElementsByClassName(\"mySlides\");\n            var dots = document.getElementsByClassName(\"dot\");\n            for (i = 0; i < slides.length; i++) {\n                slides[i].style.display = \"none\";\n            }\n            this.slideIndex++;\n            if (this.slideIndex > slides.length) { this.slideIndex = 1 }\n            for (i = 0; i < dots.length; i++) {\n                dots[i].className = dots[i].className.replace(\" active\", \"\");\n            }\n            slides[this.slideIndex - 1].style.display = \"block\";\n            dots[this.slideIndex - 1].className += \" active\";\n            setTimeout(this.showSlidesAutomatic, 7000);\n        }.bind(this)\n\n});\n",
    "var riot = require('riot');\nmodule.exports = riot.tag2('sdnewhomepage', '<ttcommonpopupgeneric></TTcommonPopupGeneric><header><nav class=\"navbar navbar-expand-lg fixed-top navbar-scroll\"><div class=\"container\"><a class=\"navbar-brand\" href=\"/\">SchoolData</a><button class=\"navbar-toggler\" type=\"button\" data-mdb-toggle=\"collapse\" data-mdb-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\"><i class=\"fas fa-bars\"></i></button><div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\"><ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"/Welcome/contactus\">Contact Us</a></li><li class=\"nav-item\"><a class=\"nav-link\" href=\"/Welcome/ManualSection\">SD Manual</a></li><li class=\"nav-item\"><a class=\"nav-link\" href=\"/Welcome/UserAgreements\">User Agreements</a></li><li class=\"nav-item\"><a class=\"nav-link\" href=\"/Welcome/SDExpress\">SD Express</a></li></ul><ul class=\"navbar-nav ms-auto d-flex flex-row\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"/welcome/login\">Login</a></li><li class=\"nav-item me-3 me-lg-0\"><a class=\"nav-link\" href=\"#!\"></a></li></ul></div></div></nav><div class=\"modal\" id=\"servicesModal\" tabindex=\"-1\" role=\"dialog\"><div class=\"modal-dialog\" role=\"document\"><div class=\"modal-content\"><div class=\"modal-header\"><h5 class=\"modal-title\">Services and Prices</h5><button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button></div><div class=\"modal-body\"><h4>Pricing Information</h4><table class=\"table\"><thead><tr><th>Product / Service</th><th>Students</th><th>Billing</th><th>Cost (plus GST)</th><th>Bonus Offer</th></tr></thead><tbody><tr><td>Blueprint for Tomorrow: Staffing Strategy Workshop</td><td>N/A</td><td>One-off</td><td>$4,500</td><td>Attend the workshop and get 50% off your next annual licence.</td></tr><tr><td>SchoolData Site Licence (fewer than 1000 students)</td><td>&lt; 1000</td><td>Annual</td><td>$4,250</td><td></td></tr><tr><td>SchoolData Site Licence (1000 - 1999 students)</td><td>1000 - 1999</td><td>Annual</td><td>$5,750</td><td></td></tr><tr><td>SchoolData Site Licence (2000+ students)</td><td>2000 +</td><td>Annual</td><td>$7,250</td><td></td></tr><tr><td>Timetable Construction</td><td>N/A</td><td>Hourly</td><td>$350</td><td></td></tr><tr><td>General Consultancy</td><td>N/A</td><td>Hourly</td><td>$350</td><td></td></tr></tbody></table></div><div class=\"modal-footer\"><button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">Close</button></div></div></div></div><section><div id=\"intro\"><div class=\"container-fluid h-100\"><div class=\"row align-items-center justify-content-center h-100\"><div class=\"col-lg-6 col-xl-4 mt-5\"><div id=\"rotating-text\" class=\"display-4 fw-bold mb-5\" style=\"color: #54b4eb;\"></div><a href=\"/Welcome/contactus\"><button type=\"button\" class=\"btn btn-primary btn-rounded btn-lg\"> Get in touch </button></a></div><div class=\"col-lg-5 col-xl-5\"><img src=\"/res/img/HomePage/hiring_charcoal.png\" alt=\"\" class=\"img-fluid\"></div></div></div></div></section></header><main><div class=\"container my-5\"><section><h3 class=\"text-center mb-5\">Elevate your expertise and amplify your impact with SchoolData</h3><p class=\"text-center mb-5 mx-auto w-responsive\"> Join a community of Directors of Staffing, Principals, Business Managers, and Timetablers who are leveraging SchoolData to redefine what\\'s possible in timetable planning and analytics.<br> Share insights, learn from peers, and continue to grow in your expertise. </p><div class=\"row\"><div class=\"col-lg-4 mb-lg-0 mb-5\"><div class=\"d-flex justify-content-start\"><div class=\"me-4\"><i class=\"fas fa-user-tie text-primary fa-2x\" style=\"color: #3B71CA;\"></i></div><div><h5>Principals and Business Managers</h5><p> You need a system that delivers tangible financial benefits while ensuring educational excellence; SchoolData is the solution you can trust. Invest in modernisation and stay ahead of the curve with SchoolData. <p> Book in a Strategy Workshop and you\\'ll receive a timetable report that shows all of the opportunities and pinch points in your timetable file. Once you\\'re onboard, run these ad nauseum on all past timetable files to see how you\\'re trending on all the metrics that matter! </p></div></div></div><div class=\"col-lg-4 mb-lg-0 mb-5\"><div class=\"d-flex justify-content-start\"><div class=\"me-4\"><i class=\"fas fa-chalkboard-teacher text-primary fa-2x\" style=\"color: #3B71CA;\"></i></div><div class=\"col-lg-10 col-md-9 col-10\"><h5>Deputy Principals, Directors of Staffing</h5><p> As a Deputy Principal or Director of Staffing, your role is pivotal in ensuring the smooth operation of the school and the optimal allocation of resources. SchoolData offers a robust suite of tools tailored to address the complexities of your role. <p> Empower yourself with real-time analytics and reporting capabilities that form the backbone of your resource allocation strategy. Make decisions that are informed, impactful, and fully aligned with your school\\'s vision. </p></p></div></div></div><div class=\"col-lg-4\"><div class=\"d-flex justify-content-start\"><div class=\"me-4\"><i class=\"far fa-calendar-alt text-primary fa-2x\" style=\"color: #3B71CA;\"></i></div><div class=\"col-lg-10 col-md-9 col-10\"><h5>Timetablers</h5><p> You are the architect of your school\\'s schedule - a role that is both complex and critical.<br> SchoolData is here to enhance your expertise, and elevate the results you deliver for your school. <p> Our tools are designed to be your assistant, helping you achieve more in less time.<br> With SchoolData by your side, it\\'s about empowering you to be even better at what you do. </p></div></div></div></div></section><hr class=\"my-5\"><section><h3 class=\"text-center mb-5\">The SchoolData Journey</h3><p class=\"text-center mb-md-5 mx-auto w-responsive\"></p><div class=\"row align-items-center\"><div class=\"col-lg-5\" style=\"margin-top: -2rem;\"><img src=\"/res/img/HomePage/insights_charcoal.png\" class=\"img-fluid\" alt=\"smaple image\"></div><div class=\"col-lg-6\"><div class=\"row mb-4\"><div class=\"col-md-1 col-2\"><i class=\"fas fa-chart-line fa-2x\" style=\"color: #3B71CA;\" style=\"color: #3B71CA;\"></i></div><div class=\"col-md-11 col-10\"><h5>Kickstart Your Journey: Assess Before You Progress!</h5><p> Explore the potential for optimisation! Contact us for a free demo and, if you send us a timetable file before the demo, we\\'ll run your instant timetable report to uncover some avenues for enhancement, gratis. </p></div></div><div class=\"row mb-4\"><div class=\"col-md-1 col-2\"><i class=\"fas fa-rocket fa-2x\" style=\"color: #3B71CA;\" style=\"color: #3B71CA;\"></i></div><div class=\"col-md-11 col-10\"><h5>Turbocharge Onboarding: Instantly Analyse and Evaluate</h5><p> Experience SchoolData\\'s Variations App.<br> Load your school\\'s timetable and test the impact of adjustments to Agreement conditions, period lengths, enrolment numbers, or average class sizes on your staffing requirements. <br>Make informed decisions. </p></div></div><div class=\"row\"><div class=\"col-md-1 col-2\"><i class=\"fas fa-wrench fa-2x\" style=\"color: #3B71CA;\" style=\"color: #3B71CA;\"></i></div><div class=\"col-md-11 col-10\"><h5>Customise Your Landscape: Incorporate Key Insights</h5><p> Choose to gather invaluable data with our Staff Intentions Forms, Student PreSelection Forms, and Student Recommendations Forms. <br> Lay the groundwork for a comprehensive view of your school\\'s unique ecosystem. </p></div></div></div></div></section><hr class=\"my-5\"><section><div class=\"row align-items-center\" style=\"margin-top: 0rem;\"><div class=\"col-lg-6\"><div class=\"row mb-4\"><div class=\"col-md-1 col-2\"><i class=\"fas fa-users fa-2x\" style=\"color: #3B71CA;\"></i></div><div class=\"col-md-11 col-10\"><h5>Empower and Engage: Construct Your Dream Team</h5><p> Learning Area Leaders can participate in creating a staffing grid for the following year. <br> By involving departmental stakeholders, Directors of Staffing can ensure well-balanced loads and high staff satisfaction. <br> Start hiring early! </p></div></div><div class=\"row mb-4\"><div class=\"col-md-1 col-2\"><i class=\"fas fa-sync fa-2x\" style=\"color: #3B71CA;\"></i></div><div class=\"col-md-11 col-10\"><h5>Synchronise for Success: Seamless Data Integration</h5><p> Why input data manually? <br> Our system syncs with Student Options Modules from Web Preferences and enriches the data with your preferred teachers, streamlining the process. </p></div></div><div class=\"row\"><div class=\"col-md-1 col-2\"><i class=\"fas fa-calendar-alt fa-2x\" style=\"color: #3B71CA;\"></i></div><div class=\"col-md-11 col-10\"><h5>Optimise the Grid: Perfect Your Scheduling</h5><p> Do you want to sneak a peek at the next generation of timetabling?<br> Ask us for a trial run of our cutting-edge Grid Optimiser to create a premium Student Options File. <br> Our sophisticated algorithms respect teacher and student-level constraints (including some that haven\\'t been possible until now), ensuring more students get their preferences. </p></div></div></div><div class=\"col-lg-5\"><img src=\"/res/img/HomePage/team_2_charcoal.png\" class=\"img-fluid\" alt=\"smaple image\"></div></div></section><hr class=\"my-5\"><section><div class=\"row align-items-center\"><div class=\"col-lg-5\" style=\"margin-top: -2rem;\"><img src=\"/res/img/HomePage/exams_charcoal.png\" class=\"img-fluid\" alt=\"smaple image\"></div><div class=\"col-lg-6\"><div class=\"row mb-4\"><div class=\"col-md-1 col-2\"><i class=\"fas fa-hands-helping fa-2x\" style=\"color: #3B71CA;\" style=\"color: #3B71CA;\"></i></div><div class=\"col-md-11 col-10\"><h5>A Helping Hand: Managed Services</h5><p> Need more support? <br>We offer a range of managed services to ensure your journey is smooth and tailored to your needs. </p></div></div><div class=\"row mb-4\"><div class=\"col-md-1 col-2\"><i class=\"fas fa-pencil-alt fa-2x\" style=\"color: #3B71CA;\" style=\"color: #3B71CA;\"></i></div><div class=\"col-md-11 col-10\"><h5>Flawless Exams: Swift and Smart Scheduling</h5><p> Generate Exam Timetables in a flash.<br> Our intelligent system ensures optimal scheduling while respecting student constraints, such as preventing three exams in one day by default! </p></div></div><div class=\"row\"><div class=\"col-md-1 col-2\"><i class=\"far fa-comments fa-2x\" style=\"color: #3B71CA;\" style=\"color: #3B71CA;\"></i></div><div class=\"col-md-11 col-10\"><h5>Connect and Inform: Transparent Communication</h5><p> Say goodbye to mail merging. <br> With SchoolData, teachers can simply log in to view their teaching loads on their dashboard. Transparent, efficient, and user-friendly. </p></div></div></div></div></section><hr class=\"my-5\"><section class=\"mb-10 text-center\"><h2 class=\"fw-bold mb-5\">Testimonials</h2><div id=\"carouselTestimonialControls\" class=\"carousel slide carousel-dark carousel-fade\" data-mdb-ride=\"carousel\" data-mdb-interval=\"6000\"><div class=\"carousel-inner px-5 px-md-0\"><div class=\"carousel-item active\"><img class=\"rounded-circle shadow-2-strong mb-4\" src=\"/res/img/HomePage/testimonials_charcoal.png\" alt=\"avatar\" style=\"width: 150px\"><div class=\"row d-flex justify-content-center\"><div class=\"col-lg-8\"><h5 class=\"mb-3\">Dr Janine Biggin</h5><p>Principal</p><p class=\"text-muted\"><i class=\"fas fa-quote-left pe-2\"></i> I have used the SchoolData products for quite a number of years now. It makes staffing very easy as the information you require is available in the one spot. The grid in SchoolData is fun to use because it enables you to easily see what teachers have requested to teacher in the coming year, what they have taught previously and then where they have been placed for the following year. You can easily see where you have created clashes. When you are working collaboratively with others, all the team can see the grid together, discuss and evaluate the loads as you go. It is important that a school timetable enables good structures to exist so that the best learning can occur, and the best working environment can exist for teachers. SchoolData certainly is instrumental in guiding the creation of teacher loads and a well-structured and workable timetable. I use it all year long for reviewing and updating loads as changes occur. It is a very effective program for supporting all aspects of timetabling. <i class=\"fas fa-quote-right pe-2\"></i></p></div></div><ul class=\"list-unstyled d-flex justify-content-center text-warning mb-0\"><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li></ul></div><div class=\"carousel-item\"><img class=\"rounded-circle shadow-2-strong mb-4\" src=\"/res/img/HomePage/testimonials_charcoal.png\" alt=\"avatar\" style=\"width: 150px\"><div class=\"row d-flex justify-content-center\"><div class=\"col-lg-8\"><h5 class=\"mb-3\">Rose Connolly</h5><p>Principal</p><p class=\"text-muted\"><i class=\"fas fa-quote-left pe-2\"></i> SchoolData has truly revolutionised the way we approach strategic staffing in our school. In these challenging times, it has empowered us to stay one step ahead by predicting our staffing needs, allowing us to navigate uncertainties with confidence and efficiency. <i class=\"fas fa-quote-right pe-2\"></i></p></div></div><ul class=\"list-unstyled d-flex justify-content-center text-warning mb-0\"><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li></ul></div><div class=\"carousel-item\"><img class=\"rounded-circle shadow-2-strong mb-4\" src=\"/res/img/HomePage/testimonials_charcoal.png\" alt=\"avatar\" style=\"width: 150px\"><div class=\"row d-flex justify-content-center\"><div class=\"col-lg-8\"><h5 class=\"mb-3\">Tanya Kolb</h5><p>Director of Operations</p><p class=\"text-muted\"><i class=\"fas fa-quote-left pe-2\"></i> Game changer. Most effective program I have used across staff intentions, staffing and load distribution along with VCE grid and class list development. Hours of manual labour saved, giving time back to more purposeful educational matters. <i class=\"fas fa-quote-right pe-2\"></i></p></div></div><ul class=\"list-unstyled d-flex justify-content-center text-warning mb-0\"><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li></ul></div><div class=\"carousel-item\"><img class=\"rounded-circle shadow-2-strong mb-4\" src=\"/res/img/HomePage/testimonials_charcoal.png\" alt=\"avatar\" style=\"width: 150px\"><div class=\"row d-flex justify-content-center\"><div class=\"col-lg-8\"><h5 class=\"mb-3\">Brad Heeps</h5><p>Timetabler</p><p class=\"text-muted\"><i class=\"fas fa-quote-left pe-2\"></i> As a relative newcomer to timetabling, SchoolData is accelerating my learning (and teaching me smart habits) by offering a logical workflow, increased efficiencies, and outstanding support. Their products and their expertise are taking timetabling and Daily Organisation to a new and vastly improved level by keeping up with modern trends and requirements. <i class=\"fas fa-quote-right pe-2\"></i></p></div></div><ul class=\"list-unstyled d-flex justify-content-center text-warning mb-0\"><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li><li><i class=\"fas fa-star fa-sm\"></i></li></ul></div></div><button class=\"carousel-control-prev\" type=\"button\" data-mdb-target=\"#carouselTestimonialControls\" data-mdb-slide=\"prev\"><span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span><span class=\"visually-hidden\">Prev</span></button><button class=\"carousel-control-next\" type=\"button\" data-mdb-target=\"#carouselTestimonialControls\" data-mdb-slide=\"next\"><span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span><span class=\"visually-hidden\">Next</span></button></div></section><hr class=\"my-5\"></div></main><footer class=\"text-center text-lg-start\" style=\"background-color: #ddf0fb;\"><div class=\"container p-4\"><div class=\"row mt-4\"><div class=\"col-lg-5 col-md-6 mb-4 mb-md-0\"><h5 class=\"text-uppercase mb-4\">About Us</h5><p> SchoolData are career Timetablers, Software Engineers, Constraint Programmers, Cyber Security Experts, a Maths whiz-kid, and a Quantum Physicist. </p><p> Our conversations don\\'t always make sense to outsiders, but we\\'re damn good at what we do and we\\'re still pretty fun to be around. </p><div class=\"mt-4\"></div></div><div class=\"col-lg-5 offset-lg-1 col-md-6 mb-4 mb-md-0\"><h5 class=\"text-uppercase mb-4 pb-1\">Search something</h5><div class=\"form-outline mb-4\"><input type=\"text\" id=\"formControlLg\" class=\"form-control form-control-lg\"><label class=\"form-label\" for=\"formControlLg\">Search</label></div><ul class=\"fa-ul\" style=\"margin-left: 1.65em;\"><li class=\"mb-3\"><span class=\"fa-li\"><i class=\"fas fa-home\"></i></span><span class=\"ms-2\"> Suite 4.03 / 365 Little Collins St. <br> Melbourne, Australia 3000 </span></li><li class=\"mb-3\"><span class=\"fa-li\"><i class=\"fas fa-envelope\"></i></span><span class=\"ms-2\">info@SchoolData.com.au</span></li><li class=\"mb-3\"><span class=\"fa-li\"><i class=\"fas fa-phone\"></i></span><span class=\"ms-2\">+ 61 438 117 730</span></li></ul></div></div></div><div class=\"text-center p-3\" style=\"background-color: rgba(0, 0, 0, 0.2);\"> � 2020 Copyright: <a class=\"text-white\" href=\"https://mdbootstrap.com/\">MDBootstrap.com</a></div></footer>', '', '', function(opts) {\ndocument.addEventListener('DOMContentLoaded', function () {\n\n    var textBlocks = [\n        'Unrivalled Staffing Intelligence <br> <span style=\"font-size: 0.8em; color: black;\">Elevate Your Expertise with the Market\\'s Most Advanced Planning Tools.</span>',\n        'Staff Next Year’s Classes Faster & Earlier <br> <span style=\"font-size: 0.8em; color: black;\">Secure Top Talent Before the Competition.</span>',\n        'Seamless Integration <br> <span style=\"font-size: 0.8em; color: black;\">Enhance Your Processes with Full Compatibility with Timetabling Solutions.</span>'\n    ];\n\n    var currentIndex = 0;\n    var rotatingTextContainer = document.getElementById('rotating-text');\n\n    function rotateText() {\n        rotatingTextContainer.innerHTML = textBlocks[currentIndex];\n        currentIndex = (currentIndex + 1) % textBlocks.length;\n    }\n\n    rotateText();\n    setInterval(rotateText, 4500);\n});\n\n        this.mixin('eventSystem');\n        this.listMode = true;\n        this.AccessAllowed = false;\n        this.slideIndex = 0;\n\n        this.on('mount', function () {\n\n        }.bind(this));\n\n        this.on('update', function () {\n\n        }.bind(this));\n\n});",
    "var riot = require('riot');\nmodule.exports = riot.tag2('sdnewhomepageworkshop', '<header><nav class=\"navbar navbar-expand-lg fixed-top navbar-scroll\"><div class=\"container\"><a class=\"navbar-brand\" href=\"/\">SchoolData</a><button class=\"navbar-toggler\" type=\"button\" data-mdb-toggle=\"collapse\" data-mdb-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\"><i class=\"fas fa-bars\"></i></button><div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\"><ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"/Welcome/contactus\">Contact Us</a></li></ul><ul class=\"navbar-nav ms-auto d-flex flex-row\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"/welcome/login\">Login</a></li><li class=\"nav-item me-3 me-lg-0\"><a class=\"nav-link\" href=\"#!\"></a></li></ul></div></div></nav><div class=\"modal\" id=\"servicesModal\" tabindex=\"-1\" role=\"dialog\"><div class=\"modal-dialog\" role=\"document\"><div class=\"modal-content\"><div class=\"modal-header\"><h5 class=\"modal-title\">Services and Prices</h5><button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button></div><div class=\"modal-body\"><h4>Pricing Information</h4><table class=\"table\"><thead><tr><th>Product / Service</th><th>Students</th><th>Billing</th><th>Cost (plus GST)</th><th>Bonus Offer</th></tr></thead><tbody><tr><td>Blueprint for Tomorrow: Staffing Strategy Workshop</td><td>N/A</td><td>One-off</td><td>$4,500</td><td>Attend the workshop and get 50% off your next annual licence.</td></tr><tr><td>SchoolData Site Licence (fewer than 1000 students)</td><td>&lt; 1000</td><td>Annual</td><td>$4,250</td><td></td></tr><tr><td>SchoolData Site Licence (1000 - 1999 students)</td><td>1000 - 1999</td><td>Annual</td><td>$5,750</td><td></td></tr><tr><td>SchoolData Site Licence (2000+ students)</td><td>2000 +</td><td>Annual</td><td>$7,250</td><td></td></tr><tr><td>Timetable Construction</td><td>N/A</td><td>Hourly</td><td>$350</td><td></td></tr><tr><td>General Consultancy</td><td>N/A</td><td>Hourly</td><td>$350</td><td></td></tr></tbody></table></div><div class=\"modal-footer\"><button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">Close</button></div></div></div></div></header><main><div class=\"container my-4\" id=\"workshop\"><section class=\"event-header mb-5\"><h2 class=\"text-center mb-4\">Blueprint for Tomorrow: Staffing Strategy Workshop</h2><p class=\"text-center\">Empower Your School\\'s Future with Expert-Led Insights and Strategic Planning</p><p class=\"text-center mb-5\">Join us for a transformative day, where data-driven insights meet innovative staffing solutions.</p></section><section class=\"call-to-action mb-5\"><a href=\"https://outlook.office365.com/owa/calendar/SchoolDataStaffingStrategyWorkshop@schooldata.com.au/bookings/\" class=\"btn btn-primary btn-rounded\" target=\"_blank\">Reserve Your Spot Today!</a><a href=\"/Welcome/contactus\" class=\"btn btn-outline-primary btn-rounded\" target=\"_blank\">Request a Phone Call or Demo</a></section><section class=\"mb-5\"><h3 class=\"section-header\">Expert-Led Insights</h3><p class=\"section-content\">Delve into predictive analytics with our seasoned experts to strategically plan your school\\'s staffing needs.</p></section><section class=\"mb-5\"><h3 class=\"section-header\">Interactive Planning Tools</h3><p class=\"section-content\">Engage with dynamic tools that bring clarity and efficiency to your staffing strategy.</p></section><section class=\"mb-5\"><h3 class=\"section-header\">Customised Strategies</h3><p class=\"section-content\">Craft tailored plans that ensure optimal educational outcomes and a supportive teaching environment.</p></section><section class=\"testimonials-section mb-5\"><h3 class=\"text-center mb-4\">What Our Customers Say</h3><p class=\"testimonial\">\"SchoolData is a one-stop solution for all our staffing needs, enhancing collaboration and efficiency in creating a supportive teaching environment.\" <span class=\"testimonial-author\">- Dr Janine Biggin, Principal</span></p><p class=\"testimonial\">\"SchoolData has revolutionised how we approach staffing, empowering us to navigate uncertainties confidently and efficiently.\" <span class=\"testimonial-author\">- Rose Connolly, Principal</span></p><p class=\"testimonial\">\"A game changer. SchoolData saves hours of manual effort, allowing us to focus more on educational matters.\" <span class=\"testimonial-author\">- Tanya Kolb, Director of Operations</span></p><p class=\"testimonial\">\"As someone new to the field, SchoolData has been instrumental in developing my skills, enhancing workflow efficiency, and offering outstanding support.\" <span class=\"testimonial-author\">- Brad Heeps, College Operations</span></p></section><section class=\"why-attend-section mb-5\"><h3 class=\"text-center mb-4\">Why Attend?</h3><p>This workshop is more than just a planning session; it\\'s a catalyst for strategic evolution in your school\\'s approach to staffing and operational efficiency.</p><p>Join us to embrace a future where data empowers educational excellence.</p><h3 class=\"text-center mb-4\">Details</h3><p>Open to up to four members of The School\\'s Executive team.</p><p class=\"important-info\">The cost is $4,500 (+ GST) for the day, inclusive of all the background work we will do on your data before and after the workshop.</p><p class=\"discount\">Schools who purchase and attend the Staffing Strategy Workshop automatically qualify for a 50% discount on their 2024 SchoolData site licence.</p></section><section class=\"text-center mb-5\"><a href=\"https://outlook.office365.com/owa/calendar/SchoolDataStaffingStrategyWorkshop@schooldata.com.au/bookings/\" class=\"btn btn-primary btn-rounded\" target=\"_blank\">Reserve Your Spot Today!</a><a href=\"/Welcome/contactus\" class=\"btn btn-outline-primary btn-rounded\" target=\"_blank\">Request a Phone Call or Demo</a></section><section class=\"more-details-section mb-5\"><h3 class=\"text-center mb-4\">More Details about the Staffing Strategy Workshop</h3><p><strong>Housekeeping: When and where are the sessions held?</strong></p><ul><li>SchoolData will run sessions each Tuesday and Thursday from February 6, 2024.</li><li>Workshops take place in our office at Suite 4.01 / 365 Little Collins St, Melbourne.</li><li>Sessions begin at 9am and conclude at 3pm. Lunch is provided.</li><li>Workshops are bookable during School Holidays.</li><li>Only one school may book per day, so hurry to ensure you don\\'t miss out on your preferred spot!</li></ul><p><strong>The Finer Details: What do we get?</strong></p><p><b>Expert Predictions: </b><br>Utilise our advanced algorithms to forecast your staffing needs. We\\'ll analyse your current data to predict next year\\'s class requirements with precision.</p><p><b>Customised Planner Grid: </b><br>Receive a tailored Planner Grid, offering a clear view of potential staffing scenarios. Strategically align your resources for maximum efficiency and effectiveness.</p><p><b>Staff Intentions Analysis: </b><br>Our unique Staff Intentions Form template delves into your team\\'s preferences, qualifications, and history, enabling informed decision-making for class allocations.</p><p><b>Student Pre-Selection Insights: </b><br>Gain early insights into student course selections, refining your staffing predictions for accuracy and adaptability.</p><p><b>In-Depth Timetable Reports: </b><br>Dive into comprehensive reports on class sizes, faculty allocation, and more, identifying opportunities for optimisation and growth.</p><p><b>Interactive Timetable Variations App: </b><br>Experiment with different scenarios using our app, understanding the financial and operational impact of each decision in real-time.</p><p><b>Personalised Consultation: </b><br>Benefit from a one-on-one session with our experts, receiving bespoke advice on cost-saving strategies and structural improvements.</p></section><section class=\"final-call-to-action mb-5\"><p>Join us at the Blueprint for Tomorrow: Staffing Strategy Workshop, where groundbreaking data insights meet strategic staffing solutions.</p><p>Transform your school\\'s future with expert-led predictions, tailored staffing strategies, and actionable plans.</p><p>This is more than just data analysis - it\\'s a roadmap to staffing excellence and educational success.</p></section><section class=\"call-to-action mb-5\"><a href=\"https://outlook.office365.com/owa/calendar/SchoolDataStaffingStrategyWorkshop@schooldata.com.au/bookings/\" class=\"btn btn-primary btn-rounded\" target=\"_blank\">Reserve Your Spot Today!</a><a href=\"/Welcome/contactus\" class=\"btn btn-outline-primary btn-rounded\" target=\"_blank\">Request a Phone Call or Demo</a></section></div></main>', '', '', function(opts) {\n        this.mixin('eventSystem');\n        this.listMode = true;\n        this.AccessAllowed = false;\n        this.slideIndex = 0;\n\n        this.on('mount', function () {\n\n        }.bind(this));\n\n        this.on('update', function () {\n\n        }.bind(this));\n\n});",
    "var riot = require('riot');\nmodule.exports = riot.tag2('sdsignup', '<ttcommonpopupgeneric></TTcommonPopupGeneric><input id=\"idPagename\" type=\"hidden\" value=\"Home\"><div class=\"SDSignUp\"><div id=\"idForgotPassword\" if=\"{!EmailExpired}\"><div class=\"center\"><div class=\"SignupEmailContainer\"><div class=\"LoginHeader\"> Set Your SchoolData Password </div><div class=\"LoginBody\"><div class=\"LoginBodyEmail\"><div class=\"LoginDetailsInstructions\"> Welcome to SchoolData {opts.fullname}! Please set your password below to get started. </div></div><div class=\"LoginBodyEmail\"><input autofocus=\"autofocus\" class=\"LoginDetailsInputBox\" id=\"idPassword1\" name=\"Password1\" maxlength=\"50\" placeholder=\"Your new Password\" type=\"password\" value=\"\"></div><div class=\"LoginBodyEmail\"><input autofocus=\"autofocus\" class=\"LoginDetailsInputBox\" id=\"idPassword2\" name=\"Password1\" maxlength=\"50\" placeholder=\"Re-type Your new password\" type=\"password\" value=\"\"></div><div class=\"LoginBodyLoginButton\"><input type=\"button\" value=\"Change Password\" id=\"btnlogin\" class=\"LoginGridDetailsSavebutton\" onclick=\"{ChangePassword}\"><input type=\"button\" value=\"Cancel\" id=\"btnlogin\" class=\"LoginGridDetailsCancelbutton\" onclick=\"{ExitThisScreen}\"></div></div></div></div></div><div id=\"idForgotPassword\" if=\"{EmailExpired}\"><div class=\"center\"><div class=\"SignupEmailContainer\"><div class=\"LoginHeader\"> Request Password Reset Email Expired </div><div class=\"LoginBody\"><div class=\"LoginBodyEmail\"><div class=\"LoginDetailsInstructions\"><span id=\"idLoginDetailsInstructionsSpan\"></span></div></div><div class=\"LoginBodyLoginButton\"><input type=\"button\" value=\"Back To SchoolData\" id=\"btnlogin\" class=\"LoginGridDetailsSavebutton\" onclick=\"{ExitThisScreen}\"></div></div></div></div></div></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n\n        this.reCAPTCHA_site_key = \"\";\n\n        this.on('mount', function () {\n\n            this.SignUpOtp = opts.otp;\n            this.EmailExpired = opts.emailexpired;\n            this.ServerURL = opts.serverurl;\n            this.OTPInvalid = (opts.otpinvalid == 'True');\n\n            var ResetMessage = \"The Schooldata Staff Access Request email has expired.<br>Please request a new Schooldata Staff Access Request email, by clicking on the following link.<p>\";\n            if (this.OTPInvalid) {\n                ResetMessage = \"The Schooldata Staff Access Request email key is invalid.<br>Please check your inbox for a newer Schooldata Staff Access Request email.<p>Alternatively, request a new Schooldata Staff Access Request email by clicking on the following link.<p>\";\n                this.EmailExpired = true;\n            }\n            ResetMessage += '<a href = \"' + this.ServerURL + '\">Send me a Schooldata Staff Access Request Email</a>';\n\n            this.idLoginDetailsInstructionsSpan.innerHTML = ResetMessage;\n\n            this.RequestVerificationToken = $(\"input[name='__RequestVerificationToken']\").val();\n\n            this.update();\n\n        }.bind(this));\n\n        this.idPassword2.addEventListener(\"keyup\", function (event) {\n\n            if (event.keyCode === 13) {\n\n                event.preventDefault();\n\n                this.loginButtonEnter();\n\n            }\n        }.bind(this));\n\n        this.ExitThisScreen = function()\n        {\n            window.location.href = \"/\";\n\n        }.bind(this)\n\n        this.ChangePassword = function()\n        {\n            if (this.idPassword1.value !== this.idPassword2.value) {\n                this.publish('TTShowCommonPopupGeneric', { Type: 'Alert', Header: 'Schooldata Alert', Message: \"Passwords do not Match.<br>Please ensure you type the same password into each field.\" });\n                return;\n            }\n\n            this.ChangePasswordProcess();\n        }.bind(this)\n\n        this.ChangePasswordProcess = function()\n        {\n\n            var RHSigninDTO = {\n                '__RequestVerificationToken': this.RequestVerificationToken,\n                'otp': this.SignUpOtp,\n                'CustPassword': this.idPassword1.value,\n                'Status': true,\n                'Message': \"\"\n            };\n\n            $.ajax({\n                type: \"POST\",\n                url: '/Welcome/SDSignupProcess',\n                data: RHSigninDTO,\n                cache: false,\n                async: true,\n                dataType: \"json\",\n\n                error: function (response) {\n                    this.publish('TTShowCommonPopupGeneric', { Type: 'Alert', Header: 'Schooldata Alert', Message: response.Message });\n                    this.update();\n\n                }.bind(this),\n\n                success: function (response) {\n                    if (response.Status == false) {\n                        this.publish('TTShowCommonPopupGeneric', { Type: 'Alert', Header: 'Schooldata Alert', Message: response.Message });\n                        return;\n                    }\n\n                    window.location.href = \"/SDMyloads/Portal\";\n\n                }.bind(this)\n            });\n        }.bind(this)\n\n});\n",
    "var riot = require('riot');\nmodule.exports = riot.tag2('ttlogin', '<ttcommonpopupgeneric></TTcommonPopupGeneric><input id=\"idPagename\" type=\"hidden\" value=\"Home\"><div class=\"ExcelTable2007LoginPage\" id=\"idLoginTable\" if=\"{LoginDialog}\"><div class=\"center\"><div class=\"container\"><div class=\"LoginHeader\"> SchoolData </div><div class=\"LoginBody\"><div class=\"LoginBodyEmail\"><input autofocus=\"autofocus\" class=\"LoginDetailsInputBox\" id=\"idLoginName\" name=\"CustEmail\" maxlength=\"100\" placeholder=\"Email\" type=\"text\"></div><div class=\"LoginBodyPassword\" if=\"{RequirePassword}\"><input autofocus=\"autofocus\" class=\"LoginDetailsInputBox\" id=\"idCustPassword\" name=\"CustPassword\" maxlength=\"100\" placeholder=\"Password\" type=\"password\"></div></div><div class=\"LoginPageForgotPassword\"><a href=\"#\" if=\"{RequirePassword}\" class=\"LoginDetailsForgotPasswordLink\" onclick=\"{ShowForgotPasswordDialog}\">Set Password/Forgot Password</a></div><div class=\"LoginBodyLoginButton\"><input type=\"button\" value=\"Login\" id=\"btnlogin\" class=\"LoginGridDetailsSavebutton\" onclick=\"{loginButtonEnter}\"></div></div></div></div><div class=\"ExcelTable2007LoginPage\" id=\"idLoginTable\" if=\"{SMSKeyDialog}\"><div class=\"center\"><div class=\"container\"><div class=\"SMSLoginHeader\"> A verification code has been sent to your mobile </div><div class=\"LoginBody\"><div class=\"LoginBodyEmail\"><input autofocus=\"autofocus\" class=\"LoginDetailsInputBox\" id=\"idSMSCode\" name=\"Code\" maxlength=\"100\" placeholder=\"Code\" type=\"text\"></div><div class=\"LoginBodyLoginButton\"><input type=\"button\" value=\"Authenticate\" id=\"btnlogin\" class=\"LoginGridDetailsSavebutton\" onclick=\"{SMSButtonEnter}\"><input type=\"button\" value=\"Back\" id=\"btnlogin2\" class=\"LoginGridDetailsCancelbutton\" onclick=\"{BackToLogin}\"></div></div></div></div></div><div class=\"ExcelTable2007LoginPage\" id=\"idForgotPassword\" if=\"{ForgotPasswordDialog}\"><div class=\"center\"><div class=\"SignupEmailContainer\"><div class=\"SMSLoginHeader\"> Schooldata Access Request </div><div class=\"LoginBody\"><div class=\"LoginBodyEmail\"><input autofocus=\"autofocus\" class=\"LoginDetailsInputBox\" id=\"idRequestPasswordEmail\" name=\"CustEmailRequest\" maxlength=\"100\" placeholder=\"Email\" type=\"text\" value=\"\"></div><div class=\"LoginBodyEmail\"><div class=\"PasswordResetInstructions\"> Password reset instructions will be sent to the provided email address. </div></div><div class=\"LoginBodyLoginButton\"><input type=\"button\" value=\"Request Password Reset\" id=\"btnlogin\" class=\"LoginGridDetailsSavebutton\" onclick=\"{SendPasswordResetRequestEmail}\"><input type=\"button\" value=\"Back\" id=\"btnlogin\" class=\"LoginGridDetailsCancelbutton\" onclick=\"{BackToLogin}\"></div></div></div></div></div><div class=\"ExcelTable2007LoginPage\" if=\"{LoginExpiredDialog}\"><div class=\"center\"><div class=\"SignupEmailContainer\"><div class=\"SMSLoginHeader\"> TimeTabler 7 Day Login Expired </div><div class=\"LoginBody\"><div class=\"LoginBodyExpired\"><div class=\"PasswordResetInstructions\"> Please click on the button below to log back into your SchoolData account. </div></div><div class=\"LoginBodyLoginButton\"><input type=\"button\" value=\"Back To Login Page\" id=\"btnlogin\" class=\"LoginGridDetailsSavebutton\" onclick=\"{BackToLogin}\"></div></div></div></div></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n\n        this.reCAPTCHA_site_key = \"\";\n        this.mainmenu = \"\";\n        this.KeyCode = \"\";\n        this.ClientIPAddress = null;\n        this.RequirePassword = false;\n        this.LoginDialog = true;\n        this.ForgotPasswordDialog = false;\n        this.SMSKeyDialog = false;\n        this.LoginExpired = false;\n\n        this.on('mount', function () {\n\n            this.RequestVerificationToken = $(\"input[name='__RequestVerificationToken']\").val();\n\n            if (typeof opts.mainmenu !== \"undefined\") {\n                if (opts.mainmenu == \"pwresetreq\") {\n                    this.ShowForgotPasswordDialog();\n                    return;\n                }\n                else if (opts.mainmenu == \"loginexpired\") {\n                    this.ShowLoginExpiredDialog();\n                    return;\n                }\n            }\n\n            window.addEventListener('keydown', this.ProcessKeyDownEvent);\n\n            this.reCAPTCHA_site_key = opts.googlecaptchasitekey;\n\n            this.ShowLoginDialog();\n\n            this.GetIPAddress();\n\n            this.update();\n\n        }.bind(this));\n\n        this.ProcessKeyDownEvent = function(event)\n        {\n\n            if (event.keyCode === 13 || event.keyCode == 9) {\n\n                event.preventDefault();\n\n                this.loginButtonEnter(event.keyCode);\n            }\n\n        }.bind(this)\n\n        this.GetIPAddress = function()\n        {\n            var URL = \"https://api.ipify.org?format=json\";\n\n            $.ajax\n                ({\n                    type: \"GET\",\n                    url: URL,\n                    success: function (data) {\n                        this.ClientIPAddress = data.ip;\n                    }.bind(this),\n                });\n\n        }.bind(this)\n\n        this.ShowLoginDialog = function()\n        {\n            this.LoginDialog = true;\n            this.SMSKeyDialog = false;\n            this.ForgotPasswordDialog = false;\n            this.LoginExpiredDialog = false;\n            this.update();\n        }.bind(this)\n\n        this.ShowSMSKeyDialog = function()\n        {\n            this.LoginDialog = false;\n            this.SMSKeyDialog = true;\n            this.ForgotPasswordDialog = false;\n            this.LoginExpiredDialog = false;\n            this.update();\n        }.bind(this)\n\n        this.ShowForgotPasswordDialog = function()\n        {\n            this.LoginDialog = false;\n            this.SMSKeyDialog = false;\n            this.ForgotPasswordDialog = true;\n            this.LoginExpiredDialog = false;\n            this.update();\n        }.bind(this)\n\n        this.ShowLoginExpiredDialog = function()\n        {\n            this.LoginDialog = false;\n            this.ForgotPasswordDialog = false;\n            this.SMSKeyDialog = false;\n            this.LoginExpiredDialog = true;\n            this.update();\n        }.bind(this)\n\n        this.BackToLogin = function()\n        {\n            window.location.href = '/Welcome/Login';\n        }.bind(this)\n\n        this.loginButtonEnter = function(KeyCode)\n        {\n            var SendKeyCode = \"13\";\n            if (typeof KeyCode != \"object\")\n                var SendKeyCode = KeyCode;\n\n            this.SMSCheck = false;\n            if (this.SMSKeyDialog)\n                this.SMSCheck = true;\n            this.loginButtonx(SendKeyCode);\n\n        }.bind(this)\n\n        this.SMSButtonEnter = function()\n        {\n            var SendKeyCode = \"13\";\n            this.loginButtonx(SendKeyCode);\n            this.SMSCheck = true;\n        }.bind(this)\n\n        this.loginButtonx = function (KeyCode) {\n            var EmailCheck = true;\n            if (this.RequirePassword)\n                EmailCheck = false;\n\n            this.KeyCode = KeyCode;\n            var RHSigninDTO = {\n                '__RequestVerificationToken': this.RequestVerificationToken,\n                'CustEmail': this.idLoginName.value,\n                'CustPassword': this.idCustPassword.value,\n                'SMSCheck': this.SMSCheck,\n                'SMSCode': this.idSMSCode.value,\n                'EmailCheck': EmailCheck,\n                'CustNumber': \"23\",\n                'ReCaptcha': this.RecapToken,\n                'Status': false,\n                'Message': \"\",\n                'KeyCode': KeyCode,\n                'ClientIP': this.ClientIPAddress\n            };\n            this.cachebreaker = Date.now();\n\n            $.ajax({\n                type: \"POST\",\n                url: '/Welcome/RHlogin' + '?cb=' + this.cachebreaker,\n                data: RHSigninDTO,\n                cache: false,\n                async: true,\n                dataType: \"json\",\n\n                error: function (response) {\n                    this.publish('TTShowCommonPopupGeneric', { Type: 'Alert', Header: 'Schooldata Alert', Message: response.Message });\n                    this.update();\n\n                }.bind(this),\n\n                success: function (response) {\n                    if (response.Status == false) {\n                        this.publish('TTShowCommonPopupGeneric', { Type: 'Alert', Header: 'Schooldata Alert', Message: response.Message });\n                        return;\n                    }\n\n                    if (typeof response.MoreData != \"undefined\") {\n                        if (response.MoreData != null) {\n                            if (response.MoreData.includes(\"~SMS~\")) {\n                                var CredsArr = response.MoreData.split(\":\");\n                                this.SMSEmail = CredsArr[1];\n                                this.idSMSCode.value = \"\";\n                                this.ShowSMSKeyDialog();\n                                this.SMSCheck = true;\n                                this.update();\n                                window.setTimeout(this.SetFocusInputTag, 100, \"SMSCode\");\n                                return;\n                            }\n                            if (response.MoreData.includes(\"~SSO~\")) {\n                                var CredsArr = response.MoreData.split(\":\");\n                                var HintEmail = CredsArr[1];\n                                var AzureUrl = \"https://login.microsoftonline.com/common/oauth2/v2.0/authorize?\";\n                                AzureUrl += \"client_id=\" + opts.clientid;\n                                AzureUrl += \"&redirect_uri=\" + opts.redirecturl;\n                                AzureUrl += \"&response_type=id_token\";\n                                AzureUrl += \"&scope=openid%20profile\";\n                                AzureUrl += \"&response_mode=form_post\";\n                                AzureUrl += \"&nonce=\" + opts.noonce;\n                                AzureUrl += \"&client_info=1\";\n                                AzureUrl += \"&x-client-brkrver=IDWeb.1.25.1.0\";\n                                AzureUrl += \"&login_hint=\" + HintEmail;\n                                AzureUrl += \"&state=\" + opts.state;\n                                AzureUrl += \"&x-client-SKU=ID_NETSTANDARD2_0\";\n                                AzureUrl += \"&x-client-ver=6.20.0.0\";\n\n                                window.location.href = AzureUrl;\n\n                                return;\n                            }\n\n                            this.RequirePassword = true;\n                            this.update();\n                            window.setTimeout(this.SetFocusInputTag, 100, \"Password\");\n                            return;\n                        }\n                    }\n\n                    window.location.href = \"/SDMyloads/Portal\";\n\n                }.bind(this)\n            });\n        }.bind(this)\n\n        this.SetFocusInputTag = function(TagName)\n        {\n            if (TagName == \"Password\") {\n                this.idCustPassword.focus();\n                return;\n            }\n            this.idSMSCode.focus();\n\n        }.bind(this)\n\n        this.SendPasswordResetRequestEmail = function(passedObject)\n        {\n\n            var PasswordRequestEmail = {\n                '__RequestVerificationToken': this.RequestVerificationToken,\n                'CustEmail': this.idRequestPasswordEmail.value,\n                'CustomerValidationCode': this.ValidationCode,\n                'Validate': this.Validate\n            };\n\n            $.ajax({\n                type: \"POST\",\n                url: '/Welcome/SendPasswordResetRequestEmail',\n                data: PasswordRequestEmail,\n                cache: false,\n                async: true,\n                dataType: \"json\",\n\n                error: function (response) {\n                    this.publish('TTShowCommonPopupGeneric', { Type: 'Alert', Header: 'Schooldata Alert', Message: response.Message });\n                    this.update();\n\n                }.bind(this),\n\n                success: function (response) {\n                    if (response.Status == false) {\n                        this.publish('TTShowCommonPopupGeneric', { Type: 'Alert', Header: 'Schooldata Alert', Message: response.Message });\n                        return;\n                    }\n\n                    this.publish('TTShowCommonPopupGeneric', { Type: 'Notify', Header: 'Schooldata Notification', Message: response.Message, Callback: this.CallBackToHomePage });\n\n                }.bind(this)\n            });\n        }.bind(this)\n\n        this.CallBackToHomePage = function () {\n            window.location.href = \"/SDMyloads/Portal\";\n        }.bind(this)\n\n});\n",
    "var riot = require('riot');\nmodule.exports = riot.tag2('sdcontactus', '<ttcommonpopupgeneric></TTcommonPopupGeneric><div class=\"ContactPageHeader\">Contact Us</div><div class=\"SDContactUs\"><div if=\"{ContactUs}\" class=\"LeftInfoContainer\"><div class=\"ContactHeader\">Contact Information</div><div class=\"ContactDescription\"><div> Whether you have questions about our services, need technical support, or want to explore customised solutions for your school\\'s scheduling challenges, our team is here to assist you. </div><div class=\"SDContactInfo\"><div class=\"SDContact\"><i class=\"fas fa-map-marker-alt\"></i><div>Suite 4.03 / 365 Little Collins St. Melbourne, VIC, 3000</div></div><div class=\"SDContact\"><i class=\"fas fa-envelope\"></i><div>info@schooldata.com.au</div></div><div class=\"SDContact\"><i class=\"fas fa-phone-alt\"></i><div>+61 438 117 730</div></div></div></div></div><div if=\"{!ContactUs}\" class=\"LeftInfoContainer\"><div class=\"ContactHeader\">Request a Phone Call</div><div class=\"SwitchFormContainer\" onclick=\"{ChangeToEmailPage}\"><div class=\"SwitchTextContainer\"><div class=\"SwitchFormHeader\">General inquiry?</div><div class=\"RedirectLinkText\">Fill out our general inquiry form</div></div><i class=\"fas fa-chevron-right\" style=\"font-size: 13px;\"></i></div><div class=\"ContactDescription\"> We\\'ll give you a call at a time that is convenient to you. We\\'ll ask you if you would like us to:<br><span style=\"font-weight: 600\">a)</span> Give you a demonstration of the site via Teams or Zoom; or<br><span style=\"font-weight: 600\">b)</span> Come to your school to give you a face-to-face demonstration;<p></p> If you like the site, or if you\\'re curious to see it in action with your data in it, we\\'ll offer you a free (and obligation-free) one day training Seminar. <br> If you send us a copy of your current Timetable, we\\'ll import it for you before the Seminar, so that the site is ready to use at the end of the day!<p></p> Then we\\'ll give you some time to decide whether you want to commit to a one-year licence.<p></p><span style=\"font-weight: 600\">Things to consider:</span><br> During the Seminar, we\\'ll help you create a customised Staff Intentions Survey.<br> Once you\\'ve signed up, you can send this survey to your staff to find out their plans for 2022.<p></p> If you sign up before the end of July, you\\'re an early adopter! This means that, for the next two years:<br><ul><li>You will only pay $3000 (plus GST) per year.</li><li>You will have a direct line to us, so you can make suggestions or request assistance and we will get working on your query immediately..</li><li>You will have immediate and unrestricted access to every new feature we release, at no extra cost.</li></ul> Yes, early adopters might find the odd bug in the site, but if you alert us to these, we\\'ll fix them immediately.<br> We\\'re absolutely certain that, once you see some of the features we\\'re adding over the next year or two, you\\'ll want to be part of this journey from the outset. </div></div><div class=\"SDHomeMenuMainContainer\"><div class=\"SDMenuGroup\"><div class=\"SDPhaseStepsContainer\"><div class=\"SDPhaseStepsHeadingText\"> YOUR DETAILS </div><div class=\"SDMenuPhaseItem\"><div class=\"MenuItemBody\"><input type=\"text\" value=\"\" id=\"idName\" class=\"FormContactUsElement\" placeholder=\"Full name (required)\"></div></div><div class=\"SDMenuPhaseItem\"><div class=\"MenuItemBody\"><input type=\"text\" value=\"\" id=\"idEmail\" class=\"FormContactUsElement\" placeholder=\"Email (required)\"></div></div><div if=\"{!ContactUs}\" class=\"SDMenuPhaseItem\"><div class=\"MenuItemBody\"><input type=\"text\" value=\"\" id=\"idSchoolName\" class=\"FormContactUsElement\" placeholder=\"School Name\"></div></div><div if=\"{!ContactUs}\" class=\"SDMenuPhaseItem\"><div class=\"MenuItemBody\"><input type=\"text\" value=\"\" id=\"idSchoolPhoneNumber\" class=\"FormContactUsElement\" placeholder=\"School Phone Number\"></div></div><div class=\"MandatoryNote\"><span style=\"font-size:14px\">*</span> Mandatory fields </div></div><div if=\"{!ContactUs}\" class=\"SDPhaseStepsContainer\"><div class=\"SDPhaseStepsHeadingText\"> SCHOOL CONTACT <span style=\"font-weight: 400; font-size: 12px\">(Who should we ask to speak to, if different from above?)</span></div><div class=\"SDMenuPhaseItem\"><div class=\"MenuItemBody\"><input type=\"text\" value=\"\" id=\"idSCName\" class=\"FormContactUsElement\" placeholder=\"Name\"></div></div><div class=\"SDMenuPhaseItem\"><div class=\"MenuItemBody\"><input type=\"text\" value=\"\" id=\"idSCEmail\" class=\"FormContactUsElement\" placeholder=\"Email\"></div></div><div if=\"{!ContactUs}\" class=\"SDMenuPhaseItem\"><div class=\"MenuItemBody\"><input type=\"text\" value=\"\" id=\"idSchoolSCRole\" class=\"FormContactUsElement\" placeholder=\"Role\"></div></div><div class=\"SDMenuPhaseItem\"><div class=\"MenuItemBody\"><div class=\"rowData\"><textarea rows=\"1\" cols=\"50\" id=\"idTimeToCall\" placeholder=\"Preferred contact times\" class=\"FormContactUsTextAreaEdit\" onchange=\"{TextAreaChanged}\"></textarea></div></div></div></div><div if=\"{!ContactUs}\" class=\"SDPhaseStepsContainer\"><div class=\"SDPhaseStepsHeadingText\"> MORE DETAILS </div><div class=\"SDMenuPhaseItem2\"><div class=\"MenuItemHeaderTTPack\"><div class=\"MenuItemHeaderText\" id=\"SDServices/Setup:empstatus\" onclick=\"{LinkClicked}\"> Current Timetabling Package </div></div><div class=\"MenuItemBody\"><select id=\"idTimeTableSolutionType\" class=\"MoreDetailsInputBox\" required onchange=\"{OptionSelected}\"><option value=\"\" disabled selected hidden style=\"color:yellow\">Select your TimeTabling Package</option><option value=\"Timetabling Solutions\">Timetabling Solutions</option><option value=\"Edval\">Edval</option><option value=\"Other\">Other</option></select></div></div><div if=\"{OtherTimeTableSolution}\" class=\"SDMenuPhaseItem2\"><div class=\"MenuItemHeaderTTPack\"><div class=\"MenuItemHeaderText\" id=\"SDServices/Setup:stafflevels\" onclick=\"{LinkClicked}\"> Please specify... </div></div><div class=\"MenuItemBody\"><input type=\"text\" value=\"\" id=\"idOtherTimeTableSolution\" class=\"MoreDetailsInputBox\" placeholder=\"Current Timetable Package\"></div></div></div><div if=\"{ContactUs}\" class=\"SDPhaseStepsContainer\"><div class=\"SDPhaseStepsHeadingText\"> YOUR ENQUIRY </div><div class=\"SDMenuPhaseItem SDMenuPhaseItem3\"><div class=\"MenuItemHeader\"><div class=\"MenuItemHeaderText\" id=\"SDServices/Setup:empstatus\" onclick=\"{LinkClicked}\"> Query Type </div></div><div class=\"MenuItemBody\"><select id=\"idQueryType\" class=\"FormContactUsDropDownBoxEdit\" required onchange=\"{OptionSelected}\"><option value=\"\" disabled selected hidden style=\"color:yellow\">Select your query type</option><option value=\"I\\'d like to request a phonecall\">I\\'d like to request a phonecall</option><option value=\"Id Like to Request a Demo\">I\\'d like to request a Demo</option><option value=\"I have a question\">I have a question</option><option value=\"I need some technical support\">I need some technical support</option><option value=\"Something isnt working properly\">Something isn\\'t working properly</option><option value=\"Id Like to give some feedback\">I\\'d like to give some feedback</option></select></div></div><div class=\"SDMenuPhaseItem SDMenuPhaseItem3\"><div class=\"MenuItemHeader\"><div class=\"MenuItemHeaderText\" id=\"SDServices/Setup:stafflevels\" onclick=\"{LinkClicked}\"> Addtional Details </div></div><div class=\"MenuItemBody\"><div class=\"rowData\"><textarea rows=\"10\" cols=\"50\" id=\"idEmailBody\" placeholder=\"Message\" class=\"FormContactUsTextAreaEdit2\" onchange=\"{TextAreaChanged}\"></textarea></div></div></div></div><div class=\"SubmitContainer\"><div class=\"rowData\"><input type=\"submit\" value=\"Send Request\" id=\"btnSave2\" class=\"{ContactUs ? \\'ContactUsButton-Savebutton2\\' : \\'ContactUsButton-Savebutton\\'}\" onclick=\"{SendContactUsEmail}\"></div></div></div></div></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n\n        this.hostAllowed = false;\n        this.pageName = \"About Us\";\n        this.idValidationCode = \"\";\n        this.reCAPTCHA_site_key = \"\";\n        this.FormType = \"contactus\";\n        this.ContactUs = true;\n        this.MenuItemId = \"idNL_ContactUs\";\n        this.OtherTimeTableSolution = false;\n\n        this.on('mount', function () {\n            if (opts.allowed == \"False\") {\n                this.forbidden = \" - Forbidden\";\n            }\n\n            this.FormType = opts.formtype;\n            if (this.FormType == \"moreinformation\") {\n                this.ContactUs = false;\n                this.MenuItemId = \"idNL_MoreInformationUs\";\n            }\n            this.publish('HighlightMenuBarItem', { MenuItemId: this.MenuItemId });\n            this.RequestVerificationToken = $(\"input[name='__RequestVerificationToken']\").val();\n            this.OtherTimeTableSolution = false;\n\n            this.update();\n\n        }.bind(this))\n\n        this.OptionSelected = function(OptionObj)\n        {\n            var SelectValue = OptionObj.currentTarget.value;\n            this.OtherTimeTableSolution = false;\n\n            if (!this.ContactUs) {\n                if (SelectValue == \"Other\")\n                    this.OtherTimeTableSolution = true;\n\n            }\n            this.idQueryType.className = \"FormContactUsTextAreaEdit2\";\n        }.bind(this)\n\n        this.TextAreaChanged = function()\n        {\n            this.idEmailBody.className = \"FormContactUsTextAreaEdit2\";\n\n        }.bind(this)\n\n        this.SendContactUsEmail = function(passedObject)\n        {\n\n            var ErrorMessage1 = \"\";\n            var ErrorMessage2 = \"\";\n            if (this.idEmail.value == \"\") {\n                ErrorMessage1 = \"Email Address<br>\";\n            }\n\n            if (this.idName.value == \"\") {\n                ErrorMessage2 = \"Name<br>\";\n            }\n\n            if (ErrorMessage1 != \"\" || ErrorMessage2 != \"\") {\n\n                var MainErrorMessage = \"The following field(s) have not been filled out...<br>\";\n                var MainErrorMessage = MainErrorMessage + ErrorMessage1 + ErrorMessage2;\n                var MainErrorMessage = MainErrorMessage + \"Please ensure these fields are accurate and complete to enable our staff to contact you.\"\n\n                this.publish('TTShowCommonPopupGeneric', { Type: 'Alert', Header: 'Contact Us - Missing information', Message: MainErrorMessage });\n\n                return;\n            }\n\n            var EmailSubject = \"Email: \" + this.idEmail.value + \"- Name: \" + this.idName.value;\n            var BodyData = \"Customer Email: \" + this.idEmail.value + \"\\rCustomer Name: \" + this.idName.value + \"\\r\";\n\n            if (!this.ContactUs) {\n\n                BodyData = BodyData + \"SchoolName: \" + this.idSchoolName.value + \"\\r\";\n                EmailSubject = \"MI Form - SchoolName: \" + this.idSchoolName.value + \" - \" + EmailSubject;\n\n                BodyData = BodyData + \"School Contact Name: \" + this.idSCName.value + \"\\r\";\n                BodyData = BodyData + \"School Contact Email: \" + this.idSCEmail.value + \"\\r\";\n                BodyData = BodyData + \"School Contact Role: \" + this.idSchoolSCRole.value + \"\\r\";\n                BodyData = BodyData + \"Time To Call: \" + this.idTimeToCall.value + \"\\r\";\n                BodyData = BodyData + \"TimeTableSolutionType: \" + this.idTimeTableSolutionType.value + \"\\r\";\n                if (this.idTimeTableSolutionType.value == \"Other\")\n                    BodyData = BodyData + \"OtherTimeTableSolution: \" + this.idOtherTimeTableSolution.value + \"\\r\";\n\n            }\n            else {\n                EmailSubject = \"CU Form - \" + EmailSubject;\n\n                BodyData = BodyData + \"Query Type: \" + this.idQueryType.value + \"\\r\";\n                BodyData = BodyData + \"Query Details: \" + this.idEmailBody.value + \"\\r\";\n\n            }\n\n            var cleanedEmailBody = BodyData.replace(/<[^>]*>?/gm, '');\n\n            var EmailDetails = {\n                '__RequestVerificationToken': this.RequestVerificationToken,\n                FromName: \"\",\n                FromAddress: \"\",\n                Subject: EmailSubject,\n                MailBody: cleanedEmailBody,\n                ReCaptcha: this.RecapToken\n            };\n\n            this.SendCustomerEmail(null, EmailDetails);\n        }.bind(this)\n\n        this.SendCustomerEmail = function(CustEmailItem, CustomerEmailMessageObj)\n        {\n            this.EmailerReturnedMessage = \"\";\n            $.ajax({\n                type: \"POST\",\n                url: '/Welcome/ContactUsEmail',\n\n                data: CustomerEmailMessageObj,\n                cache: false,\n\n                async: true,\n                dataType: \"json\",\n\n                error: function (response) {\n                    this.publish('TTShowCommonPopupGeneric', { Type: 'Alert', Header: 'Contact Us - problem', Message: response.Message});\n\n                }.bind(this),\n\n                success: function (response) {\n                    this.publish('TTShowCommonPopupGeneric', { Type: 'Notify', Header: 'Contact Us', Message: response.Message, Callback: this.ReturnToMainMenu });\n\n                }.bind(this)\n            });\n        }.bind(this)\n\n        this.ReturnToMainMenu = function()\n        {\n            window.location = '/';\n        }.bind(this)\n\n        this.ChangeToEmailPage = function()\n        {\n            window.location = '/Welcome/contactus';\n        }.bind(this)\n\n        this.ChangeToCallPage = function()\n        {\n            window.location = '/Welcome/MoreInformation';\n        }.bind(this)\n\n        this.on('update', function () {\n\n        }.bind(this));\n});\n\n",
    "var riot = require('riot');\nmodule.exports = riot.tag2('sdmedia', '<ttcommonpopupgeneric></TTcommonPopupGeneric><div class=\"SDMedia\"><div class=\"SDMediaMainContainer\"><div class=\"SDMenuGroup\" if=\"{Article1}\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-search SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> Are you considering a Timetable Review? </div></div><div class=\"SDPhaseStepsContainer\"><div class=\"SDHomePageArticleContainer\"><div class=\"ArticleBasicContentHeaderH2\">Why we\\'re passionate about Timetable Reviews</div><div class=\"ArticleBasicContent\"> We want to make teaching a more attractive job. We think everyone could benefit from experiencing school as a teacher, not just as a learner. If we get the best and brightest back through the school gates as adults, we\\'re sure that many will be hooked. <br><br> We want to see an improvement in educational outcomes for our children. <br><br> We want to save schools money through optimisation measures, so they can allocate resources to building projects or programs that have a positive impact on student outcomes. </div><div class=\"ArticleBasicContentHeaderH2\">Why should we consider a Timetable Review?</div><div class=\"ArticleBasicContent\"> It\\'s no secret that two years of remote learning have taken their toll on teachers. Couple the alarmingly high teacher attrition rates with new Enterprise Bargaining Agreements, and the profession finds itself without enough teachers to go around. Those who are left are wondering whether life as a teacher is about to get even harder. <br><br> But such adversity brings opportunity. Schools are conducting Timetable Reviews as a matter of urgency to see what structural changes they can make to cope and then thrive in a changing educational landscape. <br><br> There are several reasons that schools are making a review of their timetable structure a priority this year. Broadly speaking, schools either want or need to conduct a review. <br><br> Schools who want to conduct a review are in an envious position. They are often looking to innovate, sometimes they are keen to explore ways to increase student choice, build more co-curricular activities into the timetable, or they may have a building plan on the horizon. If this is the case, we advise our clients to move slowly and carefully. Absorb as much literature as you can and ensure that any changes you\\'re planning on implementing have high buy-in from your staff. <br><br> Change for the sake of innovation can be met with cynicism, especially amongst more experienced teachers. For this reason, these changes should be backed by research, and they should be designed to last. <br><br> Schools who need to conduct a review, on the other hand, often need to move quickly in order to solve a \"problem\". These problems can include, but certainly aren\\'t limited to rooming inefficiencies, rising staffing costs and dwindling availability, timetable inflexibility that makes it hard to alter loads, or a growing need to cater to an increasing number of part time staff. <br><br> These kinds of changes can be expedited with the right advice, and they usually have high buy-in, so long as the wider community can see that the intentions are to fix a problem. </div><div class=\"ArticleBasicContentHeaderH2\">What do you get with a SchoolData Timetable Review?</div><div class=\"ArticleBasicContentHeaderH3\">The SchoolData Timetable Review is an eight-stage process:</div><div class=\"ArticleBasicContent\"> 1. Upon signing up for the review, the school sends SchoolData up to five Timetabling Solutions Timetable Development Files (tdf or tdx files). We conduct a Timetable Health Check on each of the files to gain a clear understanding of the health of the school\\'s timetable. <br><br> 2. Next, on \"Day 1\" of the review (suggested timeframe: 1-2 weeks after sign-up) we present* to the school Executive to explain the varying reasons our clients want to conduct a Timetable Review and showcase different timetable structures. This will help the school Executive understand the potential benefits of a review and give them an idea of the different options available. <br><br> 3. At the conclusion of the presentation, we engage in a discussion with the school Executive to understand the school\\'s specific needs and goals. We ask a series of questions to find out why they want to conduct a review, what works in their school, what doesn\\'t work, what they\\'re hoping to achieve through the review process, and what they hope the new structure looks or feels like. <br><br> 4. We then present the findings from the Timetable Health Checks and make some suggestions based on our professional judgement of what the health checks have told us. <br><br> 5. On \"Day 2\" of the review (suggested timeframe: 1-2 weeks after \"Day 1\") we conduct Focus Groups with key stakeholders in the school community. (The school retains control of selecting participants and scheduling appointments. The consultant will attend* a maximum of five one-hour sessions on the one day) <br><br> 6. SchoolData will create for the school a visualisation of the themes raised in the Focus Group sessions for Executive consideration. <br><br> 7. On \"Day 3\" of the review (suggested timeframe: 1-2 weeks after \"Day 2\" to allow for consideration of the themes raised by the school\\'s stakeholders) we present* to the school Executive a report containing our findings and a suggested timetable structure. <br><br> 8. This package includes six hours of Mock Structure Development. That is, the school may request a mock-up of a timetable structure complete with their selected features, conditions, and parameters. </div><div class=\"ArticleBasicContentHeaderH2\">How we operate</div><div class=\"ArticleBasicContent\"> * As part of the standard package, all presentations, meetings, and focus groups are conducted on Microsoft Teams. </div><div class=\"ArticleBasicContentHeaderH3\">Why is this?</div><div class=\"ArticleBasicContent\"> We can run transcription software through Teams to ensure that no important points or themes are missed. This means that our consultant can provide their undivided attention to the conversation, not note-taking. </div><div class=\"ArticleBasicContentHeaderH3\">Can we request face-to-face meetings?</div><div class=\"ArticleBasicContent\"> Yes, if you would prefer that... <ul><li> the initial presentation (Day 1) </li><li> the Focus Groups sessions (Day 2) </li><li> and/or the presentation of findings (Day 3) </li></ul> are conducted face-to-face, this will be billed at an additional $1,000 per \"day\". </div><div class=\"ArticleBasicContentHeaderH3\">Price:</div><div class=\"ArticleBasicContent\"> $10,000 (plus GST) for non-subscribers to SchoolData <br><br> $8,000 (plus GST) for existing SchoolData customers </div><img src=\"\\\\res\\\\img\\\\SchoolData\\\\MRSchoolDataBusCard.png\" class=\"BusCard\" alt=\"Business Card\"></div></div></div><div class=\"SDMenuGroup\" if=\"{Article2}\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-search SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> 2022: The year of the Timetable Review? </div></div><div class=\"SDPhaseStepsContainer\"><div class=\"SDHomePageArticleContainer\"><p>Whenever I find myself chatting to school leaders about timetabling, I invariably hear myself rattle off my timetabling philosophy: \"The Timetabler should be - in equal parts - a servant to the students and to the College Executive\". On each occasion, I hope that it resonates with my audience rather than sounding like a rehearsed slogan. In essence, this statement is a summary of my Terms and Conditions, and it is at the core of my professional raison d\\'etre. It places the students, without whom the school would not exist, at the centre of the conversation about timetabling priorities. It implies that there will likely be a tug of war between the needs and wants of the students - the customers who are paying for a service - and the priorities of those charged with the responsibility of providing that service in and efficient and sustainable way, so that they can continue to provide that service long into the future.</p><p>It might sound as though these conflicting priorities are irreconcilable. There is a commonly held belief that students\\' chances of thriving will increase if they are given a vast array of options and small classes (although effect size data is less equivocal about this). A passing conversation with almost any School Principal will reveal, on the other hand, that pressure from College Boards and Business Managers to keep classes full and expenditure down is an almost universal phenomenon. Were perfect competition in a theoretical marketplace to exist, the extent to which schools had this balance right would be directly reflected in their enrolments. In actuality, the micro and macro factors that influence enrolments trends are so many and varied that individual variables become, perhaps conveniently, very difficult to assess in isolation. I am often left frustrated after conversations with schools who feel as though their rising enrolments (by virtue of being in a growth corridor) must indicate that their timetabling practices and processes are sound, despite several students missing out on preferred subjects. It is equally disappointing to see enrolments dropping (sometimes due to the decisions and actions of members of the organisation about half a century ago) at schools who exercise best practice timetabling processes. The good news is that schools appear to be beginning to have data informed conversations about the effect, if not effect size just yet, of their timetabling processes on student outcomes and staff satisfaction. I am confident that, before long, the data will be omnipresent and irrefutable, and schools who want to bury their heads in the sand will be few and far between.</p><p>So, what does this mean for Timetablers? Are they expected to internally reconcile these priorities or should they - uncritically and unquestioningly - follow the instructions given by their employer? And should the College Principal who doesn\\'t have a background in Combinatorial Optimisation give carte blanche responsibility to the Timetabler to deliver the best possible timetable? To those outside the timetabling office, it can appear that Timetablers are not unlike Wicketkeepers. There are no other reference points within the team to gauge the difficulty of their role or their performance from year to year. A Timetabler can work for days on a grid that is mathematically unfeasible, or they could spin the solver and hit the solution at their first go. This is where data and defensibility must enter the conversation. </p><p>Rather than attempting to convince readers of the importance of data informed practices in assessing timetabling efficacy, I\\'m going to get a little more practical. Below you will find a Quick Guide to starting a Timetabling Review, in the form of frequently asked questions. It is suggested that school leaders would read this guide before the first review meeting is held. The list is intended to help school leaders consolidate their own understanding of (if and) why a review is necessary, what issue(s) it hopes to address, and exactly where to start when addressing these issues. Each answer below is imbued with an oft-unwritten expression of the importance of data and data analysis as central tenets of successful decision making (ie. Decisions that lead to programs that achieve the intended outcomes). There will be times when a particular approach, program or process will be questioned, often vehemently, and often by key stakeholders. At these times, as I have intimated above, it is essential that these processes are defensible.</p><p>Before diving into the list, it is vitally important to distinguish between a Curriculum Review and Timetabling Review. It remains the ambit of the curricula leaders to make decisions regarding content that needs to be covered, skills that need to be learned, the ideal duration of each unit, and even the ideal length of individual periods. Timetablers and a Timetabling Review can and should, however, explicate the implications of these curricular decisions. Yes, Curricula Reviews and Timetabling Reviews are inextricably linked and are, ideally, phases in the cycle that will need to be visited and revisited throughout the journey to establishing the best timetabling structure for your school.</p><p>So, let\\'s get stuck in by asking a broad, but possibly challenging question. Why do you want to conduct a review of your timetable and timetabling practices?</p><p>Don\\'t worry if this seems too big a question to answer, or even if you\\'re unsure of the exact reason at this early stage of the journey. I\\'ve compiled a list of (hopefully) thought-provoking questions for those embarking on a Timetabling Review to reflect upon, and some brief descriptions of first steps towards addressing them.</p><div class=\"ArticleQuestion\"><b><i>Question: We need to save money. We\\'re pretty sure we\\'re overstaffed. Should we reduce our overall staff FTE?</i></b></div><div class=\"ArticleButtonContainer\"><button id=\"idQuestion_1\" class=\"ArticleAnswerButton\" onclick=\"{ShowSolution}\">Solution...</button></div><div id=\"Answer1\" class=\"ArticleAnswerContainer\"><p>The first thing we need to determine here is how overstaffed are you? The reason I ask this is that there appears to be a sweet spot, at which point the sum of the costs of salaries for staff excess and the cost of Casual Replacement Teachers is minimised. Early data tells us that schools who employ somewhere between two periods per period on the timetable (so, 120 periods per cycle if you have a 60 period cycle) and 1.5 periods per full time teacher (so, 150 periods per cycle for large schools with 100 full time equivalent staff) should be able to reduce their CRT expenditure to emergency-use-only levels. There\\'s more to it, of course. On one hand, the model outlined above ensures that students almost always have a teacher who knows how things work at the school and who knows the students. On the other hand, the cost of this model can blow out say, for example, during a global pandemic, where periods of remote learning mean that replacement teachers aren\\'t required for weeks or months on end.</p><p>From a timetabling perspective, reducing staffing to the bare level required can bring with it some challenges. Creating loads can be more time consuming and you\\'ll need at least a little flexibility in your timetable to ensure you\\'re not just staffing classes with whoever fits. If you\\'re still creating loads in Google sheets, Excel or on paper, it\\'s time to automate. The SchoolData Grid Planner allows you to staff your classes systematically and loads are created automatically and instantly before your eyes. Best of all, when staff a class, the site tells you who wants to teach it, who has taught it before, and who is qualified to teach it, so you\\'re staffing in a consultative fashion without having to leave your desk.</p></div><div class=\"ArticleQuestion\"><b><i>Question: If we have to hire a teacher during / late in the year, it seems as though we don\\'t have the flexibility to change loads to suit the incoming teacher. Can we change this?</i></b></div><div class=\"ArticleButtonContainer\"><button id=\"idQuestion_2\" class=\"ArticleAnswerButton\" onclick=\"{ShowSolution}\">Solution...</button></div><div id=\"Answer2\" class=\"ArticleAnswerContainer\"><p>Your school\\'s blocking structures will determine whether you can increase flexibility in the timetable. Most schools run a blocked timetable at the higher years, a predominantly homeroom based (or single class) structure at the lower years, and a combination of the two at the middle years. Blocking is necessary at the higher years because students need to be able to access the whole range of available subjects, no matter which homeroom they reside in. Homeroom or single class structures allow for nearly endless flexibility, but they come at a cost. Classes need to be grouped together at certain points in the timetable if students are to come out for electives, Numeracy/Literacy support classes, or anything that might have a different class capacity to mainstream homeroom-based classes. As a very rough guide, if your junior or middle years curriculum structure doesn\\'t slot perfectly into your senior structure (very few do) and you\\'re blocking any more than about 25-30% of your junior or middle school classes, then you will likely find it difficult to create a timetable that has any flexibility or scope for load alterations when, say, a teacher resigns mid-year.</p></div><div class=\"ArticleQuestion\"><b><i>Question: Is there a way we can make our staff feel more consulted / a way to embed processes that give us more time for staff consultation?</i></b></div><div class=\"ArticleButtonContainer\"><button id=\"idQuestion_3\" class=\"ArticleAnswerButton\" onclick=\"{ShowSolution}\">Solution...</button></div><div id=\"Answer3\" class=\"ArticleAnswerContainer\"><p>If I\\'m asked the primary reason I started SchoolData, my first response is that I think educators in general are overworked. I come from a long line of teachers and I\\'ve seen and heard stories that confirm for me that teaching is a far cry from the vocation it once was. Two years before my father retired, he was a Deputy Principal and Timetabler who earned $38,000 for the year, despite his nearly 40 years of experience. This wasn\\'t the 1970s; it was 1998. The industry has undergone a period of professionalisation since then, but it is arguable that, even though pay is approaching triple what it was about 25 years ago, the demands upon teachers have increased exponentially. I have friends who were lawyers in a past life and have moved to teaching in recent years. Ask anyone who has made this switch. They\\'ll tell you that the exhaustion of being always on is like nothing they experienced in their past profession.</p><p>How is this linked to me starting a data company (and, more importantly, to staff consultation!)? Well, it\\'s all about process. Specifically, firm, consistent, embedded processes save an extraordinary amount of time. A staff intentions survey that automatically collates results and then presents these results when you need them - say, when you\\'re trying to staff an extra Accounting class that you didn\\'t foresee, or you\\'re attempting to come up with a succession plan for Specialist Maths - can improve staffing outcomes and also afford you the time to have the conversations with teachers that you always planned to have. The kind of person who has a passion for education is generally a people person, so these conversations that you might have deemed luxuries and are the first things to drop off the to-do list when things get busy, can do wonders for staff morale. In summary, an intuitive, data-driven staff planner that is informed by real data can give you the time to really talk to your staff.</p></div><div class=\"ArticleQuestion\"><b><i>Question: We have a lot of part time staff. Is there any way we can accommodate them without jeopardising the integrity of the timetable?</i></b></div><div class=\"ArticleButtonContainer\"><button id=\"idQuestion_4\" class=\"ArticleAnswerButton\" onclick=\"{ShowSolution}\">Solution...</button></div><div id=\"Answer4\" class=\"ArticleAnswerContainer\"><p>This is the $64,000 question, especially since overtures have been made to suggest that there might be a push in coming years to entitle part time teachers to only work the number of days that is commensurate with their FTE. Not everyone agrees with me, but I\\'m a big fan of job sharing. There is no need to wedge a class\\'s periods into a handful of days, thus allowing for continuity of teacher-student contact. Sure, it might not always be the same teacher that the students are seeing, but that too might not be such a bad thing. I\\'ve often found myself wondering whether having two teachers for the same class might even have its advantages, in terms of gaining different perspectives and, dare I say it, diversifying risk. But remember, data and organisation is my area, not pedagogy, so don\\'t take my suggestion here as Gospel.</p><p>If job sharing isn\\'t for you, we really only have two other weapons in our arsenal (unless we decide to let our part time staff hold the structure of the timetable to ransom, or worse, we generally refuse requests from teachers to move to part time). One option is to allocate these teachers primarily unblocked or single class subjects. This is far from ideal if our gun Chemistry teacher is planning on a gradual return from parental leave, for example, and our unblocked classes all run in the junior years. The last option isn\\'t quite upon us yet. We talk in more detail a bit further on about Grid Optimisation. Here I\\'m referring to Timetable Optimisation. I\\'m not going to say much more about it here, because we\\'re only scratching the surface of this impending revolution, but keep checking back in with us. We\\'re pretty confident the next year or two will bring enormous leaps in this area.</p><p>I suppose there is another option involving remote learning. I mention this only as a conversation starter. I wouldn\\'t dare go into any more depth here, given the mere mention of this is enough to send teachers into a cold sweat.</p></div><div class=\"ArticleQuestion\"><b><i>Question: We need to know whether our period length is efficient. Is there any way we can analyse this (and maybe save some money in the process)?</i></b></div><div class=\"ArticleButtonContainer\"><button id=\"idQuestion_5\" class=\"ArticleAnswerButton\" onclick=\"{ShowSolution}\">Solution...</button></div><div id=\"Answer5\" class=\"ArticleAnswerContainer\"><p>As I\\'ve mentioned above, the ideal period length for students to learn best needs to be determined by the school\\'s curricula leaders. Once a general range has been determined, it\\'s a good idea to have a Timetabler model some options to ensure the selected period length makes financial sense.</p><p>From a purely financial standpoint, the good news here is that it\\'s pretty easy - at least, on paper - to make some small changes to period lengths that will have an enormous effect on your staffing budget. I\\'ll be blunt: A few minutes per period is worth hundreds of thousands of dollars per year. The bad news is that someone in the past may have already figured this out and you might be running the most efficient period length possible. Also, there\\'s no hiding from the fact that the key to reducing staffing expenditure is ensuring teachers are teaching the maximum number of minutes per cycle, as stipulated in the Agreement*. Your school doesn\\'t have to subscribe to this economic principle, but it\\'s certainly a good idea to be aware of the implications of the decision you\\'ve made, regarding period lengths.</p><p>Moreover, it must be stated that there will likely be a cost, albeit more political or climatic than economic, in tweaking the period length. Your school will need to determine whether the long term financial gain is worth the short term pain.</p><p><i>* In Victorian Government Schools, this maximum number of face-to-face teaching minutes per cycle is set to change in 2024, so schools will need to be proactive in reviewing their structure by about June 2022.</i></p></div><div class=\"ArticleQuestion\"><b><i>Question: Our students don\\'t always get their preferences. Is there anything we can do about this?</i></b></div><div class=\"ArticleButtonContainer\"><button id=\"idQuestion_6\" class=\"ArticleAnswerButton\" onclick=\"{ShowSolution}\">Solution...</button></div><div id=\"Answer6\" class=\"ArticleAnswerContainer\"><p>Unequivocally, yes. Since I\\'ve started consulting to several schools, it has always struck me as utterly staggering that a customer (student) can miss out on a subject that they might be desperate to study, perhaps even one they need for a future pathway, and the school\\'s response is \"it didn\\'t work\". That\\'s it? In the third decade of the 21st century, we can\\'t provide students with any more of an explanation than this? At SchoolData, we\\'re working around the clock to change this. When we generate Student Grids, we don\\'t just create one per year level. If the grid isn\\'t optimal (that is, if anyone misses a preference), we\\'ll a) keep working on it until we either have an optimal grid or can demonstrate why it cannot (mathematically) yield a clash-free grid; b) tell you exactly how many classes you would need to run to get a clash-free grid; c) tell you how many students will miss a preference if we add no classes to the grid; and d) find the sweet spot - the point at which the school is satisfied that a compromise exists between these latter two scenarios.</p></div><div class=\"ArticleQuestion\"><b><i>Question: Our students seem to change subjects a lot. Is there a way to reduce subject changes?</i></b></div><div class=\"ArticleButtonContainer\"><button id=\"idQuestion_7\" class=\"ArticleAnswerButton\" onclick=\"{ShowSolution}\">Solution...</button></div><div id=\"Answer7\" class=\"ArticleAnswerContainer\"><p>One of my clients identified this issue a few years ago, and to their credit, they couched it in more positive terms. They said \"we want to ensure our students are selecting the right subjects. Subjects that they enjoy first and foremost, subjects they\\'re good at - because they\\'re more likely to enjoy them - and finally, subjects that they need for a chosen future pathway\". I love this subject selection hierarchy, for a few reasons. Firstly, it recognises that students are most likely to succeed in subjects they enjoy. Secondly, it addresses the myth that an identified career pathway is the key criterion when selecting subjects. Essentially, if you think you want to be an Engineer but you hate Maths, you probably don\\'t want to be an Engineer. Finally, this hierarchy gives no weight whatsoever to the subjects my parents think I should do. This might be a tad unfair, as parents are objectively well placed to know the strengths, weaknesses and interests of their children. But in my experience, parents can be either too proud, too emotionally attached to the notion of their children pursuing a particular path, or (this will be controversial) too keen to relive their youth vicariously through their child to make decisions that are in their child\\'s best interests.</p><p>So, how do we ensure students are selecting the right subjects for them, and then how do we make sure they don\\'t change their mind every few days about these subjects? Once again, it\\'s all about process. Our solution for the school in the example above was to build them a Student Recommendations Portal. In about July, students in Years 10-12 complete a survey on which they list every subject that they think they might want to select on their Subject Selection Form. Their subject teachers (or Learning Area Leaders) get notifications to instruct them to enter the portal and provide a recommendation for these students (by simply ticking a box and, if they desire, providing a comment or some conditions that must be met to gain full approval). Students are notified of the outcomes and might be given a period of time to satisfy some conditions. Only once a student has been granted approval will they be eligible to select that subject on their Subject Selection Form.</p><p>To create conditions whereby students aren\\'t then changing their mind about their subjects every few days, this school has very rigid, but transparent, subject reselection processes. Students are given a period of about one week at the end of the year and one week in the middle of the year during which time they may submit a Subject Reselection Form. Students and teachers know that class lists should not change* outside of these reselection periods. These two processes have led to a 70% reduction in the number or reselection forms processed at this school over the past seven years.</p><p><i>* There are strict conditions that must be met in order for a subject change to be granted outside of these windows.</i></p></div><div class=\"ArticleQuestion\"><b><i>Question: We\\'d like to be able to analyse trends across learning areas ahead of time, so we know who we\\'ll need to hire before it\\'s too late. Is this possible?</i></b></div><div class=\"ArticleButtonContainer\"><button id=\"idQuestion_8\" class=\"ArticleAnswerButton\" onclick=\"{ShowSolution}\">Solution...</button></div><div id=\"Answer8\" class=\"ArticleAnswerContainer\"><p>Data analysis is a passion of mine, and I\\'m especially keen to explore the predictive power of each school\\'s past timetable data. For this reason, the SchoolData team have begun work on a Grid Planner that uses subject specific trends, enrolment data and attrition rates, and preselection forms to identify longitudinal subject and learning area specific trends. This will be part of the standard SchoolData site at some stage in 2022, so there will, very soon, be a way to predict who you\\'re going to need to hire as early as about July.</p><p>The site also houses pages and pages of tables and reports, so you can have subject, learning area, year level or just about any other kind of trend data at the click of a button.</p></div><div class=\"ArticleQuestion\"><b><i>Question: Our timetable takes a few weeks (maybe months?) to build. Is there a way this could be done faster?</i></b></div><div class=\"ArticleButtonContainer\"><button id=\"idQuestion_9\" class=\"ArticleAnswerButton\" onclick=\"{ShowSolution}\">Solution...</button></div><div id=\"Answer9\" class=\"ArticleAnswerContainer\"><p>Well, it\\'s funny you should ask! The answer to this question depends upon your answers to the questions above; specifically the extent to which you - as a school leadership team - are prepared to build flexibility into your timetabling structure. Generally speaking though, schools who are using the SchoolData Planner Grids (amongst other features) are noticing that their load data is ready and timetable construction can start weeks (sometimes months) earlier than past years. And then there\\'s Timetable Optimisation, but I\\'m not going to get tricked into revealing that secret just yet...</p></div></div><img src=\"\\\\res\\\\img\\\\SchoolData\\\\MRSchoolDataBusCard.png\" class=\"BusCard\" alt=\"Business Card\"></div></div><div class=\"SDMenuGroup\" if=\"{Article3}\"><div class=\"SDMenuHeadingContainer\"><div class=\"SDMenuHeadingIcon\"><i class=\"fa fa-search SchoolDataIconHomePage\"></i></div><div class=\"SDMenuHeadingText\"> What does the new Agreement mean for your school?! </div></div><div class=\"SDPhaseStepsContainer\"><div class=\"SDHomePageArticleContainer\"><p>In case you\\'ve been isolating for more than two years and don\\'t have any children at home, let me tell you that teachers are tired. In lots of ways, the silver lining on the dark cloud of stress, fatigue, and (further) increased expectation that has hovered over the teaching community since late 2019, is that the pandemic has accelerated the urgency with which teacher workload needs to be systematically addressed. Who would\\'ve thought that, in order to secure the health and wellbeing of future generations, we\\'d need to value teachers more and pay scientists more? Teaching wasn\\'t always like this, so what went wrong?.</p><p>When I started teaching, in 2007, I was pleasantly surprised by the salary I was set to receive as a graduate. I only had a couple of reference points, but they seemed reliable. My father had maintained that, less than a decade earlier, he had been a Deputy Principal at a sizeable Catholic Secondary School on a salary of less than $40,000. Average Teacher Salary data published by the ABS might contradict this claim somewhat, but the discrepancy still arguably falls into the splitting hairs category. Then there were my close school friends, three of whom had recently started at Law Firms and were earning less than me. In the second week of my career, I was at the beach at 4:30pm, while they were still proving their worth to the Firms\\' Partners via a timesheet that showed that they\\'d only left work long after I\\'d gone to bed..</p><p>The following year, Victorian Schools closed their gates in protest over stalled agreement negotiations. Since that time, teacher wages have been the focus of enterprise agreements. Any teacher who has been in the game since the 90s will tell you that we\\'ve done very well on that front. Wage growth for the average Australian teacher has outstripped inflation at a rate of two to one. But from such a low base, so it should have. Here\\'s where the reference points become increasingly relevant: By 2010 those same lawyer friends were too embarrassed to tell me their annual salaries.</p><p>In reality, the trade off we\\'ve agreed to since 2008 has been the professionalisation of working conditions, expectations and demands on teachers, in exchange for a professional salary. The problem is that the former draws upon the corporate sector as a reference point, while the latter draws upon teaching in the 70s, 80s and 90s as the low tide point..</p><p>The new agreement is historic in that it recognises that the expectations placed on teachers have been a bit over the top, to put it mildly. Commentators from within are divided, with one camp adamant that the symbolism and practical implications of this agreement are cause for celebration, while others bemoan the quite alarming deceleration in wage growth at a time when inflation and the cost of living are trending in a very different direction. The implication that wages are good enough now might fly with teachers who aren\\'t trying to convince the bank they deserve a chance to live in considerable debt, but they almost certainly won\\'t with those who are tossing up between a Dip Ed and a Juris Doctor. When we consider that there is already a growing teacher shortage and education seems set to benefit the least from the shift in corporate attitudes to working from home arrangements, the diminishing appeal of teaching as a career might be considerably more than a footnote on history. .</p><p>It speaks volumes about the character of the type of person who enters educational leadership (and education in general, for that matter) that support for this agreement from schools has been almost universal. This is despite the undeniable fact that the financial cost to schools could be monstrous. Take the simple example of the Secondary School that employs the equivalent of 100 full time teachers. If each one of these teachers can teach three fewer hours\\' worth of classes per fortnight (from 2024) from 40 down to 37 hours, this represents a shortfall of 300 hours that need to be staffed from beyond the school\\'s current pool of teachers. It will take 8.1 new teachers (300/37) to fill this void, at a cost of approximately $1 million per year. Try not to think about where these teachers will come from...</p><p>You might be surprised by the rest of this sentence, but I think you\\'re going to be fine. Well, if you take a few deep breaths and keep reading, you should be fine. There are things you can do to ensure the ongoing health of your school, without passing on the cost to families. Each of these falls into the general category of organisational optimisation, but not all can easily be achieved with the tools at your disposal. Every school will place varying degrees of importance on these strategies, and financial considerations certainly won\\'t be the only factor at play when attempting to reach a consensus about which strategies to pursue. For these reasons, I\\'ll be a little scant with detail hereafter. Importantly, if you\\'d like any more information about any of these strategies or the implementation thereof, please reach out to me. </p><p>The first is Period Length Optimisation. Schools are often staggered by the hidden annual cost of inefficient period lengths. Yes, an approach that seeks to absorb all of the costs associated with this landmark agreement could be seen to be operating outside the spirit of the agreement, and that must be considered. Nonetheless, if there is wastage in the current model, the cost of doing nothing is set to multiply in the next couple of years.. </p><p>As an extension of tidying up period length inefficiencies, it will be necessary to revisit and possibly Optimise Staffing and Loads. This not only involves reviewing your full-time load calculations, but also future proofing your staffing drives by ensuring you have an accurate gauge on your staffing levels across learning areas and year levels. Planning in this area can save you some serious headaches in the next few months, let alone next few years.. </p><p>This might seem, on the surface, to be a little unrelated, but taking the time to Review your Staff Consultation Processes can help you to achieve the goal of optimising your staffing. It\\'s not quite as simple as having a Staff Intentions Form, but this is a great start. Often your staff will tell you what they intend on doing next year and beyond, but the degree to which they\\'ll open up about this is dependent upon the degree to which they feel as though the process seeks to assist them on their professional (and personal) journey. So it\\'s important to ask the right questions on the form, sure, but it\\'s more important to follow up with your staff to find out how they\\'re actually feeling towards their job and their future prospects.</p><p>Now, the big one. If you haven\\'t taken steps to Optimise your Grids and Timetable, then there\\'s a huge chance that these are inefficient. Worse still, there is a chance that your Grids don\\'t allow you to provide your customers (students) with their greatest chance of accessing their preferred subjects and, subsequently, their preferred secondary and tertiary pathways. Perhaps your timetable blocks were created years ago and their rationale hasn\\'t been reviewed in a while. These blocks come at a cost, so it might be worth having a look at them to ensure they are still worth the expenditure.</p><p>Finally, have you been considering implementing a New Timetable Structure? It might be worth doing a little due diligence to ensure the cost of this innovation isn\\'t going to blow out when the new agreement takes effect. At very least, it can\\'t hurt to check!</p></div><img src=\"\\\\res\\\\img\\\\SchoolData\\\\MRSchoolDataBusCard.png\" class=\"BusCard\" alt=\"Business Card\"></div></div></div></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n\n        this.on('mount', function () {\n            this.AccessGranted = true;\n            this.Article1 = false;\n            this.Article2 = true;\n            this.Article3 = true;\n            if (opts.mainmenu) {\n                switch (opts.mainmenu) {\n                    case \"Article1\":\n                        this.Article1 = true;\n                        this.Article2 = false;\n                        this.Article3 = false;\n                        break;\n                    case \"Article2\":\n                        this.Article1 = false;\n                        this.Article2 = true;\n                        this.Article3 = false;\n                        break;\n                    case \"Article3\":\n                        this.Article1 = false;\n                        this.Article2 = false;\n                        this.Article3 = true;\n                        break;\n                }\n            }\n            this.update();\n            this.HideAllAnswers();\n        }.bind(this))\n\n        this.ShowSolution = function(PayLoad) {\n\n            this.HideAllAnswers();\n\n            var QuestionButtonId = PayLoad.currentTarget.id;\n            var QuestionTarget = QuestionButtonId.split(\"_\");\n            var QuestionNumber = QuestionTarget[1];\n\n            var AnswerKey = \"Answer\" + QuestionNumber;\n            var Answer = this[AnswerKey];\n\n            if (Answer.style.display === \"none\") {\n                Answer.style.display = \"block\";\n            } else {\n                Answer.style.display = \"none\";\n            }\n        }.bind(this)\n\n        this.HideAllAnswers = function() {\n\n            var AnswerList = $(\".ArticleAnswerContainer\");\n            for (var i = 0; i < AnswerList.length; i++) {\n                AnswerList[i].style.display = \"none\";\n            }\n\n        }.bind(this)\n\n        this.ReturnToMainMenu = function()\n        {\n            window.location = '/';\n        }.bind(this)\n\n        this.on('update', function () {\n\n        }.bind(this));\n});\n\n",
    "var riot = require('riot');\nmodule.exports = riot.tag2('manualsectionone', '<div class=\"toc-button\"><i class=\"fas fa-list\"></i><span>Contents</span></div><div class=\"toc-container\"><div class=\"toc-header\"><i class=\"fas fa-book\"></i><h3>Table of Contents</h3></div><div class=\"toc-content\"><a href=\"#Section1\" class=\"toc-section-link\">Section 1: Signing Up and Onboarding</a><ul class=\"toc-list\"><li class=\"toc-item\"><a href=\"#Section1_1\">Our Streamlined Onboarding Process</a></li><li class=\"toc-item\"><a href=\"#Section1_2\">Finalising Your Setup</a></li><li class=\"toc-item\"><a href=\"#Section1_3\">Getting Started with School Data</a></li></ul></div></div><div class=\"manual-container\"><div class=\"manual-content\"><div class=\"manual-header\"><h1 id=\"Section1\" class=\"manual-title\">School Data Manual</h1></div><div class=\"section-intro\"><div class=\"section-badge\">Section 1</div><h2>Signing Up and Onboarding</h2><p id=\"Section1_1\" class=\"intro-text\"> Welcome to School Data! This section guides you through the initial steps to set up your School Data account and begin the journey towards streamlined resource planning and management. By following these steps, you\\'ll unlock the full potential of School Data\\'s predictive analytics and planning tools, tailored specifically for your school\\'s needs. </p></div><div class=\"section-container\"><div class=\"subsection\"><div class=\"subsection-header\"><div class=\"subsection-number\">1.1</div><h3>Our Streamlined Onboarding Process</h3></div><p class=\"manual-text\"> Once your school has decided to proceed with School Data, our team immediately initiates a simple and efficient onboarding process designed to get you up and running as quickly as possible. </p><div class=\"step-container\"><div class=\"step-header\"><div class=\"step-icon\"><i class=\"fas fa-envelope\"></i></div><h4>Step 1: Welcome Email and Initial Documentation</h4></div><div class=\"step-content\"><p class=\"manual-text\"> You\\'ll receive a Welcome email containing: </p><ul class=\"feature-list\"><li><i class=\"fas fa-check-circle\"></i><span>A link to an onboarding survey (takes approximately 10 minutes to complete)</span></li><li><i class=\"fas fa-check-circle\"></i><span>An Onboarding Import Template (Excel file)</span></li></ul><p class=\"manual-text\"> The onboarding survey collects essential information about your school, which we use to: </p><ul class=\"feature-list\"><li><i class=\"fas fa-check-circle\"></i><span>Generate your licence agreement</span></li><li><i class=\"fas fa-check-circle\"></i><span>Set up your School Data environment</span></li><li><i class=\"fas fa-check-circle\"></i><span>Load key contacts into the system</span></li></ul></div></div><div class=\"step-container\"><div class=\"step-header\"><div class=\"step-icon\"><i class=\"fas fa-file-excel\"></i></div><h4>Step 2: Complete the Onboarding Import Template</h4></div><div class=\"step-content\"><p class=\"manual-text\"> The Onboarding Import Template includes five core data tables that form the foundation of your School Data experience: </p><div class=\"data-tables\"><div class=\"data-table-item\"><div class=\"data-icon\"><i class=\"fas fa-user-tie\"></i></div><div class=\"data-name\">Staff</div><div class=\"data-desc\">Your teaching and administrative personnel</div></div><div class=\"data-table-item\"><div class=\"data-icon\"><i class=\"fas fa-book\"></i></div><div class=\"data-name\">Subjects</div><div class=\"data-desc\">Your school\\'s curriculum offerings</div></div><div class=\"data-table-item\"><div class=\"data-icon\"><i class=\"fas fa-tasks\"></i></div><div class=\"data-name\">Allowances</div><div class=\"data-desc\">Staff allocations and workload considerations</div></div><div class=\"data-table-item\"><div class=\"data-icon\"><i class=\"fas fa-door-open\"></i></div><div class=\"data-name\">Rooms</div><div class=\"data-desc\">Your school\\'s physical spaces</div></div><div class=\"data-table-item\"><div class=\"data-icon\"><i class=\"fas fa-user-graduate\"></i></div><div class=\"data-name\">Students</div><div class=\"data-desc\">Your current student population</div></div></div><div class=\"info-box\"><div class=\"info-icon\"><i class=\"fas fa-video\"></i></div><div class=\"info-content\"><p>We provide a comprehensive instructional video (approximately 7 minutes) to guide you through populating these tables efficiently. Once completed, simply email the files back to <a href=\"mailto:info@SchoolData.com.au\" class=\"email-link\">info@SchoolData.com.au</a>.</p></div></div></div></div></div><div class=\"subsection\"><div class=\"subsection-header\"><div id=\"Section1_2\" class=\"subsection-number\">1.2</div><h3>Finalising Your Setup</h3></div><div class=\"card-container\"><div class=\"setup-card\"><div class=\"card-icon\"><i class=\"fas fa-file-contract\"></i></div><h4>Contract and Invoice</h4><p>After you\\'ve completed the onboarding survey, we\\'ll send you:</p><ul class=\"feature-list\"><li><i class=\"fas fa-check-circle\"></i><span>Your customised licence agreement</span></li><li><i class=\"fas fa-check-circle\"></i><span>An invoice (payable within 21 days for Year 1, and 14 days for subsequent years)</span></li></ul></div><div class=\"setup-card\"><div class=\"card-icon\"><i class=\"fas fa-sign-in-alt\"></i></div><h4>Activating Single Sign-On (SSO)</h4><p>While waiting for contract finalisation, we recommend activating Single Sign-On for seamless secure access:</p><ol class=\"numbered-list\"><li>Navigate to <a href=\"https://www.SchoolData.com.au\" class=\"text-link\">www.SchoolData.com.au</a></li><li>Click \\'Login\\' at the top right</li><li>Enter the administrator email address</li><li>Click the \\'trust on behalf\\' button to authorise the School Data domain</li></ol></div></div><div class=\"note-container\" id=\"Section1_3\"><div class=\"note-header\"><i class=\"fas fa-exclamation-circle\"></i><h4>Important Notes about SSO:</h4></div><ul class=\"note-list\"><li>Users must be added to the Master Staff and Students table to log in</li><li>Access permissions are managed granularly, so users will only see content relevant to their role</li></ul></div></div><div class=\"subsection\"><div class=\"subsection-header\"><div class=\"subsection-number\">1.3</div><h3>Getting Started with School Data</h3></div><p class=\"manual-text\"> Once your SSO is activated and your data is imported, you\\'ll have immediate access to School Data\\'s comprehensive suite of tools, including: </p><div class=\"tools-container\"><div class=\"tool-card\"><div class=\"tool-icon\"><i class=\"fas fa-table\"></i></div><div class=\"tool-content\"><h4>Timetable Report</h4><p>A detailed analysis of your school\\'s resource allocation</p></div></div><div class=\"tool-card\"><div class=\"tool-icon\"><i class=\"fas fa-random\"></i></div><div class=\"tool-content\"><h4>Timetable Variations App</h4><p>For simulating and visualising the impact of various staffing scenarios</p></div></div><div class=\"tool-card\"><div class=\"tool-icon\"><i class=\"fas fa-calendar-alt\"></i></div><div class=\"tool-content\"><h4>Exam Timetabling App</h4><p>For creating clash-free, student-friendly exam schedules</p></div></div></div><div class=\"conclusion\"><p id=\"Section2\" class=\"manual-text\"> Our team regularly releases instructional videos and conducts webinars to help you maximise the value of School Data throughout the academic year. We focus on highlighting the most relevant features for each phase of the school planning cycle. </p><div class=\"contact-box\"><p>If you have questions or need assistance at any point, please don\\'t hesitate to contact us at <a href=\"mailto:info@SchoolData.com.au\" class=\"email-link\">info@SchoolData.com.au</a>.</p></div><p class=\"welcome-text\"> Welcome to the School Data community! </p></div></div></div></div></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n\n        this.on('mount', function () {\n        }.bind(this));\n});",
    "var riot = require('riot');\nmodule.exports = riot.tag2('corebundlecalculator', '<div class=\"page-title\">Core Bundle</div><div class=\"floating-price-container\"><div class=\"price-accumulator floating-price\"> Estimated Annual Cost: $<span id=\"totalPrice\">0</span></div></div><div if=\"{showModal}\" class=\"modal\"><div class=\"modal-dialog\"><div class=\"modal-content\"><div class=\"modal-header\"><h5 class=\"modal-title\">Request a Demo</h5><button type=\"button\" class=\"close\" onclick=\"{closeModal}\">&times;</button></div><div class=\"modal-body\"><form id=\"demoForm\" submit prevent=\"submitForm\"><div class=\"form-group\"><label for=\"contactName\">Contact Name *</label><input type=\"text\" class=\"modal-form\" id=\"contactName\" required></div><div class=\"form-group\"><label for=\"schoolName\">School Name *</label><input type=\"text\" class=\"modal-form\" id=\"schoolName\" required></div><div class=\"form-group\"><label for=\"emailAddress\">Email Address *</label><input class=\"modal-form\" id=\"emailAddress\" required type=\"email\"></div><div class=\"form-group\"><label for=\"phoneNumber\">Phone Number *</label><input type=\"tel\" class=\"modal-form\" id=\"phoneNumber\" required></div><div class=\"form-group\"><label for=\"commentsquestions\">Comments and Questions</label><textarea style=\"height: 100px;\" class=\"modal-form\" id=\"commentsquestions\" rows=\"3\"></textarea></div></form><div class=\"selected-items-section\"><h4 class=\"section-title\">Selected Items</h4><div class=\"table-container\"><table class=\"items-table\"><thead><tr><th class=\"item-column\">Item</th><th class=\"price-column\">Estimated $</th></tr></thead><tbody><tr each=\"{item in selectedItems}\"><td class=\"item-name\">{item.name}</td><td class=\"item-price\">{item.name === \\'Discount\\' ? \\'-\\' : \\'\\'}${Math.abs(item.price).toLocaleString(\\'en-US\\', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}</td></tr><tr class=\"total-row\"><td><strong>Total</strong></td><td class=\"total-price\"><strong>${totalPrice.toLocaleString(\\'en-US\\', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}</strong></td></tr></tbody></table></div></div></div><div class=\"modal-footer\"><button type=\"button\" class=\"btn-secondary\" onclick=\"{closeModal}\">Close</button><button type=\"submit\" class=\"btn-primary\" onclick=\"{submitForm}\">Submit</button></div></div></div></div><div class=\"layout-wrapper\"><div class=\"Container\"><section class=\"info-section\"><h3>Overview</h3><p> Purchase an annual Core Bundle licence for $2,495 + $1 per student then additional Apps start at as little as $295 per year. Please view our <a href=\"../../../../res/pdf/SchoolData Catalogue 2025-26.pdf\" target=\"_blank\">Product Suite</a> for more information about individual applications. </p><h3>Benefits</h3><ul class=\"benefits-list\"><li>Flexible app selection</li><li>Only pay for what you use</li><li>Customisable solutions</li></ul><p>Choose the Core Bundle to control your School Data package.</p></section><section class=\"info-section\"><div class=\"student-container\"><div><div class=\"form-outline\"><label class=\"form-label\" for=\"secondaryStudents\">Number of Secondary Students (Years 7 - 12)</label><input id=\"secondaryStudents\" class=\"form-control narrow-input\" oninput=\"calculatePrices()\" value=\"1000\" type=\"number\"></div></div><div><div class=\"form-outline\"><label class=\"form-label\" for=\"primaryStudents\">Number of Primary Students (Prep - 6)</label><input id=\"primaryStudents\" class=\"form-control narrow-input\" oninput=\"calculatePrices()\" type=\"number\"></div></div></div><div style=\"color: #404040\"><i class=\"fas fa-info-circle\" style=\"margin-right: 4px\"></i> Numbers are validated on file sync (during onboarding) and re-assessed yearly.</div></section><section><div class=\"section-header\"><div><span>Matrix Planning</span><div class=\"subsection-header\">Core Bundle required for all additional selections</div></div></div><div class=\"section-content\"><div class=\"card card-custom\"><div class=\"card-body\"><table class=\"table mt-4\" style=\"width: 99%; border-collapse: collapse;\"><thead></thead><tbody><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"matrixCore\" onclick=\"if(checkStudents(this)) updateMatrixPlanning()\"></div></td><td class=\"product-text\">Core Bundle: Staff Intentions Forms, Planner Grids & Loads</td><td id=\"priceMatrixCore\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"matrixSandpit\" onclick=\"if(checkStudents(this)) updateMatrixPlanning()\"></div></td><td class=\"product-text\">Planner Grid Sandpit<div class=\"product-subtext\">Unlimited grids</div></td><td id=\"priceMatrixSandpit\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"matrixAutostaffer\" onclick=\"if(checkStudents(this)) updateMatrixPlanning()\"></div></td><td class=\"product-text\">Planner Grid Autostaffer</td><td id=\"priceMatrixAutostaffer\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"matrixPredictor\" onclick=\"if(checkStudents(this)) updateMatrixPlanning()\"></div></td><td class=\"product-text\">Predictor Module</td><td id=\"priceMatrixPredictor\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"matrixApprovals\" onclick=\"if(checkStudents(this)) updateMatrixPlanning()\"></div></td><td class=\"product-text\">Approvals Portal<div class=\"product-subtext\">With pre-selection forms</div></td><td id=\"priceMatrixApprovals\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"matrixSubjectChange\" onclick=\"if(checkStudents(this)) updateMatrixPlanning()\"></div></td><td class=\"product-text\">Subject Change Forms</td><td id=\"priceMatrixSubjectChange\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"matrixSubjectSelection\" onclick=\"if(checkStudents(this)) updateMatrixPlanning()\"></div></td><td class=\"product-text\">Subject Selection Forms<div class=\"product-subtext\">With selection rules</div></td><td id=\"priceMatrixSubjectSelection\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"matrixReports\" onclick=\"if(checkStudents(this)) updateMatrixPlanning()\"></div></td><td class=\"product-text\">Reports</td><td id=\"priceMatrixReports\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"matrixOnlineStudent\" onclick=\"if(checkStudents(this)) updateMatrixPlanning()\"></div></td><td class=\"product-text\">Online Student Module</td><td id=\"priceMatrixOnlineStudent\">-</td></tr></tbody></table></div></div></div></section><section><div class=\"section-header\"><span>State of Play Reports</span></div><div class=\"section-content\"><div class=\"card card-custom\"><div class=\"card-body\"><table class=\"table mt-4\" style=\"width: 99%; border-collapse: collapse;\"><tbody><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"product1\" onclick=\"if(checkStudents(this)) {handleDependencies(this); updateTotal();}\"></div></td><td class=\"product-text\">Timetable Report</td><td id=\"price1\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"product2\" onclick=\"if(checkStudents(this)) {handleDependencies(this); updateTotal();}\"></div></td><td class=\"product-text\">Comparative Report <div class=\"product-subtext\">Only available with Timetable Report</div></td><td id=\"price2\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"product2b\" onclick=\"if(checkStudents(this)) {handleDependencies(this); updateTotal();}\"></div></td><td class=\"product-text\">Trend Report <div class=\"product-subtext\">Only available with Timetable Report</div></td><td id=\"price2b\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"product3\" onclick=\"if(checkStudents(this)) {handleDependencies(this); updateTotal();}\"></div></td><td class=\"product-text\">Timetable Variations</td><td id=\"price3\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"product4\" onclick=\"if(checkStudents(this)) {handleDependencies(this); updateTotal();}\"></div></td><td class=\"product-text\">Curriculum Planner <div class=\"product-subtext\">Only available with Timetable Variations</div></td><td id=\"price4\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"product5\" onclick=\"if(checkStudents(this)) updateTotal()\"></div></td><td class=\"product-text\">State of Play consultancy <div class=\"product-subtext\"> x5 hours</div></td><td id=\"price5\">-</td></tr></tbody></table></div></div></div></section><section><div class=\"section-header\"><span>Exam Planning</span></div><div class=\"section-content\"><div class=\"card card-custom\"><div class=\"card-body\"><table class=\"table mt-4\" style=\"width: 99%; border-collapse: collapse;\"><tbody><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"examTimetable\" onclick=\"if(checkStudents(this)) {handleDependencies(this); updateTotal();}\"></div></td><td class=\"product-text\">Exam Timetable Generator</td><td id=\"priceExamTimetable\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"examRoster\" onclick=\"if(checkStudents(this)) {handleDependencies(this); updateTotal();}\"></div></td><td class=\"product-text\">Exam Roster Generator</td><td id=\"priceExamRoster\">-</td></tr></tbody></table></div></div></div></section><section><div class=\"section-header\"><span>Custom Work and Consultancy</span></div><div class=\"section-content\"><div class=\"card card-custom\"><div class=\"card-body\"><table class=\"table mt-4\" style=\"width: 99%; border-collapse: collapse;\"><tbody><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"customWork1\" onclick=\"if(checkStudents(this)) updateCustomWork()\"></div></td><td class=\"product-text\"><select id=\"hours1\" class=\"form-select\" onchange=\"updateCustomWork()\"><option value=\"0\">Hours</option><option value=\"1\">1</option><option value=\"2\">2</option><option value=\"3\">3</option><option value=\"4\">4</option><option value=\"5\">5</option><option value=\"6\">6</option><option value=\"7\">7</option><option value=\"8\">8</option><option value=\"9\">9</option><option value=\"10\">10</option></select> Student Grid Fix <span class=\"product-subtext\">@ $350/hr</span></td><td id=\"priceCustomWork1\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"customWork2\" onclick=\"if(checkStudents(this)) updateCustomWork()\"></div></td><td class=\"product-text\"><select id=\"hours2\" class=\"form-select\" onchange=\"updateCustomWork()\"><option value=\"0\">Hours</option><option value=\"5\">5</option><option value=\"10\">10</option></select> Support, Consultancy, Construction <span class=\"product-subtext\">@ $350/hr</span></td><td id=\"priceCustomWork2\">-</td></tr></tbody></table></div></div></div></section><section><div class=\"section-header\"><span>Matrix Projects</span></div><div class=\"section-content\"><div class=\"card bottom-cards\"><div class=\"matrix-container card-body\"><table class=\"table mt-4\" style=\"width: 99%; border-collapse: collapse;\"><tbody><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"matrixTimetabling\" onclick=\"if(checkStudents(this)) {updateMatrixProjects();}\"></div></td><td style=\"font-weight: bold;\"> Matrix Timetabling: NextGen Timetabling is almost here! <i class=\"fas fa-question-circle\" data-mdb-toggle=\"tooltip\" title=\"Why contribute? Find out what\\'s possible when one of Australia\\'s best Timetablers teams up with an AI PhD. Get involved in the project to ensure we factor your school\\'s landscape into version 1\"></i></td><td id=\"priceMatrixTimetabling\">-</td></tr><tr><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"matrixAnalytics\" onclick=\"if(checkStudents(this)) {updateMatrixProjects();}\"></div></td><td style=\"font-weight: bold;\"> Matrix Schoolwide Analytics Project <i class=\"fas fa-question-circle\" data-mdb-toggle=\"tooltip\" title=\"Why contribute? Imagine a whiteboard where you could write down any aspect of your school\\'s data you\\'d like analysed, and a team of data scientists and coders would build it for you\"></i></td><td id=\"priceMatrixAnalytics\">-</td></tr><tr><td></td><td style=\"font-weight: bold;\"> Discount <i class=\"fas fa-question-circle\" data-mdb-toggle=\"tooltip\" title=\"Every $1000 you spend on other School Data products gets you a 5% discount on your Matrix Projects invoice\"></i></td><td id=\"priceMatrixDiscount\">-</td></tr></tbody></table></div></div></div></section><section><div class=\"section-header\"><span>Future Products</span></div><div class=\"section-content\"><div class=\"card bottom-cards\"><div class=\"future-container card-body\"><table class=\"table\" style=\"width: 99%; border-collapse: collapse;\"><tbody><tr class=\"future-product\"><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"futureProduct1\" disabled></div></td><td>Daily Organisation Reports and Analytics</td><td>Coming Soon</td></tr><tr class=\"future-product\"><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"futureProduct2\" disabled></div></td><td>Agency App</td><td>Coming Soon</td></tr><tr class=\"future-product\"><td><div class=\"form-check\"><input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"futureProduct3\" disabled></div></td><td>Timetable Assistant</td><td>Coming Soon</td></tr></tbody></table></div></div></div></section><div><button id=\"requestDemoBtn\" class=\"price-accumulator floating-price\" disabled onclick=\"{handleRequestDemo}\">See summary or Request a demo</button></div></div></div>', '', '', function(opts) {\n        document.addEventListener('DOMContentLoaded', function () {\n            const sectionHeaders = document.querySelectorAll('.section-header');\n\n            sectionHeaders.forEach(header => {\n                header.addEventListener('click', () => {\n                    const content = header.nextElementSibling;\n                    const isOpen = header.classList.contains('open');\n\n                    document.querySelectorAll('.section-header').forEach(h => {\n                        h.classList.remove('open');\n                        h.nextElementSibling.classList.remove('open');\n                    });\n\n                    if (!isOpen) {\n                        header.classList.add('open');\n                        content.classList.add('open');\n                    }\n                });\n            });\n\n            if (sectionHeaders.length > 0) {\n                sectionHeaders[0].classList.add('open');\n                sectionHeaders[0].nextElementSibling.classList.add('open');\n            }\n        });\n\n        function checkStudents(checkbox) {\n            const secondaryStudents = parseInt(document.getElementById('secondaryStudents').value) || 0;\n            const primaryStudents = parseInt(document.getElementById('primaryStudents').value) || 0;\n\n            if (secondaryStudents === 0 && primaryStudents === 0) {\n                checkbox.checked = false;\n                alert(\"Prices cannot be calculated until student numbers have been entered.\");\n                return false;\n            }\n            return true;\n        }\n\n        function calculatePrices() {\n            const secondaryStudents = parseInt(document.getElementById('secondaryStudents').value) || 0;\n            const primaryStudents = parseInt(document.getElementById('primaryStudents').value) || 0;\n\n            if (secondaryStudents > 0 || primaryStudents > 0) {\n                updatePrice('price1', 495);\n                updatePrice('price2', 795);\n                updatePrice('price2b', 795);\n                updatePrice('price3', 495);\n                updatePrice('price4', 495);\n                updatePrice('price5', 1750);\n\n                updateMatrixPlanning();\n\n                updatePrice('priceExamTimetable', 2495);\n                updatePrice('priceExamRoster', 795);\n\n                updateCustomWork();\n\n                updateMatrixProjects();\n            } else {\n\n                const priceElements = document.querySelectorAll('[id^=\"price\"]');\n                priceElements.forEach(element => {\n                    element.innerText = '-';\n                });\n            }\n\n            updateTotal();\n        }\n\n        function updatePrice(elementId, price, addDollarSign = true) {\n            const element = document.getElementById(elementId);\n            if (element) {\n                const oldPrice = element.innerText;\n                const newPrice = addDollarSign ? '$' + price.toFixed(2) : price.toFixed(2);\n                element.innerText = newPrice;\n            }\n        }\n\n        function updateMatrixPlanning() {\n            const secondaryStudents = parseInt(document.getElementById('secondaryStudents').value) || 0;\n            const primaryStudents = parseInt(document.getElementById('primaryStudents').value) || 0;\n\n            if (secondaryStudents > 0 || primaryStudents > 0) {\n                const coreBundleBase = 2495;\n                const coreBundleSecondary = 1.00;\n                const coreBundlePrimary = 0.50;\n                const coreBundleTotal = coreBundleBase + (secondaryStudents * coreBundleSecondary) + (primaryStudents * coreBundlePrimary);\n                updatePrice('priceMatrixCore', coreBundleTotal);\n\n                updatePrice('priceMatrixSandpit', 495);\n                updatePrice('priceMatrixAutostaffer', 295);\n                updatePrice('priceMatrixPredictor', 495);\n                updatePrice('priceMatrixApprovals', 495);\n                updatePrice('priceMatrixSubjectChange', 295);\n                updatePrice('priceMatrixSubjectSelection', 795);\n                updatePrice('priceMatrixReports', 0);\n                updatePrice('priceMatrixOnlineStudent', 995);\n\n                const matrixProducts = document.querySelectorAll('[id^=\"matrix\"]:not(#matrixCore)');\n                let anyOtherMatrixSelected = false;\n                matrixProducts.forEach(product => {\n                    if (product.checked) {\n                        anyOtherMatrixSelected = true;\n                    }\n                });\n\n                const coreBundle = document.getElementById('matrixCore');\n                if (anyOtherMatrixSelected) {\n                    coreBundle.checked = true;\n                    coreBundle.disabled = true;\n                } else {\n                    coreBundle.disabled = false;\n                }\n            } else {\n\n                const matrixPrices = document.querySelectorAll('[id^=\"priceMatrix\"]');\n                matrixPrices.forEach(element => {\n                    element.innerText = '-';\n                });\n\n                const coreBundle = document.getElementById('matrixCore');\n                coreBundle.disabled = false;\n                coreBundle.checked = false;\n            }\n        }\n\n        function updateMatrixProjects() {\n            const secondaryStudents = parseInt(document.getElementById('secondaryStudents').value) || 0;\n            const primaryStudents = parseInt(document.getElementById('primaryStudents').value) || 0;\n            const totalStudents = secondaryStudents + primaryStudents;\n\n            if (totalStudents > 0) {\n                const timetablingPrice = document.getElementById('matrixTimetabling').checked ? totalStudents * 3 : 0;\n                const analyticsPrice = document.getElementById('matrixAnalytics').checked ? totalStudents * 2 : 0;\n\n                updatePrice('priceMatrixTimetabling', timetablingPrice);\n                updatePrice('priceMatrixAnalytics', analyticsPrice);\n\n                const otherProductsTotal = calculateOtherProductsTotal();\n                const discountMultiplier = Math.floor(otherProductsTotal / 1000);\n                const discountPercentage = discountMultiplier * 0.05;\n                const matrixProjectsTotal = timetablingPrice + analyticsPrice;\n                const discount = matrixProjectsTotal * discountPercentage;\n\n                updatePrice('priceMatrixDiscount', -discount);\n\n            } else {\n                document.getElementById('priceMatrixTimetabling').innerText = '-';\n                document.getElementById('priceMatrixAnalytics').innerText = '-';\n                document.getElementById('priceMatrixDiscount').innerText = '-';\n            }\n\n            updateTotal();\n        }\n\n        function calculateOtherProductsTotal() {\n            let total = 0;\n            const checkboxes = document.querySelectorAll('.form-check-input:not([id^=\"matrixTimetabling\"], [id^=\"matrixAnalytics\"])');\n            checkboxes.forEach(checkbox => {\n                if (checkbox.checked) {\n                    const priceElement = document.getElementById(checkbox.id.replace('product', 'price').replace('exam', 'priceExam').replace('customWork', 'priceCustomWork').replace('matrix', 'priceMatrix'));\n                    if (priceElement && priceElement.innerText !== '-' && priceElement.innerText !== 'Coming Soon') {\n                        const price = parseFloat(priceElement.innerText.replace('$', '').replace(',', ''));\n                        if (!isNaN(price)) {\n                            total += price;\n                        }\n                    }\n                }\n            });\n            return total;\n        }\n\n        function updateCustomWork() {\n            const secondaryStudents = parseInt(document.getElementById('secondaryStudents').value) || 0;\n            const primaryStudents = parseInt(document.getElementById('primaryStudents').value) || 0;\n\n            if (secondaryStudents > 0 || primaryStudents > 0) {\n                const customWork1Hours = parseInt(document.getElementById('hours1').value) || 0;\n                const customWork1Price = customWork1Hours * 350;\n                updatePrice('priceCustomWork1', customWork1Price);\n\n                const customWork1Checkbox = document.getElementById('customWork1');\n                if (customWork1Checkbox) {\n                    customWork1Checkbox.checked = customWork1Hours > 0;\n                }\n\n                const customWork2Hours = parseInt(document.getElementById('hours2').value) || 0;\n                const customWork2Price = customWork2Hours * 350;\n                updatePrice('priceCustomWork2', customWork2Price);\n\n                const customWork2Checkbox = document.getElementById('customWork2');\n                if (customWork2Checkbox) {\n                    customWork2Checkbox.checked = customWork2Hours > 0;\n                }\n            } else {\n                document.getElementById('priceCustomWork1').innerText = '-';\n                document.getElementById('priceCustomWork2').innerText = '-';\n            }\n\n            updateMatrixProjects();\n        }\n\n        function updateTotal() {\n            const secondaryStudents = parseInt(document.getElementById('secondaryStudents').value) || 0;\n            const primaryStudents = parseInt(document.getElementById('primaryStudents').value) || 0;\n\n            if (secondaryStudents > 0 || primaryStudents > 0) {\n                let totalPrice = 0;\n                const checkboxes = document.querySelectorAll('.form-check-input');\n                checkboxes.forEach(checkbox => {\n                    if (checkbox.checked || checkbox.disabled) {\n                        const priceElement = document.getElementById(checkbox.id.replace('product', 'price').replace('matrix', 'priceMatrix').replace('exam', 'priceExam').replace('customWork', 'priceCustomWork'));\n                        if (priceElement && priceElement.innerText !== '-' && priceElement.innerText !== 'Coming Soon') {\n                            const price = parseFloat(priceElement.innerText.replace('$', '').replace(',', ''));\n                            if (!isNaN(price)) {\n                                totalPrice += price;\n                            }\n                        }\n                    }\n                });\n\n                const discountElement = document.getElementById('priceMatrixDiscount');\n                if (discountElement && discountElement.innerText !== '-') {\n                    const discount = parseFloat(discountElement.innerText.replace('-$', '').replace('$', ''));\n                    if (!isNaN(discount)) {\n                        totalPrice += discount;\n                    }\n                }\n\n                document.getElementById('totalPrice').innerText = totalPrice.toLocaleString('en-US', {\n                    minimumFractionDigits: 2,\n                    maximumFractionDigits: 2\n                });\n                document.getElementById('requestDemoBtn').disabled = totalPrice <= 0;\n\n            } else {\n                document.getElementById('totalPrice').innerText = '0.00';\n                document.getElementById('requestDemoBtn').disabled = true;\n            }\n        }\n\n        function handleDependencies(checkbox) {\n            let updateNeeded = false;\n\n            if (checkbox.id.startsWith('matrix') && checkbox.id !== 'matrixCore') {\n                const coreBundle = document.getElementById('matrixCore');\n\n                if (checkbox.checked) {\n                    coreBundle.checked = true;\n                    coreBundle.disabled = true;\n                    updateNeeded = true;\n                } else {\n\n                    const otherMatrixChecked = Array.from(document.querySelectorAll('[id^=\"matrix\"]:not(#matrixCore)'))\n                        .some(item => item.checked);\n\n                    if (!otherMatrixChecked) {\n                        coreBundle.disabled = false;\n                        updateNeeded = true;\n                    }\n                }\n            }\n\n            if (checkbox.id === 'product1' || checkbox.id === 'product2' || checkbox.id === 'product2b') {\n                const timetableReport = document.getElementById('product1');\n                const comparativeReport = document.getElementById('product2');\n                const trendReport = document.getElementById('product2b');\n\n                if ((checkbox.id === 'product2' || checkbox.id === 'product2b') && checkbox.checked) {\n                    timetableReport.checked = true;\n                    timetableReport.disabled = true;\n                    updateNeeded = true;\n                } else if (checkbox.id === 'product1' && !checkbox.checked) {\n                    comparativeReport.checked = false;\n                    trendReport.checked = false;\n                    updateNeeded = true;\n                } else if ((checkbox.id === 'product2' || checkbox.id === 'product2b') && !checkbox.checked) {\n                    if (!comparativeReport.checked && !trendReport.checked) {\n                        timetableReport.disabled = false;\n                    }\n                    updateNeeded = true;\n                }\n            } else if (checkbox.id === 'product3' || checkbox.id === 'product4') {\n                const timetableVariations = document.getElementById('product3');\n                const curriculumPlanner = document.getElementById('product4');\n\n                if (checkbox.id === 'product4' && checkbox.checked) {\n                    timetableVariations.checked = true;\n                    timetableVariations.disabled = true;\n                    updateNeeded = true;\n                } else if (checkbox.id === 'product3' && !checkbox.checked) {\n                    curriculumPlanner.checked = false;\n                    updateNeeded = true;\n                } else if (checkbox.id === 'product4' && !checkbox.checked) {\n                    timetableVariations.disabled = false;\n                    updateNeeded = true;\n                }\n            } else if (checkbox.id === 'examTimetable' || checkbox.id === 'examRoster') {\n                const examTimetable = document.getElementById('examTimetable');\n                const examRoster = document.getElementById('examRoster');\n\n                if (checkbox.id === 'examRoster' && checkbox.checked) {\n                    examTimetable.checked = true;\n                    examTimetable.disabled = true;\n                    updateNeeded = true;\n                } else if (checkbox.id === 'examTimetable' && !checkbox.checked) {\n                    examRoster.checked = false;\n                    updateNeeded = true;\n                } else if (checkbox.id === 'examRoster' && !checkbox.checked) {\n                    examTimetable.disabled = false;\n                    updateNeeded = true;\n                }\n            } else if (checkbox.id === 'customWork1' || checkbox.id === 'customWork2') {\n\n                const hoursSelect = document.getElementById('hours' + checkbox.id.replace('customWork', ''));\n                if (!checkbox.checked && hoursSelect) {\n                    hoursSelect.value = '0';\n                }\n                updateNeeded = true;\n            }\n\n            if (updateNeeded) {\n                updateCustomWork();\n                updateMatrixProjects();\n                updateTotal();\n            }\n        }\n\n        this.showModal = false;\n        this.selectedItems = [];\n        this.totalPrice = 0;\n\n        this.handleRequestDemo = () => {\n\n            this.selectedItems = [];\n            const checkboxes = document.querySelectorAll('.form-check-input');\n\n            checkboxes.forEach(checkbox => {\n                if (checkbox.checked) {\n                    const priceElement = document.getElementById(checkbox.id.replace('product', 'price')\n                        .replace('matrix', 'priceMatrix')\n                        .replace('exam', 'priceExam')\n                        .replace('customWork', 'priceCustomWork'));\n\n                    if (priceElement && priceElement.innerText !== '-' && priceElement.innerText !== 'Coming Soon') {\n                        let itemName = checkbox.parentElement.parentElement.nextElementSibling.innerText.trim();\n                        let price = parseFloat(priceElement.innerText.replace('$', '').replace(',', ''));\n\n                        if (checkbox.id.includes('customWork')) {\n                            const hoursSelect = document.getElementById('hours' + checkbox.id.replace('customWork', ''));\n                            const selectedHours = hoursSelect ? hoursSelect.value : '0';\n                            if (selectedHours !== '0') {\n                                const productName = checkbox.parentElement.parentElement.nextElementSibling\n                                    .querySelector('select').nextSibling.textContent.trim();\n                                itemName = `${selectedHours} Hours ${productName}`;\n                            }\n                        }\n\n                        this.selectedItems.push({ name: itemName, price: price });\n                    }\n                }\n            });\n\n            this.totalPrice = this.selectedItems.reduce((total, item) => total + item.price, 0);\n\n            this.showModal = true;\n            this.update();\n        }\n\n        this.closeModal = () => {\n            this.showModal = false;\n            this.update();\n        }\n\n        this.submitForm = (event) => {\n            const form = document.getElementById('demoForm');\n\n            if (!form.checkValidity()) {\n                event.preventDefault();\n                form.reportValidity();\n                return;\n            }\n\n            const formData = {\n                contactName: document.getElementById('contactName').value.trim(),\n                schoolName: document.getElementById('schoolName').value.trim(),\n                email: document.getElementById('emailAddress').value.trim(),\n                phone: document.getElementById('phoneNumber').value.trim(),\n                comments: document.getElementById('commentsquestions').value.trim()\n            };\n\n            const subject = 'School Data Quote Request';\n            const body = `\n                            Contact Name: ${formData.contactName}\n                            School Name: ${formData.schoolName}\n                            Email: ${formData.email}\n                            Phone: ${formData.phone}\n                            Comments: ${formData.comments}\n\n                            Selected Items:\n                            ${this.selectedItems.map(item => `${item.name}: $${item.price.toFixed(2)}`).join('\\n')}\n\n                            Total Price: $${this.totalPrice.toFixed(2)}\n                        `;\n\n            window.location.href = `mailto:info@schooldata.com.au?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`;\n            this.closeModal();\n        }\n\n        document.addEventListener('DOMContentLoaded', function () {\n\n            const checkboxes = document.querySelectorAll('.form-check-input');\n            checkboxes.forEach(checkbox => {\n                checkbox.addEventListener('change', function () {\n                    if (checkStudents(this)) {\n                        handleDependencies(this);\n                        updateMatrixProjects();\n                        updateTotal();\n                    }\n                });\n            });\n\n            const hourSelects = document.querySelectorAll('#hours1, #hours2');\n            hourSelects.forEach(select => {\n                select.addEventListener('change', function () {\n                    updateCustomWork();\n                    updateMatrixProjects();\n                    updateTotal();\n                });\n            });\n\n            const studentInputs = document.querySelectorAll('#secondaryStudents, #primaryStudents');\n            studentInputs.forEach(input => {\n                input.addEventListener('input', function () {\n                    calculatePrices();\n                    updateTotal();\n                });\n            });\n\n            calculatePrices();\n            updateTotal();\n        });\n});",
    "var riot = require('riot');\nmodule.exports = riot.tag2('matrixgoldcalculator', '<div class=\"page-title\">Matrix Gold</div><div class=\"layout-wrapper {showResult ? \\'with-results\\' : \\'\\'}\"><div class=\"Container\"><section class=\"info-section\"><h3>Overview</h3><p> Matrix Gold is our <span style=\"font-weight: 600;\">best value</span> package and your ticket to everything we develop, as we develop it. You get early access to each and every app we release, plus the benefits of a Matrix Timetabling membership. Please view our <a href=\"../../../../res/pdf/SchoolData Catalogue 2025-26.pdf\" target=\"_blank\">Product Suite</a> for more information about individual applications. </p><h3>Benefits</h3><ul class=\"benefits-list\"><li>Unlimited access to all apps included</li><li>Early access to new releases</li><li>Early access to test all Matrix Timetabling applications</li><li>Access to Matrix Timetabling consultative sessions (to ensure our timetabling product meets your school\\'s specific needs)</li></ul><p>Choose Matrix Gold for comprehensive coverage and maximum value, ensuring your school stays at the forefront of educational resource management.</p></section><section class=\"calculator-form\"><h3>Price Calculator</h3><form onsubmit=\"{calculatePrice}\"><div class=\"form-group\"><label for=\"secondaryStudents\">Number of Secondary Students (Years 7 - 12)</label><input id=\"secondaryStudents\" name=\"secondaryStudents\" required min=\"0\" type=\"number\"></div><div class=\"form-group\"><label for=\"primaryStudents\">Number of Primary Students (Prep - 6)</label><input id=\"primaryStudents\" name=\"primaryStudents\" required min=\"0\" type=\"number\"></div><div class=\"form-group\"><label for=\"commitment\">Commitment Term</label><select id=\"commitment\" name=\"commitment\" required onchange=\"{updatePaymentOptions}\"><option value=\"1\">1 year</option><option value=\"3\">3 years</option><option value=\"5\">5 years</option></select></div><div class=\"form-group\"><label for=\"payment\">Payment Option</label><select id=\"payment\" name=\"payment\" required><option value=\"1\">Pay annually</option><option value=\"3\">Pay 3 years upfront</option><option value=\"5\">Pay 5 years upfront</option></select></div><button type=\"submit\">Calculate Price</button></form></section></div><div if=\"{showResult}\" class=\"results-panel\"><section class=\"results-section\"><h2>Price Summary</h2><div class=\"price-breakdown-container\"><div class=\"price-breakdown\"><p class=\"cost-type\">Total Contract Price:</p><p class=\"result\">${formatPrice(totalContractPrice)}</p></div><div class=\"price-breakdown\"><p class=\"cost-type\">Total Payable Upfront:</p><p class=\"result\">${formatPrice(upfrontPayment)}</p></div><div class=\"price-breakdown\"><p class=\"cost-type\">Remaining Balance:</p><p class=\"result\">${formatPrice(residualPayment)}</p></div></div><div class=\"saving\"><p>Total Saving:</p><p>${formatPrice(totalSaving)}</p></div><div class=\"breakdown\"><h2>Price Breakdown</h2><div class=\"price-breakdown\"><p class=\"cost-type\">Base Price:</p><p class=\"result\">${formatPrice(basePrice)}</p></div><div class=\"price-breakdown\"><p class=\"cost-type\">Secondary Students Cost:</p><p class=\"result\">${formatPrice(secondaryPrice)}</p></div><div class=\"price-breakdown\"><p class=\"cost-type\">Primary Students Cost:</p><p class=\"result\">${formatPrice(primaryPrice)}</p></div><div class=\"price-breakdown\"><p class=\"cost-type\">Annual Price (before discount):</p><p class=\"result\">${formatPrice(annualPrice)}</p></div><div class=\"price-breakdown\"><p class=\"cost-type\">Applied Discount:</p><p class=\"result\">{appliedDiscount}%</p></div><div class=\"price-breakdown\"><p class=\"cost-type\">Discounted Annual Price:</p><p class=\"result\">${formatPrice(discountedAnnualPrice)}</p></div><div class=\"breakdown-notes\"><p>Note: The upfront payment covers the <span style=\"color: #404040\"><u>first {paymentTerm} year(s)</u></span> at the discounted rate. The remaining balance, if any, will be billed annually for the rest of the commitment term.</p><p>The total saving is calculated by comparing the discounted price to the full price without discounts.</p></div></div></section></div></div>', '', '', function(opts) {\n        this.showResult = false\n        this.paymentTerm = 1\n\n        this.on('mount', function () {\n            this.resetPrices()\n            this.update()\n        })\n\n        this.formatPrice = function(value)\n        {\n            return value.toFixed(2)\n        }.bind(this)\n\n        this.resetPrices = function()\n        {\n            this.basePrice = 10000\n            this.secondaryPrice = 0\n            this.primaryPrice = 0\n            this.annualPrice = 0\n            this.totalContractPrice = 0\n            this.upfrontPayment = 0\n            this.residualPayment = 0\n            this.totalSaving = 0\n            this.appliedDiscount = 0\n            this.discountedAnnualPrice = 0\n            this.paymentTerm = 1\n        }.bind(this)\n\n        this.updatePaymentOptions = function(e)\n        {\n            const commitment = parseInt(e.target.value)\n            const paymentSelect = this.root.querySelector('#payment')\n\n            Array.from(paymentSelect.options).forEach(option => {\n                option.disabled = parseInt(option.value) > commitment\n            })\n\n            if (parseInt(paymentSelect.value) > commitment) {\n                paymentSelect.value = commitment\n            }\n        }.bind(this)\n\n        this.calculatePrice = function(e)\n        {\n            e.preventDefault()\n            const form = e.target\n            const secondaryStudents = parseInt(form.secondaryStudents.value)\n            const primaryStudents = parseInt(form.primaryStudents.value)\n            const commitment = parseInt(form.commitment.value)\n            const payment = parseInt(form.payment.value)\n\n            this.paymentTerm = payment\n\n            this.secondaryPrice = secondaryStudents * 1\n            this.primaryPrice = primaryStudents * 0.5\n            this.annualPrice = this.basePrice + this.secondaryPrice + this.primaryPrice\n\n            const commitmentDiscount = commitment === 3 ? 0.05 : commitment === 5 ? 0.10 : 0\n            const paymentDiscount = payment === 3 ? 0.10 : payment === 5 ? 0.20 : 0\n            const discount = Math.max(commitmentDiscount, paymentDiscount)\n\n            this.appliedDiscount = (discount * 100).toFixed(2)\n            this.discountedAnnualPrice = this.annualPrice * (1 - discount)\n            this.totalContractPrice = this.discountedAnnualPrice * commitment\n            this.upfrontPayment = this.discountedAnnualPrice * payment\n            this.residualPayment = this.totalContractPrice - this.upfrontPayment\n            this.totalSaving = (this.annualPrice * commitment) - this.totalContractPrice\n\n            this.showResult = true\n            this.update()\n        }.bind(this)\n});",
    "var riot = require('riot');\nmodule.exports = riot.tag2('sdexpresspage', '<div class=\"content\"><div class=\"banner\"><h1>School Data Express</h1><p>Your Resources Optimised</p></div><div class=\"tiles-container\"><div class=\"flip-tile\" onclick=\"{showPopup.bind(this, \\'whatWeDo\\', \\'medium\\')}\"><div class=\"flip-tile-inner\"><div class=\"flip-tile-front\"><i class=\"fas fa-tasks icon\"></i><h3>What We Do</h3></div></div></div><div class=\"flip-tile\" onclick=\"{showPopup.bind(this, \\'whoWeAre\\', \\'small\\')}\"><div class=\"flip-tile-inner\"><div class=\"flip-tile-front\"><i class=\"fas fa-users icon\"></i><h3>Who We Are</h3></div></div></div><div class=\"flip-tile\" onclick=\"{showPopup.bind(this, \\'ourApps\\', \\'large\\')}\"><div class=\"flip-tile-inner\"><div class=\"flip-tile-front\"><i class=\"fas fa-mobile-alt icon\"></i><h3>Our Apps</h3></div></div></div><div class=\"flip-tile\" onclick=\"{showPopup.bind(this, \\'testimonials\\', \\'medium\\')}\"><div class=\"flip-tile-inner\"><div class=\"flip-tile-front\"><i class=\"fas fa-quote-right icon\"></i><h3>Testimonials</h3></div></div></div><div class=\"flip-tile\" onclick=\"{showPopup.bind(this, \\'prices\\', \\'medium\\')}\"><div class=\"flip-tile-inner\"><div class=\"flip-tile-front\"><i class=\"fas fa-dollar-sign icon\"></i><h3>Our Best Value Package</h3></div></div></div><div class=\"flip-tile\"><div class=\"flip-tile-inner\"><div class=\"flip-tile-front\"><i class=\"fas fa-laptop icon\"></i><a href=\"https://www.schooldata.com.au/Welcome/contactus\" target=\"_blank\" class=\"btn\">Request a Demo</a></div></div></div></div><div class=\"rolling-banner\"><div class=\"banner-content\"><span>Academy of Mary Immaculate College, Fitzroy</span><span>Catholic College, Wodonga</span><span>Catholic Regional College, Caroline Springs</span><span>Catholic Regional College, North Keilor</span><span>De La Salle College, Malvern</span><span>Emmanuel College, Altona and Point Cook</span><span>Emmaus College, Vermont South</span><span>Firbank Grammar, Brighton</span><span class=\"blurred-text\">Independent Grammar School</span><span>John Paul College, Frankston</span><span>Kilbreda College, Mentone</span><span>Marist-Sion College, Warragul</span><span>Mentone Girls Grammar School, Mentone</span><span>Mentone Grammar School, Mentone</span><span>Nazareth College, Noble Park North</span><span>Padua College, Mornington, Rosebud, Tyabb</span><span>Salesian College, Chadstone</span><span>Siena College, Camberwell</span><span>St Bede\\'s College, Mentone and Bentleigh East</span><span>St Columba\\'s, Essendon</span><span>St Francis Catholic College, Melton and Cobblebank</span><span>St Francis Xavier College, Beaconsfield, Berwick, Officer</span><span>St John\\'s Regional College, Dandenong</span><span>St Michael\\'s Grammar, St Kilda</span><span>Strathcona Girls Grammar School, Canterbury and Hawthorn</span><span>The Hamilton and Alexandra College, Hamilton</span><span>Thomas Carr College, Tarneit</span><span>Trinity College, Colac</span><span>Whitefriars College, Donvale</span><span>Yarra Valley Grammar, Ringwood</span><span>Academy of Mary Immaculate College, Fitzroy</span><span>Catholic College, Wodonga</span><span>Catholic Regional College, Caroline Springs</span><span>Catholic Regional College, North Keilor</span><span>De La Salle College, Malvern</span><span>Emmanuel College, Altona and Point Cook</span><span>Emmaus College, Vermont South</span><span>Firbank Grammar, Brighton</span><span class=\"blurred-text\">Independent Grammar School</span><span>John Paul College, Frankston</span><span>Kilbreda College, Mentone</span><span>Marist-Sion College, Warragul</span><span>Mentone Girls Grammar School, Mentone</span><span>Mentone Grammar School, Mentone</span><span>Nazareth College, Noble Park North</span><span>Padua College, Mornington, Rosebud, Tyabb</span><span>Salesian College, Chadstone</span><span>Siena College, Camberwell</span><span>St Bede\\'s College, Mentone and Bentleigh East</span><span>St Columba\\'s, Essendon</span><span>St Francis Catholic College, Melton and Cobblebank</span><span>St Francis Xavier College, Beaconsfield, Berwick, Officer</span><span>St John\\'s Regional College, Dandenong</span><span>St Michael\\'s Grammar, St Kilda</span><span>Strathcona Girls Grammar School, Canterbury and Hawthorn</span><span>The Hamilton and Alexandra College, Hamilton</span><span>Thomas Carr College, Tarneit</span><span>Trinity College, Colac</span><span>Whitefriars College, Donvale</span><span>Yarra Valley Grammar, Ringwood</span></div></div></div><div id=\"overlay\" class=\"overlay\" onclick=\"{hidePopup}\"></div><div id=\"whatWeDo\" class=\"popup medium\"><h3>What We Do</h3><p><b>We build secondary school resource optimisation apps for Principals and Deputies, Business Managers, and Timetablers.</b></p><p>If you wish you could:</p><ul><li>Harness subject trend data to predict resource requirements and hire months before the competition;</li><li>Analyse and compare your timetable data with other schools, and with your past selves;</li><li>See what it costs to staff the school every day of the year;</li><li>Create Exam and Academic Timetables, Exam Rosters, Class Lists, and more in a fraction of the time it currently takes;</li><li>Get more students their preferences</li></ul><p>...then now is the time to call School Data.</p></div><div id=\"whoWeAre\" class=\"popup small\"><h3>Who We Are</h3><p><b>School Data are Timetablers, Software Engineers, Constraint Programmers, Cyber Security Experts, and an AI PhD.</b></p><p>We\\'re an Australian company bringing the next generation of timetabling technology to Australian schools.</p><p>We work closely with our schools, so you can rest assured that our applications will meet your school\\'s needs.</p></div><div id=\"ourApps\" class=\"popup large\"><h3>2025 School Optimisation Apps Release Schedule</h3><table class=\"custom-table\"><thead><tr><th>Name</th><th>&#x1F9EA; Beta Release</th><th>&#x1F680; Launch</th><th>Description</th></tr></thead><tbody><tr><td>Timetable Report</td><td>NOW!</td><td>DEC 2024</td><td>Gain insights into key metrics that only exist in your timetable</td></tr><tr><td>Reports</td><td>NOW!</td><td>DEC 2024</td><td>Comprehensive analytics for data-driven decisions</td></tr><tr><td>Core Bundle: Staff Intentions Forms, Planner Grids & Loads</td><td>NOW!</td><td>FEB 2025</td><td>Streamline staff allocation and planning processes</td></tr><tr><td>Planner Grid Sandpit (unlimited grids)</td><td>NOW!</td><td>FEB 2025</td><td>Experiment with various load scenarios effortlessly</td></tr><tr><td>Exam Timetable Generator</td><td>NOW!</td><td>MAR 2025</td><td>Optimal schedules in seconds, and no student gets three exams in a day</td></tr><tr><td>Approvals Portal (with Preselection Forms)</td><td>NOW!</td><td>AUG 2025</td><td>Ensure your students are selecting the right subjects for them, first time</td></tr><tr><td>Comparative Report</td><td>FEB 2025</td><td>MAY 2025</td><td>Benchmark your school against like schools</td></tr><tr><td>Subject Change Forms</td><td>MAR 2025</td><td>JUN 2025</td><td>Simplify the subject change process for students and staff</td></tr><tr><td>Timetable Variations</td><td>MAR 2025</td><td>JUL 2025</td><td>Quickly assess the impact of timetable changes</td></tr><tr><td>Curriculum Planner</td><td>MAR 2025</td><td>JUL 2025</td><td>Assess the impact of structural changes on your curricular programs</td></tr><tr><td>Exam Roster Generator</td><td>APR 2025</td><td>AUG 2025</td><td>Automate exam supervision scheduling based on your rules</td></tr><tr><td>Predictor Module</td><td>APR 2025</td><td>APR 2026</td><td>Forecast resource needs and hire early</td></tr><tr><td>Subject Selection Forms (with selection rules)</td><td>APR 2025</td><td>APR 2026</td><td>Streamline subject selection process</td></tr><tr><td>Planner Grid Autostaffer</td><td>MAY 2025</td><td>MAY 2026</td><td>Automate staff allocation based on staff intentions and past class teachers</td></tr><tr><td>Trend Report</td><td>JUN 2025</td><td>NOV 2025</td><td>Identify long-term patterns for strategic planning</td></tr><tr><td>Room Solvers</td><td>JUN 2025</td><td>NOV 2025</td><td>Optimise room allocation based on your rules and constraints</td></tr><tr><td>Online Student Module</td><td>JUL 2025</td><td>DEC 2025</td><td>Centralise student subject management</td></tr><tr><td>Custom Solvers</td><td>JUL 2025</td><td>JUL 2026</td><td>Tackle complex timetabling challenges effortlessly</td></tr><tr><td>TMT</td><td>AUG 2025</td><td>JUN 2026</td><td><span style=\"color:red;\">&#x1F92B; Top secret: For customers\\' ears only</span></td></tr><tr><td>MRCG (and Roll Class) Helper</td><td>AUG 2025</td><td>JUN 2026</td><td>Your most flexible timetable ever</td></tr><tr><td>Timetable Assistant</td><td>OCT 2025</td><td>APR 2026</td><td>Ask questions of your timetable, like \"what would an Art tech for all junior doubles cost?\"</td></tr><tr><td>Daily Timetable and Replacement Analytics</td><td>JAN 2026</td><td>JUL 2026</td><td>Reduce your replacement teacher costs with targeted calendar assessments</td></tr><tr><td>Agency App</td><td>APR 2026</td><td>OCT 2026</td><td>Streamline recruitment and eliminate agency costs</td></tr></tbody></table></div><div id=\"testimonials\" class=\"popup medium\"><h3>Testimonials</h3><div id=\"testimonialCarousel\"><div class=\"testimonial active\"><p><strong>Dr Janine Biggin</strong><br>Principal</p><p>School Data products make staffing very easy as the information you require is available in the one spot. The grid in School Data is fun to use because it enables you to easily see what teachers have requested to teach in the coming year, what they have taught previously, and then where they have been placed for the following year.</p><p>When you are working collaboratively with others, all the team can see the grid together, discuss and evaluate the loads as you go. School Data certainly is instrumental in guiding the creation of teacher loads and a well-structured and workable timetable. I use it all year long for reviewing and updating loads as changes occur.</p></div><div class=\"testimonial\"><p><strong>Rose Connolly</strong><br>Principal</p><p>School Data has truly revolutionised the way we approach strategic staffing in our school. In these challenging times, it has empowered us to stay one step ahead by predicting our staffing needs, allowing us to navigate uncertainties with confidence and efficiency.</p></div><div class=\"testimonial\"><p><strong>Tanya Kolb</strong><br>Director of Operations</p><p>Game changer. Most effective program I have used across staff intentions, staffing and load distribution along with VCE grid and class list development. Hours of manual labour saved, giving time back to more purposeful educational matters.</p></div><div class=\"testimonial\"><p><strong>Brad Heeps</strong><br>Timetabler</p><p>As a relative newcomer to timetabling, School Data is accelerating my learning (and teaching me smart habits) by offering a logical workflow, increased efficiencies, and outstanding support. Their products and their expertise are taking timetabling and Daily Organisation to a new and vastly improved level by keeping up with modern trends and requirements.</p></div></div><div class=\"carousel-controls\"><button class=\"btn prev-btn\">Previous</button><button class=\"btn next-btn\">Next</button></div></div><div id=\"prices\" class=\"popup medium\"><div class=\"prices-popup-content\"><h1>Matrix Gold: Annual Price</h1><div class=\"price\">$10,000</div><div class=\"subtext\"><b>+ $1 per student</b></div><p>Matrix Gold is our best value package and your ticket to everything we develop, as we develop it. <br>You get early access to each and every app we release, plus the benefits of a Matrix Timetabling membership.</p><ul class=\"horizontal-list\"><li>Access to all apps</li><li>Early access to new releases</li><li>Matrix Timetabling membership included</li></ul><a href=\"https://www.schooldata.com.au/Welcome/contactus\" target=\"_blank\" class=\"btn\">Get Matrix Gold</a></div></div><div id=\"requestDemo\" class=\"popup small\"><h3>Request a Demo</h3><p>Ready to see SchoolData in action? See a live walkthrough of our most popular features and get personalized insights based on your school\\'s data.</p><a href=\"https://www.schooldata.com.au/Welcome/contactus\" target=\"_blank\" class=\"btn\">Contact Us</a></div><footer style=\"position: absolute; bottom: -10%; left: 7px;\"><p>&#x00A9; 2024 SchoolData | <a href=\"https://www.schooldata.com.au\" style=\"color: blue;\">Visit our main website</a></p></footer>', '', '', function(opts) {\n        this.mixin('eventSystem');\n\n        this.on('mount', function () {\n            document.getElementById('overlay').addEventListener('click', this.hidePopup);\n        }.bind(this));\n\n        this.showPopup = function (popupId, size) {\n            const popup = document.getElementById(popupId);\n            popup.classList.add(size);\n            document.getElementById('overlay').style.display = 'block';\n            popup.style.display = 'block';\n        }\n\n        this.hidePopup = function () {\n            document.getElementById('overlay').style.display = 'none';\n            const popups = document.querySelectorAll('.popup');\n            popups.forEach(popup => {\n                popup.style.display = 'none';\n                popup.classList.remove('small', 'medium', 'large');\n            });\n        }\n\n        this.currentIndex = 0;\n        this.testimonials = [];\n\n        this.on('mount', function () {\n            this.testimonials = document.querySelectorAll('.testimonial');\n            this.showTestimonial(this.currentIndex);\n\n            document.querySelector('.next-btn').addEventListener('click', this.nextTestimonial.bind(this));\n            document.querySelector('.prev-btn').addEventListener('click', this.prevTestimonial.bind(this));\n        }.bind(this));\n\n        this.showTestimonial = function (index) {\n            this.testimonials.forEach((testimonial, i) => {\n                testimonial.style.display = i === index ? 'block' : 'none';\n            });\n        }\n\n        this.nextTestimonial = function () {\n            this.currentIndex = (this.currentIndex + 1) % this.testimonials.length;\n            this.showTestimonial(this.currentIndex);\n        }\n\n        this.prevTestimonial = function () {\n            this.currentIndex = (this.currentIndex - 1 + this.testimonials.length) % this.testimonials.length;\n            this.showTestimonial(this.currentIndex);\n        }\n});",
    "var riot = require('riot');\nmodule.exports = riot.tag2('privacysection', '<div class=\"SecurityContainer\"><aside class=\"TableOfContentsContainer\"><h2 class=\"TableTitle\">Table of Contents</h2><nav class=\"toc-nav\"><ul class=\"TableList\"><li><a href=\"#information-we-collect\">1. Information We Collect</a></li><li><a href=\"#how-we-use-your-information\">2. How We Use Your Information</a></li><li><a href=\"#disclosure-of-your-information\">3. Disclosure of Your Information</a></li><li><a href=\"#data-storage-and-security\">4. Data Storage and Security</a></li><li><a href=\"#data-retention\">5. Data Retention</a></li><li><a href=\"#your-data-protection-rights\">6. Your Data Protection Rights</a></li><li><a href=\"#childrens-privacy\">7. Children\\'s Privacy</a></li><li><a href=\"#changes-to-this-privacy-policy\">8. Changes to This Privacy Policy</a></li><li><a href=\"#contact-us\">9. Contact Us</a></li></ul></nav></aside><main class=\"ContentArea\"><h1 class=\"PageTitle\">Privacy Policy</h1><section id=\"information-we-collect\" class=\"ContentSection\"><p class=\"SectionText\"> School Data Pty Ltd (\"School Data,\" \"we,\" \"our,\" or \"us\") is committed to protecting the privacy of personal information of our users. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use our services. Please read this privacy policy carefully. If you do not agree with the terms of this privacy policy, please do not access our services. </p></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">1. Information We Collect</h2><p class=\"SectionText\"> We collect information that you provide directly to us when using our services. The types of information we may collect include: </p><ul class=\"FeatureList\"><li>Names of staff and students</li><li>Email addresses</li><li>Phone numbers (only for staff requiring two-factor authentication)</li><li id=\"how-we-use-your-information\">Other information you choose to provide in free text fields</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">2. How We Use Your Information</h2><p class=\"SectionText\"> We use the information we collect for various purposes, including to: </p><ul class=\"FeatureList\"><li>Provide, maintain, and improve our services</li><li>Process and complete transactions</li><li>Send you technical notices, updates, security alerts, and support and administrative messages</li><li>Respond to your comments, questions, and requests</li><li>Communicate with you about products, services, offers, and events</li><li>Monitor and analyse trends, usage, and activities in connection with our services</li><li>Detect, investigate, and prevent fraudulent transactions and other illegal activities</li><li id=\"disclosure-of-your-information\">Comply with our legal and regulatory obligations</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">3. Disclosure of Your Information</h2><p class=\"SectionText\"> We may share your information in the following situations: </p><ul class=\"FeatureList\"><li>With your school\\'s designated Timetablers who manage access within the SchoolData system</li><li>To comply with applicable laws and regulations</li><li>To respond to a subpoena, search warrant, or other lawful request for information we receive</li><li id=\"data-storage-and-security\">To protect the rights, property, or safety of School Data, our users, or others</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">4. Data Storage and Security</h2><p class=\"SectionText\"> We prioritise the security of your data: </p><ul class=\"FeatureList\"><li>All data is stored in secure data centre facilities located within Australia</li><li>We use industry-standard encryption methods for data at rest and in transit</li><li>Access to our databases and systems is strictly limited to authorised personnel</li><li id=\"data-retention\">We implement appropriate technical and organisational measures to protect against unauthorised or unlawful processing, accidental loss, destruction, or damage</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">5. Data Retention</h2><p id=\"your-data-protection-rights\" class=\"SectionText\"> We retain your information for as long as necessary to provide our services and fulfill the purposes outlined in this privacy policy. When we no longer need personal information, we securely delete or destroy it. </p></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">6. Your Data Protection Rights</h2><p class=\"SectionText\"> Depending on your location and applicable laws, you may have certain rights regarding your personal information, including: </p><ul class=\"FeatureList\"><li>The right to access your personal information</li><li>The right to rectify inaccurate personal information</li><li>The right to request deletion of your personal information</li><li>The right to restrict processing of your personal information</li><li>The right to data portability</li></ul><p id=\"childrens-privacy\" class=\"SectionText\"> To exercise these rights, please contact us using the details provided in the \"Contact Us\" section. </p></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">7. Children\\'s Privacy</h2><p class=\"SectionText\"> Our services are not intended for use by children under the age of 13. We do not knowingly collect personal information from children under 13. If you are a parent or guardian and believe we may have collected information about a child, please contact us. </p></section><section id=\"changes-to-this-privacy-policy\" class=\"ContentSection\"><h2 class=\"SectionTitle\">8. Changes to This Privacy Policy</h2><p class=\"SectionText\"> We may update our privacy policy from time to time. We will notify you of any changes by posting the new privacy policy on this page and updating the \"Last Updated\" date. </p></section><section id=\"contact-us\" class=\"ContentSection\"><h2 class=\"SectionTitle\">9. Contact Us</h2><p class=\"SectionText\"> If you have any questions about this privacy policy or our data practices, please contact us at: </p><a href=\"mailto:info@schooldata.com.au\" class=\"ContactButton\">info@schooldata.com.au</a></section><footer class=\"ContentFooter\"><p>Last Updated: October 2024</p><p>This Privacy Policy is subject to periodic updates as we implement planned enhancements and respond to evolving privacy needs in the educational technology landscape.</p></footer></main></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n\n        this.on('mount', function () {\n\n            document.querySelectorAll('a[href^=\"#\"]').forEach(anchor => {\n                anchor.addEventListener('click', function (e) {\n                    e.preventDefault();\n                    document.querySelector(this.getAttribute('href')).scrollIntoView({\n                        behavior: 'smooth'\n                    });\n                });\n            });\n        });\n});",
    "var riot = require('riot');\nmodule.exports = riot.tag2('samplelicenceagreement', '<div><embed src=\"../../../../res/pdf/Software Licence Agreement - School Data (SAMPLE).pdf\" style=\"width: 100%; height: 100vh\" type=\"application/pdf\"></div>', '', '', function(opts) {\n});",
    "var riot = require('riot');\nmodule.exports = riot.tag2('securitysection', '<div class=\"SecurityContainer\"><aside class=\"TableOfContentsContainer\"><h2 class=\"TableTitle\">Table of Contents</h2><nav class=\"toc-nav\"><ul class=\"TableList\"><li><a href=\"#data-management-and-privacy\">1. Data Management and Privacy</a></li><li><a href=\"#physical-and-technical-security\">2. Physical and Technical Security</a></li><li><a href=\"#access-control-and-authentication\">3. Access Control and Authentication</a></li><li><a href=\"#server-and-infrastructure-security\">4. Server and Infrastructure Security</a></li><li><a href=\"#data-backup-and-recovery\">5. Data Backup and Recovery</a></li><li><a href=\"#logging-and-auditing\">6. Logging and Auditing</a></li><li><a href=\"#compliance-and-certifications\">7. Compliance and Certifications</a></li><li><a href=\"#service-availability-and-performance\">8. Service Availability and Performance</a></li><li><a href=\"#data-portability-and-extraction\">9. Data Portability and Extraction</a></li><li><a href=\"#data-lifecycle-and-retention\">10. Data Lifecycle and Retention</a></li><li><a href=\"#incident-response\">11. Incident Response</a></li><li><a href=\"#legal-compliance\">12. Legal Compliance</a></li><li><a href=\"#insurance\">13. Insurance</a></li><li><a href=\"#continuous-improvement\">14. Continuous Improvement</a></li><li><a href=\"#contact-information\">15. Contact Information</a></li></ul></nav></aside><main class=\"ContentArea\"><h1 class=\"PageTitle\">Security Statement</h1><section id=\"data-management-and-privacy\" class=\"ContentSection\"><p class=\"SectionText\"> School Data is committed to maintaining the highest standards of data security and privacy. This Security Statement outlines the measures we have in place to protect our clients\\' data and ensure the integrity of our services. </p></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">1. Data Management and Privacy</h2><ul class=\"FeatureList\"><li>Compliance with all applicable Australian privacy laws</li><li>Data collection limited to essential information necessary for service delivery</li><li>Secure storage of names, email addresses, and phone numbers (where required)</li><li>Recognition of free text fields as potential privacy concerns with appropriate precautions</li><li>Data encryption at rest and in transit using industry-standard methods</li><li id=\"physical-and-technical-security\">Detailed information available in our formal Privacy Policy</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">2. Physical and Technical Security</h2><ul class=\"FeatureList\"><li>Data hosted in secure data centre facilities within Australia (AWS and Digital Ocean)</li><li>Strictly controlled access to data centre facilities</li><li>Full HTTPS encryption for website and backend web server connections</li><li id=\"access-control-and-authentication\">Back-end services contained within a private VPN, blocked from internet traffic</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">3. Access Control and Authentication</h2><ul class=\"FeatureList\"><li>Principle of least privilege applied for data access</li><li>Database access strictly limited to system administrators and company directors</li><li>SchoolData system access managed by designated school Timetablers</li><li>Web authentication via Single Sign-On (SSO) using Microsoft Active Directory</li><li id=\"server-and-infrastructure-security\">Restricted direct logins with mandatory Two-Factor Authentication (2FA) where applicable</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">4. Server and Infrastructure Security</h2><ul class=\"FeatureList\"><li>Linux-based server operating systems</li><li>Up-to-date antivirus software on all servers</li><li>Prompt application of system updates</li><li>RAID configuration for disk failure protection</li><li>Front-end nodes in a cluster behind an Active Load Balancer</li><li id=\"data-backup-and-recovery\">Automatic scaling during high traffic periods</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">5. Data Backup and Recovery</h2><ul class=\"FeatureList\"><li>Hourly full backups of the Master Database</li><li>Nightly \"disk to disk\" backups for each hosted environment database</li><li>Encrypted backups copied to a secondary server nightly</li><li>1-hour recovery window capability in the event of data loss</li><li id=\"logging-and-auditing\">Disaster Recovery site deployed across multiple data centres in Australia</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">6. Logging and Auditing</h2><ul class=\"FeatureList\"><li>Ongoing expansion of logging capabilities</li><li>Current logging of changes to staff allocations</li><li>30-60 day retention of readily accessible logs</li><li>Long-term storage (up to 7 years) for potential investigations</li><li id=\"compliance-and-certifications\">Planned implementation of comprehensive data table change logging</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">7. Compliance and Certifications</h2><ul class=\"FeatureList\"><li>Active pursuit of ISO/IEC 27001 certification (target: 2025)</li><li>Planned implementation of annual staff compliance training (starting mid-2025)</li><li id=\"service-availability-and-performance\">Current Working With Children checks for all personnel with access to School data</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">8. Service Availability and Performance</h2><ul class=\"FeatureList\"><li>99.99% uptime maintained over the past 5 years</li><li>Planned implementation of formal uptime documentation</li><li>Monthly planned maintenance outside business hours</li><li>Advance notices for all planned maintenance</li><li id=\"data-portability-and-extraction\">Daily code updates without system downtime</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">9. Data Portability and Extraction</h2><ul class=\"FeatureList\"><li>Direct CSV download of any data table from our interface</li><li>Full database extraction available upon request (additional costs may apply)</li><li id=\"data-lifecycle-and-retention\">Custom data extraction requests accommodated (additional costs may apply)</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">10. Data Lifecycle and Retention</h2><ul class=\"FeatureList\"><li>Data deletion policies outlined in our terms and conditions</li><li>Complete data deletion upon contract termination</li><li id=\"incident-response\">Data deletion requests during contract period accommodated (process to be detailed)</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">11. Incident Response</h2><p class=\"SectionText\"> We are developing a formal data breach response plan that will include: </p><ul class=\"FeatureList\"><li>Prompt investigation and assessment of security incidents</li><li>Immediate containment and mitigation steps</li><li>Timely notification to affected schools</li><li>Cooperation with external investigations or audits</li><li>Thorough review process to prevent future incidents</li></ul><p id=\"legal-compliance\" class=\"SectionText\"> We are also considering partnering with a cybersecurity firm to enhance our incident response capabilities. </p></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">12. Legal Compliance</h2><ul class=\"FeatureList\"><li>Compliance with all legal requests for information</li><li id=\"insurance\">High-priority treatment of time-sensitive legal matters</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">13. Insurance</h2><ul class=\"FeatureList\"><li>In process of obtaining public liability insurance (up to $20 million coverage)</li><li id=\"continuous-improvement\">Considering cyber attack insurance</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">14. Continuous Improvement</h2><p class=\"SectionText\"> We are committed to continuously enhancing our security measures. Our ongoing and planned improvements include: </p><ul class=\"FeatureList\"><li>Expanding logging and auditing capabilities</li><li>Implementing a formal uptime tracking system</li><li>Developing a comprehensive data breach response plan</li><li>Pursuing ISO/IEC 27001 certification</li><li id=\"contact-information\">Implementing annual staff compliance training</li></ul></section><section class=\"ContentSection\"><h2 class=\"SectionTitle\">15. Contact Information</h2><p class=\"SectionText\"> For any questions or concerns regarding this Security Statement or our data practices, please contact our Data and Security team at: </p><a href=\"mailto:info@schooldata.com.au\" class=\"ContactButton\">info@schooldata.com.au</a></section><footer class=\"ContentFooter\"><p>Last updated: October 2024</p><p>This Security Statement is subject to periodic updates as we implement planned enhancements and respond to evolving security needs in the educational technology landscape.</p></footer></main></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n\n        this.on('mount', function () {\n\n            document.querySelectorAll('a[href^=\"#\"]').forEach(anchor => {\n                anchor.addEventListener('click', function (e) {\n                    e.preventDefault();\n                    document.querySelector(this.getAttribute('href')).scrollIntoView({\n                        behavior: 'smooth'\n                    });\n                });\n            });\n        });\n});",
    "var riot = require('riot');\nmodule.exports = riot.tag2('servicelevelspage', '<div class=\"service-levels\"><h1>Service Levels</h1><section><h2>Service Availability</h2><div class=\"subsection\"><h3>Uptime Commitment</h3><ul><li>Target system availability: 99.9% during business hours</li><li>Scheduled maintenance windows excluded</li><li>Historical uptime performance: 99.99%</li></ul></div><div class=\"subsection\"><h3>System Monitoring</h3><ul><li>24/7 automated system monitoring</li><li>Proactive issue detection and resolution</li><li>Real-time performance monitoring</li></ul></div></section><section><h2>Response Times</h2><div><h3>Priority Levels</h3><div class=\"priority-levels\"><div class=\"priority-item priority-item-critical\"><h4>Critical (P1)</h4><ul><li>System-wide outage or critical functionality unavailable</li><li>Initial Response: 15 minutes</li><li>Resolution Target: 2 hours</li></ul></div><div class=\"priority-item\"><h4>High (P2)</h4><ul><li>Major functionality impacted but system accessible</li><li>Initial Response: 1 hour</li><li>Resolution Target: 4 hours</li></ul></div><div class=\"priority-item\"><h4>Medium (P3)</h4><ul><li>Minor functionality issues</li><li>Initial Response: 4 hours</li><li>Resolution Target: 1 business day</li></ul></div><div class=\"priority-item\"><h4>Low (P4)</h4><ul><li>General questions or enhancement requests</li><li>Initial Response: 1 business day</li><li>Resolution Target: 5 business days</li></ul></div></div></div></section><section><h2>Maintenance Windows</h2><div class=\"subsection\"><h3>Scheduled Maintenance</h3><ul><li>Regular maintenance: Sunday 2 AM - 4 AM AEST</li><li>Minimum 7 days advance notice</li><li>Emergency maintenance may be performed with shorter notice if required</li></ul></div><div class=\"subsection\"><h3>System Updates</h3><ul><li>Security patches: Applied weekly during maintenance windows</li><li>Feature updates: Deployed during business hours with zero downtime</li><li>Major version updates: Scheduled with advance notice</li></ul></div></section><section><h2>Communication</h2><div class=\"subsection\"><h3>Outage Notification</h3><ul><li>Unplanned outages: Email notification within 15 minutes</li><li>Status updates every 30 minutes during critical incidents</li><li>Post-incident reports available upon request</li></ul></div><div class=\"subsection\"><h3>Maintenance Notification</h3><ul><li>7 days advance notice for scheduled maintenance</li><li>Notification via email and system announcements</li><li>Expected duration and impact detailed in notifications</li></ul></div></section><section><h2>Data Management</h2><div class=\"subsection\"><h3>Backup Schedule</h3><ul><li>Hourly database backups</li><li>All backups encrypted and stored in AWS S3</li><li>Backup retention: 30 days</li></ul></div><div class=\"subsection\"><h3>Data Recovery</h3><ul><li>Recovery Time Objective (RTO): 1 hour</li><li>Recovery Point Objective (RPO): 1 hour</li><li>No additional cost for standard recovery requests</li></ul></div></section><section><h2>Security</h2><div class=\"subsection\"><h3>Access Control</h3><ul><li>Role-based access control (RBAC)</li><li>Regular access review and audit</li><li>Two-factor authentication available for administrative accounts</li></ul></div><div class=\"subsection\"><h3>Data Protection</h3><ul><li>Data encrypted at rest and in transit</li><li>Regular security assessments</li><li>All data hosted in Australian data centres</li></ul></div></section><section><h2>Service Improvement</h2><ul><li>Regular review of service metrics</li><li>Quarterly service level reviews</li><li>Continuous improvement based on customer feedback</li><li>Annual security and performance audits</li></ul></section></div>', '', '', function(opts) {\n});",
    "var riot = require('riot');\nmodule.exports = riot.tag2('troubleshootingguidepage', '<div class=\"troubleshooting-guide\"><h1>Troubleshooting Guide</h1><section class=\"common-issues\"><h2>Common Issues and Solutions</h2><div class=\"issue-section\"><h3>Access & Login</h3><div class=\"issue-list\"><div class=\"issue-item\"><h4>Unable to Log In</h4><ul><li>Verify your email address is correct</li><li>Ensure Caps Lock is off</li><li>If using Microsoft SSO, ensure you\\'re logged into your school Microsoft account</li><li>Non-Microsoft SSO customers: Try resetting your password</li><li>Contact your school\\'s School Data administrator if problems persist</li></ul></div><div class=\"issue-item\"><h4>Forgotten Password</h4><ul><li>Click \"Forgot Password\" on the login screen</li><li>Follow the password reset instructions sent to your school email</li><li>If you don\\'t receive the reset email, check your spam folder</li><li>Contact support if you need additional assistance</li></ul></div><div class=\"issue-item\"><h4>Access Denied Messages</h4><ul><li>Verify with your school\\'s School Data administrator that you have the correct role assignments</li><li>Log out completely and log back in</li><li>Clear your browser cache and cookies</li></ul></div></div></div><div class=\"issue-section\"><h3>Data Management</h3><div class=\"issue-list\"><div class=\"issue-item\"><h4>Data Import Issues</h4><ul><li>Ensure your CSV files match the required format specified in the documentation</li><li>Check for special characters or formatting issues in your data</li><li>Verify all required fields are included</li><li>Look for duplicate entries that may cause conflicts</li></ul></div><div class=\"issue-item\"><h4>Data Export Problems</h4><ul><li>Try exporting smaller portions of data if full export fails</li><li>Ensure you have stable internet connection for large downloads</li><li>Clear browser cache if export buttons are unresponsive</li><li>Contact support for assistance with full database extraction requests</li></ul></div><div class=\"issue-item\"><h4>Missing or Incorrect Data</h4><ul><li>Verify data was properly imported and saved</li><li>Check filter settings (including \"Show All\" checkboxes) that might be hiding data</li><li>Review recent changes in the audit log (in the Admin menu)</li><li>Contact support if data appears corrupted or inconsistent</li></ul></div></div></div><div class=\"issue-section\"><h3>Performance</h3><div class=\"issue-list\"><div class=\"issue-item\"><h4>Slow Loading Times</h4><ul><li>Clear browser cache and cookies</li><li>Try a different supported browser (Chrome, Firefox, Edge)</li><li>Check your internet connection speed</li><li>If problems persist during normal hours, contact support</li></ul></div><div class=\"issue-item\"><h4>Browser Compatibility</h4><ul><li>Use the latest version of Chrome, Firefox, or Edge</li><li>Enable JavaScript and cookies</li><li>Disable browser extensions that might interfere</li><li>Ensure your browser meets minimum requirements</li></ul></div></div></div></section><section class=\"support-info\"><h2>Getting Support</h2><div class=\"support-section\"><h3>Support Hours</h3><ul><li>Business hours support (Monday to Friday, 9 AM to 5 PM AEST)</li><li>Email: <a href=\"mailto:support@schooldata.com.au\">support@schooldata.com.au</a></li></ul></div><div class=\"support-section\"><h3>Before Contacting Support</h3><ol><li>Check this troubleshooting guide</li><li> Gather relevant information: <ul><li>Your school name and username</li><li>Detailed description of the issue</li><li>Steps to reproduce the problem</li><li>Screenshots if applicable</li><li>Browser and operating system details</li></ul></li></ol></div><div class=\"support-section emergency-support\"><h3>Emergency Support</h3><p>For urgent issues affecting school operations:</p><ol><li>Email <a href=\"mailto:support@schooldata.com.au\">support@schooldata.com.au</a> with \"URGENT\" in the subject line</li><li>Include contact details for immediate callback</li></ol></div></section></div>', '', '', function(opts) {\n});",
    "var riot = require('riot');\nmodule.exports = riot.tag2('useragreementspage', '<div class=\"NavContainer\"><div class=\"NavItems\"><div class=\"NavItemText {ShowSection === \\'Terms\\' ? \\'active\\' : \\'\\'}\" onclick=\"{() => ToggleSection(\\'Terms\\')}\">Terms of Service</div><div class=\"NavItemText {ShowSection === \\'Data\\' ? \\'active\\' : \\'\\'}\" onclick=\"{() => ToggleSection(\\'Data\\')}\">Data</div><div class=\"NavItemText {ShowSection === \\'Privacy\\' ? \\'active\\' : \\'\\'}\" onclick=\"{() => ToggleSection(\\'Privacy\\')}\">Privacy Policy</div><div class=\"NavItemText {ShowSection === \\'Insurance\\' ? \\'active\\' : \\'\\'}\" onclick=\"{() => ToggleSection(\\'Insurance\\')}\">Insurance</div></div></div><div class=\"ConditionOuterContainer\"><div class=\"ConditionContainer {ShowSection === \\'Terms\\' ? \\'ShowCondition\\' : \\'HideCondition\\'} condition-certificate-container\"><div id=\"idTermsContainer\" class=\"ConditionHeader\"><h1>Terms of Service</h1></div><div class=\"ConditionTextContainer\"><div class=\"ConditionText certificate-content\"><div class=\"content-status\"><div class=\"status-icon\"><i class=\"fas fa-clock\"></i></div><div class=\"status-text\">Coming Soon</div><p class=\"status-description\">Our Terms of Service are currently being updated. Please check back later.</p></div></div></div></div><div class=\"ConditionContainer {ShowSection === \\'Data\\' ? \\'ShowCondition\\' : \\'HideCondition\\'} condition-certificate-container\"><div id=\"idDataContainer\" class=\"ConditionHeader\"><h1>Data</h1></div><div class=\"ConditionTextContainer\"><div class=\"ConditionText certificate-content\"><div class=\"links-section\"><h2 class=\"section-heading\">AWS Agreements</h2><p class=\"section-description\">We use Amazon Web Services (AWS) for our cloud infrastructure. Please review the following agreements:</p><div class=\"links-grid\"><a href=\"https://aws.amazon.com/service-terms/\" target=\"_blank\" class=\"certificate-link\"><div class=\"link-icon\"><i class=\"fas fa-file-contract\"></i></div><div class=\"link-content\"><div class=\"link-title\">AWS Service Terms</div><div class=\"link-description\">Terms governing the use of AWS services</div></div><div class=\"link-arrow\"><i class=\"fas fa-external-link-alt\"></i></div></a><a href=\"https://aws.amazon.com/agreement/\" target=\"_blank\" class=\"certificate-link\"><div class=\"link-icon\"><i class=\"fas fa-handshake\"></i></div><div class=\"link-content\"><div class=\"link-title\">AWS Customer Agreement</div><div class=\"link-description\">General terms and conditions for AWS customers</div></div><div class=\"link-arrow\"><i class=\"fas fa-external-link-alt\"></i></div></a></div></div></div></div></div><div class=\"ConditionContainer {ShowSection === \\'Privacy\\' ? \\'ShowCondition\\' : \\'HideCondition\\'} condition-certificate-container\"><div id=\"idTermsContainer\" class=\"ConditionHeader\"><h1>Privacy Policy</h1></div><div class=\"ConditionTextContainer\"><div class=\"ConditionText certificate-content\"><div class=\"content-status\"><div class=\"status-icon\"><i class=\"fas fa-clock\"></i></div><div class=\"status-text\">Coming Soon</div><p class=\"status-description\">Our Privacy Policy is currently being updated. Please check back later.</p></div></div></div></div><div class=\"ConditionContainer {ShowSection === \\'Insurance\\' ? \\'ShowCondition\\' : \\'HideCondition\\'} condition-certificate-container\"><div id=\"idInsuranceContainer\" class=\"ConditionHeader\"><h1>Insurance Certificate</h1></div><div class=\"ConditionTextContainer\"><div class=\"ConditionText certificate-container\"><div class=\"certificate-header\"><div class=\"certificate-download\"><a href=\"/res/pdf/School Data Insurance Policy Certificate.pdf\" target=\"_blank\" class=\"download-button\"><i class=\"fas fa-file-pdf\"></i><span>View Full Certificate</span></a></div></div><div class=\"policy-summary\"><div class=\"policy-number\"><div class=\"label\">Policy Number</div><div class=\"value\">ESN0040181433</div></div><div class=\"policy-period\"><div class=\"label\">Coverage Period</div><div class=\"value\">25 Oct 2024 - 25 Oct 2025</div></div></div><div class=\"policy-details\"><div class=\"detail-card\"><div class=\"card-icon\"><i class=\"fas fa-building\"></i></div><div class=\"card-content\"><h3>Underwriter</h3><p>Certain underwriters at Lloyd\\'s through CFC Underwriting Limited</p></div></div><div class=\"detail-card\"><div class=\"card-icon\"><i class=\"fas fa-globe\"></i></div><div class=\"card-content\"><h3>Territorial Scope</h3><p>Worldwide</p></div></div><div class=\"detail-card\"><div class=\"card-icon\"><i class=\"fas fa-laptop-code\"></i></div><div class=\"card-content\"><h3>Applicable To</h3><p>Software Sales (SaaS) and associated technology services</p></div></div></div><div class=\"coverage-section\"><h2 class=\"section-heading\">Coverage Highlights</h2><div class=\"coverage-grid\"><div class=\"coverage-item\"><div class=\"coverage-type\">Professional Liability</div><div class=\"coverage-limit\">AUD 2,000,000</div><div class=\"coverage-note\">aggregate</div></div><div class=\"coverage-item\"><div class=\"coverage-type\">Products and Services Liability</div><div class=\"coverage-limit\">AUD 1,000,000</div><div class=\"coverage-note\">per claim</div></div><div class=\"coverage-item\"><div class=\"coverage-type\">Cyber and Privacy Liability</div><div class=\"coverage-limit\">AUD 1,000,000</div><div class=\"coverage-note\">aggregate</div></div><div class=\"coverage-item\"><div class=\"coverage-type\">Public Liability</div><div class=\"coverage-limit\">AUD 20,000,000</div><div class=\"coverage-note\">per claim</div></div><div class=\"coverage-item\"><div class=\"coverage-type\">Products Liability</div><div class=\"coverage-limit\">AUD 20,000,000</div><div class=\"coverage-note\">aggregate</div></div></div></div><div class=\"incident-response-card\"><div class=\"card-header\"><i class=\"fas fa-phone-alt\"></i><h3>24/7 Cyber Incident Response: <span class=\"phone-number\">1800 803 202</span></h3></div></div><div class=\"certificate-footer\"><p>&copy; 2025 School Data Pty Ltd. All rights reserved.</p><p class=\"disclaimer\">This is a summary of coverage. Please refer to the <a href=\"/res/pdf/School Data Insurance Policy Certificate.pdf\" target=\"_blank\" class=\"policy-link\">full policy document</a> for complete details.</p></div></div></div></div></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n        this.ShowSection = 'Terms';\n\n        this.on('mount', function () {\n\n        }.bind(this));\n\n        ToggleSection = (Section) => {\n            this.ShowSection = Section;\n            this.update();\n        }\n\n});",
    "var riot = require('riot');\nmodule.exports = riot.tag2('ttcontactuspopupnotify', '<div class=\"Excel2007Modal\"><div id=\"idContactUsPopupNotify\" class=\"modal\"><div class=\"modal-content\"><div class=\"modal-header-Notify\"><span if=\"{DisplayMode}\" class=\"close\" onclick=\"{discardAction}\">&times;</span> SchoolData - Notification </div><div class=\"modal-body\"><p><div id=\"idMessageBody\"></div></p></div><div class=\"modal-footer\" if=\"{DisplayMode}\"><a href=\"#\" onclick=\"{confirmOkAction}\" class=\"CommonConfirmSavebutton\">OK</a></div></div></div></div>', '', '', function(opts) {\n        this.mixin('eventSystem');\n        this.Entry = null;\n        this.Message = \"\";\n        this.Callback = null;\n        this.DisplayMode = true;\n\n        this.on('mount', function () {\n\n            var xxx = this;\n        }.bind(this));\n\n        this.subscribe('TTShowContactUsPopupNotify', function (e) {\n            this.idMessageBody.innerHTML = e.data.Message;\n            if (typeof e.data.DisplayMode !== 'undefined')\n            {\n                this.DisplayMode = e.data.displaymode;\n            }\n\n            if (e.data.Callback)\n                this.Callback = e.data.Callback;\n\n            this.idContactUsPopupNotify.style.display = \"\";\n            this.update();\n\n            this.idContactUsPopupNotify.style.display = \"block\";\n        });\n\n        this.subscribe('TTHideContactUsPopupNotify', function (e) {\n            this.idContactUsPopupNotify.style.display = \"\";\n            this.update();\n        });\n\n        this.discardAction = function()\n        {\n            this.idContactUsPopupNotify.style.display = \"\";\n            this.update();\n        }.bind(this)\n\n        this.confirmOkAction = function()\n        {\n            if (this.Callback)\n                this.Callback();\n            this.idContactUsPopupNotify.style.display = \"\";\n        }.bind(this)\n\n});\n\n\n\n",
    "var riot = require('riot');\r\n\r\nvar EventSystemMixin = {\r\n\tinit: function() {\r\n        this.eventManager = require('../services/eventManager.js');\r\n\t},\r\n\r\n    //Subscribe to be notified of the event with the specified name.  Supplied callback is\r\n    //bound so that the 'this' keyword can be used within the callback function to refer to the tag doing the subscribing\r\n\tsubscribe: function (eventName, callback) {\r\n        this.eventManager.on(eventName, callback.bind(this));\r\n    },\r\n\r\n    //Publish an event, notifying all tags subscribed to that event and passing the supplied payload\r\n    //of data\r\n\tpublish: function (eventName, data) {\r\n        var eventData = { sourceTag: this, data: ((typeof data == \"undefined\") ? \"\" : data) };\r\n        this.eventManager.trigger(eventName, eventData);    \r\n    }\r\n}\r\n\r\nriot.mixin('eventSystem', EventSystemMixin);\r\n",
    "//A place to put any constants and magic numbers\r\n//that will ensure they're kept constant and immutable\r\n\r\nfunction Constants() {\r\n    var DISTANCE_CUTOFF = 200;  //Distance in kms a player needs to be within to be considered at a venue\r\n    var AVAILABLE_PLAYERS_PER_PAGE = 20;\r\n    var SCOREBOARD_ENTRY_CUTOFF = 10;\r\n    var LOBBY_GAMES_PER_PAGE = 1000;\r\n    var GUID_EMPTY = \"00000000-0000-0000-0000-000000000000\";\r\n\r\n    var SPORT_DETAILS = [\r\n        {\r\n            Id: 1000,\r\n            Name: \"AustralianRules\",\r\n            Abbreviation: \"AFL\"\r\n        },\r\n        {\r\n            Id: 2000,\r\n            Name: \"RugbyLeague\",\r\n            Abbreviation: \"NRL\"\r\n        },\r\n        {\r\n            Id: 3000,\r\n            Name: \"Soccer\",\r\n            Abbreviation: \"SOC\"\r\n        }\r\n    ];\r\n\r\n    var COMP_DETAILS = [\r\n        {\r\n            Id: 999990,\r\n            Name: \"Venue Game\",\r\n            Abbreviation: \"VENUE\"\r\n        },\r\n        {\r\n            Id: 999999,\r\n            Name: \"Home Game\",\r\n            Abbreviation: \"HOME\"\r\n        },\r\n        {\r\n            Id: 171412,\r\n            Name: \"Sports Pick\",\r\n            Abbreviation: \"SPORTSPICK\"\r\n        }\r\n    ];\r\n\r\n    this.ControlType = {\r\n        \"Input\": 0,\r\n        \"Select\": 1,\r\n        \"CheckBox\": 2,\r\n        \"Option\": 3,\r\n        \"SelectGuid\": 4,\r\n        \"TextArea\": 5,\r\n        \"Label\": 6,\r\n        \"ClassPicker\": 7,\r\n        \"Buttons\": 8,\r\n        \"LabelSecure\": 9,\r\n        \"Hidden\": 10,\r\n        \"Radio\": 11,\r\n        \"List\": 12,\r\n        \"CoCurric\": 13,\r\n        \"Information\": 14,\r\n        \"InputSelect\": 15,\r\n        \"LabelToggle\": 16,\r\n        \"UTCDate\": 17,\r\n        \"Number\": 18,\r\n        \"Password\": 19,\r\n        \"HyperLink\": 20,\r\n        \"TwoArray\": 21,\r\n        \"Time\" : 22,\r\n        \"Duration\": 23,\r\n        \"SelectorInArray\": 24,\r\n        \"LabelInArray\": 25,\r\n        \"InputSelectInArray\": 26,\r\n        \"Date\": 27,\r\n        \"TimeInArray\": 28,\r\n        \"DurationInArray\": 29,\r\n        \"LabelMulti\": 30,\r\n        \"CheckBoxMulti\": 31,\r\n        \"LabelInfo\": 32,\r\n        \"LabelDateTime\": 33,\r\n        \"InputDateTime\": 34,\r\n        \"GenericPickerEdit\": 35,\r\n        \"CheckBoxBalance\": 36,\r\n        \"InputSelector\": 37,\r\n        \"HiddenInArray\": 38,\r\n        \"LabelAlert\": 39,\r\n        \"Qualifications\": 40,\r\n        \"StaffIntentions\": 41,\r\n        \"FormMemberSelector\": 42,\r\n        \"CheckBoxReport\": 43,\r\n        \"LabelDateTimeReport\": 44,\r\n        \"PreviouslyTaught\": 45,\r\n        \"LabelHover\": 46,\r\n        \"InputNewSelect\": 47,\r\n        \"InputNewEdit\": 48,\r\n        \"InputDate\": 49,\r\n        \"Matthew\": 50,\r\n        \"InputEnhancedInArray\": 51,\r\n        \"CheckBoxRowRefresh\": 52,\r\n        \"InputTime\": 53,\r\n        \"LabelTime\": 54,\r\n        \"InputOptionList\": 55,\r\n        \"LabelDateSerial\": 56,\r\n        \"LabelDecimal\": 57,\r\n        \"LabelBarHoriz\": 58,\r\n        \"CheckBoxList\": 59,\r\n        \"FormDesiredFTE\": 60,\r\n        \"SelectGuidDependant\": 61,\r\n        \"PreferenceLive\": 62,\r\n        \"PreferenceReserve\": 63,\r\n        \"InputHalfPage\": 64,\r\n        \"TableDataGrid\": 65,\r\n        \"LabelPopup\": 66,\r\n        \"InputNewSelectV2\": 67,\r\n        \"PreselectionPicker\": 68,\r\n        \"ApprovalStatus\": 69,\r\n        \"RadioInlineGroup\": 70,\r\n        \"LabelStringReOrder\": 71,\r\n        \"InputNumberShuffle\": 72,\r\n        \"LabelWarning\": 73,\r\n        \"InputObjectInArray\": 74,\r\n        \"CheckBoxLive\": 75,\r\n        \"OptionListLive\": 76,\r\n        \"PrimaryKey\": 77,\r\n        \"LabelHyperLink\": 78,\r\n        \"LabelButton\": 79,\r\n        \"SelectGuidCrudMulti\": 80,\r\n        \"ButtonInlineCrud\": 81,\r\n        \"SelectInt\": 82\r\n    };\r\n\r\n    this.ReportMode = {\r\n        \"Render\": 0, \"Report\": 1, \"RenderAndReport\": 2, \"NoRender\": 3, \"RenderAndEdit\": 4, \"ReportAndEdit\": 5, \"RenderAndReportEdit\": 6, \"EditOnly\": 7 };\r\n    this.AdminLevel = { \"TCH\": 0, \"STU\": 30, \"STF\": 50, \"FAC\": 100, \"COR\": 110, \"LRO\": 120, \"ERO\": 150, \"TTN\": 200, \"TTT\": 250, \"SUP\": 300, \"SUPG\": 400 };\r\n    this.Action = {\r\n        \"Edit\": 0,\r\n        \"Insert\": 1,\r\n        \"Copy\": 2,\r\n        \"Delete\": 3,\r\n        \"Cancel\": 4, \r\n        \"Save\": 5,\r\n        \"Create\": 6,\r\n        \"Toggle\": 7,\r\n        \"GroupToggle\": 8,\r\n        \"GridJoin\": 9,\r\n        \"DeletePersist\": 10,\r\n        \"LabelToggle\": 11,\r\n        \"EditOverride\": 12,\r\n        \"MultiToggle\": 13,\r\n        \"MultiGroupToggle\": 14,\r\n        \"InputChange\": 15,\r\n        \"DeleteAll\": 16,\r\n        \"Fetch\": 17,\r\n        \"Rebuild\": 18,\r\n        \"Build\": 19,\r\n        \"Up\": 20,\r\n        \"Down\": 21,\r\n        \"EditPageRefresh\": 22,\r\n        \"DeletePageRefresh\": 23,\r\n        \"Process\": 24,\r\n        \"DeletePartial\": 25,\r\n        \"DiscardChange\": 26,\r\n        \"CallApi\": 27,\r\n        \"InlineRadioChange\": 28\r\n    };\r\n\r\n    this.EditMode = {\r\n        \"Edit\": true,\r\n        \"ReadOnly\": false\r\n    };\r\n\r\n    this.InputType = {\r\n        \"Mouse\": 0,\r\n        \"TouchScreen\": 1\r\n    };\r\n\r\n    this.DirectionAction = {\r\n        \"Reset\": 0,\r\n        \"ShiftUp\": 1,\r\n        \"ShiftDown\": 2\r\n    };\r\n\r\n    this.PickerResponse = {\r\n        \"TeacherPickerData\": 0,\r\n        \"GetTeacherStats\": 1,\r\n        \"TeacherFormData\": 2,\r\n        \"PreviouslyTaught\": 3\r\n    }\r\n\r\n    this.MatrixTicks = {\r\n        \"NoAccess\": 0,\r\n        \"ReadOnlyAccess\": 1,\r\n        \"EditAccess\": 2,\r\n        \"EditAccessFilters\": 3,\r\n        \"Hidden\": 4,\r\n        \"HiddenFilters\": 5\r\n    };\r\n\r\n    this.FilterElementType = {\r\n        \"Input\": 0,\r\n        \"CheckBox\": 1,\r\n        \"RadioButton\": 2\r\n    };\r\n\r\n    this.FormSource = {\r\n        \"Admin\": 0,\r\n        \"Template\": 1,\r\n        \"Stats\": 2\r\n    };\r\n\r\n    this.FormState = {\r\n        \"Pending\": 0,\r\n        \"Open\": 1,\r\n        \"Closed\": 2,\r\n        \"NotActive\": 3\r\n    };\r\n\r\n    this.Operation = {\r\n        \"Get\": 0,\r\n        \"Set\": 1\r\n    };\r\n\r\n    this.GridV2Type = {\r\n        \"Current\": 0,\r\n        \"Planner\": 1,\r\n        \"Future\": 2,\r\n        \"StaffLoadsCurrent\": 3,\r\n        \"StaffLoadsPlanner\": 4,\r\n        \"SubjectAllocationsCurrent\": 5,\r\n        \"SubjectAllocationsPlanner\": 6,\r\n        \"StaffAllocationsCurrent\": 7,\r\n        \"StaffAllocationsPlanner\": 8,\r\n        \"StaffAllocationsCurrentFTE\": 9,\r\n        \"StaffAllocationsPlannerFTE\": 10,\r\n        \"PlannerGridClasses\": 11,\r\n        \"PlannerGridAllow\": 12,\r\n        \"PlannerGridUnder\": 13,\r\n        \"GridDevClass\": 14,\r\n        \"GridDevLoads\": 15,\r\n        \"GridCurrentClasses\": 16,\r\n        \"GridCurrentAllow\": 17,\r\n        \"GridCurrentUnder\": 18,\r\n\r\n        \"SubjectAllocationsCurrentSubject\": 19,\r\n        \"SubjectAllocationsCurrentAllow\": 20,\r\n        \"SubjectAllocationsCurrentUnder\": 21,\r\n\r\n        \"StaffAllocationsCurrentSubject\": 22,\r\n        \"StaffAllocationsCurrentAllow\": 23,\r\n        \"StaffAllocationsCurrentUnder\": 24,\r\n\r\n        \"SubjectAllocationsPlannerSubject\": 25,\r\n        \"SubjectAllocationsPlannerAllow\": 26,\r\n        \"SubjectAllocationsPlannerUnder\": 27,\r\n\r\n        \"StaffAllocationsPlannerSubject\": 28,\r\n        \"StaffAllocationsPlannerAllow\": 29,\r\n        \"StaffAllocationsPlannerUnder\": 30,\r\n\r\n        \"YardDutyReport\": 31,\r\n        \"YardDutyList\": 32,\r\n        \"TimeTableReport\": 33\r\n\r\n    };\r\n\r\n    this.SubjectsAdminTableType = {\r\n        \"Subjects\": 0,\r\n        \"SubjectsMain\": 1,\r\n        \"SubjectsPlanner\": 2,\r\n        \"SubjectsAllowance\": 3,\r\n        \"SubjectsWebPrefs\": 4,\r\n        \"SubjectsWebPrefsReview\": 5,\r\n        \"SubjectsMainSubject\": 6,\r\n        \"SubjectsMainAllowance\": 7,\r\n        \"SubjectsMainUnder\": 8,\r\n        \"SubjectsRequiringApproval\": 9,\r\n        \"SubjectsMainUnallocated\": 10\r\n    };\r\n\r\n    this.PlannerType = {\r\n        \"PlannerManagement\": 0,\r\n        \"PlannerAssign\": 1,\r\n        \"PlannerAssignAllow\": 2,\r\n        \"GridDuration\": 3,\r\n        \"GridDevMain\": 4\r\n    };\r\n\r\n    this.PopupType = {\r\n        \"TableFilters\": true,\r\n        \"TableViews\": false\r\n    };\r\n\r\n    this.ViewMode = {\r\n        \"ApplyFilters\": 0,\r\n        \"FetchFilters\": 1\r\n    };\r\n\r\n    this.RecommendationsApproverTypes = {\r\n        \"ApproverTypes\": 0,\r\n        \"FacultyLeaders\": 1,\r\n        \"OtherApprovers\": 2\r\n    };\r\n\r\n    this.ReportWizardType = {\r\n        \"GridReports\": 0,\r\n        \"AllowanceReports\": 1\r\n    };\r\n\r\n    this.WizardState = {\r\n        \"NoColour\": 0,\r\n        \"NotAvailable\": 1,\r\n        \"Mandatory\": 2,\r\n        \"Changes\": 3,\r\n        \"Clean\": 4,\r\n        \"AlwaysAvailable\": 5\r\n    };\r\n\r\n    //Define accessors for the above constants\r\n    this.getDistanceCutoff = function () {\r\n\r\n        var thishost = window.location.hostname;\r\n\r\n        // if they have entered an IP Address, force the distance to 200 meters\r\n        splitUrl = thishost.split(\".\");\r\n        if (!isNaN(splitUrl[0]))\r\n            return 0.2;\r\n\r\n        if (thishost === 'demo.coachkings.com.au' || thishost === 'home.coachkings.com.au')\r\n            return 50000; // Basically this disables GeoLocation lockout  \r\n\r\n        if (thishost === 'staging.coachkings.com.au')\r\n            return 50000; // Basically this disables GeoLocation lockout\r\n\r\n        // if they have entered production domains, force the distance to 200 meters\r\n        if (thishost === 'www.coachkings.com.au' || thishost === 'coachkings.com.au' || thishost === 'awseb-e-y-awsebloa-13af5ooz9x7a1-19706898.ap-southeast-2.elb.amazonaws.com')\r\n            return 50000; // Basically this disables GeoLocation lockout\r\n\r\n        return DISTANCE_CUTOFF;\r\n    };\r\n     \r\n    this.resolve = function (path, obj = self, separator = '.') {\r\n        var properties = Array.isArray(path) ? path : path.split(separator);\r\n        return properties.reduce((prev, curr) => prev && prev[curr], obj);\r\n    };\r\n\r\n    this.capitalizeFirstLetter = function (string) {\r\n        return string.charAt(0).toUpperCase() + string.slice(1);\r\n    };\r\n\r\n    this.delayWithCallback = function (callback, delay) {\r\n        var timer = setTimeout(function () {\r\n            callback.bind(this);\r\n            callback();\r\n        }, delay);\r\n    };\r\n\r\n    this.getAvailablePlayersPerPage = function () {\r\n        return AVAILABLE_PLAYERS_PER_PAGE;\r\n    };\r\n\r\n    this.getScoreboardEntryCutoff = function () {\r\n        return SCOREBOARD_ENTRY_CUTOFF;\r\n    }\r\n\r\n    this.getLobbyGamesPerPage = function () {\r\n        return LOBBY_GAMES_PER_PAGE;\r\n    }\r\n\r\n    this.ConvertToUSDate = function (AusDate) {\r\n        var SplitDate = AusDate.split(\"/\");\r\n        return SplitDate[1] + \"/\" + SplitDate[0] + \"/\" + SplitDate[2];\r\n    }\r\n\r\n    this.GetDDMMYYYYDate = function (DateTime) {\r\n        const yyyy = DateTime.getFullYear();\r\n        const mm = String(DateTime.getMonth() + 1).padStart(2, '0');\r\n        const dd = String(DateTime.getDate()).padStart(2, '0');\r\n\r\n        return dd + '/' + mm + '/' + yyyy;\r\n    }\r\n\r\n    function getDate_yyyymmdd() {\r\n\r\n        const date = new Date();\r\n\r\n        const yyyy = date.getFullYear();\r\n        const mm = String(date.getMonth() + 1).padStart(2, '0');\r\n        const dd = String(date.getDate()).padStart(2, '0');\r\n\r\n        return `${yyyy}${mm}${dd}`\r\n    }\r\n\r\n\r\n    this.GuidEmpty = function () {\r\n        return GUID_EMPTY;\r\n    }\r\n\r\n    this.RandGuid = function createGuid() {\r\n        function S4() {\r\n            return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);\r\n        }\r\n        return (S4() + S4() + \"-\" + S4() + \"-4\" + S4().substr(0, 3) + \"-\" + S4() + \"-\" + S4() + S4() + S4()).toLowerCase();\r\n    }  \r\n\r\n    this.saveCookie = function (key, value, expiryInDays) {\r\n        var expiryOffset = (expiryInDays * 24 * 60 * 60 * 1000);\r\n        var expires = new Date();\r\n        expires.setTime(expires.getTime() + expiryOffset);\r\n        var expiresStr = ';expires=' + expires.toUTCString();\r\n        document.cookie = key + '=' + value + expiresStr + '; path=/';\r\n    }\r\n\r\n    this.getCookie = function (key) {\r\n        var name = key + \"=\";\r\n        var ca = document.cookie.split(';');\r\n        for (var i = 0; i < ca.length; i++) {\r\n            var c = ca[i];\r\n            while (c.charAt(0) === ' ') {\r\n                c = c.substring(1);\r\n            }\r\n            if (c.indexOf(name) === 0) {\r\n                return c.substring(name.length, c.length);\r\n            }\r\n        }\r\n        return \"\";\r\n    }\r\n\r\n}\r\n\r\nmodule.exports = new Constants();\r\n",
    "//An event manager that tags can use to subscribe to events, and then be notified\r\n//when other tags publish that event\r\n//\r\n//NOTE: You shouldn't need to ever use or instantiate this EventManager manually, it\r\n//is used by the eventSystem mixin\r\nvar riot = require('riot');\r\n\r\n\r\n//Not much functionality really needed in here, because we just use\r\n//riot's observable interface to do all the event registration and triggering\r\nfunction EventManager() {\r\n    riot.observable(this);\r\n}\r\n\r\n\r\nmodule.exports = new EventManager();",
    "var riot = require('riot');\r\n\r\nvar TTHeader = require('./TimeTablerCommon/Common/TTHeader.tag');\r\nvar TTFooter = require('./TimeTablerCommon/Common/TTFooter.tag');\r\nvar TTcommonPopupGeneric = require('./TimeTablerCommon/Common/TTcommonPopupGeneric.tag'); \r\n\r\nvar SDHomePage = require('./TimeTablerCommon/Home/SDHomePage.tag'); \r\nvar SDNewHomePage = require('./TimeTablerCommon/Home/SDNewHomePage.tag');\r\nvar SDNewHomePageWorkShop = require('./TimeTablerCommon/Home/SDNewHomePageWorkShop.tag');\r\n\r\nvar Maintenance = require('./TimeTablerCommon/Home/Maintenance.tag');\r\n\r\n//var SDAboutUs = require('./TimeTabler/AboutUs/SDAboutUs.tag'); \r\nvar SDContactUs = require('./TimeTabler/AboutUs/SDContactUs.tag');\r\nvar SDMedia = require('./TimeTabler/AboutUs/SDMedia.tag'); \r\n\r\nvar Login = require('./TimeTablerCommon/Login/TTLogin.tag');\r\nvar SDSignUp = require('./TimeTablerCommon/Login/SDSignUp.tag');\r\n\r\nvar popup = require('./introTags/aboutUs/TTContactUsPopupNotify.tag');\r\nvar ManualSectionOne = require('./TimeTabler/CustomerManuals/ManualSectionOne.tag');\r\nvar UserAgreementsPage = require('./TimeTabler/UserAgreements/UserAgreementsPage.tag');\r\nvar SDExpressPage = require('./TimeTabler/SDExpress/SDExpressPage.tag');\r\nvar PrivacySection = require('./TimeTabler/UserAgreements/PrivacySection.tag');\r\nvar SecuritySection = require('./TimeTabler/UserAgreements/SecuritySection.tag');\r\nvar ServiceLevelsPage = require('./TimeTabler/UserAgreements/ServiceLevelsPage.tag');\r\nvar TroubleshootingGuidePage = require('./TimeTabler/UserAgreements/TroubleshootingGuidePage.tag');\r\nvar MatrixGoldCalculator = require('./TimeTabler/Packages/MatrixGoldCalculator.tag');\r\nvar CoreBundleCalculator = require('./TimeTabler/Packages/CoreBundleCalculator.tag');\r\nvar SampleLicenceAgreement = require('./TimeTabler/UserAgreements/SampleLicenceAgreement.tag');\r\nvar eventSystemMixin = require('./mixins/eventsystem.js');\r\n\r\nriot.mount('*');\r\n"
  ]
}