process.stdin.resume();
process.stdin.setEncoding('utf8');
/**
* Функция глубокого копирования объектов
* элементы внутри копируемого объекта то же копируются
*
* @param {(Object|Array|Date)} object - Копируемый объект
* @return {(Object|Array|Date)} objectClone - Копия объекта
*/
function deepCopy(object) {
var objectType = getTypeOf(object);
if (objectType == "Array") {
var objectClone = [];
for(var i = 0; i < object.length; i++) {
var itemType = getTypeOf(object[i]);
if (
itemType == "Object" ||
itemType == "Array" ||
itemType == "Date"
) {
objectClone.push(deepCopy(object[i]));
} else {
objectClone.push(object[i]);
}
};
} else if (objectType == "Object") {
var objectClone = {};
for(key in object) {
var itemType = getTypeOf(object[key]);
if (
itemType == "Object" ||
itemType == "Array" ||
itemType == "Date"
) {
objectClone[key] = deepCopy(object[key]);
} else {
objectClone[key] = object[key];
}
};
} else if (objectType == "Date") {
return new Date(object.getTime());
}
return objectClone;
}
/**
* Функция определяет тип переменной
*
* @param value - Переменная, тип которой определяется
* @return {string} - Одна из строк:
* 'undefined',
* 'boolean' (для true/false),
* 'null', !object
* 'number',
* 'string',
* 'function',
* 'Array', object
* 'array-like', !object
* 'Arguments'
* 'Object',
* 'Date'
* @throw {Error}
*/
function getTypeOf(value) {
if (arguments.length != 1) {
throw new Error("Require 1 argument, given: " + arguments.length);
}
var type = typeof(value);
if (type == "object") {
// Определение null
if ( value === null) {
return "null";
}
// Определение всего остального: arguments, object, date
return {}.toString.call(value).slice(8, -1); // Отрезает первую часть выражения [object ...]
} else {
return type;
}
}
var a = { x: 1, y: 2, z: [1, 2, 3], w: new Date(2014, 1, 1, 12, 0, 0) };
var b = deepCopy(a); // b — это отдельный объект
b.x = 10;
console.log(a.x); // 1
// a.z и b.z указывают на разные массивы:
b.z.push(4);
console.log(a.z); // [1, 2, 3]
// a.w и b.w независимы друг от друга
b.w.setFullYear(2015);
console.log(a.w.getFullYear()); // 2014
cHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTsKcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygndXRmOCcpOwoKCi8qKgogKiDQpNGD0L3QutGG0LjRjyDQs9C70YPQsdC+0LrQvtCz0L4g0LrQvtC/0LjRgNC+0LLQsNC90LjRjyDQvtCx0YrQtdC60YLQvtCyCiAqINGN0LvQtdC80LXQvdGC0Ysg0LLQvdGD0YLRgNC4INC60L7Qv9C40YDRg9C10LzQvtCz0L4g0L7QsdGK0LXQutGC0LAg0YLQviDQttC1INC60L7Qv9C40YDRg9GO0YLRgdGPCiAqCiAqIEBwYXJhbSB7KE9iamVjdHxBcnJheXxEYXRlKX0gIG9iamVjdCAgICAgICAgLSDQmtC+0L/QuNGA0YPQtdC80YvQuSDQvtCx0YrQtdC60YIKICogQHJldHVybiB7KE9iamVjdHxBcnJheXxEYXRlKX0gIG9iamVjdENsb25lICAtINCa0L7Qv9C40Y8g0L7QsdGK0LXQutGC0LAKICovCmZ1bmN0aW9uIGRlZXBDb3B5KG9iamVjdCkgewogICAgCiAgICB2YXIgb2JqZWN0VHlwZSA9IGdldFR5cGVPZihvYmplY3QpOwogICAgCiAgICBpZiAob2JqZWN0VHlwZSA9PSAiQXJyYXkiKSB7CiAgICAgICAgdmFyIG9iamVjdENsb25lID0gW107CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgaXRlbVR5cGUgPSBnZXRUeXBlT2Yob2JqZWN0W2ldKTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgaXRlbVR5cGUgPT0gIk9iamVjdCIgfHwKICAgICAgICAgICAgICAgIGl0ZW1UeXBlID09ICJBcnJheSIgfHwKICAgICAgICAgICAgICAgIGl0ZW1UeXBlID09ICJEYXRlIgogICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBvYmplY3RDbG9uZS5wdXNoKGRlZXBDb3B5KG9iamVjdFtpXSkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqZWN0Q2xvbmUucHVzaChvYmplY3RbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsgICAgICAgIAogICAgfSBlbHNlIGlmIChvYmplY3RUeXBlID09ICJPYmplY3QiKSB7CiAgICAgICAgdmFyIG9iamVjdENsb25lID0ge307CiAgICAgICAgZm9yKGtleSBpbiBvYmplY3QpIHsKICAgICAgICAgICAgdmFyIGl0ZW1UeXBlID0gZ2V0VHlwZU9mKG9iamVjdFtrZXldKTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgaXRlbVR5cGUgPT0gIk9iamVjdCIgfHwKICAgICAgICAgICAgICAgIGl0ZW1UeXBlID09ICJBcnJheSIgfHwKICAgICAgICAgICAgICAgIGl0ZW1UeXBlID09ICJEYXRlIgogICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBvYmplY3RDbG9uZVtrZXldID0gZGVlcENvcHkob2JqZWN0W2tleV0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2JqZWN0Q2xvbmVba2V5XSA9IG9iamVjdFtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfTsgICAgICAgIAogICAgfSBlbHNlIGlmIChvYmplY3RUeXBlID09ICJEYXRlIikgewogICAgICAgIHJldHVybiBuZXcgRGF0ZShvYmplY3QuZ2V0VGltZSgpKTsKICAgIH0gICAgCgogICAgcmV0dXJuIG9iamVjdENsb25lOwp9CgovKioKICog0KTRg9C90LrRhtC40Y8g0L7Qv9GA0LXQtNC10LvRj9C10YIg0YLQuNC/INC/0LXRgNC10LzQtdC90L3QvtC5CiAqCiAqIEBwYXJhbSAgdmFsdWUgICAgIC0g0J/QtdGA0LXQvNC10L3QvdCw0Y8sINGC0LjQvyDQutC+0YLQvtGA0L7QuSDQvtC/0YDQtdC00LXQu9GP0LXRgtGB0Y8KICogQHJldHVybiB7c3RyaW5nfSAgLSDQntC00L3QsCDQuNC3INGB0YLRgNC+0Lo6CiAqICAgICAgJ3VuZGVmaW5lZCcsCiAqICAgICAgJ2Jvb2xlYW4nICjQtNC70Y8gdHJ1ZS9mYWxzZSksCiAqICAgICAgJ251bGwnLCAhb2JqZWN0CiAqICAgICAgJ251bWJlcicsCiAqICAgICAgJ3N0cmluZycsIAogKiAgICAgICdmdW5jdGlvbicsCiAqICAgICAgJ0FycmF5Jywgb2JqZWN0CiAqICAgICAgJ2FycmF5LWxpa2UnLCAhb2JqZWN0CiAqICAgICAgJ0FyZ3VtZW50cycKICogICAgICAnT2JqZWN0JywgCiAqICAgICAgJ0RhdGUnCiAqIEB0aHJvdyB7RXJyb3J9CiAqLwpmdW5jdGlvbiBnZXRUeXBlT2YodmFsdWUpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9IDEpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlJlcXVpcmUgMSBhcmd1bWVudCwgZ2l2ZW46ICIgKyBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICAgIAogICAgdmFyIHR5cGUgPSB0eXBlb2YodmFsdWUpOwogICAgCiAgICBpZiAodHlwZSA9PSAib2JqZWN0IikgewogICAgICAgIC8vINCe0L/RgNC10LTQtdC70LXQvdC40LUgbnVsbAogICAgICAgIGlmICggdmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKICAgICAgICB9CiAgICAgICAgLy8g0J7Qv9GA0LXQtNC10LvQtdC90LjQtSDQstGB0LXQs9C+INC+0YHRgtCw0LvRjNC90L7Qs9C+OiBhcmd1bWVudHMsIG9iamVjdCwgZGF0ZQogICAgICAgIHJldHVybiB7fS50b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSk7ICAvLyDQntGC0YDQtdC30LDQtdGCINC/0LXRgNCy0YPRjiDRh9Cw0YHRgtGMINCy0YvRgNCw0LbQtdC90LjRjyBbb2JqZWN0IC4uLl0KICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHR5cGU7CiAgICB9ICAKfQoKdmFyIGEgPSB7IHg6IDEsIHk6IDIsIHo6IFsxLCAyLCAzXSwgdzogbmV3IERhdGUoMjAxNCwgMSwgMSwgMTIsIDAsIDApIH07CnZhciBiID0gZGVlcENvcHkoYSk7IC8vIGIg4oCUINGN0YLQviDQvtGC0LTQtdC70YzQvdGL0Lkg0L7QsdGK0LXQutGCCmIueCA9IDEwOwpjb25zb2xlLmxvZyhhLngpOyAvLyAxCgovLyBhLnog0LggYi56INGD0LrQsNC30YvQstCw0Y7RgiDQvdCwINGA0LDQt9C90YvQtSDQvNCw0YHRgdC40LLRizogCmIuei5wdXNoKDQpOwpjb25zb2xlLmxvZyhhLnopOyAvLyBbMSwgMiwgM10KCi8vIGEudyDQuCBiLncg0L3QtdC30LDQstC40YHQuNC80Ysg0LTRgNGD0LMg0L7RgiDQtNGA0YPQs9CwCmIudy5zZXRGdWxsWWVhcigyMDE1KTsKY29uc29sZS5sb2coYS53LmdldEZ1bGxZZWFyKCkpOyAvLyAyMDE0Cg==