diff --git a/.gitignore b/.gitignore
index ebd3f033..cf344cf0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
### Maven spring - downloaded with initial project from Spring Intitializer - https://start.spring.io/ ###
/target/
+/parui/
!.mvn/wrapper/maven-wrapper.jar
### STS ###
diff --git a/pom.xml b/pom.xml
index aa896677..fc8b8c6b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,10 +30,6 @@
opencsv
4.1
-
- org.springframework.boot
- spring-boot-starter-thymeleaf
-
org.springframework.boot
@@ -96,6 +92,17 @@
2.14.1
+
+ org.openjfx
+ javafx-controls
+ 11
+
+
+
+ commons-io
+ commons-io
+ 2.4
+
@@ -116,6 +123,68 @@
+
+
+
+ com.github.eirslett
+ frontend-maven-plugin
+ 1.12.0
+
+ parui
+ target
+
+
+
+ install node and npm
+
+ install-node-and-npm
+
+
+ v14.16.0
+ 6.14.11
+
+
+
+ npm install
+
+ npm
+
+
+ install
+
+
+
+ npm run build
+
+ npm
+
+
+ run build
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ 3.0.0
+
+
+ generate-resources
+
+
+
+
+
+
+
+
+
+ run
+
+
+
+
diff --git a/server install steps.txt b/server install steps.txt
index 98da8a8e..d0f4c6cb 100644
--- a/server install steps.txt
+++ b/server install steps.txt
@@ -10,9 +10,9 @@ mvn test
ps -A | grep java
sudo kill PID
-tar cvzf "../dataBackup/parDataBackup-2021-02-10.tar.gz" target/localData/
+tar cvzf "../dataBackup/parDataBackup-2021-06-15.tar.gz" target/localData/
on local:
-scp @par.eastus.cloudapp.azure.com:dataBackup/parDataBackup--2021-02-10.tar.gz Downloads/
+scp @par.eastus.cloudapp.azure.com:dataBackup/parDataBackup--2021-06-15.tar.gz Downloads/
remote if clearing data:
rm -f target/localData/*.json
rm -f target/localData/students/*.json
diff --git a/src/main/java/edu/ithaca/dragon/par/ParServer.java b/src/main/java/edu/ithaca/dragon/par/ParServer.java
index 5fdfaae0..8109673f 100644
--- a/src/main/java/edu/ithaca/dragon/par/ParServer.java
+++ b/src/main/java/edu/ithaca/dragon/par/ParServer.java
@@ -1,12 +1,16 @@
package edu.ithaca.dragon.par;
+import java.util.Collection;
import java.util.List;
+import edu.ithaca.dragon.par.analysis.QuestionHistorySummary;
import edu.ithaca.dragon.par.cohort.Cohort;
import edu.ithaca.dragon.par.cohort.CohortDatasource;
import edu.ithaca.dragon.par.domain.Question;
import edu.ithaca.dragon.par.domain.DomainDatasource;
import edu.ithaca.dragon.par.student.StudentModelDatasource;
+import edu.ithaca.dragon.par.student.json.QuestionHistory;
+
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -32,6 +36,11 @@ public List getCohortIds(){
return cohortDatasource.getCohortIds();
}
+ public QuestionHistorySummary getQuestionHistorySummary(String studentId){
+ logger.info("QuestionHistorySummary for:" + studentId);
+ return new QuestionHistorySummary(studentModelDatasource.getStudentModel(studentId).getQuestionHistories().values(), domainDatasource);
+ }
+
public void addNewUser(String studentId, String cohortId){
studentModelDatasource.createNewModelForId(studentId);
cohortDatasource.addStudentToCohort(cohortId, studentId);
diff --git a/src/main/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummary.java b/src/main/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummary.java
index 508fb233..3ef8d50b 100644
--- a/src/main/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummary.java
+++ b/src/main/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummary.java
@@ -12,18 +12,18 @@
//TODO: can make these: across everyone for all types or certain type, for 1 student for all types or certain type, window size too
public class QuestionHistorySummary {
private List questionIdsSeen;
- private List questionsRespondedTo;
- private List questionsCorrect;
- private List questionsCorrectAfterIncorrect;
- private List questionsIncorrect;
+ private List questionIdsRespondedTo;
+ private List questionIdsCorrectFirstTime;
+ private List questionIdsCorrectAfterIncorrect;
+ private List questionIdsIncorrect;
public QuestionHistorySummary(Collection questionHistoryCollection, DomainDatasource domainData){
questionIdsSeen = buildQuestionIdsSeen(questionHistoryCollection);
- questionsRespondedTo = checkQuestionsRespondedTo(questionHistoryCollection);
- questionsCorrect = findQuestionsCorrect(questionHistoryCollection, domainData);
- questionsIncorrect = findQuestionsIncorrect(questionHistoryCollection, domainData);
- questionsCorrectAfterIncorrect = findQuestionsCorrectAfterIncorrect(questionHistoryCollection, domainData);
+ questionIdsRespondedTo = checkQuestionIdsRespondedTo(questionHistoryCollection);
+ questionIdsCorrectFirstTime = findQuestionIdsCorrectFirstTime(questionHistoryCollection, domainData);
+ questionIdsIncorrect = findQuestionIdsIncorrect(questionHistoryCollection, domainData);
+ questionIdsCorrectAfterIncorrect = findQuestionIdsCorrectAfterIncorrect(questionHistoryCollection, domainData);
}
public static List buildQuestionIdsSeen(Collection questionHistoryCollection){
@@ -40,7 +40,7 @@ public static List buildQuestionIdsSeen(Collection ques
return questionIdsList;
}
- public static List checkQuestionsRespondedTo(Collection questionHistoryCollection){
+ public static List checkQuestionIdsRespondedTo(Collection questionHistoryCollection){
List questionsRespondedList = new ArrayList();
for(QuestionHistory questionHist : questionHistoryCollection){
@@ -51,7 +51,7 @@ public static List checkQuestionsRespondedTo(Collection
return questionsRespondedList;
}
- public static List findQuestionsCorrect(Collection questionHistoryCollection, DomainDatasource domainData){
+ public static List findQuestionIdsCorrectFirstTime(Collection questionHistoryCollection, DomainDatasource domainData){
List correctList = new ArrayList();
List historyOfQuestions = QuestionHistorySummary.findAllHistoriesWithResponses(questionHistoryCollection);
@@ -65,28 +65,35 @@ public static List findQuestionsCorrect(Collection ques
return correctList;
}
- public static List findQuestionsIncorrect(Collection questionHistoryCollection, DomainDatasource domainData){
+ public static List findQuestionIdsIncorrect(Collection questionHistoryCollection, DomainDatasource domainData){
List incorrectList = new ArrayList();
List historyOfQuestions = QuestionHistorySummary.findAllHistoriesWithResponses(questionHistoryCollection);
-
for (QuestionHistory questionHist : historyOfQuestions){
- String correctAnswer = domainData.getQuestion(questionHist.getQuestionId()).getCorrectAnswer();
- if (!questionHist.responses.iterator().next().getResponseText().equals(correctAnswer)){
+ boolean hasCorrectAnswer = false;
+
+ for(Response questionResponse : questionHist.responses){
+ String correctAnswer = domainData.getQuestion(questionHist.getQuestionId()).getCorrectAnswer();
+ if (questionResponse.getResponseText().equals(correctAnswer) ){
+ hasCorrectAnswer = true;
+ }
+ }
+ if (!hasCorrectAnswer){
incorrectList.add(questionHist.getQuestionId());
}
}
+
return incorrectList;
}
- public static List findQuestionsCorrectAfterIncorrect(Collection questionHistoryCollection, DomainDatasource domainData){
+ public static List findQuestionIdsCorrectAfterIncorrect(Collection questionHistoryCollection, DomainDatasource domainData){
List correctAfterIncorrect = new ArrayList();
List historyOfQuestions = QuestionHistorySummary.findAllHistoriesWithResponses(questionHistoryCollection);
for (QuestionHistory questionHist : historyOfQuestions){
for(Response questionResponse : questionHist.responses){
String correctAnswer = domainData.getQuestion(questionHist.getQuestionId()).getCorrectAnswer();
- if (questionResponse.getResponseText().equals(correctAnswer)){
+ if (questionResponse.getResponseText().equals(correctAnswer) && !questionHist.responses.get(0).getResponseText().equals(correctAnswer)){
correctAfterIncorrect.add(questionHist.getQuestionId());
}
}
@@ -110,19 +117,19 @@ public List getQuestionIdsSeen() {
return questionIdsSeen;
}
- public List getQuestionsRespondedTo() {
- return questionsRespondedTo;
+ public List getQuestionIdsRespondedTo() {
+ return questionIdsRespondedTo;
}
- public List getQuestionsCorrect() {
- return questionsCorrect;
+ public List getQuestionIdsCorrectFirstTime() {
+ return questionIdsCorrectFirstTime;
}
- public List getQuestionsIncorrect(){
- return questionsIncorrect;
+ public List getQuestionIdsIncorrect(){
+ return questionIdsIncorrect;
}
- public List getQuestionsCorrectAfterIncorrect(){
- return questionsCorrectAfterIncorrect;
+ public List getQuestionIdsCorrectAfterIncorrect(){
+ return questionIdsCorrectAfterIncorrect;
}
}
diff --git a/src/main/java/edu/ithaca/dragon/par/comm/CreateStudentAction.java b/src/main/java/edu/ithaca/dragon/par/comm/CreateStudentAction.java
index c93a3803..2909c032 100644
--- a/src/main/java/edu/ithaca/dragon/par/comm/CreateStudentAction.java
+++ b/src/main/java/edu/ithaca/dragon/par/comm/CreateStudentAction.java
@@ -3,4 +3,10 @@
public class CreateStudentAction {
public String studentId;
public String cohortId;
+
+ public CreateStudentAction(){}
+ public CreateStudentAction(String studentId, String cohortId){
+ this.studentId = studentId;
+ this.cohortId = cohortId;
+ }
}
diff --git a/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasource.java b/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasource.java
index 494dad79..54524064 100644
--- a/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasource.java
+++ b/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasource.java
@@ -1,6 +1,7 @@
package edu.ithaca.dragon.par.domain;
import java.util.List;
+import java.util.Set;
public interface DomainDatasource {
@@ -11,4 +12,9 @@ public interface DomainDatasource {
*/
Question getQuestion(String id);
+ List retrieveAllConcepts();
+
+ String retrieveConceptForAQuestion(String id);
+
+ List retrieveQuestionsByConcept(String concept);
}
diff --git a/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceJson.java b/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceJson.java
index 582c9899..cfa16f42 100644
--- a/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceJson.java
+++ b/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceJson.java
@@ -6,7 +6,11 @@
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Set;
+
public class DomainDatasourceJson implements DomainDatasource{
private final String id;
@@ -42,4 +46,42 @@ public Question getQuestion(String id){
}
throw new IllegalArgumentException("No question found, bad ID:" + id);
}
+
+ @Override
+ public List retrieveAllConcepts() {
+ List concepts = new ArrayList<>();
+
+ for(Question question:questions){
+ if(!concepts.contains(question.getType())){
+ concepts.add(question.getType());
+ }
+ }
+ return concepts;
+ }
+
+ @Override
+ public String retrieveConceptForAQuestion(String id) {
+ for (Question question: questions){
+ if (question.getId().equalsIgnoreCase(id)){
+ return question.getType();
+ }
+ }
+ throw new IllegalArgumentException("No question found, bad ID:" + id);
+ }
+
+ @Override
+ public List retrieveQuestionsByConcept(String concept) {
+ List questionList = new ArrayList<>();
+ for (Question question: questions){
+ if (question.getType().equalsIgnoreCase(concept)){
+ questionList.add(question);
+ }
+ }
+ if(questionList.size()==0){
+ throw new IllegalArgumentException("No questions found, bad concept: "+concept);
+ }
+ else{
+ return questionList;
+ }
+ }
}
diff --git a/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceSimple.java b/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceSimple.java
index a6d9a5a8..b1a9f303 100644
--- a/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceSimple.java
+++ b/src/main/java/edu/ithaca/dragon/par/domain/DomainDatasourceSimple.java
@@ -1,6 +1,9 @@
package edu.ithaca.dragon.par.domain;
+import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
public class DomainDatasourceSimple implements DomainDatasource {
@@ -24,4 +27,44 @@ public Question getQuestion(String id) {
}
throw new IllegalArgumentException("Question not found for id:" + id);
}
+
+ @Override
+ public List retrieveAllConcepts() {
+ List concepts = new ArrayList<>();
+
+ for(Question question:questions){
+ if(!concepts.contains(question.getType())){
+ concepts.add(question.getType());
+ }
+ }
+ return concepts;
+ }
+
+ @Override
+ public String retrieveConceptForAQuestion(String id) {
+ for (Question question: questions){
+ if (question.getId().equalsIgnoreCase(id)){
+ return question.getType();
+ }
+ }
+ throw new IllegalArgumentException("No question found, bad ID:" + id);
+ }
+
+ @Override
+ public List retrieveQuestionsByConcept(String concept) {
+ List questionList = new ArrayList<>();
+ for (Question question: questions){
+ if (question.getType().equalsIgnoreCase(concept)){
+ questionList.add(question);
+ }
+ }
+ if(questionList.size()==0){
+ throw new IllegalArgumentException("No questions found, bad concept: "+concept);
+ }
+ else{
+ return questionList;
+ }
+ }
+
+
}
diff --git a/src/main/java/edu/ithaca/dragon/par/pedagogy/OrderedConceptRubric.java b/src/main/java/edu/ithaca/dragon/par/pedagogy/OrderedConceptRubric.java
new file mode 100644
index 00000000..a6d1ad38
--- /dev/null
+++ b/src/main/java/edu/ithaca/dragon/par/pedagogy/OrderedConceptRubric.java
@@ -0,0 +1,8 @@
+package edu.ithaca.dragon.par.pedagogy;
+
+enum OrderedConceptRubric{
+ UNPREPARED,
+ DEVELOPING,
+ COMPETENT,
+ EXEMPLARY;
+}
\ No newline at end of file
diff --git a/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooser.java b/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooser.java
index b749cc51..5452ca0b 100644
--- a/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooser.java
+++ b/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooser.java
@@ -7,7 +7,7 @@
import edu.ithaca.dragon.par.student.StudentModelInfo;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property ="type")
-@JsonSubTypes({@JsonSubTypes.Type(value = QuestionChooserRandom.class, name = "QuestionChooserRandom"),@JsonSubTypes.Type(value = QuestionChooserInOrder.class, name = "QuestionChooserInOrder") })
+@JsonSubTypes({@JsonSubTypes.Type(value = QuestionChooserRandom.class, name = "QuestionChooserRandom"),@JsonSubTypes.Type(value = QuestionChooserInOrder.class, name = "QuestionChooserInOrder"), @JsonSubTypes.Type(value=QuestionChooserByOrderedConcepts.class,name="QuestionChooserByOrderedConcepts")})
public interface QuestionChooser {
Question chooseQuestion(StudentModelInfo studentModelInfo, DomainDatasource domainDatasource);
}
\ No newline at end of file
diff --git a/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConcepts.java b/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConcepts.java
index 3ab6a179..19fb4214 100644
--- a/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConcepts.java
+++ b/src/main/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConcepts.java
@@ -1,9 +1,23 @@
package edu.ithaca.dragon.par.pedagogy;
-public class QuestionChooserByOrderedConcepts {
+import java.util.ArrayList;
+import java.util.Collection;
+import javafx.util.Pair;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import edu.ithaca.dragon.par.analysis.QuestionHistorySummary;
+import edu.ithaca.dragon.par.domain.DomainDatasource;
+import edu.ithaca.dragon.par.domain.Question;
+import edu.ithaca.dragon.par.student.StudentModelInfo;
+import edu.ithaca.dragon.par.student.json.QuestionHistory;
+
+
+
+public class QuestionChooserByOrderedConcepts implements QuestionChooser{
//Each concept(type) has an average of last questions which gets bucketed
//rubric-style: unprepared,developing,competent,exemplary
- //having too few questions answered puts you automatically into developing
+ //having too few questions answered puts you automatically into unprepared
//concepts are ordered
//unprepared on next topic can get turned to developing by competent grade on prior
//exemplary on the prior topic can get turned into competent by current topic
@@ -12,4 +26,227 @@ public class QuestionChooserByOrderedConcepts {
//Find questions of the right type(s) that have the min seen count.
//If a minSeen question has the same URL as last question, take that, otherwise go for first minSeen
+ public List> conceptScores;
+ public List conceptIds;
+
+ public QuestionChooserByOrderedConcepts(){
+ conceptScores = new ArrayList<>();
+ }
+
+ public QuestionChooserByOrderedConcepts(List concepts){
+ conceptIds=concepts;
+ conceptScores = new ArrayList<>();
+ String firstConcept = concepts.iterator().next();
+ for(String concept :concepts){
+ if(concept.equalsIgnoreCase(firstConcept)){
+ conceptScores.add(new Pair(concept,OrderedConceptRubric.DEVELOPING));
+ }
+ else{
+ conceptScores.add(new Pair(concept,OrderedConceptRubric.UNPREPARED));
+ }
+ }
+
+ }
+
+ public Question chooseQuestion(StudentModelInfo studentModelInfo, DomainDatasource domainDatasource){
+ //Algorithm:
+ // 1. get all questions from domain datasource
+ // 2. select the first concept from the list of questions to be developing, the rest are unprepared
+ // 3. (Once competent, the next concept will be developing)
+ // 4. (Once exemplary, the next concept will be updated to competent)
+ // 5. from the developing and competent buckets, the question asked will be chosen based on least recently seen
+ // *Test case for when first two topics are exemplary and the next
+
+
+
+ updateConceptScoresBasedOnPerformanceData(studentModelInfo, domainDatasource);
+
+
+
+ updateConceptScoresBasedOnComparativeResults();
+
+
+
+ List eligibleQuestions = new ArrayList<>();
+ for(Pair conceptScore:conceptScores){
+ if(conceptScore.getValue()==OrderedConceptRubric.COMPETENT || conceptScore.getValue()==OrderedConceptRubric.DEVELOPING){
+ eligibleQuestions.addAll(domainDatasource.retrieveQuestionsByConcept(conceptScore.getKey()));
+ }
+ }
+
+ if(eligibleQuestions.size()!=0){
+ String questionIdToBeAsked = studentModelInfo.findQuestionSeenLeastRecently(eligibleQuestions.stream().map(q -> q.getId()).collect(Collectors.toList()));
+ return domainDatasource.getQuestion(questionIdToBeAsked);
+ }
+ else{
+ throw new RuntimeException("No questions eligible for choosing");
+ }
+ }
+
+ public List> getConceptScores() {
+ return conceptScores;
+ }
+
+ public void setConceptScores(List> conceptScores) {
+ this.conceptScores = conceptScores;
+ }
+
+ public List getConceptIds() {
+ return conceptIds;
+ }
+
+ public void setConceptIds(List conceptIds) {
+ this.conceptIds = conceptIds;
+ String firstConcept = conceptIds.iterator().next();
+ List>conceptScoresIn = new ArrayList<>();
+ for(String concept :conceptIds){
+ if(concept.equalsIgnoreCase(firstConcept)){
+ conceptScoresIn.add(new Pair(concept,OrderedConceptRubric.DEVELOPING));
+ }
+ else{
+ conceptScoresIn.add(new Pair(concept,OrderedConceptRubric.UNPREPARED));
+ }
+ }
+ setConceptScores(conceptScoresIn);
+ }
+
+ public static List retrieveQuestionsFromStudentModelByConcept(String concept, Collection questionHistories, DomainDatasource domainDatasource){
+ List questionsByConceptFromDatasource = domainDatasource.retrieveQuestionsByConcept(concept);
+ List questionList = new ArrayList<>();
+ for(Question question:questionsByConceptFromDatasource){
+ for(QuestionHistory questionHist: questionHistories){
+ if(questionHist.questionId.equalsIgnoreCase(question.getId())){
+ questionList.add(question);
+ }
+ }
+ }
+ return questionList;
+ }
+
+ public void updateConceptScoresBasedOnPerformanceData(StudentModelInfo studentModelInfo,DomainDatasource domainDatasource){
+ Collection questionHistories = studentModelInfo.getQuestionHistories().values();
+ int i=0;
+ for(Pair conceptScore:conceptScores){
+ String concept = conceptScore.getKey();
+ List conceptQuestionsSeenByStudent = retrieveQuestionsFromStudentModelByConcept(concept,questionHistories,domainDatasource);
+ if(calcUnprepared(conceptQuestionsSeenByStudent, questionHistories, domainDatasource)){
+ conceptScores.set(i,new Pair(concept,OrderedConceptRubric.UNPREPARED));
+ }
+ else if(calcDeveloping(concept, conceptQuestionsSeenByStudent, questionHistories, domainDatasource)){
+ conceptScores.set(i,new Pair(concept,OrderedConceptRubric.DEVELOPING));
+ }
+ else if(calcCompetent(concept, conceptQuestionsSeenByStudent, questionHistories, domainDatasource)){
+ conceptScores.set(i,new Pair(concept,OrderedConceptRubric.COMPETENT));
+ }
+ else{
+ conceptScores.set(i,new Pair(concept,OrderedConceptRubric.EXEMPLARY));
+ }
+ i++;
+ }
+ }
+
+ public void updateConceptScoresBasedOnComparativeResults(){
+ int i=0;
+ boolean isAllExemplary = true;
+ for(Pair conceptScore:conceptScores){
+ String concept = conceptScore.getKey();
+ if(i==0 && conceptScore.getValue()==OrderedConceptRubric.UNPREPARED){
+ conceptScores.set(i,new Pair(concept,OrderedConceptRubric.DEVELOPING));
+ isAllExemplary=false;
+ }
+ else if(i-1!=-1 && conceptScore.getValue()==OrderedConceptRubric.UNPREPARED){
+ Pair previousConceptScore = conceptScores.get(i-1);
+ if(previousConceptScore.getValue()==OrderedConceptRubric.COMPETENT || previousConceptScore.getValue()==OrderedConceptRubric.EXEMPLARY){
+ conceptScores.set(i,new Pair(concept,OrderedConceptRubric.DEVELOPING));
+ }
+ isAllExemplary=false;
+ }
+ else{
+ if(conceptScore.getValue()!=OrderedConceptRubric.EXEMPLARY){
+ isAllExemplary=false;
+ }
+ }
+ i++;
+ }
+
+ if(isAllExemplary){
+ conceptScores = conceptScores.stream().map(score -> new Pair(score.getKey(),OrderedConceptRubric.DEVELOPING)).collect(Collectors.toList());
+ }
+
+ }
+
+ public boolean calcUnprepared(List conceptQuestionsSeenByStudent, Collection questionHistories, DomainDatasource domainDatasource){
+
+ List questionIdsForEverCorrect = QuestionHistorySummary.findQuestionIdsCorrectFirstTime(questionHistories,domainDatasource);
+ questionIdsForEverCorrect.addAll(QuestionHistorySummary.findQuestionIdsCorrectAfterIncorrect(questionHistories, domainDatasource));
+ for(Question question: conceptQuestionsSeenByStudent){
+ for(String questionId:questionIdsForEverCorrect){
+ if(questionId.equalsIgnoreCase(question.getId())){
+ return false;
+ }
+ }
+ }
+ return true;
+
+ }
+
+ public boolean calcDeveloping(String concept, List conceptQuestionsSeenByStudent, Collection questionHistories, DomainDatasource domainDatasource){
+ if(calcCompetent(concept, conceptQuestionsSeenByStudent, questionHistories, domainDatasource)||calcExemplary(concept, conceptQuestionsSeenByStudent, questionHistories, domainDatasource)){
+ return false;
+ }
+ else{
+ List questionIdsForEverCorrect = QuestionHistorySummary.findQuestionIdsCorrectFirstTime(questionHistories,domainDatasource);
+ questionIdsForEverCorrect.addAll(QuestionHistorySummary.findQuestionIdsCorrectAfterIncorrect(questionHistories, domainDatasource));
+
+ for(Question question: conceptQuestionsSeenByStudent){
+ for(String questionId:questionIdsForEverCorrect){
+ if(questionId.equalsIgnoreCase(question.getId())){
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+
+ }
+ public boolean calcCompetent(String concept, List conceptQuestionsSeenByStudent, Collection questionHistories, DomainDatasource domainDatasource){
+ if(calcExemplary(concept, conceptQuestionsSeenByStudent, questionHistories, domainDatasource)){
+ return false;
+ }
+ else{
+ List questionIdsForEverCorrect = QuestionHistorySummary.findQuestionIdsCorrectFirstTime(questionHistories,domainDatasource);
+ questionIdsForEverCorrect.addAll(QuestionHistorySummary.findQuestionIdsCorrectAfterIncorrect(questionHistories, domainDatasource));
+ float denom = (float) domainDatasource.retrieveQuestionsByConcept(concept).size();
+ float num = 0;
+ for(Question question: conceptQuestionsSeenByStudent){
+ for(String questionId:questionIdsForEverCorrect){
+ if(questionId.equalsIgnoreCase(question.getId())){
+ num++;
+ }
+ }
+ }
+ if(num/denom > 0.5){
+ return true;
+ } else {return false;}
+ }
+
+ }
+ public boolean calcExemplary(String concept, List conceptQuestionsSeenByStudent, Collection questionHistories, DomainDatasource domainDatasource){
+ List questionIdsForEverCorrect = QuestionHistorySummary.findQuestionIdsCorrectFirstTime(questionHistories,domainDatasource);
+ questionIdsForEverCorrect.addAll(QuestionHistorySummary.findQuestionIdsCorrectAfterIncorrect(questionHistories, domainDatasource));
+ int denom = domainDatasource.retrieveQuestionsByConcept(concept).size();
+ int num = 0;
+ for(Question question: conceptQuestionsSeenByStudent){
+ for(String questionId:questionIdsForEverCorrect){
+ if(questionId.equalsIgnoreCase(question.getId())){
+ num++;
+ }
+ }
+ }
+ if(num/denom ==1){
+ return true;
+ } else {return false;}
+ }
+
}
diff --git a/src/main/java/edu/ithaca/dragon/par/spring/ParController.java b/src/main/java/edu/ithaca/dragon/par/spring/ParController.java
index 7c592215..d7695ce2 100644
--- a/src/main/java/edu/ithaca/dragon/par/spring/ParController.java
+++ b/src/main/java/edu/ithaca/dragon/par/spring/ParController.java
@@ -1,6 +1,7 @@
package edu.ithaca.dragon.par.spring;
import edu.ithaca.dragon.par.ParServer;
+import edu.ithaca.dragon.par.analysis.QuestionHistorySummary;
import edu.ithaca.dragon.par.cohort.Cohort;
import edu.ithaca.dragon.par.cohort.CohortDatasourceJson;
import edu.ithaca.dragon.par.comm.CreateStudentAction;
@@ -20,36 +21,40 @@
public class ParController {
private final ParServer parServer;
- public ParController()throws IOException {
+ public ParController(ParServer parServer){
+ this.parServer=parServer;
+ }
- StudentModelDatasourceJson studentModelDatasourceJson = new StudentModelDatasourceJson(
+ public ParController()throws IOException {
+ //TODO: remove default users once there is a front-end way to create new users
+ // List.of("r1", "r2", "r3", "o1", "o2", "o3", "o4").forEach((userId)-> {
+ // if (studentModelDatasourceJson.idIsAvailable(userId)){
+ // studentModelDatasourceJson.createNewModelForId(userId);
+ // }
+ // });
+
+ this(
+ new ParServer(
+ new DomainDatasourceJson(
+ "HorseUltrasound",
+ "localData/currentQuestionPool.json",
+ "author/defaultQuestionPool.json",
+ new JsonIoHelperSpring()
+ ),
+
+ new StudentModelDatasourceJson(
"allStudents",
"localData/student",
new JsonIoHelperSpring()
- );
- //TODO: remove default users once there is a front-end way to create new users
- List.of("r1", "r2", "r3", "o1", "o2", "o3", "o4").forEach((userId)-> {
- if (studentModelDatasourceJson.idIsAvailable(userId)){
- studentModelDatasourceJson.createNewModelForId(userId);
- }
- });
-
- parServer = new ParServer(
- new DomainDatasourceJson(
- "HorseUltrasound",
- "localData/currentQuestionPool.json",
- "author/defaultQuestionPool.json",
- new JsonIoHelperSpring()
- ),
-
- studentModelDatasourceJson,
-
- //TODO: remove default users from cohort datastores once there is a viable way to add students
- new CohortDatasourceJson(
- "allCohorts",
- "localData/currentCohorts.json",
- "author/defaultCohorts.json",
- new JsonIoHelperSpring()
+ ),
+
+ //TODO: remove default users from cohort datastores once there is a viable way to add students
+ new CohortDatasourceJson(
+ "allCohorts",
+ "localData/currentCohorts.json",
+ "author/defaultCohorts.json",
+ new JsonIoHelperSpring()
+ )
)
);
}
@@ -75,10 +80,14 @@ public List getCohortIds(){
return parServer.getCohortIds();
}
+ @GetMapping("/getQuestionHistorySummary")
+ public QuestionHistorySummary getQuestionHistorySummary(@RequestParam String userId){
+ return parServer.getQuestionHistorySummary(userId);
+ }
+
@PostMapping("/addNewUser")
public void addNewUser(@RequestBody CreateStudentAction studentAction){
parServer.addNewUser(studentAction.studentId, studentAction.cohortId);
-
}
@PostMapping("/addTimeSeen")
diff --git a/src/main/java/edu/ithaca/dragon/par/spring/WebController.java b/src/main/java/edu/ithaca/dragon/par/spring/WebController.java
index 9992ab51..1b530c3b 100644
--- a/src/main/java/edu/ithaca/dragon/par/spring/WebController.java
+++ b/src/main/java/edu/ithaca/dragon/par/spring/WebController.java
@@ -1,48 +1,48 @@
-package edu.ithaca.dragon.par.spring;
-
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-
-@Controller
-public class WebController implements WebMvcConfigurer {
-
- @GetMapping("/")
- public String base(){
- return "LoginPage";
- }
-
- @GetMapping("/login")
- public String login(){
- return "LoginPage";
- }
-
- @GetMapping(value = "/imageTaskView")
- public String redirect(@RequestParam String userId, Model model) {
- model.addAttribute("User", userId);
- return "old/ImageTaskTemplate";
- }
-
- @GetMapping("/studentView")
- public String studentView(@RequestParam String userId, Model model){
- model.addAttribute("userId", userId);
- return "StudentView";
- }
-
- @GetMapping("/authorFromTemplateView")
- public String authorFromTemplateView(@RequestParam String userId, Model model){
- model.addAttribute("userId", userId);
- return "AuthorFromTemplateView";
- }
-
- @GetMapping("/authorReview")
- public String authorReview(@RequestParam String userId, Model model){
- model.addAttribute("userId", userId);
- return "AuthorReview";
- }
-
-
-}
+//package edu.ithaca.dragon.par.spring;
+//
+//import org.springframework.stereotype.Controller;
+//import org.springframework.ui.Model;
+//import org.springframework.web.bind.annotation.GetMapping;
+//import org.springframework.web.bind.annotation.RequestParam;
+//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+//
+//
+//@Controller
+//public class WebController implements WebMvcConfigurer {
+//
+// @GetMapping("/")
+// public String base(){
+// return "LoginPage";
+// }
+//
+// @GetMapping("/login")
+// public String login(){
+// return "LoginPage";
+// }
+//
+// @GetMapping(value = "/imageTaskView")
+// public String redirect(@RequestParam String userId, Model model) {
+// model.addAttribute("User", userId);
+// return "old/ImageTaskTemplate";
+// }
+//
+// @GetMapping("/studentView")
+// public String studentView(@RequestParam String userId, Model model){
+// model.addAttribute("userId", userId);
+// return "StudentView";
+// }
+//
+// @GetMapping("/authorFromTemplateView")
+// public String authorFromTemplateView(@RequestParam String userId, Model model){
+// model.addAttribute("userId", userId);
+// return "AuthorFromTemplateView";
+// }
+//
+// @GetMapping("/authorReview")
+// public String authorReview(@RequestParam String userId, Model model){
+// model.addAttribute("userId", userId);
+// return "AuthorReview";
+// }
+//
+//
+//}
diff --git a/src/main/java/edu/ithaca/dragon/par/student/StudentModelInfo.java b/src/main/java/edu/ithaca/dragon/par/student/StudentModelInfo.java
index f5edd2e1..b5f9a44d 100644
--- a/src/main/java/edu/ithaca/dragon/par/student/StudentModelInfo.java
+++ b/src/main/java/edu/ithaca/dragon/par/student/StudentModelInfo.java
@@ -1,7 +1,11 @@
package edu.ithaca.dragon.par.student;
import java.util.List;
+import java.util.Map;
+
+import edu.ithaca.dragon.par.student.json.QuestionHistory;
public interface StudentModelInfo {
String findQuestionSeenLeastRecently( List questionIdsToCheck);
+ Map getQuestionHistories();
}
diff --git a/src/main/java/edu/ithaca/dragon/par/student/json/StudentModelJson.java b/src/main/java/edu/ithaca/dragon/par/student/json/StudentModelJson.java
index d65d6d9f..2e39be74 100644
--- a/src/main/java/edu/ithaca/dragon/par/student/json/StudentModelJson.java
+++ b/src/main/java/edu/ithaca/dragon/par/student/json/StudentModelJson.java
@@ -83,4 +83,8 @@ private QuestionHistory retrieveOrCreateNewHistory(String questionId){
return questionHistory;
}
+ public Map getQuestionHistories(){
+ return questionHistories;
+ }
+
}
diff --git a/src/main/resources/author/defaultCohorts.json b/src/main/resources/author/defaultCohorts.json
index 7ba5e625..2f6ea28c 100644
--- a/src/main/resources/author/defaultCohorts.json
+++ b/src/main/resources/author/defaultCohorts.json
@@ -15,5 +15,17 @@
"type" : "QuestionChooserInOrder",
"questionIdsInOrder" : [ "858-structure1-./images/2ATransverse.jpg", "850-structure3-./images/Annotated2Long.jpg", "866-plane-./images/3BTransverse.jpg", "847-structure2-./images/Annotated2Long.jpg", "614-plane-./images/3CTransverse.jpg" ]
}
+ },
+
+ "byOrderedConcepts" : {
+ "id" : "byOrderedConcepts",
+ "domainId" : "HorseUltrasound",
+ "studentIds" : [ ],
+ "questionChooser" : {
+ "type" : "QuestionChooserByOrderedConcepts",
+ "conceptIds" : [ "plane", "structure", "attachment", "zone"],
+ "conceptScores" : []
+ }
}
+
}
diff --git a/src/test/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummaryTest.java b/src/test/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummaryTest.java
index e6e9f1db..6fa12984 100644
--- a/src/test/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummaryTest.java
+++ b/src/test/java/edu/ithaca/dragon/par/analysis/QuestionHistorySummaryTest.java
@@ -25,37 +25,33 @@ public void createQuestionHistorySummary() throws IOException{
QuestionHistorySummary poorPerformance = new QuestionHistorySummary(QuestionHistoryTest.poorStudent(), data);
assertEquals(5, poorPerformance.getQuestionIdsSeen().size());
- assertEquals(2, poorPerformance.getQuestionsRespondedTo().size());
- assertEquals(0, poorPerformance.getQuestionsCorrect().size());
- assertEquals(2, poorPerformance.getQuestionsIncorrect().size());
- assertEquals(3, poorPerformance.getQuestionIdsSeen().size() - poorPerformance.getQuestionsRespondedTo().size());
- assertEquals("majorQ", poorPerformance.getQuestionsIncorrect().get(0));
- assertEquals("yearQ", poorPerformance.getQuestionsIncorrect().get(1));
+ assertEquals(2, poorPerformance.getQuestionIdsRespondedTo().size());
+ assertEquals(0, poorPerformance.getQuestionIdsCorrectFirstTime().size());
+ assertEquals(2, poorPerformance.getQuestionIdsIncorrect().size());
+ assertEquals(3, poorPerformance.getQuestionIdsSeen().size() - poorPerformance.getQuestionIdsRespondedTo().size());
+ assertEquals("majorQ", poorPerformance.getQuestionIdsIncorrect().get(0));
+ assertEquals("yearQ", poorPerformance.getQuestionIdsIncorrect().get(1));
QuestionHistorySummary strongPerformance = new QuestionHistorySummary(QuestionHistoryTest.strongStudent(), data);
assertEquals(5, strongPerformance.getQuestionIdsSeen().size());
- assertEquals(5, strongPerformance.getQuestionsRespondedTo().size());
- assertEquals(5, strongPerformance.getQuestionsCorrect().size());
- assertEquals("skyQ", strongPerformance.getQuestionsCorrect().get(0));
- assertEquals("mathQ", strongPerformance.getQuestionsCorrect().get(1));
- assertEquals("majorQ", strongPerformance.getQuestionsCorrect().get(2));
- assertEquals("yearQ", strongPerformance.getQuestionsCorrect().get(3));
- assertEquals("googleQ", strongPerformance.getQuestionsCorrect().get(4));
+ assertEquals(5, strongPerformance.getQuestionIdsRespondedTo().size());
+ assertEquals(5, strongPerformance.getQuestionIdsCorrectFirstTime().size());
+ assertEquals("skyQ", strongPerformance.getQuestionIdsCorrectFirstTime().get(0));
+ assertEquals("mathQ", strongPerformance.getQuestionIdsCorrectFirstTime().get(1));
+ assertEquals("majorQ", strongPerformance.getQuestionIdsCorrectFirstTime().get(2));
+ assertEquals("yearQ", strongPerformance.getQuestionIdsCorrectFirstTime().get(3));
+ assertEquals("googleQ", strongPerformance.getQuestionIdsCorrectFirstTime().get(4));
QuestionHistorySummary improvingPerformance = new QuestionHistorySummary(QuestionHistoryTest.improvingStudent(), data);
assertEquals(5, improvingPerformance.getQuestionIdsSeen().size());
- assertEquals(4, improvingPerformance.getQuestionsRespondedTo().size());
- assertEquals(2, improvingPerformance.getQuestionsCorrect().size());
- assertEquals("mathQ", improvingPerformance.getQuestionsCorrect().get(0));
- assertEquals("majorQ", improvingPerformance.getQuestionsCorrect().get(1));
- assertEquals(2, improvingPerformance.getQuestionsIncorrect().size());
- assertEquals("yearQ", improvingPerformance.getQuestionsIncorrect().get(0));
- assertEquals("googleQ", improvingPerformance.getQuestionsIncorrect().get(1));
- assertEquals(4, improvingPerformance.getQuestionsCorrectAfterIncorrect().size());
- assertEquals("mathQ", improvingPerformance.getQuestionsCorrectAfterIncorrect().get(0));
- assertEquals("majorQ", improvingPerformance.getQuestionsCorrectAfterIncorrect().get(1));
- assertEquals("yearQ", improvingPerformance.getQuestionsCorrectAfterIncorrect().get(2));
- assertEquals("googleQ", improvingPerformance.getQuestionsCorrectAfterIncorrect().get(3));
+ assertEquals(4, improvingPerformance.getQuestionIdsRespondedTo().size());
+ assertEquals(2, improvingPerformance.getQuestionIdsCorrectFirstTime().size());
+ assertEquals("mathQ", improvingPerformance.getQuestionIdsCorrectFirstTime().get(0));
+ assertEquals("majorQ", improvingPerformance.getQuestionIdsCorrectFirstTime().get(1));
+ assertEquals(1, improvingPerformance.getQuestionIdsIncorrect().size());
+ assertEquals("yearQ", improvingPerformance.getQuestionIdsIncorrect().get(0));
+ assertEquals(1, improvingPerformance.getQuestionIdsCorrectAfterIncorrect().size());
+ assertEquals("googleQ", improvingPerformance.getQuestionIdsCorrectAfterIncorrect().get(0));
}
@Test
@@ -71,7 +67,7 @@ public void buildQuestionIdsSeenTest(){
@Test
public void checkQuestionsRespondedTest(){
- List questionsRespondedTo = QuestionHistorySummary.checkQuestionsRespondedTo(QuestionHistoryTest.makeExamples());
+ List questionsRespondedTo = QuestionHistorySummary.checkQuestionIdsRespondedTo(QuestionHistoryTest.makeExamples());
assertEquals(3, questionsRespondedTo.size());
assertEquals("q1", questionsRespondedTo.get(0));
assertEquals("q3", questionsRespondedTo.get(1));
@@ -81,40 +77,34 @@ public void checkQuestionsRespondedTest(){
@Test
public void findQuestionsCorrectTest() throws IOException{
DomainDatasourceSimple data = new DomainDatasourceSimple(JsonUtil.listFromJsonFile("src/test/resources/rewrite/SampleQuestions.json", Question.class));
- List questionsCorrect = QuestionHistorySummary.findQuestionsCorrect(QuestionHistoryTest.SampleQuestionsEx(), data);
+ List questionsCorrect = QuestionHistorySummary.findQuestionIdsCorrectFirstTime(QuestionHistoryTest.SampleQuestionsEx(), data);
assertEquals(5, data.getAllQuestions().size());
- assertEquals(2, questionsCorrect.size());
+ assertEquals(1, questionsCorrect.size());
// Sample Question 1: What color is the sky?
assertEquals("skyQ", questionsCorrect.get(0));
- // Sample Question 2: What is 1 + 1?
- assertEquals("mathQ", questionsCorrect.get(1));
}
@Test
public void findQuestionsIncorrectTest() throws IOException{
DomainDatasourceSimple data = new DomainDatasourceSimple(JsonUtil.listFromJsonFile("src/test/resources/rewrite/SampleQuestions.json", Question.class));
- List questionsIncorrect = QuestionHistorySummary.findQuestionsIncorrect(QuestionHistoryTest.SampleQuestionsEx(), data);
+ List questionsIncorrect = QuestionHistorySummary.findQuestionIdsIncorrect(QuestionHistoryTest.SampleQuestionsEx(), data);
assertEquals(5, data.getAllQuestions().size());
assertEquals(1, questionsIncorrect.size());
-
- // Sample Question 3: What is your major?
- assertEquals("majorQ", questionsIncorrect.get(0));
+ assertEquals("mathQ", questionsIncorrect.get(0));
}
@Test
public void findQuestionsCorrectAfterIncorrectTest() throws IOException{
DomainDatasourceSimple data = new DomainDatasourceSimple(JsonUtil.listFromJsonFile("src/test/resources/rewrite/SampleQuestions.json", Question.class));
- List CorrectAfterIncorrect = QuestionHistorySummary.findQuestionsCorrectAfterIncorrect(QuestionHistoryTest.SampleQuestionsEx(), data);
+ List CorrectAfterIncorrect = QuestionHistorySummary.findQuestionIdsCorrectAfterIncorrect(QuestionHistoryTest.SampleQuestionsEx(), data);
assertEquals(5, data.getAllQuestions().size());
- assertEquals(3, CorrectAfterIncorrect.size());
+ assertEquals(1, CorrectAfterIncorrect.size());
// Sample Question 3: What is your major?
- assertEquals("skyQ", CorrectAfterIncorrect.get(0));
- assertEquals("mathQ", CorrectAfterIncorrect.get(1));
- assertEquals("majorQ", CorrectAfterIncorrect.get(2));
+ assertEquals("majorQ", CorrectAfterIncorrect.get(0));
}
}
\ No newline at end of file
diff --git a/src/test/java/edu/ithaca/dragon/par/cohort/CohortDatasourceJsonTest.java b/src/test/java/edu/ithaca/dragon/par/cohort/CohortDatasourceJsonTest.java
index 6c6c0b66..913ff09a 100644
--- a/src/test/java/edu/ithaca/dragon/par/cohort/CohortDatasourceJsonTest.java
+++ b/src/test/java/edu/ithaca/dragon/par/cohort/CohortDatasourceJsonTest.java
@@ -19,7 +19,7 @@ public void addStudentToCohortTest(@TempDir Path tempDir) throws IOException{
CohortDatasourceJson sample1 = new CohortDatasourceJson(
"allCohorts",
tempDir.toString() + "/sampleCohorts.json",
- "src/test/resources/rewrite/sampleCohorts.json",
+ "src/test/resources/rewrite/SampleCohorts.json",
new JsonIoHelperDefault()
);
diff --git a/src/test/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConceptsTest.java b/src/test/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConceptsTest.java
new file mode 100644
index 00000000..7f4746f8
--- /dev/null
+++ b/src/test/java/edu/ithaca/dragon/par/pedagogy/QuestionChooserByOrderedConceptsTest.java
@@ -0,0 +1,340 @@
+package edu.ithaca.dragon.par.pedagogy;
+
+import edu.ithaca.dragon.par.domain.DomainDatasource;
+import edu.ithaca.dragon.par.student.StudentModelDatasource;
+import edu.ithaca.dragon.par.student.StudentModelInfo;
+import edu.ithaca.dragon.par.student.json.QuestionHistory;
+import edu.ithaca.dragon.par.student.json.StudentModelDatasourceJson;
+import edu.ithaca.dragon.par.student.json.StudentModelJson;
+import edu.ithaca.dragon.par.domain.DomainDatasourceJson;
+import edu.ithaca.dragon.par.domain.Question;
+import edu.ithaca.dragon.util.JsonIoHelperDefault;
+import edu.ithaca.dragon.util.JsonUtil;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map.Entry;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class QuestionChooserByOrderedConceptsTest{
+
+ //level 1: sky
+ //level 2: math
+ //level 3: major
+ //level 4: year
+ //level 5: google
+ @Test
+ public void chooseQuestionTest() throws IOException{
+
+ DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json");
+ StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault());
+ QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts());
+
+ //new Student test
+ StudentModelJson newStudentModel = studentModelDatasource.getStudentModel("newStudent");
+ assertEquals("skyQ1",questionChooser.chooseQuestion(newStudentModel,domainDatasource).getId());
+
+
+
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue());
+
+
+
+
+
+ //first concept competent test
+ StudentModelJson studentModelFirstConceptCompetent = studentModelDatasource.getStudentModel("firstConceptCompetentStudent");
+
+ assertEquals("mathQ1",questionChooser.chooseQuestion(studentModelFirstConceptCompetent,domainDatasource).getId());
+
+ assertEquals(OrderedConceptRubric.COMPETENT,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue());
+
+
+
+ //first concept exemplary test
+
+ StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent");
+ assertEquals("mathQ1",questionChooser.chooseQuestion( studentModelFirstConceptExemplary,domainDatasource).getId());
+
+ assertEquals(OrderedConceptRubric.EXEMPLARY,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue());
+
+ //all concepts answered correctly at least once test
+ StudentModelJson studentModelLastSeenTest = studentModelDatasource.getStudentModel("allConceptsCorrectAtLeastOnce");
+
+ assertEquals("skyQ3",questionChooser.chooseQuestion(studentModelLastSeenTest, domainDatasource).getId());
+
+ assertEquals(OrderedConceptRubric.COMPETENT,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(4).getValue());
+
+ //all concepts exemplary all w/ same time seen (makes all concepts developing)
+
+ StudentModelJson studentModelAllConceptsExemplary = studentModelDatasource.getStudentModel("AllConceptsExemplary");
+ assertEquals("skyQ1",questionChooser.chooseQuestion(studentModelAllConceptsExemplary,domainDatasource).getId());
+
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(4).getValue());
+
+ StudentModelJson studentModelAllConceptsUnprepared = studentModelDatasource.getStudentModel("AllConceptsUnprepared");
+ assertEquals("skyQ2",questionChooser.chooseQuestion(studentModelAllConceptsUnprepared, domainDatasource).getId());
+
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue());
+ }
+
+ @Test
+ public void updateConceptScoresBasedOnPerformanceDataTest() throws IOException{
+ DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json");
+ StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault());
+ QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts());
+
+ //new student test
+
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue());
+
+ StudentModelJson newStudent = studentModelDatasource.getStudentModel("newStudent");
+ questionChooser.updateConceptScoresBasedOnPerformanceData(newStudent, domainDatasource);
+
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue());
+
+
+
+ // first concept exemplary test
+
+ questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts());
+
+
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue());
+
+ StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent");
+ questionChooser.updateConceptScoresBasedOnPerformanceData(studentModelFirstConceptExemplary, domainDatasource);
+
+ assertEquals(OrderedConceptRubric.EXEMPLARY,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue());
+
+ }
+
+ @Test
+ public void updateConceptScoresBasedOnComparativeResultsTest() throws IOException{
+ DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json");
+ StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault());
+ QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts());
+
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue());
+
+ StudentModelJson newStudent = studentModelDatasource.getStudentModel("newStudent");
+ questionChooser.updateConceptScoresBasedOnPerformanceData(newStudent, domainDatasource);
+ questionChooser.updateConceptScoresBasedOnComparativeResults();
+
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue());
+
+
+
+ questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts());
+
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue());
+
+ StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent");
+ questionChooser.updateConceptScoresBasedOnPerformanceData(studentModelFirstConceptExemplary, domainDatasource);
+ questionChooser.updateConceptScoresBasedOnComparativeResults();
+
+ assertEquals(OrderedConceptRubric.EXEMPLARY,questionChooser.conceptScores.get(0).getValue());
+ assertEquals(OrderedConceptRubric.DEVELOPING,questionChooser.conceptScores.get(1).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(2).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(3).getValue());
+ assertEquals(OrderedConceptRubric.UNPREPARED,questionChooser.conceptScores.get(4).getValue());
+
+ }
+
+ @Test
+ public void calcUnpreparedTest() throws IOException{
+ DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json");
+ QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts());
+ StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault());
+
+ // unprepared case
+ StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent");
+ Collection questionHistories = studentModelFirstConceptExemplary.getQuestionHistories().values();
+ boolean isUnprepared = questionChooser.calcUnprepared(QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("year", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertTrue(isUnprepared);
+
+ // exemplary case
+ isUnprepared = questionChooser.calcUnprepared(QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertFalse(isUnprepared);
+
+ // developing case
+ StudentModelJson studentModelFirstConceptDeveloping = studentModelDatasource.getStudentModel("firstConceptDeveloping");
+ questionHistories = studentModelFirstConceptDeveloping.getQuestionHistories().values();
+ isUnprepared = questionChooser.calcUnprepared(QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertFalse(isUnprepared);
+
+ // competent case
+ StudentModelJson studentModelFirstConceptCompetent = studentModelDatasource.getStudentModel("firstConceptCompetentStudent");
+ questionHistories = studentModelFirstConceptCompetent.getQuestionHistories().values();
+ isUnprepared = questionChooser.calcUnprepared(QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertFalse(isUnprepared);
+
+ }
+
+ @Test
+ public void calcDevelopingTest() throws IOException{
+
+ DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json");
+ StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault());
+ QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts());
+
+ // developing case
+ StudentModelJson studentModelFirstConceptDeveloping = studentModelDatasource.getStudentModel("firstConceptDeveloping");
+ Collection questionHistories = studentModelFirstConceptDeveloping.getQuestionHistories().values();
+ boolean isDeveloping = questionChooser.calcDeveloping("sky",QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertTrue(isDeveloping);
+
+
+ // unprepared case
+ isDeveloping = questionChooser.calcDeveloping("year",QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("year", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertFalse(isDeveloping);
+
+ // exemplary case
+ StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent");
+ questionHistories = studentModelFirstConceptExemplary.getQuestionHistories().values();
+ isDeveloping = questionChooser.calcDeveloping("sky",QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertFalse(isDeveloping);
+
+ // competent case
+ StudentModelJson studentModelFirstConceptCompetent = studentModelDatasource.getStudentModel("firstConceptCompetentStudent");
+ questionHistories = studentModelFirstConceptCompetent.getQuestionHistories().values();
+ isDeveloping = questionChooser.calcDeveloping("sky",QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertFalse(isDeveloping);
+ }
+
+ @Test
+ public void calcCompetentTest() throws IOException{
+
+ DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json");
+ StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault());
+ QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts());
+
+ // competent case
+ StudentModelJson studentModelFirstConceptCompetent = studentModelDatasource.getStudentModel("firstConceptCompetentStudent");
+ Collection questionHistories = studentModelFirstConceptCompetent.getQuestionHistories().values();
+ boolean isCompetent = questionChooser.calcCompetent("sky", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertTrue(isCompetent);
+
+ // unprepared case
+ isCompetent = questionChooser.calcCompetent("math", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("math", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertFalse(isCompetent);
+
+ // developing case
+ StudentModelJson studentModelFirstConceptDeveloping = studentModelDatasource.getStudentModel("firstConceptDeveloping");
+ questionHistories = studentModelFirstConceptDeveloping.getQuestionHistories().values();
+ isCompetent = questionChooser.calcCompetent("sky", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertFalse(isCompetent);
+
+ // exemplary case
+ StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent");
+ questionHistories = studentModelFirstConceptExemplary.getQuestionHistories().values();
+ isCompetent = questionChooser.calcCompetent("sky", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertFalse(isCompetent);
+
+ }
+
+ @Test
+ public void calcExemplaryTest() throws IOException{
+ DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json");
+ StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault());
+ QuestionChooserByOrderedConcepts questionChooser = new QuestionChooserByOrderedConcepts(domainDatasource.retrieveAllConcepts());
+
+ // exemplary first concept case
+ StudentModelJson studentModelFirstConceptExemplary = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent");
+ Collection questionHistories = studentModelFirstConceptExemplary.getQuestionHistories().values();
+ boolean isExemplary = questionChooser.calcExemplary("sky", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertTrue(isExemplary);
+
+ // developing case
+ StudentModelJson studentModelFirstConceptDeveloping = studentModelDatasource.getStudentModel("firstConceptDeveloping");
+ questionHistories = studentModelFirstConceptDeveloping.getQuestionHistories().values();
+ isExemplary = questionChooser.calcUnprepared(QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertFalse(isExemplary);
+
+
+ // unprepared case
+ isExemplary = questionChooser.calcExemplary("year", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("year", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertFalse(isExemplary);
+
+ // competent case
+ StudentModelJson studentModelFirstConceptCompetent = studentModelDatasource.getStudentModel("firstConceptCompetentStudent");
+ questionHistories = studentModelFirstConceptCompetent.getQuestionHistories().values();
+ isExemplary = questionChooser.calcExemplary("sky", QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", questionHistories, domainDatasource), questionHistories, domainDatasource);
+ assertFalse(isExemplary);
+ }
+
+ @Test
+ public void retrieveQuestionsFromStudentModelByConceptTest() throws IOException{
+ DomainDatasource domainDatasource = new DomainDatasourceJson("example","src/test/resources/rewrite/QuestionChooserSampleQuestions.json");
+ StudentModelDatasourceJson studentModelDatasource = new StudentModelDatasourceJson("chooserExample", "src/test/resources/rewrite/questionChooserSampleStudents", new JsonIoHelperDefault());
+ StudentModelJson newStudentModel = studentModelDatasource.getStudentModel("newStudent");
+
+ assertEquals(0,QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", newStudentModel.getQuestionHistories().values(), domainDatasource).size());
+
+ StudentModelJson firstConceptExemplaryStudentModel = studentModelDatasource.getStudentModel("firstConceptExemplaryStudent");
+ assertEquals(3,QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("sky", firstConceptExemplaryStudentModel.getQuestionHistories().values(), domainDatasource).size());
+ assertEquals(2,QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("math", firstConceptExemplaryStudentModel.getQuestionHistories().values(), domainDatasource).size());
+ assertEquals(2,QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("major", firstConceptExemplaryStudentModel.getQuestionHistories().values(), domainDatasource).size());
+ assertEquals(2,QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("year", firstConceptExemplaryStudentModel.getQuestionHistories().values(), domainDatasource).size());
+ assertEquals(2,QuestionChooserByOrderedConcepts.retrieveQuestionsFromStudentModelByConcept("google", firstConceptExemplaryStudentModel.getQuestionHistories().values(), domainDatasource).size());
+
+
+ }
+
+}
diff --git a/src/test/java/edu/ithaca/dragon/par/spring/ParControllerWithMockServerTest.java b/src/test/java/edu/ithaca/dragon/par/spring/ParControllerWithMockServerTest.java
new file mode 100644
index 00000000..8a8883b2
--- /dev/null
+++ b/src/test/java/edu/ithaca/dragon/par/spring/ParControllerWithMockServerTest.java
@@ -0,0 +1,35 @@
+package edu.ithaca.dragon.par.spring;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment=WebEnvironment.MOCK)
+@AutoConfigureMockMvc
+public class ParControllerWithMockServerTest {
+
+ @Autowired
+ private MockMvc mvc;
+
+ @Test
+ public void greetingTest() throws Exception{
+ long start = System.currentTimeMillis();
+ this.mvc.perform(get("/api2/")).andExpect(status().isOk()).andExpect(content().string("Hello from PAR api2"));
+ long end = System.currentTimeMillis();
+ System.out.println("\nTime it took to run in ms: "+(end-start)+"\n");
+ }
+
+
+}
diff --git a/src/test/java/edu/ithaca/dragon/par/spring/ParControllerWithServerTest.java b/src/test/java/edu/ithaca/dragon/par/spring/ParControllerWithServerTest.java
new file mode 100644
index 00000000..3d43d9c1
--- /dev/null
+++ b/src/test/java/edu/ithaca/dragon/par/spring/ParControllerWithServerTest.java
@@ -0,0 +1,132 @@
+package edu.ithaca.dragon.par.spring;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Map;
+
+import org.apache.commons.io.FileUtils;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import edu.ithaca.dragon.par.ParServer;
+import edu.ithaca.dragon.par.cohort.Cohort;
+import edu.ithaca.dragon.par.cohort.CohortDatasourceJson;
+import edu.ithaca.dragon.par.comm.CreateStudentAction;
+import edu.ithaca.dragon.par.comm.StudentAction;
+import edu.ithaca.dragon.par.domain.DomainDatasourceJson;
+import edu.ithaca.dragon.par.domain.Question;
+import edu.ithaca.dragon.par.student.json.StudentModelDatasourceJson;
+import edu.ithaca.dragon.util.JsonIoHelperDefault;
+import edu.ithaca.dragon.util.JsonIoUtil;
+
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.server.LocalServerPort;
+
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest (webEnvironment = WebEnvironment.RANDOM_PORT)
+public class ParControllerWithServerTest {
+
+ private ParController parController;
+
+ @Autowired
+ private TestRestTemplate restTemplate;
+
+ @LocalServerPort
+ private int port;
+
+ private Path cohortFile;
+
+ @BeforeEach
+ public void initController(@TempDir Path tempDir) throws Exception{
+ Path questionPoolFile = tempDir.resolve("currentQuestionPool.json");
+ Files.copy(Paths.get("src/test/resources/rewrite/testServerData/currentQuestionPool.json"),questionPoolFile);
+ Path studentDirectory = tempDir.resolve("student");
+ FileUtils.copyDirectory(new File("src/test/resources/rewrite/testServerData/student"),studentDirectory.toFile());
+ this.cohortFile = tempDir.resolve("currentCohorts.json");
+ Files.copy(Paths.get("src/test/resources/rewrite/testServerData/currentCohorts.json"),cohortFile);
+ this.parController = new ParController(
+ new ParServer(
+ new DomainDatasourceJson(
+ "HorseUltrasound",
+ questionPoolFile.toString(),
+ "src/test/resources/rewrite/testServerData/currentQuestionPool.json",
+ new JsonIoHelperDefault()
+ ),
+
+ new StudentModelDatasourceJson(
+ "allTestStudents",
+ studentDirectory.toString(),
+ new JsonIoHelperDefault()
+ ),
+
+ //TODO: remove default users from cohort datastores once there is a viable way to add students
+ new CohortDatasourceJson(
+ "allCohorts",
+ cohortFile.toString(),
+ "src/test/resources/rewrite/testServerData/currentCohorts.json",
+ new JsonIoHelperDefault()
+ )
+
+ )
+ );
+ }
+
+
+ @Test
+ public void contextLoads() throws Exception{
+ assertThat(this.parController).isNotNull();
+ }
+
+
+ @Test
+ public void greetingFromServerTest(){
+ long start = System.currentTimeMillis();
+ assertThat(this.parController.greeting()).isEqualTo("Hello from PAR api2");
+ long end = System.currentTimeMillis();
+ System.out.println("\nTime it took to run in ms: "+(end-start)+"\n");
+ }
+
+ @Test
+ public void isUserIdAvailableTest(){
+ assertThat(this.parController.isUserIdAvailable("o1")).isFalse();
+ assertThat(this.parController.isUserIdAvailable("boc1")).isTrue();
+ }
+
+ @Test
+ public void getCohortIdsTest(){
+ assertThat(this.parController.getCohortIds().contains("inOrder")).isTrue();
+ assertThat(this.parController.getCohortIds().contains("byOutOfOrderConcepts")).isFalse();
+ }
+
+ @Test
+ public void getCurrentQuestionTest(){
+ //works with attachment removed
+ Question questionToBeAsked = this.parController.getCurrentQuestion("bocTest");
+ assertThat(questionToBeAsked.getType()).isEqualTo("plane");
+ assertThat(questionToBeAsked.getId()).isEqualTo("614-plane-./images/3CTransverse.jpg");
+ }
+
+ @Test
+ public void addNewUserTest() throws IOException{
+ // issue creating cohorts from json file when reading boc (using pair list for conceptScore)
+ this.parController.addNewUser(new CreateStudentAction("o5","inOrder"));
+ Map cohortMap = new JsonIoUtil(new JsonIoHelperDefault()).mapfromReadOnlyFile("src/test/resources/rewrite/testServerData/currentCohortsNoBoc.json", Cohort.class);
+ assertThat(cohortMap.get("inOrder").studentIds.contains("o5"));
+ }
+
+
+}
diff --git a/src/test/java/edu/ithaca/dragon/par/student/json/QuestionHistoryTest.java b/src/test/java/edu/ithaca/dragon/par/student/json/QuestionHistoryTest.java
index 62b9ba18..acbdf296 100644
--- a/src/test/java/edu/ithaca/dragon/par/student/json/QuestionHistoryTest.java
+++ b/src/test/java/edu/ithaca/dragon/par/student/json/QuestionHistoryTest.java
@@ -56,7 +56,7 @@ public static List SampleQuestionsEx(){
QuestionHistory q2 = new QuestionHistory("mathQ");
q2.addTimeSeen();
- q2.addResponse("2");
+ q2.addResponse("3");
sample.add(q2);
QuestionHistory q3 = new QuestionHistory("majorQ");
@@ -163,7 +163,7 @@ public static List improvingStudent(){
QuestionHistory year = new QuestionHistory("yearQ");
year.addTimeSeen();
year.addResponse("2021");
- year.addResponse("2020");
+ //year.addResponse("2020");
improving.add(year);
QuestionHistory google = new QuestionHistory("googleQ");
diff --git a/src/test/java/edu/ithaca/dragon/par/student/json/StudentModelTest.java b/src/test/java/edu/ithaca/dragon/par/student/json/StudentModelTest.java
index fe062cbe..afce112f 100644
--- a/src/test/java/edu/ithaca/dragon/par/student/json/StudentModelTest.java
+++ b/src/test/java/edu/ithaca/dragon/par/student/json/StudentModelTest.java
@@ -1,7 +1,16 @@
package edu.ithaca.dragon.par.student.json;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+import edu.ithaca.dragon.par.analysis.QuestionHistorySummary;
+import edu.ithaca.dragon.par.domain.DomainDatasourceJson;
+import edu.ithaca.dragon.par.domain.DomainDatasourceSimple;
+import edu.ithaca.dragon.par.domain.Question;
+import edu.ithaca.dragon.util.JsonUtil;
+
+import java.io.IOException;
+import java.nio.file.Path;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@@ -26,5 +35,20 @@ void checkTimeLastSeen() {
assertEquals(8000L, poor.checkTimeLastSeen("majorQ"));
assertEquals(11000L, poor.checkTimeLastSeen("yearQ"));
+ }
+
+ @Test
+ public void ToAndFromJsonTest() throws IOException{
+ StudentModelJson improvingStudent = new StudentModelJson("improvingStudent", QuestionHistoryTest.improvingStudent());
+ DomainDatasourceSimple domainData = new DomainDatasourceSimple(JsonUtil.listFromJsonFile("src/test/resources/rewrite/SampleQuestions.json", Question.class));
+ QuestionHistorySummary qhs = new QuestionHistorySummary(improvingStudent.getQuestionHistories().values(), domainData);
+
+ assertEquals(5, qhs.getQuestionIdsSeen().size());
+ assertEquals(4, qhs.getQuestionIdsRespondedTo().size());
+ assertTrue(qhs.getQuestionIdsCorrectFirstTime().contains("mathQ"));
+ assertTrue(qhs.getQuestionIdsCorrectFirstTime().contains("majorQ"));
+
+
+
}
}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/QuestionChooserSampleQuestions.json b/src/test/resources/rewrite/QuestionChooserSampleQuestions.json
new file mode 100644
index 00000000..ab5204de
--- /dev/null
+++ b/src/test/resources/rewrite/QuestionChooserSampleQuestions.json
@@ -0,0 +1,92 @@
+[ {
+ "id" : "skyQ1",
+ "type" : "sky",
+ "questionText" : "What color is the sky?",
+ "correctAnswer" : "blue",
+ "possibleAnswers" : [ "blue", "orange" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "skyQ2",
+ "type" : "sky",
+ "questionText" : "What color is the sun?",
+ "correctAnswer" : "yellow",
+ "possibleAnswers" : [ "yellow", "red" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+
+ }, {
+ "id" : "skyQ3",
+ "type" : "sky",
+ "questionText" : "What color is a cloud?",
+ "correctAnswer" : "white/grey",
+ "possibleAnswers" : [ "white/grey", "purple" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+
+ }, {
+ "id" : "mathQ1",
+ "type" : "math",
+ "questionText" : "What is 2 + 2?",
+ "correctAnswer" : "4",
+ "possibleAnswers" : [ "2", "3", "4"],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "mathQ2",
+ "type" : "math",
+ "questionText" : "What is 1 + 1?",
+ "correctAnswer" : "2",
+ "possibleAnswers" : [ "2", "3", "4"],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "majorQ1",
+ "type" : "major",
+ "questionText" : "What is your major?",
+ "correctAnswer" : "CS",
+ "possibleAnswers" : [ "CS", "ENG", "MATH"],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "majorQ2",
+ "type" : "major",
+ "questionText" : "Which is a required course for a CS major?",
+ "correctAnswer" : "220",
+ "possibleAnswers" : [ "217", "356", "220"],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "yearQ1",
+ "type" : "year",
+ "questionText" : "What was the previous year?",
+ "correctAnswer" : "2020",
+ "possibleAnswers" : [ "2021", "2019", "2018"],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "yearQ2",
+ "type" : "year",
+ "questionText" : "What will next year be?",
+ "correctAnswer" : "2022",
+ "possibleAnswers" : [ "2021", "2022", "2023"],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "googleQ1",
+ "type" : "google",
+ "questionText" : "When was Google founded?",
+ "correctAnswer" : "1998",
+ "possibleAnswers" : [ "1998", "2001", "2005"],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "googleQ2",
+ "type" : "google",
+ "questionText" : "What color has never been in the Google logo?",
+ "correctAnswer" : "orange",
+ "possibleAnswers" : [ "yellow", "orange", "purple"],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ }
+]
\ No newline at end of file
diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsCorrectAtLeastOnce.json b/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsCorrectAtLeastOnce.json
new file mode 100644
index 00000000..d202ce93
--- /dev/null
+++ b/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsCorrectAtLeastOnce.json
@@ -0,0 +1,42 @@
+{
+ "studentId" : "allConceptsCorrectAtLeastOnce",
+ "questionHistories" : {
+ "skyQ1" : {
+ "questionId" : "skyQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "blue",
+ "millSeconds" : 1623988888888} ]
+ },
+ "skyQ2" : {
+ "questionId" : "skyQ2",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "yellow",
+ "millSeconds" : 1623988888888} ]
+ },
+ "mathQ1" : {
+ "questionId" : "mathQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "4",
+ "millSeconds" : 1623988888888} ]
+ },
+ "majorQ1" : {
+ "questionId" : "majorQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "CS",
+ "millSeconds" : 1623988888888} ]
+ },
+ "yearQ1" : {
+ "questionId" : "yearQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "2020",
+ "millSeconds" : 1623988888888} ]
+ },
+ "googleQ1" : {
+ "questionId" : "googleQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "1998",
+ "millSeconds" : 1623988888888} ]
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsExemplary.json b/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsExemplary.json
new file mode 100644
index 00000000..d35e1585
--- /dev/null
+++ b/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsExemplary.json
@@ -0,0 +1,72 @@
+{
+ "studentId" : "allConceptsExemplary",
+ "questionHistories" : {
+ "skyQ1" : {
+ "questionId" : "skyQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "blue",
+ "millSeconds" : 1623988888888} ]
+ },
+ "skyQ2" : {
+ "questionId" : "skyQ2",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "yellow",
+ "millSeconds" : 1623988888888} ]
+ },
+ "skyQ3" : {
+ "questionId" : "skyQ3",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "white/grey",
+ "millSeconds" : 1623988888888} ]
+ },
+ "mathQ1" : {
+ "questionId" : "mathQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "4",
+ "millSeconds" : 1623988888888} ]
+ },
+ "mathQ2" : {
+ "questionId" : "mathQ2",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "2",
+ "millSeconds" : 1623988888888} ]
+ },
+ "majorQ1" : {
+ "questionId" : "majorQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "CS",
+ "millSeconds" : 1623988888888} ]
+ },
+ "majorQ2" : {
+ "questionId" : "majorQ2",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "220",
+ "millSeconds" : 1623988888888} ]
+ },
+ "yearQ1" : {
+ "questionId" : "yearQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "2020",
+ "millSeconds" : 1623988888888} ]
+ },
+ "yearQ2" : {
+ "questionId" : "yearQ2",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "2022",
+ "millSeconds" : 1623988888888} ]
+ },
+ "googleQ1" : {
+ "questionId" : "googleQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "1998",
+ "millSeconds" : 1623988888888} ]
+ },
+ "googleQ2" : {
+ "questionId" : "googleQ2",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "orange",
+ "millSeconds" : 1623988888888} ]
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsUnprepared.json b/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsUnprepared.json
new file mode 100644
index 00000000..08b3dc41
--- /dev/null
+++ b/src/test/resources/rewrite/questionChooserSampleStudents/allConceptsUnprepared.json
@@ -0,0 +1,36 @@
+{
+ "studentId" : "allConceptsUnprepared",
+ "questionHistories" : {
+ "skyQ1" : {
+ "questionId" : "skyQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "orange",
+ "millSeconds" : 1623988888888} ]
+ },
+ "mathQ1" : {
+ "questionId" : "mathQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "2",
+ "millSeconds" : 1623988888888} ]
+ },
+ "majorQ1" : {
+ "questionId" : "majorQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "ENG",
+ "millSeconds" : 1623988888888} ]
+ },
+ "yearQ1" : {
+ "questionId" : "yearQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "2019",
+ "millSeconds" : 1623988888888} ]
+ },
+ "googleQ1" : {
+ "questionId" : "googleQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "2005",
+ "millSeconds" : 1623988888888} ]
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptCompetentStudent.json b/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptCompetentStudent.json
new file mode 100644
index 00000000..9089a48b
--- /dev/null
+++ b/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptCompetentStudent.json
@@ -0,0 +1,25 @@
+{
+ "studentId" : "firstConceptCompetentStudent",
+ "questionHistories" : {
+ "skyQ1" : {
+ "questionId" : "skyQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "blue",
+ "millSeconds" : 1623988888888} ]
+ },
+ "skyQ2" : {
+ "questionId" : "skyQ2",
+ "timesSeen" : [ 1623999999999 ],
+ "responses" : [ {"responseText" : "red",
+ "millSeconds" : 1624000000005} ]
+ },
+ "skyQ3" : {
+ "questionId" : "skyQ3",
+ "timesSeen" : [ 1624000000105 ],
+ "responses" : [ {"responseText" : "white/grey",
+ "millSeconds" : 1624000000005} ]
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptDeveloping.json b/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptDeveloping.json
new file mode 100644
index 00000000..15664196
--- /dev/null
+++ b/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptDeveloping.json
@@ -0,0 +1,12 @@
+{
+ "studentId" : "firstConceptDeveloping",
+ "questionHistories" : {
+ "skyQ1" : {
+ "questionId" : "skyQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "blue",
+ "millSeconds" : 1623988888888} ]
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptExemplaryStudent.json b/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptExemplaryStudent.json
new file mode 100644
index 00000000..4e1ae566
--- /dev/null
+++ b/src/test/resources/rewrite/questionChooserSampleStudents/firstConceptExemplaryStudent.json
@@ -0,0 +1,23 @@
+{
+ "studentId" : "firstConceptExemplaryStudent",
+ "questionHistories" : {
+ "skyQ1" : {
+ "questionId" : "skyQ1",
+ "timesSeen" : [ 1623971804511 ],
+ "responses" : [ {"responseText" : "blue",
+ "millSeconds" : 1623988888888} ]
+ },
+ "skyQ2" : {
+ "questionId" : "skyQ2",
+ "timesSeen" : [ 1623999999999 ],
+ "responses" : [ {"responseText" : "yellow",
+ "millSeconds" : 1624000000005} ]
+ },
+ "skyQ3" : {
+ "questionId" : "skyQ3",
+ "timesSeen" : [ 1624000000105 ],
+ "responses" : [ {"responseText" : "white/grey",
+ "millSeconds" : 1624000000005} ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/questionChooserSampleStudents/newStudent.json b/src/test/resources/rewrite/questionChooserSampleStudents/newStudent.json
new file mode 100644
index 00000000..71f059e0
--- /dev/null
+++ b/src/test/resources/rewrite/questionChooserSampleStudents/newStudent.json
@@ -0,0 +1,4 @@
+{
+ "studentId" : "newStudent",
+ "questionHistories" : { }
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/testServerData/currentCohorts.json b/src/test/resources/rewrite/testServerData/currentCohorts.json
new file mode 100644
index 00000000..50d99dda
--- /dev/null
+++ b/src/test/resources/rewrite/testServerData/currentCohorts.json
@@ -0,0 +1,29 @@
+{
+ "random" : {
+ "id" : "random",
+ "domainId" : "HorseUltrasound",
+ "studentIds" : [ "r2", "r3", "r1" ],
+ "questionChooser" : {
+ "type" : "QuestionChooserRandom"
+ }
+ },
+ "inOrder" : {
+ "id" : "inOrder",
+ "domainId" : "HorseUltrasound",
+ "studentIds" : [ "o1", "o2", "o3", "o4" ],
+ "questionChooser" : {
+ "type" : "QuestionChooserInOrder",
+ "questionIdsInOrder" : [ "858-structure1-./images/2ATransverse.jpg", "850-structure3-./images/Annotated2Long.jpg", "866-plane-./images/3BTransverse.jpg", "847-structure2-./images/Annotated2Long.jpg", "614-plane-./images/3CTransverse.jpg" ]
+ }
+ },
+ "byOrderedConcepts" : {
+ "id" : "byOrderedConcepts",
+ "domainId" : "HorseUltrasound",
+ "studentIds" : [ "bocTest" ],
+ "questionChooser" : {
+ "type" : "QuestionChooserByOrderedConcepts",
+ "conceptScores" : [ ],
+ "conceptIds" : [ "plane", "structure", "zone" ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/testServerData/currentCohortsNoBoc.json b/src/test/resources/rewrite/testServerData/currentCohortsNoBoc.json
new file mode 100644
index 00000000..45b4410d
--- /dev/null
+++ b/src/test/resources/rewrite/testServerData/currentCohortsNoBoc.json
@@ -0,0 +1,19 @@
+{
+ "random" : {
+ "id" : "random",
+ "domainId" : "HorseUltrasound",
+ "studentIds" : [ "r2", "r3", "r1" ],
+ "questionChooser" : {
+ "type" : "QuestionChooserRandom"
+ }
+ },
+ "inOrder" : {
+ "id" : "inOrder",
+ "domainId" : "HorseUltrasound",
+ "studentIds" : [ "o1", "o2", "o3", "o4" ],
+ "questionChooser" : {
+ "type" : "QuestionChooserInOrder",
+ "questionIdsInOrder" : [ "858-structure1-./images/2ATransverse.jpg", "850-structure3-./images/Annotated2Long.jpg", "866-plane-./images/3BTransverse.jpg", "847-structure2-./images/Annotated2Long.jpg", "614-plane-./images/3CTransverse.jpg" ]
+ }
+ }
+ }
\ No newline at end of file
diff --git a/src/test/resources/rewrite/testServerData/currentQuestionPool.json b/src/test/resources/rewrite/testServerData/currentQuestionPool.json
new file mode 100644
index 00000000..b3781e30
--- /dev/null
+++ b/src/test/resources/rewrite/testServerData/currentQuestionPool.json
@@ -0,0 +1,1969 @@
+[ {
+ "id" : "614-plane-./images/3CTransverse.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "617-structure0-./images/3CTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is in the near field?",
+ "correctAnswer" : "palmar annular ligament",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "620-structure1-./images/3CTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 1 cm deep?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "618-attachment0-structure1-./images/3CTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "619-attachment1-structure1-./images/3CTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "623-structure2-./images/3CTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What are the hyperechoic structures 2.5 cm deep?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "626-structure3-./images/3CTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 1.5 cm deep?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "624-attachment0-structure3-./images/3CTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "625-attachment1-structure3-./images/3CTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "Distal phalanx (P3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "627-zone-./images/3CTransverse.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "3c",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/3CTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "628-plane-./images/Zone3Longitudinal.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "longitudinal (long axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/Zone3Longitudinal.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "631-structure0-./images/Zone3Longitudinal.jpg",
+ "type" : "structure",
+ "questionText" : "What is the hyperechoic structure 4.5 cm deep?",
+ "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Zone3Longitudinal.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "634-structure1-./images/Zone3Longitudinal.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 1 cm deep?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Zone3Longitudinal.jpg",
+ "followupQuestions" : [ {
+ "id" : "632-attachment0-structure1-./images/Zone3Longitudinal.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Zone3Longitudinal.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "633-attachment1-structure1-./images/Zone3Longitudinal.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Zone3Longitudinal.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "637-structure2-./images/Zone3Longitudinal.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 1.5 cm deep?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Zone3Longitudinal.jpg",
+ "followupQuestions" : [ {
+ "id" : "635-attachment0-structure2-./images/Zone3Longitudinal.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Zone3Longitudinal.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "636-attachment1-structure2-./images/Zone3Longitudinal.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Zone3Longitudinal.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "641-zone-./images/Zone3Longitudinal.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "3",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/Zone3Longitudinal.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "656-plane-./images/Annotated3ATrans.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/Annotated3ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "659-structure0-./images/Annotated3ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the blue stars?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "657-attachment0-structure0-./images/Annotated3ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated3ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "658-attachment1-structure0-./images/Annotated3ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated3ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "662-structure1-./images/Annotated3ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the green star?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "660-attachment0-structure1-./images/Annotated3ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated3ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "661-attachment1-structure1-./images/Annotated3ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated3ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "665-structure2-./images/Annotated3ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structures are indicated by the white stars?",
+ "correctAnswer" : "palmar metacarpal vessels (medial/lateral)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "668-structure3-./images/Annotated3ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structures are indicated by the orange stars?",
+ "correctAnswer" : "suspensory ligament (branches)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "666-attachment0-structure3-./images/Annotated3ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated3ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "667-attachment1-structure3-./images/Annotated3ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated3ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "669-zone-./images/Annotated3ATrans.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "3a",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/Annotated3ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "670-plane-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "673-structure0-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the green line?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "671-attachment0-structure0-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "672-attachment1-structure0-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "676-structure1-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the blue line?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "674-attachment0-structure1-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "675-attachment1-structure1-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "679-structure2-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the red line?",
+ "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "677-attachment0-structure2-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "678-attachment1-structure2-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "682-structure3-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the yellow line?",
+ "correctAnswer" : "suspensory ligament (body)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "680-attachment0-structure3-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "681-attachment1-structure3-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "683-zone-./images/ExtraAnnotated1ATrans.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "1a",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/ExtraAnnotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "684-plane-./images/Annotated2ATrans.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/Annotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "687-structure0-./images/Annotated2ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structures are indicated by the white lines?",
+ "correctAnswer" : "palmar vessels (medial/lateral)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "690-structure1-./images/Annotated2ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the blue line?",
+ "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated2ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "688-attachment0-structure1-./images/Annotated2ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "689-attachment1-structure1-./images/Annotated2ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "693-structure2-./images/Annotated2ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the yellow line?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated2ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "691-attachment0-structure2-./images/Annotated2ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "692-attachment1-structure2-./images/Annotated2ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "696-structure3-./images/Annotated2ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the green line?",
+ "correctAnswer" : "suspensory ligament (body)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated2ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "694-attachment0-structure3-./images/Annotated2ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "695-attachment1-structure3-./images/Annotated2ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "697-zone-./images/Annotated2ATrans.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "2a",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/Annotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "698-plane-./images/Annotated3BTrans.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/Annotated3BTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "701-structure0-./images/Annotated3BTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the white stars?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3BTrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "699-attachment0-structure0-./images/Annotated3BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated3BTrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "700-attachment1-structure0-./images/Annotated3BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated3BTrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "704-structure1-./images/Annotated3BTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the red star?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3BTrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "702-attachment0-structure1-./images/Annotated3BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated3BTrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "703-attachment1-structure1-./images/Annotated3BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated3BTrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "707-structure2-./images/Annotated3BTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the yellow star?",
+ "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3BTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "710-structure3-./images/Annotated3BTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structures are indicated by the blue stars?",
+ "correctAnswer" : "suspensory ligament (branches)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3BTrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "708-attachment0-structure3-./images/Annotated3BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated3BTrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "709-attachment1-structure3-./images/Annotated3BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated3BTrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "711-zone-./images/Annotated3BTrans.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "3b",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/Annotated3BTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "712-plane-./images/Annotated3CTrans.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/Annotated3CTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "715-structure0-./images/Annotated3CTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the white stars?",
+ "correctAnswer" : "palmar annular ligament",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3CTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "718-structure1-./images/Annotated3CTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the yellow star?",
+ "correctAnswer" : "palmar ligament",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3CTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "721-structure2-./images/Annotated3CTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structures are indicated by the red stars?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3CTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "724-structure3-./images/Annotated3CTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the green stars?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3CTrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "722-attachment0-structure3-./images/Annotated3CTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated3CTrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "723-attachment1-structure3-./images/Annotated3CTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated3CTrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "725-zone-./images/Annotated3CTrans.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "3c",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/Annotated3CTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "726-plane-./images/1BTransverse.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/1BTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "729-structure0-./images/1BTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What soft tissue structure is in the far field?",
+ "correctAnswer" : "suspensory ligament (body)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/1BTransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "727-attachment0-structure0-./images/1BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/1BTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "728-attachment1-structure0-./images/1BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/1BTransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "732-structure1-./images/1BTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What hypoechoic structures are 2.5 cm deep?",
+ "correctAnswer" : "palmar vessels (medial/lateral)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/1BTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "735-structure2-./images/1BTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 2 cm deep?",
+ "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/1BTransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "733-attachment0-structure2-./images/1BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/1BTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "734-attachment1-structure2-./images/1BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/1BTransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "738-structure3-./images/1BTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is in the near field?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/1BTransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "736-attachment0-structure3-./images/1BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/1BTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "737-attachment1-structure3-./images/1BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/1BTransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "739-zone-./images/1BTransverse.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "1b",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/1BTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "740-plane-./images/AlternativeZone2Long.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "longitudinal (long axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/AlternativeZone2Long.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "743-structure0-./images/AlternativeZone2Long.jpg",
+ "type" : "structure",
+ "questionText" : "What is the hypoechoic structure?",
+ "correctAnswer" : "palmar vessels (medial/lateral)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/AlternativeZone2Long.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "746-structure1-./images/AlternativeZone2Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 2 cm deep?",
+ "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/AlternativeZone2Long.jpg",
+ "followupQuestions" : [ {
+ "id" : "744-attachment0-structure1-./images/AlternativeZone2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/AlternativeZone2Long.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "745-attachment1-structure1-./images/AlternativeZone2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/AlternativeZone2Long.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "749-structure2-./images/AlternativeZone2Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 1 cm deep?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/AlternativeZone2Long.jpg",
+ "followupQuestions" : [ {
+ "id" : "747-attachment0-structure2-./images/AlternativeZone2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/AlternativeZone2Long.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "748-attachment1-structure2-./images/AlternativeZone2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/AlternativeZone2Long.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "752-structure3-./images/AlternativeZone2Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 1.5 cm deep?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/AlternativeZone2Long.jpg",
+ "followupQuestions" : [ {
+ "id" : "750-attachment0-structure3-./images/AlternativeZone2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/AlternativeZone2Long.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "751-attachment1-structure3-./images/AlternativeZone2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/AlternativeZone2Long.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "753-zone-./images/AlternativeZone2Long.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "2",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/AlternativeZone2Long.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "754-plane-./images/Annotated1ATrans.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "757-structure0-./images/Annotated1ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the orange star?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "755-attachment0-structure0-./images/Annotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "756-attachment1-structure0-./images/Annotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "760-structure1-./images/Annotated1ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the green star?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "758-attachment0-structure1-./images/Annotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "759-attachment1-structure1-./images/Annotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "763-structure2-./images/Annotated1ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the blue star?",
+ "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "761-attachment0-structure2-./images/Annotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "762-attachment1-structure2-./images/Annotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "766-structure3-./images/Annotated1ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the red star?",
+ "correctAnswer" : "suspensory ligament (body)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "764-attachment0-structure3-./images/Annotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "765-attachment1-structure3-./images/Annotated1ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "767-zone-./images/Annotated1ATrans.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "1a",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/Annotated1ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "768-plane-./images/1ATransverse.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "771-structure0-./images/1ATransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 1 cm deep?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "769-attachment0-structure0-./images/1ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "770-attachment1-structure0-./images/1ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "774-structure1-./images/1ATransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 1.5 cm deep?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "772-attachment0-structure1-./images/1ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "773-attachment1-structure1-./images/1ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "777-structure2-./images/1ATransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 2.5 cm deep?",
+ "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "775-attachment0-structure2-./images/1ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "776-attachment1-structure2-./images/1ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "780-structure3-./images/1ATransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 3.5 cm deep?",
+ "correctAnswer" : "suspensory ligament (body)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "778-attachment0-structure3-./images/1ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "779-attachment1-structure3-./images/1ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "781-zone-./images/1ATransverse.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "1a",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/1ATransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "782-plane-./images/Annotated3Long.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "longitudinal (long axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/Annotated3Long.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "785-structure0-./images/Annotated3Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the red stars?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3Long.jpg",
+ "followupQuestions" : [ {
+ "id" : "783-attachment0-structure0-./images/Annotated3Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated3Long.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "784-attachment1-structure0-./images/Annotated3Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated3Long.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "788-structure1-./images/Annotated3Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the blue stars?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3Long.jpg",
+ "followupQuestions" : [ {
+ "id" : "786-attachment0-structure1-./images/Annotated3Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated3Long.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "787-attachment1-structure1-./images/Annotated3Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated3Long.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "791-structure2-./images/Annotated3Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the yellow star?",
+ "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated3Long.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "795-zone-./images/Annotated3Long.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "3",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/Annotated3Long.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "796-plane-./images/2BTransverse.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/2BTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "799-structure0-./images/2BTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 3 cm deep?",
+ "correctAnswer" : "suspensory ligament (body)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/2BTransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "797-attachment0-structure0-./images/2BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/2BTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "798-attachment1-structure0-./images/2BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/2BTransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "802-structure1-./images/2BTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What are the hypoechoic structures 2.5 cm deep?",
+ "correctAnswer" : "palmar vessels (medial/lateral)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/2BTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "805-structure2-./images/2BTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 1.5 cm deep?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/2BTransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "803-attachment0-structure2-./images/2BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/2BTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "804-attachment1-structure2-./images/2BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/2BTransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "808-structure3-./images/2BTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What is the structure in the near field? ",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/2BTransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "806-attachment0-structure3-./images/2BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/2BTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "807-attachment1-structure3-./images/2BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/2BTransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "809-zone-./images/2BTransverse.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "2b",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/2BTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "810-plane-./images/Annotated2BTrans.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/Annotated2BTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "813-structure0-./images/Annotated2BTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the blue star?",
+ "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated2BTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "816-structure1-./images/Annotated2BTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the green star?",
+ "correctAnswer" : "suspensory ligament (body)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated2BTrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "814-attachment0-structure1-./images/Annotated2BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated2BTrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "815-attachment1-structure1-./images/Annotated2BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated2BTrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "819-structure2-./images/Annotated2BTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structures are indicated by the white stars?",
+ "correctAnswer" : "palmar vessels (medial/lateral)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated2BTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "822-structure3-./images/Annotated2BTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the yellow star?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated2BTrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "820-attachment0-structure3-./images/Annotated2BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated2BTrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "821-attachment1-structure3-./images/Annotated2BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated2BTrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "823-zone-./images/Annotated2BTrans.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "2b",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/Annotated2BTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "824-plane-./images/3ATransverse.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/3ATransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "827-structure0-./images/3ATransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is in the near field?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/3ATransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "825-attachment0-structure0-./images/3ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/3ATransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "826-attachment1-structure0-./images/3ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/3ATransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "830-structure1-./images/3ATransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What are the soft tissue structures in the far field?",
+ "correctAnswer" : "suspensory ligament (branches)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/3ATransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "828-attachment0-structure1-./images/3ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/3ATransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "829-attachment1-structure1-./images/3ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/3ATransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "833-structure2-./images/3ATransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What are the hypoechoic structures?",
+ "correctAnswer" : "palmar vessels (medial/lateral)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/3ATransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "836-structure3-./images/3ATransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 1.5 cm deep?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/3ATransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "834-attachment0-structure3-./images/3ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/3ATransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "835-attachment1-structure3-./images/3ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/3ATransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "837-zone-./images/3ATransverse.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "3a",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/3ATransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "838-plane-./images/Annotated2Long.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "longitudinal (long axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "841-structure0-./images/Annotated2Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the white stars?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ {
+ "id" : "839-attachment0-structure0-./images/Annotated2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "840-attachment1-structure0-./images/Annotated2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "844-structure1-./images/Annotated2Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the yellow stars?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ {
+ "id" : "842-attachment0-structure1-./images/Annotated2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "843-attachment1-structure1-./images/Annotated2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "847-structure2-./images/Annotated2Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the red stars?",
+ "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ {
+ "id" : "845-attachment0-structure2-./images/Annotated2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "846-attachment1-structure2-./images/Annotated2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "850-structure3-./images/Annotated2Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the green stars?",
+ "correctAnswer" : "suspensory ligament (body)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ {
+ "id" : "848-attachment0-structure3-./images/Annotated2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "849-attachment1-structure3-./images/Annotated2Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "851-zone-./images/Annotated2Long.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "2",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/Annotated2Long.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "852-plane-./images/2ATransverse.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/2ATransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "855-structure0-./images/2ATransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 3.5 cm deep?",
+ "correctAnswer" : "suspensory ligament (body)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/2ATransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "853-attachment0-structure0-./images/2ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/2ATransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "854-attachment1-structure0-./images/2ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/2ATransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "858-structure1-./images/2ATransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure has joined with the structure 1.5 cm deep?",
+ "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/2ATransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "856-attachment0-structure1-./images/2ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/2ATransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "857-attachment1-structure1-./images/2ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/2ATransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "861-structure2-./images/2ATransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What is the hypoechoic structure 2.5 cm deep?",
+ "correctAnswer" : "palmar vessels (medial/lateral)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/2ATransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "864-structure3-./images/2ATransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is in the near field?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/2ATransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "862-attachment0-structure3-./images/2ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/2ATransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "863-attachment1-structure3-./images/2ATransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/2ATransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "865-zone-./images/2ATransverse.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "2a",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/2ATransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "866-plane-./images/3BTransverse.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/3BTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "869-structure0-./images/3BTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structures are 3 cm deep?",
+ "correctAnswer" : "suspensory ligament (branches)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/3BTransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "867-attachment0-structure0-./images/3BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/3BTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "868-attachment1-structure0-./images/3BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/3BTransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "872-structure1-./images/3BTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What hyperechoic structure is in the far field?",
+ "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/3BTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "875-structure2-./images/3BTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 1 cm deep?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/3BTransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "873-attachment0-structure2-./images/3BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/3BTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "874-attachment1-structure2-./images/3BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/3BTransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "878-structure3-./images/3BTransverse.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 1.5 cm deep?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/3BTransverse.jpg",
+ "followupQuestions" : [ {
+ "id" : "876-attachment0-structure3-./images/3BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/3BTransverse.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "877-attachment1-structure3-./images/3BTransverse.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/3BTransverse.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "879-zone-./images/3BTransverse.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "3b",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/3BTransverse.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "880-plane-./images/AlternativeZone1Long.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "longitudinal (long axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/AlternativeZone1Long.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "883-structure0-./images/AlternativeZone1Long.jpg",
+ "type" : "structure",
+ "questionText" : "What is the hyperechoic structure in the far field?",
+ "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/AlternativeZone1Long.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "886-structure1-./images/AlternativeZone1Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 3.5 cm deep?",
+ "correctAnswer" : "suspensory ligament (body)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/AlternativeZone1Long.jpg",
+ "followupQuestions" : [ {
+ "id" : "884-attachment0-structure1-./images/AlternativeZone1Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/AlternativeZone1Long.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "885-attachment1-structure1-./images/AlternativeZone1Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/AlternativeZone1Long.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "889-structure2-./images/AlternativeZone1Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is 2 cm deep?",
+ "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/AlternativeZone1Long.jpg",
+ "followupQuestions" : [ {
+ "id" : "887-attachment0-structure2-./images/AlternativeZone1Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/AlternativeZone1Long.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "888-attachment1-structure2-./images/AlternativeZone1Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/AlternativeZone1Long.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "892-structure3-./images/AlternativeZone1Long.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is in the near field?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/AlternativeZone1Long.jpg",
+ "followupQuestions" : [ {
+ "id" : "890-attachment0-structure3-./images/AlternativeZone1Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/AlternativeZone1Long.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "891-attachment1-structure3-./images/AlternativeZone1Long.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/AlternativeZone1Long.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "893-zone-./images/AlternativeZone1Long.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "1",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/AlternativeZone1Long.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "600-plane-./images/Annotated1BTrans.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "603-structure0-./images/Annotated1BTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the orange star?",
+ "correctAnswer" : "superficial digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "601-attachment0-structure0-./images/Annotated1BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "602-attachment1-structure0-./images/Annotated1BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "both proximal and middle phalanxes",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "606-structure1-./images/Annotated1BTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the white star?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "604-attachment0-structure1-./images/Annotated1BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "605-attachment1-structure1-./images/Annotated1BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "609-structure2-./images/Annotated1BTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the yellow star?",
+ "correctAnswer" : "distal check ligament (accessory ligament of the deep digital flexor tendon)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "607-attachment0-structure2-./images/Annotated1BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "both the proximal metacarpus 3 and distal row of carpal bones",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "608-attachment1-structure2-./images/Annotated1BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "612-structure3-./images/Annotated1BTrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the blue star?",
+ "correctAnswer" : "suspensory ligament (body)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "610-attachment0-structure3-./images/Annotated1BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "611-attachment1-structure3-./images/Annotated1BTrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "613-zone-./images/Annotated1BTrans.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "1b",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/Annotated1BTrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "642-plane-./images/AddlAnnotated2ATrans.jpg",
+ "type" : "plane",
+ "questionText" : "On which plane is the ultrasound taken?",
+ "correctAnswer" : "transverse (short axis)",
+ "possibleAnswers" : [ "transverse (short axis)", "longitudinal (long axis)" ],
+ "imageUrl" : "./images/AddlAnnotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "645-structure0-./images/AddlAnnotated2ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the white star?",
+ "correctAnswer" : "deep digital flexor tendon",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/AddlAnnotated2ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "643-attachment0-structure0-./images/AddlAnnotated2ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "medial humeral epicondyle",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/AddlAnnotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "644-attachment1-structure0-./images/AddlAnnotated2ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "distal phalanx (p3)",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/AddlAnnotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "648-structure1-./images/AddlAnnotated2ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the orange star?",
+ "correctAnswer" : "suspensory ligament (body)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/AddlAnnotated2ATrans.jpg",
+ "followupQuestions" : [ {
+ "id" : "646-attachment0-structure1-./images/AddlAnnotated2ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s proximal attachment?",
+ "correctAnswer" : "proximal metacarpus 3",
+ "possibleAnswers" : [ "Medial humeral epicondyle", "Lateral humeral epicondyle", "Both the proximal metacarpus 3 and distal row of carpal bones", "Distal row of carpal bones", "proximal metacarpus 3" ],
+ "imageUrl" : "./images/AddlAnnotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+ }, {
+ "id" : "647-attachment1-structure1-./images/AddlAnnotated2ATrans.jpg",
+ "type" : "attachment",
+ "questionText" : "What is this structure’s distal attachment?",
+ "correctAnswer" : "proximal sesamoid bones",
+ "possibleAnswers" : [ "Proximal phalanx (P1)", "Middle phalanx (P2)", "Distal phalanx (P3)", "Proximal sesamoid bones", "Both proximal and middle phalanxes", "Deep digital flexor tendon" ],
+ "imageUrl" : "./images/AddlAnnotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+ } ]
+}, {
+ "id" : "651-structure2-./images/AddlAnnotated2ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structure is indicated by the red star?",
+ "correctAnswer" : "metacarpus bone 3 (third metacarpal bone)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/AddlAnnotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "654-structure3-./images/AddlAnnotated2ATrans.jpg",
+ "type" : "structure",
+ "questionText" : "What structures are indicated by the green stars?",
+ "correctAnswer" : "palmar vessels (medial/lateral)",
+ "possibleAnswers" : [ "Superficial digital flexor tendon", "Deep digital flexor tendon", "Suspensory ligament (body)", "Suspensory ligament (branches)", "Distal check ligament (accessory ligament of the deep digital flexor tendon)", "Metacarpus bone 3 (Third metacarpal bone)", "Proximal sesamoid bones", "P1 (First phalanx)", "P2 (Second phalanx)", "Distal sesamoidean ligaments – straight and oblique)", "Palmar annular ligament", "Palmar ligament", "Palmar vessels (medial/lateral)", "Palmar metacarpal vessels (medial/lateral)" ],
+ "imageUrl" : "./images/AddlAnnotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+}, {
+ "id" : "655-zone-./images/AddlAnnotated2ATrans.jpg",
+ "type" : "zone",
+ "questionText" : "In which zone is the ultrasound taken?",
+ "correctAnswer" : "2a",
+ "possibleAnswers" : [ "1", "1A", "1B", "2", "2A", "2B", "3", "3A", "3B", "3C" ],
+ "imageUrl" : "./images/AddlAnnotated2ATrans.jpg",
+ "followupQuestions" : [ ]
+} ]
\ No newline at end of file
diff --git a/src/test/resources/rewrite/testServerData/student/bocTest.json b/src/test/resources/rewrite/testServerData/student/bocTest.json
new file mode 100644
index 00000000..42d776e1
--- /dev/null
+++ b/src/test/resources/rewrite/testServerData/student/bocTest.json
@@ -0,0 +1,4 @@
+{
+ "studentId" : "bocTest",
+ "questionHistories" : {}
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/testServerData/student/o1.json b/src/test/resources/rewrite/testServerData/student/o1.json
new file mode 100644
index 00000000..ee0f9c25
--- /dev/null
+++ b/src/test/resources/rewrite/testServerData/student/o1.json
@@ -0,0 +1,37 @@
+{
+ "studentId" : "o1",
+ "questionHistories" : {
+ "847-structure2-./images/Annotated2Long.jpg" : {
+ "questionId" : "847-structure2-./images/Annotated2Long.jpg",
+ "timesSeen" : [ 1625259814533 ],
+ "responses" : [ ]
+ },
+ "858-structure1-./images/2ATransverse.jpg" : {
+ "questionId" : "858-structure1-./images/2ATransverse.jpg",
+ "timesSeen" : [ 1625259604756 ],
+ "responses" : [ {
+ "responseText" : "Suspensory ligament (body)",
+ "millSeconds" : 1625259624283
+ }, {
+ "responseText" : "... I don't know",
+ "millSeconds" : 1625259628254
+ } ]
+ },
+ "850-structure3-./images/Annotated2Long.jpg" : {
+ "questionId" : "850-structure3-./images/Annotated2Long.jpg",
+ "timesSeen" : [ 1625259631255 ],
+ "responses" : [ {
+ "responseText" : "... I don't know",
+ "millSeconds" : 1625259635860
+ } ]
+ },
+ "866-plane-./images/3BTransverse.jpg" : {
+ "questionId" : "866-plane-./images/3BTransverse.jpg",
+ "timesSeen" : [ 1625259636802 ],
+ "responses" : [ {
+ "responseText" : "transverse (short axis)",
+ "millSeconds" : 1625259640814
+ } ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/testServerData/student/o2.json b/src/test/resources/rewrite/testServerData/student/o2.json
new file mode 100644
index 00000000..c3552184
--- /dev/null
+++ b/src/test/resources/rewrite/testServerData/student/o2.json
@@ -0,0 +1,4 @@
+{
+ "studentId" : "o2",
+ "questionHistories" : [ ]
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/testServerData/student/o3.json b/src/test/resources/rewrite/testServerData/student/o3.json
new file mode 100644
index 00000000..9e7183f5
--- /dev/null
+++ b/src/test/resources/rewrite/testServerData/student/o3.json
@@ -0,0 +1,4 @@
+{
+ "studentId" : "o3",
+ "questionHistories" : [ ]
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/testServerData/student/o4.json b/src/test/resources/rewrite/testServerData/student/o4.json
new file mode 100644
index 00000000..1f992b55
--- /dev/null
+++ b/src/test/resources/rewrite/testServerData/student/o4.json
@@ -0,0 +1,4 @@
+{
+ "studentId" : "o4",
+ "questionHistories" : [ ]
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/testServerData/student/r1.json b/src/test/resources/rewrite/testServerData/student/r1.json
new file mode 100644
index 00000000..644142ae
--- /dev/null
+++ b/src/test/resources/rewrite/testServerData/student/r1.json
@@ -0,0 +1,4 @@
+{
+ "studentId" : "r1",
+ "questionHistories" : [ ]
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/testServerData/student/r2.json b/src/test/resources/rewrite/testServerData/student/r2.json
new file mode 100644
index 00000000..73d5bcc9
--- /dev/null
+++ b/src/test/resources/rewrite/testServerData/student/r2.json
@@ -0,0 +1,4 @@
+{
+ "studentId" : "r2",
+ "questionHistories" : [ ]
+}
\ No newline at end of file
diff --git a/src/test/resources/rewrite/testServerData/student/r3.json b/src/test/resources/rewrite/testServerData/student/r3.json
new file mode 100644
index 00000000..309f84ff
--- /dev/null
+++ b/src/test/resources/rewrite/testServerData/student/r3.json
@@ -0,0 +1,4 @@
+{
+ "studentId" : "r3",
+ "questionHistories" : [ ]
+}
\ No newline at end of file