Skip to content
Snippets Groups Projects
Commit 6c394865 authored by René Schöne's avatar René Schöne
Browse files

Remove unused modules.

parent 7cb455b6
No related branches found
No related tags found
1 merge request!19dev to master
Showing
with 0 additions and 1077 deletions
/build/
/bin/
logs/
buildscript {
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.2.RELEASE")
}
}
plugins {
id 'io.franzbecker.gradle-lombok' version '1.14'
}
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
dependencies {
compile project(':eraser-base')
compile 'org.springframework.boot:spring-boot-starter-web'
compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
testCompile 'org.springframework.boot:spring-boot-starter-test'
}
sourceSets {
main {
java {
srcDir 'src/main/java'
}
}
}
package de.tudresden.inf.st.eraser.rest;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* A recognized activity resource.
*
* @author rschoene - Initial contribution
*/
@Data(staticConstructor = "of")
public class Activity {
@ApiModelProperty(notes = "Some identifier of this activity")
public final int identifier;
@ApiModelProperty(notes = "Name of the activity")
public final String description;
}
package de.tudresden.inf.st.eraser.rest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Spring boot controller specifying routes to REST API for activities.
*
* @author rschoene - Initial contribution
*/
@RestController
@RequestMapping("/activity")
@Api(value = "activity-data", description = "Activity data")
public class ActivityController {
private List<Activity> dummyListOfActivities = new ArrayList<>();
private Map<Integer, Activity> dummyMapOfActivities = new HashMap<>();
private int currentActivityIndex = 0;
public ActivityController() {
add(Activity.of(1, "Sitting in armchair"));
add(Activity.of(2, "Going to sleep"));
add(Activity.of(3, "Entering house"));
}
public void add(Activity activity) {
dummyListOfActivities.add(activity);
dummyMapOfActivities.put(activity.getIdentifier(), activity);
}
@ApiOperation(value = "Get all events in long form", response = List.class)
@GetMapping(value = "", produces = "application/json")
public List<Activity> getAllActivities() {
return dummyListOfActivities;
}
@ApiOperation(value = "Get detailed information of one event", response = Activity.class)
@GetMapping(value = "/current", produces = "application/json")
public Activity getCurrentActivity() {
return dummyListOfActivities.get(currentActivityIndex);
}
@ApiOperation(value = "Get detailed information of one event", response = Activity.class)
@GetMapping(value = "/{identifier}", produces = "application/json")
//@RequestParam(value = "identifier")
public Activity getActivity(@PathVariable int identifier) {
return dummyMapOfActivities.get(identifier);
}
}
package de.tudresden.inf.st.eraser.rest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* The main class to start the rest service.
*
* @author rschoene - Initial contribution
*/
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
package de.tudresden.inf.st.eraser.rest;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* One changed item and its new state.
*
* @author rschoene - Initial contribution
*/
@Data
public class ChangedItem {
@ApiModelProperty(notes = "The name of the changed item")
public final String name;
@ApiModelProperty(notes = "The new state of the item")
public final Object state;
@ApiModelProperty(notes = "The label of the changed item")
public final String label;
}
package de.tudresden.inf.st.eraser.rest;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* Some system change event.
*
* @author rschoene - Initial contribution
*/
@Data
@AllArgsConstructor
public abstract class Event {
@ApiModelProperty(notes = "Time when this event happened")
public final long timestamp;
@ApiModelProperty(notes = "Some identifier for the event")
public final int identifier;
@ApiModelProperty(notes = "A list of items changed due to this event")
public final List<ChangedItem> changedItems;
}
package de.tudresden.inf.st.eraser.rest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
/**
* Spring boot controller specifying routes to REST API for events.
*
* @author rschoene - Initial contribution
*/
@RestController("events")
@RequestMapping("/event")
@Api(value = "event-data", description = "Recent events (recognitions or manual changes)")
public class EventController {
private List<Event> dummyListOfEvents = new ArrayList<>();
private Map<Integer, Event> dummyMapOfEvents = new HashMap<>();
public EventController() {
add(new RecognitionEvent(1547637740, 1, Arrays.asList(
new ChangedItem("iris1", "green", "Hue Iris 1"),
new ChangedItem("go1", "green", "Hue Go 1")), 1, "Sitting in armchair"));
add(new RecognitionEvent(1547637750, 2, Collections.emptyList(),
1, "Sitting in armchair"));
add(new RecognitionEvent(1547623460, 4, Collections.singletonList(
new ChangedItem("go2", "off", "Hue Go 2")), 1, "Going to sleep"));
add(new ManualChangeEvent(1501146256, 5, Arrays.asList(
new ChangedItem("iris1", "green", "Hue Iris 1"),
new ChangedItem("go1", "red", "Hue Go 1"),
new ChangedItem("go2", "#EE7F00", "Hue Go 2"))));
}
public void add(Event event) {
dummyListOfEvents.add(event);
dummyMapOfEvents.put(event.getIdentifier(), event);
}
@ApiOperation(value = "Get all events in long form", response = List.class)
@GetMapping(value = "", produces = "application/json")
public List<Event> getAllEvents() {
return dummyListOfEvents;
}
@ApiOperation(value = "Get detailed information of one event", response = Event.class)
@GetMapping(value = "/{identifier}", produces = "application/json")
public Event getEvent(@PathVariable int identifier) {
return dummyMapOfEvents.get(identifier);
}
}
package de.tudresden.inf.st.eraser.rest;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* Manual change of items in the system by an user.
*
* @author rschoene - Initial contribution
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class ManualChangeEvent extends Event {
@ApiModelProperty(notes = "The type of the event")
public final String type = "manual";
public ManualChangeEvent(long timestamp, int identifier, List<ChangedItem> changedItems) {
super(timestamp, identifier, changedItems);
}
}
package de.tudresden.inf.st.eraser.rest;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* Change of items automatically done by the system.
*
* @author rschoene - Initial contribution
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class RecognitionEvent extends Event {
@ApiModelProperty(notes = "The identifier of the activity causing this event")
public final int activity;
@ApiModelProperty(notes = "The description of the activity")
public final String description;
@ApiModelProperty(notes = "The type of the event")
public final String type = "recognition";
public RecognitionEvent(long timestamp, int identifier, List<ChangedItem> changedItems, int activity, String description) {
super(timestamp, identifier, changedItems);
this.activity = activity;
this.description = description;
}
}
package de.tudresden.inf.st.eraser.rest;
import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* Configuration class to enable swagger.
*
* @author rschoene - Initial contribution
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@SuppressWarnings("Guava")
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework")))
.paths(PathSelectors.any())
.build()
.apiInfo(metaData());
}
private ApiInfo metaData() {
return new ApiInfoBuilder()
.title("OpenLicht Knowledge-Base REST API")
.description("\"OpenLicht-REST-Server to get recent recognitions, manual settings and activities\"")
.version("1.0.0")
.license("MIT License")
.licenseUrl("https://opensource.org/licenses/MIT")
.contact(new Contact("René Schöne",
"http://tu-dresden.de/die_tu_dresden/fakultaeten/fakultaet_informatik/smt/st/mitarbeiter?person=375",
"rene.schoene@tu-dresden.de"))
.build();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console">
<PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
</Console>
<RollingFile name="RollingFile" fileName="logs/eraser.log"
filePattern="logs/eraser-%i.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
<Policies>
<OnStartupTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
/build/
/bin/
logs/
apply plugin: 'application'
dependencies {
compile project(':eraser-base')
compile group: 'org.influxdb', name: 'influxdb-java', version: '2.15'
}
run {
mainClassName = 'de.tudresden.inf.st.eraser.influx_test.Main'
standardInput = System.in
if (project.hasProperty("appArgs")) {
args Eval.me(appArgs)
}
}
sourceSets {
main {
java {
srcDir 'src/main/java'
}
}
}
package de.tudresden.inf.st.eraser.influx_test;
import org.influxdb.InfluxDB;
import org.influxdb.InfluxDBFactory;
import org.influxdb.annotation.Column;
import org.influxdb.annotation.Measurement;
import org.influxdb.dto.Point;
import org.influxdb.dto.Pong;
import org.influxdb.dto.Query;
import org.influxdb.impl.InfluxDBResultMapper;
import java.time.Instant;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@SuppressWarnings("deprecation")
public class Main {
@Measurement(name = "ItemD")
public static class ItemWithDoubleStatePoint {
@Column(name = "time")
private Instant time;
@Column(name = "state")
private Double state;
@Column(name = "id", tag = true)
private String id;
static ItemWithDoubleStatePoint of(double state, String id) {
return of(Instant.now(), state, id);
}
static ItemWithDoubleStatePoint of(Instant time, double state, String id) {
ItemWithDoubleStatePoint point = new ItemWithDoubleStatePoint();
point.time = time;
point.state = state;
point.id = id;
return point;
}
Point build() {
return Point.measurement("ItemD")
.time(time.toEpochMilli(), TimeUnit.MILLISECONDS)
.addField("state", state)
.tag("id", id)
.build();
}
@Override
public String toString() {
return "ItemD [" + id + "@" + time + ": " + state + "]";
}
}
// InfluxDB connections settings
private static final String host = "172.22.1.152";
private static final int port = 8086;
private static final String user = "root";
private static final String password = "root";
private static final String dbName = "jastaddHistoryMain";
public static void main(String[] args) {
testInflux();
}
private static void testInflux() {
// see https://github.com/influxdata/influxdb-java
String url = String.format("http://%s:%s", host, port);
InfluxDB influxDB = InfluxDBFactory.connect(url, user, password);
Pong response = influxDB.ping();
if (response.getVersion().equalsIgnoreCase("unknown")) {
System.err.println("Error pinging server");
return;
}
if (databaseExists(influxDB)) {
deleteDatabase(influxDB);
}
createDatabase(influxDB);
influxDB.setDatabase(dbName);
createDefaultRetentionPolicy(influxDB);
InfluxDBResultMapper resultMapper = new InfluxDBResultMapper();
ItemWithDoubleStatePoint point;
Query q;
List<ItemWithDoubleStatePoint> result;
// add one measurement
point = ItemWithDoubleStatePoint.of(0.3, "iris1_item");
influxDB.write(point.build());
// read all measurements
q = new Query("SELECT id, state FROM ItemD WHERE id = 'iris1_item'", dbName);
result = resultMapper.toPOJO(influxDB.query(q), ItemWithDoubleStatePoint.class);
System.out.println(result);
// add another measurement
point = ItemWithDoubleStatePoint.of(0.4, "iris1_item");
influxDB.write(point.build());
// and read all measurements, should be two now
q = new Query("SELECT id, state FROM ItemD WHERE id = 'iris1_item'", dbName);
result = resultMapper.toPOJO(influxDB.query(q), ItemWithDoubleStatePoint.class);
System.out.println(result);
}
private static boolean databaseExists(InfluxDB influxDB) {
// Query query = new Query("SHOW DATABASES", dbName);
return influxDB.databaseExists(dbName);
}
private static void deleteDatabase(InfluxDB influxDB) {
influxDB.deleteDatabase(dbName);
// influxDB.query(Query.encode("CREATE DATABASE \"" + dbName + "\""));
}
private static void createDatabase(InfluxDB influxDB) {
influxDB.createDatabase(dbName);
// influxDB.query(Query.encode("CREATE DATABASE \"" + dbName + "\""));
}
private static void createDefaultRetentionPolicy(InfluxDB influxDB) {
String rpName = "aRetentionPolicy";
influxDB.createRetentionPolicy(rpName, dbName, "30d", "30m", 2, true);
influxDB.setRetentionPolicy(rpName);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console">
<PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/>
</Console>
<RollingFile name="RollingFile" fileName="logs/eraser.log"
filePattern="logs/eraser-%i.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
<Policies>
<OnStartupTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
/build/
repositories {
mavenCentral()
}
sourceCompatibility = 1.8
apply plugin: 'java'
apply plugin: 'application'
dependencies {
compile project(':eraser-base')
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jackson_version}"
compile 'org.encog:encog-core:3.4'
}
run {
mainClassName = 'de.tudresden.inf.st.eraser.learner_test.Main'
standardInput = System.in
if (project.hasProperty("appArgs")) {
args Eval.me(appArgs)
}
}
sourceSets {
main {
java {
srcDir 'src/main/java'
}
}
}
package de.tudresden.inf.st.eraser.learner_test;
import org.encog.Encog;
import org.encog.ml.MLClassification;
import org.encog.ml.data.MLData;
import org.encog.persist.EncogDirectoryPersistence;
import org.encog.util.csv.CSVFormat;
import org.encog.util.csv.ReadCSV;
import org.encog.util.simple.EncogUtility;
import org.encog.ml.data.versatile.NormalizationHelper;
import org.encog.ml.data.versatile.VersatileMLDataSet;
import org.encog.ml.data.versatile.columns.ColumnDefinition;
import org.encog.ml.data.versatile.columns.ColumnType;
import org.encog.ml.data.versatile.sources.VersatileDataSource;
import org.encog.ml.data.versatile.sources.CSVDataSource;
import org.encog.ml.factory.MLMethodFactory;
import org.encog.ml.model.EncogModel;
import org.encog.ConsoleStatusReportable;
import org.encog.ml.MLRegression;
import java.io.File;
import java.util.Arrays;
import static org.encog.persist.EncogDirectoryPersistence.*;
public class Main {
public static void main(String[] args) {
//mapping the data into model
String savefile = "src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model.eg";
String File = "src/main/java/de/tudresden/inf/st/eraser/learner_test/preference_data.csv";
File file = new File(File);
VersatileDataSource source = new CSVDataSource(file, false, CSVFormat.DECIMAL_POINT);
VersatileMLDataSet data = new VersatileMLDataSet(source);
data.defineSourceColumn("monat", 0, ColumnType.continuous);
data.defineSourceColumn("day", 1, ColumnType.continuous);
data.defineSourceColumn("hour", 2, ColumnType.continuous);
data.defineSourceColumn("minute", 3, ColumnType.continuous);
ColumnDefinition outputColumn = data.defineSourceColumn("labels", 4, ColumnType.continuous);
data.defineSingleOutputOthersInput(outputColumn);
data.analyze();
System.out.println("get data ");
EncogModel model = new EncogModel(data);
model.selectMethod(data, MLMethodFactory.TYPE_FEEDFORWARD);
//model.setReport(new ConsoleStatusReportable());
data.normalize();
NormalizationHelper helper = data.getNormHelper();
System.out.println(helper.toString());
model.holdBackValidation(0.3, true, 1001);
model.selectTrainingType(data);
MLRegression bestMethod = (MLRegression)model.crossvalidate(5, true);
MLClassification bestMethodtest=(MLClassification)model.crossvalidate(5,true);
/**System.out.println( "Training error: " + EncogUtility.calculateRegressionError(bestMethod, model.getTrainingDataset()));
System.out.println( "testTraining error: " + EncogUtility.calculateClassificationError(bestMethodtest, model.getTrainingDataset()));
System.out.println( "Validation error: " + EncogUtility.calculateRegressionError(bestMethod, model.getValidationDataset()));
System.out.println( "testValidation error: " + EncogUtility.calculateClassificationError(bestMethodtest, model.getValidationDataset()));
System.out.println(helper.getClass());
System.out.println(helper.toString());
System.out.println("Final model: " + bestMethod);
System.out.println("Final testmodel: " + bestMethodtest);**/
//NormalizationHelper helper = data.getNormHelper();
//test
String helperstr=helper.toString();
String [] split=helperstr.split(";");
String [] finalStr = split[split.length-1].replace("]","").replace("[","").
split(",");
System.out.println(helper);
// save network...
//to delete
saveObject(new File(savefile), bestMethodtest);
ReadCSV csv = new ReadCSV(File, false, CSVFormat.DECIMAL_POINT);
String[] line = new String[4];
MLData input = helper.allocateInputVector();
System.out.println("input test---------------");
System.out.println(input);
while(csv.next()) {
StringBuilder result = new StringBuilder();
line[0] = csv.get(0);
line[1] = csv.get(1);
line[2] = csv.get(2);
line[3] = csv.get(3);
String correct = csv.get(4);
helper.normalizeInputVector(line,input.getData(),false);
MLData output = bestMethod.compute(input);
System.out.println("inputs:");
System.out.println(input);
System.out.println("outputs:");
System.out.println(output);
String brightnessChosen = helper.denormalizeOutputVectorToString(output)[0];
result.append(Arrays.toString(line));
result.append(" -> predicted: ");
result.append(brightnessChosen);
result.append("(correct: ");
result.append(correct);
result.append(")");
System.out.println(result.toString());
break;
}
// Delete data file and shut down.
//File.delete();
Encog.getInstance().shutdown();
/**Training error: 0.299928703107046
testTraining error: 0.9931740614334471
Validation error: 0.41277024952020763
testValidation error: 0.992*/
}
}
7,20,12,13,2
7,20,14,40,1
7,20,14,40,2
7,21,13,2,2
7,21,13,2,2
7,21,14,23,2
7,21,14,23,2
7,21,15,41,2
7,21,16,54,2
7,21,16,54,2
7,21,17,45,3
7,22,12,28,3
7,22,15,35,2
7,22,15,35,2
7,22,18,59,3
7,22,18,59,3
7,23,12,32,2
7,23,12,32,2
7,23,16,7,2
7,23,16,7,2
7,23,16,7,2
7,23,16,7,2
7,23,16,7,2
7,24,12,4,0
7,24,12,4,0
7,24,12,4,1
7,24,14,38,2
7,24,14,38,2
7,24,18,54,3
7,25,12,31,0
7,25,12,32,1
7,25,12,32,1
7,25,15,6,3
7,25,18,56,3
7,26,13,41,2
7,26,19,14,3
7,27,11,39,2
7,27,11,39,3
7,27,11,46,3
7,27,11,46,2
7,27,13,8,2
7,27,13,8,2
7,27,13,9,2
7,27,13,45,2
7,27,13,45,2
7,27,15,38,3
7,28,12,12,2
7,28,12,13,2
7,28,12,41,2
7,28,12,41,2
7,28,12,41,2
7,28,14,0,1
7,28,14,0,2
7,28,15,21,3
7,28,18,56,3
7,29,10,9,1
7,29,10,9,1
7,29,10,9,1
7,29,11,54,0
7,29,11,54,0
7,29,11,54,0
7,29,11,54,1
7,29,14,10,2
7,29,16,44,2
7,29,16,44,2
7,30,16,7,3
7,30,18,45,3
7,31,13,2,0
7,31,13,2,1
7,31,13,3,1
7,31,13,3,1
7,31,13,3,1
7,31,18,39,3
8,1,12,22,0
8,1,12,22,1
8,1,14,20,2
8,1,14,20,2
8,1,14,20,2
8,1,15,55,3
8,1,18,31,3
8,1,18,37,3
8,1,18,37,3
8,1,19,2,3
8,1,19,2,3
8,1,20,5,3
8,2,10,9,2
8,2,10,9,1
8,2,10,9,2
8,2,10,9,2
8,2,13,58,2
8,2,13,58,2
8,2,15,44,3
8,2,15,44,3
8,2,15,44,3
8,2,17,21,3
8,2,17,21,3
8,2,17,21,3
8,3,13,31,1
8,3,13,31,2
8,3,13,32,2
8,3,16,43,3
8,4,13,20,1
8,4,13,20,2
8,4,18,27,3
8,5,13,37,2
8,5,13,37,2
8,5,18,33,3
8,6,11,24,3
8,6,11,24,3
8,6,11,24,3
8,6,13,50,3
8,7,13,4,2
8,7,13,4,2
8,7,14,56,3
8,8,12,13,2
8,8,12,13,2
8,8,15,51,2
8,8,15,51,2
8,8,15,51,3
8,9,13,32,2
8,9,13,32,2
8,9,13,32,2
8,9,15,8,2
8,9,15,8,2
8,9,15,8,2
8,9,16,19,2
8,10,11,32,0
8,10,11,32,1
8,10,11,32,1
8,10,13,13,1
8,10,13,13,1
8,10,13,13,2
8,10,16,42,3
8,10,16,42,3
8,11,14,6,2
8,11,14,7,2
8,11,18,54,3
8,11,18,54,3
8,11,18,54,3
8,12,12,27,1
8,12,12,27,1
8,12,12,28,1
8,12,13,53,2
8,12,13,53,2
8,12,13,53,2
8,12,15,21,3
8,13,13,16,1
8,13,13,16,1
8,13,13,16,1
8,13,14,14,2
8,13,14,14,2
8,13,16,11,3
8,13,17,18,3
8,14,13,7,1
8,14,13,7,1
8,14,13,7,1
8,14,13,7,1
8,14,13,7,2
8,14,13,7,2
8,14,15,6,3
8,15,14,5,2
8,15,14,5,2
8,15,14,6,2
8,15,14,6,2
8,15,16,41,3
8,15,16,41,3
8,15,17,30,3
8,16,13,40,2
8,16,13,40,2
8,16,17,52,3
8,16,17,53,3
8,17,13,34,1
8,17,13,35,2
8,17,14,7,2
8,17,19,2,3
8,18,10,21,3
8,18,11,14,2
8,18,11,14,2
8,18,11,14,2
8,18,11,14,2
8,18,14,25,2
8,18,14,25,3
8,18,14,25,2
8,18,18,18,3
8,18,18,19,3
8,19,18,33,3
8,19,18,33,3
8,19,18,33,3
8,19,18,33,3
8,20,14,28,2
8,20,14,28,2
8,20,14,28,2
8,20,14,28,2
8,20,17,8,3
8,20,18,22,3
8,21,11,24,1
8,21,11,24,1
8,21,11,24,1
8,21,15,34,3
8,21,18,55,3
8,22,12,3,1
8,22,12,4,2
8,22,12,4,2
8,22,13,51,2
8,22,13,51,2
8,22,13,51,2
8,22,18,12,3
8,22,18,12,3
8,22,18,12,3
8,22,18,12,3
8,22,18,40,3
8,22,18,40,3
8,23,13,42,1
8,23,13,42,1
8,23,17,32,3
8,23,19,28,3
8,23,20,27,3
8,23,20,27,3
8,23,21,49,3
8,24,14,0,2
8,24,14,0,2
8,24,14,0,2
8,24,14,0,2
8,24,15,4,3
8,24,15,4,3
8,24,16,2,3
8,24,16,3,3
8,24,16,37,3
8,24,17,9,3
8,24,17,14,3
8,25,13,34,1
8,25,13,34,1
8,25,13,34,1
8,25,13,34,1
8,25,13,34,1
8,25,15,1,3
8,25,17,58,3
8,26,10,29,0
8,26,10,29,0
8,26,10,29,0
8,26,10,29,0
8,26,10,29,0
8,26,16,42,3
8,26,16,42,3
8,26,18,41,3
8,26,18,41,3
8,27,13,41,2
8,27,13,41,2
8,27,13,41,2
8,27,13,41,2
8,27,17,42,3
8,28,11,9,1
8,28,11,9,1
8,28,12,14,0
8,28,12,14,1
8,28,12,14,0
8,28,15,3,2
8,28,15,3,2
8,28,16,31,3
8,28,17,40,3
8,29,14,44,3
8,29,17,25,3
8,30,12,5,0
8,30,12,5,0
8,30,12,5,0
8,30,13,32,1
8,30,13,32,1
8,30,13,56,2
8,30,14,23,2
8,30,14,23,2
8,30,14,23,2
8,30,14,23,2
8,30,14,41,2
8,30,14,41,2
8,30,14,41,2
8,30,15,50,3
8,30,17,0,3
8,30,18,59,3
8,30,18,59,3
8,31,14,31,2
8,31,14,31,2
8,31,14,31,2
8,31,17,59,3
8,31,18,0,3
9,1,16,13,3
9,1,16,13,3
9,1,16,13,3
9,1,17,41,3
9,2,13,44,1
9,2,13,44,1
9,2,13,44,1
9,2,14,49,2
9,2,14,49,2
9,2,14,49,2
9,2,16,6,3
9,2,16,6,3
9,2,17,2,3
9,3,16,9,3
9,3,17,35,3
9,3,17,36,3
9,4,12,57,1
9,4,12,57,1
9,4,15,8,3
9,4,15,34,3
9,4,16,26,3
9,4,16,26,3
9,4,18,37,3
9,4,18,37,3
9,4,18,37,3
9,6,11,18,0
9,6,11,18,0
9,6,12,54,1
9,6,12,54,1
9,6,14,21,2
9,6,14,21,2
9,6,19,20,3
9,7,11,50,0
9,7,14,17,2
9,7,14,57,3
9,7,14,57,3
9,7,16,56,3
9,7,16,56,3
9,7,16,56,3
9,7,16,56,3
9,7,18,38,3
9,7,18,38,3
9,8,11,4,2
9,8,11,4,2
9,8,11,13,0
9,8,11,13,0
9,8,11,13,0
9,8,11,13,0
9,8,11,13,0
9,8,11,14,0
9,8,11,14,1
9,8,11,14,1
9,8,12,1,0
9,8,12,1,0
9,8,12,1,0
9,8,12,1,0
9,8,12,1,0
9,8,12,1,1
9,8,12,36,0
9,8,12,36,0
9,8,12,36,0
9,8,12,36,0
9,8,12,36,0
9,8,13,37,1
9,8,13,37,1
9,8,13,37,1
9,8,14,20,2
9,8,14,20,2
9,8,18,20,3
9,9,12,47,1
9,9,12,47,2
9,9,12,47,2
9,9,19,5,3
9,10,13,15,1
9,10,13,15,1
9,10,13,15,0
9,10,16,49,3
9,10,19,6,3
9,10,21,5,3
9,11,14,16,2
9,11,14,16,2
9,11,14,16,2
9,11,18,41,3
9,12,14,43,2
9,12,14,43,2
9,12,14,43,2
9,12,16,14,3
9,12,17,12,3
9,12,17,12,2
9,12,17,12,3
9,12,17,12,2
9,12,20,44,3
9,13,19,52,3
9,14,14,39,2
9,14,14,39,2
9,14,15,14,3
9,14,17,29,3
9,14,17,29,3
9,14,17,29,3
9,15,11,41,1
9,15,11,41,1
9,15,13,4,1
9,15,14,3,1
9,15,14,3,2
9,16,12,36,1
9,16,12,36,1
9,16,12,36,1
9,16,12,36,1
9,16,12,48,1
9,16,12,48,1
9,16,13,51,1
9,16,13,51,2
9,16,13,51,1
9,16,15,13,3
9,16,15,14,3
9,16,15,14,3
9,17,10,27,0
9,17,10,27,0
9,17,11,10,0
9,17,11,10,0
9,17,11,10,0
9,17,12,43,1
9,17,12,43,1
9,17,12,43,1
9,17,13,32,1
9,17,13,32,1
9,17,14,5,1
9,17,14,5,2
9,17,14,6,2
9,17,15,7,3
9,17,15,49,3
9,17,15,49,3
9,17,18,12,3
9,17,18,13,3
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment