Y29uc3QgZHdxcCA9IGZ1bmN0aW9uICgpIHsKCiAgZnVuY3Rpb24gcGFyc2Uoc3FsKSB7CiAgICB0cnkgewogICAgICBjb25zdCBwb3NzaWJsZSA9IHt9CiAgICAgIGNvbnN0IGFzdCA9IHBhcnNlX3NxbChzcWwpCiAgICAgIC8vY29uc29sZS5sb2coJ3NxbDonLCBzcWwpOwogICAgICAvL2NvbnNvbGUubG9nKCJhc3QiLCBhc3QudmFsdWUuc2VsZWN0SXRlbXMpCiAgICAgIHBvc3NpYmxlLnNlbGVjdCA9IGdldF9zZWxlY3RfY2xhdXNlKGFzdCkKICAgICAgcG9zc2libGUuZnJvbSA9IGdldF9mcm9tX2NsYXVzZShhc3QpCiAgICAgIHBvc3NpYmxlLm9yZGVyID0gZ2V0X29yZGVyX2NsYXVzZShhc3QpCiAgICAgIHBvc3NpYmxlLndoZXJlID0gZ2V0X3doZXJlX2NsYXVzZShhc3QpCiAgICAgIHBvc3NpYmxlLmdyb3VwID0gZ2V0X2dyb3VwX2NsYXVzZShhc3QpCiAgICAgIHBvc3NpYmxlLmhhdmluZyA9IGdldF9oYXZpbmdfY2xhdXNlKGFzdCkKICAgICAgcG9zc2libGUubGltaXQgPSBnZXRfbGltaXRfY2xhdXNlKGFzdCkKICAgICAgcmV0dXJuIHBvc3NpYmxlCiAgICB9IGNhdGNoIChlKSB7CiAgICAgIC8vbG9nZ2VyLmRlYnVnKCdDb3VsZCBub3QgcGFyc2UgU1FMLiAgVGhpcyBpcyBleHBlY3RlZCB3aGVuIHN0dWRlbnQgZ2l2ZXMgdXMgYSBtYWxmb3JtZWQgcXVlcnkuICBObyBiaWcgZGVhbCwgd2Ugd2lsbCBmYWxsIGJhY2sgdG8gZG9pbmcgYSB0ZXh0IHBhcnNlJykoKQogICAgICAvL2xvZ2dlci5kZWJ1ZygnRXJyb3IgTWVzc2FnZScsIGUpKCkKICAgICAgcmV0dXJuIG51bGwKICAgIH0KICB9CgogIGZ1bmN0aW9uIHBhcnNlX3NxbChzcWwpIHsKICAgIC8vY29uc3QgcGFyc2VyID0gcmVxdWlyZSgnanMtc3FsLXBhcnNlcicpOwogICAgdHJ5IHsKICAgICAgcmV0dXJuIHNxbFBhcnNlci5wYXJzZShzcWwpCiAgICB9IGNhdGNoIChlKSB7CiAgICAgIC8vIHRoZXJlIHdhcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBxdWVyeSwgdHJ5IGFnYWluIGJ5IHJlcGxhY2luZyBEVyBmdWxsIG91dGVyIGpvaW4gc3ludGF4IHdpdGggTXlTcWwgY3Jvc3Mgam9pbgogICAgICBjb25zdCByZWdleCA9IC9mdWxsW1xzXSsob3V0ZXJbXHNdKyk/am9pbi9naTsKICAgICAgbGV0IG5ld19zcWwgPSBzcWwucmVwbGFjZShyZWdleCwgImNyb3NzIGpvaW4iKQogICAgICByZXR1cm4gc3FsUGFyc2VyLnBhcnNlKG5ld19zcWwpCiAgICB9CiAgfQoKCiAgZnVuY3Rpb24gZ2V0X3NlbGVjdF9jbGF1c2UoYXN0KSB7CiAgICBjb25zdCBjbGF1c2UgPSB7fQoKICAgIGZ1bmN0aW9uIHJlY3Vyc2UoY3VyLCBwcm9wKSB7Ly8gY29waWVkIGZyb20gZmxhdHRlbgogICAgICBpZiAoY3VyKSB7CiAgICAgICAgaWYgKGN1ci50eXBlKSB7CiAgICAgICAgICBpZiAoY3VyLnZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXIudmFsdWUgIT09ICdvYmplY3QnICYmIGN1ci52YWx1ZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgIGlmICghY2xhdXNlW2N1ci50eXBlLnRvTG93ZXJDYXNlKCldKSB7IGNsYXVzZVtjdXIudHlwZS50b0xvd2VyQ2FzZSgpXSA9IFtdIH0KICAgICAgICAgICAgICBpZiAoY3VyLnR5cGUgPT09ICJJZGVudGlmaWVyIikgewogICAgICAgICAgICAgICAgYWRkX29uY2UoY2xhdXNlW2N1ci50eXBlLnRvTG93ZXJDYXNlKCldLCBjdXIudmFsdWUuc3BsaXQoIi4iKS5wb3AoKSkKICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ci50eXBlID09PSAiU3RyaW5nIikgewogICAgICAgICAgICAgICAgYWRkX29uY2UoY2xhdXNlW2N1ci50eXBlLnRvTG93ZXJDYXNlKCldLCBjdXIudmFsdWUuc3Vic3RyaW5nKDEsIGN1ci52YWx1ZS5sZW5ndGggLSAxKSkKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWRkX29uY2UoY2xhdXNlW2N1ci50eXBlLnRvTG93ZXJDYXNlKCldLCBjdXIudmFsdWUudG9TdHJpbmcoKSkKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGN1ci5hbGlhcykgewogICAgICAgICAgaWYgKCFjbGF1c2UuYWxpYXMpIHsgY2xhdXNlLmFsaWFzID0gW10gfQogICAgICAgICAgYWRkX29uY2UoY2xhdXNlLmFsaWFzLCBjdXIuYWxpYXMpCiAgICAgICAgfQogICAgICAgIGlmIChjdXIub3BlcmF0b3IpIHsKICAgICAgICAgIGlmICghY2xhdXNlLm9wZXJhdG9yKSB7IGNsYXVzZS5vcGVyYXRvciA9IFtdIH0KICAgICAgICAgIGFkZF9vbmNlKGNsYXVzZS5vcGVyYXRvciwgY3VyLm9wZXJhdG9yKQogICAgICAgIH0KCiAgICAgIH0KICAgICAgaWYgKE9iamVjdChjdXIpICE9PSBjdXIpIHsKICAgICAgICAvL3Jlc3VsdFtwcm9wXSA9IGN1cjsKCiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjdXIpKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjdXIubGVuZ3RoOyBpIDwgbDsgaSsrKQogICAgICAgICAgcmVjdXJzZShjdXJbaV0sIHByb3AgKyAiWyIgKyBpICsgIl0iKTsKICAgICAgICBpZiAobCA9PT0gMCkgewogICAgICAgICAgLy9yZXN1bHRbcHJvcF0gPSBbXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGlzRW1wdHkgPSB0cnVlOwogICAgICAgIGZvciAodmFyIHAgaW4gY3VyKSB7CiAgICAgICAgICBpc0VtcHR5ID0gZmFsc2U7CiAgICAgICAgICByZWN1cnNlKGN1cltwXSwgcHJvcCA/IHByb3AgKyAiLiIgKyBwIDogcCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc0VtcHR5ICYmIHByb3ApIHsKICAgICAgICAgIC8vcmVzdWx0W3Byb3BdID0ge307CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZWN1cnNlKGFzdC52YWx1ZS5zZWxlY3RJdGVtcywgIiIpOwogICAgcmV0dXJuIGNsYXVzZQoKICB9CgogIGZ1bmN0aW9uIGdldF9mcm9tX2NsYXVzZShhc3QpIHsKICAgIGNvbnN0IGNsYXVzZSA9IHt9CgogICAgZnVuY3Rpb24gcmVjdXJzZShjdXIsIHByb3ApIHsvLyBjb3BpZWQgZnJvbSBmbGF0dGVuCiAgICAgIGlmIChjdXIpIHsKICAgICAgICAvL2xvZ2dlci5sb2coImN1ciIsY3VyLGN1ci5vcGVyYXRvciwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKSgpCgogICAgICAgIGlmIChjdXIudHlwZSA9PT0gIkxlZnRSaWdodEpvaW5UYWJsZSIpIHsKICAgICAgICAgIGlmICghY2xhdXNlLmpvaW4pIHsgY2xhdXNlLmpvaW4gPSBbXSB9CiAgICAgICAgICBhZGRfb25jZShjbGF1c2Uuam9pbiwgIm91dGVyIGpvaW4iKQogICAgICAgIH0KCiAgICAgICAgaWYgKGN1ci50eXBlID09PSAiSW5uZXJDcm9zc0pvaW5UYWJsZSIpIHsKICAgICAgICAgIGlmICghY2xhdXNlLmpvaW4pIHsgY2xhdXNlLmpvaW4gPSBbXSB9CiAgICAgICAgICBpZiAoY3VyLmlubmVyQ3Jvc3NPcHQgPT09ICdjcm9zcycpIHsKICAgICAgICAgICAgYWRkX29uY2UoY2xhdXNlLmpvaW4sICJjcm9zcyIpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhZGRfb25jZShjbGF1c2Uuam9pbiwgImpvaW4iKQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGN1ci50eXBlID09PSAiVGFibGVGYWN0b3IiKSB7CiAgICAgICAgICBpZiAoIWNsYXVzZS50YWJsZSkgeyBjbGF1c2UudGFibGUgPSBbXSB9CiAgICAgICAgICBhZGRfb25jZShjbGF1c2UudGFibGUsIGN1ci52YWx1ZS52YWx1ZSkKICAgICAgICB9CgoKICAgICAgICBpZiAoY3VyLnR5cGUgPT09ICJPbkpvaW5Db25kaXRpb24iKSB7CiAgICAgICAgICBpZiAoIWNsYXVzZS5jb2x1bW4pIHsgY2xhdXNlLmNvbHVtbiA9IFtdIH0KICAgICAgICAgIGlmIChjdXIudmFsdWUubGVmdC50eXBlID09PSAiSWRlbnRpZmllciIpIHsKICAgICAgICAgICAgYWRkX29uY2UoY2xhdXNlLmNvbHVtbiwgY3VyLnZhbHVlLmxlZnQudmFsdWUuc3BsaXQoIi4iKS5wb3AoKSkKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjdXIudmFsdWUucmlnaHQudHlwZSA9PT0gIklkZW50aWZpZXIiKSB7CiAgICAgICAgICAgIGFkZF9vbmNlKGNsYXVzZS5jb2x1bW4sIGN1ci52YWx1ZS5sZWZ0LnZhbHVlLnNwbGl0KCIuIikucG9wKCkpCiAgICAgICAgICB9CgogICAgICAgIH0KCgogICAgICAgIGlmIChjdXIuYWxpYXMpIHsKICAgICAgICAgIGlmICghY2xhdXNlLmFsaWFzKSB7IGNsYXVzZS5hbGlhcyA9IFtdIH0KICAgICAgICAgIGFkZF9vbmNlKGNsYXVzZS5hbGlhcywgY3VyLmFsaWFzLnZhbHVlKQogICAgICAgIH0KCiAgICAgIH0KICAgICAgaWYgKE9iamVjdChjdXIpICE9PSBjdXIpIHsKICAgICAgICAvL3Jlc3VsdFtwcm9wXSA9IGN1cjsKCiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjdXIpKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjdXIubGVuZ3RoOyBpIDwgbDsgaSsrKQogICAgICAgICAgcmVjdXJzZShjdXJbaV0sIHByb3AgKyAiWyIgKyBpICsgIl0iKTsKICAgICAgICBpZiAobCA9PT0gMCkgewogICAgICAgICAgLy9yZXN1bHRbcHJvcF0gPSBbXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGlzRW1wdHkgPSB0cnVlOwogICAgICAgIGZvciAodmFyIHAgaW4gY3VyKSB7CiAgICAgICAgICBpc0VtcHR5ID0gZmFsc2U7CiAgICAgICAgICByZWN1cnNlKGN1cltwXSwgcHJvcCA/IHByb3AgKyAiLiIgKyBwIDogcCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc0VtcHR5ICYmIHByb3ApIHsKICAgICAgICAgIC8vcmVzdWx0W3Byb3BdID0ge307CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZWN1cnNlKGFzdC52YWx1ZS5mcm9tLCAiIik7CiAgICByZXR1cm4gY2xhdXNlCgogIH0KCgogIGZ1bmN0aW9uIGdldF9vcmRlcl9jbGF1c2UoYXN0KSB7CiAgICBjb25zdCBjbGF1c2UgPSB7fQogICAgZnVuY3Rpb24gcmVjdXJzZShjdXIsIHByb3ApIHsvLyBjb3BpZWQgZnJvbSBmbGF0dGVuCiAgICAgIGlmIChjdXIpIHsKICAgICAgICBpZiAoY3VyLnR5cGUgPT09ICJHcm91cEJ5T3JkZXJCeUl0ZW0iKSB7CiAgICAgICAgICBpZiAoY3VyLnZhbHVlICYmIGN1ci52YWx1ZS50eXBlID09PSAiSWRlbnRpZmllciIpIHsKICAgICAgICAgICAgaWYgKCFjbGF1c2UuY29sdW1uKSB7IGNsYXVzZS5jb2x1bW4gPSBbXSB9CiAgICAgICAgICAgIGlmIChjdXIuc29ydE9wdCAmJiBjdXIuc29ydE9wdC50b0xvd2VyQ2FzZSgpID09PSAiZGVzYyIpIHsKICAgICAgICAgICAgICBhZGRfb25jZShjbGF1c2UuY29sdW1uLCBjdXIudmFsdWUudmFsdWUuc3BsaXQoIi4iKS5wb3AoKSArICIgREVTQyIpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYWRkX29uY2UoY2xhdXNlLmNvbHVtbiwgY3VyLnZhbHVlLnZhbHVlLnNwbGl0KCIuIikucG9wKCkgKyAiIEFTQyIpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9CiAgICAgIGlmIChPYmplY3QoY3VyKSAhPT0gY3VyKSB7CiAgICAgICAgLy9yZXN1bHRbcHJvcF0gPSBjdXI7CgogICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY3VyKSkgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY3VyLmxlbmd0aDsgaSA8IGw7IGkrKykKICAgICAgICAgIHJlY3Vyc2UoY3VyW2ldLCBwcm9wICsgIlsiICsgaSArICJdIik7CiAgICAgICAgaWYgKGwgPT09IDApIHsKICAgICAgICAgIC8vcmVzdWx0W3Byb3BdID0gW107CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTsKICAgICAgICBmb3IgKHZhciBwIGluIGN1cikgewogICAgICAgICAgaXNFbXB0eSA9IGZhbHNlOwogICAgICAgICAgcmVjdXJzZShjdXJbcF0sIHByb3AgPyBwcm9wICsgIi4iICsgcCA6IHApOwogICAgICAgIH0KICAgICAgICBpZiAoaXNFbXB0eSAmJiBwcm9wKSB7CiAgICAgICAgICAvL3Jlc3VsdFtwcm9wXSA9IHt9OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmVjdXJzZShhc3QudmFsdWUub3JkZXJCeSwgIiIpOwogICAgcmV0dXJuIGNsYXVzZQoKICB9CgoKICBmdW5jdGlvbiBnZXRfd2hlcmVfY2xhdXNlKGFzdCkgewogICAgY29uc3QgY2xhdXNlID0ge30KICAgIGZ1bmN0aW9uIHJlY3Vyc2UoY3VyLCBwcm9wKSB7Ly8gY29waWVkIGZyb20gZmxhdHRlbgogICAgICBpZiAoY3VyKSB7CiAgICAgICAgLy9sb2dnZXIubG9nKCJjdXIiLGN1cixjdXIub3BlcmF0b3IsIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikoKQoKICAgICAgICBpZiAoY3VyLnR5cGUgPT09ICJJZGVudGlmaWVyIikgewogICAgICAgICAgaWYgKCFjbGF1c2UuaWRlbnRpZmllcikgeyBjbGF1c2UuaWRlbnRpZmllciA9IFtdIH0KICAgICAgICAgIGFkZF9vbmNlKGNsYXVzZS5pZGVudGlmaWVyLCBjdXIudmFsdWUuc3BsaXQoIi4iKS5wb3AoKSkKICAgICAgICB9IGVsc2UgaWYgKGN1ci50eXBlID09PSAiU3RyaW5nIikgewogICAgICAgICAgaWYgKCFjbGF1c2Uuc3RyaW5nKSB7IGNsYXVzZS5zdHJpbmcgPSBbXSB9CiAgICAgICAgICBhZGRfb25jZShjbGF1c2Uuc3RyaW5nLCBjdXIudmFsdWUuc3Vic3RyaW5nKDEsIGN1ci52YWx1ZS5sZW5ndGggLSAxKSkKICAgICAgICB9IGVsc2UgaWYgKGN1ci50eXBlID09PSAiTnVtYmVyIikgewogICAgICAgICAgaWYgKCFjbGF1c2UubnVtYmVyKSB7IGNsYXVzZS5udW1iZXIgPSBbXSB9CiAgICAgICAgICBhZGRfb25jZShjbGF1c2UubnVtYmVyLCBjdXIudmFsdWUpCiAgICAgICAgfSBlbHNlIGlmIChjdXIudHlwZSA9PT0gIkJldHdlZW5QcmVkaWNhdGUiKSB7CiAgICAgICAgICBpZiAoIWNsYXVzZS5vcGVyYXRvcikgeyBjbGF1c2Uub3BlcmF0b3IgPSBbXSB9CiAgICAgICAgICBhZGRfb25jZShjbGF1c2Uub3BlcmF0b3IsICJpbmVxdWFsaXR5IG9wZXJhdG9yICg+LCA+PSwgPCwgPD0sIGJldHdlZW4pIikKICAgICAgICB9CiAgICAgICAgaWYgKGN1ci5vcGVyYXRvcikgewogICAgICAgICAgaWYgKCFjbGF1c2Uub3BlcmF0b3IpIHsgY2xhdXNlLm9wZXJhdG9yID0gW10gfQogICAgICAgICAgaWYgKGN1ci5vcGVyYXRvci5yZXBsYWNlKCI+IiwgIjwiKS5pbmRleE9mKCI8IikgPiAtMSkgewogICAgICAgICAgICBhZGRfb25jZShjbGF1c2Uub3BlcmF0b3IsICJpbmVxdWFsaXR5IG9wZXJhdG9yICg+LCA+PSwgPCwgPD0sIGJldHdlZW4pIikKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFkZF9vbmNlKGNsYXVzZS5vcGVyYXRvciwgY3VyLm9wZXJhdG9yKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY3VyLnR5cGUgPT09ICJMaWtlUHJlZGljYXRlIikgewogICAgICAgICAgaWYgKCFjbGF1c2Uub3BlcmF0b3IpIHsgY2xhdXNlLm9wZXJhdG9yID0gW10gfQogICAgICAgICAgYWRkX29uY2UoY2xhdXNlLm9wZXJhdG9yLCAiTGlrZSIpCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChPYmplY3QoY3VyKSAhPT0gY3VyKSB7CiAgICAgICAgLy9yZXN1bHRbcHJvcF0gPSBjdXI7CgogICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY3VyKSkgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY3VyLmxlbmd0aDsgaSA8IGw7IGkrKykKICAgICAgICAgIHJlY3Vyc2UoY3VyW2ldLCBwcm9wICsgIlsiICsgaSArICJdIik7CiAgICAgICAgaWYgKGwgPT09IDApIHsKICAgICAgICAgIC8vcmVzdWx0W3Byb3BdID0gW107CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTsKICAgICAgICBmb3IgKHZhciBwIGluIGN1cikgewogICAgICAgICAgaXNFbXB0eSA9IGZhbHNlOwogICAgICAgICAgcmVjdXJzZShjdXJbcF0sIHByb3AgPyBwcm9wICsgIi4iICsgcCA6IHApOwogICAgICAgIH0KICAgICAgICBpZiAoaXNFbXB0eSAmJiBwcm9wKSB7CiAgICAgICAgICAvL3Jlc3VsdFtwcm9wXSA9IHt9OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmVjdXJzZShhc3QudmFsdWUud2hlcmUsICIiKTsKICAgIHJldHVybiBjbGF1c2UKCiAgfQoKCgogIGZ1bmN0aW9uIGdldF9ncm91cF9jbGF1c2UoYXN0KSB7CiAgICBjb25zdCBjbGF1c2UgPSB7fQogICAgZnVuY3Rpb24gcmVjdXJzZShjdXIsIHByb3ApIHsvLyBjb3BpZWQgZnJvbSBmbGF0dGVuCiAgICAgIGlmIChjdXIpIHsKICAgICAgICBpZiAoY3VyLnR5cGUgPT09ICJJZGVudGlmaWVyIikgewogICAgICAgICAgaWYgKCFjbGF1c2UuaWRlbnRpZmllcikgeyBjbGF1c2UuaWRlbnRpZmllciA9IFtdIH0KICAgICAgICAgIGFkZF9vbmNlKGNsYXVzZS5pZGVudGlmaWVyLCBjdXIudmFsdWUuc3BsaXQoIi4iKS5wb3AoKSkKICAgICAgICB9IGVsc2UgaWYgKGN1ci50eXBlID09PSAiU3RyaW5nIikgewogICAgICAgICAgaWYgKCFjbGF1c2Uuc3RyaW5nKSB7IGNsYXVzZS5zdHJpbmcgPSBbXSB9CiAgICAgICAgICBhZGRfb25jZShjbGF1c2Uuc3RyaW5nLCBjdXIudmFsdWUuc3Vic3RyaW5nKDEsIGN1ci52YWx1ZS5sZW5ndGggLSAxKSkKICAgICAgICB9IGVsc2UgaWYgKGN1ci50eXBlID09PSAiTnVtYmVyIikgewogICAgICAgICAgaWYgKCFjbGF1c2UubnVtYmVyKSB7IGNsYXVzZS5udW1iZXIgPSBbXSB9CiAgICAgICAgICBhZGRfb25jZShjbGF1c2UubnVtYmVyLCBjdXIudmFsdWUpCiAgICAgICAgfQogICAgICAgIGlmIChjdXIub3BlcmF0b3IpIHsKICAgICAgICAgIGlmICghY2xhdXNlLm9wZXJhdG9yKSB7IGNsYXVzZS5vcGVyYXRvciA9IFtdIH0KICAgICAgICAgIGFkZF9vbmNlKGNsYXVzZS5vcGVyYXRvciwgY3VyLm9wZXJhdG9yKQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoT2JqZWN0KGN1cikgIT09IGN1cikgewogICAgICAgIC8vcmVzdWx0W3Byb3BdID0gY3VyOwoKICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGN1cikpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGN1ci5sZW5ndGg7IGkgPCBsOyBpKyspCiAgICAgICAgICByZWN1cnNlKGN1cltpXSwgcHJvcCArICJbIiArIGkgKyAiXSIpOwogICAgICAgIGlmIChsID09PSAwKSB7CiAgICAgICAgICAvL3Jlc3VsdFtwcm9wXSA9IFtdOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgaXNFbXB0eSA9IHRydWU7CiAgICAgICAgZm9yICh2YXIgcCBpbiBjdXIpIHsKICAgICAgICAgIGlzRW1wdHkgPSBmYWxzZTsKICAgICAgICAgIHJlY3Vyc2UoY3VyW3BdLCBwcm9wID8gcHJvcCArICIuIiArIHAgOiBwKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzRW1wdHkgJiYgcHJvcCkgewogICAgICAgICAgLy9yZXN1bHRbcHJvcF0gPSB7fTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJlY3Vyc2UoYXN0LnZhbHVlLmdyb3VwQnksICIiKTsKICAgIHJldHVybiBjbGF1c2UKCiAgfQoKCiAgZnVuY3Rpb24gZ2V0X2hhdmluZ19jbGF1c2UoYXN0KSB7CiAgICBjb25zdCBjbGF1c2UgPSB7fQogICAgZnVuY3Rpb24gcmVjdXJzZShjdXIsIHByb3ApIHsvLyBjb3BpZWQgZnJvbSBmbGF0dGVuCiAgICAgIGlmIChjdXIpIHsKICAgICAgICBpZiAoY3VyLnR5cGUgPT09ICJJZGVudGlmaWVyIikgewogICAgICAgICAgaWYgKCFjbGF1c2UuaWRlbnRpZmllcikgeyBjbGF1c2UuaWRlbnRpZmllciA9IFtdIH0KICAgICAgICAgIGFkZF9vbmNlKGNsYXVzZS5pZGVudGlmaWVyLCBjdXIudmFsdWUuc3BsaXQoIi4iKS5wb3AoKSkKICAgICAgICB9IGVsc2UgaWYgKGN1ci50eXBlID09PSAiU3RyaW5nIikgewogICAgICAgICAgaWYgKCFjbGF1c2Uuc3RyaW5nKSB7IGNsYXVzZS5zdHJpbmcgPSBbXSB9CiAgICAgICAgICBhZGRfb25jZShjbGF1c2Uuc3RyaW5nLCBjdXIudmFsdWUuc3Vic3RyaW5nKDEsIGN1ci52YWx1ZS5sZW5ndGggLSAxKSkKICAgICAgICB9IGVsc2UgaWYgKGN1ci50eXBlID09PSAiTnVtYmVyIikgewogICAgICAgICAgaWYgKCFjbGF1c2UubnVtYmVyKSB7IGNsYXVzZS5udW1iZXIgPSBbXSB9CiAgICAgICAgICBhZGRfb25jZShjbGF1c2UubnVtYmVyLCBjdXIudmFsdWUpCiAgICAgICAgfQogICAgICAgIGlmIChjdXIub3BlcmF0b3IpIHsKICAgICAgICAgIGlmICghY2xhdXNlLm9wZXJhdG9yKSB7IGNsYXVzZS5vcGVyYXRvciA9IFtdIH0KICAgICAgICAgIGFkZF9vbmNlKGNsYXVzZS5vcGVyYXRvciwgY3VyLm9wZXJhdG9yKQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoT2JqZWN0KGN1cikgIT09IGN1cikgewogICAgICAgIC8vcmVzdWx0W3Byb3BdID0gY3VyOwoKICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGN1cikpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGN1ci5sZW5ndGg7IGkgPCBsOyBpKyspCiAgICAgICAgICByZWN1cnNlKGN1cltpXSwgcHJvcCArICJbIiArIGkgKyAiXSIpOwogICAgICAgIGlmIChsID09PSAwKSB7CiAgICAgICAgICAvL3Jlc3VsdFtwcm9wXSA9IFtdOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgaXNFbXB0eSA9IHRydWU7CiAgICAgICAgZm9yICh2YXIgcCBpbiBjdXIpIHsKICAgICAgICAgIGlzRW1wdHkgPSBmYWxzZTsKICAgICAgICAgIHJlY3Vyc2UoY3VyW3BdLCBwcm9wID8gcHJvcCArICIuIiArIHAgOiBwKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzRW1wdHkgJiYgcHJvcCkgewogICAgICAgICAgLy9yZXN1bHRbcHJvcF0gPSB7fTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJlY3Vyc2UoYXN0LnZhbHVlLmhhdmluZywgIiIpOwogICAgcmV0dXJuIGNsYXVzZQoKICB9CgoKICBmdW5jdGlvbiBnZXRfbGltaXRfY2xhdXNlKGFzdCkgewogICAgbGV0IGNsYXVzZSA9IG51bGwKICAgIGZ1bmN0aW9uIHJlY3Vyc2UoY3VyLCBwcm9wKSB7Ly8gY29waWVkIGZyb20gZmxhdHRlbgogICAgICBpZiAoY3VyKSB7CiAgICAgICAgaWYgKGN1ci50eXBlID09PSAiTGltaXQiKSB7CiAgICAgICAgICBjbGF1c2UgPSBjdXIudmFsdWVbMF0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKE9iamVjdChjdXIpICE9PSBjdXIpIHsKICAgICAgICAvL3Jlc3VsdFtwcm9wXSA9IGN1cjsKCiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjdXIpKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjdXIubGVuZ3RoOyBpIDwgbDsgaSsrKQogICAgICAgICAgcmVjdXJzZShjdXJbaV0sIHByb3AgKyAiWyIgKyBpICsgIl0iKTsKICAgICAgICBpZiAobCA9PT0gMCkgewogICAgICAgICAgLy9yZXN1bHRbcHJvcF0gPSBbXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGlzRW1wdHkgPSB0cnVlOwogICAgICAgIGZvciAodmFyIHAgaW4gY3VyKSB7CiAgICAgICAgICBpc0VtcHR5ID0gZmFsc2U7CiAgICAgICAgICByZWN1cnNlKGN1cltwXSwgcHJvcCA/IHByb3AgKyAiLiIgKyBwIDogcCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc0VtcHR5ICYmIHByb3ApIHsKICAgICAgICAgIC8vcmVzdWx0W3Byb3BdID0ge307CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZWN1cnNlKGFzdC52YWx1ZS5saW1pdCwgIiIpOwogICAgcmV0dXJuIGNsYXVzZQoKICB9CgoKCiAgZnVuY3Rpb24gYWRkX29uY2UoYXJyYXksIHZhbHVlKSB7IC8vYWRkIHRoZSB2YWx1ZSB0byB0aGUgYXJyYXkgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUKICAgIGlmIChhcnJheS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHsKICAgICAgYXJyYXkucHVzaCh2YWx1ZSkKICAgIH0KICB9CgogIHJldHVybiB7IHBhcnNlIH0KfSgpCg==
person
navigate_before Table of Contents expand_more navigate_next
Loading Page hourglass_empty