Archived
0

add update from EMDN button

This commit is contained in:
iMoHax
2014-08-28 17:21:37 +04:00
parent f426a2d34e
commit 98c6df4546
12 changed files with 396 additions and 109 deletions

View File

@@ -69,6 +69,7 @@ public class Main extends Application {
if (res == Dialog.Actions.YES) World.save(); if (res == Dialog.Actions.YES) World.save();
else if (res == Dialog.Actions.CANCEL) we.consume(); else if (res == Dialog.Actions.CANCEL) we.consume();
} }
World.shutdown();
Screeners.closeAll(); Screeners.closeAll();
} catch (FileNotFoundException | UnsupportedEncodingException | XMLStreamException e) { } catch (FileNotFoundException | UnsupportedEncodingException | XMLStreamException e) {
LOG.error("Ошибка при сохранении",e); LOG.error("Ошибка при сохранении",e);

View File

@@ -3,6 +3,8 @@ package ru.trader;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import ru.trader.core.Market; import ru.trader.core.Market;
import ru.trader.core.SimpleMarket; import ru.trader.core.SimpleMarket;
import ru.trader.emdn.EMDN;
import ru.trader.emdn.Station;
import ru.trader.model.ModelFabrica; import ru.trader.model.ModelFabrica;
import ru.trader.store.Store; import ru.trader.store.Store;
import ru.trader.store.XSSFImporter; import ru.trader.store.XSSFImporter;
@@ -17,12 +19,14 @@ import java.io.UnsupportedEncodingException;
public class World { public class World {
private static Market world; private static Market world;
private static final String STORE_FILE="world.xml"; private static final String STORE_FILE="world.xml";
private final static EMDN emdn = new EMDN("tcp://firehose.elite-market-data.net:9050", true);
static { static {
try { try {
File file = new File(STORE_FILE); File file = new File(STORE_FILE);
if (file.exists()) world = Store.loadFromFile(file); if (file.exists()) world = Store.loadFromFile(file);
else world = new SimpleMarket(); else world = new SimpleMarket();
emdn.start();
} catch (ParserConfigurationException | SAXException | IOException e) { } catch (ParserConfigurationException | SAXException | IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@@ -44,4 +48,11 @@ public class World {
return world; return world;
} }
public static Station getEMDN(String name){
return emdn.getVendor(name);
}
public static void shutdown(){
emdn.shutdown();
}
} }

View File

@@ -15,7 +15,10 @@ import org.controlsfx.control.action.Action;
import org.controlsfx.dialog.Dialog; import org.controlsfx.dialog.Dialog;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.trader.World;
import ru.trader.core.OFFER_TYPE; import ru.trader.core.OFFER_TYPE;
import ru.trader.emdn.ItemData;
import ru.trader.emdn.Station;
import ru.trader.model.*; import ru.trader.model.*;
import ru.trader.model.support.BindingsHelper; import ru.trader.model.support.BindingsHelper;
import ru.trader.view.support.Localization; import ru.trader.view.support.Localization;
@@ -221,6 +224,21 @@ public class VendorEditorController {
} }
} }
public void updateFromEMDN(){
Station emdnData = World.getEMDN(vendor.getName());
LOG.debug("Update from EMDN");
if (emdnData == null) return;
for (FakeOffer offer : items.getItems()) {
ItemData data = emdnData.getData(offer.item.getId());
LOG.debug("Update item {} to {}", offer.item.getName(), data);
if (data != null){
offer.setBprice(data.getBuy());
offer.setSprice(data.getSell());
}
}
}
public class FakeOffer { public class FakeOffer {
private final ItemModel item; private final ItemModel item;
private DoubleProperty sprice; private DoubleProperty sprice;

View File

@@ -20,6 +20,8 @@ public class ItemModel{
public String getName() {return name != null ? name.get() : item.getName();} public String getName() {return name != null ? name.get() : item.getName();}
public String getId() {return item.getName();}
public void setName(String value) { public void setName(String value) {
LOG.info("Change name of item {} to {}", item, name); LOG.info("Change name of item {} to {}", item, name);
market.updateName(this, value); market.updateName(this, value);

View File

@@ -26,6 +26,7 @@
<Button prefWidth="30" onAction="#up"><graphic><Glyph text="FontAwesome|ARROW_UP"/></graphic></Button> <Button prefWidth="30" onAction="#up"><graphic><Glyph text="FontAwesome|ARROW_UP"/></graphic></Button>
<Button prefWidth="30" onAction="#down"><graphic><Glyph text="FontAwesome|ARROW_DOWN"/></graphic></Button> <Button prefWidth="30" onAction="#down"><graphic><Glyph text="FontAwesome|ARROW_DOWN"/></graphic></Button>
<Button prefWidth="30" onAction="#add"><graphic><Glyph text="FontAwesome|PLUS"/></graphic></Button> <Button prefWidth="30" onAction="#add"><graphic><Glyph text="FontAwesome|PLUS"/></graphic></Button>
<Button prefWidth="30" onAction="#updateFromEMDN"><graphic><Glyph text="FontAwesome|REFRESH"/></graphic></Button>
</VBox> </VBox>
<TableView fx:id="items" prefWidth="375.0" editable="true" GridPane.columnIndex="1" GridPane.rowIndex="2"> <TableView fx:id="items" prefWidth="375.0" editable="true" GridPane.columnIndex="1" GridPane.rowIndex="2">
<columns> <columns>

View File

@@ -6,6 +6,9 @@ import org.zeromq.ZMQ;
import org.zeromq.ZMQException; import org.zeromq.ZMQException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.zip.DataFormatException; import java.util.zip.DataFormatException;
import java.util.zip.Inflater; import java.util.zip.Inflater;
@@ -13,35 +16,80 @@ public class EMDN {
private final static Logger LOG = LoggerFactory.getLogger(EMDN.class); private final static Logger LOG = LoggerFactory.getLogger(EMDN.class);
private final String subServer; private final String subServer;
private final Market cache = new Market();
private ZMQ.Context context = null;
private ZMQ.Socket subscriber = null;
private ScheduledExecutorService executor;
private boolean clear;
public EMDN(String subServer) { public EMDN(String subServer, boolean clearOnShutdown) {
this.subServer = subServer; this.subServer = subServer;
clear = clearOnShutdown;
}
private void init(){
context = ZMQ.context(1);
subscriber = context.socket(ZMQ.SUB);
}
public void start(){
if (subscriber!=null) shutdown();
init();
LOG.info("Connect to server {}", subServer);
subscriber.connect(subServer);
LOG.trace("Subscribe");
subscriber.subscribe(new byte[0]);
executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleWithFixedDelay(() -> {
try {
byte[] receivedData = subscriber.recv(0);
LOG.trace("Received data: {}", receivedData);
if (receivedData == null) return;
//receivedData = decompress(receivedData);
String market_csv = new String(receivedData, "UTF-8");
parseCSV(market_csv);
} catch (ZMQException | UnsupportedEncodingException ex) {
if (!executor.isShutdown())
LOG.error("Error on get data from EMDN", ex);
}
}, 0, 1, TimeUnit.MILLISECONDS);
}
public void shutdown() {
if (subscriber!=null){
LOG.info("Shutdown EMDN client");
executor.shutdown();
subscriber.close();
context.term();
}
subscriber = null;
context = null;
if (clear)
cache.clear();
} }
public void getData(){ private void parseCSV(String csv) {
ZMQ.Context context = ZMQ.context(1); LOG.debug("Parse csv: {}", csv);
try (ZMQ.Socket socket = context.socket(ZMQ.SUB)) { if (csv.isEmpty()) return;
socket.setReceiveTimeOut(10000); String[] flds = csv.split(",");
LOG.debug("Connect to server {}", subServer); // buyPrice,sellPrice,demand,demandLevel,stationStock,stationStockLevel,categoryName,itemName,stationName,timestamp
socket.connect(subServer); ItemData item = new ItemData(flds[7]);
item.setBuy(Double.valueOf(flds[0]), Long.valueOf(flds[4]));
LOG.trace("Subscribe"); item.setSell(Double.valueOf(flds[1]), Long.valueOf(flds[2]));
socket.subscribe(new byte[0]); LOG.trace("Item: {}", item);
for (int i = 0; i < 5; i++) { String stName = flds[8].split("\\(")[0].trim();
try { LOG.trace("Station: {}", stName);
byte[] receivedData = socket.recv(0); Station station = cache.getVendor(stName);
LOG.trace("Recived data: {}", receivedData); if (station != null){
if (receivedData == null) continue; LOG.trace("Is old, update");
//receivedData = decompress(receivedData); station.update(item);
String market_json = new String(receivedData, "UTF-8"); } else {
LOG.trace("JSON: {}", market_json); LOG.trace("Is new, create");
} catch (ZMQException | UnsupportedEncodingException ex) { station = new Station(stName);
LOG.error("Error on get data from EMDN", ex); station.update(item);
} cache.addVendor(station);
}
} }
context.term();
} }
private byte[] decompress(byte[] input){ private byte[] decompress(byte[] input){
@@ -61,4 +109,9 @@ public class EMDN {
System.arraycopy(decompressed, 0, res, 0, decompressedLength); System.arraycopy(decompressed, 0, res, 0, decompressedLength);
return res; return res;
} }
public Station getVendor(String name){
return cache.getVendor(name);
}
} }

View File

@@ -0,0 +1,69 @@
package ru.trader.emdn;
public class ItemData {
private final String name;
private double buy;
private double sell;
private long demand;
private long stock;
public ItemData(String name) {
this.name = name;
}
public void setSell(double price, long count){
sell = price;
demand = count;
}
public void setBuy(double price, long count){
buy = price;
stock = count;
}
public double getBuy() {
return buy;
}
public double getSell() {
return sell;
}
public long getDemand() {
return demand;
}
public long getStock() {
return stock;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof ItemData)) return false;
ItemData itemData = (ItemData) o;
return !(name != null ? !name.equals(itemData.name) : itemData.name != null);
}
@Override
public int hashCode() {
return name != null ? name.hashCode() : 0;
}
public String getName() {
return name;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append(name);
sb.append(" buy=").append(buy);
sb.append(" (").append(stock).append(")");
sb.append(" sell=").append(sell);
sb.append(" (").append(demand).append(")");
sb.append('}');
return sb.toString();
}
}

View File

@@ -0,0 +1,19 @@
package ru.trader.emdn;
import java.util.concurrent.ConcurrentHashMap;
public class Market {
private final ConcurrentHashMap<String, Station> vendors = new ConcurrentHashMap<>(40, 0.9f, 1);
public Station getVendor(String name){
return vendors.get(name);
}
public void addVendor(Station vendor){
vendors.put(vendor.getName(), vendor);
}
public void clear(){
vendors.clear();
}
}

View File

@@ -0,0 +1,37 @@
package ru.trader.emdn;
import java.util.concurrent.ConcurrentHashMap;
public class Station {
private final String name;
private final ConcurrentHashMap<String, ItemData> items = new ConcurrentHashMap<>(15, 0.9f, 1);
public Station(String name) {
this.name = name;
}
public ItemData getData(String name){
return items.get(name);
}
void update(ItemData item){
items.put(item.getName(), item);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Station)) return false;
Station station = (Station) o;
return name.equals(station.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
public String getName() {
return name;
}
}

View File

@@ -0,0 +1,136 @@
package ru.trader.emdn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zeromq.ZMQ;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class EMDNEmul {
private final static Logger LOG = LoggerFactory.getLogger(EMDNEmul.class);
private ZMQ.Context context = null;
private ZMQ.Socket publisher = null;
private ScheduledExecutorService executor;
private final String bindAddress;
private final static byte[][] messages = new byte[][]{
{49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 55, 55, 49, 48, 48, 48},
{56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 55, 57, 49, 48, 48, 48},
{49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 48, 51, 48, 48, 48},
{48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 49, 53, 48, 48, 48},
{49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 51, 52, 48, 48, 48},
{49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 52, 54, 48, 48, 48},
{53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 53, 55, 48, 48, 48},
{50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 54, 57, 48, 48, 48},
{48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 56, 57, 48, 48, 48},
{55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 48, 48, 48, 48, 48},
{48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 49, 50, 48, 48, 48},
{48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 50, 51, 48, 48, 48},
{48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 51, 52, 48, 48, 48},
{48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 52, 54, 48, 48, 48},
{48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 53, 55, 48, 48, 48},
{48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 54, 57, 48, 48, 48},
{48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 56, 49, 48, 48, 48},
{48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 48, 49, 48, 48, 48},
{48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 49, 52, 48, 48, 48},
{48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 50, 54, 48, 48, 48},
{48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 51, 55, 48, 48, 48},
{48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 52, 57, 48, 48, 48},
{48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 54, 48, 48, 48, 48},
{48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 55, 50, 48, 48, 48},
{48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 56, 53, 48, 48, 48},
{48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 57, 54, 48, 48, 48},
{48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 49, 48, 56, 48, 48, 48},
{49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 52, 57, 48, 48, 48},
{56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 54, 54, 48, 48, 48},
{49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 55, 52, 48, 48, 48},
{48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 56, 48, 48, 48, 48},
{49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 57, 54, 48, 48, 48},
{49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 48, 51, 48, 48, 48},
{53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 49, 48, 48, 48, 48},
{50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 49, 54, 48, 48, 48},
{48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 51, 49, 48, 48, 48},
{55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 51, 56, 48, 48, 48},
{48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 52, 53, 48, 48, 48},
{48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 53, 49, 48, 48, 48},
{48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 53, 56, 48, 48, 48},
{48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 54, 52, 48, 48, 48},
{48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 55, 48, 48, 48, 48},
{48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 55, 54, 48, 48, 48},
{48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 56, 50, 48, 48, 48},
{48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 57, 54, 48, 48, 48},
{48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 48, 50, 48, 48, 48},
{48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 48, 57, 48, 48, 48},
{48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 49, 54, 48, 48, 48},
{48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 50, 51, 48, 48, 48},
{48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 51, 48, 48, 48, 48},
{48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 51, 54, 48, 48, 48},
{48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 52, 50, 48, 48, 48},
{48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 52, 56, 48, 48, 48},
{48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 53, 52, 48, 48, 48},
{49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 49, 55, 52, 48, 48, 48},
{56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 49, 57, 52, 48, 48, 48},
{49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 48, 54, 48, 48, 48},
{48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 49, 56, 48, 48, 48},
{49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 51, 57, 48, 48, 48},
{49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 53, 50, 48, 48, 48},
{53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 54, 52, 48, 48, 48},
{50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 55, 54, 48, 48, 48},
{48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 57, 54, 48, 48, 48},
{55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 48, 56, 48, 48, 48},
{48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 50, 48, 48, 48, 48},
{48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 51, 49, 48, 48, 48},
{48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 52, 51, 48, 48, 48},
{48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 53, 52, 48, 48, 48},
{48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 54, 54, 48, 48, 48},
{48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 55, 55, 48, 48, 48},
{48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 56, 57, 48, 48, 48},
{48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 49, 49, 48, 48, 48},
{48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 50, 53, 48, 48, 48},
{48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 51, 55, 48, 48, 48},
{48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 52, 57, 48, 48, 48},
{48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 54, 48, 48, 48, 48},
{48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 55, 50, 48, 48, 48},
{48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 56, 50, 48, 48, 48},
{48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 57, 52, 48, 48, 48},
{48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 53, 48, 53, 48, 48, 48},
{48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 53, 49, 54, 48, 48, 48}
};
public EMDNEmul(String bindAddress) {
this.bindAddress = bindAddress;
}
public void start(){
if (publisher != null) shutdown();
context = ZMQ.context(1);
publisher = context.socket(ZMQ.PUB);
LOG.debug("Start EMDN emul server, address {}", bindAddress);
publisher.bind(bindAddress);
executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(()->{
for (byte[] message : messages) {
LOG.trace("Publish message: {}", message);
publisher.send(message);
}
LOG.trace("Sleep... ");
}, 1, 5, TimeUnit.SECONDS);
}
public void shutdown(){
if (publisher!=null){
LOG.debug("Shutdown EMDN emul server");
executor.shutdown();
publisher.close();
context.term();
}
publisher = null;
context = null;
}
}

View File

@@ -1,98 +1,39 @@
package ru.trader.emdn; package ru.trader.emdn;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
public class EMDNTest extends Assert { public class EMDNTest extends Assert {
private final static EMDN markettool = new EMDN("tcp://firehose.elite-market-data.net:9050"); private final static EMDN markettool = new EMDN("tcp://localhost:9050", true);
/* Example dates
[49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 55, 55, 49, 48, 48, 48] private final static EMDNEmul server = new EMDNEmul("tcp://localhost:9050");
[56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 55, 57, 49, 48, 48, 48]
[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 48, 51, 48, 48, 48]
[48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 49, 53, 48, 48, 48]
[49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 51, 52, 48, 48, 48]
[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 52, 54, 48, 48, 48]
[53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 53, 55, 48, 48, 48]
[50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 54, 57, 48, 48, 48]
[48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 56, 57, 48, 48, 48]
[55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 48, 48, 48, 48, 48]
[48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 49, 50, 48, 48, 48]
[48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 50, 51, 48, 48, 48]
[48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 51, 52, 48, 48, 48]
[48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 52, 54, 48, 48, 48]
[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 53, 55, 48, 48, 48]
[48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 54, 57, 48, 48, 48]
[48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 56, 49, 48, 48, 48]
[48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 48, 49, 48, 48, 48]
[48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 49, 52, 48, 48, 48]
[48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 50, 54, 48, 48, 48]
[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 51, 55, 48, 48, 48]
[48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 52, 57, 48, 48, 48]
[48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 54, 48, 48, 48, 48]
[48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 55, 50, 48, 48, 48]
[48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 56, 53, 48, 48, 48]
[48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 57, 54, 48, 48, 48]
[48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 49, 48, 56, 48, 48, 48]
[49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 52, 57, 48, 48, 48]
[56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 54, 54, 48, 48, 48]
[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 55, 52, 48, 48, 48]
[48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 56, 48, 48, 48, 48]
[49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 57, 54, 48, 48, 48]
[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 48, 51, 48, 48, 48]
[53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 49, 48, 48, 48, 48]
[50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 49, 54, 48, 48, 48]
[48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 51, 49, 48, 48, 48]
[55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 51, 56, 48, 48, 48]
[48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 52, 53, 48, 48, 48]
[48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 53, 49, 48, 48, 48]
[48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 53, 56, 48, 48, 48]
[48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 54, 52, 48, 48, 48]
[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 55, 48, 48, 48, 48]
[48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 55, 54, 48, 48, 48]
[48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 56, 50, 48, 48, 48]
[48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 57, 54, 48, 48, 48]
[48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 48, 50, 48, 48, 48]
[48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 48, 57, 48, 48, 48]
[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 49, 54, 48, 48, 48]
[48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 50, 51, 48, 48, 48]
[48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 51, 48, 48, 48, 48]
[48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 51, 54, 48, 48, 48]
[48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 52, 50, 48, 48, 48]
[48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 52, 56, 48, 48, 48]
[48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 53, 52, 48, 48, 48]
[49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 49, 55, 52, 48, 48, 48]
[56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 49, 57, 52, 48, 48, 48]
[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 48, 54, 48, 48, 48]
[48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 49, 56, 48, 48, 48]
[49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 51, 57, 48, 48, 48]
[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 53, 50, 48, 48, 48]
[53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 54, 52, 48, 48, 48]
[50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 55, 54, 48, 48, 48]
[48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 57, 54, 48, 48, 48]
[55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 48, 56, 48, 48, 48]
[48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 50, 48, 48, 48, 48]
[48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 51, 49, 48, 48, 48]
[48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 52, 51, 48, 48, 48]
[48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 53, 52, 48, 48, 48]
[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 54, 54, 48, 48, 48]
[48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 55, 55, 48, 48, 48]
[48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 56, 57, 48, 48, 48]
[48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 49, 49, 48, 48, 48]
[48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 50, 53, 48, 48, 48]
[48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 51, 55, 48, 48, 48]
[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 52, 57, 48, 48, 48]
[48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 54, 48, 48, 48, 48]
[48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 55, 50, 48, 48, 48]
[48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 56, 50, 48, 48, 48]
[48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 57, 52, 48, 48, 48]
[48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 53, 48, 53, 48, 48, 48]
[48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 53, 49, 54, 48, 48, 48]
@Before
public void setUp() throws Exception {
server.start();
markettool.start();
}
*/
@Test @Test
public void testGetData() throws Exception { public void testGetData() throws Exception {
markettool.getData(); // wait submit
Thread.sleep(4000);
Station station = markettool.getVendor("Eranin");
assertNotNull(station);
ItemData itemData = station.getData("cropharvesters");
assertNotNull(itemData);
assertEquals(0,itemData.getBuy(), 0.0001);
assertEquals(0,itemData.getStock());
assertEquals(2318,itemData.getSell(), 0.0001);
assertEquals(16472,itemData.getDemand());
}
@After
public void tearDown() throws Exception {
markettool.shutdown();
server.shutdown();
} }
} }

View File

@@ -6,4 +6,3 @@ log4j.appender.stdout.layout.ConversionPattern=%p: %d{dd.MM.yyyy HH:mm:ss} (%F:%
log4j.logger.ru.trader.emdn.EMDN = TRACE log4j.logger.ru.trader.emdn.EMDN = TRACE
log4j.logger.org.zeromq = TRACE