import java.util.*;
import static java.
lang.
Math.
*;
public class Main {
public static void main
(String[] args
) { Plotter plotter = new ConsolePlotter(50, 50);
// plotRotations(plotter, ImageFactory.line(50), 100);
plotRotations(plotter, ImageFactory.propeller(50), 30);
plotRotations(new ConsolePlotter(40,40), ImageFactory.fromStrings(
"* ******************",
"* * ",
"* * ",
"* * ",
"* * ",
"* * ",
"* * ",
"* * ",
"* * ",
"* * ",
"* * ",
"* * ",
"* * ",
"* * ",
"* * ",
"* * ",
"* * ",
"***********************************",
" * *",
" * *",
" * *",
" * *",
" * *",
" * *",
" * *",
" * *",
" * *",
" * *",
" * *",
" * *",
" * *",
" * *",
" * *",
" * *",
"****************** *"
), 30);
}
private static void plotRotations
(Plotter plotter,
Image line,
int n
) { line.plot(plotter);
for (int d = 0; d < n; d++) {
line.rotate(2 * PI / n);
line.plot(plotter);
}
}
}
public double x;
public double y;
Point(double x,
double y
) { this.x = x;
this.y = y;
}
public void rotate(double centerX, double centerY, double angle) {
double xx = x - centerX;
double yy = y - centerY;
double radius = sqrt(pow(xx, 2) + pow(yy, 2));
double fi = atan2(yy, xx);
double fia = fi + angle;
double yya = sin(fia) * radius;
double xxa = cos(fia) * radius;
x = centerX + xxa;
y = centerY + yya;
}
}
class ImageFactory {
public static Image line
(int n
) { int n2 = n / 2;
for (int i = -n2; i < n2; i++) {
image.add(i, 0);
}
return image;
}
public static Image propeller
(int n
) { line2.rotate(PI / 2);
line1.append(line2);
return line1;
}
int lenx = lines[0].length();
if (lenx != line.length()) {
}
}
int leny = lines.length;
for (int y = 0; y < leny; y++) {
for (int x = 0; x < line.length(); x++) {
char c = line.charAt(x);
if (c != ' ') {
image.add(x - lenx / 2, y - leny / 2);
}
}
}
return image;
}
}
private List<Point> points = new ArrayList<>();
public void plot(Plotter plotter) {
for (Point point
: points
) { plotter.plot(point);
}
plotter.flush();
}
public void rotate(double angle) {
for (Point point
: points
) { point.rotate(0, 0, angle);
}
}
public void add(double x, double y) {
points.
add(new Point(x, y
)); }
public void append
(Image image
) { for (Point p
: image.
points) { points.add(p);
}
}
}
interface Plotter {
void flush();
}
class ConsolePlotter implements Plotter {
private List<IntPoint> buffer = new ArrayList<>();
private final int width;
private final int height;
public ConsolePlotter(int width, int height) {
this.width = width;
this.height = height;
}
static class PointComparator implements Comparator<IntPoint> {
@Override
public int compare(IntPoint p1, IntPoint p2) {
int yres
= Integer.
compare(p1.
y, p2.
y); return yres
!= 0 ? yres
: Integer.
compare(p1.
x, p2.
x); }
}
static class IntPoint {
int x;
int y;
IntPoint(int x, int y) {
this.x = x;
this.y = y;
}
@Override
return "{" + x + "," + y + "}";
}
}
@Override
public void plot
(Point point
) { buffer.add(new IntPoint((int) point.x, (int) point.y));
}
@Override
public void flush() {
normalize();
out();
buffer.clear();
}
private void out() {
int row = 0, pos = 0;
for (IntPoint p : buffer) {
if (p.y > row) {
for (int i = 0; i < p.y - row; i++) {
}
row = p.y;
pos = 0;
}
if (p.x > pos) {
for (int i = 0; i < p.x - pos; i++) {
}
pos = p.x;
}
pos++;
}
}
private void normalize() {
for (IntPoint p : buffer) {
if (p.x < minx) {
minx = p.x;
}
if (p.y < miny) {
miny = p.y;
}
if (p.x > maxx) {
maxx = p.x;
}
if (p.y > maxy) {
maxy = p.y;
}
}
int deltax = minx > 0 ? 0 : -minx;
int deltay = miny > 0 ? 0 : -miny;
maxx += deltax;
maxy += deltay;
if (maxx < width) {
deltax += (width - maxx) / 2;
}
if (maxy < height) {
deltay += (height - maxy) / 2;
}
for (IntPoint p : buffer) {
p.x += deltax;
p.y += deltay;
}
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgc3RhdGljIGphdmEubGFuZy5NYXRoLio7CgpwdWJsaWMgY2xhc3MgTWFpbiB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgUGxvdHRlciBwbG90dGVyID0gbmV3IENvbnNvbGVQbG90dGVyKDUwLCA1MCk7CgovLyAgICAgICAgcGxvdFJvdGF0aW9ucyhwbG90dGVyLCBJbWFnZUZhY3RvcnkubGluZSg1MCksIDEwMCk7CiAgICAgICAgcGxvdFJvdGF0aW9ucyhwbG90dGVyLCBJbWFnZUZhY3RvcnkucHJvcGVsbGVyKDUwKSwgMzApOwogICAgICAgIHBsb3RSb3RhdGlvbnMobmV3IENvbnNvbGVQbG90dGVyKDQwLDQwKSwgSW1hZ2VGYWN0b3J5LmZyb21TdHJpbmdzKAogICAgICAgICAgICAgICAgIiogICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqIiwKICAgICAgICAgICAgICAgICIqICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICAiKiAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgIiogICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICIqICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICAiKiAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgIiogICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICIqICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICAiKiAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgIiogICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICIqICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICAiKiAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgIiogICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICIqICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICAiKiAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgIiogICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgICIqICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiLAogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAqIiwKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgKiIsCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICoiLAogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAqIiwKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgKiIsCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICoiLAogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAqIiwKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgKiIsCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICoiLAogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAqIiwKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgKiIsCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICoiLAogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAqIiwKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgKiIsCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICoiLAogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAqIiwKICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgKiIKICAgICAgICApLCAzMCk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwbG90Um90YXRpb25zKFBsb3R0ZXIgcGxvdHRlciwgSW1hZ2UgbGluZSwgaW50IG4pIHsKICAgICAgICBsaW5lLnBsb3QocGxvdHRlcik7CgogICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgbjsgZCsrKSB7CiAgICAgICAgICAgIGxpbmUucm90YXRlKDIgKiBQSSAvIG4pOwogICAgICAgICAgICBsaW5lLnBsb3QocGxvdHRlcik7CiAgICAgICAgfQogICAgfQp9CgpjbGFzcyBQb2ludCB7CiAgICBwdWJsaWMgZG91YmxlIHg7CiAgICBwdWJsaWMgZG91YmxlIHk7CgogICAgUG9pbnQoZG91YmxlIHgsIGRvdWJsZSB5KSB7CiAgICAgICAgdGhpcy54ID0geDsKICAgICAgICB0aGlzLnkgPSB5OwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShkb3VibGUgY2VudGVyWCwgZG91YmxlIGNlbnRlclksIGRvdWJsZSBhbmdsZSkgewogICAgICAgIGRvdWJsZSB4eCA9IHggLSBjZW50ZXJYOwogICAgICAgIGRvdWJsZSB5eSA9IHkgLSBjZW50ZXJZOwogICAgICAgIGRvdWJsZSByYWRpdXMgPSBzcXJ0KHBvdyh4eCwgMikgKyBwb3coeXksIDIpKTsKICAgICAgICBkb3VibGUgZmkgPSBhdGFuMih5eSwgeHgpOwogICAgICAgIGRvdWJsZSBmaWEgPSBmaSArIGFuZ2xlOwogICAgICAgIGRvdWJsZSB5eWEgPSBzaW4oZmlhKSAqIHJhZGl1czsKICAgICAgICBkb3VibGUgeHhhID0gY29zKGZpYSkgKiByYWRpdXM7CiAgICAgICAgeCA9IGNlbnRlclggKyB4eGE7CiAgICAgICAgeSA9IGNlbnRlclkgKyB5eWE7CiAgICB9Cn0KCmNsYXNzIEltYWdlRmFjdG9yeSB7CiAgICBwdWJsaWMgc3RhdGljIEltYWdlIGxpbmUoaW50IG4pIHsKICAgICAgICBpbnQgbjIgPSBuIC8gMjsKICAgICAgICBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSgpOwogICAgICAgIGZvciAoaW50IGkgPSAtbjI7IGkgPCBuMjsgaSsrKSB7CiAgICAgICAgICAgIGltYWdlLmFkZChpLCAwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGltYWdlOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgcHJvcGVsbGVyKGludCBuKSB7CiAgICAgICAgSW1hZ2UgbGluZTEgPSBsaW5lKG4pOwogICAgICAgIEltYWdlIGxpbmUyID0gbGluZShuKTsKICAgICAgICBsaW5lMi5yb3RhdGUoUEkgLyAyKTsKICAgICAgICBsaW5lMS5hcHBlbmQobGluZTIpOwogICAgICAgIHJldHVybiBsaW5lMTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIEltYWdlIGZyb21TdHJpbmdzKFN0cmluZy4uLiBsaW5lcykgewogICAgICAgIGludCBsZW54ID0gbGluZXNbMF0ubGVuZ3RoKCk7CiAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7CiAgICAgICAgICAgIGlmIChsZW54ICE9IGxpbmUubGVuZ3RoKCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbnQgbGVueSA9IGxpbmVzLmxlbmd0aDsKCiAgICAgICAgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoKTsKCiAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBsZW55OyB5KyspIHsKICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBsaW5lc1t5XTsKICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBsaW5lLmxlbmd0aCgpOyB4KyspIHsKICAgICAgICAgICAgICAgIGNoYXIgYyA9IGxpbmUuY2hhckF0KHgpOwogICAgICAgICAgICAgICAgaWYgKGMgIT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgICAgaW1hZ2UuYWRkKHggLSBsZW54IC8gMiwgeSAtIGxlbnkgLyAyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaW1hZ2U7CiAgICB9Cn0KCmNsYXNzIEltYWdlIHsKICAgIHByaXZhdGUgTGlzdDxQb2ludD4gcG9pbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CgogICAgcHVibGljIHZvaWQgcGxvdChQbG90dGVyIHBsb3R0ZXIpIHsKICAgICAgICBmb3IgKFBvaW50IHBvaW50IDogcG9pbnRzKSB7CiAgICAgICAgICAgIHBsb3R0ZXIucGxvdChwb2ludCk7CiAgICAgICAgfQoKICAgICAgICBwbG90dGVyLmZsdXNoKCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgcm90YXRlKGRvdWJsZSBhbmdsZSkgewogICAgICAgIGZvciAoUG9pbnQgcG9pbnQgOiBwb2ludHMpIHsKICAgICAgICAgICAgcG9pbnQucm90YXRlKDAsIDAsIGFuZ2xlKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHZvaWQgYWRkKGRvdWJsZSB4LCBkb3VibGUgeSkgewogICAgICAgIHBvaW50cy5hZGQobmV3IFBvaW50KHgsIHkpKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBhcHBlbmQoSW1hZ2UgaW1hZ2UpIHsKICAgICAgICBmb3IgKFBvaW50IHAgOiBpbWFnZS5wb2ludHMpIHsKICAgICAgICAgICAgcG9pbnRzLmFkZChwKTsKICAgICAgICB9CiAgICB9Cn0KCmludGVyZmFjZSBQbG90dGVyIHsKICAgIHZvaWQgcGxvdChQb2ludCBwb2ludCk7CgogICAgdm9pZCBmbHVzaCgpOwp9CgpjbGFzcyBDb25zb2xlUGxvdHRlciBpbXBsZW1lbnRzIFBsb3R0ZXIgewogICAgcHJpdmF0ZSBMaXN0PEludFBvaW50PiBidWZmZXIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgIHByaXZhdGUgZmluYWwgaW50IHdpZHRoOwogICAgcHJpdmF0ZSBmaW5hbCBpbnQgaGVpZ2h0OwoKICAgIHB1YmxpYyBDb25zb2xlUGxvdHRlcihpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CiAgICB9CgogICAgc3RhdGljIGNsYXNzIFBvaW50Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8SW50UG9pbnQ+IHsKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoSW50UG9pbnQgcDEsIEludFBvaW50IHAyKSB7CiAgICAgICAgICAgIGludCB5cmVzID0gSW50ZWdlci5jb21wYXJlKHAxLnksIHAyLnkpOwogICAgICAgICAgICByZXR1cm4geXJlcyAhPSAwID8geXJlcyA6IEludGVnZXIuY29tcGFyZShwMS54LCBwMi54KTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIGNsYXNzIEludFBvaW50IHsKICAgICAgICBpbnQgeDsKICAgICAgICBpbnQgeTsKCiAgICAgICAgSW50UG9pbnQoaW50IHgsIGludCB5KSB7CiAgICAgICAgICAgIHRoaXMueCA9IHg7CiAgICAgICAgICAgIHRoaXMueSA9IHk7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gInsiICsgeCArICIsIiArIHkgKyAifSI7CiAgICAgICAgfQogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIHZvaWQgcGxvdChQb2ludCBwb2ludCkgewogICAgICAgIGJ1ZmZlci5hZGQobmV3IEludFBvaW50KChpbnQpIHBvaW50LngsIChpbnQpIHBvaW50LnkpKTsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgIG5vcm1hbGl6ZSgpOwogICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYnVmZmVyLCBuZXcgUG9pbnRDb21wYXJhdG9yKCkpOwogICAgICAgIG91dCgpOwogICAgICAgIGJ1ZmZlci5jbGVhcigpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBvdXQoKSB7CiAgICAgICAgaW50IHJvdyA9IDAsIHBvcyA9IDA7CiAgICAgICAgZm9yIChJbnRQb2ludCBwIDogYnVmZmVyKSB7CiAgICAgICAgICAgIGlmIChwLnkgPiByb3cpIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcC55IC0gcm93OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCdcbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcm93ID0gcC55OwogICAgICAgICAgICAgICAgcG9zID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHAueCA+IHBvcykgewogICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwLnggLSBwb3M7IGkrKykgewogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoJyAnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBvcyA9IHAueDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgnIycpOwogICAgICAgICAgICBwb3MrKzsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIG5vcm1hbGl6ZSgpIHsKICAgICAgICBpbnQgbWlueCA9IEludGVnZXIuTUFYX1ZBTFVFOwogICAgICAgIGludCBtaW55ID0gSW50ZWdlci5NQVhfVkFMVUU7CiAgICAgICAgaW50IG1heHggPSBJbnRlZ2VyLk1JTl9WQUxVRTsKICAgICAgICBpbnQgbWF4eSA9IEludGVnZXIuTUlOX1ZBTFVFOwogICAgICAgIGZvciAoSW50UG9pbnQgcCA6IGJ1ZmZlcikgewogICAgICAgICAgICBpZiAocC54IDwgbWlueCkgewogICAgICAgICAgICAgICAgbWlueCA9IHAueDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocC55IDwgbWlueSkgewogICAgICAgICAgICAgICAgbWlueSA9IHAueTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocC54ID4gbWF4eCkgewogICAgICAgICAgICAgICAgbWF4eCA9IHAueDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocC55ID4gbWF4eSkgewogICAgICAgICAgICAgICAgbWF4eSA9IHAueTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaW50IGRlbHRheCA9IG1pbnggPiAwID8gMCA6IC1taW54OwogICAgICAgIGludCBkZWx0YXkgPSBtaW55ID4gMCA/IDAgOiAtbWlueTsKCiAgICAgICAgbWF4eCArPSBkZWx0YXg7CiAgICAgICAgbWF4eSArPSBkZWx0YXk7CgogICAgICAgIGlmIChtYXh4IDwgd2lkdGgpIHsKICAgICAgICAgICAgZGVsdGF4ICs9ICh3aWR0aCAtIG1heHgpIC8gMjsKICAgICAgICB9CgogICAgICAgIGlmIChtYXh5IDwgaGVpZ2h0KSB7CiAgICAgICAgICAgIGRlbHRheSArPSAoaGVpZ2h0IC0gbWF4eSkgLyAyOwogICAgICAgIH0KCiAgICAgICAgZm9yIChJbnRQb2ludCBwIDogYnVmZmVyKSB7CiAgICAgICAgICAgIHAueCArPSBkZWx0YXg7CiAgICAgICAgICAgIHAueSArPSBkZWx0YXk7CiAgICAgICAgfQogICAgfQp9