Merge branch 'master' into Vechicle_pref_numeric_dialog_37

# Conflicts:
#	OsmAnd/src/net/osmand/plus/settings/fragments/VehicleParametersFragment.java
This commit is contained in:
Dima-1 2020-06-16 13:51:59 +03:00
commit 533df517f6
322 changed files with 11170 additions and 4963 deletions

View file

@ -33,8 +33,9 @@ public class CollatorStringMatcher implements StringMatcher {
public CollatorStringMatcher(String part, StringMatcherMode mode) {
this.collator = OsmAndCollator.primaryCollator();
this.part = part.toLowerCase(Locale.getDefault());
this.part = simplifyStringAndAlignChars(part);
this.mode = mode;
}
public Collator getCollator() {
@ -123,14 +124,15 @@ public class CollatorStringMatcher implements StringMatcher {
* @param theStart
* @return true if searchIn starts with token
*/
public static boolean cstartsWith(Collator collator, String fullText, String theStart,
public static boolean cstartsWith(Collator collator, String fullTextP, String theStart,
boolean checkBeginning, boolean checkSpaces, boolean equals) {
String searchIn = fullText.toLowerCase(Locale.getDefault());
String searchIn = simplifyStringAndAlignChars(fullTextP);
int searchInLength = searchIn.length();
int startLength = theStart.length();
if (startLength == 0) {
return true;
}
// this is not correct because of Auhofstrasse != Auhofstraße
if (startLength > searchInLength) {
return false;
}
@ -152,7 +154,8 @@ public class CollatorStringMatcher implements StringMatcher {
if (isSpace(searchIn.charAt(i - 1)) && !isSpace(searchIn.charAt(i))) {
if (collator.equals(searchIn.substring(i, i + startLength), theStart)) {
if(equals) {
if(i + startLength == searchInLength || isSpace(searchIn.charAt(i + startLength))) {
if(i + startLength == searchInLength ||
isSpace(searchIn.charAt(i + startLength))) {
return true;
}
} else {
@ -168,7 +171,17 @@ public class CollatorStringMatcher implements StringMatcher {
return false;
}
private static String simplifyStringAndAlignChars(String fullText) {
int i;
fullText = fullText.toLowerCase(Locale.getDefault());
while( (i = fullText.indexOf('ß') ) != -1 ) {
fullText = fullText.substring(0, i) + "ss" + fullText.substring(i+1);
}
return fullText;
}
private static boolean isSpace(char c){
return !Character.isLetter(c) && !Character.isDigit(c);
}
}

View file

@ -354,6 +354,7 @@ public class NativeLibrary {
FileInputStream fis = new FileInputStream(f);
Algorithms.streamCopy(fis, ous);
fis.close();
System.out.println("FONT " + name);
initFontType(ous.toByteArray(), name.substring(0, name.length() - 4), name.toLowerCase().contains("bold"),
name.toLowerCase().contains("italic"));
} catch (IOException e) {

View file

@ -38,4 +38,5 @@ public class OsmAndCollator {
}
};
}
}

View file

@ -1,6 +1,7 @@
package net.osmand;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import org.apache.commons.logging.Log;
@ -19,19 +20,23 @@ public class Reshaper {
return "";
}
}
public static String reshape(String s) {
// if(true) {
// return s;
// }
try {
ArabicShaping as = new ArabicShaping(ArabicShaping.LETTERS_SHAPE | ArabicShaping.LENGTH_GROW_SHRINK);
ArabicShaping as = new ArabicShaping(ArabicShaping.LETTERS_SHAPE |
ArabicShaping.LENGTH_GROW_SHRINK);
//printSplit("B", s);
try {
s = as.shape(s);
} catch (ArabicShapingException e) {
LOG.error(e.getMessage(), e);
}
//printSplit("A", s);
Bidi line = new Bidi(s.length(), s.length());
line.setPara(s, Bidi.LEVEL_DEFAULT_LTR, null);
// line.setPara(s, Bidi.LEVEL_DEFAULT_LTR, null);
// s = line.writeReordered(Bidi.DO_MIRRORING);
// s = reordered;
byte direction = line.getDirection();
if (direction != Bidi.MIXED) {
// unidirectional
@ -40,40 +45,42 @@ public class Reshaper {
} else {
char[] chs = new char[s.length()];
for(int i = 0; i< chs.length ; i++) {
chs[i] = s.charAt(chs.length - i - 1);
// chs[i] = s.charAt(chs.length - i - 1);
chs[i] = mirror(s.charAt(chs.length - i - 1));
}
return new String(chs);
}
} else {
// // mixed-directional
// mixed-directional
// System.out.println(s);
// printSplit("Split", s);
int count = line.countRuns();
// if (styleRunCount <= 1) {
// int style = styleRuns[0].style;
// // iterate over directional runs
// for (i = 0; i < count; ++i) {
// run = line.getVisualRun(i);
// renderRun(text, run.getStart(), run.getLimit(),
// run.getDirection(), style);
// }
// }
StringBuilder res = new StringBuilder();
// iterate over both directional and style runs
for (int i = 0; i < count; ++i) {
StringBuilder runs = new StringBuilder();
BidiRun run = line.getVisualRun(i);
int st = run.getStart();
int e = run.getLimit();
int j = run.getDirection() == Bidi.LTR ? st : e - 1;
int l = run.getDirection() == Bidi.LTR ? e : st - 1;
boolean plus = run.getDirection() == Bidi.LTR;
while (j != l) {
res.append(s.charAt(j));
if (plus) {
j++;
boolean ltr = run.getDirection() == Bidi.LTR;
int start = run.getStart();
int limit = run.getLimit();
int begin = ltr ? start : limit - 1;
int end = ltr ? limit : start - 1;
int ind = begin;
while (ind != end) {
char ch = s.charAt(ind);
if (!ltr) {
ch = mirror(ch);
}
res.append(ch);
runs.append(ch);
if (ltr) {
ind++;
} else {
j--;
ind--;
}
}
printSplit(run.getDirection() + " " + run.getEmbeddingLevel(), runs.toString());
}
return res.toString();
}
@ -83,24 +90,77 @@ public class Reshaper {
}
}
public static void main(String[] args) {
// char[] c = new char[] {'א', 'ד','ם', ' ', '1', '2'} ;
// String reshape = "אדם";
char[] c = new char[] {'א', 'ד','ם'} ;
String reshape = reshape(new String(c));
for(int i=0; i < reshape.length(); i++) {
System.out.println(reshape.charAt(i));
private static char mirror(char ch) {
switch (ch) {
case '(': ch = ')'; break;
case ')': ch = '('; break;
case '[': ch = ']'; break;
case ']': ch = '['; break;
}
return ch;
}
public static void main(String[] args) {
test2();
test3();
test4();
test5();
}
private static void test2() {
public static void test3() {
String s = "מרכז מסחרי/השלום (40050)";
String reshape = reshape(s);
String expected = "(40050) םולשה/ירחסמ זכרמ";
check(s, reshape, expected);
}
public static void test5() {
String s = "מרכז מסחרי/השלום (מרז)";
String reshape = reshape(s);
String expected = "(זרמ) םולשה/ירחסמ זכרמ";
check(s, reshape, expected);
}
public static void check(String source, String reshape, String expected) {
printSplit("Source ", source);
printSplit("Expected", expected);
printSplit("Reshaped", reshape);
System.out.println(reshape);
if (!reshape.equals(expected)) {
throw new IllegalArgumentException(String.format("Bug: expected '%s', reshaped '%s'", expected, reshape));
}
}
static void printSplit(String p, String source) {
printSplit(p, source, true);
printSplit(p, source, false);
}
static void printSplit(String p, String source, boolean f) {
System.out.print(p);
System.out.print(": \u2066");
for (int i = 0; i < source.length(); i++) {
if (f) {
System.out.print(source.charAt(i));
System.out.print(" \u200e");
} else {
System.out.print(String.format("%04x ", (int) source.charAt(i)));
}
}
// System.out.println(Arrays.toString(source.toCharArray()));
System.out.println();
System.out.flush();
}
public static void test2() {
String s = "گچ پژ نمکی باللغة العربي";
String reshape = reshape(s);
if (!reshape.equals("ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ ﯽﮑﻤﻧ ﮋﭘ ﭻﮔ")) {
throw new IllegalArgumentException("BUG!!!");
String expected1 = "ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ ﯽﮑﻤﻧ ﮋﭘ ﭻﮔ";
String expected2 = "ﻲﺑﺮﻌﻟﺍ ﺔﻐﻠﻟﺎﺑ یکﻤﻧ ژپ چگ";
check(s, reshape, expected1);
}
public static void test4() {
String s = "Abc (123)";
check(s, reshape(s), s);
}
}

View file

@ -93,33 +93,6 @@ public class Amenity extends MapObject {
return str;
}
public String unzipContent(String str) {
if (str != null) {
if (str.startsWith(" gz ")) {
try {
int ind = 4;
byte[] bytes = new byte[str.length() - ind];
for (int i = ind; i < str.length(); i++) {
char ch = str.charAt(i);
bytes[i - ind] = (byte) ((int) ch - 128 - 32);
}
GZIPInputStream gzn = new GZIPInputStream(new ByteArrayInputStream(bytes));
BufferedReader br = new BufferedReader(new InputStreamReader(gzn, "UTF-8"));
StringBuilder bld = new StringBuilder();
String s;
while ((s = br.readLine()) != null) {
bld.append(s);
}
br.close();
str = bld.toString();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return str;
}
public Map<String, String> getAdditionalInfo() {
if (additionalInfo == null) {

View file

@ -8,6 +8,10 @@ import net.osmand.util.TransliterationHelper;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@ -18,6 +22,7 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.zip.GZIPInputStream;
public abstract class MapObject implements Comparable<MapObject> {
@ -55,7 +60,7 @@ public abstract class MapObject implements Comparable<MapObject> {
public String getName() {
if (name != null) {
return name;
return unzipContent(name);
}
return ""; //$NON-NLS-1$
}
@ -73,7 +78,7 @@ public abstract class MapObject implements Comparable<MapObject> {
if (names == null) {
names = new HashMap<String, String>();
}
names.put(lang, name);
names.put(lang, unzipContent(name));
}
}
@ -95,19 +100,25 @@ public abstract class MapObject implements Comparable<MapObject> {
}
Map<String, String> mp = new HashMap<String, String>();
if (names != null) {
mp.putAll(names);
Iterator<Entry<String, String>> it = mp.entrySet().iterator();
while(it.hasNext()) {
Entry<String, String> e = it.next();
mp.put(e.getKey(), unzipContent(e.getValue()));
}
mp.put("en", enName);
}
mp.put("en", unzipContent(enName));
return mp;
}
public List<String> getAllNames() {
List<String> l = new ArrayList<String>();
if (!Algorithms.isEmpty(enName)) {
l.add(enName);
l.add(unzipContent(enName));
}
if (names != null) {
l.addAll(names.values());
for(String nm : names.values()) {
l.add(unzipContent(nm));
}
}
return l;
}
@ -179,7 +190,7 @@ public abstract class MapObject implements Comparable<MapObject> {
if (names != null) {
String nm = names.get(lang);
if (!Algorithms.isEmpty(nm)) {
return nm;
return unzipContent(nm);
}
if (transliterate) {
return TransliterationHelper.transliterate(getName());
@ -192,7 +203,7 @@ public abstract class MapObject implements Comparable<MapObject> {
public String getEnName(boolean transliterate) {
if (!Algorithms.isEmpty(enName)) {
return this.enName;
return unzipContent(this.enName);
} else if (!Algorithms.isEmpty(getName()) && transliterate) {
return TransliterationHelper.transliterate(getName());
}
@ -322,12 +333,12 @@ public abstract class MapObject implements Comparable<MapObject> {
public JSONObject toJSON() {
JSONObject json = new JSONObject();
json.put("name", name);
json.put("enName", enName);
json.put("name", unzipContent(name));
json.put("enName", unzipContent(enName));
if (names != null && names.size() > 0) {
JSONObject namesObj = new JSONObject();
for (Entry<String, String> e : names.entrySet()) {
namesObj.put(e.getKey(), e.getValue());
namesObj.put(e.getKey(), unzipContent(e.getValue()));
}
json.put("names", namesObj);
}
@ -340,6 +351,31 @@ public abstract class MapObject implements Comparable<MapObject> {
return json;
}
public String unzipContent(String str) {
if (str != null && str.startsWith(" gz ")) {
try {
int ind = 4;
byte[] bytes = new byte[str.length() - ind];
for (int i = ind; i < str.length(); i++) {
char ch = str.charAt(i);
bytes[i - ind] = (byte) ((int) ch - 128 - 32);
}
GZIPInputStream gzn = new GZIPInputStream(new ByteArrayInputStream(bytes));
BufferedReader br = new BufferedReader(new InputStreamReader(gzn, "UTF-8"));
StringBuilder bld = new StringBuilder();
String s;
while ((s = br.readLine()) != null) {
bld.append(s);
}
br.close();
str = bld.toString();
} catch (IOException e) {
e.printStackTrace();
}
}
return str;
}
protected static void parseJSON(JSONObject json, MapObject o) {
if (json.has("name")) {
o.name = json.getString("name");

View file

@ -301,8 +301,11 @@ public abstract class Entity implements Serializable {
String values = getTag(OSMTagKey.IS_IN);
if (values == null) {
String city = getTag(OSMTagKey.ADDR_CITY);
String place = getTag(OSMTagKey.ADDR_PLACE);
if(!Algorithms.isEmpty(city)) {
return Collections.singleton(city.trim());
} else if(!Algorithms.isEmpty(place)) {
return Collections.singleton(place.trim());
}
return Collections.emptySet();
}

View file

@ -34,9 +34,11 @@ public class OSMSettings {
// address
PLACE("place"), //$NON-NLS-1$
ADDR_HOUSE_NUMBER("addr:housenumber"), //$NON-NLS-1$
ADDR2_HOUSE_NUMBER("addr2:housenumber"), //$NON-NLS-1$
ADDR_HOUSE_NAME("addr:housename"), //$NON-NLS-1$
ADDR_STREET("addr:street"), //$NON-NLS-1$
ADDR_STREET2("addr:street2"), //$NON-NLS-1$
ADDR2_STREET("addr2:street"), //$NON-NLS-1$
ADDR_CITY("addr:city"), //$NON-NLS-1$
ADDR_PLACE("addr:place"), //$NON-NLS-1$
ADDR_POSTCODE("addr:postcode"), //$NON-NLS-1$

View file

@ -8,6 +8,9 @@ import java.util.Map;
public class RenderingRuleStorageProperties {
public static final String UI_CATEGORY_HIDDEN = "ui_hidden";
public static final String UI_CATEGORY_DETAILS = "details";
public static final String UI_CATEGORY_HIDE = "hide";
public static final String UI_CATEGORY_ROUTES = "routes";
public static final String A_ENGINE_V1 = "engine_v1";
public static final String A_APP_MODE= "appMode";
public static final String A_BASE_APP_MODE = "baseAppMode";

View file

@ -11,6 +11,7 @@ import java.util.PriorityQueue;
import net.osmand.PlatformUtil;
import net.osmand.binary.RouteDataObject;
import net.osmand.data.LatLon;
import net.osmand.osm.MapRenderingTypes;
import net.osmand.util.MapUtils;
@ -138,7 +139,7 @@ public class BinaryRoutePlanner {
checkIfGraphIsEmpty(ctx, ctx.getPlanRoadDirection() >= 0, graphDirectSegments, start, visitedDirectSegments,
"Route is not found from selected start point.");
if (ctx.planRouteIn2Directions()) {
forwardSearch = (nonHeuristicSegmentsComparator.compare(graphDirectSegments.peek(), graphReverseSegments.peek()) < 0);
forwardSearch = nonHeuristicSegmentsComparator.compare(graphDirectSegments.peek(), graphReverseSegments.peek()) <= 0;
// if (graphDirectSegments.size() * 2 > graphReverseSegments.size()) {
// forwardSearch = false;
// } else if (graphDirectSegments.size() < 2 * graphReverseSegments.size()) {
@ -798,10 +799,30 @@ public class BinaryRoutePlanner {
" distToEnd=" + distanceToEnd +
" segmentPoint=" + segmentPoint + " -- ", next, true);
}
if (!visitedSegments.containsKey(calculateRoutePointId(next, next.isPositive()))) {
if (next.getParentRoute() == null
|| ctx.roadPriorityComparator(next.distanceFromStart, next.distanceToEnd,
distFromStart, distanceToEnd) > 0) {
RouteSegment visIt = visitedSegments.get(calculateRoutePointId(next, next.isPositive()));
boolean toAdd = true;
if (visIt != null) {
// the segment was already visited! We need to follow better route if it exists
// that is very exceptional situation and almost exception, it can happen
// 1. when we underestimate distnceToEnd - wrong h()
// 2. because we process not small segments but the whole road, it could be that
// deviation from the road is faster than following the whole road itself!
if (TRACE_ROUTING) {
printRoad(">?", visitedSegments.get(calculateRoutePointId(next, next.isPositive())),
next.isPositive());
}
if (distFromStart < visIt.distanceFromStart && next.getParentRoute() == null) {
toAdd = true;
if (ctx.config.heuristicCoefficient <= 1) {
System.err.println("! Alert distance from start " + distFromStart + " < "
+ visIt.distanceFromStart + " id=" + next.road.id);
}
} else {
toAdd = false;
}
}
if (toAdd && (next.getParentRoute() == null || ctx.roadPriorityComparator(next.distanceFromStart,
next.distanceToEnd, distFromStart, distanceToEnd) > 0)) {
next.distanceFromStart = distFromStart;
next.distanceToEnd = distanceToEnd;
if (TRACE_ROUTING) {
@ -812,27 +833,6 @@ public class BinaryRoutePlanner {
next.setParentSegmentEnd(segmentPoint);
graphSegments.add(next);
}
} else {
// the segment was already visited! We need to follow better route if it exists
// that is very exceptional situation and almost exception, it can happen
// 1. when we underestimate distnceToEnd - wrong h()
// 2. because we process not small segments but the whole road, it could be that
// deviation from the road is faster than following the whole road itself!
if (distFromStart < next.distanceFromStart) {
if (ctx.config.heuristicCoefficient <= 1) {
System.err.println("! Alert distance from start " + distFromStart + " < "
+ next.distanceFromStart + " id=" + next.road.id);
}
// A: we can't change parent route just here, because we need to update visitedSegments
// presumably we can do visitedSegments.put(calculateRoutePointId(next), next);
// next.distanceFromStart = distFromStart;
// next.setParentRoute(segment);
// next.setParentSegmentEnd(segmentPoint);
if (ctx.visitor != null) {
// ctx.visitor.visitSegment(next, false);
}
}
}
}
}
@ -860,6 +860,12 @@ public class BinaryRoutePlanner {
public int preciseX;
public int preciseY;
public List<RouteSegmentPoint> others;
public LatLon getPreciseLatLon() {
return new LatLon(MapUtils.get31LatitudeY(preciseY), MapUtils.get31LongitudeX(preciseX));
}
}
public static class RouteSegment {

View file

@ -91,7 +91,7 @@ public class RoutePlannerFrontEnd {
}
if (road != null) {
if(!transportStop) {
float prio = ctx.getRouter().defineSpeedPriority(road.road);
float prio = Math.max(ctx.getRouter().defineSpeedPriority(road.road), 0.3f);
if (prio > 0) {
road.distSquare = (road.distSquare + GPS_POSSIBLE_ERROR * GPS_POSSIBLE_ERROR)
/ (prio * prio);
@ -234,6 +234,7 @@ public class RoutePlannerFrontEnd {
if (intermediates != null) {
for (LatLon l : intermediates) {
if (!addSegment(l, ctx, indexNotFound++, points, false)) {
System.out.println(points.get(points.size() - 1).getRoad().toString());
return null;
}
}
@ -242,9 +243,7 @@ public class RoutePlannerFrontEnd {
return null;
}
ctx.calculationProgress.nextIteration();
List<RouteSegmentResult> res = searchRoute(ctx, points, routeDirection);
// make start and end more precise
makeStartEndPointsPrecise(res, start, end, intermediates);
List<RouteSegmentResult> res = searchRouteImpl(ctx, points, routeDirection);
if (res != null) {
new RouteResultPreparation().printResults(ctx, start, end, res);
}
@ -255,33 +254,6 @@ public class RoutePlannerFrontEnd {
if (res.size() > 0) {
updateResult(res.get(0), start, true);
updateResult(res.get(res.size() - 1), end, false);
if (intermediates != null) {
int k = 1;
for (int i = 0; i < intermediates.size(); i++) {
LatLon ll = intermediates.get(i);
int px = MapUtils.get31TileNumberX(ll.getLongitude());
int py = MapUtils.get31TileNumberY(ll.getLatitude());
for (; k < res.size(); k++) {
double currentsDist = projectDistance(res, k, px, py);
if (currentsDist < 500 * 500) {
for (int k1 = k + 1; k1 < res.size(); k1++) {
double c2 = projectDistance(res, k1, px, py);
if (c2 < currentsDist) {
k = k1;
currentsDist = c2;
} else if (k1 - k > 15) {
break;
}
}
updateResult(res.get(k), ll, false);
if (k < res.size() - 1) {
updateResult(res.get(k + 1), ll, true);
}
break;
}
}
}
}
}
}
@ -300,7 +272,8 @@ public class RoutePlannerFrontEnd {
int py = MapUtils.get31TileNumberY(point.getLatitude());
int pind = st ? routeSegmentResult.getStartPointIndex() : routeSegmentResult.getEndPointIndex();
RouteDataObject r = routeSegmentResult.getObject();
RouteDataObject r = new RouteDataObject(routeSegmentResult.getObject());
routeSegmentResult.setObject(r);
QuadPoint before = null;
QuadPoint after = null;
if (pind > 0) {
@ -364,7 +337,7 @@ public class RoutePlannerFrontEnd {
ctx.calculationProgress.segmentNotFound = indexNotFound;
return false;
} else {
log.info("Route segment found " + f.getRoad().id + " " + f.getRoad().getName());
log.info("Route segment found " + f.road);
res.add(f);
return true;
}
@ -383,6 +356,10 @@ public class RoutePlannerFrontEnd {
ctx.precalculatedRouteDirection = routeDirection.adopt(ctx);
}
if (ctx.nativeLib != null) {
ctx.startX = start.preciseX;
ctx.startY = start.preciseY;
ctx.targetX = end.preciseX;
ctx.targetY = end.preciseY;
return runNativeRouting(ctx, recalculationEnd);
} else {
refreshProgressDistance(ctx);
@ -468,13 +445,18 @@ public class RoutePlannerFrontEnd {
}
private List<RouteSegmentResult> searchRoute(final RoutingContext ctx, List<RouteSegmentPoint> points, PrecalculatedRouteDirection routeDirection)
private List<RouteSegmentResult> searchRouteImpl(final RoutingContext ctx, List<RouteSegmentPoint> points, PrecalculatedRouteDirection routeDirection)
throws IOException, InterruptedException {
if (points.size() <= 2) {
// simple case 2 points only
if (!useSmartRouteRecalculation) {
ctx.previouslyCalculatedRoute = null;
}
return searchRoute(ctx, points.get(0), points.get(1), routeDirection);
pringGC(ctx, true);
List<RouteSegmentResult> res = searchRouteInternalPrepare(ctx, points.get(0), points.get(1), routeDirection);
pringGC(ctx, false);
makeStartEndPointsPrecise(res, points.get(0).getPreciseLatLon(), points.get(1).getPreciseLatLon(), null);
return res;
}
ArrayList<RouteSegmentResult> firstPartRecalculatedRoute = null;
@ -516,7 +498,7 @@ public class RoutePlannerFrontEnd {
local.visitor = ctx.visitor;
local.calculationProgress = ctx.calculationProgress;
List<RouteSegmentResult> res = searchRouteInternalPrepare(local, points.get(i), points.get(i + 1), routeDirection);
makeStartEndPointsPrecise(res, points.get(i).getPreciseLatLon(), points.get(i + 1).getPreciseLatLon(), null);
results.addAll(res);
ctx.distinctLoadedTiles += local.distinctLoadedTiles;
ctx.loadedTiles += local.loadedTiles;
@ -539,27 +521,22 @@ public class RoutePlannerFrontEnd {
}
@SuppressWarnings("static-access")
private List<RouteSegmentResult> searchRoute(final RoutingContext ctx, RouteSegmentPoint start, RouteSegmentPoint end,
PrecalculatedRouteDirection routeDirection) throws IOException, InterruptedException {
if (ctx.SHOW_GC_SIZE) {
long h1 = ctx.runGCUsedMemory();
private void pringGC(final RoutingContext ctx, boolean before) {
if (RoutingContext.SHOW_GC_SIZE && before) {
long h1 = RoutingContext.runGCUsedMemory();
float mb = (1 << 20);
log.warn("Used before routing " + h1 / mb + " actual");
}
List<RouteSegmentResult> result = searchRouteInternalPrepare(ctx, start, end, routeDirection);
if (RoutingContext.SHOW_GC_SIZE) {
} else if (RoutingContext.SHOW_GC_SIZE && !before) {
int sz = ctx.global.size;
log.warn("Subregion size " + ctx.subregionTiles.size() + " " + " tiles " + ctx.indexedSubregions.size());
ctx.runGCUsedMemory();
long h1 = ctx.runGCUsedMemory();
RoutingContext.runGCUsedMemory();
long h1 = RoutingContext.runGCUsedMemory();
ctx.unloadAllData();
ctx.runGCUsedMemory();
long h2 = ctx.runGCUsedMemory();
RoutingContext.runGCUsedMemory();
long h2 = RoutingContext.runGCUsedMemory();
float mb = (1 << 20);
log.warn("Unload context : estimated " + sz / mb + " ?= " + (h1 - h2) / mb + " actual");
}
return result;
}

View file

@ -1,5 +1,24 @@
package net.osmand.router;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import gnu.trove.iterator.TIntIterator;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.set.hash.TIntHashSet;
import net.osmand.PlatformUtil;
import net.osmand.binary.BinaryMapIndexReader;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
@ -18,26 +37,6 @@ import net.osmand.util.Algorithms;
import net.osmand.util.MapAlgorithms;
import net.osmand.util.MapUtils;
import org.apache.commons.logging.Log;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import gnu.trove.iterator.TIntIterator;
import gnu.trove.list.array.TIntArrayList;
import gnu.trove.set.hash.TIntHashSet;
public class RouteResultPreparation {
public static boolean PRINT_TO_CONSOLE_ROUTE_INFORMATION_TO_TEST = false;
@ -395,7 +394,6 @@ public class RouteResultPreparation {
}
// reverse it just to attach good direction roads
Collections.reverse(result);
segment = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentRoute() : finalSegment;
int parentSegmentEnd = finalSegment.reverseWaySearch ? finalSegment.opposite.getParentSegmentEnd() : finalSegment.opposite.getSegmentStart();
parentRoutingTime = -1;
@ -622,7 +620,7 @@ public class RouteResultPreparation {
// calculateStatistics(result);
}
private void calculateStatistics(List<RouteSegmentResult> result) {
protected void calculateStatistics(List<RouteSegmentResult> result) {
InputStream is = RenderingRulesStorage.class.getResourceAsStream("default.render.xml");
final Map<String, String> renderingConstants = new LinkedHashMap<String, String>();
try {
@ -799,13 +797,22 @@ public class RouteResultPreparation {
}
if (dist < mergeDistance) {
mergeTurnLanes(leftside, currentSegment, nextSegment);
inferCommonActiveLane(currentSegment.getTurnType(), nextSegment.getTurnType());
TurnType turnType = currentSegment.getTurnType();
TIntHashSet possibleTurn = getPossibleTurnsFromActiveLanes(turnType.getLanes(), true);
if (possibleTurn.size() == 1) {
TurnType tt = TurnType.valueOf(possibleTurn.iterator().next(), currentSegment.getTurnType().isLeftSide());
tt.setLanes(turnType.getLanes());
tt.setSkipToSpeak(turnType.isSkipToSpeak());
currentSegment.setTurnType(tt);
turnType = tt;
}
inferCommonActiveLane(turnType, nextSegment.getTurnType());
merged = true;
}
}
if (!merged) {
TurnType tt = currentSegment.getTurnType();
inferActiveTurnLanesFromTurn(tt, TurnType.C);
inferActiveTurnLanesFromTurn(tt, tt.getValue());
}
nextSegment = currentSegment;
dist = 0;
@ -983,11 +990,9 @@ public class RouteResultPreparation {
if(turnSet.size() == 1) {
singleTurn = turnSet.iterator().next();
} else if(currentTurn.goAhead() && turnSet.contains(nextTurn.getValue())) {
if(currentTurn.isPossibleLeftTurn() &&
TurnType.isLeftTurn(nextTurn.getValue())) {
if (currentTurn.isPossibleLeftTurn() && TurnType.isLeftTurn(nextTurn.getValue())) {
singleTurn = nextTurn.getValue();
} else if(currentTurn.isPossibleLeftTurn() &&
TurnType.isLeftTurn(nextTurn.getActiveCommonLaneTurn())) {
} else if (currentTurn.isPossibleLeftTurn() && TurnType.isLeftTurn(nextTurn.getActiveCommonLaneTurn())) {
singleTurn = nextTurn.getActiveCommonLaneTurn();
} else if(currentTurn.isPossibleRightTurn() &&
TurnType.isRightTurn(nextTurn.getValue())) {
@ -1053,7 +1058,7 @@ public class RouteResultPreparation {
// add description about turn
double mpi = MapUtils.degreesDiff(prev.getBearingEnd(), rr.getBearingBegin());
if(noAttachedRoads){
// TODO VICTOR : look at the comment inside direction route
// VICTOR : look at the comment inside direction route
// ? avoid small zigzags is covered at (search for "zigzags")
// double begin = rr.getObject().directionRoute(rr.getStartPointIndex(), rr.getStartPointIndex() <
// rr.getEndPointIndex(), 25);
@ -1268,17 +1273,8 @@ public class RouteResultPreparation {
String[] splitLaneOptions = turnLanes.split("\\|", -1);
int activeBeginIndex = findActiveIndex(rawLanes, splitLaneOptions, rs.leftLanes, true,
rs.leftLanesInfo, rs.roadsOnLeft, rs.addRoadsOnLeft);
if(!rs.keepLeft && activeBeginIndex != -1 &&
splitLaneOptions.length > 0 && !splitLaneOptions[splitLaneOptions.length - 1].contains(";")) {
activeBeginIndex = Math.max(activeBeginIndex, 1);
}
int activeEndIndex = findActiveIndex(rawLanes, splitLaneOptions, rs.rightLanes, false,
rs.rightLanesInfo, rs.roadsOnRight, rs.addRoadsOnRight);
if(!rs.keepRight && activeEndIndex != -1 &&
splitLaneOptions.length > 0 && !splitLaneOptions[0].contains(";") ) {
activeEndIndex = Math.min(activeEndIndex, rawLanes.length - 1);
}
if (activeBeginIndex == -1 || activeEndIndex == -1 || activeBeginIndex > activeEndIndex) {
// something went wrong
return createSimpleKeepLeftRightTurn(leftSide, prevSegm, currentSegm, rs);
@ -1291,6 +1287,12 @@ public class RouteResultPreparation {
int tp = inferSlightTurnFromLanes(rawLanes, rs);
if (tp != t.getValue() && tp != 0) {
t = TurnType.valueOf(tp, leftSide);
} else {
if (rs.keepRight && TurnType.getSecondaryTurn(rawLanes[activeEndIndex]) == 0) {
t = TurnType.valueOf(TurnType.getPrimaryTurn(rawLanes[activeEndIndex]), leftSide);
} else if (rs.keepLeft && TurnType.getSecondaryTurn(rawLanes[activeBeginIndex]) == 0) {
t = TurnType.valueOf(TurnType.getPrimaryTurn(rawLanes[activeBeginIndex]), leftSide);
}
}
} else {
for (int k = 0; k < rawLanes.length; k++) {
@ -1596,59 +1598,11 @@ public class RouteResultPreparation {
}
private int inferSlightTurnFromLanes(int[] oLanes, RoadSplitStructure rs) {
TIntHashSet possibleTurns = new TIntHashSet();
for (int i = 0; i < oLanes.length; i++) {
if ((oLanes[i] & 1) == 0) {
continue;
}
if (possibleTurns.isEmpty()) {
// Nothing is in the list to compare to, so add the first elements
possibleTurns.add(TurnType.getPrimaryTurn(oLanes[i]));
if (TurnType.getSecondaryTurn(oLanes[i]) != 0) {
possibleTurns.add(TurnType.getSecondaryTurn(oLanes[i]));
}
if (TurnType.getTertiaryTurn(oLanes[i]) != 0) {
possibleTurns.add(TurnType.getTertiaryTurn(oLanes[i]));
}
} else {
TIntArrayList laneTurns = new TIntArrayList();
laneTurns.add(TurnType.getPrimaryTurn(oLanes[i]));
if (TurnType.getSecondaryTurn(oLanes[i]) != 0) {
laneTurns.add(TurnType.getSecondaryTurn(oLanes[i]));
}
if (TurnType.getTertiaryTurn(oLanes[i]) != 0) {
laneTurns.add(TurnType.getTertiaryTurn(oLanes[i]));
}
possibleTurns.retainAll(laneTurns);
TIntHashSet possibleTurns = getPossibleTurnsFromActiveLanes(oLanes, false);
if (possibleTurns.isEmpty()) {
// No common turns, so can't determine anything.
return 0;
}
}
}
// Remove all turns from lanes not selected...because those aren't it
for (int i = 0; i < oLanes.length; i++) {
if ((oLanes[i] & 1) == 0 && !possibleTurns.isEmpty()) {
possibleTurns.remove((Integer) TurnType.getPrimaryTurn(oLanes[i]));
if (TurnType.getSecondaryTurn(oLanes[i]) != 0) {
possibleTurns.remove((Integer) TurnType.getSecondaryTurn(oLanes[i]));
}
if (TurnType.getTertiaryTurn(oLanes[i]) != 0) {
possibleTurns.remove((Integer) TurnType.getTertiaryTurn(oLanes[i]));
}
}
}
// remove all non-slight turns // TEST don't pass
// if(possibleTurns.size() > 1) {
// TIntIterator it = possibleTurns.iterator();
// while(it.hasNext()) {
// int nxt = it.next();
// if(!TurnType.isSlightTurn(nxt)) {
// it.remove();
// }
// }
// }
int infer = 0;
if (possibleTurns.size() == 1) {
infer = possibleTurns.iterator().next();
@ -1687,6 +1641,53 @@ public class RouteResultPreparation {
return infer;
}
private TIntHashSet getPossibleTurnsFromActiveLanes(int[] oLanes, boolean onlyPrimary) {
TIntHashSet possibleTurns = new TIntHashSet();
for (int i = 0; i < oLanes.length; i++) {
if ((oLanes[i] & 1) == 0) {
continue;
}
if (possibleTurns.isEmpty()) {
// Nothing is in the list to compare to, so add the first elements
possibleTurns.add(TurnType.getPrimaryTurn(oLanes[i]));
if (!onlyPrimary && TurnType.getSecondaryTurn(oLanes[i]) != 0) {
possibleTurns.add(TurnType.getSecondaryTurn(oLanes[i]));
}
if (!onlyPrimary && TurnType.getTertiaryTurn(oLanes[i]) != 0) {
possibleTurns.add(TurnType.getTertiaryTurn(oLanes[i]));
}
} else {
TIntArrayList laneTurns = new TIntArrayList();
laneTurns.add(TurnType.getPrimaryTurn(oLanes[i]));
if (!onlyPrimary && TurnType.getSecondaryTurn(oLanes[i]) != 0) {
laneTurns.add(TurnType.getSecondaryTurn(oLanes[i]));
}
if (!onlyPrimary && TurnType.getTertiaryTurn(oLanes[i]) != 0) {
laneTurns.add(TurnType.getTertiaryTurn(oLanes[i]));
}
possibleTurns.retainAll(laneTurns);
if (possibleTurns.isEmpty()) {
// No common turns, so can't determine anything.
return possibleTurns;
}
}
}
// Remove all turns from lanes not selected...because those aren't it
for (int i = 0; i < oLanes.length; i++) {
if ((oLanes[i] & 1) == 0 && !possibleTurns.isEmpty()) {
possibleTurns.remove((Integer) TurnType.getPrimaryTurn(oLanes[i]));
if (TurnType.getSecondaryTurn(oLanes[i]) != 0) {
possibleTurns.remove((Integer) TurnType.getSecondaryTurn(oLanes[i]));
}
if (TurnType.getTertiaryTurn(oLanes[i]) != 0) {
possibleTurns.remove((Integer) TurnType.getTertiaryTurn(oLanes[i]));
}
}
}
return possibleTurns;
}
private boolean isMotorway(RouteSegmentResult s){
String h = s.getObject().getHighway();
return "motorway".equals(h) || "motorway_link".equals(h) ||
@ -1740,7 +1741,7 @@ public class RouteResultPreparation {
public void remove() {
}
};
} else if (recalculation) {
} else if (recalculation || ctx.nativeLib == null) {
RouteSegment rt = ctx.loadRouteSegment(road.getPoint31XTile(pointInd), road.getPoint31YTile(pointInd), ctx.config.memoryLimitation);
it = rt == null ? null : rt.getIterator();
} else {

View file

@ -21,7 +21,9 @@ import gnu.trove.map.hash.TIntObjectHashMap;
public class RouteSegmentResult implements StringExternalizable<RouteDataBundle> {
private final RouteDataObject object;
// this should be bigger (50-80m) but tests need to be fixed first
private static final float DIST_BEARING_DETECT = 5;
private RouteDataObject object;
private int startPointIndex;
private int endPointIndex;
private List<RouteSegmentResult>[] attachedRoutes;
@ -444,11 +446,11 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
}
public float getBearingBegin() {
return (float) (object.directionRoute(startPointIndex, startPointIndex < endPointIndex) / Math.PI * 180);
return (float) (object.directionRoute(startPointIndex, startPointIndex < endPointIndex, DIST_BEARING_DETECT) / Math.PI * 180);
}
public float getBearing(int point, boolean plus) {
return (float) (object.directionRoute(point, plus) / Math.PI * 180);
return (float) (object.directionRoute(point, plus, DIST_BEARING_DETECT) / Math.PI * 180);
}
public float getDistance(int point, boolean plus) {
@ -456,7 +458,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
}
public float getBearingEnd() {
return (float) (MapUtils.alignAngleDifference(object.directionRoute(endPointIndex, startPointIndex > endPointIndex) - Math.PI) / Math.PI * 180);
return (float) (MapUtils.alignAngleDifference(object.directionRoute(endPointIndex, startPointIndex > endPointIndex, DIST_BEARING_DETECT) - Math.PI) / Math.PI * 180);
}
public void setSegmentTime(float segmentTime) {
@ -534,9 +536,15 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
this.description = description;
}
public void setObject(RouteDataObject r) {
this.object = r;
}
@Override
public String toString() {
return object.toString() + ": " + startPointIndex + "-" + endPointIndex;
}
}

View file

@ -36,7 +36,7 @@ import net.osmand.router.RoutePlannerFrontEnd.RouteCalculationMode;
public class RoutingContext {
public static final boolean SHOW_GC_SIZE = false;
public static boolean SHOW_GC_SIZE = false;
private final static Log log = PlatformUtil.getLog(RoutingContext.class);
@ -467,15 +467,14 @@ public class RoutingContext {
long h2 = runGCUsedMemory();
float mb = (1 << 20);
log.warn("Unload tiles : estimated " + (sz1 - sz2) / mb + " ?= " + (h1 - h2) / mb + " actual");
log.warn("Used after " + h2 / mb + " of " + Runtime.getRuntime().totalMemory() / mb + " max "
+ maxMemory() / mb);
log.warn("Used after " + h2 / mb + " of " + Runtime.getRuntime().totalMemory() / mb );
} else {
float mb = (1 << 20);
int sz2 = getCurrentEstimatedSize();
log.warn("Unload tiles : occupied before " + sz1 / mb + " Mb - now " + sz2 / mb + "MB "
+ memoryLimit / mb + " limit MB " + config.memoryLimitation / mb);
long us2 = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
log.warn("Used memory before " + us1 / mb + "after " + us1 / mb + " of max " + maxMemory() / mb);
log.warn("Used memory before " + us1 / mb + "after " + us1 / mb );
}
}
if (!indexedSubregions.containsKey(tileId)) {
@ -507,12 +506,6 @@ public class RoutingContext {
return tileId;
}
private long maxMemory() {
// AVIAN FIXME
// return Runtime.getRuntime().maxMemory();
return 0;
}
public boolean checkIfMemoryLimitCritical(long memoryLimit) {

View file

@ -23,7 +23,7 @@ import net.osmand.osm.edit.Way;
import net.osmand.util.MapUtils;
public class TransportStopsRouteReader {
public static final int MISSING_STOP_SEARCH_RADIUS = 15000;
public static final int MISSING_STOP_SEARCH_RADIUS = 30000;
TLongObjectHashMap<TransportRoute> combinedRoutesCache = new TLongObjectHashMap<TransportRoute>();
Map<BinaryMapIndexReader, TIntObjectHashMap<TransportRoute>> routesFilesCache = new LinkedHashMap<BinaryMapIndexReader,
TIntObjectHashMap<TransportRoute>>();

View file

@ -414,7 +414,8 @@ public class SearchCoreFactory {
if (object.getName().startsWith("<")) {
return false;
}
if (!phrase.getFirstUnknownNameStringMatcher().matches(stripBraces(sr.localeName))) {
if (!phrase.getUnknownWordToSearchBuildingNameMatcher().matches(stripBraces(sr.localeName))) {
sr.priorityDistance = 5;
}
sr.objectType = ObjectType.STREET;

View file

@ -0,0 +1,56 @@
package net.osmand;
import java.text.Normalizer;
import org.junit.Test;
import com.ibm.icu.text.ArabicShaping;
import com.ibm.icu.text.ArabicShapingException;
import com.ibm.icu.text.Bidi;
import net.osmand.Reshaper;
public class ReShaperTest {
//
// Source : ه ە ی ب ە
// Expected: ه ە ی ب ە
// Reshaped: ە ە
@Test
public void testArabName() throws ArabicShapingException {
// https://www.compart.com/en/unicode/U+FCD8
// String source = "\uFEEB\u06d5";
// System.out.println(new ArabicShaping(0).shape(s));
// System.out.println("\uFEEB\u06d5");
String source = "هەیبە";
String expected = "ەﺐﯾەﻩ";
String res = Reshaper.reshape(source);
Reshaper.check(source, res, expected);
}
@Test
public void test2() throws ArabicShapingException {
Reshaper.test2();
}
@Test
public void test3() throws ArabicShapingException {
Reshaper.test3();
}
@Test
public void test4() throws ArabicShapingException {
Reshaper.test4();
}
@Test
public void test5() throws ArabicShapingException {
Reshaper.test5();
}
}

View file

@ -38,15 +38,13 @@ public class RouteResultPreparationTest {
private static RoutePlannerFrontEnd fe;
private static RoutingContext ctx;
private String testName;
private LatLon startPoint;
private LatLon endPoint;
private Map<Long, String> expectedResults;
private Log log = PlatformUtil.getLog(RouteResultPreparationTest.class);
protected Log log = PlatformUtil.getLog(RouteResultPreparationTest.class);
public RouteResultPreparationTest(String testName, LatLon startPoint, LatLon endPoint, Map<Long, String> expectedResults) {
this.testName = testName;
this.startPoint = startPoint;
this.endPoint = endPoint;
this.expectedResults = expectedResults;

View file

@ -30,7 +30,7 @@
<string name="not_found_yet">Яшчэ не знойдзена</string>
<string name="re_send_location">Пераадправіць звесткі аб месцазнаходжанні</string>
<string name="last_available_location">Апошняе даступнае месца</string>
<string name="sharing_status">"Статус абмену "</string>
<string name="sharing_status">Статус абмену</string>
<string name="location_sharing_status">Абмен: %1$s</string>
<string name="shared_string_enabled">Уключана</string>
<string name="shared_string_status">Статус</string>
@ -75,7 +75,7 @@
<string name="send_my_location_desc">Вызначыць мінімальны інтэрвал для абмену інфармацыяй аб месцазнаходжанні.</string>
<string name="send_my_location">Адправіць маё месцазнаходжанне</string>
<string name="gps_and_location">Пазіцыя</string>
<string name="sharing_time">"Час абмену "</string>
<string name="sharing_time">Час абмену</string>
<string name="expire_at">Сыходзіць</string>
<string name="stop_sharing_all">Абмен уключаны (выключыць)</string>
<string name="turn_off_location_sharing">Выключыць абмен</string>
@ -168,9 +168,7 @@
<string name="shared_string_hour_short">г</string>
<string name="shared_string_minute_short">хвіл</string>
<string name="shared_string_second_short">сек</string>
<string name="welcome_descr">
<b>Назіральнік OsmAnd</b> Дае магчымасць дзяліцца сваім месцазнаходжаннем і бачыць месцазнаходжанне іншых у OsmAnd.<br/>
<br/> Дадатак выкарыстоўвае Telegram API, таму вам неабходны акаўнт Тэлеграм.</string>
<string name="welcome_descr"><b>Назіральнік OsmAnd</b> Дае магчымасць дзяліцца сваім месцазнаходжаннем і бачыць месцазнаходжанне іншых у OsmAnd.<br/> <br/> Дадатак выкарыстоўвае Telegram API, таму вам неабходны акаўнт Тэлеграм.</string>
<string name="my_location">Маё месцазнаходжанне</string>
<string name="live_now">Зараз дзейнічае</string>
<string name="send_location_as">Адправіць месцазнаходжанне як</string>
@ -246,10 +244,10 @@
<string name="timeline_no_data_descr">Даныя для абранага дня адсутнічаюць</string>
<string name="timeline_no_data">Няма даных</string>
<string name="shared_string_end">Канец</string>
<string name="shared_string_start">Пачатак</string>
<string name="shared_string_start">Запусціць назіральнік</string>
<string name="shared_string_apply">Ужыць</string>
<string name="set_time_timeline_descr">Абраць час для паказу</string>
<string name="start_end_date">Пачатак - дата завяршэння</string>
<string name="start_end_date">Дата пачатку - дата завяршэння</string>
<string name="saved_messages">Захаваныя паведамленні</string>
<string name="time_zone_descr">Абярыце часавы пояс, каб паказваць ваш час у паведамленнях.</string>
<string name="time_zone">Часавы пояс</string>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="shared_string_suggested">Kinniget</string>
<string name="back_to_osmand">Distreiñ da OsmAnd</string>
<string name="duration_ago">%1$e \'zo</string>
<string name="shared_string_error_short">FAZI</string>
</resources>

View file

@ -18,7 +18,7 @@
<string name="share_location_as">Standort teilen als</string>
<string name="live_now_description">Kontakte und Gruppen, die ihren Standort mit Ihnen teilen.</string>
<string name="logout_from_osmand_telegram">Aus OsmAnd Tracker abmelden\?</string>
<string name="shared_string_name">"Name "</string>
<string name="shared_string_name">Name</string>
<string name="by_distance">Nach Entfernung</string>
<string name="by_name">Nach Namen</string>
<string name="by_group">Nach Gruppe</string>
@ -44,7 +44,7 @@
<string name="send_my_location">Meinen Standort senden</string>
<string name="gps_and_location">Position</string>
<string name="open_osmand">OsmAnd öffnen</string>
<string name="shared_string_live">"Live "</string>
<string name="shared_string_live">Live</string>
<string name="get_telegram_title">Registrierung in Telegram</string>
<string name="get_telegram_account_first">Sie benötigen ein Telegram-Konto, um die Standortfreigabe nutzen zu können.</string>
<string name="get_telegram_description_continue">Bitte installieren Sie Telegram und richten Sie ein Konto ein.</string>
@ -151,9 +151,7 @@
<string name="start_location_sharing">Standort freigeben</string>
<string name="location_service_no_gps_available">Wählen Sie einen der Standortanbieter aus, um Ihren Standort freizugeben.</string>
<string name="sharing_location">Standort teilen</string>
<string name="welcome_descr">
<b>OsmAnd Tracker</b> ermöglicht es Ihnen, Ihren Standort zu teilen und den anderer in OsmAnd zu sehen.<br/>
<br/>Die App verwendet die API von Telegram, also benötigen Sie ein Telegram-Konto.</string>
<string name="welcome_descr"><b>OsmAnd Tracker</b> ermöglicht es Ihnen, Ihren Standort zu teilen und den anderer in OsmAnd zu sehen.<br/> <br/>Die App verwendet die API von Telegram, also benötigen Sie ein Telegram-Konto.</string>
<string name="enter_another_device_name">Wählen Sie einen Namen, den Sie noch nicht benutzt haben</string>
<string name="device_added_successfully">%1$s hinzugefügt.</string>
<string name="shared_string_add">Hinzufügen</string>

View file

@ -77,7 +77,7 @@
<string name="shared_string_back">Atzera</string>
<string name="start_location_sharing">Partekatu kokapena</string>
<string name="show_on_map">Erakutsi mapan</string>
<string name="app_name">OsmAnd Online GPS Tracker</string>
<string name="app_name">OsmAnd lineako GPS aztarnaria</string>
<string name="phone_number_title">Telefono zenbakia</string>
<string name="phone_number_descr">Telefono zenbakia formatu internazionalean</string>
<string name="shared_string_password">Pasahitza</string>
@ -100,7 +100,7 @@
<string name="shared_string_distance">Distantzia</string>
<string name="share_location">Partekatu kokapena</string>
<string name="sharing_location">Partekatzen kokapena</string>
<string name="process_service">OsmAnd Tracker zebitzua</string>
<string name="process_service">OsmAnd aztarnaria zerbitzua</string>
<string name="osmand_logo">OsmAnd logoa</string>
<string name="install_osmand_dialog_message">OsmAnd doako edo ordainpeko bertsioa instalatu behar duzu lehenik</string>
<string name="install_osmand">Instalatu OsmAnd</string>
@ -199,15 +199,15 @@
<string name="buffer_time_descr">Bufferraren puntuak gordetzeko gehieneko denbora</string>
<string name="buffer_time">Bufferraren iraungitze-denbora</string>
<string name="shared_string_suggested">Iradokita</string>
<string name="status_widget_title">OsmAnd Tracker-en egoera</string>
<string name="status_widget_title">OsmAnd aztarnariaren egoera</string>
<string name="back_to_osmand">Atzera OsmAnd-era</string>
<string name="last_response_date">Azken erantzuna: %1$s</string>
<string name="last_update_from_telegram_duration">Telegram-en azken eguneraketa duela %1$s</string>
<string name="last_response_duration">Azken erantzuna duela %1$s</string>
<string name="duration_ago">duela %1$s</string>
<string name="welcome_descr"><b>OsmAnd Tracker</b>-ri esker, kokapena partekatu dezakezu eta besteena OsmAnd-en ikus. <br/> <br/> Aplikazioak Telegram APIa erabiltzen du eta, beraz, Telegram kontua behar duzu.</string>
<string name="welcome_descr"><b>OsmAnd aztarnaria</b>-ri esker, kokapena partekatu dezakezu eta besteena OsmAnd-en ikus. <br/> <br/> Aplikazioak Telegram APIa erabiltzen du eta, beraz, Telegram kontua behar duzu.</string>
<string name="shared_string_authorization_descr">Sartu zure Telegram-eko telefono zenbakia nazioarteko formatuan</string>
<string name="osmand_service_descr">OsmAnd Tracker atzeko planoan exekutatzen da pantaila itzalita dagoenean.</string>
<string name="osmand_service_descr">OsmAnd aztarnaria atzeko planoan exekutatzen da pantaila itzalita dagoenean.</string>
<string name="location_service_no_gps_available">Hautatu kokapen-hornitzaileetako bat zure kokapena partekatzeko.</string>
<string name="no_location_permission">Aplikazioak ez du kokapena atzitzeko baimenik.</string>
<string name="authentication_code_descr">"Telegramek kode bat bidali dizu OsmAnd-ek zure kontuan saioa hasteko."</string>
@ -234,11 +234,11 @@
<string name="stale_location_desc">Kontaktu bat mugitu zen azken aldia.</string>
<string name="location_history_desc">Ezkutatu denbora jakin batean mugitu ez diren kontaktuak</string>
<string name="osmand_connect">OsmAnd konexioa</string>
<string name="osmand_connect_desc">Aukeratu OsmAnd Tracker-ek posizioak bistaratzeko erabiliko duen OsmAnd bertsioa.</string>
<string name="osmand_connect_desc">Aukeratu OsmAnd aztarnariak posizioak bistaratzeko erabiliko duen OsmAnd bertsioa.</string>
<string name="in_time">%1$s-n</string>
<string name="logout_help_desc">Nola itzali OsmAnd Tracker Telegram-etik</string>
<string name="disconnect_from_telegram">Nola itzali OsmAnd Tracker Telegram-etik</string>
<string name="disconnect_from_telegram_desc">Kokapena partekatzeko sarbidea baliogabetzeko. Ireki Telegram, joan Ezarpenak → Pribatutasuna eta segurtasuna → Saioak eta amaitu OsmAnd Tracker saioa atalera.</string>
<string name="logout_help_desc">Nola itzali OsmAnd aztarnaria Telegram-etik</string>
<string name="disconnect_from_telegram">Nola itzali OsmAnd aztarnaria Telegram-etik</string>
<string name="disconnect_from_telegram_desc">Kokapena partekatzeko sarbidea baliogabetzeko. Ireki Telegram, joan Ezarpenak → Pribatutasuna eta segurtasuna → Saioak eta amaitu OsmAnd aztarnariaren saioa atalera.</string>
<string name="logout_no_internet_msg">"Konektatu Internetera Telegram saioa behar bezala amaiatzeko."</string>
<string name="last_response">Azken erantzuna</string>
<string name="disable_all_sharing_desc">Kokapena partekatzea itzaltzen du hautatutako txat guztietan (%1$d).</string>
@ -246,8 +246,8 @@
<string name="by_group">Taldearen arabera</string>
<string name="by_name">Izenaren arabera</string>
<string name="by_distance">Distantziaren arabera</string>
<string name="logout_from_osmand_telegram">Amaitu OsmAnd Tracker saioa\?</string>
<string name="logout_from_osmand_telegram_descr">Ziur zaude OsmAnd Tracker saioa amaitu nahi duzula\? Ezingo duzu kokapena partekatu edo besteen kokapena ikusi</string>
<string name="logout_from_osmand_telegram">Amaitu OsmAnd aztarnariaren saioa\?</string>
<string name="logout_from_osmand_telegram_descr">Ziur zaude OsmAnd aztarnariaren saioa amaitu nahi duzula\? Ezingo duzu kokapena partekatu edo besteen kokapena ikusi</string>
<string name="live_now_description">Zurekin kokapena partekatzen duten kontaktuak eta taldeak.</string>
<string name="location_sharing_status">Partekatzen:% 1 $ s</string>
<string name="sharing_status">Partekatze egoera</string>
@ -255,7 +255,7 @@
<string name="not_found_yet">Oraindik ez da aurkitu</string>
<string name="not_sent_yet">Oraindik ez da bidali</string>
<string name="sharing_in_background">Atzeko planoan partekatzea</string>
<string name="battery_optimization_description">Itzali bateriaren optimizazioa OsmAnd Trackerrentzat, bat-batean itzali ez dadin bigarren planoan dagoela.</string>
<string name="battery_optimization_description">Itzali bateriaren optimizazioa OsmAnd aztarnariarentzat, bat-batean itzali ez dadin bigarren planoan dagoela.</string>
<string name="background_work">Bigarren planoko lana</string>
<string name="background_work_description">Aldatu bateriaren optimizazio ezarpenak kokapena partekatzea egonkortzeko.</string>
<string name="waiting_for_response_from_telegram">Telegram-en erantzunaren zain</string>
@ -265,6 +265,6 @@
<string name="share_location_as_description">Hainbat gailu Telegram kontu bakarrera konektatu nahi badituzu, gailu desberdinak erabili behar dituzu kokapena partekatzeko.</string>
<string name="share_location_as_description_second_line">Telegrama bezeroan gailuaren IDa sortu eta ikusi dezakezu %1$s txat bota erabiliz. % 2 $ s</string>
<string name="privacy_policy_agree">\"Jarraitu\" sakatuz, Telegram eta OsmAnd pribatutasun-politiken baldintzak onartzen dituzu.</string>
<string name="privacy_policy_telegram_client">OsmAnd tracker-ek Telegram plataforma irekia erabiltzen duten bezeroetako bat da. Zure kontaktuek Telegram-eko beste edozein bezero erabil dezakete.</string>
<string name="privacy_policy_telegram_client">OsmAnd aztarnariak Telegram plataforma irekia erabiltzen duten bezeroetako bat da. Zure kontaktuek Telegram-eko beste edozein bezero erabil dezakete.</string>
<string name="last_update_from_telegram_date">Telegram-eko azken eguneratzea: %1$s</string>
</resources>

View file

@ -90,12 +90,12 @@
<string name="initializing">Estase a iniciar</string>
<string name="searching_for_gps">Estase a ubicar…</string>
<string name="connecting_to_the_internet">Estase a conectar á Internet</string>
<string name="battery_optimization_description">Desactiva-la optimización da batería para o OsmAnd Tracker de xeito que non se desconecte de xeito súbito cando esté no segundo plano.</string>
<string name="battery_optimization_description">Desactivar a optimización da batería para o OsmAnd Tracker de xeito que non se desconecte de xeito súbito cando estea no segundo plano.</string>
<string name="logout_no_internet_msg">Conéctate á Internet para pecha-la sesión no Telegram de xeito correcto.</string>
<string name="disconnect_from_telegram_desc">Para revoga-lo acceso á ubicación compartillada. Abre o Telegram, vai cara ós «Axustes → Privacidade e Seguranza → Sesións» e pecha a sesión do OsmAnd Tracker.</string>
<string name="disconnect_from_telegram">De que xeito desactivar o rastrexador do OsmAnd (OsmAnd Tracker) dende o Telegram</string>
<string name="logout_help_desc">De que xeito desactivar o rastrexador do OsmAnd (OsmAnd Tracker) dende o Telegram</string>
<string name="osmand_connect_desc">Escolle a versión do OsmAnd na cal o rastrexador do OsmAnd (OsmAnd Tracker) empregará para amosa-las ubicacións.</string>
<string name="osmand_connect_desc">Escolle a versión do OsmAnd na cal o OsmAnd Tracker empregará para amosar as posicións.</string>
<string name="osmand_connect">Conectar ó OsmAnd</string>
<string name="location_history_desc">Agocha-los contactos que non se moveron nun tempo determinado.</string>
<string name="stale_location_desc">A última vez que un contacto se moveu.</string>
@ -195,7 +195,7 @@
<string name="shared_string_telegram">Telegram</string>
<string name="privacy_policy_use_telegram">O Telegram (a aplicación de mensaxaría) emprégase para conectar e comunicar ás persoas.</string>
<string name="privacy_policy_telegram_client">O rastrexador do OsmAnd (OsmAnd tracker) é un dos clientes que emprega a plataforma aberta do Telegram. Os teus contactos poden empregar calquera outro cliente do Telegram.</string>
<string name="privacy_policy_agree">Ó premer en continuar, aceptas as Políticas de Privacidade do Telegram e do OsmAnd.</string>
<string name="privacy_policy_agree">Ó premer en \"Continuar\", aceptas as condicións do Telegram e as políticas de privacidade do OsmAnd.</string>
<string name="shared_string_accept">Aceptar</string>
<string name="telegram_privacy_policy">Política de privacidade do Telegram</string>
<string name="osmand_privacy_policy">Política de privacidade do OsmAnd</string>
@ -216,4 +216,56 @@
<string name="search_contacts_descr">Procura en tódolos teus grupos e contactos.</string>
<string name="type_contact_or_group_name">Escribe o nome do contacto ou do grupo</string>
<string name="shared_string_search">Procurar</string>
<string name="status_widget_title">Estado do Rastrexador do OsmAnd</string>
<string name="shared_string_suggested">Suxerido</string>
<string name="back_to_osmand">Voltar ó OsmAnd</string>
<string name="duration_ago">hai %1$s</string>
<string name="last_response_duration">Última resposta: hai %1$s</string>
<string name="last_update_from_telegram_duration">Última actualización dende o Telegram: hai %1$s</string>
<string name="last_response_date">Última resposta: %1$s</string>
<string name="last_update_from_telegram_date">Última actualización dende o Telegram: %1$s</string>
<string name="shared_string_error_short">ERR</string>
<string name="bearing">Traxectoria</string>
<string name="altitude">Altitude</string>
<string name="precision">Precisión</string>
<string name="direction">Enderezo</string>
<string name="privacy">Privacidade</string>
<string name="proxy">Proxy</string>
<string name="proxy_settings">Axustes do proxy</string>
<string name="proxy_disconnected">Desconectado</string>
<string name="proxy_connected">Conectado</string>
<string name="proxy_type">Tipo de proxy</string>
<string name="shared_string_enable">Activar</string>
<string name="shared_string_connection">Conexión</string>
<string name="proxy_server">Servidor</string>
<string name="proxy_port">Porto</string>
<string name="proxy_credentials">Credenciais</string>
<string name="proxy_username">Nome de usuario</string>
<string name="proxy_password">Contrasinal</string>
<string name="proxy_key">Chave</string>
<string name="gpx_settings">Axustes de GPX</string>
<string name="min_logging_speed_descr">Filtro: sen rexistro por embaixo da velocidade escollida</string>
<string name="min_logging_speed">Velocidade mínima de rexistro</string>
<string name="min_logging_accuracy_descr">Filtro: sen registro a menos que se acade a precisión</string>
<string name="min_logging_accuracy">Precisión mínima de rexistro</string>
<string name="min_logging_distance_descr">Filtro: distancia mínima para rexistrar un novo punto</string>
<string name="min_logging_distance">Distancia mínima de rexistro</string>
<string name="shared_string_select">Escoller</string>
<string name="timeline_no_data">Sen datos</string>
<string name="timeline_no_data_descr">Non temos datos recollidos para o día escollido</string>
<string name="start_end_date">Data de comezo — Fin</string>
<string name="set_time_timeline_descr">Escoller a hora para a visualización</string>
<string name="shared_string_apply">Aplicar</string>
<string name="shared_string_start">Comezo</string>
<string name="shared_string_end">Fin</string>
<string name="saved_messages">Mensaxes gardadas</string>
<string name="unit_of_speed_system">Unidade de velocidade</string>
<string name="unit_of_speed_system_descr">Definir unidade de velocidade.</string>
<string name="unit_of_length">Unidades de lonxitude</string>
<string name="unit_of_length_descr">Mudar as unidades de lonxitude.</string>
<string name="units_and_formats">Unidades e formatos</string>
<string name="time_zone">Fuso horario</string>
<string name="time_zone_descr">Escolle a zona horaria que desexas amosar nas mensaxes de localización.</string>
<string name="buffer_time">Tempo de caducidade do búfer</string>
<string name="buffer_time_descr">Tempo máximo para almacenar puntos no búfer</string>
</resources>

View file

@ -26,7 +26,7 @@
<string name="searching_for_gps">Posicionando…</string>
<string name="connecting_to_the_internet">Conectando-se à Internet</string>
<string name="background_work_description">Altere as configurações de otimização da bateria para estabilizar o compartilhamento de local.</string>
<string name="background_work">"Funcionamento em segundo plano "</string>
<string name="background_work">Funcionamento em segundo plano</string>
<string name="battery_optimization_description">Desative a otimização da bateria do OsmAnd Tracker para que ele não seja desligado repentinamente quando estiver em segundo plano.</string>
<string name="sharing_in_background">Compartilhando em segundo plano</string>
<string name="go_to_settings">Vá para as configurações</string>
@ -72,7 +72,7 @@
<string name="shared_string_account">Conta</string>
<string name="in_time">no %1$s</string>
<string name="osmand_connect_desc">Escolha a versão OsmAnd que OsmAnd Tracker usa para exibir posições.</string>
<string name="osmand_connect">"Conectar OsmAnd "</string>
<string name="osmand_connect">Conectar OsmAnd</string>
<string name="location_history_desc">Ocultar contatos que não foram movidos em um determinado momento.</string>
<string name="location_history">Histórico de localização</string>
<string name="stale_location_desc">A última vez que um contato foi movido.</string>
@ -173,9 +173,7 @@
<string name="shared_string_hour_short">h</string>
<string name="shared_string_minute_short">min</string>
<string name="shared_string_second_short">seg</string>
<string name="welcome_descr">
<b>OsmAnd Tracker</b> permite que você compartilhe sua localização e veja a dos outros no OsmAnd.<br/>
<br/>O aplicativo usa a API Telegram e você precisa de uma conta Telegram.</string>
<string name="welcome_descr"><b>OsmAnd Tracker</b> permite que você compartilhe sua localização e veja a dos outros no OsmAnd.<br/> <br/>O aplicativo usa a API Telegram e você precisa de uma conta Telegram.</string>
<string name="my_location">Minha localização</string>
<string name="live_now">Ao vivo agora</string>
<string name="monitoring_is_enabled">Monitoramento está ativado</string>
@ -186,13 +184,13 @@
<string name="open_in_osmand">Mostrar no OsmAnd</string>
<string name="end_date">Data final</string>
<string name="start_date">Data de início</string>
<string name="timeline">"Linha do tempo "</string>
<string name="timeline">Linha do tempo</string>
<string name="gps_points_in_buffer">enviado (%1$d em buffer)</string>
<string name="points_size">"%1$d pontos "</string>
<string name="points_size">%1$d pontos</string>
<string name="shared_string_date">Data</string>
<string name="shared_string_collected">Coletado</string>
<string name="gps_points">Pontos de GPS</string>
<string name="shared_string_sent">"Enviar "</string>
<string name="shared_string_sent">Enviar</string>
<string name="please_update_osmand">Por favor, atualize o OsmAnd para ver os dados no mapa</string>
<string name="shared_string_update">Atualizar</string>
<string name="shared_string_telegram">Telegram</string>
@ -201,7 +199,7 @@
<string name="privacy_policy_agree">Ao clicar em \"Continuar\", você concorda com as condições da política de privacidade do Telegram- e OsmAnd.</string>
<string name="shared_string_accept">Aceitar</string>
<string name="telegram_privacy_policy">Política de privacidade do Telegram</string>
<string name="osmand_privacy_policy">"Política de privacidade do OsmAnd "</string>
<string name="osmand_privacy_policy">Política de privacidade do OsmAnd</string>
<string name="how_it_works">Como funciona</string>
<string name="received_gps_points">Pontos GPX recebidos: %1$s</string>
<string name="shared_string_appearance">Aparência</string>

View file

@ -137,7 +137,7 @@
<string name="last_available_location">Последнее местоположение</string>
<string name="sharing_status">Статус отправки</string>
<string name="location_sharing_status">Трансляция: %1$s</string>
<string name="shared_string_enabled">Включён</string>
<string name="shared_string_enabled">Включено</string>
<string name="shared_string_status">Статус</string>
<string name="no_gps_connection">Отсутствует GPS</string>
<string name="no_internet_connection">Отсутствует интернет</string>

View file

@ -53,4 +53,5 @@
<string name="units_and_formats">Мерне јединице &amp; форматирања</string>
<string name="unit_of_length_descr">Промени јединице за дужину.</string>
<string name="unit_of_length">Јединице дужине</string>
<string name="shared_string_appearance">Изглед</string>
</resources>

View file

@ -60,11 +60,11 @@
<string name="start_end_date">Başlangıç — Bitiş tarihi</string>
<string name="timeline_no_data_descr">Seçilen gün için toplanan veri yok</string>
<string name="timeline_no_data">Veri yok</string>
<string name="min_logging_distance">Minimum kayıt mesafesi</string>
<string name="min_logging_distance_descr">Filtre: yeni bir nokta kaydetmek için minimum mesafe</string>
<string name="min_logging_accuracy">Minimum kayıt hassasiyeti</string>
<string name="min_logging_accuracy_descr">Filtre: hassasiyete ulaşılmadığı sürece kaydetme yok</string>
<string name="min_logging_speed">Minimum kayıt hızı</string>
<string name="min_logging_distance">Asgari kayıt mesafesi</string>
<string name="min_logging_distance_descr">Filtre: yeni bir nokta kaydetmek için asgari mesafe</string>
<string name="min_logging_accuracy">Asgari kayıt doğruluğu</string>
<string name="min_logging_accuracy_descr">Filtre: bu doğruluğa ulaşılmadıkça kaydetme yok</string>
<string name="min_logging_speed">Asgari kayıt hızı</string>
<string name="min_logging_speed_descr">Filtre: seçili hızın altında kaydetme yok</string>
<string name="gpx_settings">GPX ayarları</string>
<string name="proxy_key">Anahtar</string>
@ -81,7 +81,7 @@
<string name="proxy">Proxy</string>
<string name="privacy">Gizlilik</string>
<string name="direction">Yön</string>
<string name="precision">Hassaslık</string>
<string name="precision">Hassasiyet</string>
<string name="search_contacts">Kişileri ara</string>
<string name="search_contacts_descr">Tüm gruplarınızda ve kişilerinizde arayın.</string>
<string name="type_contact_or_group_name">Kişi veya grup adı yazın</string>
@ -182,7 +182,7 @@
<string name="location_history">Konum geçmişi</string>
<string name="stale_location_desc">Bir kişinin en son hareket ettiği zaman.</string>
<string name="stale_location">Hareket etmiyor</string>
<string name="send_my_location_desc">Konum paylaşımı için minimum aralığı ayarlayın.</string>
<string name="send_my_location_desc">Konum paylaşımı için en küçük aralığı ayarlayın.</string>
<string name="send_my_location">Konumumu gönder</string>
<string name="gps_and_location">Konum</string>
<string name="sharing_time">Paylaşım zamanı</string>
@ -256,7 +256,7 @@
<string name="unit_of_length">Uzunluk birimleri</string>
<string name="unit_of_speed_system_descr">Hız birimini tanımlayın.</string>
<string name="unit_of_speed_system">Hız birimi</string>
<string name="buffer_time_descr">Noktaların arabellekte saklanacağı maksimum süre</string>
<string name="buffer_time_descr">Noktaların arabellekte saklanacağı azami süre</string>
<string name="buffer_time">Arabellek zaman aşım süresi</string>
<string name="shared_string_suggested">Önerilen</string>
<string name="status_widget_title">OsmAnd Tracker durumu</string>

View file

@ -524,7 +524,7 @@ dependencies {
implementation 'androidx.gridlayout:gridlayout:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.2.0-alpha06'
implementation 'com.google.android.material:material:1.2.0-beta01'
implementation 'androidx.browser:browser:1.0.0'
implementation 'androidx.preference:preference:1.1.0'
implementation fileTree(include: ['gnu-trove-osmand.jar', 'icu4j-49_1_patched.jar'], dir: 'libs')

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="100%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="100%p"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 971 B

After

Width:  |  Height:  |  Size: 745 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 939 B

After

Width:  |  Height:  |  Size: 638 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 1,012 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 724 B

After

Width:  |  Height:  |  Size: 504 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 984 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

After

Width:  |  Height:  |  Size: 479 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 725 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 984 B

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 685 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 529 B

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 891 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 574 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 B

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 955 B

After

Width:  |  Height:  |  Size: 500 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 906 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Some files were not shown because too many files have changed in this diff Show more