#include <unistd.h>
#include <string.h>
#include <string>
using namespace std;
int main(int argc, char ** argv)
{
(void)argc, (void)argv;
const unsigned int bufsize = 16384;
char input_buffer[bufsize];
string output_buffer;
string what_to_append = "\t2\n";
auto flush_output = [&](bool force) {
if (force || output_buffer.size() > bufsize)
{
write(1, output_buffer.data(), output_buffer.size());
output_buffer.resize(0);
}
};
for (;;)
{
ssize_t bytes_read = read(0, input_buffer, sizeof(input_buffer));
if (bytes_read < 0)
{
perror("read failed");
return 1;
}
else if (bytes_read == 0)
{
break;
}
for (char * in_ptr = input_buffer;;)
{
ssize_t remaining = input_buffer + bytes_read - in_ptr;
if (remaining <= 0) break;
char * eol = (char*)memchr(in_ptr, '\n', remaining);
if (!eol)
{
output_buffer.append(in_ptr, remaining);
flush_output(false);
break;
}
output_buffer.append(in_ptr, eol - in_ptr);
output_buffer.append(what_to_append);
flush_output(false);
in_ptr = eol + 1;
}
}
flush_output(true);
}
I2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdHJpbmc+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKewogICAgKHZvaWQpYXJnYywgKHZvaWQpYXJndjsKCiAgICBjb25zdCB1bnNpZ25lZCBpbnQgYnVmc2l6ZSA9IDE2Mzg0OwogICAgY2hhciBpbnB1dF9idWZmZXJbYnVmc2l6ZV07CiAgICBzdHJpbmcgb3V0cHV0X2J1ZmZlcjsKICAgIHN0cmluZyB3aGF0X3RvX2FwcGVuZCA9ICJcdDJcbiI7CgogICAgYXV0byBmbHVzaF9vdXRwdXQgPSBbJl0oYm9vbCBmb3JjZSkgewogICAgICAgIGlmIChmb3JjZSB8fCBvdXRwdXRfYnVmZmVyLnNpemUoKSA+IGJ1ZnNpemUpCiAgICAgICAgewogICAgICAgICAgICB3cml0ZSgxLCBvdXRwdXRfYnVmZmVyLmRhdGEoKSwgb3V0cHV0X2J1ZmZlci5zaXplKCkpOwogICAgICAgICAgICBvdXRwdXRfYnVmZmVyLnJlc2l6ZSgwKTsKICAgICAgICB9CiAgICB9OwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgICAgc3NpemVfdCBieXRlc19yZWFkID0gcmVhZCgwLCBpbnB1dF9idWZmZXIsIHNpemVvZihpbnB1dF9idWZmZXIpKTsKICAgICAgICBpZiAoYnl0ZXNfcmVhZCA8IDApCiAgICAgICAgewogICAgICAgICAgICBwZXJyb3IoInJlYWQgZmFpbGVkIik7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChieXRlc19yZWFkID09IDApCiAgICAgICAgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGZvciAoY2hhciAqIGluX3B0ciA9IGlucHV0X2J1ZmZlcjs7KQogICAgICAgIHsKICAgICAgICAgICAgc3NpemVfdCByZW1haW5pbmcgPSBpbnB1dF9idWZmZXIgKyBieXRlc19yZWFkIC0gaW5fcHRyOwogICAgICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIGJyZWFrOwoKICAgICAgICAgICAgY2hhciAqIGVvbCA9IChjaGFyKiltZW1jaHIoaW5fcHRyLCAnXG4nLCByZW1haW5pbmcpOwogICAgICAgICAgICBpZiAoIWVvbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlci5hcHBlbmQoaW5fcHRyLCByZW1haW5pbmcpOwogICAgICAgICAgICAgICAgZmx1c2hfb3V0cHV0KGZhbHNlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dHB1dF9idWZmZXIuYXBwZW5kKGluX3B0ciwgZW9sIC0gaW5fcHRyKTsKICAgICAgICAgICAgb3V0cHV0X2J1ZmZlci5hcHBlbmQod2hhdF90b19hcHBlbmQpOwogICAgICAgICAgICBmbHVzaF9vdXRwdXQoZmFsc2UpOwogICAgICAgICAgICBpbl9wdHIgPSBlb2wgKyAxOwogICAgICAgIH0KICAgIH0KICAgIGZsdXNoX291dHB1dCh0cnVlKTsKfQo=