//Coded entirely by Terence Cox
#include <iostream>
#include <string>
#include <cstdlib>
#include <math.h>
#include<iomanip>
using namespace std;
string substitute(double, double, string);
string simplify(bool,char, string);
double** fill2Ddyrow6(int, int, double, double, double, double, double, double**);
double evaluator(string p_equ, bool debug)
{
start1:
int fp = -1, lp = -1;
//Search for Paraenthesis
for (int c = 0; c < p_equ.size(); c++)
{
if (p_equ.at(c) == '(')
fp = c;
if (p_equ.at(c) == ')')
{
lp = c;
break;
}
}
//if parenthesis exist extract the expression within them
if (fp < 0 && lp < 0)
{
if (debug == true)
cout << "no more parentheses" << endl;
}
else
{
//extract from parenthesis and start the evauluation with the rest, then replaces solution in primary equ
string s_equ(p_equ, fp + 1, (lp - 1) - fp);
//solves what's in the parenthesis and eliminates the ()'s
p_equ.replace(fp, (lp + 1) - fp, to_string(evaluator(s_equ,debug)));
goto start1;
}
//perform PEMDAS
p_equ = simplify(debug,'-', simplify(debug,'+', simplify(debug,'*', simplify(debug,'/', simplify(debug,'^', p_equ)))));
//string fsresult(p_equ, fp + 1, lp - fp);
double fresult = stod(p_equ);
return fresult;
}
string simplify(bool debug, char oper, string expr)
{
start2:
int p, fnfp = -1, snlp = -1, reader = 1, runs = 0;
double num1, num2, result;
bool single_neg=false;
p = -1;
for (int c = 0; c < expr.size(); c++)
{
if (expr.at(c) == oper)
{
if (c > 0) //prevents error when a negative number is first in the expression
{
//assigns the position of the operator to p
p = c;
break;
}
}
}
if (p < 0)
{
if (debug == true)
cout << "no " << oper << endl;
}
else
{
runs++;
while (expr.at(p - reader) == '-' || expr.at(p - reader) == '.' || isdigit(expr.at(p - reader)))
{
fnfp = p - reader;
reader++;
if (p - reader < 0) //handles exception where this reads outside of memory
break;
if (expr.at(fnfp) == '-')//hnadles a runtime error which causes negative numbers to be omitted
{
break;
}
}
reader = 1;
while (expr.at(p + reader) == '-' ||expr.at(p + reader) == '.' || isdigit(expr.at(p + reader)))
{
snlp = p + reader;
//This code checks to make sure only one negative symbol is allowed, will break if another is found.
if (expr.at(snlp) == '-')
{
if (single_neg == true)
break;
else
single_neg = true;
}
reader++;
if (p + reader > expr.size() - 1) //handles exception where this reads outside of memory
break;
}
string strnum1(expr, fnfp, p - fnfp);
string strnum2(expr, p + 1, snlp - p);
double num1 = stod(strnum1);
double num2 = stod(strnum2);
switch (oper)
{
case '^':
result = pow(num1, num2);
break;
case '/':
result = num1 / num2;
break;
case '*':
result = num1 * num2;
break;
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
}
//result = (int)(result * 10000.0) / 10000.0;
if (debug == true)
cout << "after performing " << oper << " the result is " << result << endl;
//replace the solve part of the expression into the entire expression
expr.replace(fnfp, (snlp + 1) - fnfp, to_string(result));
goto start2;
}
if (debug == true)
cout << "solved " << runs << " " << oper << " operations" << endl;
return expr;
}
string substitute(double X, double Y, string equ)
{
//checks each character for X or Y to replace them with actual values
for (int c = 0; c < equ.size(); c++)
{
if (equ.at(c) == 'X' || equ.at(c) == 'x')
equ.replace(c, 1, to_string(X));
if (equ.at(c) == 'Y' || equ.at(c) == 'y')
equ.replace(c, 1, to_string(Y));
}
return equ;
}
int main()
{
Begin:
cout.precision(5);
string equation;
int steps;
float X1, X2, Y1, K1, Z1, K2, h, newY;
double change;
bool debug= false,use_table=true,userres;
cout << "What is the differential equation you want to use Euler's method on?\ny'= ";
cin >> equation;
cout << "Fill this in\n (y(x) = ___)\n | \n v \nx= ";
cin >> X1;
cout << "and this\n (y(" << X1 << ") = __)\n |\n v\n y= ";
cin >> Y1;
cout << "How many steps of accuracy do you want to use: ";
cin >> steps;
cout << "What is the value of X you want to use to solve Y" << endl;
cin >> X2;
h = (X2 - X1) / steps;
cout << "The size of h is " << h << "." << endl;
cout << "Last Question, do you want to see the table of values(Takes longer to process) 1 or 0" << endl;
cin >> use_table;
//create a new 2D Dynamic Array
double** table = new double*[steps + 1];
for (int i = 0; i < steps + 1; ++i)
table[i] = new double[6];
//fill in table with obtained information
table = fill2Ddyrow6(0, 0, X1, Y1, 0,0,0, table);
//perform the Euler's process for the inputted amount of steps
for (int t = 0; t < steps; t++)
{
K1 = evaluator(substitute(table[t][1], table[t][2], equation),debug);
table[t][3] = K1;
Z1 = table[t][2] + abs(h)*K1;
table[t][4] = Z1;
K2 = evaluator(substitute(X1 + (h*(t + 1)), Z1, equation),debug);
table[t][5] = K2;
newY = table[t][2]+((K1+K2)/2)*abs(h);
table = fill2Ddyrow6(t + 1, t + 1, X1 + (h*(t + 1)), newY, 0, 0, 0, table);
}
//outputs the values in the table into the console
if (use_table == true|| use_table == 't'|| use_table == 'T' )
{
cout << left << setw(16) << "step i" << setw(16) << "X1" << setw(16) << "Y1" << setw(16) << "K1" << setw(16) << "Z1" << setw(16) << "K2" << endl;
for (int row = 0; row < steps + 1; row++)
{
cout << endl;
for (int column = 0; column < 6; column++)
{
cout << setw(16) << table[row][column];
}
}
}
cout << endl;
cout << "The Final Answer is " << table[steps][2] << endl;
cout << "Done" << endl;
cout << "Do you want to enter another Diffy-Q?, 1(True) or 0(False)" << endl;
cin >> userres;
if (userres == 1)
goto Begin;
system("pause");
}
double** fill2Ddyrow6(int row, int step, double X, double Y, double K1,double Z1,double K2, double** tablef)
{
tablef[row][0] = step;
tablef[row][1] = X;
tablef[row][2] = Y;
tablef[row][3] = K1;
tablef[row][4] = Z1;
tablef[row][5] = K2;
return tablef;
}
Ly9Db2RlZCBlbnRpcmVseSBieSBUZXJlbmNlIENveAojaW5jbHVkZSA8aW9zdHJlYW0+IAojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y3N0ZGxpYj4gCiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlPGlvbWFuaXA+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RyaW5nIHN1YnN0aXR1dGUoZG91YmxlLCBkb3VibGUsIHN0cmluZyk7CnN0cmluZyBzaW1wbGlmeShib29sLGNoYXIsIHN0cmluZyk7CmRvdWJsZSoqIGZpbGwyRGR5cm93NihpbnQsIGludCwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSoqKTsKCmRvdWJsZSBldmFsdWF0b3Ioc3RyaW5nIHBfZXF1LCBib29sIGRlYnVnKQp7CnN0YXJ0MToKCWludCBmcCA9IC0xLCBscCA9IC0xOwoJLy9TZWFyY2ggZm9yIFBhcmFlbnRoZXNpcwoJZm9yIChpbnQgYyA9IDA7IGMgPCBwX2VxdS5zaXplKCk7IGMrKykKCXsKCQlpZiAocF9lcXUuYXQoYykgPT0gJygnKQoJCQlmcCA9IGM7CgkJaWYgKHBfZXF1LmF0KGMpID09ICcpJykKCQl7CgkJCWxwID0gYzsKCQkJYnJlYWs7CgkJfQoJfQoJLy9pZiBwYXJlbnRoZXNpcyBleGlzdCBleHRyYWN0IHRoZSBleHByZXNzaW9uIHdpdGhpbiB0aGVtCglpZiAoZnAgPCAwICYmIGxwIDwgMCkgCgkJewoJCWlmIChkZWJ1ZyA9PSB0cnVlKQoJCQljb3V0IDw8ICJubyBtb3JlIHBhcmVudGhlc2VzIiA8PCBlbmRsOwoJCX0KCWVsc2UKCXsKCQkvL2V4dHJhY3QgZnJvbSBwYXJlbnRoZXNpcyBhbmQgc3RhcnQgdGhlIGV2YXVsdWF0aW9uIHdpdGggdGhlIHJlc3QsIHRoZW4gcmVwbGFjZXMgc29sdXRpb24gaW4gcHJpbWFyeSBlcXUKCQlzdHJpbmcgc19lcXUocF9lcXUsIGZwICsgMSwgKGxwIC0gMSkgLSBmcCk7CgkJLy9zb2x2ZXMgd2hhdCdzIGluIHRoZSBwYXJlbnRoZXNpcyBhbmQgZWxpbWluYXRlcyB0aGUgKCkncwoJCXBfZXF1LnJlcGxhY2UoZnAsIChscCArIDEpIC0gZnAsIHRvX3N0cmluZyhldmFsdWF0b3Ioc19lcXUsZGVidWcpKSk7CgkJZ290byBzdGFydDE7Cgl9CgkvL3BlcmZvcm0gUEVNREFTCglwX2VxdSA9IHNpbXBsaWZ5KGRlYnVnLCctJywgc2ltcGxpZnkoZGVidWcsJysnLCBzaW1wbGlmeShkZWJ1ZywnKicsIHNpbXBsaWZ5KGRlYnVnLCcvJywgc2ltcGxpZnkoZGVidWcsJ14nLCBwX2VxdSkpKSkpOwoKCS8vc3RyaW5nIGZzcmVzdWx0KHBfZXF1LCBmcCArIDEsIGxwIC0gZnApOwoJZG91YmxlIGZyZXN1bHQgPSBzdG9kKHBfZXF1KTsKCXJldHVybiBmcmVzdWx0Owp9CgoKc3RyaW5nIHNpbXBsaWZ5KGJvb2wgZGVidWcsIGNoYXIgb3Blciwgc3RyaW5nIGV4cHIpCgl7CglzdGFydDI6CglpbnQgcCwgZm5mcCA9IC0xLCBzbmxwID0gLTEsIHJlYWRlciA9IDEsIHJ1bnMgPSAwOwoJZG91YmxlIG51bTEsIG51bTIsIHJlc3VsdDsKCWJvb2wgc2luZ2xlX25lZz1mYWxzZTsKCglwID0gLTE7Cglmb3IgKGludCBjID0gMDsgYyA8IGV4cHIuc2l6ZSgpOyBjKyspCgl7CgkJaWYgKGV4cHIuYXQoYykgPT0gb3BlcikKCQl7CgkJCWlmIChjID4gMCkgLy9wcmV2ZW50cyBlcnJvciB3aGVuIGEgbmVnYXRpdmUgbnVtYmVyIGlzIGZpcnN0IGluIHRoZSBleHByZXNzaW9uCgkJCXsKCQkJCS8vYXNzaWducyB0aGUgcG9zaXRpb24gb2YgdGhlIG9wZXJhdG9yIHRvIHAKCQkJCXAgPSBjOwoJCQkJYnJlYWs7CgkJCX0KCgkJfQoJfQoJaWYgKHAgPCAwKQoJCXsKCQlpZiAoZGVidWcgPT0gdHJ1ZSkKCQkJY291dCA8PCAibm8gIiA8PCBvcGVyIDw8IGVuZGw7CgkJfQoJZWxzZQoJewoJCXJ1bnMrKzsKCQl3aGlsZSAoZXhwci5hdChwIC0gcmVhZGVyKSA9PSAnLScgfHwgZXhwci5hdChwIC0gcmVhZGVyKSA9PSAnLicgfHwgaXNkaWdpdChleHByLmF0KHAgLSByZWFkZXIpKSkKCQl7CgkJCWZuZnAgPSBwIC0gcmVhZGVyOwoJCQlyZWFkZXIrKzsKCQkJaWYgKHAgLSByZWFkZXIgPCAwKSAvL2hhbmRsZXMgZXhjZXB0aW9uIHdoZXJlIHRoaXMgcmVhZHMgb3V0c2lkZSBvZiBtZW1vcnkKCQkJCWJyZWFrOwoJCQlpZiAoZXhwci5hdChmbmZwKSA9PSAnLScpLy9obmFkbGVzIGEgcnVudGltZSBlcnJvciB3aGljaCBjYXVzZXMgbmVnYXRpdmUgbnVtYmVycyB0byBiZSBvbWl0dGVkCgkJCXsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXJlYWRlciA9IDE7CgkJd2hpbGUgKGV4cHIuYXQocCArIHJlYWRlcikgPT0gJy0nIHx8ZXhwci5hdChwICsgcmVhZGVyKSA9PSAnLicgfHwgaXNkaWdpdChleHByLmF0KHAgKyByZWFkZXIpKSkKCQl7CgkJCXNubHAgPSBwICsgcmVhZGVyOwoJCQkvL1RoaXMgY29kZSBjaGVja3MgdG8gbWFrZSBzdXJlIG9ubHkgb25lIG5lZ2F0aXZlIHN5bWJvbCBpcyBhbGxvd2VkLCB3aWxsIGJyZWFrIGlmIGFub3RoZXIgaXMgZm91bmQuCgkJCWlmIChleHByLmF0KHNubHApID09ICctJykKCQkJewoJCQkJaWYgKHNpbmdsZV9uZWcgPT0gdHJ1ZSkKCQkJCQlicmVhazsKCQkJCWVsc2UKCQkJCQlzaW5nbGVfbmVnID0gdHJ1ZTsKCQkJfQoJCQlyZWFkZXIrKzsKCQkJaWYgKHAgKyByZWFkZXIgPiBleHByLnNpemUoKSAtIDEpIC8vaGFuZGxlcyBleGNlcHRpb24gd2hlcmUgdGhpcyByZWFkcyBvdXRzaWRlIG9mIG1lbW9yeQoJCQkJYnJlYWs7CgkJfQoJCXN0cmluZyBzdHJudW0xKGV4cHIsIGZuZnAsIHAgLSBmbmZwKTsKCQlzdHJpbmcgc3RybnVtMihleHByLCBwICsgMSwgc25scCAtIHApOwoJCWRvdWJsZSBudW0xID0gc3RvZChzdHJudW0xKTsKCQlkb3VibGUgbnVtMiA9IHN0b2Qoc3RybnVtMik7CgoKCQlzd2l0Y2ggKG9wZXIpCgkJewoJCWNhc2UgJ14nOgoJCQlyZXN1bHQgPSBwb3cobnVtMSwgbnVtMik7CgkJCWJyZWFrOwoJCWNhc2UgJy8nOgoJCQlyZXN1bHQgPSBudW0xIC8gbnVtMjsKCQkJYnJlYWs7CgkJY2FzZSAnKic6CgkJCXJlc3VsdCA9IG51bTEgKiBudW0yOwoJCQlicmVhazsKCQljYXNlICcrJzoKCQkJcmVzdWx0ID0gbnVtMSArIG51bTI7CgkJCWJyZWFrOwoJCWNhc2UgJy0nOgoJCQlyZXN1bHQgPSBudW0xIC0gbnVtMjsKCQkJYnJlYWs7CgkJfQoJCS8vcmVzdWx0ID0gKGludCkocmVzdWx0ICogMTAwMDAuMCkgLyAxMDAwMC4wOwoJCWlmIChkZWJ1ZyA9PSB0cnVlKQoJCQljb3V0IDw8ICJhZnRlciBwZXJmb3JtaW5nICIgPDwgb3BlciA8PCAiIHRoZSByZXN1bHQgaXMgIiA8PCByZXN1bHQgPDwgZW5kbDsKCQkvL3JlcGxhY2UgdGhlIHNvbHZlIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24gaW50byB0aGUgZW50aXJlIGV4cHJlc3Npb24KCQlleHByLnJlcGxhY2UoZm5mcCwgKHNubHAgKyAxKSAtIGZuZnAsIHRvX3N0cmluZyhyZXN1bHQpKTsKCQlnb3RvIHN0YXJ0MjsKCX0KCWlmIChkZWJ1ZyA9PSB0cnVlKQoJCWNvdXQgPDwgInNvbHZlZCAiIDw8IHJ1bnMgPDwgIiAiIDw8IG9wZXIgPDwgIiBvcGVyYXRpb25zIiA8PCBlbmRsOwoJcmV0dXJuIGV4cHI7Cn0KCnN0cmluZyBzdWJzdGl0dXRlKGRvdWJsZSBYLCBkb3VibGUgWSwgc3RyaW5nIGVxdSkKewoJLy9jaGVja3MgZWFjaCBjaGFyYWN0ZXIgZm9yIFggb3IgWSB0byByZXBsYWNlIHRoZW0gd2l0aCBhY3R1YWwgdmFsdWVzCglmb3IgKGludCBjID0gMDsgYyA8IGVxdS5zaXplKCk7IGMrKykKCXsKCQlpZiAoZXF1LmF0KGMpID09ICdYJyB8fCBlcXUuYXQoYykgPT0gJ3gnKQoJCQllcXUucmVwbGFjZShjLCAxLCB0b19zdHJpbmcoWCkpOwoJCWlmIChlcXUuYXQoYykgPT0gJ1knIHx8IGVxdS5hdChjKSA9PSAneScpCgkJCWVxdS5yZXBsYWNlKGMsIDEsIHRvX3N0cmluZyhZKSk7Cgl9CglyZXR1cm4gZXF1Owp9CgoKCmludCBtYWluKCkKewpCZWdpbjoKCWNvdXQucHJlY2lzaW9uKDUpOwoJc3RyaW5nIGVxdWF0aW9uOwoJaW50IHN0ZXBzOwoJZmxvYXQgWDEsIFgyLCBZMSwgSzEsIFoxLCBLMiwgaCwgbmV3WTsKCWRvdWJsZSBjaGFuZ2U7Cglib29sIGRlYnVnPSBmYWxzZSx1c2VfdGFibGU9dHJ1ZSx1c2VycmVzOwoJY291dCA8PCAiV2hhdCBpcyB0aGUgZGlmZmVyZW50aWFsIGVxdWF0aW9uIHlvdSB3YW50IHRvIHVzZSBFdWxlcidzIG1ldGhvZCBvbj9cbnknPSAiOwoJY2luID4+IGVxdWF0aW9uOwoJY291dCA8PCAiRmlsbCB0aGlzIGluXG4gKHkoeCkgPSBfX18pXG4gICAgfCAgICAgXG4gICAgdiAgICAgXG54PSAiOwoJY2luID4+IFgxOwoJY291dCA8PCAiYW5kIHRoaXNcbiAoeSgiIDw8IFgxIDw8ICIpID0gX18pXG4gICAgICAgICAgIHxcbiAgICAgICAgICAgdlxuICAgICAgICB5PSAiOwoJY2luID4+IFkxOwoJY291dCA8PCAiSG93IG1hbnkgc3RlcHMgb2YgYWNjdXJhY3kgZG8geW91IHdhbnQgdG8gdXNlOiAiOwoJY2luID4+IHN0ZXBzOwoJY291dCA8PCAiV2hhdCBpcyB0aGUgdmFsdWUgb2YgWCB5b3Ugd2FudCB0byB1c2UgdG8gc29sdmUgWSIgPDwgZW5kbDsKCWNpbiA+PiBYMjsKCWggPSAoWDIgLSBYMSkgLyBzdGVwczsKCWNvdXQgPDwgIlRoZSBzaXplIG9mIGggaXMgIiA8PCBoIDw8ICIuIiA8PCBlbmRsOwoJY291dCA8PCAiTGFzdCBRdWVzdGlvbiwgZG8geW91IHdhbnQgdG8gc2VlIHRoZSB0YWJsZSBvZiB2YWx1ZXMoVGFrZXMgbG9uZ2VyIHRvIHByb2Nlc3MpIDEgb3IgMCIgPDwgZW5kbDsKCWNpbiA+PiB1c2VfdGFibGU7CgkvL2NyZWF0ZSBhIG5ldyAyRCBEeW5hbWljIEFycmF5Cglkb3VibGUqKiB0YWJsZSA9IG5ldyBkb3VibGUqW3N0ZXBzICsgMV07Cglmb3IgKGludCBpID0gMDsgaSA8IHN0ZXBzICsgMTsgKytpKQoJCXRhYmxlW2ldID0gbmV3IGRvdWJsZVs2XTsKCgkvL2ZpbGwgaW4gdGFibGUgd2l0aCBvYnRhaW5lZCBpbmZvcm1hdGlvbgoJdGFibGUgPSBmaWxsMkRkeXJvdzYoMCwgMCwgWDEsIFkxLCAwLDAsMCwgdGFibGUpOwoKCS8vcGVyZm9ybSB0aGUgRXVsZXIncyBwcm9jZXNzIGZvciB0aGUgaW5wdXR0ZWQgYW1vdW50IG9mIHN0ZXBzCglmb3IgKGludCB0ID0gMDsgdCA8IHN0ZXBzOyB0KyspCgl7CgkJSzEgPSBldmFsdWF0b3Ioc3Vic3RpdHV0ZSh0YWJsZVt0XVsxXSwgdGFibGVbdF1bMl0sIGVxdWF0aW9uKSxkZWJ1Zyk7CgkJdGFibGVbdF1bM10gPSBLMTsKCQlaMSA9IHRhYmxlW3RdWzJdICsgYWJzKGgpKksxOwoJCXRhYmxlW3RdWzRdID0gWjE7CgkJSzIgPSBldmFsdWF0b3Ioc3Vic3RpdHV0ZShYMSArIChoKih0ICsgMSkpLCBaMSwgZXF1YXRpb24pLGRlYnVnKTsKCQl0YWJsZVt0XVs1XSA9IEsyOwoJCW5ld1kgPSB0YWJsZVt0XVsyXSsoKEsxK0syKS8yKSphYnMoaCk7CgoJCXRhYmxlID0gZmlsbDJEZHlyb3c2KHQgKyAxLCB0ICsgMSwgWDEgKyAoaCoodCArIDEpKSwgbmV3WSwgMCwgMCwgMCwgdGFibGUpOwoJfQoKCS8vb3V0cHV0cyB0aGUgdmFsdWVzIGluIHRoZSB0YWJsZSBpbnRvIHRoZSBjb25zb2xlCglpZiAodXNlX3RhYmxlID09IHRydWV8fCB1c2VfdGFibGUgPT0gJ3QnfHwgdXNlX3RhYmxlID09ICdUJyApCgkJewoJCWNvdXQgPDwgbGVmdCA8PCBzZXR3KDE2KSA8PCAic3RlcCBpIiA8PCBzZXR3KDE2KSA8PCAiWDEiIDw8IHNldHcoMTYpIDw8ICJZMSIgPDwgc2V0dygxNikgPDwgIksxIiA8PCBzZXR3KDE2KSA8PCAiWjEiIDw8IHNldHcoMTYpIDw8ICJLMiIgPDwgZW5kbDsKCQlmb3IgKGludCByb3cgPSAwOyByb3cgPCBzdGVwcyArIDE7IHJvdysrKQoJCQl7CgkJCWNvdXQgPDwgZW5kbDsKCQkJZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgNjsgY29sdW1uKyspCgkJCQl7CgkJCQljb3V0IDw8IHNldHcoMTYpIDw8IHRhYmxlW3Jvd11bY29sdW1uXTsKCQkJCX0KCQkJfQoJCX0KCWNvdXQgPDwgZW5kbDsKCWNvdXQgPDwgIlRoZSBGaW5hbCBBbnN3ZXIgaXMgIiA8PCB0YWJsZVtzdGVwc11bMl0gPDwgZW5kbDsKCWNvdXQgPDwgIkRvbmUiIDw8IGVuZGw7Cgljb3V0IDw8ICJEbyB5b3Ugd2FudCB0byBlbnRlciBhbm90aGVyIERpZmZ5LVE/LCAxKFRydWUpIG9yIDAoRmFsc2UpIiA8PCBlbmRsOwoJY2luID4+IHVzZXJyZXM7CglpZiAodXNlcnJlcyA9PSAxKQoJCWdvdG8gQmVnaW47CglzeXN0ZW0oInBhdXNlIik7Cn0KCmRvdWJsZSoqIGZpbGwyRGR5cm93NihpbnQgcm93LCBpbnQgc3RlcCwgZG91YmxlIFgsIGRvdWJsZSBZLCBkb3VibGUgIEsxLGRvdWJsZSBaMSxkb3VibGUgSzIsIGRvdWJsZSoqIHRhYmxlZikKewoJdGFibGVmW3Jvd11bMF0gPSBzdGVwOwoJdGFibGVmW3Jvd11bMV0gPSBYOwoJdGFibGVmW3Jvd11bMl0gPSBZOwoJdGFibGVmW3Jvd11bM10gPSBLMTsKCXRhYmxlZltyb3ddWzRdID0gWjE7Cgl0YWJsZWZbcm93XVs1XSA9IEsyOwoJcmV0dXJuIHRhYmxlZjsKfQoKCg==