{
  "information": {
    "Title": "Arrange_Pupill_Math_Simulation",
    "Author": [
      "kangRui",
      "meiYoke",
      "looKang"
    ],
    "AuthorLogo": [
      "",
      "",
      ""
    ],
    "Password": "unused",
    "Keywords": "",
    "Abstract": "",
    "Copyright": "",
    "Level": "",
    "Language": "",
    "Logo": [
      "./Screenshot2025-09-12083359.png"
    ],
    "RunAlways": "true",
    "ModelTab": "",
    "ModelTabTitle": "",
    "ModelName": "",
    "FixedNavigationBar": "false",
    "CSSFile": "",
    "DetectedFiles": [
      "./Screenshot2025-09-12083359.png"
    ],
    "AuxiliaryFiles": [
      "",
      "./lib/xapiwrapper.min.js"
    ],
    "HTMLHead": "<style type=\"text/css\">\n.metadata { display: none; }\n</style>",
    "SaveInXMLFormat": "false",
    "IncludeSource": "true",
    "IncludeLibrary": "true",
    "UglifyJS": "false",
    "PreviewFullModel": "false",
    "UseInterpreter": "true",
    "UseDeltaForODE": "false"
  },
  "description": {
    "pages": []
  },
  "model": {
    "variables": {
      "pages": [
        {
          "Name": "Var Table 1",
          "Active": "true",
          "Internal": "false",
          "Type": "undefined",
          "PageComment": "",
          "Variables": [
            {
              "Name": "scenarios",
              "Value": "{}",
              "Type": "Object",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "pupils",
              "Value": "[]",
              "Type": "Object",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "selectedScenario",
              "Value": "\"Demonstration\"",
              "Type": "String",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "roomX",
              "Value": "[]",
              "Type": "Object",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "roomY",
              "Value": "[]",
              "Type": "Object",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "pupilX",
              "Value": "[]",
              "Type": "Object",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "pupilY",
              "Value": "[]",
              "Type": "Object",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "roomImage",
              "Value": "[]",
              "Type": "Object",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "pupilImage",
              "Value": "[]",
              "Type": "Object",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "roomText",
              "Value": "[]",
              "Type": "double",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "textX",
              "Value": "[]",
              "Type": "double",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "textY",
              "Value": "[]",
              "Type": "double",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "selectedPupil",
              "Value": "-1",
              "Type": "double",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "pastAttemptsByScenario",
              "Value": "{}",
              "Type": "Object",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "totalScore",
              "Value": "0",
              "Type": "double",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "",
              "Value": "",
              "Type": "double",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            }
          ]
        },
        {
          "Name": "Var Table 2",
          "Active": "true",
          "Internal": "false",
          "Type": "VARIABLE_EDITOR",
          "PageComment": "",
          "Variables": [
            {
              "Name": "scenarioStartTime",
              "Value": "\"\"",
              "Type": "String",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "score",
              "Value": "0",
              "Type": "int",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            },
            {
              "Name": "",
              "Value": "",
              "Type": "double",
              "Dimension": "",
              "Comment": "",
              "Domain": ""
            }
          ]
        }
      ]
    },
    "initialization": {
      "pages": [
        {
          "Name": "scenarios",
          "Active": "true",
          "Internal": "false",
          "Type": "undefined",
          "Comment": "",
          "Code": "scenarios  = {\n    \"Demonstration\": {\n        scenario: \"There are 7 pupils and there are 2 rooms. Each room cannot take more than 4 pupils.<br/>How should I arrange the pupils in each room?\",\n        pupils: 7,\n        rooms: [\n          {\n            room: \"Music Room\",\n            image: \"Music-Room.png\",\n            max: 4,\n            min: 1,\n          },\n          {\n            room: \"Classroom\",\n            image: \"Class-Room.png\",\n            max: 4,\n            min: 1,\n          },\n        ],\n    },\n    \"Task A\": {\n        scenario: \"There are 16 pupils and there are 4 rooms. Each room cannot take more than 4 pupils.<br/>How should I arrange the pupils in each room?\",\n        pupils: 16,\n        rooms: [\n          {\n            room: \"Music Room\",\n            image: \"Music-Room.png\",\n            max: 4,\n            min: 1,\n          },\n          {\n            room: \"Classroom\",\n            image: \"Class-Room.png\",\n            max: 4,\n            min: 1,\n          },\n          {\n            room: \"Computer Room\",\n            image: \"Computer-Room.png\",\n            max: 4,\n            min: 1,\n          },\n          {\n            room: \"Art Room\",\n            image: \"Math-Room.png\",\n            max: 4,\n            min: 1,\n          },\n        ],\n    },\n     \"Task B\": {\n        scenario: \"There are 18 pupils and there are 5 rooms. Each room cannot take more than 4 pupils.<br/>How should I arrange the pupils in each room?<br/>Find as many ways to arrange the students.\",\n        pupils: 18,\n        rooms: [\n          {\n            room: \"Music Room\",\n            image: \"Music-Room.png\",\n            max: 4,\n            min: 1,\n          },\n          {\n            room: \"Classroom\",\n            image: \"Class-Room.png\",\n            max: 4,\n            min: 1,\n          },\n          {\n            room: \"Computer Room\",\n            image: \"Computer-Room.png\",\n            max: 4,\n            min: 1,\n          },\n          {\n            room: \"Art Room\",\n            image: \"Art-Room.png\",\n            max: 4,\n            min: 1,\n          },\n          {\n            room: \"Math Room\",\n            image: \"Math-Room.png\",\n            max: 4,\n            min: 1,\n          },\n        ],\n    }\n}"
        },
        {
          "Name": "pupils",
          "Active": "true",
          "Internal": "false",
          "Type": "CODE_EDITOR",
          "Comment": "",
          "Code": "pupils = [\n    {\n        image: \"Chinese-Female.png\",\n    },\n    {\n        image: \"Chinese-Male.png\",\n    },\n    {\n        image: \"Eurasian-Female.png\",\n    },\n    {\n        image: \"Eurasian-Male.png\",\n    },\n    {\n        image: \"Indian-Female.png\",\n    },\n    {\n        image: \"Indian-Male.png\",\n    },\n    {\n        image: \"Malay-Female.png\",\n    },\n    {\n        image: \"Malay-Male.png\",\n    },\n    {\n        image: \"Chinese-Female.png\",\n    },\n    {\n        image: \"Chinese-Male.png\",\n    },\n    {\n        image: \"Eurasian-Female.png\",\n    },\n    {\n        image: \"Eurasian-Male.png\",\n    },\n    {\n        image: \"Indian-Female.png\",\n    },\n    {\n        image: \"Indian-Male.png\",\n    },\n    {\n        image: \"Malay-Female.png\",\n    },\n    {\n        image: \"Malay-Male.png\",\n    },\n        {\n        image: \"Chinese-Female.png\",\n    },\n    {\n        image: \"Chinese-Male.png\",\n    },\n]"
        },
        {
          "Name": "init",
          "Active": "true",
          "Internal": "false",
          "Type": "CODE_EDITOR",
          "Comment": "",
          "Code": "initRooms();\ninitPupils();"
        }
      ]
    },
    "evolution": {
      "information": {
        "FPS": "20",
        "SPD": "1",
        "RealTimeVariable": "",
        "Autoplay": "true"
      },
      "pages": []
    },
    "fixed_relations": {
      "pages": []
    },
    "custom": {
      "pages": [
        {
          "Name": "initFunctions",
          "Active": "true",
          "Internal": "false",
          "Type": "undefined",
          "Comment": "",
          "Code": "function initRooms() {\n    scenarios[selectedScenario].rooms.forEach(room => room.count = 0);\n    scenarios[selectedScenario].rooms.forEach(room => room[\"Chinese-Female.png\"] = 0);\n    scenarios[selectedScenario].rooms.forEach(room => room[\"Chinese-Male.png\"] = 0);\n    scenarios[selectedScenario].rooms.forEach(room => room[\"Eurasian-Female.png\"] = 0);\n    scenarios[selectedScenario].rooms.forEach(room => room[\"Eurasian-Male.png\"] = 0);\n    scenarios[selectedScenario].rooms.forEach(room => room[\"Malay-Female.png\"] = 0);\n    scenarios[selectedScenario].rooms.forEach(room => room[\"Malay-Male.png\"] = 0);\n    scenarios[selectedScenario].rooms.forEach(room => room[\"Indian-Female.png\"] = 0);\n    scenarios[selectedScenario].rooms.forEach(room => room[\"Indian-Male.png\"] = 0);\n    roomX = [];\n    roomY = [];\n    roomImage = [];\n    textX = [];\n    textY = [];\n    roomText = [];\n\n    let numOfRooms = scenarios[selectedScenario].rooms.length;\n    let currentY = 0.85;  \n    let roomIndex = 0;\n\n    while (roomIndex < numOfRooms) {\n        let roomsInRow = Math.min(3, numOfRooms - roomIndex);\n        let xCoords;\n\n        if (roomsInRow === 1) {\n            xCoords = [0.5];  \n        } else if (roomsInRow === 2) {\n            xCoords = [0.3, 0.7]; \n        } else {\n            xCoords = [0.15, 0.5, 0.85]; \n        }\n\n        for (let i = 0; i < roomsInRow; i++) {\n            roomX.push(xCoords[i]);\n            roomY.push(currentY);\n            scenarios[selectedScenario].rooms[roomIndex].x = xCoords[i];\n            scenarios[selectedScenario].rooms[roomIndex].y = currentY;\n            roomImage.push(\"./rooms/\" + scenarios[selectedScenario].rooms[roomIndex].image);  \n            textX.push(xCoords[i]);\n            textY.push(currentY - 0.15);\n            roomText.push(scenarios[selectedScenario].rooms[roomIndex].room);\n            roomIndex++;\n        }\n\n        currentY -= 0.3;\n    }\n}\n\nfunction initPupils() {\n    pupils.forEach(pupil => pupil.room = '');\n    pupilX = [];\n    pupilY = [];\n    pupilImage = [];\n\n    let numOfPupils = scenarios[selectedScenario].pupils;\n    let currentY = 0.25;\n    let pupilIndex = 0;\n\n\n   while (pupilIndex < numOfPupils) {\n        let pupilsInRow = Math.min(9, numOfPupils - pupilIndex);  \n        let xCoords = [];\n    \n        for (let i = 0; i < pupilsInRow; i++) {\n            xCoords.push((i + 1) / 10);  \n        }\n    \n        for (let i = 0; i < pupilsInRow; i++) {\n            pupilX.push(xCoords[i]);\n            pupilY.push(currentY);\n            pupils[pupilIndex].x = xCoords[i];\n            pupils[pupilIndex].y = currentY;\n            pupilImage.push(\"./pupils/\" + pupils[pupilIndex].image);  \n            pupilIndex++;\n        }\n    \n        currentY -= 0.15; \n    }\n}"
        },
        {
          "Name": "onRelease",
          "Active": "true",
          "Internal": "false",
          "Type": "CODE_EDITOR",
          "Comment": "",
          "Code": "function onRelease(x, y, index) {\n    let rooms = scenarios[selectedScenario].rooms;\n    let currentRoomName = pupils[index].room;\n\n    // console.log(scenarios[selectedScenario].rooms);\n    \n    if (currentRoomName) {\n        for (let i = 0; i < rooms.length; i++) {\n            let room = rooms[i];\n            let roomX = room.x;\n            let roomY = room.y;\n            let halfSize = 0.15;\n\n            if (room.room === currentRoomName && x >= roomX - halfSize && x <= roomX + halfSize && y >= roomY - halfSize && y <= roomY + halfSize) {\n                return;\n            }\n        }\n\n        for (let i = 0; i < rooms.length; i++) {\n            if (rooms[i].room === currentRoomName && rooms[i].hasOwnProperty('count')) {\n                rooms[i].count -= 1;\n                rooms[i][pupils[index].image] -= 1;\n                pupils[index].room = '';\n                break;\n            }\n        }\n    }\n\n    for (let i = 0; i < rooms.length; i++) {\n        let room = rooms[i];\n        let roomX = room.x;\n        let roomY = room.y;\n        let halfSize = 0.15;\n\n        if (x >= roomX - halfSize && x <= roomX + halfSize && y >= roomY - halfSize && y <= roomY + halfSize) {\n            if (!room.hasOwnProperty('count')) {\n                room.count = 0;\n                room[pupils[index].image] = 0;\n            }\n\n            pupils[index].room = room.room;\n            room.count += 1;\n            room[pupils[index].image] += 1;\n        }\n    }\n}\n"
        },
        {
          "Name": "check",
          "Active": "true",
          "Internal": "false",
          "Type": "CODE_EDITOR",
          "Comment": "",
          "Code": "function check() {\n    let currentAttempt = [];\n    let checkCount = 0;\n    \n    // scenarios[selectedScenario].rooms.forEach(room => {\n    //     checkCount += room.count;\n    //     currentAttempt.push(`${room.room}: ${room.count} pupils`);\n    // });\n    \n    scenarios[selectedScenario].rooms.forEach(room => {\n        checkCount += room.count;\n    \n        const pupilDescriptions = [];\n    \n        for (const [key, value] of Object.entries(room)) {\n            if (key.endsWith(\".png\") && value > 0) {\n                const [ethnicity, genderWithExt] = key.split(\"-\");\n                const gender = genderWithExt.replace(\".png\", \"\");\n                const shortCode = ethnicity[0] + gender[0]; // e.g. Chinese Female \u2192 CF\n                pupilDescriptions.push(`${value} ${shortCode}`);\n            }\n        }\n    \n        if (pupilDescriptions.length > 0) {\n            currentAttempt.push(`${room.room}: ${pupilDescriptions.join(\", \")}`);\n        }\n    });\n\n    \n    if (!pastAttemptsByScenario[selectedScenario]) {\n        pastAttemptsByScenario[selectedScenario] = {\n            attemptsTakenToComplete: 0,\n            completed: false,\n            log: [],\n            timeTakenToComplete: \"Did not complete\"\n          };\n      }\n      \n    if (!pastAttemptsByScenario[selectedScenario].completed) {\n        pastAttemptsByScenario[selectedScenario].attemptsTakenToComplete += 1;\n    }\n    \n    pastAttemptsByScenario[selectedScenario].log.push({\n        attempt: currentAttempt,\n        timeStamp: `${Math.floor((new Date() - scenarioStartTime) / 1000 / 60)}m ${Math.floor((new Date() - scenarioStartTime) / 1000 % 60)}s`,\n        correct: false\n    })\n     \n    try {\n        if (checkCount != scenarios[selectedScenario].pupils) {\n            alert(\"There is an error. Read the question again!\");\n            return;\n        }\n    \n        for (let room of scenarios[selectedScenario].rooms) {\n            if (room.count < room.min || room.count > room.max) {\n                alert(\"There is an error. Read the question again!\");\n                return;\n            }\n        }\n    \n        alert(\"Congrats! You did it, now try a different approach or a different task!\");\n        if (!pastAttemptsByScenario[selectedScenario].completed) {\n            pastAttemptsByScenario[selectedScenario].completed = true;\n            pastAttemptsByScenario[selectedScenario].timeTakenToComplete = pastAttemptsByScenario[selectedScenario].log[pastAttemptsByScenario[selectedScenario].log.length-1].timeStamp\n            score += 1;\n        }\n        \n        pastAttemptsByScenario[selectedScenario].log[pastAttemptsByScenario[selectedScenario].log.length-1].correct = true;\n        \n    } finally {\n        console.log(pastAttemptsByScenario);\n        let attemptLogHtml = '';\n        pastAttemptsByScenario[selectedScenario].log.forEach((log, index) => {\n        attemptLogHtml += 'Attempt ' + (index + 1) + \n        ': Pupils Arranged: ' + log.attempt.join(', ') + \n        '; Pupils were arranged ' + \n        (log.correct ? 'correctly' : 'incorrectly') + \n        '; Time Stamp: ' + log.timeStamp + '<br>';\n    });\n    \n    const feedback = \n      '<div>' +\n        '<div>' +\n          'Total Attempts Taken To Complete: ' + pastAttemptsByScenario[selectedScenario].attemptsTakenToComplete + '<br>' +\n          'Managed To Complete: ' + pastAttemptsByScenario[selectedScenario].completed + '<br>' +\n          'Total Time Taken to Complete: ' + pastAttemptsByScenario[selectedScenario].timeTakenToComplete + '<br><br>' +\n          'Attempt Log:<br>' +\n          attemptLogHtml +\n        '</div>' +\n      '</div>';\n        console.log(feedback)\n        console.log(score)\n        storeState({score, feedback});\n        reset();\n    }\n}\n\nfunction displayPastAnswers() {\n    const pastAnswersDiv = document.getElementById(\"pastAttempts\");\n    pastAnswersDiv.innerHTML = \"\";\n\n    for (let scenario in pastAttemptsByScenario) {\n        let scenarioDiv = document.createElement(\"div\");\n        scenarioDiv.innerHTML = `<h3 style=\"margin: 0; font-size: 18px; font-weight: bold;\">${scenario}:</h3>`;\n\n        let attemptsContainer = document.createElement(\"div\");\n        attemptsContainer.style.display = \"flex\";\n        attemptsContainer.style.flexWrap = \"wrap\";\n\n        pastAttemptsByScenario[scenario].forEach((attempt, index) => {\n            let attemptDiv = document.createElement(\"div\");\n            attemptDiv.innerHTML = `<strong style=\"font-size: 16px;\">Attempt ${index + 1}:</strong><br>${attempt.join('<br>')}`;\n            attemptDiv.style.padding = \"10px\";\n            attemptDiv.style.width = \"200px\";\n            attemptDiv.style.textAlign = \"left\";\n            attemptsContainer.appendChild(attemptDiv);\n        });\n\n        scenarioDiv.appendChild(attemptsContainer);\n        pastAnswersDiv.appendChild(scenarioDiv);\n    }\n}\n"
        },
        {
          "Name": "reset",
          "Active": "true",
          "Internal": "false",
          "Type": "CODE_EDITOR",
          "Comment": "",
          "Code": "function reset() {\n    initRooms();\n    initPupils();\n}"
        },
        {
          "Name": "xApi",
          "Active": "true",
          "Internal": "false",
          "Type": "CODE_EDITOR",
          "Comment": "",
          "Code": "// Using a namespace to prevent global variable clashes\nconst XAPIUtils = {\n  parameters: null, // Parameters store\n  getParameters: function () {\n    if (!this.parameters) { // Ensure fetch once\n      var urlParams = new URLSearchParams(window.location.search);\n      var endpoint = urlParams.get('endpoint');\n      var auth = urlParams.get('auth');\n      var agent = JSON.parse(urlParams.get('agent'));\n      var stateId = urlParams.get('stateId');\n      var activityId = urlParams.get('activityId');\n\n      // document.querySelector(\"#cookieId\").innerText = \"Cookie: \" + auth;\n      // document.querySelector(\"#questionId\").innerText = \"Question ID: \" + activityId;\n      // document.querySelector(\"#userId\").innerText = \"User ID: \" + stateId;\n\n      ADL.XAPIWrapper.changeConfig({\n        \"endpoint\": endpoint + \"/\",\n        \"auth\": `Basic ${auth}`\n      });\n      this.parameters = {\n        agent,\n        stateId,\n        activityId\n      };\n    }\n\n    return this.parameters;\n  }\n};\n\n// Immediately invoke getParameters on page load\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  XAPIUtils.getParameters(); // Fetch parameters once on load\n});\n\nfunction storeState(stateValue) { // Removed async\n  try {\n    const parameters = XAPIUtils.getParameters(); // Retrieve parameters from store\n    const activityId = parameters.activityId;\n    const stateId = parameters.stateId;\n    const agent = parameters.agent;\n    const registration = null;\n\n    ADL.XAPIWrapper.sendState(activityId, agent, stateId, registration, stateValue);\n    console.log(\"Submitted: \" + JSON.stringify(stateValue, null, 2));\n  } catch (err) {\n    console.error(\"An error has occurred!\", err);\n  }\n}\n\nfunction getState() {\n  try {\n    const parameters = XAPIUtils.getParameters(); // Retrieve parameters from store\n    const activityId = parameters.activityId;\n    const stateId = parameters.stateId;\n    const agent = parameters.agent;\n\n    const result = ADL.XAPIWrapper.getState(activityId, agent, stateId);\n    document.querySelector(\"#getState\").innerText = \"First Load State: \" + JSON.stringify(result, null, 2);\n    return result;\n  } catch (err) {\n    console.error(\"An error has occurred!\", err);\n    document.querySelector(\"#getState\").innerText = \"Error has occurred: \" + err;\n  }\n}\n"
        }
      ]
    },
    "elements": {
      "list": []
    }
  },
  "view": {
    "Tree": [
      {
        "Name": "wrapper",
        "Type": "Panel",
        "Expanded": "true",
        "Properties": [],
        "Children": [
          {
            "Name": "firstRow",
            "Type": "Panel",
            "Expanded": "true",
            "Properties": [
              {
                "name": "CSS",
                "value": "\"{\nmargin-bottom: 10px\n}\""
              }
            ],
            "Children": [
              {
                "Name": "currentScenario",
                "Type": "Label",
                "Properties": [
                  {
                    "name": "Text",
                    "value": "scenarios[selectedScenario].scenario"
                  }
                ]
              }
            ]
          },
          {
            "Name": "secondRow",
            "Type": "Panel",
            "Expanded": "true",
            "Properties": [
              {
                "name": "CSS",
                "value": "\"{ margin-bottom: 10px }\""
              }
            ],
            "Children": [
              {
                "Name": "selectScenario",
                "Type": "ComboBox",
                "Properties": [
                  {
                    "name": "Options",
                    "value": "[\"Demonstration\", \"Task A\", \"Task B\"]"
                  },
                  {
                    "name": "OnChange",
                    "value": "var opts = _view.selectScenario.getProperty(\"SelectedOptions\");  \nselectedScenario = (opts.length > 0)? opts[0]:\"\";\ninitRooms();\ninitPupils();\nscenarioStartTime = \"\";"
                  },
                  {
                    "name": "CSS",
                    "value": "\"{ margin-right: 10px }\""
                  }
                ]
              },
              {
                "Name": "check",
                "Type": "Button",
                "Properties": [
                  {
                    "name": "Text",
                    "value": "\"Check\""
                  },
                  {
                    "name": "OnPress",
                    "value": "check()"
                  },
                  {
                    "name": "CSS",
                    "value": "\"{ margin-right: 10px }\""
                  }
                ]
              },
              {
                "Name": "reset",
                "Type": "Button",
                "Properties": [
                  {
                    "name": "Text",
                    "value": "\"reset\""
                  },
                  {
                    "name": "OnPress",
                    "value": "reset();"
                  }
                ]
              }
            ]
          },
          {
            "Name": "plottingPanel",
            "Type": "PlottingPanel",
            "Expanded": "true",
            "Properties": [
              {
                "name": "Width",
                "value": "\"100%\""
              },
              {
                "name": "Height",
                "value": "\"70vh\""
              },
              {
                "name": "Enabled",
                "value": "true"
              },
              {
                "name": "Gutters",
                "value": "[0,0,0,0]"
              },
              {
                "name": "AutoScaleY",
                "value": "false"
              },
              {
                "name": "AutoScaleX",
                "value": "false"
              },
              {
                "name": "MaximumX",
                "value": "1"
              },
              {
                "name": "MinimumX",
                "value": "0"
              },
              {
                "name": "MinimumY",
                "value": "0"
              },
              {
                "name": "MaximumY",
                "value": "1"
              },
              {
                "name": "XAutoTicks",
                "value": "false"
              },
              {
                "name": "GridXShow",
                "value": "false"
              },
              {
                "name": "YAutoTicks",
                "value": "false"
              },
              {
                "name": "GridYShow",
                "value": "false"
              },
              {
                "name": "AxisXShow",
                "value": "false"
              },
              {
                "name": "AxisYShow",
                "value": "false"
              }
            ],
            "Children": [
              {
                "Name": "roomSets",
                "Type": "ImageSet2D",
                "Properties": [
                  {
                    "name": "NumberOfElements",
                    "value": "scenarios[selectedScenario].rooms.length"
                  },
                  {
                    "name": "Sensitivity",
                    "value": "0"
                  },
                  {
                    "name": "SizeX",
                    "value": "0.3"
                  },
                  {
                    "name": "SizeY",
                    "value": "0.3"
                  },
                  {
                    "name": "X",
                    "value": "roomX"
                  },
                  {
                    "name": "Y",
                    "value": "roomY"
                  },
                  {
                    "name": "ImageUrl",
                    "value": "roomImage"
                  }
                ]
              },
              {
                "Name": "roomNameSets",
                "Type": "TextSet2D",
                "Properties": [
                  {
                    "name": "NumberOfElements",
                    "value": "scenarios[selectedScenario].rooms.length"
                  },
                  {
                    "name": "X",
                    "value": "textX"
                  },
                  {
                    "name": "Y",
                    "value": "textY"
                  },
                  {
                    "name": "Text",
                    "value": "roomText"
                  }
                ]
              },
              {
                "Name": "pupilSets",
                "Type": "ImageSet2D",
                "Properties": [
                  {
                    "name": "NumberOfElements",
                    "value": "scenarios[selectedScenario].pupils"
                  },
                  {
                    "name": "X",
                    "value": "pupilX"
                  },
                  {
                    "name": "Y",
                    "value": "pupilY"
                  },
                  {
                    "name": "EnabledPosition",
                    "value": "\"ENABLED_ANY\""
                  },
                  {
                    "name": "ImageUrl",
                    "value": "pupilImage"
                  },
                  {
                    "name": "ElementInteracted",
                    "value": "selectedPupil"
                  },
                  {
                    "name": "OnRelease",
                    "value": "onRelease(pupilX[selectedPupil], pupilY[selectedPupil],selectedPupil)"
                  },
                  {
                    "name": "OnPress",
                    "value": "if (!scenarioStartTime){\nscenarioStartTime= new Date();\n    console.log(`Timer started for ${selectedScenario} at ${scenarioStartTime}`);\n}"
                  },
                  {
                    "name": "SizeX",
                    "value": "0.07"
                  },
                  {
                    "name": "SizeY",
                    "value": "0.15"
                  }
                ]
              }
            ]
          },
          {
            "Name": "pastAttempts",
            "Type": "Panel",
            "Properties": [
              {
                "name": "ClassName",
                "value": "\"pastAttempts\""
              },
              {
                "name": "CSS",
                "value": "\"{text-align: left}\""
              }
            ]
          }
        ]
      }
    ],
    "RootProperties": []
  },
  "metadata": {
    "APP": "WebEJS",
    "CreatedWith": "WebEJS : The web version of Easy JavaScript Simulations",
    "MoreInfo": "WebEJS 1.2",
    "version": "https://www.um.es/fem/wikis/webejs/"
  }
}