From fc96ec673822d9f1cbe0e5eb004c12b7f8f2db9b Mon Sep 17 00:00:00 2001 From: Szymon Szukalski Date: Tue, 23 Jul 2024 14:48:26 +1000 Subject: Create JAXB beans and initial test for request model --- pom.xml | 13 +- .../stileeducation/markr/dto/MCQTestResultDTO.java | 102 + .../markr/dto/MCQTestResultsDTO.java | 43 + .../stileeducation/markr/dto/SummaryMarksDTO.java | 51 + src/main/resources/application.properties | 2 + .../markr/MarkrApplicationTests.java | 13 - .../markr/dto/MCQTestResultsDTOTests.java | 36 + src/test/resources/sample-results.xml | 2703 ++++++++++++++++++++ 8 files changed, 2949 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/stileeducation/markr/dto/MCQTestResultDTO.java create mode 100644 src/main/java/com/stileeducation/markr/dto/MCQTestResultsDTO.java create mode 100644 src/main/java/com/stileeducation/markr/dto/SummaryMarksDTO.java delete mode 100644 src/test/java/com/stileeducation/markr/MarkrApplicationTests.java create mode 100644 src/test/java/com/stileeducation/markr/dto/MCQTestResultsDTOTests.java create mode 100644 src/test/resources/sample-results.xml diff --git a/pom.xml b/pom.xml index 7538324..7733738 100644 --- a/pom.xml +++ b/pom.xml @@ -38,12 +38,23 @@ org.springframework.boot spring-boot-starter-web - + + jakarta.xml.bind + jakarta.xml.bind-api + + + org.glassfish.jaxb + jaxb-runtime + org.springframework.boot spring-boot-starter-test test + + org.assertj + assertj-core + diff --git a/src/main/java/com/stileeducation/markr/dto/MCQTestResultDTO.java b/src/main/java/com/stileeducation/markr/dto/MCQTestResultDTO.java new file mode 100644 index 0000000..b227fe3 --- /dev/null +++ b/src/main/java/com/stileeducation/markr/dto/MCQTestResultDTO.java @@ -0,0 +1,102 @@ +package com.stileeducation.markr.dto; + +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; + +import java.util.Objects; + +@XmlRootElement(name = "mcq-test-result") +public class MCQTestResultDTO { + + private String scannedOn; + private String firstName; + private String lastName; + private String studentNumber; + private String testId; + private SummaryMarksDTO summaryMarks; + + @XmlAttribute(name = "scanned-on") + public String getScannedOn() { + return scannedOn; + } + + public void setScannedOn(String scannedOn) { + this.scannedOn = scannedOn; + } + + @XmlElement(name = "first-name") + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + @XmlElement(name = "last-name") + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + @XmlElement(name = "student-number") + public String getStudentNumber() { + return studentNumber; + } + + public void setStudentNumber(String studentNumber) { + this.studentNumber = studentNumber; + } + + @XmlElement(name = "test-id") + public String getTestId() { + return testId; + } + + public void setTestId(String testId) { + this.testId = testId; + } + + @XmlElement(name = "summary-marks") + public SummaryMarksDTO getSummaryMarks() { + return summaryMarks; + } + + public void setSummaryMarks(SummaryMarksDTO summaryMarks) { + this.summaryMarks = summaryMarks; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MCQTestResultDTO that = (MCQTestResultDTO) o; + return Objects.equals(scannedOn, that.scannedOn) + && Objects.equals(firstName, that.firstName) + && Objects.equals(lastName, that.lastName) + && Objects.equals(studentNumber, that.studentNumber) + && Objects.equals(testId, that.testId) + && Objects.equals(summaryMarks, that.summaryMarks); + } + + @Override + public int hashCode() { + return Objects.hash(scannedOn, firstName, lastName, studentNumber, testId, summaryMarks); + } + + @Override + public String toString() { + return "MCQTestResultDTO{" + + "scannedOn='" + scannedOn + '\'' + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", studentNumber='" + studentNumber + '\'' + + ", testId='" + testId + '\'' + + ", summaryMarks=" + summaryMarks + + '}'; + } +} diff --git a/src/main/java/com/stileeducation/markr/dto/MCQTestResultsDTO.java b/src/main/java/com/stileeducation/markr/dto/MCQTestResultsDTO.java new file mode 100644 index 0000000..e9ee8a7 --- /dev/null +++ b/src/main/java/com/stileeducation/markr/dto/MCQTestResultsDTO.java @@ -0,0 +1,43 @@ +package com.stileeducation.markr.dto; + +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlRootElement; + +import java.util.List; +import java.util.Objects; + +@XmlRootElement(name = "mcq-test-results") +public class MCQTestResultsDTO { + + private List mcqTestResults; + + @XmlElement(name = "mcq-test-result") + public List getMcqTestResults() { + return mcqTestResults; + } + + public void setMcqTestResults(List mcqTestResults) { + this.mcqTestResults = mcqTestResults; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MCQTestResultsDTO that = (MCQTestResultsDTO) o; + return Objects.equals(mcqTestResults, that.mcqTestResults); + } + + @Override + public int hashCode() { + return Objects.hashCode(mcqTestResults); + } + + @Override + public String toString() { + return "MCQTestResultsDTO{" + + "mcqTestResults=" + mcqTestResults + + '}'; + } +} + diff --git a/src/main/java/com/stileeducation/markr/dto/SummaryMarksDTO.java b/src/main/java/com/stileeducation/markr/dto/SummaryMarksDTO.java new file mode 100644 index 0000000..a67d19c --- /dev/null +++ b/src/main/java/com/stileeducation/markr/dto/SummaryMarksDTO.java @@ -0,0 +1,51 @@ +package com.stileeducation.markr.dto; + +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlRootElement; + +import java.util.Objects; + +@XmlRootElement(name = "summary-marks") +public class SummaryMarksDTO { + private int available; + private int obtained; + + @XmlAttribute(name = "available") + public int getAvailable() { + return available; + } + + public void setAvailable(int available) { + this.available = available; + } + + @XmlAttribute(name = "obtained") + public int getObtained() { + return obtained; + } + + public void setObtained(int obtained) { + this.obtained = obtained; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SummaryMarksDTO that = (SummaryMarksDTO) o; + return available == that.available && obtained == that.obtained; + } + + @Override + public int hashCode() { + return Objects.hash(available, obtained); + } + + @Override + public String toString() { + return "SummaryMarksDTO{" + + "available=" + available + + ", obtained=" + obtained + + '}'; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 7e171c2..17a7c25 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,3 @@ spring.application.name=markr +spring.mvc.converters.preferred-json-mapper=jackson +spring.mvc.converters.preferred-xml-mapper=jackson diff --git a/src/test/java/com/stileeducation/markr/MarkrApplicationTests.java b/src/test/java/com/stileeducation/markr/MarkrApplicationTests.java deleted file mode 100644 index 2301e26..0000000 --- a/src/test/java/com/stileeducation/markr/MarkrApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.stileeducation.markr; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class MarkrApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/src/test/java/com/stileeducation/markr/dto/MCQTestResultsDTOTests.java b/src/test/java/com/stileeducation/markr/dto/MCQTestResultsDTOTests.java new file mode 100644 index 0000000..cc0f248 --- /dev/null +++ b/src/test/java/com/stileeducation/markr/dto/MCQTestResultsDTOTests.java @@ -0,0 +1,36 @@ +package com.stileeducation.markr.dto; + +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Unmarshaller; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.io.ClassPathResource; + +import java.io.IOException; +import java.io.InputStream; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +public class MCQTestResultsDTOTests { + + private static MCQTestResultsDTO sampleResults; + + @BeforeAll + static void setup() throws JAXBException, IOException { + ClassPathResource resource = new ClassPathResource("sample-results.xml"); + try (InputStream inputStream = resource.getInputStream()) { + JAXBContext jaxbContext = JAXBContext.newInstance(MCQTestResultsDTO.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + sampleResults = (MCQTestResultsDTO) unmarshaller.unmarshal(inputStream); + } + } + + @Test + void givenSampleResultsXMLShouldUnmarshall() throws IOException { + assertThat(sampleResults).isNotNull(); + } + +} diff --git a/src/test/resources/sample-results.xml b/src/test/resources/sample-results.xml new file mode 100644 index 0000000..4540ea9 --- /dev/null +++ b/src/test/resources/sample-results.xml @@ -0,0 +1,2703 @@ + + + + KJ + Alysander + 002299 + 9863 + D + D + D + C + B + D + A + A + B + D + A + B + A + B + B + A + C + B + A + B + + + + KJ + Jim + 2300 + 9863 + C + B + D + A + C + C + C + B + C + C + C + B + B + B + B + C + C + A + C + D + + + + Claire + Byron + 2301 + 9863 + A + B + B + C + B + D + C + A + D + C + C + C + A + B + B + D + C + A + D + B + + + + Claire + Bob + 2302 + 9863 + A + D + A + A + D + D + A + C + B + D + D + B + C + A + D + B + A + A + A + A + + + + Stephanie + Susan + 2303 + 9863 + C + C + B + B + B + D + D + D + A + B + A + D + C + D + A + A + C + D + A + C + + + + Jean + Claire + 2304 + 9863 + A + C + C + A + C + A + C + D + D + B + D + C + A + D + B + D + A + A + D + C + + + + Penelope + Thomas + 2306 + 9863 + A + A + D + D + C + D + C + D + A + A + B + A + C + A + C + D + A + C + C + A + + + + Rian + Matthew + 2306 + 9863 + D + B + B + B + A + A + D + A + A + B + C + A + B + A + B + B + C + A + D + B + + + + Susan + Byron + 2307 + 9863 + A + A + C + A + D + B + B + C + A + D + B + D + D + A + D + B + A + D + D + D + + + + Grace + Rian + 2308 + 9863 + A + A + B + A + D + A + B + A + A + C + D + D + C + D + C + C + A + A + B + C + + + + Bob + Dave + 2309 + 9863 + A + B + D + A + B + A + A + B + B + B + B + A + D + A + B + C + C + B + B + D + + + + Stephanie + Bob + 2311 + 9863 + C + B + D + D + B + A + A + D + B + A + D + D + D + D + C + A + B + D + A + A + + + + Penelope + Dave + 2311 + 9863 + B + A + B + D + C + D + C + B + C + D + C + B + B + C + D + D + D + D + D + A + + + + Steve + Byron + 2312 + 9863 + C + D + D + B + D + D + B + C + A + A + C + B + D + A + C + B + B + B + C + D + + + + Grace + Steve + 2314 + 9863 + A + D + D + A + C + B + D + C + C + D + D + C + C + A + B + D + B + A + B + B + + + + Jim + Daniel + 2315 + 9863 + A + B + C + B + D + B + C + A + B + B + A + D + A + D + C + C + B + B + A + A + + + + Jim + Thomas + 2315 + 9863 + C + C + C + D + C + B + B + A + D + B + C + B + B + D + D + B + B + C + C + B + + + + Byron + Daniel + 2316 + 9863 + A + A + A + C + A + C + C + A + B + B + C + B + C + D + D + A + D + B + C + A + + + + Byron + Alice + 2317 + 9863 + D + C + A + C + C + C + B + B + C + B + C + A + C + B + C + C + D + B + C + A + + + + Alysander + Byron + 2319 + 9863 + B + A + C + B + B + A + A + A + A + A + B + C + D + D + A + A + A + C + C + B + + + + Daniel + Dave + 2319 + 9863 + C + D + B + D + D + C + C + D + D + B + B + C + C + C + D + C + D + C + A + C + + + + Steve + Alice + 2320 + 9863 + B + C + D + C + B + A + D + D + A + C + C + B + D + A + D + D + C + B + A + A + + + + John + Grace + 2321 + 9863 + A + B + C + D + B + D + D + C + C + A + D + C + D + A + B + C + B + D + D + C + + + + Daniel + Claire + 2322 + 9863 + C + A + A + A + C + A + B + A + C + B + B + B + C + B + A + B + A + D + D + D + + + + Penelope + Stephanie + 2323 + 9863 + A + C + C + D + A + B + B + B + B + D + D + A + D + C + C + D + B + C + D + A + + + + Claire + KJ + 2325 + 9863 + D + B + D + D + A + B + D + C + C + A + A + D + A + D + D + C + B + B + D + C + + + + Bob + Penelope + 2326 + 9863 + C + B + C + D + D + D + B + A + A + A + B + D + D + D + D + D + D + B + B + D + + + + Penelope + Byron + 2326 + 9863 + C + B + B + D + A + C + A + C + C + A + A + C + A + D + B + A + A + A + B + D + + + + Alice + Dave + 2327 + 9863 + B + B + C + C + D + D + B + D + A + C + C + D + B + B + B + C + C + B + D + A + + + + Matthew + Stephanie + 2328 + 9863 + B + D + C + A + C + B + B + C + D + A + B + B + D + C + B + C + C + C + D + B + + + + Thomas + Thomas + 2329 + 9863 + B + A + B + B + D + A + A + B + D + C + A + A + C + B + D + B + C + B + B + B + + + + Stephanie + Rian + 2330 + 9863 + A + A + D + B + B + B + B + B + D + A + B + A + C + C + A + C + B + D + B + D + + + + Matthew + Susan + 2331 + 9863 + C + D + C + A + B + D + C + C + D + C + D + B + D + D + D + D + B + B + C + B + + + + Thomas + Claire + 2332 + 9863 + A + C + C + A + B + B + C + C + B + C + B + B + A + D + C + C + D + D + B + B + + + + Alysander + Susan + 2333 + 9863 + B + C + D + C + B + D + D + C + B + C + C + B + A + D + D + C + B + B + C + B + + + + Bob + Penelope + 2335 + 9863 + D + D + C + B + C + A + C + B + D + C + D + A + C + A + C + C + A + D + A + B + + + + Stephanie + Alysander + 2335 + 9863 + B + B + A + B + C + A + B + B + B + D + C + B + C + B + D + B + D + C + C + B + + + + Jean + Jean + 2336 + 9863 + A + D + A + C + C + D + D + D + A + D + C + C + D + D + B + C + C + D + A + B + + + + Susan + Byron + 2338 + 9863 + C + C + B + C + B + C + D + A + C + A + D + B + A + C + A + B + B + B + A + B + + + + Alysander + Jim + 2339 + 9863 + D + B + D + C + B + B + C + D + B + B + B + A + A + A + B + D + D + D + A + C + + + + Alysander + Jim + 2340 + 9863 + B + A + D + C + C + D + D + C + C + B + D + A + D + B + C + A + B + C + B + C + + + + Dave + Jean + 2340 + 9863 + D + B + B + B + B + C + B + D + B + D + B + A + A + A + D + D + C + C + B + C + + + + Jean + Claire + 2342 + 9863 + D + C + A + D + A + A + C + D + A + C + A + B + A + C + A + A + D + D + C + A + + + + Alice + Matthew + 2342 + 9863 + A + B + C + D + A + D + A + C + B + D + D + D + B + C + D + A + D + C + C + A + + + + Penelope + Penelope + 2343 + 9863 + B + D + B + C + A + D + C + B + C + D + B + A + C + A + D + A + D + C + D + B + + + + Rian + KJ + 2344 + 9863 + B + A + A + D + C + C + D + C + D + D + A + B + D + A + D + C + C + C + C + A + + + + Penelope + Grace + 2345 + 9863 + C + D + B + A + A + C + A + A + A + D + B + A + D + D + B + B + A + B + B + D + + + + Bob + Thomas + 2346 + 9863 + C + C + C + D + B + A + D + D + A + B + A + A + D + D + C + A + D + D + A + C + + + + Byron + Penelope + 2348 + 9863 + C + A + D + C + C + D + C + C + B + D + A + D + D + A + A + C + B + B + C + A + + + + Alice + Byron + 2348 + 9863 + C + B + A + B + D + B + B + B + B + A + A + B + A + B + A + B + D + A + A + B + + + + Bob + Alysander + 002349 + 9863 + D + C + D + D + C + B + D + A + D + B + C + C + D + D + B + C + C + C + B + C + + + + Dave + Jim + 2350 + 9863 + C + C + A + C + D + D + B + D + C + D + D + A + D + D + B + C + A + C + A + B + + + + Alysander + John + 2351 + 9863 + C + C + A + C + B + B + A + C + B + A + D + A + C + B + C + D + A + C + A + C + + + + Steve + Rian + 2353 + 9863 + C + A + A + D + C + D + B + B + C + A + C + A + D + D + A + C + A + B + D + C + + + + Jean + Claire + 2353 + 9863 + B + B + C + D + A + A + A + C + B + C + D + C + C + C + D + B + B + B + C + C + + + + Penelope + Grace + 2354 + 9863 + B + A + A + B + A + C + B + A + D + C + A + B + B + B + D + C + A + A + A + C + + + + Thomas + Dave + 2356 + 9863 + B + C + A + A + A + A + C + B + A + B + D + C + C + D + B + D + C + A + A + D + + + + Byron + KJ + 2356 + 9863 + A + C + A + B + C + C + D + C + D + B + B + B + C + B + C + B + D + D + A + A + + + + Susan + Alysander + 2358 + 9863 + A + D + C + D + A + A + D + C + B + D + B + D + C + C + A + C + B + A + D + D + + + + Daniel + Dave + 2358 + 9863 + D + B + B + A + D + A + B + A + C + A + C + A + C + A + A + A + D + C + D + B + + + + Byron + Thomas + 2359 + 9863 + A + B + D + A + B + D + C + A + B + B + D + D + B + D + D + D + C + A + D + D + + + + Daniel + Jim + 2360 + 9863 + B + D + A + C + D + A + B + A + C + A + B + A + A + B + B + C + C + C + D + B + + + + KJ + Penelope + 2361 + 9863 + A + C + C + B + B + A + A + A + B + B + A + D + B + B + C + D + C + C + A + C + + + + Penelope + John + 2362 + 9863 + C + B + D + B + D + C + C + D + C + A + D + A + D + D + A + D + A + D + D + A + + + + Claire + Alysander + 2364 + 9863 + A + A + C + B + B + C + C + B + C + C + B + D + D + A + D + A + C + B + A + B + + + + KJ + Alysander + 2364 + 9863 + A + A + B + D + D + B + B + C + A + B + B + A + A + B + D + C + B + A + C + B + + + + John + Penelope + 2366 + 9863 + B + A + C + D + D + D + B + C + A + B + A + B + B + D + A + A + C + B + C + D + + + + Stephanie + Daniel + 2367 + 9863 + B + B + B + C + B + A + B + B + D + D + A + B + C + C + A + B + A + B + A + B + + + + Jean + Dave + 2367 + 9863 + B + A + D + A + A + B + C + C + D + B + B + A + D + D + A + A + D + B + A + A + + + + Byron + Alice + 2368 + 9863 + D + B + D + C + D + A + A + C + A + C + D + C + B + A + A + A + B + A + A + D + + + + Stephanie + KJ + 2369 + 9863 + D + C + C + A + A + D + C + B + C + A + D + B + B + D + A + A + D + C + B + C + + + + Penelope + Jeff + 2371 + 9863 + A + B + B + D + D + C + C + D + A + B + B + D + B + B + A + D + C + B + A + C + + + + Dave + Stephanie + 2371 + 9863 + D + D + A + C + C + D + B + D + B + C + D + A + C + A + C + C + D + D + A + B + + + + Jeff + Bob + 2372 + 9863 + B + A + D + D + A + D + C + D + C + C + B + A + A + D + B + B + C + C + B + B + + + + Dave + Grace + 2374 + 9863 + A + C + C + C + B + B + D + D + A + D + D + D + A + A + A + A + C + C + A + A + + + + Susan + Thomas + 2374 + 9863 + D + B + C + D + A + D + D + A + A + D + B + C + B + B + B + C + B + A + C + B + + + + Jim + Penelope + 2375 + 9863 + A + D + C + B + B + D + B + B + D + D + B + D + D + B + C + B + C + C + A + B + + + + Matthew + Bob + 2376 + 9863 + C + B + D + C + D + C + B + C + D + D + B + D + A + D + A + C + C + B + C + B + + + + Jim + Jean + 2377 + 9863 + B + C + B + A + C + B + A + D + A + A + B + D + A + C + A + A + A + C + C + D + + + + Dave + Alysander + 2378 + 9863 + D + C + D + C + D + C + B + D + A + B + C + C + D + A + C + B + A + D + D + C + + + + Bob + Byron + 2380 + 9863 + A + C + A + A + C + D + B + A + B + B + C + C + D + D + C + B + B + B + D + C + + + + Alice + Stephanie + 2380 + 9863 + A + A + C + C + C + B + B + C + A + B + A + B + B + B + B + D + A + A + C + D + + + + Rian + Claire + 2381 + 9863 + D + B + C + A + A + C + C + D + A + B + D + C + C + A + A + A + B + D + C + D + + + + Daniel + Dave + 2382 + 9863 + B + D + B + B + C + C + D + C + B + A + D + D + B + D + C + B + D + B + D + C + + + + Bob + Penelope + 2384 + 9863 + A + D + A + A + C + C + D + B + D + B + D + A + D + A + D + A + D + D + B + A + + + + Daniel + Daniel + 2384 + 9863 + A + B + C + A + A + A + A + A + D + D + A + B + C + B + A + C + A + D + D + B + + + + Jeff + Dave + 2385 + 9863 + D + D + D + D + D + C + D + A + C + D + A + D + A + D + A + A + C + C + B + A + + + + Jeff + Thomas + 2386 + 9863 + D + C + B + C + C + A + C + B + A + C + D + D + A + D + B + A + D + D + B + A + + + + Jim + Jean + 2387 + 9863 + B + D + D + C + C + B + A + A + B + A + A + D + A + A + B + B + C + D + B + B + + + + Alysander + Stephanie + 2388 + 9863 + C + B + A + C + C + B + D + D + C + D + B + C + C + D + C + B + A + D + D + A + + + + Steve + Byron + 2389 + 9863 + C + A + D + A + B + A + A + C + D + C + B + A + D + C + D + D + B + C + A + A + + + + John + Jim + 2390 + 9863 + A + B + C + C + B + C + B + B + B + B + D + C + B + B + A + D + A + B + A + A + + + + Susan + Claire + 2391 + 9863 + D + C + A + B + C + D + D + C + B + C + A + A + B + D + B + C + A + C + C + B + + + + Byron + Penelope + 2392 + 9863 + B + C + C + A + D + D + C + D + D + D + C + B + D + C + C + A + A + B + A + C + + + + Jean + Matthew + 2393 + 9863 + C + B + B + C + B + B + C + A + C + A + C + B + A + C + A + D + D + D + A + C + + + + Bob + Bob + 2394 + 9863 + B + B + D + D + A + A + A + C + D + C + B + A + D + C + A + B + B + A + A + B + + + + Byron + John + 2395 + 9863 + C + A + D + A + B + D + B + D + C + C + A + A + A + C + A + D + B + C + A + B + + + + Penelope + Grace + 2396 + 9863 + B + C + B + C + A + D + C + C + B + B + A + B + B + B + A + A + C + C + D + B + + + + John + John + 2398 + 9863 + A + C + C + B + C + C + B + D + A + B + C + A + B + A + D + D + B + D + D + A + + + + Jean + Stephanie + 2398 + 9863 + D + D + C + A + D + A + D + C + B + B + B + D + A + C + D + C + C + C + B + C + + + \ No newline at end of file -- cgit v1.2.3