#include <algorithm>
#include <cmath>
#include <iostream>
#include <iomanip>
#include <istream>
#include <iterator>
#include <map>
#include <set>
#include <sstream>
#include <stdexcept>
#include <string>
#include <utility>
#include <vector>
using namespace std;
#define DBG(x) { cout << left << setw(40) << #x << (x) << endl; }
template<int Base, int Exp>
class Power{
public:
static const int value = Power<Base,Exp-1>::value * Base;
};
template<int Base>
class Power<Base,0>{
public:
static const int value = 1;
};
template<template <int,int,int> class Func, template<int> class ArgGetter, int Times>
class Apply{
public:
template<typename T>
static void exec(T& t){
typedef ArgGetter<Times> Arg;
Func<Arg::type::x, Arg::type::y, Arg::type::value>::exec(t);
Apply<Func,ArgGetter,Times-1>::exec(t);
}
template<typename T>
static void exec(T const& t){
typedef ArgGetter<Times> Arg;
Func<Arg::type::x, Arg::type::y, Arg::type::value>::exec(t);
Apply<Func,ArgGetter,Times-1>::exec(t);
}
template<typename T, typename U>
static void exec(T& t, U& u){
typedef ArgGetter<Times> Arg;
Func<Arg::type::x, Arg::type::y, Arg::type::value>::exec(t, u);
Apply<Func,ArgGetter,Times-1>::exec(t, u);
}
template<typename T, typename U>
static void exec(T const& t, U& u){
typedef ArgGetter<Times> Arg;
Func<Arg::type::x, Arg::type::y, Arg::type::value>::exec(t, u);
Apply<Func,ArgGetter,Times-1>::exec(t, u);
}
template<typename T, typename U>
static void exec(T& t, U const& u){
typedef ArgGetter<Times> Arg;
Func<Arg::type::x, Arg::type::y, Arg::type::value>::exec(t, u);
Apply<Func,ArgGetter,Times-1>::exec(t, u);
}
template<typename T, typename U>
static void exec(T const& t, U const& u){
typedef ArgGetter<Times> Arg;
Func<Arg::type::x, Arg::type::y, Arg::type::value>::exec(t, u);
Apply<Func,ArgGetter,Times-1>::exec(t, u);
}
};
template<template <int,int,int> class Func, template<int> class ArgGetter>
class Apply<Func,ArgGetter,0>{
public:
template<typename T>
static void exec(T&){}
template<typename T>
static void exec(T const&){}
template<typename T, typename U>
static void exec(T&, U&){}
template<typename T, typename U>
static void exec(T const&, U&){}
template<typename T, typename U>
static void exec(T&, U const&){}
template<typename T, typename U>
static void exec(T const&, U const&){}
};
template<template<int,int> class Iterator, int Size, int X, int Y, int N>
class IfCellTraversed{
public:
typedef Iterator<Size,N> Current;
static const bool value = (Current::x == X && Current::y == Y) || IfCellTraversed<Iterator,Size,X,Y,N-1>::value;
};
template<template<int,int> class Iterator, int Size, int X, int Y>
class IfCellTraversed<Iterator,Size,X,Y,0>{
public:
typedef Iterator<Size,1> Current;
static const bool value = (Current::x == X && Current::y == Y);
};
template<int Size, int N>
class MagicSquareIterator{
public:
typedef MagicSquareIterator<Size,N-1> Prev;
typedef IfCellTraversed< ::MagicSquareIterator,Size, (Prev::x+1)%Size, (Prev::y-1+Size)%Size, N-1> SkipTest;
static const int x = SkipTest::value ? Prev::x : (Prev::x+1)%Size;
static const int y = SkipTest::value ? (Prev::y + 1)%Size : (Prev::y-1+Size)%Size;
static const int value = Prev::value + 1;
};
template<int Size>
class MagicSquareIterator<Size,1>{
public:
static const int x = Size/2;
static const int y = 0;
static const int value = 1;
};
template<int Size>
class IteratorForSize{
public:
template<int N>
class Template{
public:
typedef MagicSquareIterator<Size,N> type;
};
};
template<int X, int Y, int Value>
class FillSquare{
public:
template<typename T>
static void exec(T& t){
t(X,Y) = Value;
}
};
template<int N>
class Copy{
public:
template<int X, int Y, int>
class Regular{
public:
template<typename T, typename U>
static void exec(T const& from, U& to){
to(X,Y) = from(X,Y);
}
};
template<int X, int Y, int>
class FromRawToSquare{
public:
template<typename T, typename U>
static void exec(T const& from, U& to){
to(X,Y) = from[Y*N + X];
}
};
};
template<int X, int Y, int>
class AddValue{
public:
template<typename T, typename U>
static void exec(T& to, U const& what){
to(X,Y) += what;
}
};
template<int X, int Y, int>
class AddValueFrom{
public:
template<typename T, typename U>
static void exec(T& to, U const& what){
to(X,Y) += what(X,Y);
}
};
template<int N>
class MagicSquare;
template<int N>
istream& operator>> (istream& s, MagicSquare<N> & sq);
template<int N>
class MagicSquare{
public:
template<template <int,int,int> class Func>
class SquareApply{
public:
typedef Apply<Func, IteratorForSize<N>::template Template,Power<N,2>::value> type;
};
MagicSquare(){
SquareApply<FillSquare>::type::exec(*this);
}
MagicSquare(MagicSquare const& o){
SquareApply<Copy<N>::template Regular>::type::exec(o, *this);
}
MagicSquare(istream& s){
s >> *this;
}
MagicSquare(int added){
SquareApply<FillSquare>::type::exec(*this);
SquareApply<AddValue>::type::exec(*this,added);
}
~MagicSquare(){}
MagicSquare& operator=(MagicSquare const& o){
SquareApply<Copy<N>::template Regular>::type::exec(o, *this);
}
MagicSquare operator+(MagicSquare const& o){
MagicSquare sq;
SquareApply<Copy<N>::template Regular>::type::exec(o, sq);
SquareApply<AddValueFrom>::type::exec(sq, *this);
return sq;
}
int operator()(int x, int y) const {
return data[y][x];
}
int& operator()(int x, int y){
return data[y][x];
}
private:
int data[N][N];
int property1, property2, property3;
};
template<int N>
ostream& operator<< (ostream& o, MagicSquare<N> const& sq){
o << "Magic Square " << N << "x" << N << ":" << endl;
for(int y = 0; y < N; y++){
for(int x = 0; x < N; x++){
o << setw(4) << right << sq(x,y);
}
o << endl;
}
return o;
}
template<int N>
istream& operator>> (istream& s, MagicSquare<N> & sq){
std::vector<int> values(Power<N,2>::value);
for(int i = 0; i < Power<N,2>::value; i++){
s >> values[i];
}
MagicSquare<N>::template SquareApply<Copy<N>::template FromRawToSquare>::type::exec(values, sq);
return s;
}
int main()
{
MagicSquare<5> sq;
stringstream str("17 23 4 10 11 24 5 6 12 18 1 7 13 19 25 8 14 20 21 2 15 16 22 3 9");
MagicSquare<5> sq2(str);
DBG(sq);
DBG(sq2);
DBG(sq+sq2);
MagicSquare<1> m1;
MagicSquare<3> m3;
MagicSquare<5> m5;
MagicSquare<7> m7;
MagicSquare<9> m9;
MagicSquare<11> m11;
DBG(m1);
DBG(m3);
DBG(m5);
DBG(m7);
DBG(m9);
DBG(m11);
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8aXN0cmVhbT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBEQkcoeCkgeyBjb3V0IDw8IGxlZnQgPDwgc2V0dyg0MCkgPDwgI3ggPDwgKHgpIDw8IGVuZGw7IH0KCnRlbXBsYXRlPGludCBCYXNlLCBpbnQgRXhwPgpjbGFzcyBQb3dlcnsKcHVibGljOgoJc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IFBvd2VyPEJhc2UsRXhwLTE+Ojp2YWx1ZSAqIEJhc2U7Cn07Cgp0ZW1wbGF0ZTxpbnQgQmFzZT4KY2xhc3MgUG93ZXI8QmFzZSwwPnsKcHVibGljOgoJc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDE7Cn07Cgp0ZW1wbGF0ZTx0ZW1wbGF0ZSA8aW50LGludCxpbnQ+IGNsYXNzIEZ1bmMsIHRlbXBsYXRlPGludD4gY2xhc3MgQXJnR2V0dGVyLCBpbnQgVGltZXM+CmNsYXNzIEFwcGx5ewpwdWJsaWM6Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJc3RhdGljIHZvaWQgZXhlYyhUJiB0KXsKCQl0eXBlZGVmIEFyZ0dldHRlcjxUaW1lcz4gQXJnOwoJCUZ1bmM8QXJnOjp0eXBlOjp4LCBBcmc6OnR5cGU6OnksIEFyZzo6dHlwZTo6dmFsdWU+OjpleGVjKHQpOwoJCUFwcGx5PEZ1bmMsQXJnR2V0dGVyLFRpbWVzLTE+OjpleGVjKHQpOwoJfQoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCXN0YXRpYyB2b2lkIGV4ZWMoVCBjb25zdCYgdCl7CgkJdHlwZWRlZiBBcmdHZXR0ZXI8VGltZXM+IEFyZzsKCQlGdW5jPEFyZzo6dHlwZTo6eCwgQXJnOjp0eXBlOjp5LCBBcmc6OnR5cGU6OnZhbHVlPjo6ZXhlYyh0KTsKCQlBcHBseTxGdW5jLEFyZ0dldHRlcixUaW1lcy0xPjo6ZXhlYyh0KTsKCX0KCXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CglzdGF0aWMgdm9pZCBleGVjKFQmIHQsIFUmIHUpewoJCXR5cGVkZWYgQXJnR2V0dGVyPFRpbWVzPiBBcmc7CgkJRnVuYzxBcmc6OnR5cGU6OngsIEFyZzo6dHlwZTo6eSwgQXJnOjp0eXBlOjp2YWx1ZT46OmV4ZWModCwgdSk7CgkJQXBwbHk8RnVuYyxBcmdHZXR0ZXIsVGltZXMtMT46OmV4ZWModCwgdSk7Cgl9Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoJc3RhdGljIHZvaWQgZXhlYyhUIGNvbnN0JiB0LCBVJiB1KXsKCQl0eXBlZGVmIEFyZ0dldHRlcjxUaW1lcz4gQXJnOwoJCUZ1bmM8QXJnOjp0eXBlOjp4LCBBcmc6OnR5cGU6OnksIEFyZzo6dHlwZTo6dmFsdWU+OjpleGVjKHQsIHUpOwoJCUFwcGx5PEZ1bmMsQXJnR2V0dGVyLFRpbWVzLTE+OjpleGVjKHQsIHUpOwoJfQoJdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KCXN0YXRpYyB2b2lkIGV4ZWMoVCYgdCwgVSBjb25zdCYgdSl7CgkJdHlwZWRlZiBBcmdHZXR0ZXI8VGltZXM+IEFyZzsKCQlGdW5jPEFyZzo6dHlwZTo6eCwgQXJnOjp0eXBlOjp5LCBBcmc6OnR5cGU6OnZhbHVlPjo6ZXhlYyh0LCB1KTsKCQlBcHBseTxGdW5jLEFyZ0dldHRlcixUaW1lcy0xPjo6ZXhlYyh0LCB1KTsKCX0KCXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CglzdGF0aWMgdm9pZCBleGVjKFQgY29uc3QmIHQsIFUgY29uc3QmIHUpewoJCXR5cGVkZWYgQXJnR2V0dGVyPFRpbWVzPiBBcmc7CgkJRnVuYzxBcmc6OnR5cGU6OngsIEFyZzo6dHlwZTo6eSwgQXJnOjp0eXBlOjp2YWx1ZT46OmV4ZWModCwgdSk7CgkJQXBwbHk8RnVuYyxBcmdHZXR0ZXIsVGltZXMtMT46OmV4ZWModCwgdSk7Cgl9Cn07Cgp0ZW1wbGF0ZTx0ZW1wbGF0ZSA8aW50LGludCxpbnQ+IGNsYXNzIEZ1bmMsIHRlbXBsYXRlPGludD4gY2xhc3MgQXJnR2V0dGVyPgpjbGFzcyBBcHBseTxGdW5jLEFyZ0dldHRlciwwPnsKcHVibGljOgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCXN0YXRpYyB2b2lkIGV4ZWMoVCYpe30KCXRlbXBsYXRlPHR5cGVuYW1lIFQ+CglzdGF0aWMgdm9pZCBleGVjKFQgY29uc3QmKXt9Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoJc3RhdGljIHZvaWQgZXhlYyhUJiwgVSYpe30KCXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CglzdGF0aWMgdm9pZCBleGVjKFQgY29uc3QmLCBVJil7fQoJdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KCXN0YXRpYyB2b2lkIGV4ZWMoVCYsIFUgY29uc3QmKXt9Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoJc3RhdGljIHZvaWQgZXhlYyhUIGNvbnN0JiwgVSBjb25zdCYpe30KfTsKCnRlbXBsYXRlPHRlbXBsYXRlPGludCxpbnQ+IGNsYXNzIEl0ZXJhdG9yLCBpbnQgU2l6ZSwgaW50IFgsIGludCBZLCBpbnQgTj4KY2xhc3MgSWZDZWxsVHJhdmVyc2VkewpwdWJsaWM6Cgl0eXBlZGVmIEl0ZXJhdG9yPFNpemUsTj4gQ3VycmVudDsKCXN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gKEN1cnJlbnQ6OnggPT0gWCAmJiBDdXJyZW50Ojp5ID09IFkpIHx8IElmQ2VsbFRyYXZlcnNlZDxJdGVyYXRvcixTaXplLFgsWSxOLTE+Ojp2YWx1ZTsKfTsKCnRlbXBsYXRlPHRlbXBsYXRlPGludCxpbnQ+IGNsYXNzIEl0ZXJhdG9yLCBpbnQgU2l6ZSwgaW50IFgsIGludCBZPgpjbGFzcyBJZkNlbGxUcmF2ZXJzZWQ8SXRlcmF0b3IsU2l6ZSxYLFksMD57CnB1YmxpYzoKCXR5cGVkZWYgSXRlcmF0b3I8U2l6ZSwxPiBDdXJyZW50OwoJc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSAoQ3VycmVudDo6eCA9PSBYICYmIEN1cnJlbnQ6OnkgPT0gWSk7Cn07Cgp0ZW1wbGF0ZTxpbnQgU2l6ZSwgaW50IE4+CmNsYXNzIE1hZ2ljU3F1YXJlSXRlcmF0b3J7CnB1YmxpYzoKCXR5cGVkZWYgTWFnaWNTcXVhcmVJdGVyYXRvcjxTaXplLE4tMT4gUHJldjsKCXR5cGVkZWYgSWZDZWxsVHJhdmVyc2VkPCA6Ok1hZ2ljU3F1YXJlSXRlcmF0b3IsU2l6ZSwgKFByZXY6OngrMSklU2l6ZSwgKFByZXY6OnktMStTaXplKSVTaXplLCBOLTE+IFNraXBUZXN0OwoJc3RhdGljIGNvbnN0IGludCB4ID0gU2tpcFRlc3Q6OnZhbHVlID8gUHJldjo6eCA6IChQcmV2Ojp4KzEpJVNpemU7CglzdGF0aWMgY29uc3QgaW50IHkgPSBTa2lwVGVzdDo6dmFsdWUgPyAoUHJldjo6eSArIDEpJVNpemUgOiAoUHJldjo6eS0xK1NpemUpJVNpemU7CglzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gUHJldjo6dmFsdWUgKyAxOwp9OwoKdGVtcGxhdGU8aW50IFNpemU+CmNsYXNzIE1hZ2ljU3F1YXJlSXRlcmF0b3I8U2l6ZSwxPnsKcHVibGljOgoJc3RhdGljIGNvbnN0IGludCB4ID0gU2l6ZS8yOwoJc3RhdGljIGNvbnN0IGludCB5ID0gMDsKCXN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAxOwp9OwoKdGVtcGxhdGU8aW50IFNpemU+CmNsYXNzIEl0ZXJhdG9yRm9yU2l6ZXsKcHVibGljOgoJdGVtcGxhdGU8aW50IE4+CgljbGFzcyBUZW1wbGF0ZXsKCXB1YmxpYzoKCQl0eXBlZGVmIE1hZ2ljU3F1YXJlSXRlcmF0b3I8U2l6ZSxOPiB0eXBlOwoJfTsKfTsKCnRlbXBsYXRlPGludCBYLCBpbnQgWSwgaW50IFZhbHVlPgpjbGFzcyBGaWxsU3F1YXJlewpwdWJsaWM6Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJc3RhdGljIHZvaWQgZXhlYyhUJiB0KXsKCQl0KFgsWSkgPSBWYWx1ZTsKCX0KfTsKCgoKdGVtcGxhdGU8aW50IE4+CmNsYXNzIENvcHl7CnB1YmxpYzoKCXRlbXBsYXRlPGludCBYLCBpbnQgWSwgaW50PgoJY2xhc3MgUmVndWxhcnsKCXB1YmxpYzoKCQl0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoJCXN0YXRpYyB2b2lkIGV4ZWMoVCBjb25zdCYgZnJvbSwgVSYgdG8pewoJCQl0byhYLFkpID0gZnJvbShYLFkpOwoJCX0KCX07CgoJdGVtcGxhdGU8aW50IFgsIGludCBZLCBpbnQ+CgljbGFzcyBGcm9tUmF3VG9TcXVhcmV7CglwdWJsaWM6CgkJdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KCQlzdGF0aWMgdm9pZCBleGVjKFQgY29uc3QmIGZyb20sIFUmIHRvKXsKCQkJdG8oWCxZKSA9IGZyb21bWSpOICsgWF07CgkJfQoJfTsKfTsKCgoKCgp0ZW1wbGF0ZTxpbnQgWCwgaW50IFksIGludD4KY2xhc3MgQWRkVmFsdWV7CnB1YmxpYzoKCXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CglzdGF0aWMgdm9pZCBleGVjKFQmIHRvLCBVIGNvbnN0JiB3aGF0KXsKCQl0byhYLFkpICs9IHdoYXQ7Cgl9Cn07Cgp0ZW1wbGF0ZTxpbnQgWCwgaW50IFksIGludD4KY2xhc3MgQWRkVmFsdWVGcm9tewpwdWJsaWM6Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoJc3RhdGljIHZvaWQgZXhlYyhUJiB0bywgVSBjb25zdCYgd2hhdCl7CgkJdG8oWCxZKSArPSB3aGF0KFgsWSk7Cgl9Cn07CgoKdGVtcGxhdGU8aW50IE4+CmNsYXNzIE1hZ2ljU3F1YXJlOwoKdGVtcGxhdGU8aW50IE4+CmlzdHJlYW0mIG9wZXJhdG9yPj4gKGlzdHJlYW0mIHMsIE1hZ2ljU3F1YXJlPE4+ICYgc3EpOwoKdGVtcGxhdGU8aW50IE4+CmNsYXNzIE1hZ2ljU3F1YXJlewoKcHVibGljOgoKCXRlbXBsYXRlPHRlbXBsYXRlIDxpbnQsaW50LGludD4gY2xhc3MgRnVuYz4KCWNsYXNzIFNxdWFyZUFwcGx5ewoJcHVibGljOgoJCXR5cGVkZWYgQXBwbHk8RnVuYywgSXRlcmF0b3JGb3JTaXplPE4+Ojp0ZW1wbGF0ZSBUZW1wbGF0ZSxQb3dlcjxOLDI+Ojp2YWx1ZT4gdHlwZTsKCX07CgoJTWFnaWNTcXVhcmUoKXsKCQlTcXVhcmVBcHBseTxGaWxsU3F1YXJlPjo6dHlwZTo6ZXhlYygqdGhpcyk7Cgl9CgoJTWFnaWNTcXVhcmUoTWFnaWNTcXVhcmUgY29uc3QmIG8pewoJCVNxdWFyZUFwcGx5PENvcHk8Tj46OnRlbXBsYXRlIFJlZ3VsYXI+Ojp0eXBlOjpleGVjKG8sICp0aGlzKTsKCX0KCglNYWdpY1NxdWFyZShpc3RyZWFtJiBzKXsKCQlzID4+ICp0aGlzOwoJfQoKCU1hZ2ljU3F1YXJlKGludCBhZGRlZCl7CgkJU3F1YXJlQXBwbHk8RmlsbFNxdWFyZT46OnR5cGU6OmV4ZWMoKnRoaXMpOwoJCVNxdWFyZUFwcGx5PEFkZFZhbHVlPjo6dHlwZTo6ZXhlYygqdGhpcyxhZGRlZCk7CgoJfQoKCX5NYWdpY1NxdWFyZSgpe30KCglNYWdpY1NxdWFyZSYgb3BlcmF0b3I9KE1hZ2ljU3F1YXJlIGNvbnN0JiBvKXsKCQlTcXVhcmVBcHBseTxDb3B5PE4+Ojp0ZW1wbGF0ZSBSZWd1bGFyPjo6dHlwZTo6ZXhlYyhvLCAqdGhpcyk7Cgl9CgoJTWFnaWNTcXVhcmUgb3BlcmF0b3IrKE1hZ2ljU3F1YXJlIGNvbnN0JiBvKXsKCQlNYWdpY1NxdWFyZSBzcTsKCQlTcXVhcmVBcHBseTxDb3B5PE4+Ojp0ZW1wbGF0ZSBSZWd1bGFyPjo6dHlwZTo6ZXhlYyhvLCBzcSk7CgkJU3F1YXJlQXBwbHk8QWRkVmFsdWVGcm9tPjo6dHlwZTo6ZXhlYyhzcSwgKnRoaXMpOwoJCXJldHVybiBzcTsKCX0KCglpbnQgb3BlcmF0b3IoKShpbnQgeCwgaW50IHkpIGNvbnN0IHsKCQlyZXR1cm4gZGF0YVt5XVt4XTsKCX0KCglpbnQmIG9wZXJhdG9yKCkoaW50IHgsIGludCB5KXsKCQlyZXR1cm4gZGF0YVt5XVt4XTsKCX0KCgpwcml2YXRlOgoJaW50IGRhdGFbTl1bTl07CglpbnQgcHJvcGVydHkxLCBwcm9wZXJ0eTIsIHByb3BlcnR5MzsKfTsKCnRlbXBsYXRlPGludCBOPgpvc3RyZWFtJiBvcGVyYXRvcjw8IChvc3RyZWFtJiBvLCBNYWdpY1NxdWFyZTxOPiBjb25zdCYgc3EpewoJbyA8PCAiTWFnaWMgU3F1YXJlICIgPDwgTiA8PCAieCIgPDwgTiA8PCAiOiIgPDwgZW5kbDsKCWZvcihpbnQgeSA9IDA7IHkgPCBOOyB5KyspewoJCWZvcihpbnQgeCA9IDA7IHggPCBOOyB4KyspewoJCQlvIDw8IHNldHcoNCkgPDwgcmlnaHQgPDwgc3EoeCx5KTsKCQl9CgkJbyA8PCBlbmRsOwoJfQoJcmV0dXJuIG87Cn0KCnRlbXBsYXRlPGludCBOPgppc3RyZWFtJiBvcGVyYXRvcj4+IChpc3RyZWFtJiBzLCBNYWdpY1NxdWFyZTxOPiAmIHNxKXsKCXN0ZDo6dmVjdG9yPGludD4gdmFsdWVzKFBvd2VyPE4sMj46OnZhbHVlKTsKCWZvcihpbnQgaSA9IDA7IGkgPCBQb3dlcjxOLDI+Ojp2YWx1ZTsgaSsrKXsKCQlzID4+IHZhbHVlc1tpXTsKCX0KCglNYWdpY1NxdWFyZTxOPjo6dGVtcGxhdGUgU3F1YXJlQXBwbHk8Q29weTxOPjo6dGVtcGxhdGUgRnJvbVJhd1RvU3F1YXJlPjo6dHlwZTo6ZXhlYyh2YWx1ZXMsIHNxKTsKCXJldHVybiBzOwp9CgppbnQgbWFpbigpCnsKCU1hZ2ljU3F1YXJlPDU+IHNxOwoKCXN0cmluZ3N0cmVhbSBzdHIoIjE3IDIzIDQgMTAgMTEgMjQgNSA2IDEyIDE4IDEgNyAxMyAxOSAyNSA4IDE0IDIwIDIxIDIgMTUgMTYgMjIgMyA5Iik7CgoJTWFnaWNTcXVhcmU8NT4gc3EyKHN0cik7CgoJREJHKHNxKTsKCURCRyhzcTIpOwoJREJHKHNxK3NxMik7CgoJTWFnaWNTcXVhcmU8MT4gbTE7CglNYWdpY1NxdWFyZTwzPiBtMzsKCU1hZ2ljU3F1YXJlPDU+IG01OwoJTWFnaWNTcXVhcmU8Nz4gbTc7CglNYWdpY1NxdWFyZTw5PiBtOTsKCU1hZ2ljU3F1YXJlPDExPiBtMTE7CgoJREJHKG0xKTsKCURCRyhtMyk7CglEQkcobTUpOwoJREJHKG03KTsKCURCRyhtOSk7CglEQkcobTExKTsKfQoKCg==