#include <iostream>
#include <map>
#include <list>
#include <string>
#include <vector>
using namespace std;
struct OrderNode
{
int order_id;
char type; // B: 买,S:卖
int num; //股票数量
int price; //价格
OrderNode(int order_id, char type, int num, int price) : order_id(order_id), type(type), num(num), price(price) {}
};
using OrderList = list<OrderNode>;
using PriceMap = map<int, OrderList>;
using OrderMap = map<int, OrderNode>;
struct Context
{
PriceMap buy_map;
PriceMap sell_map;
OrderMap order_map;
void print() const
{
cout << "buy list:" << endl;
for (auto it : buy_map)
{
cout << it.first << ": ";
for (auto i : it.second)
{
cout << i.num << ", ";
}
cout << endl;
}
cout << "sell list:" << endl;
for (auto it : sell_map)
{
cout << it.first << ": ";
for (auto i : it.second)
{
cout << i.num << ", ";
}
cout << endl;
}
}
};
class ExeOrder
{
public:
// ExeOrder() {};
virtual bool Exe(int order_id, char type, int num, int price) = 0;
};
class AddOrder : public ExeOrder
{
public:
AddOrder(Context *ctx) : ctx_(ctx) {}
bool Exe(int order_id, char type, int num, int price)
{
PriceMap *price_map;
if (deal(type, num, price))
{
cout << "deal done :"
<< "A," << order_id << "," << type << "," << num << "," << price << endl;
cout <<"1050 ::"<< &ctx_->sell_map[1050].front().num<<endl;
return true;
}
if (type == 'B')
{
price_map = &ctx_->buy_map;
}
else
{
price_map = &ctx_->sell_map;
}
OrderNode item(order_id, type, num, price);
if (price_map->find(price) == price_map->end())
{
price_map->insert(make_pair(price, OrderList()));
}
price_map->at(price).push_back(item);
ctx_->order_map.insert(make_pair(order_id, item));
return true;
}
bool deal(char type, int &num, int price)
{
PriceMap *price_map;
if (type == 'B')
{
price_map = &ctx_->sell_map;
}
else
{
price_map = &ctx_->buy_map;
}
if (price_map->find(price) == price_map->end())
{
return false;
}
OrderList* order_list = &price_map->at(price);
for (auto it : *order_list)
{
if (it.num > num)
{
it.num = it.num - num;
cout << "deal done :"
<< "aaa," << it.order_id << "," << type << "," << num << "," << price << endl;
num = 0;
break;
}
if (it.num == num)
{
cout << "deal done :"
<< "bbb," << it.order_id << "," << type << "," << num << "," << price << endl;
ctx_->order_map.erase(it.order_id);
order_list->pop_front();
if (order_list->size() == 0)
{
price_map->erase(price);
}
num = 0;
break;
}
num -= it.num;
ctx_->order_map.erase(it.order_id);
order_list->pop_front();
}
if (num)
{
return false;
}
cout <<"testbbb"<<order_list->size()<<endl;
return true;
}
Context *ctx_;
};
class DelOrder : public ExeOrder
{
public:
DelOrder(Context *ctx) : ctx_(ctx) {}
bool Exe(int order_id, char type, int num, int price)
{
PriceMap *price_map;
if (type == 'B')
{
price_map = &ctx_->buy_map;
}
else
{
price_map = &ctx_->sell_map;
}
if (ctx_->order_map.find(order_id) == ctx_->order_map.end())
{
cout << "delete cmd ("
<< "X," << order_id << "," << type << "," << num << "," << price << ") failed" << endl;
return false;
}
auto it = ctx_->order_map.at(order_id);
if (it.num == num && it.price == price && it.type == type)
{
price_map->at(price).remove_if([num, price, type](OrderNode it){
if (it.num == num && it.price == price && it.type == type)
{
return true;
}
return false;
});
ctx_->order_map.erase(order_id);
cout << "delete cmd ("
<< "X," << order_id << "," << type << "," << num << "," << price << ") success" << endl;
return true;
}
cout << "delete cmd ("
<< "X," << order_id << "," << type << "," << num << "," << price << ") failed" << endl;
return false;
}
Context *ctx_;
};
using ExeMap = std::map<char, ExeOrder *>;
void registerCommand(ExeMap& m_exe_map_, Context* m_ctx_)
{
m_exe_map_.insert(make_pair('A', new AddOrder(m_ctx_)));
m_exe_map_.insert(make_pair('X', new DelOrder(m_ctx_)));
}
class ExeManage
{
public:
ExeManage()
{
registerCommand(m_exe_map_, &m_ctx_);
}
~ExeManage()
{
for (auto it : m_exe_map_)
{
delete it.second;
}
m_exe_map_.clear();
}
void do_it(const string &cmd)
{
char cmd_type = '\0';
int order_id = 0;
char type = '\0';
int num = 0;
int price = 0;
sscanf(cmd.c_str(), "%c,%d,%c,%d,%d", &cmd_type, &order_id, &type, &num, &price);
printf("%c,%d,%c,%d,%d\n", cmd_type, order_id, type, num, price);
if (m_exe_map_.find(cmd_type) == m_exe_map_.end())
{
cout << "command error11, " << cmd << endl;
return;
}
m_exe_map_[cmd_type]->Exe(order_id, type, num, price);
cout<<"test"<<m_ctx_.sell_map.size()<<endl;
}
void print()
{
m_ctx_.print();
}
private:
Context m_ctx_;
ExeMap m_exe_map_;
};
int main()
{
string s[] = {"A,100000,S,1,1075","A,100001,B,9,1000","A,100002,B,30,975","A,100003,S,10,1050","A,100004,B,10,950","A,100005,S,2,1025",
"A,100006,B,1,1000","X,100004,B,10,950","A,100007,S,5,1025","A,100008,B,3,1050","X,100008,B,3,1050","X,100005,S,2,1025"};
vector<string> input(s, s + 12);
ExeManage exe;
for (auto it : input)
{
exe.do_it(it);
}
exe.print();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKc3RydWN0IE9yZGVyTm9kZQp7CiAgICBpbnQgb3JkZXJfaWQ7CiAgICBjaGFyIHR5cGU7IC8vIEI6IOS5sO+8jFM65Y2WCiAgICBpbnQgbnVtOyAgIC8v6IKh56Wo5pWw6YePCiAgICBpbnQgcHJpY2U7IC8v5Lu35qC8CiAgICBPcmRlck5vZGUoaW50IG9yZGVyX2lkLCBjaGFyIHR5cGUsIGludCBudW0sIGludCBwcmljZSkgOiBvcmRlcl9pZChvcmRlcl9pZCksIHR5cGUodHlwZSksIG51bShudW0pLCBwcmljZShwcmljZSkge30KfTsKdXNpbmcgT3JkZXJMaXN0ID0gbGlzdDxPcmRlck5vZGU+Owp1c2luZyBQcmljZU1hcCA9IG1hcDxpbnQsIE9yZGVyTGlzdD47CnVzaW5nIE9yZGVyTWFwID0gbWFwPGludCwgT3JkZXJOb2RlPjsKCnN0cnVjdCBDb250ZXh0CnsKICAgIFByaWNlTWFwIGJ1eV9tYXA7CiAgICBQcmljZU1hcCBzZWxsX21hcDsKICAgIE9yZGVyTWFwIG9yZGVyX21hcDsKICAgIHZvaWQgcHJpbnQoKSBjb25zdAogICAgewogICAgICAgIGNvdXQgPDwgImJ1eSBsaXN0OiIgPDwgZW5kbDsKICAgICAgICBmb3IgKGF1dG8gaXQgOiBidXlfbWFwKQogICAgICAgIHsKICAgICAgICAgICAgY291dCA8PCBpdC5maXJzdCA8PCAiOiAiOwogICAgICAgICAgICBmb3IgKGF1dG8gaSA6IGl0LnNlY29uZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY291dCA8PCBpLm51bSA8PCAiLCAiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvdXQgPDwgZW5kbDsKICAgICAgICB9CiAgICAgICAgY291dCA8PCAic2VsbCBsaXN0OiIgPDwgZW5kbDsKICAgICAgICBmb3IgKGF1dG8gaXQgOiBzZWxsX21hcCkKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgaXQuZmlyc3QgPDwgIjogIjsKICAgICAgICAgICAgZm9yIChhdXRvIGkgOiBpdC5zZWNvbmQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvdXQgPDwgaS5udW0gPDwgIiwgIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3V0IDw8IGVuZGw7CiAgICAgICAgfQogICAgfQp9OwoKY2xhc3MgRXhlT3JkZXIKewpwdWJsaWM6CiAgICAvLyBFeGVPcmRlcigpIHt9OwogICAgdmlydHVhbCBib29sIEV4ZShpbnQgb3JkZXJfaWQsIGNoYXIgdHlwZSwgaW50IG51bSwgaW50IHByaWNlKSA9IDA7Cn07CgpjbGFzcyBBZGRPcmRlciA6IHB1YmxpYyBFeGVPcmRlcgp7CnB1YmxpYzoKICAgIEFkZE9yZGVyKENvbnRleHQgKmN0eCkgOiBjdHhfKGN0eCkge30KICAgIGJvb2wgRXhlKGludCBvcmRlcl9pZCwgY2hhciB0eXBlLCBpbnQgbnVtLCBpbnQgcHJpY2UpCiAgICB7CiAgICAgICAgUHJpY2VNYXAgKnByaWNlX21hcDsKICAgICAgICBpZiAoZGVhbCh0eXBlLCBudW0sIHByaWNlKSkKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgImRlYWwgZG9uZSA6IgogICAgICAgICAgICAgICAgIDw8ICJBLCIgPDwgb3JkZXJfaWQgPDwgIiwiIDw8IHR5cGUgPDwgIiwiIDw8IG51bSA8PCAiLCIgPDwgcHJpY2UgPDwgZW5kbDsKICAgICAgICAgICAgY291dCA8PCIxMDUwIDo6Ijw8ICZjdHhfLT5zZWxsX21hcFsxMDUwXS5mcm9udCgpLm51bTw8ZW5kbDsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlID09ICdCJykKICAgICAgICB7CiAgICAgICAgICAgIHByaWNlX21hcCA9ICZjdHhfLT5idXlfbWFwOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwcmljZV9tYXAgPSAmY3R4Xy0+c2VsbF9tYXA7CiAgICAgICAgfQogICAgICAgIE9yZGVyTm9kZSBpdGVtKG9yZGVyX2lkLCB0eXBlLCBudW0sIHByaWNlKTsKICAgICAgICBpZiAocHJpY2VfbWFwLT5maW5kKHByaWNlKSA9PSBwcmljZV9tYXAtPmVuZCgpKQogICAgICAgIHsKICAgICAgICAgICAgcHJpY2VfbWFwLT5pbnNlcnQobWFrZV9wYWlyKHByaWNlLCBPcmRlckxpc3QoKSkpOwogICAgICAgIH0KICAgICAgICBwcmljZV9tYXAtPmF0KHByaWNlKS5wdXNoX2JhY2soaXRlbSk7CiAgICAgICAgY3R4Xy0+b3JkZXJfbWFwLmluc2VydChtYWtlX3BhaXIob3JkZXJfaWQsIGl0ZW0pKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGJvb2wgZGVhbChjaGFyIHR5cGUsIGludCAmbnVtLCBpbnQgcHJpY2UpCiAgICB7CiAgICAgICAgUHJpY2VNYXAgKnByaWNlX21hcDsKICAgICAgICBpZiAodHlwZSA9PSAnQicpCiAgICAgICAgewogICAgICAgICAgICBwcmljZV9tYXAgPSAmY3R4Xy0+c2VsbF9tYXA7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHByaWNlX21hcCA9ICZjdHhfLT5idXlfbWFwOwogICAgICAgIH0KICAgICAgICBpZiAocHJpY2VfbWFwLT5maW5kKHByaWNlKSA9PSBwcmljZV9tYXAtPmVuZCgpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBPcmRlckxpc3QqIG9yZGVyX2xpc3QgPSAmcHJpY2VfbWFwLT5hdChwcmljZSk7CiAgICAgICAgZm9yIChhdXRvIGl0IDogKm9yZGVyX2xpc3QpCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXQubnVtID4gbnVtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpdC5udW0gPSBpdC5udW0gLSBudW07CiAgICAgICAgICAgICAgICBjb3V0IDw8ICJkZWFsIGRvbmUgOiIKICAgICAgICAgICAgICAgICA8PCAiYWFhLCIgPDwgaXQub3JkZXJfaWQgPDwgIiwiIDw8IHR5cGUgPDwgIiwiIDw8IG51bSA8PCAiLCIgPDwgcHJpY2UgPDwgZW5kbDsKICAgICAgICAgICAgICAgIG51bSA9IDA7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXQubnVtID09IG51bSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY291dCA8PCAiZGVhbCBkb25lIDoiCiAgICAgICAgICAgICAgICAgPDwgImJiYiwiIDw8IGl0Lm9yZGVyX2lkIDw8ICIsIiA8PCB0eXBlIDw8ICIsIiA8PCBudW0gPDwgIiwiIDw8IHByaWNlIDw8IGVuZGw7CiAgICAgICAgICAgICAgICBjdHhfLT5vcmRlcl9tYXAuZXJhc2UoaXQub3JkZXJfaWQpOwogICAgICAgICAgICAgICAgb3JkZXJfbGlzdC0+cG9wX2Zyb250KCk7CiAgICAgICAgICAgICAgICBpZiAob3JkZXJfbGlzdC0+c2l6ZSgpID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJpY2VfbWFwLT5lcmFzZShwcmljZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBudW0gPSAwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnVtIC09IGl0Lm51bTsKICAgICAgICAgICAgY3R4Xy0+b3JkZXJfbWFwLmVyYXNlKGl0Lm9yZGVyX2lkKTsKICAgICAgICAgICAgb3JkZXJfbGlzdC0+cG9wX2Zyb250KCk7CiAgICAgICAgfQogICAgICAgIGlmIChudW0pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwidGVzdGJiYiI8PG9yZGVyX2xpc3QtPnNpemUoKTw8ZW5kbDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIENvbnRleHQgKmN0eF87Cn07CgpjbGFzcyBEZWxPcmRlciA6IHB1YmxpYyBFeGVPcmRlcgp7CnB1YmxpYzoKICAgIERlbE9yZGVyKENvbnRleHQgKmN0eCkgOiBjdHhfKGN0eCkge30KICAgIGJvb2wgRXhlKGludCBvcmRlcl9pZCwgY2hhciB0eXBlLCBpbnQgbnVtLCBpbnQgcHJpY2UpCiAgICB7CiAgICAgICAgUHJpY2VNYXAgKnByaWNlX21hcDsKICAgICAgICBpZiAodHlwZSA9PSAnQicpCiAgICAgICAgewogICAgICAgICAgICBwcmljZV9tYXAgPSAmY3R4Xy0+YnV5X21hcDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHJpY2VfbWFwID0gJmN0eF8tPnNlbGxfbWFwOwogICAgICAgIH0KICAgICAgICBpZiAoY3R4Xy0+b3JkZXJfbWFwLmZpbmQob3JkZXJfaWQpID09IGN0eF8tPm9yZGVyX21hcC5lbmQoKSkKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgImRlbGV0ZSBjbWQgKCIKICAgICAgICAgICAgICAgICA8PCAiWCwiIDw8IG9yZGVyX2lkIDw8ICIsIiA8PCB0eXBlIDw8ICIsIiA8PCBudW0gPDwgIiwiIDw8IHByaWNlIDw8ICIpIGZhaWxlZCIgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBhdXRvIGl0ID0gY3R4Xy0+b3JkZXJfbWFwLmF0KG9yZGVyX2lkKTsKICAgICAgICBpZiAoaXQubnVtID09IG51bSAmJiBpdC5wcmljZSA9PSBwcmljZSAmJiBpdC50eXBlID09IHR5cGUpCiAgICAgICAgewogICAgICAgICAgICBwcmljZV9tYXAtPmF0KHByaWNlKS5yZW1vdmVfaWYoW251bSwgcHJpY2UsIHR5cGVdKE9yZGVyTm9kZSAgaXQpewogICAgICAgICAgICAgICAgaWYgKGl0Lm51bSA9PSBudW0gJiYgaXQucHJpY2UgPT0gcHJpY2UgJiYgaXQudHlwZSA9PSB0eXBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY3R4Xy0+b3JkZXJfbWFwLmVyYXNlKG9yZGVyX2lkKTsKICAgICAgICAgICAgY291dCA8PCAiZGVsZXRlIGNtZCAoIgogICAgICAgICAgICAgICAgIDw8ICJYLCIgPDwgb3JkZXJfaWQgPDwgIiwiIDw8IHR5cGUgPDwgIiwiIDw8IG51bSA8PCAiLCIgPDwgcHJpY2UgPDwgIikgc3VjY2VzcyIgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgImRlbGV0ZSBjbWQgKCIKICAgICAgICAgICAgIDw8ICJYLCIgPDwgb3JkZXJfaWQgPDwgIiwiIDw8IHR5cGUgPDwgIiwiIDw8IG51bSA8PCAiLCIgPDwgcHJpY2UgPDwgIikgZmFpbGVkIiA8PCBlbmRsOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIENvbnRleHQgKmN0eF87Cn07CnVzaW5nIEV4ZU1hcCA9IHN0ZDo6bWFwPGNoYXIsIEV4ZU9yZGVyICo+Owp2b2lkIHJlZ2lzdGVyQ29tbWFuZChFeGVNYXAmIG1fZXhlX21hcF8sIENvbnRleHQqIG1fY3R4XykKewogICAgbV9leGVfbWFwXy5pbnNlcnQobWFrZV9wYWlyKCdBJywgbmV3IEFkZE9yZGVyKG1fY3R4XykpKTsKICAgIG1fZXhlX21hcF8uaW5zZXJ0KG1ha2VfcGFpcignWCcsIG5ldyBEZWxPcmRlcihtX2N0eF8pKSk7Cn0KY2xhc3MgRXhlTWFuYWdlCnsKcHVibGljOgogICAgRXhlTWFuYWdlKCkKICAgIHsKICAgICAgICByZWdpc3RlckNvbW1hbmQobV9leGVfbWFwXywgJm1fY3R4Xyk7CiAgICB9CiAgICB+RXhlTWFuYWdlKCkKICAgIHsKICAgICAgICBmb3IgKGF1dG8gaXQgOiBtX2V4ZV9tYXBfKQogICAgICAgIHsKICAgICAgICAgICAgZGVsZXRlIGl0LnNlY29uZDsKICAgICAgICB9CiAgICAgICAgbV9leGVfbWFwXy5jbGVhcigpOwogICAgfQogICAgdm9pZCBkb19pdChjb25zdCBzdHJpbmcgJmNtZCkKICAgIHsKICAgICAgICBjaGFyIGNtZF90eXBlID0gJ1wwJzsKICAgICAgICBpbnQgb3JkZXJfaWQgPSAwOwogICAgICAgIGNoYXIgdHlwZSA9ICdcMCc7CiAgICAgICAgaW50IG51bSA9IDA7CiAgICAgICAgaW50IHByaWNlID0gMDsKICAgICAgICBzc2NhbmYoY21kLmNfc3RyKCksICIlYywlZCwlYywlZCwlZCIsICZjbWRfdHlwZSwgJm9yZGVyX2lkLCAmdHlwZSwgJm51bSwgJnByaWNlKTsKICAgICAgICBwcmludGYoIiVjLCVkLCVjLCVkLCVkXG4iLCBjbWRfdHlwZSwgb3JkZXJfaWQsIHR5cGUsIG51bSwgcHJpY2UpOwogICAgICAgIGlmIChtX2V4ZV9tYXBfLmZpbmQoY21kX3R5cGUpID09IG1fZXhlX21hcF8uZW5kKCkpCiAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8ICJjb21tYW5kIGVycm9yMTEsICIgPDwgY21kIDw8IGVuZGw7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbV9leGVfbWFwX1tjbWRfdHlwZV0tPkV4ZShvcmRlcl9pZCwgdHlwZSwgbnVtLCBwcmljZSk7CiAgICAgICAgY291dDw8InRlc3QiPDxtX2N0eF8uc2VsbF9tYXAuc2l6ZSgpPDxlbmRsOwogICAgfQogICAgdm9pZCBwcmludCgpCiAgICB7CiAgICAgICAgbV9jdHhfLnByaW50KCk7CiAgICB9Cgpwcml2YXRlOgogICAgQ29udGV4dCBtX2N0eF87CiAgICBFeGVNYXAgbV9leGVfbWFwXzsKfTsKaW50IG1haW4oKQp7CiAgICBzdHJpbmcgc1tdID0geyJBLDEwMDAwMCxTLDEsMTA3NSIsIkEsMTAwMDAxLEIsOSwxMDAwIiwiQSwxMDAwMDIsQiwzMCw5NzUiLCJBLDEwMDAwMyxTLDEwLDEwNTAiLCJBLDEwMDAwNCxCLDEwLDk1MCIsIkEsMTAwMDA1LFMsMiwxMDI1IiwKCQkiQSwxMDAwMDYsQiwxLDEwMDAiLCJYLDEwMDAwNCxCLDEwLDk1MCIsIkEsMTAwMDA3LFMsNSwxMDI1IiwiQSwxMDAwMDgsQiwzLDEwNTAiLCJYLDEwMDAwOCxCLDMsMTA1MCIsIlgsMTAwMDA1LFMsMiwxMDI1In07CiAgICB2ZWN0b3I8c3RyaW5nPiBpbnB1dChzLCBzICsgMTIpOwogICAgRXhlTWFuYWdlIGV4ZTsKICAgIGZvciAoYXV0byBpdCA6IGlucHV0KQogICAgewogICAgICAgIGV4ZS5kb19pdChpdCk7CiAgICB9CiAgICBleGUucHJpbnQoKTsKfQ==