ZGlmZiAtLWdpdCBhL2FsbCBiL2FsbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMmFjYWYzCi0tLSAvZGV2L251bGwKKysrIGIvYWxsCkBAIC0wLDAgKzEsNyBAQAorY2QgdGVzdGVzCit1bGltaXQgLVMgLXMgMjAwMAoraWYgeyAuLi9sdWEgYWxsLmx1YTsgfSB0aGVuIAorICBlY2hvIC1lICJcblxuICAgIGZpbmFsIE9LISEhIVxuXG4iCitlbHNlCisgIGVjaG8gLWUgIlxuXG4gICAgPj4+PiBCVUchISEhXG5cbiIKK2ZpCmRpZmYgLS1naXQgYS9tYW51YWwvMmh0bWwgYi9tYW51YWwvMmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDRiMmM2MQotLS0gL2Rldi9udWxsCisrKyBiL21hbnVhbC8yaHRtbApAQCAtMCwwICsxLDUxOCBAQAorIyEvdXNyL2Jpbi9lbnYgbHVhNS4zCisKKworLS0gc3BlY2lhbCBtYXJrczoKKy0tIFwxIC0gcGFyYWdyYXBoIChlbXB0eSBsaW5lKQorLS0gXDQgLSByZW1vdmUgc3BhY2VzIGFyb3VuZCBpdAorLS0gXDMgLSByZWYgKGZvbGxvd2VkIGJ5IGxhYmVsfCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitoZWFkZXIgPSBbWworPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgorPGh0bWw+CisKKzxoZWFkPgorPHRpdGxlPkx1YSA1LjQgUmVmZXJlbmNlIE1hbnVhbDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04Ij4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibHVhLmNzcyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Im1hbnVhbC5jc3MiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKworPGhyPgorPGgxPgorPGEgaHJlZj0iaHR0cDovL3d3dy5sdWEub3JnL2hvbWUuaHRtbCI+PGltZyBzcmM9ImxvZ28uZ2lmIiBhbHQ9IltMdWEgbG9nb10iIGJvcmRlcj0iMCI+PC9hPgorTHVhIDUuNCBSZWZlcmVuY2UgTWFudWFsCis8L2gxPgorCitieSBSb2JlcnRvIEllcnVzYWxpbXNjaHksIEx1aXogSGVucmlxdWUgZGUgRmlndWVpcmVkbywgV2FsZGVtYXIgQ2VsZXMKKzxwPgorPHNtYWxsPgorPGEgaHJlZj0iaHR0cDovL3d3dy5sdWEub3JnL2NvcHlyaWdodC5odG1sIj5Db3B5cmlnaHQ8L2E+CismY29weTsgMjAxOCBMdWEub3JnLCBQVUMtUmlvLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKzwvc21hbGw+Cis8aHI+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzxwPgorCitdXQorCitmb290ZXIgPSAiXG5cbjwvYm9keT48L2h0bWw+XG5cbiIKKworbG9jYWwgc2VlZm10ID0gJyhzZWUgJXMpJworCitpZiBhcmdbMV0gPT0gJ3BvcnQnIHRoZW4KKyAgc2VlZm10ID0gJyh2ZXIgJXMpJworICBoZWFkZXIgPSBzdHJpbmcuZ3N1YihoZWFkZXIsICJieSAoLi0pXG4iLAorICAiJTFcbjxwPlRyYWR1JmNjZWRpbDsmYXRpbGRlO286IFMmZWFjdXRlO3JnaW8gUXVlaXJveiBkZSBNZWRlaXJvcyIsIDEpCisgIGhlYWRlciA9IHN0cmluZy5nc3ViKGhlYWRlciwgIkx1YSAoJWQrLiVkKykgUmVmZXJlbmNlIE1hbnVhbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hbnVhbCBkZSBSZWZlciZlY2lyYztuY2lhIGRlIEx1YSAlMSIpCisgIGhlYWRlciA9IHN0cmluZy5nc3ViKGhlYWRlciwgIkFsbCByaWdodHMgcmVzZXJ2ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb2RvcyBvcyBkaXJlaXRvcyByZXNlcnZhZG9zIikKK2VuZAorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitsb2NhbCBmdW5jdGlvbiBjb21wb3NlIChmLGcpCisgIGFzc2VydChmIGFuZCBnKQorICByZXR1cm4gZnVuY3Rpb24gKHMpIHJldHVybiBnKGYocykpIGVuZAorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIGNvbmNhdCAoZiwgZykKKyAgYXNzZXJ0KGYgYW5kIGcpCisgIHJldHVybiBmdW5jdGlvbiAocykgcmV0dXJuIGYocykgLi4gZyhzKSBlbmQKK2VuZAorCisKK2xvY2FsIFRhZyA9IHt9CisKKworc2V0bWV0YXRhYmxlKFRhZywgeworICBfX2luZGV4ID0gZnVuY3Rpb24gKHQsIHRhZykKKyAgICAgIGxvY2FsIHYgPSBmdW5jdGlvbiAobiwgYXR0KQorICAgICAgICBsb2NhbCBlID0gIiIKKyAgICAgICAgaWYgdHlwZShhdHQpID09ICJ0YWJsZSIgdGhlbgorICAgICAgICAgIGZvciBrLHYgaW4gcGFpcnMoYXR0KSBkbyBlID0gc3RyaW5nLmZvcm1hdCgnJXMgJXM9IiVzIicsIGUsIGssIHYpIGVuZAorICAgICAgICBlbmQKKyAgICAgICAgaWYgbiB0aGVuCisgICAgICAgICAgcmV0dXJuIHN0cmluZy5mb3JtYXQoIjwlcyVzPiVzPC8lcz4iLCB0YWcsIGUsIG4sIHRhZykKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBzdHJpbmcuZm9ybWF0KCI8JXMlcz4iLCB0YWcsIGUpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICB0W3RhZ10gPSB2CisgICAgICByZXR1cm4gdgorICBlbmQKK30pCisKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvY2FsIGxhYmVscyA9IHt9CisKKworbG9jYWwgZnVuY3Rpb24gYW5jaG9yICh0ZXh0LCBsYWJlbCwgbGluaywgdGV4dGxpbmspCisgIGlmIGxhYmVsc1tsYWJlbF0gdGhlbgorICAgIGVycm9yKCJsYWJlbCAiIC4uIGxhYmVsIC4uICIgYWxyZWFkeSBkZWZpbmVkIikKKyAgZW5kCisgIGxhYmVsc1tsYWJlbF0gPSB7dGV4dCA9IHRleHRsaW5rLCBsaW5rID0gbGlua30KKyAgcmV0dXJuIFRhZy5hKHRleHQsIHtuYW1lPWxpbmt9KQorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIG1ha2VyZWYgKGxhYmVsKQorICBhc3NlcnQobm90IHN0cmluZy5maW5kKGxhYmVsLCAifCIpKQorICByZXR1cm4gc3RyaW5nLmZvcm1hdCgiXDMlc1wzIiwgbGFiZWwpCitlbmQKKworbG9jYWwgZnVuY3Rpb24gcmVmIChsYWJlbCkKKyAgbG9jYWwgbCA9IGxhYmVsc1tsYWJlbF0KKyAgaWYgbm90IGwgdGhlbgorICAgIGlvLnN0ZGVycjp3cml0ZSgibGFiZWwgIiwgbGFiZWwsICIgdW5kZWZpbmVkXG4iKQorICAgIHJldHVybiAiQEBAQEBAQCIKKyAgZWxzZQorICAgIHJldHVybiBUYWcuYShsLnRleHQsIHtocmVmPSIjIi4ubC5saW5rfSkKKyAgZW5kCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBmdW5jdGlvbiBub3BhcmEgKHQpCisgIHQgPSBzdHJpbmcuZ3N1Yih0LCAiXDEiLCAiXG5cbiIpCisgIHQgPSBzdHJpbmcuZ3N1Yih0LCAiPHA+JXMqPC9wPiIsICIiKQorICByZXR1cm4gdAorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIGZpeHBhcmEgKHQpCisgIHQgPSBzdHJpbmcuZ3N1Yih0LCAiXDEiLCAiXG48L3A+XG5cbjxwPlxuIikKKyAgdCA9IHN0cmluZy5nc3ViKHQsICI8cD4lcyo8L3A+IiwgIiIpCisgIHJldHVybiB0CitlbmQKKworbG9jYWwgZnVuY3Rpb24gYW50aXBhcmEgKHQpCisgIHJldHVybiAiPC9wPlxuIiAuLiB0IC4uICI8cD4iCitlbmQKKworCitUYWcucHJlID0gY29tcG9zZShUYWcucHJlLCBhbnRpcGFyYSkKK1RhZy51bCA9IGNvbXBvc2UoVGFnLnVsLCBhbnRpcGFyYSkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBHZm9vdHMgPSAwCitsb2NhbCBmb290bm90ZXMgPSB7fQorCitsb2NhbCBsaW5lID0gVGFnLmhyKG5pbCkKKworbG9jYWwgZnVuY3Rpb24gZGlzY2hhcmdlZm9vdHMgKCkKKyAgaWYgI2Zvb3Rub3RlcyA9PSAwIHRoZW4gcmV0dXJuICIiIGVuZAorICBsb2NhbCBmbiA9IHRhYmxlLmNvbmNhdChmb290bm90ZXMpCisgIGZvb3Rub3RlcyA9IHt9CisgIHJldHVybiBsaW5lIC4uIFRhZy5oMyJmb290bm90ZXM6IiAuLiBmbiAuLiBsaW5lCitlbmQKKworCitsb2NhbCBHbGlzdHMgPSAwCitsb2NhbCBsaXN0aW5ncyA9IHt9CisKK2xvY2FsIGZ1bmN0aW9uIGRpc2NoYXJnZWxpc3QgKCkKKyAgaWYgI2xpc3RpbmdzID09IDAgdGhlbiByZXR1cm4gIiIgZW5kCisgIGxvY2FsIGwgPSBsaXN0aW5ncworICBsaXN0aW5ncyA9IHt9CisgIHJldHVybiBsaW5lIC4uIHRhYmxlLmNvbmNhdChsLCBsaW5lLi5saW5lKSAuLiBsaW5lCitlbmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2NhbCBjb3VudGVycyA9IHsKK2gxID0ge3ZhbCA9IDF9LAoraDIgPSB7ZmF0aGVyID0gImgxIiwgdmFsID0gMX0sCitoMyA9IHtmYXRoZXIgPSAiaDIiLCB2YWwgPSAxfSwKK2xpc3RpbmcgPSB7ZmF0aGVyID0gImgxIiwgdmFsID0gMX0sCit9CisKK2xvY2FsIGZ1bmN0aW9uIGluY2NvdW50ZXIgKGNvdW50KQorICBjb3VudGVyc1tjb3VudF0udmFsID0gY291bnRlcnNbY291bnRdLnZhbCArIDEKKyAgZm9yIGMsIHYgaW4gcGFpcnMoY291bnRlcnMpIGRvCisgICAgaWYgdi5mYXRoZXIgPT0gY291bnQgdGhlbiB2LnZhbCA9IDEgZW5kCisgIGVuZAorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIGdldGNvdW50ZXIgKGNvdW50KQorICBsb2NhbCBjID0gY291bnRlcnNbY291bnRdCisgIGlmIGMuZmF0aGVyIHRoZW4KKyAgICByZXR1cm4gZ2V0Y291bnRlcihjLmZhdGhlcikgLi4gIi4iIC4uIGMudmFsCisgIGVsc2UKKyAgICByZXR1cm4gYy52YWwgLi4gIiIKKyAgZW5kCitlbmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2xvY2FsIGZ1bmN0aW9uIGZpeGVkICh4KQorICByZXR1cm4gZnVuY3Rpb24gKCkgcmV0dXJuIHggZW5kCitlbmQKKworbG9jYWwgZnVuY3Rpb24gaWQgKHgpIHJldHVybiB4IGVuZAorCisKK2xvY2FsIGZ1bmN0aW9uIHByZXBvcyAoeCwgeSkKKyAgYXNzZXJ0KHggYW5kIHkpCisgIHJldHVybiBmdW5jdGlvbiAocykgcmV0dXJuIHN0cmluZy5mb3JtYXQoIiVzJXMlcyIsIHgsIHMsIHkpIGVuZAorZW5kCisKKworbG9jYWwgcncgPSBUYWcuYgorCisKKworCitsb2NhbCBmdW5jdGlvbiBMdWFOYW1lIChuYW1lKQorICByZXR1cm4gVGFnLmNvZGUobmFtZSkKK2VuZAorCisKK2xvY2FsIGZ1bmN0aW9uIGdldHBhcmFtIChzKQorICBsb2NhbCBpLCBlID0gc3RyaW5nLmZpbmQocywgIl5bXiVzQHxdK3wiKQorICBpZiBub3QgaSB0aGVuIHJldHVybiBuaWwsIHMKKyAgZWxzZSByZXR1cm4gc3RyaW5nLnN1YihzLCBpLCBlIC0gMSksIHN0cmluZy5zdWIocywgZSArIDEpCisgIGVuZAorZW5kCisKKworbG9jYWwgZnVuY3Rpb24gZ2V0dGl0bGUgKGgpCisgIGxvY2FsIHRpdGxlLCBwID0gYXNzZXJ0KHN0cmluZy5tYXRjaChoLCAiPHRpdGxlPiguLSk8L3RpdGxlPigpIikpCisgIHJldHVybiB0aXRsZSwgc3RyaW5nLnN1YihoLCBwKQorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIGdldHBhcmFtdGl0bGUgKHdoYXQsIGgsIG5vbnVtKQorICAgIGxvY2FsIGxhYmVsLCB0aXRsZSwgYywgY291bnQKKyAgICBsYWJlbCwgaCA9IGdldHBhcmFtKGgpCisgICAgdGl0bGUsIGggPSBnZXR0aXRsZShoKQorICAgIGlmIG5vdCBub251bSB0aGVuCisgICAgICBjb3VudCA9IGdldGNvdW50ZXIod2hhdCkKKyAgICAgIGluY2NvdW50ZXIod2hhdCkKKyAgICAgIGMgPSBzdHJpbmcuZm9ybWF0KCIlcyAmbmRhc2g7ICIsIGNvdW50KQorICAgIGVsc2UKKyAgICAgIGMgPSAiIgorICAgIGVuZAorICAgIGxhYmVsID0gbGFiZWwgb3IgY291bnQKKyAgICBpZiBsYWJlbCB0aGVuCisgICAgICB0aXRsZSA9IGFuY2hvcih0aXRsZSwgbGFiZWwsIGNvdW50LCAiJnNlY3Q7Ii4uY291bnQpCisgICAgZW5kCisgICAgdGl0bGUgPSBzdHJpbmcuZm9ybWF0KCIlcyVzIiwgYywgdGl0bGUpCisgICAgcmV0dXJuIHRpdGxlLCBoCitlbmQKKworbG9jYWwgZnVuY3Rpb24gc2VjdGlvbiAod2hhdCwgbm9udW0pCisgIHJldHVybiBmdW5jdGlvbiAoaCkKKyAgICBsb2NhbCB0aXRsZQorICAgIHRpdGxlLCBoID0gZ2V0cGFyYW10aXRsZSh3aGF0LCBoLCBub251bSkKKyAgICBsb2NhbCBmbiA9IHdoYXQgPT0gImgxIiBhbmQgZGlzY2hhcmdlZm9vdHMoKSBvciAiIgorICAgIGggPSBmaXhwYXJhKFRhZy5wKGgpKQorICAgIHJldHVybiAiPC9wPlxuIiAuLiBUYWdbd2hhdF0odGl0bGUpIC4uIGggLi4gZm4gLi4KKyAgICAgICAgICAgZGlzY2hhcmdlbGlzdCgpIC4uICI8cD4iCisgIGVuZAorZW5kCisKKworbG9jYWwgZnVuY3Rpb24gdmVyYmF0aW0gKHMpCisgIHMgPSBub3BhcmEocykKKyAgcyA9IHN0cmluZy5nc3ViKHMsICJcbiIsICJcbiAgICAgIikKKyAgcyA9IHN0cmluZy5nc3ViKHMsICJcbiVzKiQiLCAiXG4iKQorICByZXR1cm4gVGFnLnByZShzKQorZW5kCisKKworbG9jYWwgZnVuY3Rpb24gdmVyYiAocykKKyAgcmV0dXJuIFRhZy5jb2RlKHMpCitlbmQKKworCitsb2NhbCBmdW5jdGlvbiBsdWEybGluayAoZSkKKyAgcmV0dXJuIHN0cmluZy5maW5kKGUsICJsdWFMP18iKSBhbmQgZSBvciAicGRmLSIuLmUKK2VuZAorCisKK2xvY2FsIHZlcmJmaXhlZCA9IHZlcmIKKworCitsb2NhbCBUZXggPSB7CisKK0FOU0kgPSBmdW5jdGlvbiAoZnVuYykKKyAgICAgICAgICAgcmV0dXJuICJJU08mbmJzcDtDIGZ1bmN0aW9uICIgLi4gVGFnLmNvZGUoZnVuYykKKyAgICAgICAgIGVuZCwKK0F0ID0gZml4ZWQiQCIsCitCID0gVGFnLmIsCitiaWdza2lwID0gZml4ZWQiIiwKK2JpZ251bSA9IGlkLAorQyA9IGZpeGVkIiIsCitDaSA9IHByZXBvcygiPCEtLSAiLCAiIC0tPiIpLAorQ0lkID0gZnVuY3Rpb24gKGZ1bmMpCisgICAgICAgIHJldHVybiAiQyZuYnNwO2Z1bmN0aW9uICIgLi4gVGFnLmNvZGUoZnVuYykKKyAgICAgIGVuZCwKK2NoYXB0ZXIgPSBzZWN0aW9uImgxIiwKK0NoYXIgPSBjb21wb3NlKHZlcmJmaXhlZCwgcHJlcG9zKCInIiwgIiciKSksCitDZG90cyA9IGZpeGVkIiZtaWRkb3Q7Jm1pZGRvdDsmbWlkZG90OyIsCitDbG9zZSA9IGZpeGVkIn0iLAorY29sID0gVGFnLnRkLAorZGVmaWQgPSBmdW5jdGlvbiAobmFtZSkKKyAgICAgICAgICBsb2NhbCBsID0gbHVhMmxpbmsobmFtZSkKKyAgICAgICAgICBsb2NhbCBjID0gVGFnLmNvZGUobmFtZSkKKyAgICAgICAgICByZXR1cm4gYW5jaG9yKGMsIGwsIGwsIGMpCisgICAgICAgIGVuZCwKK2RlZiA9IFRhZy5lbSwKK2Rlc2NyaXB0aW9uID0gY29tcG9zZShub3BhcmEsIFRhZy51bCksCitFbSA9IGZpeGVkKCJcNCIgLi4gIiZtZGFzaDsiIC4uICJcNCIpLAorZW1waCA9IFRhZy5lbSwKK2VtcGh4ID0gVGFnLmVtLCAgICAtLSBlbXBoYXNpcyBwbHVzIGluZGV4IChpZiB0aGVyZSB3YXMgYW4gaW5kZXgpCitFbiA9IGZpeGVkKCImbmRhc2g7IiksCitmb3JtYXQgPSBmaXhlZCIiLAorWyJmYWxzZSJdID0gZml4ZWQoVGFnLmIiZmFsc2UiKSwKK2lkID0gVGFnLmNvZGUsCitpZHggPSBUYWcuY29kZSwKK2luZGV4ID0gZml4ZWQiIiwKK0xpZHggPSBmaXhlZCIiLCAgLS0gVGFnLmNvZGUsCitsZG90cyA9IGZpeGVkIi4uLiIsCit4ID0gaWQsCitpdGVtaXplID0gY29tcG9zZShub3BhcmEsIFRhZy51bCksCitsZXEgPSBmaXhlZCImbGU7IiwKK0xpZCA9IGZ1bmN0aW9uIChzKQorICAgICAgICByZXR1cm4gbWFrZXJlZihsdWEybGluayhzKSkKKyAgICAgIGVuZCwKK00gPSBUYWcuZW0sCitOID0gZnVuY3Rpb24gKHMpIHJldHVybiAoc3RyaW5nLmdzdWIocywgIiAiLCAiJm5ic3A7IikpIGVuZCwKK05FID0gaWQsICAgICAgICAtLSB0YWciZm9yZWlnbnBocmFzZSIsCitudW0gPSBpZCwKK1sibmlsIl0gPSBmaXhlZChUYWcuYiJuaWwiKSwKK09wZW4gPSBmaXhlZCJ7IiwKK3BhcnQgPSBzZWN0aW9uKCJoMSIsIHRydWUpLAorUGF0ID0gY29tcG9zZSh2ZXJiZml4ZWQsIHByZXBvcygiJyIsICInIikpLAorcHJlZmFjZSA9IHNlY3Rpb24oImgxIiwgdHJ1ZSksCitwc2VjdCA9IHNlY3Rpb24oImgyIiwgdHJ1ZSksCitRID0gcHJlcG9zKCciJywgJyInKSwKK3JlZmNocCA9IG1ha2VyZWYsCityZWZjb2RlID0gbWFrZXJlZiwKK3JlZnNlYyA9IG1ha2VyZWYsCisKK3BpID0gZml4ZWQiJnBpOyIsCityZXAgPSBUYWcuZW0sICAtLSBjb21wb3NlKHByZXBvcygiJmx0OyIsICImZ3Q7IiksIFRhZy5lbSksCitSdyA9IHJ3LAorcncgPSBydywKK3NiID0gVGFnLnN1YiwKK3NwID0gVGFnLnN1cCwKK1N0ID0gY29tcG9zZSh2ZXJiZml4ZWQsIHByZXBvcygnIicsICciJykpLAorc2VjdDEgPSBzZWN0aW9uImgxIiwKK3NlY3QyID0gc2VjdGlvbiJoMiIsCitzZWN0MyA9IHNlY3Rpb24iaDMiLAorc2VjdDQgPSBzZWN0aW9uKCJoNCIsIHRydWUpLAorc2ltcGxlc2VjdCA9IGlkLAorVGFiMiA9IGZ1bmN0aW9uIChzKSByZXR1cm4gVGFnLnRhYmxlKHMsIHtib3JkZXI9MX0pIGVuZCwKK3JvdyA9IFRhZy50ciwKK3RpdGxlID0gVGFnLnRpdGxlLAordG9kbyA9IFRhZy50b2RvLAorWyJ0cnVlIl0gPSBmaXhlZChUYWcuYiJ0cnVlIiksCitUID0gdmVyYiwKKworaXRlbSA9IGZ1bmN0aW9uIChzKQorICAgICAgICAgbG9jYWwgdCwgcCA9IHN0cmluZy5tYXRjaChzLCAiXihbXlxufF0rKXwoKSIpCisgICAgICAgICBpZiB0IHRoZW4KKyAgICAgICAgICAgcyA9IHN0cmluZy5zdWIocywgcCkKKyAgICAgICAgICAgcyA9IFRhZy5iKHQuLiI6ICIpIC4uIHMKKyAgICAgICAgIGVuZAorICAgICAgICAgcmV0dXJuIFRhZy5saShmaXhwYXJhKHMpKQorICAgICAgIGVuZCwKKwordmVyYmF0aW0gPSB2ZXJiYXRpbSwKKworbWFudWFsID0gaWQsCisKKworLS0gZm9yIHRoZSBtYW51YWwKKworbGluayA9ZnVuY3Rpb24gKHMpCisgIGxvY2FsIGwsIHQgPSBnZXRwYXJhbShzKQorICBhc3NlcnQobCkKKyAgcmV0dXJuIHN0cmluZy5mb3JtYXQoIiVzICglcykiLCB0LCBtYWtlcmVmKGwpKQorZW5kLAorCitzZWUgPSBmdW5jdGlvbiAocykgcmV0dXJuIHN0cmluZy5mb3JtYXQoc2VlZm10LCBtYWtlcmVmKHMpKSBlbmQsCitTZWUgPSBtYWtlcmVmLAorc2VlQyA9IGZ1bmN0aW9uIChzKQorICAgICAgICAgcmV0dXJuIHN0cmluZy5mb3JtYXQoc2VlZm10LCBtYWtlcmVmKHMpKQorICAgICAgIGVuZCwKKworc2VlRiA9IGZ1bmN0aW9uIChzKQorICAgICAgICAgcmV0dXJuIHN0cmluZy5mb3JtYXQoc2VlZm10LCBtYWtlcmVmKGx1YTJsaW5rKHMpKSkKKyAgICAgICBlbmQsCisKK0FQSUVudHJ5ID0gZnVuY3Rpb24gKGUpCisgIGxvY2FsIGgsIG5hbWUKKyAgaCwgZSA9IHN0cmluZy5tYXRjaChlLCAiXiVzKiguLSklcyp8KC4qKSQiKQorICBuYW1lID0gc3RyaW5nLm1hdGNoKGgsICIobHVhTD9fWyV3X10rKSUpPyArJSgiKSBvcgorICAgICAgICAgc3RyaW5nLm1hdGNoKGgsICJsdWFMP19bJXdfXSsiKQorICBsb2NhbCBhID0gYW5jaG9yKFRhZy5jb2RlKG5hbWUpLCBuYW1lLCBuYW1lLCBUYWcuY29kZShuYW1lKSkKKyAgbG9jYWwgYXBpaWNtZCwgbmUgPSBzdHJpbmcubWF0Y2goZSwgIl4oLi08L3NwYW4+KSguKikiKQorLS1pby5zdGRlcnI6d3JpdGUoZSkKKyAgaWYgbm90IGFwaWljbWQgdGhlbgorICAgIHJldHVybiBhbnRpcGFyYShUYWcuaHIoKSAuLiBUYWcuaDMoYSkpIC4uIFRhZy5wcmUoaCkgLi4gZQorICBlbHNlCisgICAgcmV0dXJuIGFudGlwYXJhKFRhZy5ocigpIC4uIFRhZy5oMyhhKSkgLi4gYXBpaWNtZCAuLiBUYWcucHJlKGgpIC4uIG5lCisgIGVuZAorZW5kLAorCitMaWJFbnRyeSA9IGZ1bmN0aW9uIChlKQorICBsb2NhbCBoLCBuYW1lCisgIGgsIGUgPSBzdHJpbmcubWF0Y2goZSwgIl4oLi0pfCguKikkIikKKyAgbmFtZSA9IHN0cmluZy5nc3ViKGgsICIgKC4rIiwgIiIpCisgIGxvY2FsIGwgPSBsdWEybGluayhuYW1lKQorICBsb2NhbCBhID0gYW5jaG9yKFRhZy5jb2RlKGgpLCBsLCBsLCBUYWcuY29kZShuYW1lKSkKKyAgcmV0dXJuIFRhZy5ocigpIC4uIFRhZy5oMyhhKSAuLiBlCitlbmQsCisKK1Byb2R1YyA9IGNvbXBvc2Uobm9wYXJhLCBUYWcucHJlKSwKK3Byb2R1Y25hbWUgPSBwcmVwb3MoIlx0IiwgIiA6Oj0gIiksCitPciA9IGZpeGVkIiB8ICIsCitWZXJCYXIgPSBmaXhlZCImIzEyNDsiLCAgLS0gdmVydGljYWwgYmFyCitPck5MID0gZml4ZWQiIHwgXDQiLAorYm5mTnRlciA9IHByZXBvcygiIiwgIiIpLAorYm5mb3B0ID0gcHJlcG9zKCJbIiwgIl0iKSwKK2JuZnJlcCA9IHByZXBvcygieyIsICJ9IiksCitibmZ0ZXIgPSBjb21wb3NlKFRhZy5iLCBwcmVwb3MoIiZsc3F1bzsiLCAiJnJzcXVvOyIpKSwKK3Byb2R1Y2JvZHkgPSBmdW5jdGlvbiAocykKKyAgICAgICAgICAgcyA9IHN0cmluZy5nc3ViKHMsICIlcysiLCAiICIpCisgICAgICAgICAgIHMgPSBzdHJpbmcuZ3N1YihzLCAiXDQiLCAiXG5cdFx0IikKKyAgICAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgIGVuZCwKKworYXBpaSA9IGZ1bmN0aW9uIChzKQorICAgICAgICBsb2NhbCBwb3AscHVzaCxlcnIgPSBzdHJpbmcubWF0Y2gocywgIl4oLi0pLCguLSksKC4qKSQiKQorICAgICAgICBpZiBwb3Agfj0gIj8iIGFuZCBzdHJpbmcuZmluZChwb3AsICIlVyIpIHRoZW4KKyAgICAgICAgICBwb3AgPSAiKCIgLi4gcG9wIC4uICIpIgorICAgICAgICBlbmQKKyAgICAgICAgaWYgcHVzaCB+PSAiPyIgYW5kIHN0cmluZy5maW5kKHB1c2gsICIlVyIpIHRoZW4KKyAgICAgICAgICBwdXNoID0gIigiIC4uIHB1c2ggLi4gIikiCisgICAgICAgIGVuZAorICAgICAgICBlcnIgPSAoZXJyID09ICItIikgYW5kICImbmRhc2g7IiBvciBUYWcuZW0oZXJyKQorICAgICAgICByZXR1cm4gVGFnLnNwYW4oCisgICAgICAgICAgICAgICAgIHN0cmluZy5mb3JtYXQoIlstJXMsICslcywgJXNdIiwgcG9wLCBwdXNoLCBlcnIpLAorICAgICAgICAgICAgICAgICB7Y2xhc3M9ImFwaWkifQorICAgICAgICAgICAgICAgKQorICAgICAgZW5kLAorfQorCitsb2NhbCBvdGhlcnMgPSBwcmVwb3MoIj8/ICIsIiA/PyIpCisKK2xvY2FsIGZ1bmN0aW9uIHRyYXRhICh0KQorICB0ID0gc3RyaW5nLmdzdWIodCwgIkAoJXcrKSglYnt9KSIsIGZ1bmN0aW9uICh3LCBmKQorICAgICAgICBmID0gdHJhdGEoc3RyaW5nLnN1YihmLCAyLCAtMikpCisgICAgICAgIGlmIHR5cGUoVGV4W3ddKSB+PSAiZnVuY3Rpb24iIHRoZW4KKyAgICAgICAgIGlvLnN0ZGVycjp3cml0ZSh3IC4uICJcbiIpCisgICAgICAgICByZXR1cm4gb3RoZXJzKGYpCisgICAgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiBUZXhbd10oZiwgdykKKyAgICAgICAgZW5kCisgICAgICBlbmQpCisgIHJldHVybiB0CitlbmQKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSByZWFkIHdob2xlIGJvb2sKK3QgPSBpby5yZWFkIiphIgorCit0ID0gc3RyaW5nLmdzdWIodCwgIls8PiZcMTI4LVwyNTVdIiwKKyAge1siPCJdID0gIiZsdDsiLAorICAgWyI+Il0gPSAiJmd0OyIsCisgICBbIiYiXSA9ICImYW1wOyIsCisgICBbIlwxNzAiXSA9ICImb3JkZjsiLAorICAgWyJcMTg2Il0gPSAiJm9yZG07IiwKKyAgIFsiXDE5MiJdID0gIiZBZ3JhdmU7IiwKKyAgIFsiXDE5MyJdID0gIiZBYWN1dGU7IiwKKyAgIFsiXDE5NCJdID0gIiZBY2lyYzsiLAorICAgWyJcMTk1Il0gPSAiJkF0aWxkZTsiLAorICAgWyJcMTk5Il0gPSAiJkNjZWRpbDsiLAorICAgWyJcMjAxIl0gPSAiJkVhY3V0ZTsiLAorICAgWyJcMjAyIl0gPSAiJkVjaXJjOyIsCisgICBbIlwyMDUiXSA9ICImSWFjdXRlOyIsCisgICBbIlwyMTEiXSA9ICImT2FjdXRlOyIsCisgICBbIlwyMTIiXSA9ICImT2NpcmM7IiwKKyAgIFsiXDIxOCJdID0gIiZVYWN1dGU7IiwKKyAgIFsiXDIyNCJdID0gIiZhZ3JhdmU7IiwKKyAgIFsiXDIyNSJdID0gIiZhYWN1dGU7IiwKKyAgIFsiXDIyNiJdID0gIiZhY2lyYzsiLAorICAgWyJcMjI3Il0gPSAiJmF0aWxkZTsiLAorICAgWyJcMjMxIl0gPSAiJmNjZWRpbDsiLAorICAgWyJcMjMzIl0gPSAiJmVhY3V0ZTsiLAorICAgWyJcMjM0Il0gPSAiJmVjaXJjOyIsCisgICBbIlwyMzciXSA9ICImaWFjdXRlOyIsCisgICBbIlwyNDMiXSA9ICImb2FjdXRlOyIsCisgICBbIlwyNDQiXSA9ICImb2NpcmM7IiwKKyAgIFsiXDI0NSJdID0gIiZvdGlsZGU7IiwKKyAgIFsiXDI1MCJdID0gIiZ1YWN1dGU7IiwKKyAgIFsiXDI1MiJdID0gIiZ1dW1sOyIKKyAgfSkKKwordCA9IHN0cmluZy5nc3ViKHQsICJcblxuKyIsICJcMSIpCisKKworCistLSBjb21wbGV0ZSBtYWNyb3Mgd2l0aCBubyBhcmd1bWVudHMKK3QgPSBzdHJpbmcuZ3N1Yih0LCAiKEAldyspKFteeyV3XSkiLCAiJTF7fSUyIikKKwordCA9IHRyYXRhKHQpCisKKy0tIGNvcnJlY3QgcmVmZXJlbmNlcwordCA9IHN0cmluZy5nc3ViKHQsICJcMyguLSlcMyIsIHJlZikKKworLS0gcmVtb3ZlIGV4dHJhIHNwYWNlICg/PykKK3QgPSBzdHJpbmcuZ3N1Yih0LCAiJXMqXDQlcyoiLCAiIikKKwordCA9IG5vcGFyYSh0KQorCistLSBIVE1MIDMuMiBkb2VzIG5vdCBuZWVkIDwvcD4gKGJ1dCBjb21wbGFpbnMgd2hlbiBpdCBpcyBpbiB3cm9uZyBwbGFjZXMgOikKK3QgPSBzdHJpbmcuZ3N1Yih0LCAiPC9wPiIsICIiKQorCitpby53cml0ZShoZWFkZXIsIHQsIGZvb3RlcikKKwpkaWZmIC0tZ2l0IGEvbWFudWFsL21hbnVhbC5vZiBiL21hbnVhbC9tYW51YWwub2YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1OTkwZAotLS0gL2Rldi9udWxsCisrKyBiL21hbnVhbC9tYW51YWwub2YKQEAgLTAsMCArMSw4NzA0IEBACitAQ2l7JElkOiBtYW51YWwub2YsdiAxLjE3NSAyMDE4LzA2LzE4IDE5OjE3OjM1IHJvYmVydG8gRXhwICR9CitAQ3tbKC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS19CitAbWFudWFseworCitAc2VjdDF7QHRpdGxle0ludHJvZHVjdGlvbn0KKworTHVhIGlzIGEgcG93ZXJmdWwsIGVmZmljaWVudCwgbGlnaHR3ZWlnaHQsIGVtYmVkZGFibGUgc2NyaXB0aW5nIGxhbmd1YWdlLgorSXQgc3VwcG9ydHMgcHJvY2VkdXJhbCBwcm9ncmFtbWluZywKK29iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZywgZnVuY3Rpb25hbCBwcm9ncmFtbWluZywKK2RhdGEtZHJpdmVuIHByb2dyYW1taW5nLCBhbmQgZGF0YSBkZXNjcmlwdGlvbi4KKworTHVhIGNvbWJpbmVzIHNpbXBsZSBwcm9jZWR1cmFsIHN5bnRheCB3aXRoIHBvd2VyZnVsIGRhdGEgZGVzY3JpcHRpb24KK2NvbnN0cnVjdHMgYmFzZWQgb24gYXNzb2NpYXRpdmUgYXJyYXlzIGFuZCBleHRlbnNpYmxlIHNlbWFudGljcy4KK0x1YSBpcyBkeW5hbWljYWxseSB0eXBlZCwKK3J1bnMgYnkgaW50ZXJwcmV0aW5nIGJ5dGVjb2RlIHdpdGggYSByZWdpc3Rlci1iYXNlZAordmlydHVhbCBtYWNoaW5lLAorYW5kIGhhcyBhdXRvbWF0aWMgbWVtb3J5IG1hbmFnZW1lbnQgd2l0aAoraW5jcmVtZW50YWwgZ2FyYmFnZSBjb2xsZWN0aW9uLAorbWFraW5nIGl0IGlkZWFsIGZvciBjb25maWd1cmF0aW9uLCBzY3JpcHRpbmcsCithbmQgcmFwaWQgcHJvdG90eXBpbmcuCisKK0x1YSBpcyBpbXBsZW1lbnRlZCBhcyBhIGxpYnJhcnksIHdyaXR0ZW4gaW4gQGVtcGh4e2NsZWFuIEN9LAordGhlIGNvbW1vbiBzdWJzZXQgb2YgQE57U3RhbmRhcmQgQ30gYW5kIEMrKy4KK1RoZSBMdWEgZGlzdHJpYnV0aW9uIGluY2x1ZGVzIGEgaG9zdCBwcm9ncmFtIGNhbGxlZCBAaWR7bHVhfSwKK3doaWNoIHVzZXMgdGhlIEx1YSBsaWJyYXJ5IHRvIG9mZmVyIGEgY29tcGxldGUsCitzdGFuZGFsb25lIEx1YSBpbnRlcnByZXRlciwKK2ZvciBpbnRlcmFjdGl2ZSBvciBiYXRjaCB1c2UuCitMdWEgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBib3RoIGFzIGEgcG93ZXJmdWwsIGxpZ2h0d2VpZ2h0LAorZW1iZWRkYWJsZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgZm9yIGFueSBwcm9ncmFtIHRoYXQgbmVlZHMgb25lLAorYW5kIGFzIGEgcG93ZXJmdWwgYnV0IGxpZ2h0d2VpZ2h0IGFuZCBlZmZpY2llbnQgc3RhbmQtYWxvbmUgbGFuZ3VhZ2UuCisKK0FzIGFuIGV4dGVuc2lvbiBsYW5ndWFnZSwgTHVhIGhhcyBubyBub3Rpb24gb2YgYSBAUXttYWlufSBwcm9ncmFtOgoraXQgd29ya3MgQGVtcGh7ZW1iZWRkZWR9IGluIGEgaG9zdCBjbGllbnQsCitjYWxsZWQgdGhlIEBlbXBoe2VtYmVkZGluZyBwcm9ncmFtfSBvciBzaW1wbHkgdGhlIEBlbXBoeHtob3N0fS4KKyhGcmVxdWVudGx5LCB0aGlzIGhvc3QgaXMgdGhlIHN0YW5kLWFsb25lIEBpZHtsdWF9IHByb2dyYW0uKQorVGhlIGhvc3QgcHJvZ3JhbSBjYW4gaW52b2tlIGZ1bmN0aW9ucyB0byBleGVjdXRlIGEgcGllY2Ugb2YgTHVhIGNvZGUsCitjYW4gd3JpdGUgYW5kIHJlYWQgTHVhIHZhcmlhYmxlcywKK2FuZCBjYW4gcmVnaXN0ZXIgQE57QyBmdW5jdGlvbnN9IHRvIGJlIGNhbGxlZCBieSBMdWEgY29kZS4KK1Rocm91Z2ggdGhlIHVzZSBvZiBATntDIGZ1bmN0aW9uc30sIEx1YSBjYW4gYmUgYXVnbWVudGVkIHRvIGNvcGUgd2l0aAorYSB3aWRlIHJhbmdlIG9mIGRpZmZlcmVudCBkb21haW5zLAordGh1cyBjcmVhdGluZyBjdXN0b21pemVkIHByb2dyYW1taW5nIGxhbmd1YWdlcyBzaGFyaW5nIGEgc3ludGFjdGljYWwgZnJhbWV3b3JrLgorCitMdWEgaXMgZnJlZSBzb2Z0d2FyZSwKK2FuZCBpcyBwcm92aWRlZCBhcyB1c3VhbCB3aXRoIG5vIGd1YXJhbnRlZXMsCithcyBzdGF0ZWQgaW4gaXRzIGxpY2Vuc2UuCitUaGUgaW1wbGVtZW50YXRpb24gZGVzY3JpYmVkIGluIHRoaXMgbWFudWFsIGlzIGF2YWlsYWJsZQorYXQgTHVhJ3Mgb2ZmaWNpYWwgd2ViIHNpdGUsIEBpZHt3d3cubHVhLm9yZ30uCisKK0xpa2UgYW55IG90aGVyIHJlZmVyZW5jZSBtYW51YWwsCit0aGlzIGRvY3VtZW50IGlzIGRyeSBpbiBwbGFjZXMuCitGb3IgYSBkaXNjdXNzaW9uIG9mIHRoZSBkZWNpc2lvbnMgYmVoaW5kIHRoZSBkZXNpZ24gb2YgTHVhLAorc2VlIHRoZSB0ZWNobmljYWwgcGFwZXJzIGF2YWlsYWJsZSBhdCBMdWEncyB3ZWIgc2l0ZS4KK0ZvciBhIGRldGFpbGVkIGludHJvZHVjdGlvbiB0byBwcm9ncmFtbWluZyBpbiBMdWEsCitzZWUgUm9iZXJ0bydzIGJvb2ssIEBlbXBoeHtQcm9ncmFtbWluZyBpbiBMdWF9LgorCit9CisKKworQEN7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLX0KK0BzZWN0MXtiYXNpY3wgQHRpdGxle0Jhc2ljIENvbmNlcHRzfQorCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBiYXNpYyBjb25jZXB0cyBvZiB0aGUgbGFuZ3VhZ2UuCisKK0BzZWN0MntUeXBlc1NlY3wgQHRpdGxle1ZhbHVlcyBhbmQgVHlwZXN9CisKK0x1YSBpcyBhIGR5bmFtaWNhbGx5IHR5cGVkIGxhbmd1YWdlLgorVGhpcyBtZWFucyB0aGF0Cit2YXJpYWJsZXMgZG8gbm90IGhhdmUgdHlwZXM7IG9ubHkgdmFsdWVzIGRvLgorVGhlcmUgYXJlIG5vIHR5cGUgZGVmaW5pdGlvbnMgaW4gdGhlIGxhbmd1YWdlLgorQWxsIHZhbHVlcyBjYXJyeSB0aGVpciBvd24gdHlwZS4KKworQWxsIHZhbHVlcyBpbiBMdWEgYXJlIGZpcnN0LWNsYXNzIHZhbHVlcy4KK1RoaXMgbWVhbnMgdGhhdCBhbGwgdmFsdWVzIGNhbiBiZSBzdG9yZWQgaW4gdmFyaWFibGVzLAorcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBvdGhlciBmdW5jdGlvbnMsIGFuZCByZXR1cm5lZCBhcyByZXN1bHRzLgorCitUaGVyZSBhcmUgZWlnaHQgQHh7YmFzaWMgdHlwZXN9IGluIEx1YToKK0BkZWZ7bmlsfSwgQGRlZntib29sZWFufSwgQGRlZntudW1iZXJ9LAorQGRlZntzdHJpbmd9LCBAZGVme2Z1bmN0aW9ufSwgQGRlZnt1c2VyZGF0YX0sCitAZGVme3RocmVhZH0sIGFuZCBAZGVme3RhYmxlfS4KK1RoZSB0eXBlIEBlbXBoe25pbH0gaGFzIG9uZSBzaW5nbGUgdmFsdWUsIEBuaWwsCit3aG9zZSBtYWluIHByb3BlcnR5IGlzIHRvIGJlIGRpZmZlcmVudCBmcm9tIGFueSBvdGhlciB2YWx1ZTsKK2l0IHVzdWFsbHkgcmVwcmVzZW50cyB0aGUgYWJzZW5jZSBvZiBhIHVzZWZ1bCB2YWx1ZS4KK1RoZSB0eXBlIEBlbXBoe2Jvb2xlYW59IGhhcyB0d28gdmFsdWVzLCBAZmFsc2UgYW5kIEB0cnVlLgorQm90aCBAbmlsIGFuZCBAZmFsc2UgbWFrZSBhIGNvbmRpdGlvbiBmYWxzZTsKK2FueSBvdGhlciB2YWx1ZSBtYWtlcyBpdCB0cnVlLgorVGhlIHR5cGUgQGVtcGh7bnVtYmVyfSByZXByZXNlbnRzIGJvdGgKK2ludGVnZXIgbnVtYmVycyBhbmQgcmVhbCAoZmxvYXRpbmctcG9pbnQpIG51bWJlcnMuCitUaGUgdHlwZSBAZW1waHtzdHJpbmd9IHJlcHJlc2VudHMgaW1tdXRhYmxlIHNlcXVlbmNlcyBvZiBieXRlcy4KK0BpbmRleHtlaWdodC1iaXQgY2xlYW59CitMdWEgaXMgOC1iaXQgY2xlYW46CitzdHJpbmdzIGNhbiBjb250YWluIGFueSA4LWJpdCB2YWx1ZSwKK2luY2x1ZGluZyBAeHtlbWJlZGRlZCB6ZXJvc30gKEBDaGFye1wwfSkuCitMdWEgaXMgYWxzbyBlbmNvZGluZy1hZ25vc3RpYzsKK2l0IG1ha2VzIG5vIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjb250ZW50cyBvZiBhIHN0cmluZy4KKworVGhlIHR5cGUgQGVtcGh7bnVtYmVyfSB1c2VzIHR3byBpbnRlcm5hbCByZXByZXNlbnRhdGlvbnMsCitvciB0d28gQHh7c3VidHlwZXN9LAorb25lIGNhbGxlZCBAZGVme2ludGVnZXJ9IGFuZCB0aGUgb3RoZXIgY2FsbGVkIEBkZWZ7ZmxvYXR9LgorTHVhIGhhcyBleHBsaWNpdCBydWxlcyBhYm91dCB3aGVuIGVhY2ggcmVwcmVzZW50YXRpb24gaXMgdXNlZCwKK2J1dCBpdCBhbHNvIGNvbnZlcnRzIGJldHdlZW4gdGhlbSBhdXRvbWF0aWNhbGx5IGFzIG5lZWRlZCBAc2Vle2NvZXJjaW9ufS4KK1RoZXJlZm9yZSwKK3RoZSBwcm9ncmFtbWVyIG1heSBjaG9vc2UgdG8gbW9zdGx5IGlnbm9yZSB0aGUgZGlmZmVyZW5jZQorYmV0d2VlbiBpbnRlZ2VycyBhbmQgZmxvYXRzCitvciB0byBhc3N1bWUgY29tcGxldGUgY29udHJvbCBvdmVyIHRoZSByZXByZXNlbnRhdGlvbiBvZiBlYWNoIG51bWJlci4KK1N0YW5kYXJkIEx1YSB1c2VzIDY0LWJpdCBpbnRlZ2VycyBhbmQgZG91YmxlLXByZWNpc2lvbiAoNjQtYml0KSBmbG9hdHMsCitidXQgeW91IGNhbiBhbHNvIGNvbXBpbGUgTHVhIHNvIHRoYXQgaXQKK3VzZXMgMzItYml0IGludGVnZXJzIGFuZC9vciBzaW5nbGUtcHJlY2lzaW9uICgzMi1iaXQpIGZsb2F0cy4KK1RoZSBvcHRpb24gd2l0aCAzMiBiaXRzIGZvciBib3RoIGludGVnZXJzIGFuZCBmbG9hdHMKK2lzIHBhcnRpY3VsYXJseSBhdHRyYWN0aXZlCitmb3Igc21hbGwgbWFjaGluZXMgYW5kIGVtYmVkZGVkIHN5c3RlbXMuCisoU2VlIG1hY3JvIEBpZHtMVUFfMzJCSVRTfSBpbiBmaWxlIEBpZHtsdWFjb25mLmh9LikKKworTHVhIGNhbiBjYWxsIChhbmQgbWFuaXB1bGF0ZSkgZnVuY3Rpb25zIHdyaXR0ZW4gaW4gTHVhIGFuZAorZnVuY3Rpb25zIHdyaXR0ZW4gaW4gQyBAc2Vle2Z1bmN0aW9uY2FsbH0uCitCb3RoIGFyZSByZXByZXNlbnRlZCBieSB0aGUgdHlwZSBAZW1waHtmdW5jdGlvbn0uCisKK1RoZSB0eXBlIEBlbXBoe3VzZXJkYXRhfSBpcyBwcm92aWRlZCB0byBhbGxvdyBhcmJpdHJhcnkgQE57QyBkYXRhfSB0bworYmUgc3RvcmVkIGluIEx1YSB2YXJpYWJsZXMuCitBIHVzZXJkYXRhIHZhbHVlIHJlcHJlc2VudHMgYSBibG9jayBvZiByYXcgbWVtb3J5LgorVGhlcmUgYXJlIHR3byBraW5kcyBvZiB1c2VyZGF0YToKK0BlbXBoeHtmdWxsIHVzZXJkYXRhfSwKK3doaWNoIGlzIGFuIG9iamVjdCB3aXRoIGEgYmxvY2sgb2YgbWVtb3J5IG1hbmFnZWQgYnkgTHVhLAorYW5kIEBlbXBoeHtsaWdodCB1c2VyZGF0YX0sCit3aGljaCBpcyBzaW1wbHkgYSBATntDIHBvaW50ZXJ9IHZhbHVlLgorVXNlcmRhdGEgaGFzIG5vIHByZWRlZmluZWQgb3BlcmF0aW9ucyBpbiBMdWEsCitleGNlcHQgYXNzaWdubWVudCBhbmQgaWRlbnRpdHkgdGVzdC4KK0J5IHVzaW5nIEBlbXBoe21ldGF0YWJsZXN9LAordGhlIHByb2dyYW1tZXIgY2FuIGRlZmluZSBvcGVyYXRpb25zIGZvciBmdWxsIHVzZXJkYXRhIHZhbHVlcworQHNlZXttZXRhdGFibGV9LgorVXNlcmRhdGEgdmFsdWVzIGNhbm5vdCBiZSBjcmVhdGVkIG9yIG1vZGlmaWVkIGluIEx1YSwKK29ubHkgdGhyb3VnaCB0aGUgQE57QyBBUEl9LgorVGhpcyBndWFyYW50ZWVzIHRoZSBpbnRlZ3JpdHkgb2YgZGF0YSBvd25lZCBieSB0aGUgaG9zdCBwcm9ncmFtLgorCitUaGUgdHlwZSBAZGVme3RocmVhZH0gcmVwcmVzZW50cyBpbmRlcGVuZGVudCB0aHJlYWRzIG9mIGV4ZWN1dGlvbgorYW5kIGl0IGlzIHVzZWQgdG8gaW1wbGVtZW50IGNvcm91dGluZXMgQHNlZXtjb3JvdXRpbmV9LgorTHVhIHRocmVhZHMgYXJlIG5vdCByZWxhdGVkIHRvIG9wZXJhdGluZy1zeXN0ZW0gdGhyZWFkcy4KK0x1YSBzdXBwb3J0cyBjb3JvdXRpbmVzIG9uIGFsbCBzeXN0ZW1zLAorZXZlbiB0aG9zZSB0aGF0IGRvIG5vdCBzdXBwb3J0IHRocmVhZHMgbmF0aXZlbHkuCisKK1RoZSB0eXBlIEBlbXBoe3RhYmxlfSBpbXBsZW1lbnRzIEB4e2Fzc29jaWF0aXZlIGFycmF5c30sCit0aGF0IGlzLCBAeHthcnJheXN9IHRoYXQgY2FuIGhhdmUgYXMgaW5kaWNlcyBub3Qgb25seSBudW1iZXJzLAorYnV0IGFueSBMdWEgdmFsdWUgZXhjZXB0IEBuaWwgYW5kIEB4e05hTn0uCisoQGVtcGh4e05vdCBhIE51bWJlcn0gaXMgYSBzcGVjaWFsIGZsb2F0aW5nLXBvaW50IHZhbHVlCit1c2VkIGJ5IHRoZSBAeHtJRUVFIDc1NH0gc3RhbmRhcmQgdG8gcmVwcmVzZW50Cit1bmRlZmluZWQgb3IgdW5yZXByZXNlbnRhYmxlIG51bWVyaWNhbCByZXN1bHRzLCBzdWNoIGFzIEBUezAvMH0uKQorVGFibGVzIGNhbiBiZSBAZW1waHtoZXRlcm9nZW5lb3VzfTsKK3RoYXQgaXMsIHRoZXkgY2FuIGNvbnRhaW4gdmFsdWVzIG9mIGFsbCB0eXBlcyAoZXhjZXB0IEBuaWwpLgorQW55IGtleSB3aXRoIHZhbHVlIEBuaWwgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgdGFibGUuCitDb252ZXJzZWx5LCBhbnkga2V5IHRoYXQgaXMgbm90IHBhcnQgb2YgYSB0YWJsZSBoYXMKK2FuIGFzc29jaWF0ZWQgdmFsdWUgQG5pbC4KKworVGFibGVzIGFyZSB0aGUgc29sZSBkYXRhLXN0cnVjdHVyaW5nIG1lY2hhbmlzbSBpbiBMdWE7Cit0aGV5IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBvcmRpbmFyeSBhcnJheXMsIGxpc3RzLAorc3ltYm9sIHRhYmxlcywgc2V0cywgcmVjb3JkcywgZ3JhcGhzLCB0cmVlcywgZXRjLgorVG8gcmVwcmVzZW50IEB4e3JlY29yZHN9LCBMdWEgdXNlcyB0aGUgZmllbGQgbmFtZSBhcyBhbiBpbmRleC4KK1RoZSBsYW5ndWFnZSBzdXBwb3J0cyB0aGlzIHJlcHJlc2VudGF0aW9uIGJ5Citwcm92aWRpbmcgQGlke2EubmFtZX0gYXMgc3ludGFjdGljIHN1Z2FyIGZvciBAVHthWyJuYW1lIl19LgorVGhlcmUgYXJlIHNldmVyYWwgY29udmVuaWVudCB3YXlzIHRvIGNyZWF0ZSB0YWJsZXMgaW4gTHVhCitAc2Vle3RhYmxlY29uc3RydWN0b3J9LgorCitMaWtlIGluZGljZXMsCit0aGUgdmFsdWVzIG9mIHRhYmxlIGZpZWxkcyBjYW4gYmUgb2YgYW55IHR5cGUuCitJbiBwYXJ0aWN1bGFyLAorYmVjYXVzZSBmdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIHZhbHVlcywKK3RhYmxlIGZpZWxkcyBjYW4gY29udGFpbiBmdW5jdGlvbnMuCitUaHVzIHRhYmxlcyBjYW4gYWxzbyBjYXJyeSBAZW1waHttZXRob2RzfSBAc2Vle2Z1bmMtZGVmfS4KKworVGhlIGluZGV4aW5nIG9mIHRhYmxlcyBmb2xsb3dzCit0aGUgZGVmaW5pdGlvbiBvZiByYXcgZXF1YWxpdHkgaW4gdGhlIGxhbmd1YWdlLgorVGhlIGV4cHJlc3Npb25zIEBUe2FbaV19IGFuZCBAVHthW2pdfQorZGVub3RlIHRoZSBzYW1lIHRhYmxlIGVsZW1lbnQKK2lmIGFuZCBvbmx5IGlmIEBpZHtpfSBhbmQgQGlke2p9IGFyZSByYXcgZXF1YWwKKyh0aGF0IGlzLCBlcXVhbCB3aXRob3V0IG1ldGFtZXRob2RzKS4KK0luIHBhcnRpY3VsYXIsIGZsb2F0cyB3aXRoIGludGVncmFsIHZhbHVlcworYXJlIGVxdWFsIHRvIHRoZWlyIHJlc3BlY3RpdmUgaW50ZWdlcnMKKyhlLmcuLCBAVHsxLjAgPT0gMX0pLgorVG8gYXZvaWQgYW1iaWd1aXRpZXMsCithbnkgZmxvYXQgd2l0aCBpbnRlZ3JhbCB2YWx1ZSB1c2VkIGFzIGEga2V5CitpcyBjb252ZXJ0ZWQgdG8gaXRzIHJlc3BlY3RpdmUgaW50ZWdlci4KK0ZvciBpbnN0YW5jZSwgaWYgeW91IHdyaXRlIEBUe2FbMi4wXSA9IHRydWV9LAordGhlIGFjdHVhbCBrZXkgaW5zZXJ0ZWQgaW50byB0aGUgdGFibGUgd2lsbCBiZSB0aGUKK2ludGVnZXIgQFR7Mn0uCisoT24gdGhlIG90aGVyIGhhbmQsCisyIGFuZCBAU3R7Mn0gYXJlIGRpZmZlcmVudCBMdWEgdmFsdWVzIGFuZCB0aGVyZWZvcmUKK2Rlbm90ZSBkaWZmZXJlbnQgdGFibGUgZW50cmllcy4pCisKKworVGFibGVzLCBmdW5jdGlvbnMsIHRocmVhZHMsIGFuZCAoZnVsbCkgdXNlcmRhdGEgdmFsdWVzIGFyZSBAZW1waHtvYmplY3RzfToKK3ZhcmlhYmxlcyBkbyBub3QgYWN0dWFsbHkgQGVtcGh7Y29udGFpbn0gdGhlc2UgdmFsdWVzLAorb25seSBAZW1waHtyZWZlcmVuY2VzfSB0byB0aGVtLgorQXNzaWdubWVudCwgcGFyYW1ldGVyIHBhc3NpbmcsIGFuZCBmdW5jdGlvbiByZXR1cm5zCithbHdheXMgbWFuaXB1bGF0ZSByZWZlcmVuY2VzIHRvIHN1Y2ggdmFsdWVzOwordGhlc2Ugb3BlcmF0aW9ucyBkbyBub3QgaW1wbHkgYW55IGtpbmQgb2YgY29weS4KKworVGhlIGxpYnJhcnkgZnVuY3Rpb24gQExpZHt0eXBlfSByZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHR5cGUKK29mIGEgZ2l2ZW4gdmFsdWUgQHNlZXtwcmVkZWZpbmVkfS4KKworfQorCitAc2VjdDJ7Z2xvYmFsZW52fCBAdGl0bGV7RW52aXJvbm1lbnRzIGFuZCB0aGUgR2xvYmFsIEVudmlyb25tZW50fQorCitBcyB3aWxsIGJlIGRpc2N1c3NlZCBpbiBAcmVmc2Vje3ZhcmlhYmxlc30gYW5kIEByZWZzZWN7YXNzaWdubWVudH0sCithbnkgcmVmZXJlbmNlIHRvIGEgZnJlZSBuYW1lCisodGhhdCBpcywgYSBuYW1lIG5vdCBib3VuZCB0byBhbnkgZGVjbGFyYXRpb24pIEBpZHt2YXJ9CitpcyBzeW50YWN0aWNhbGx5IHRyYW5zbGF0ZWQgdG8gQFR7X0VOVi52YXJ9LgorTW9yZW92ZXIsIGV2ZXJ5IGNodW5rIGlzIGNvbXBpbGVkIGluIHRoZSBzY29wZSBvZgorYW4gZXh0ZXJuYWwgbG9jYWwgdmFyaWFibGUgbmFtZWQgQGlke19FTlZ9IEBzZWV7Y2h1bmtzfSwKK3NvIEBpZHtfRU5WfSBpdHNlbGYgaXMgbmV2ZXIgYSBmcmVlIG5hbWUgaW4gYSBjaHVuay4KKworRGVzcGl0ZSB0aGUgZXhpc3RlbmNlIG9mIHRoaXMgZXh0ZXJuYWwgQGlke19FTlZ9IHZhcmlhYmxlIGFuZAordGhlIHRyYW5zbGF0aW9uIG9mIGZyZWUgbmFtZXMsCitAaWR7X0VOVn0gaXMgYSBjb21wbGV0ZWx5IHJlZ3VsYXIgbmFtZS4KK0luIHBhcnRpY3VsYXIsCit5b3UgY2FuIGRlZmluZSBuZXcgdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzIHdpdGggdGhhdCBuYW1lLgorRWFjaCByZWZlcmVuY2UgdG8gYSBmcmVlIG5hbWUgdXNlcyB0aGUgQGlke19FTlZ9IHRoYXQgaXMKK3Zpc2libGUgYXQgdGhhdCBwb2ludCBpbiB0aGUgcHJvZ3JhbSwKK2ZvbGxvd2luZyB0aGUgdXN1YWwgdmlzaWJpbGl0eSBydWxlcyBvZiBMdWEgQHNlZXt2aXNpYmlsaXR5fS4KKworQW55IHRhYmxlIHVzZWQgYXMgdGhlIHZhbHVlIG9mIEBpZHtfRU5WfSBpcyBjYWxsZWQgYW4gQGRlZntlbnZpcm9ubWVudH0uCisKK0x1YSBrZWVwcyBhIGRpc3Rpbmd1aXNoZWQgZW52aXJvbm1lbnQgY2FsbGVkIHRoZSBAZGVme2dsb2JhbCBlbnZpcm9ubWVudH0uCitUaGlzIHZhbHVlIGlzIGtlcHQgYXQgYSBzcGVjaWFsIGluZGV4IGluIHRoZSBDIHJlZ2lzdHJ5IEBzZWV7cmVnaXN0cnl9LgorSW4gTHVhLCB0aGUgZ2xvYmFsIHZhcmlhYmxlIEBMaWR7X0d9IGlzIGluaXRpYWxpemVkIHdpdGggdGhpcyBzYW1lIHZhbHVlLgorKEBMaWR7X0d9IGlzIG5ldmVyIHVzZWQgaW50ZXJuYWxseS4pCisKK1doZW4gTHVhIGxvYWRzIGEgY2h1bmssCit0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgaXRzIEBpZHtfRU5WfSB1cHZhbHVlCitpcyB0aGUgZ2xvYmFsIGVudmlyb25tZW50IEBzZWVGe2xvYWR9LgorVGhlcmVmb3JlLCBieSBkZWZhdWx0LAorZnJlZSBuYW1lcyBpbiBMdWEgY29kZSByZWZlciB0byBlbnRyaWVzIGluIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQKKyhhbmQsIHRoZXJlZm9yZSwgdGhleSBhcmUgYWxzbyBjYWxsZWQgQGRlZntnbG9iYWwgdmFyaWFibGVzfSkuCitNb3Jlb3ZlciwgYWxsIHN0YW5kYXJkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGluIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQKK2FuZCBzb21lIGZ1bmN0aW9ucyB0aGVyZSBvcGVyYXRlIG9uIHRoYXQgZW52aXJvbm1lbnQuCitZb3UgY2FuIHVzZSBATGlke2xvYWR9IChvciBATGlke2xvYWRmaWxlfSkKK3RvIGxvYWQgYSBjaHVuayB3aXRoIGEgZGlmZmVyZW50IGVudmlyb25tZW50LgorKEluIEMsIHlvdSBoYXZlIHRvIGxvYWQgdGhlIGNodW5rIGFuZCB0aGVuIGNoYW5nZSB0aGUgdmFsdWUKK29mIGl0cyBmaXJzdCB1cHZhbHVlLikKKworfQorCitAc2VjdDJ7ZXJyb3J8IEB0aXRsZXtFcnJvciBIYW5kbGluZ30KKworQmVjYXVzZSBMdWEgaXMgYW4gZW1iZWRkZWQgZXh0ZW5zaW9uIGxhbmd1YWdlLAorYWxsIEx1YSBhY3Rpb25zIHN0YXJ0IGZyb20gQE57QyBjb2RlfSBpbiB0aGUgaG9zdCBwcm9ncmFtCitjYWxsaW5nIGEgZnVuY3Rpb24gZnJvbSB0aGUgTHVhIGxpYnJhcnkuCisoV2hlbiB5b3UgdXNlIEx1YSBzdGFuZGFsb25lLAordGhlIEBpZHtsdWF9IGFwcGxpY2F0aW9uIGlzIHRoZSBob3N0IHByb2dyYW0uKQorV2hlbmV2ZXIgYW4gZXJyb3Igb2NjdXJzIGR1cmluZwordGhlIGNvbXBpbGF0aW9uIG9yIGV4ZWN1dGlvbiBvZiBhIEx1YSBjaHVuaywKK2NvbnRyb2wgcmV0dXJucyB0byB0aGUgaG9zdCwKK3doaWNoIGNhbiB0YWtlIGFwcHJvcHJpYXRlIG1lYXN1cmVzCisoc3VjaCBhcyBwcmludGluZyBhbiBlcnJvciBtZXNzYWdlKS4KKworTHVhIGNvZGUgY2FuIGV4cGxpY2l0bHkgZ2VuZXJhdGUgYW4gZXJyb3IgYnkgY2FsbGluZyB0aGUKK0BMaWR7ZXJyb3J9IGZ1bmN0aW9uLgorSWYgeW91IG5lZWQgdG8gY2F0Y2ggZXJyb3JzIGluIEx1YSwKK3lvdSBjYW4gdXNlIEBMaWR7cGNhbGx9IG9yIEBMaWR7eHBjYWxsfQordG8gY2FsbCBhIGdpdmVuIGZ1bmN0aW9uIGluIEBlbXBoeHtwcm90ZWN0ZWQgbW9kZX0uCisKK1doZW5ldmVyIHRoZXJlIGlzIGFuIGVycm9yLAorYW4gQGRlZntlcnJvciBvYmplY3R9IChhbHNvIGNhbGxlZCBhbiBAZGVme2Vycm9yIG1lc3NhZ2V9KQoraXMgcHJvcGFnYXRlZCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvci4KK0x1YSBpdHNlbGYgb25seSBnZW5lcmF0ZXMgZXJyb3JzIHdob3NlIGVycm9yIG9iamVjdCBpcyBhIHN0cmluZywKK2J1dCBwcm9ncmFtcyBtYXkgZ2VuZXJhdGUgZXJyb3JzIHdpdGgKK2FueSB2YWx1ZSBhcyB0aGUgZXJyb3Igb2JqZWN0LgorSXQgaXMgdXAgdG8gdGhlIEx1YSBwcm9ncmFtIG9yIGl0cyBob3N0IHRvIGhhbmRsZSBzdWNoIGVycm9yIG9iamVjdHMuCisKKworV2hlbiB5b3UgdXNlIEBMaWR7eHBjYWxsfSBvciBATGlke2x1YV9wY2FsbH0sCit5b3UgbWF5IGdpdmUgYSBAZGVme21lc3NhZ2UgaGFuZGxlcn0KK3RvIGJlIGNhbGxlZCBpbiBjYXNlIG9mIGVycm9ycy4KK1RoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIG9yaWdpbmFsIGVycm9yIG9iamVjdAorYW5kIHJldHVybnMgYSBuZXcgZXJyb3Igb2JqZWN0LgorSXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUgZXJyb3IgdW53aW5kcyB0aGUgc3RhY2ssCitzbyB0aGF0IGl0IGNhbiBnYXRoZXIgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IsCitmb3IgaW5zdGFuY2UgYnkgaW5zcGVjdGluZyB0aGUgc3RhY2sgYW5kIGNyZWF0aW5nIGEgc3RhY2sgdHJhY2ViYWNrLgorVGhpcyBtZXNzYWdlIGhhbmRsZXIgaXMgc3RpbGwgcHJvdGVjdGVkIGJ5IHRoZSBwcm90ZWN0ZWQgY2FsbDsKK3NvLCBhbiBlcnJvciBpbnNpZGUgdGhlIG1lc3NhZ2UgaGFuZGxlcgord2lsbCBjYWxsIHRoZSBtZXNzYWdlIGhhbmRsZXIgYWdhaW4uCitJZiB0aGlzIGxvb3AgZ29lcyBvbiBmb3IgdG9vIGxvbmcsCitMdWEgYnJlYWtzIGl0IGFuZCByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UuCisoVGhlIG1lc3NhZ2UgaGFuZGxlciBpcyBjYWxsZWQgb25seSBmb3IgcmVndWxhciBydW50aW1lIGVycm9ycy4KK0l0IGlzIG5vdCBjYWxsZWQgZm9yIG1lbW9yeS1hbGxvY2F0aW9uIGVycm9ycworbm9yIGZvciBlcnJvcnMgd2hpbGUgcnVubmluZyBmaW5hbGl6ZXJzLikKKworfQorCitAc2VjdDJ7bWV0YXRhYmxlfCBAdGl0bGV7TWV0YXRhYmxlcyBhbmQgTWV0YW1ldGhvZHN9CisKK0V2ZXJ5IHZhbHVlIGluIEx1YSBjYW4gaGF2ZSBhIEBlbXBoe21ldGF0YWJsZX0uCitUaGlzIEBkZWZ7bWV0YXRhYmxlfSBpcyBhbiBvcmRpbmFyeSBMdWEgdGFibGUKK3RoYXQgZGVmaW5lcyB0aGUgYmVoYXZpb3Igb2YgdGhlIG9yaWdpbmFsIHZhbHVlCit1bmRlciBjZXJ0YWluIHNwZWNpYWwgb3BlcmF0aW9ucy4KK1lvdSBjYW4gY2hhbmdlIHNldmVyYWwgYXNwZWN0cyBvZiB0aGUgYmVoYXZpb3IKK29mIG9wZXJhdGlvbnMgb3ZlciBhIHZhbHVlIGJ5IHNldHRpbmcgc3BlY2lmaWMgZmllbGRzIGluIGl0cyBtZXRhdGFibGUuCitGb3IgaW5zdGFuY2UsIHdoZW4gYSBub24tbnVtZXJpYyB2YWx1ZSBpcyB0aGUgb3BlcmFuZCBvZiBhbiBhZGRpdGlvbiwKK0x1YSBjaGVja3MgZm9yIGEgZnVuY3Rpb24gaW4gdGhlIGZpZWxkIEBTdHtfX2FkZH0gb2YgdGhlIHZhbHVlJ3MgbWV0YXRhYmxlLgorSWYgaXQgZmluZHMgb25lLAorTHVhIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgYWRkaXRpb24uCisKK1RoZSBrZXkgZm9yIGVhY2ggZXZlbnQgaW4gYSBtZXRhdGFibGUgaXMgYSBzdHJpbmcKK3dpdGggdGhlIGV2ZW50IG5hbWUgcHJlZml4ZWQgYnkgdHdvIHVuZGVyc2NvcmVzOwordGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGFyZSBjYWxsZWQgQGRlZnttZXRhbWV0aG9kc30uCitJbiB0aGUgcHJldmlvdXMgZXhhbXBsZSwgdGhlIGtleSBpcyBAU3R7X19hZGR9CithbmQgdGhlIG1ldGFtZXRob2QgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgdGhlIGFkZGl0aW9uLgorVW5sZXNzIHN0YXRlZCBvdGhlcndpc2UsCittZXRhbWV0aG9kcyBzaG91bGQgYmUgZnVuY3Rpb24gdmFsdWVzLgorCitZb3UgY2FuIHF1ZXJ5IHRoZSBtZXRhdGFibGUgb2YgYW55IHZhbHVlCit1c2luZyB0aGUgQExpZHtnZXRtZXRhdGFibGV9IGZ1bmN0aW9uLgorTHVhIHF1ZXJpZXMgbWV0YW1ldGhvZHMgaW4gbWV0YXRhYmxlcyB1c2luZyBhIHJhdyBhY2Nlc3MgQHNlZUZ7cmF3Z2V0fS4KK1NvLCB0byByZXRyaWV2ZSB0aGUgbWV0YW1ldGhvZCBmb3IgZXZlbnQgQGlke2V2fSBpbiBvYmplY3QgQGlke299LAorTHVhIGRvZXMgdGhlIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBjb2RlOgorQHZlcmJhdGlteworcmF3Z2V0KGdldG1ldGF0YWJsZShAcmVwe299KSBvciB7fSwgIl9fQHJlcHtldn0iKQorfQorCitZb3UgY2FuIHJlcGxhY2UgdGhlIG1ldGF0YWJsZSBvZiB0YWJsZXMKK3VzaW5nIHRoZSBATGlke3NldG1ldGF0YWJsZX0gZnVuY3Rpb24uCitZb3UgY2Fubm90IGNoYW5nZSB0aGUgbWV0YXRhYmxlIG9mIG90aGVyIHR5cGVzIGZyb20gTHVhIGNvZGUKKyhleGNlcHQgYnkgdXNpbmcgdGhlIEBsaW5re2RlYnVnbGlifGRlYnVnIGxpYnJhcnl9KTsKK3lvdSBzaG91bGQgdXNlIHRoZSBATntDIEFQSX0gZm9yIHRoYXQuCisKK1RhYmxlcyBhbmQgZnVsbCB1c2VyZGF0YSBoYXZlIGluZGl2aWR1YWwgbWV0YXRhYmxlcworKGFsdGhvdWdoIG11bHRpcGxlIHRhYmxlcyBhbmQgdXNlcmRhdGEgY2FuIHNoYXJlIHRoZWlyIG1ldGF0YWJsZXMpLgorVmFsdWVzIG9mIGFsbCBvdGhlciB0eXBlcyBzaGFyZSBvbmUgc2luZ2xlIG1ldGF0YWJsZSBwZXIgdHlwZTsKK3RoYXQgaXMsIHRoZXJlIGlzIG9uZSBzaW5nbGUgbWV0YXRhYmxlIGZvciBhbGwgbnVtYmVycywKK29uZSBmb3IgYWxsIHN0cmluZ3MsIGV0Yy4KK0J5IGRlZmF1bHQsIGEgdmFsdWUgaGFzIG5vIG1ldGF0YWJsZSwKK2J1dCB0aGUgc3RyaW5nIGxpYnJhcnkgc2V0cyBhIG1ldGF0YWJsZSBmb3IgdGhlIHN0cmluZyB0eXBlIEBzZWV7c3RybGlifS4KKworQSBtZXRhdGFibGUgY29udHJvbHMgaG93IGFuIG9iamVjdCBiZWhhdmVzIGluCithcml0aG1ldGljIG9wZXJhdGlvbnMsIGJpdHdpc2Ugb3BlcmF0aW9ucywKK29yZGVyIGNvbXBhcmlzb25zLCBjb25jYXRlbmF0aW9uLCBsZW5ndGggb3BlcmF0aW9uLCBjYWxscywgYW5kIGluZGV4aW5nLgorQSBtZXRhdGFibGUgYWxzbyBjYW4gZGVmaW5lIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCit3aGVuIGEgdXNlcmRhdGEgb3IgYSB0YWJsZSBpcyBAbGlua3tHQ3xnYXJiYWdlIGNvbGxlY3RlZH0uCisKK0ZvciB0aGUgdW5hcnkgb3BlcmF0b3JzIChuZWdhdGlvbiwgbGVuZ3RoLCBhbmQgYml0d2lzZSBOT1QpLAordGhlIG1ldGFtZXRob2QgaXMgY29tcHV0ZWQgYW5kIGNhbGxlZCB3aXRoIGEgZHVtbXkgc2Vjb25kIG9wZXJhbmQsCitlcXVhbCB0byB0aGUgZmlyc3Qgb25lLgorVGhpcyBleHRyYSBvcGVyYW5kIGlzIG9ubHkgdG8gc2ltcGxpZnkgTHVhJ3MgaW50ZXJuYWxzCisoYnkgbWFraW5nIHRoZXNlIG9wZXJhdG9ycyBiZWhhdmUgbGlrZSBhIGJpbmFyeSBvcGVyYXRpb24pCithbmQgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLgorKEZvciBtb3N0IHVzZXMgdGhpcyBleHRyYSBvcGVyYW5kIGlzIGlycmVsZXZhbnQuKQorCitBIGRldGFpbGVkIGxpc3Qgb2YgZXZlbnRzIGNvbnRyb2xsZWQgYnkgbWV0YXRhYmxlcyBpcyBnaXZlbiBuZXh0LgorRWFjaCBvcGVyYXRpb24gaXMgaWRlbnRpZmllZCBieSBpdHMgY29ycmVzcG9uZGluZyBrZXkuCisKK0BkZXNjcmlwdGlvbnsKKworQGl0ZW17QGlkeHtfX2FkZH18Cit0aGUgYWRkaXRpb24gKEBUeyt9KSBvcGVyYXRpb24uCitJZiBhbnkgb3BlcmFuZCBmb3IgYW4gYWRkaXRpb24gaXMgbm90IGEgbnVtYmVyCisobm9yIGEgc3RyaW5nIGNvZXJjaWJsZSB0byBhIG51bWJlciksCitMdWEgd2lsbCB0cnkgdG8gY2FsbCBhIG1ldGFtZXRob2QuCitGaXJzdCwgTHVhIHdpbGwgY2hlY2sgdGhlIGZpcnN0IG9wZXJhbmQgKGV2ZW4gaWYgaXQgaXMgdmFsaWQpLgorSWYgdGhhdCBvcGVyYW5kIGRvZXMgbm90IGRlZmluZSBhIG1ldGFtZXRob2QgZm9yIEBpZHh7X19hZGR9LAordGhlbiBMdWEgd2lsbCBjaGVjayB0aGUgc2Vjb25kIG9wZXJhbmQuCitJZiBMdWEgY2FuIGZpbmQgYSBtZXRhbWV0aG9kLAoraXQgY2FsbHMgdGhlIG1ldGFtZXRob2Qgd2l0aCB0aGUgdHdvIG9wZXJhbmRzIGFzIGFyZ3VtZW50cywKK2FuZCB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsCisoYWRqdXN0ZWQgdG8gb25lIHZhbHVlKQoraXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorT3RoZXJ3aXNlLAoraXQgcmFpc2VzIGFuIGVycm9yLgorfQorCitAaXRlbXtAaWR4e19fc3VifXwKK3RoZSBzdWJ0cmFjdGlvbiAoQFR7LX0pIG9wZXJhdGlvbi4KK0JlaGF2aW9yIHNpbWlsYXIgdG8gdGhlIGFkZGl0aW9uIG9wZXJhdGlvbi4KK30KKworQGl0ZW17QGlkeHtfX211bH18Cit0aGUgbXVsdGlwbGljYXRpb24gKEBUeyp9KSBvcGVyYXRpb24uCitCZWhhdmlvciBzaW1pbGFyIHRvIHRoZSBhZGRpdGlvbiBvcGVyYXRpb24uCit9CisKK0BpdGVte0BpZHh7X19kaXZ9fAordGhlIGRpdmlzaW9uIChAVHsvfSkgb3BlcmF0aW9uLgorQmVoYXZpb3Igc2ltaWxhciB0byB0aGUgYWRkaXRpb24gb3BlcmF0aW9uLgorfQorCitAaXRlbXtAaWR4e19fbW9kfXwKK3RoZSBtb2R1bG8gKEBUeyV9KSBvcGVyYXRpb24uCitCZWhhdmlvciBzaW1pbGFyIHRvIHRoZSBhZGRpdGlvbiBvcGVyYXRpb24uCit9CisKK0BpdGVte0BpZHh7X19wb3d9fAordGhlIGV4cG9uZW50aWF0aW9uIChAVHtefSkgb3BlcmF0aW9uLgorQmVoYXZpb3Igc2ltaWxhciB0byB0aGUgYWRkaXRpb24gb3BlcmF0aW9uLgorfQorCitAaXRlbXtAaWR4e19fdW5tfXwKK3RoZSBuZWdhdGlvbiAodW5hcnkgQFR7LX0pIG9wZXJhdGlvbi4KK0JlaGF2aW9yIHNpbWlsYXIgdG8gdGhlIGFkZGl0aW9uIG9wZXJhdGlvbi4KK30KKworQGl0ZW17QGlkeHtfX2lkaXZ9fAordGhlIGZsb29yIGRpdmlzaW9uIChAVHsvL30pIG9wZXJhdGlvbi4KK0JlaGF2aW9yIHNpbWlsYXIgdG8gdGhlIGFkZGl0aW9uIG9wZXJhdGlvbi4KK30KKworQGl0ZW17QGlkeHtfX2JhbmR9fAordGhlIGJpdHdpc2UgQU5EIChAVHsmfSkgb3BlcmF0aW9uLgorQmVoYXZpb3Igc2ltaWxhciB0byB0aGUgYWRkaXRpb24gb3BlcmF0aW9uLAorZXhjZXB0IHRoYXQgTHVhIHdpbGwgdHJ5IGEgbWV0YW1ldGhvZAoraWYgYW55IG9wZXJhbmQgaXMgbmVpdGhlciBhbiBpbnRlZ2VyCitub3IgYSB2YWx1ZSBjb2VyY2libGUgdG8gYW4gaW50ZWdlciBAc2Vle2NvZXJjaW9ufS4KK30KKworQGl0ZW17QGlkeHtfX2Jvcn18Cit0aGUgYml0d2lzZSBPUiAoQFR7fH0pIG9wZXJhdGlvbi4KK0JlaGF2aW9yIHNpbWlsYXIgdG8gdGhlIGJpdHdpc2UgQU5EIG9wZXJhdGlvbi4KK30KKworQGl0ZW17QGlkeHtfX2J4b3J9fAordGhlIGJpdHdpc2UgZXhjbHVzaXZlIE9SIChiaW5hcnkgQFR7fn0pIG9wZXJhdGlvbi4KK0JlaGF2aW9yIHNpbWlsYXIgdG8gdGhlIGJpdHdpc2UgQU5EIG9wZXJhdGlvbi4KK30KKworQGl0ZW17QGlkeHtfX2Jub3R9fAordGhlIGJpdHdpc2UgTk9UICh1bmFyeSBAVHt+fSkgb3BlcmF0aW9uLgorQmVoYXZpb3Igc2ltaWxhciB0byB0aGUgYml0d2lzZSBBTkQgb3BlcmF0aW9uLgorfQorCitAaXRlbXtAaWR4e19fc2hsfXwKK3RoZSBiaXR3aXNlIGxlZnQgc2hpZnQgKEBUezw8fSkgb3BlcmF0aW9uLgorQmVoYXZpb3Igc2ltaWxhciB0byB0aGUgYml0d2lzZSBBTkQgb3BlcmF0aW9uLgorfQorCitAaXRlbXtAaWR4e19fc2hyfXwKK3RoZSBiaXR3aXNlIHJpZ2h0IHNoaWZ0IChAVHs+Pn0pIG9wZXJhdGlvbi4KK0JlaGF2aW9yIHNpbWlsYXIgdG8gdGhlIGJpdHdpc2UgQU5EIG9wZXJhdGlvbi4KK30KKworQGl0ZW17QGlkeHtfX2NvbmNhdH18Cit0aGUgY29uY2F0ZW5hdGlvbiAoQFR7Li59KSBvcGVyYXRpb24uCitCZWhhdmlvciBzaW1pbGFyIHRvIHRoZSBhZGRpdGlvbiBvcGVyYXRpb24sCitleGNlcHQgdGhhdCBMdWEgd2lsbCB0cnkgYSBtZXRhbWV0aG9kCitpZiBhbnkgb3BlcmFuZCBpcyBuZWl0aGVyIGEgc3RyaW5nIG5vciBhIG51bWJlcgorKHdoaWNoIGlzIGFsd2F5cyBjb2VyY2libGUgdG8gYSBzdHJpbmcpLgorfQorCitAaXRlbXtAaWR4e19fbGVufXwKK3RoZSBsZW5ndGggKEBUeyN9KSBvcGVyYXRpb24uCitJZiB0aGUgb2JqZWN0IGlzIG5vdCBhIHN0cmluZywKK0x1YSB3aWxsIHRyeSBpdHMgbWV0YW1ldGhvZC4KK0lmIHRoZXJlIGlzIGEgbWV0YW1ldGhvZCwKK0x1YSBjYWxscyBpdCB3aXRoIHRoZSBvYmplY3QgYXMgYXJndW1lbnQsCithbmQgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbAorKGFsd2F5cyBhZGp1c3RlZCB0byBvbmUgdmFsdWUpCitpcyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCitJZiB0aGVyZSBpcyBubyBtZXRhbWV0aG9kIGJ1dCB0aGUgb2JqZWN0IGlzIGEgdGFibGUsCit0aGVuIEx1YSB1c2VzIHRoZSB0YWJsZSBsZW5ndGggb3BlcmF0aW9uIEBzZWV7bGVuLW9wfS4KK090aGVyd2lzZSwgTHVhIHJhaXNlcyBhbiBlcnJvci4KK30KKworQGl0ZW17QGlkeHtfX2VxfXwKK3RoZSBlcXVhbCAoQFR7PT19KSBvcGVyYXRpb24uCitCZWhhdmlvciBzaW1pbGFyIHRvIHRoZSBhZGRpdGlvbiBvcGVyYXRpb24sCitleGNlcHQgdGhhdCBMdWEgd2lsbCB0cnkgYSBtZXRhbWV0aG9kIG9ubHkgd2hlbiB0aGUgdmFsdWVzCitiZWluZyBjb21wYXJlZCBhcmUgZWl0aGVyIGJvdGggdGFibGVzIG9yIGJvdGggZnVsbCB1c2VyZGF0YQorYW5kIHRoZXkgYXJlIG5vdCBwcmltaXRpdmVseSBlcXVhbC4KK1RoZSByZXN1bHQgb2YgdGhlIGNhbGwgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byBhIGJvb2xlYW4uCit9CisKK0BpdGVte0BpZHh7X19sdH18Cit0aGUgbGVzcyB0aGFuIChAVHs8fSkgb3BlcmF0aW9uLgorQmVoYXZpb3Igc2ltaWxhciB0byB0aGUgYWRkaXRpb24gb3BlcmF0aW9uLAorZXhjZXB0IHRoYXQgTHVhIHdpbGwgdHJ5IGEgbWV0YW1ldGhvZCBvbmx5IHdoZW4gdGhlIHZhbHVlcworYmVpbmcgY29tcGFyZWQgYXJlIG5laXRoZXIgYm90aCBudW1iZXJzIG5vciBib3RoIHN0cmluZ3MuCitUaGUgcmVzdWx0IG9mIHRoZSBjYWxsIGlzIGFsd2F5cyBjb252ZXJ0ZWQgdG8gYSBib29sZWFuLgorfQorCitAaXRlbXtAaWR4e19fbGV9fAordGhlIGxlc3MgZXF1YWwgKEBUezw9fSkgb3BlcmF0aW9uLgorVW5saWtlIG90aGVyIG9wZXJhdGlvbnMsCit0aGUgbGVzcy1lcXVhbCBvcGVyYXRpb24gY2FuIHVzZSB0d28gZGlmZmVyZW50IGV2ZW50cy4KK0ZpcnN0LCBMdWEgbG9va3MgZm9yIHRoZSBAaWR4e19fbGV9IG1ldGFtZXRob2QgaW4gYm90aCBvcGVyYW5kcywKK2xpa2UgaW4gdGhlIGxlc3MgdGhhbiBvcGVyYXRpb24uCitJZiBpdCBjYW5ub3QgZmluZCBzdWNoIGEgbWV0YW1ldGhvZCwKK3RoZW4gaXQgd2lsbCB0cnkgdGhlIEBpZHh7X19sdH0gbWV0YW1ldGhvZCwKK2Fzc3VtaW5nIHRoYXQgQFR7YSA8PSBifSBpcyBlcXVpdmFsZW50IHRvIEBUe25vdCAoYiA8IGEpfS4KK0FzIHdpdGggdGhlIG90aGVyIGNvbXBhcmlzb24gb3BlcmF0b3JzLAordGhlIHJlc3VsdCBpcyBhbHdheXMgYSBib29sZWFuLgorKFRoaXMgdXNlIG9mIHRoZSBAaWR4e19fbHR9IGV2ZW50IGNhbiBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9uczsKK2l0IGlzIGFsc28gc2xvd2VyIHRoYW4gYSByZWFsIEBpZHh7X19sZX0gbWV0YW1ldGhvZC4pCit9CisKK0BpdGVte0BpZHh7X19pbmRleH18CitUaGUgaW5kZXhpbmcgYWNjZXNzIG9wZXJhdGlvbiBAVHt0YWJsZVtrZXldfS4KK1RoaXMgZXZlbnQgaGFwcGVucyB3aGVuIEBpZHt0YWJsZX0gaXMgbm90IGEgdGFibGUgb3IKK3doZW4gQGlke2tleX0gaXMgbm90IHByZXNlbnQgaW4gQGlke3RhYmxlfS4KK1RoZSBtZXRhbWV0aG9kIGlzIGxvb2tlZCB1cCBpbiBAaWR7dGFibGV9LgorCitEZXNwaXRlIHRoZSBuYW1lLAordGhlIG1ldGFtZXRob2QgZm9yIHRoaXMgZXZlbnQgY2FuIGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yIGEgdGFibGUuCitJZiBpdCBpcyBhIGZ1bmN0aW9uLAoraXQgaXMgY2FsbGVkIHdpdGggQGlke3RhYmxlfSBhbmQgQGlke2tleX0gYXMgYXJndW1lbnRzLAorYW5kIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwKKyhhZGp1c3RlZCB0byBvbmUgdmFsdWUpCitpcyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCitJZiBpdCBpcyBhIHRhYmxlLAordGhlIGZpbmFsIHJlc3VsdCBpcyB0aGUgcmVzdWx0IG9mIGluZGV4aW5nIHRoaXMgdGFibGUgd2l0aCBAaWR7a2V5fS4KKyhUaGlzIGluZGV4aW5nIGlzIHJlZ3VsYXIsIG5vdCByYXcsCithbmQgdGhlcmVmb3JlIGNhbiB0cmlnZ2VyIGFub3RoZXIgbWV0YW1ldGhvZC4pCit9CisKK0BpdGVte0BpZHh7X19uZXdpbmRleH18CitUaGUgaW5kZXhpbmcgYXNzaWdubWVudCBAVHt0YWJsZVtrZXldID0gdmFsdWV9LgorTGlrZSB0aGUgaW5kZXggZXZlbnQsCit0aGlzIGV2ZW50IGhhcHBlbnMgd2hlbiBAaWR7dGFibGV9IGlzIG5vdCBhIHRhYmxlIG9yCit3aGVuIEBpZHtrZXl9IGlzIG5vdCBwcmVzZW50IGluIEBpZHt0YWJsZX0uCitUaGUgbWV0YW1ldGhvZCBpcyBsb29rZWQgdXAgaW4gQGlke3RhYmxlfS4KKworTGlrZSB3aXRoIGluZGV4aW5nLAordGhlIG1ldGFtZXRob2QgZm9yIHRoaXMgZXZlbnQgY2FuIGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yIGEgdGFibGUuCitJZiBpdCBpcyBhIGZ1bmN0aW9uLAoraXQgaXMgY2FsbGVkIHdpdGggQGlke3RhYmxlfSwgQGlke2tleX0sIGFuZCBAaWR7dmFsdWV9IGFzIGFyZ3VtZW50cy4KK0lmIGl0IGlzIGEgdGFibGUsCitMdWEgZG9lcyBhbiBpbmRleGluZyBhc3NpZ25tZW50IHRvIHRoaXMgdGFibGUgd2l0aCB0aGUgc2FtZSBrZXkgYW5kIHZhbHVlLgorKFRoaXMgYXNzaWdubWVudCBpcyByZWd1bGFyLCBub3QgcmF3LAorYW5kIHRoZXJlZm9yZSBjYW4gdHJpZ2dlciBhbm90aGVyIG1ldGFtZXRob2QuKQorCitXaGVuZXZlciB0aGVyZSBpcyBhIEBpZHh7X19uZXdpbmRleH0gbWV0YW1ldGhvZCwKK0x1YSBkb2VzIG5vdCBwZXJmb3JtIHRoZSBwcmltaXRpdmUgYXNzaWdubWVudC4KKyhJZiBuZWNlc3NhcnksCit0aGUgbWV0YW1ldGhvZCBpdHNlbGYgY2FuIGNhbGwgQExpZHtyYXdzZXR9Cit0byBkbyB0aGUgYXNzaWdubWVudC4pCit9CisKK0BpdGVte0BpZHh7X19jYWxsfXwKK1RoZSBjYWxsIG9wZXJhdGlvbiBAVHtmdW5jKGFyZ3MpfS4KK1RoaXMgZXZlbnQgaGFwcGVucyB3aGVuIEx1YSB0cmllcyB0byBjYWxsIGEgbm9uLWZ1bmN0aW9uIHZhbHVlCisodGhhdCBpcywgQGlke2Z1bmN9IGlzIG5vdCBhIGZ1bmN0aW9uKS4KK1RoZSBtZXRhbWV0aG9kIGlzIGxvb2tlZCB1cCBpbiBAaWR7ZnVuY30uCitJZiBwcmVzZW50LAordGhlIG1ldGFtZXRob2QgaXMgY2FsbGVkIHdpdGggQGlke2Z1bmN9IGFzIGl0cyBmaXJzdCBhcmd1bWVudCwKK2ZvbGxvd2VkIGJ5IHRoZSBhcmd1bWVudHMgb2YgdGhlIG9yaWdpbmFsIGNhbGwgKEBpZHthcmdzfSkuCitBbGwgcmVzdWx0cyBvZiB0aGUgY2FsbAorYXJlIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyhUaGlzIGlzIHRoZSBvbmx5IG1ldGFtZXRob2QgdGhhdCBhbGxvd3MgbXVsdGlwbGUgcmVzdWx0cy4pCit9CisKK30KKworSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGFkZCBhbGwgbmVlZGVkIG1ldGFtZXRob2RzIHRvIGEgdGFibGUKK2JlZm9yZSBzZXR0aW5nIGl0IGFzIGEgbWV0YXRhYmxlIG9mIHNvbWUgb2JqZWN0LgorSW4gcGFydGljdWxhciwgdGhlIEBpZHh7X19nY30gbWV0YW1ldGhvZCB3b3JrcyBvbmx5IHdoZW4gdGhpcyBvcmRlcgoraXMgZm9sbG93ZWQgQHNlZXtmaW5hbGl6ZXJzfS4KKworQmVjYXVzZSBtZXRhdGFibGVzIGFyZSByZWd1bGFyIHRhYmxlcywKK3RoZXkgY2FuIGNvbnRhaW4gYXJiaXRyYXJ5IGZpZWxkcywKK25vdCBvbmx5IHRoZSBldmVudCBuYW1lcyBkZWZpbmVkIGFib3ZlLgorU29tZSBmdW5jdGlvbnMgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkKKyhlLmcuLCBATGlke3Rvc3RyaW5nfSkKK3VzZSBvdGhlciBmaWVsZHMgaW4gbWV0YXRhYmxlcyBmb3IgdGhlaXIgb3duIHB1cnBvc2VzLgorCit9CisKK0BzZWN0MntHQ3wgQHRpdGxle0dhcmJhZ2UgQ29sbGVjdGlvbn0KKworTHVhIHBlcmZvcm1zIGF1dG9tYXRpYyBtZW1vcnkgbWFuYWdlbWVudC4KK1RoaXMgbWVhbnMgdGhhdAoreW91IGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IGFsbG9jYXRpbmcgbWVtb3J5IGZvciBuZXcgb2JqZWN0cworb3IgZnJlZWluZyBpdCB3aGVuIHRoZSBvYmplY3RzIGFyZSBubyBsb25nZXIgbmVlZGVkLgorTHVhIG1hbmFnZXMgbWVtb3J5IGF1dG9tYXRpY2FsbHkgYnkgcnVubmluZworYSBAZGVme2dhcmJhZ2UgY29sbGVjdG9yfSB0byBjb2xsZWN0IGFsbCBAZW1waHtkZWFkIG9iamVjdHN9CisodGhhdCBpcywgb2JqZWN0cyB0aGF0IGFyZSBubyBsb25nZXIgYWNjZXNzaWJsZSBmcm9tIEx1YSkuCitBbGwgbWVtb3J5IHVzZWQgYnkgTHVhIGlzIHN1YmplY3QgdG8gYXV0b21hdGljIG1hbmFnZW1lbnQ6CitzdHJpbmdzLCB0YWJsZXMsIHVzZXJkYXRhLCBmdW5jdGlvbnMsIHRocmVhZHMsIGludGVybmFsIHN0cnVjdHVyZXMsIGV0Yy4KKworVGhlIGdhcmJhZ2UgY29sbGVjdG9yIChHQykgaW4gTHVhIGNhbiB3b3JrIGluIHR3byBtb2RlczoKK2luY3JlbWVudGFsIGFuZCBnZW5lcmF0aW9uYWwuCisKK1RoZSBkZWZhdWx0IEdDIG1vZGUgd2l0aCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzCithcmUgYWRlcXVhdGUgZm9yIG1vc3QgdXNlcy4KK1Byb2dyYW1zIHRoYXQgd2FzdGUgYSBsYXJnZSBwcm9wb3J0aW9uIG9mIGl0cyB0aW1lCithbGxvY2F0aW5nIGFuZCBmcmVlaW5nIG1lbW9yeSBjYW4gYmVuZWZpdCBmcm9tIG90aGVyIHNldHRpbmdzLgorS2VlcCBpbiBtaW5kIHRoYXQgdGhlIEdDIGJlaGF2aW9yIGlzIG5vbi1wb3J0YWJsZQorYm90aCBhY3Jvc3MgcGxhdGZvcm1zIGFuZCBhY3Jvc3MgZGlmZmVyZW50IEx1YSByZWxlYXNlczsKK3RoZXJlZm9yZSwgb3B0aW1hbCBzZXR0aW5ncyBhcmUgYWxzbyBub24tcG9ydGFibGUuCisKK1lvdSBjYW4gY2hhbmdlIHRoZSBHQyBtb2RlIGFuZCBwYXJhbWV0ZXJzIGJ5IGNhbGxpbmcKK0BMaWR7bHVhX2djfSBpbiBDCitvciBATGlke2NvbGxlY3RnYXJiYWdlfSBpbiBMdWEuCitZb3UgY2FuIGFsc28gdXNlIHRoZXNlIGZ1bmN0aW9ucyB0byBjb250cm9sCit0aGUgY29sbGVjdG9yIGRpcmVjdGx5IChlLmcuLCBzdG9wIGFuZCByZXN0YXJ0IGl0KS4KKworQHNlY3Qze0B0aXRsZXtJbmNyZW1lbnRhbCBHYXJiYWdlIENvbGxlY3Rpb259CisKK0luIGluY3JlbWVudGFsIG1vZGUsCitlYWNoIEdDIGN5Y2xlIHBlcmZvcm1zIGEgbWFyay1hbmQtc3dlZXAgY29sbGVjdGlvbiBpbiBzbWFsbCBzdGVwcworaW50ZXJsZWF2ZWQgd2l0aCB0aGUgcHJvZ3JhbSdzIGV4ZWN1dGlvbi4KK0luIHRoaXMgbW9kZSwKK3RoZSBjb2xsZWN0b3IgdXNlcyB0aHJlZSBudW1iZXJzIHRvIGNvbnRyb2wgaXRzIGdhcmJhZ2UtY29sbGVjdGlvbiBjeWNsZXM6Cit0aGUgQGRlZntnYXJiYWdlLWNvbGxlY3RvciBwYXVzZX0sCit0aGUgQGRlZntnYXJiYWdlLWNvbGxlY3RvciBzdGVwIG11bHRpcGxpZXJ9LAorYW5kIHRoZSBAZGVme2dhcmJhZ2UtY29sbGVjdG9yIHN0ZXAgc2l6ZX0uCisKK1RoZSBnYXJiYWdlLWNvbGxlY3RvciBwYXVzZQorY29udHJvbHMgaG93IGxvbmcgdGhlIGNvbGxlY3RvciB3YWl0cyBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgY3ljbGUuCitUaGUgY29sbGVjdG9yIHN0YXJ0cyBhIG5ldyBjeWNsZSB3aGVuIHRoZSB1c2Ugb2YgbWVtb3J5CitoaXRzIEBNe24lfSBvZiB0aGUgdXNlIGFmdGVyIHRoZSBwcmV2aW91cyBjb2xsZWN0aW9uLgorTGFyZ2VyIHZhbHVlcyBtYWtlIHRoZSBjb2xsZWN0b3IgbGVzcyBhZ2dyZXNzaXZlLgorVmFsdWVzIHNtYWxsZXIgdGhhbiAxMDAgbWVhbiB0aGUgY29sbGVjdG9yIHdpbGwgbm90IHdhaXQgdG8KK3N0YXJ0IGEgbmV3IGN5Y2xlLgorQSB2YWx1ZSBvZiAyMDAgbWVhbnMgdGhhdCB0aGUgY29sbGVjdG9yIHdhaXRzIGZvciB0aGUgdG90YWwgbWVtb3J5IGluIHVzZQordG8gZG91YmxlIGJlZm9yZSBzdGFydGluZyBhIG5ldyBjeWNsZS4KK1RoZSBkZWZhdWx0IHZhbHVlIGlzIDIwMDsgdGhlIG1heGltdW0gdmFsdWUgaXMgMTAwMC4KKworVGhlIGdhcmJhZ2UtY29sbGVjdG9yIHN0ZXAgbXVsdGlwbGllcgorY29udHJvbHMgdGhlIHJlbGF0aXZlIHNwZWVkIG9mIHRoZSBjb2xsZWN0b3IgcmVsYXRpdmUgdG8KK21lbW9yeSBhbGxvY2F0aW9uLAordGhhdCBpcywKK2hvdyBtYW55IGVsZW1lbnRzIGl0IG1hcmtzIG9yIHN3ZWVwcyBmb3IgZWFjaAora2lsb2J5dGUgb2YgbWVtb3J5IGFsbG9jYXRlZC4KK0xhcmdlciB2YWx1ZXMgbWFrZSB0aGUgY29sbGVjdG9yIG1vcmUgYWdncmVzc2l2ZSBidXQgYWxzbyBpbmNyZWFzZQordGhlIHNpemUgb2YgZWFjaCBpbmNyZW1lbnRhbCBzdGVwLgorWW91IHNob3VsZCBub3QgdXNlIHZhbHVlcyBzbWFsbGVyIHRoYW4gMTAwLAorYmVjYXVzZSB0aGV5IG1ha2UgdGhlIGNvbGxlY3RvciB0b28gc2xvdyBhbmQKK2NhbiByZXN1bHQgaW4gdGhlIGNvbGxlY3RvciBuZXZlciBmaW5pc2hpbmcgYSBjeWNsZS4KK1RoZSBkZWZhdWx0IHZhbHVlIGlzIDEwMDsgIHRoZSBtYXhpbXVtIHZhbHVlIGlzIDEwMDAuCisKK1RoZSBnYXJiYWdlLWNvbGxlY3RvciBzdGVwIHNpemUgY29udHJvbHMgdGhlCitzaXplIG9mIGVhY2ggaW5jcmVtZW50YWwgc3RlcCwKK3NwZWNpZmljYWxseSBob3cgbWFueSBieXRlcyB0aGUgaW50ZXJwcmV0ZXIgYWxsb2NhdGVzCitiZWZvcmUgcGVyZm9ybWluZyBhIHN0ZXAuCitUaGlzIHBhcmFtZXRlciBpcyBsb2dhcml0aG1pYzoKK0EgdmFsdWUgb2YgQE17bn0gbWVhbnMgdGhlIGludGVycHJldGVyIHdpbGwgYWxsb2NhdGUgQE17MkBzcHtufX0KK2J5dGVzIGJldHdlZW4gc3RlcHMgYW5kIHBlcmZvcm0gZXF1aXZhbGVudCB3b3JrIGR1cmluZyB0aGUgc3RlcC4KK0EgbGFyZ2UgdmFsdWUgKGUuZy4sIDYwKSBtYWtlcyB0aGUgY29sbGVjdG9yIGEgc3RvcC10aGUtd29ybGQKKyhub24taW5jcmVtZW50YWwpIGNvbGxlY3Rvci4KK1RoZSBkZWZhdWx0IHZhbHVlIGlzIDEzLAord2hpY2ggbWFrZXMgZm9yIHN0ZXBzIG9mIGFwcHJveGltYXRlbHkgQE57OCBLYnl0ZXN9LgorCit9CisKK0BzZWN0M3tAdGl0bGV7R2VuZXJhdGlvbmFsIEdhcmJhZ2UgQ29sbGVjdGlvbn0KKworSW4gZ2VuZXJhdGlvbmFsIG1vZGUsCit0aGUgY29sbGVjdG9yIGRvZXMgZnJlcXVlbnQgQGVtcGh7bWlub3J9IGNvbGxlY3Rpb25zLAord2hpY2ggdHJhdmVyc2VzIG9ubHkgb2JqZWN0cyByZWNlbnRseSBjcmVhdGVkLgorSWYgYWZ0ZXIgYSBtaW5vciBjb2xsZWN0aW9uIHRoZSB1c2Ugb2YgbWVtb3J5IGlzIHN0aWxsIGFib3ZlIGEgbGltaXQsCit0aGUgY29sbGVjdG9yIGRvZXMgYSBAZW1waHttYWpvcn0gY29sbGVjdGlvbiwKK3doaWNoIHRyYXZlcnNlcyBhbGwgb2JqZWN0cy4KK1RoZSBnZW5lcmF0aW9uYWwgbW9kZSB1c2VzIHR3byBwYXJhbWV0ZXJzOgordGhlIEBkZWZ7bWFqb3IgbXVsdGlwbGllcn0gYW5kIHRoZSBAZGVme3RoZSBtaW5vciBtdWx0aXBsaWVyfS4KKworVGhlIG1ham9yIG11bHRpcGxpZXIgY29udHJvbHMgdGhlIGZyZXF1ZW5jeSBvZiBtYWpvciBjb2xsZWN0aW9ucy4KK0ZvciBhIG1ham9yIG11bHRpcGxpZXIgQE17eH0sCithIG5ldyBtYWpvciBjb2xsZWN0aW9uIHdpbGwgYmUgZG9uZSB3aGVuIG1lbW9yeQorZ3Jvd3MgQE17eCV9IGxhcmdlciB0aGFuIHRoZSBtZW1vcnkgaW4gdXNlIGFmdGVyIHRoZSBwcmV2aW91cyBtYWpvcgorY29sbGVjdGlvbi4KK0ZvciBpbnN0YW5jZSwgZm9yIGEgbXVsdGlwbGllciBvZiAxMDAsCit0aGUgY29sbGVjdG9yIHdpbGwgZG8gYSBtYWpvciBjb2xsZWN0aW9uIHdoZW4gdGhlIHVzZSBvZiBtZW1vcnkKK2dldHMgbGFyZ2VyIHRoYW4gdHdpY2UgdGhlIHVzZSBhZnRlciB0aGUgcHJldmlvdXMgY29sbGVjdGlvbi4KK1RoZSBkZWZhdWx0IHZhbHVlIGlzIDEwMDsgdGhlIG1heGltdW0gdmFsdWUgaXMgMTAwMC4KKworVGhlIG1pbm9yIG11bHRpcGxpZXIgY29udHJvbHMgdGhlIGZyZXF1ZW5jeSBvZiBtaW5vciBjb2xsZWN0aW9ucy4KK0ZvciBhIG1pbm9yIG11bHRpcGxpZXIgQE17eH0sCithIG5ldyBtaW5vciBjb2xsZWN0aW9uIHdpbGwgYmUgZG9uZSB3aGVuIG1lbW9yeQorZ3Jvd3MgQE17eCV9IGxhcmdlciB0aGFuIHRoZSBtZW1vcnkgaW4gdXNlIGFmdGVyIHRoZSBwcmV2aW91cyBtYWpvcgorY29sbGVjdGlvbi4KK0ZvciBpbnN0YW5jZSwgZm9yIGEgbXVsdGlwbGllciBvZiAyMCwKK3RoZSBjb2xsZWN0b3Igd2lsbCBkbyBhIG1pbm9yIGNvbGxlY3Rpb24gd2hlbiB0aGUgdXNlIG9mIG1lbW9yeQorZ2V0cyAyMCUgbGFyZ2VyIHRoYW4gdGhlIHVzZSBhZnRlciB0aGUgcHJldmlvdXMgbWFqb3IgY29sbGVjdGlvbi4KK1RoZSBkZWZhdWx0IHZhbHVlIGlzIDIwOyB0aGUgbWF4aW11bSB2YWx1ZSBpcyAyMDAuCisKK30KKworQHNlY3Qze2ZpbmFsaXplcnN8IEB0aXRsZXtHYXJiYWdlLUNvbGxlY3Rpb24gTWV0YW1ldGhvZHN9CisKK1lvdSBjYW4gc2V0IGdhcmJhZ2UtY29sbGVjdG9yIG1ldGFtZXRob2RzIGZvciB0YWJsZXMKK2FuZCwgdXNpbmcgdGhlIEBOe0MgQVBJfSwKK2ZvciBmdWxsIHVzZXJkYXRhIEBzZWV7bWV0YXRhYmxlfS4KK1RoZXNlIG1ldGFtZXRob2RzIGFyZSBhbHNvIGNhbGxlZCBAZGVme2ZpbmFsaXplcnN9LgorRmluYWxpemVycyBhbGxvdyB5b3UgdG8gY29vcmRpbmF0ZSBMdWEncyBnYXJiYWdlIGNvbGxlY3Rpb24KK3dpdGggZXh0ZXJuYWwgcmVzb3VyY2UgbWFuYWdlbWVudAorKHN1Y2ggYXMgY2xvc2luZyBmaWxlcywgbmV0d29yayBvciBkYXRhYmFzZSBjb25uZWN0aW9ucywKK29yIGZyZWVpbmcgeW91ciBvd24gbWVtb3J5KS4KKworRm9yIGFuIG9iamVjdCAodGFibGUgb3IgdXNlcmRhdGEpIHRvIGJlIGZpbmFsaXplZCB3aGVuIGNvbGxlY3RlZCwKK3lvdSBtdXN0IEBlbXBoe21hcmt9IGl0IGZvciBmaW5hbGl6YXRpb24uCitAaW5kZXh7bWFyayAoZm9yIGZpbmFsaXphdGlvbil9CitZb3UgbWFyayBhbiBvYmplY3QgZm9yIGZpbmFsaXphdGlvbiB3aGVuIHlvdSBzZXQgaXRzIG1ldGF0YWJsZQorYW5kIHRoZSBtZXRhdGFibGUgaGFzIGEgZmllbGQgaW5kZXhlZCBieSB0aGUgc3RyaW5nIEBTdHtfX2djfS4KK05vdGUgdGhhdCBpZiB5b3Ugc2V0IGEgbWV0YXRhYmxlIHdpdGhvdXQgYSBAaWR4e19fZ2N9IGZpZWxkCithbmQgbGF0ZXIgY3JlYXRlIHRoYXQgZmllbGQgaW4gdGhlIG1ldGF0YWJsZSwKK3RoZSBvYmplY3Qgd2lsbCBub3QgYmUgbWFya2VkIGZvciBmaW5hbGl6YXRpb24uCisKK1doZW4gYSBtYXJrZWQgb2JqZWN0IGJlY29tZXMgZ2FyYmFnZSwKK2l0IGlzIG5vdCBjb2xsZWN0ZWQgaW1tZWRpYXRlbHkgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorSW5zdGVhZCwgTHVhIHB1dHMgaXQgaW4gYSBsaXN0LgorQWZ0ZXIgdGhlIGNvbGxlY3Rpb24sCitMdWEgZ29lcyB0aHJvdWdoIHRoYXQgbGlzdC4KK0ZvciBlYWNoIG9iamVjdCBpbiB0aGUgbGlzdCwKK2l0IGNoZWNrcyB0aGUgb2JqZWN0J3MgQGlkeHtfX2djfSBtZXRhbWV0aG9kOgorSWYgaXQgaXMgYSBmdW5jdGlvbiwKK0x1YSBjYWxscyBpdCB3aXRoIHRoZSBvYmplY3QgYXMgaXRzIHNpbmdsZSBhcmd1bWVudDsKK2lmIHRoZSBtZXRhbWV0aG9kIGlzIG5vdCBhIGZ1bmN0aW9uLAorTHVhIHNpbXBseSBpZ25vcmVzIGl0LgorCitBdCB0aGUgZW5kIG9mIGVhY2ggZ2FyYmFnZS1jb2xsZWN0aW9uIGN5Y2xlLAordGhlIGZpbmFsaXplcnMgZm9yIG9iamVjdHMgYXJlIGNhbGxlZCBpbgordGhlIHJldmVyc2Ugb3JkZXIgdGhhdCB0aGUgb2JqZWN0cyB3ZXJlIG1hcmtlZCBmb3IgZmluYWxpemF0aW9uLAorYW1vbmcgdGhvc2UgY29sbGVjdGVkIGluIHRoYXQgY3ljbGU7Cit0aGF0IGlzLCB0aGUgZmlyc3QgZmluYWxpemVyIHRvIGJlIGNhbGxlZCBpcyB0aGUgb25lIGFzc29jaWF0ZWQKK3dpdGggdGhlIG9iamVjdCBtYXJrZWQgbGFzdCBpbiB0aGUgcHJvZ3JhbS4KK1RoZSBleGVjdXRpb24gb2YgZWFjaCBmaW5hbGl6ZXIgbWF5IG9jY3VyIGF0IGFueSBwb2ludCBkdXJpbmcKK3RoZSBleGVjdXRpb24gb2YgdGhlIHJlZ3VsYXIgY29kZS4KKworQmVjYXVzZSB0aGUgb2JqZWN0IGJlaW5nIGNvbGxlY3RlZCBtdXN0IHN0aWxsIGJlIHVzZWQgYnkgdGhlIGZpbmFsaXplciwKK3RoYXQgb2JqZWN0IChhbmQgb3RoZXIgb2JqZWN0cyBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBpdCkKK211c3QgYmUgQGVtcGh7cmVzdXJyZWN0ZWR9IGJ5IEx1YS5AaW5kZXh7cmVzdXJyZWN0aW9ufQorVXN1YWxseSwgdGhpcyByZXN1cnJlY3Rpb24gaXMgdHJhbnNpZW50LAorYW5kIHRoZSBvYmplY3QgbWVtb3J5IGlzIGZyZWVkIGluIHRoZSBuZXh0IGdhcmJhZ2UtY29sbGVjdGlvbiBjeWNsZS4KK0hvd2V2ZXIsIGlmIHRoZSBmaW5hbGl6ZXIgc3RvcmVzIHRoZSBvYmplY3QgaW4gc29tZSBnbG9iYWwgcGxhY2UKKyhlLmcuLCBhIGdsb2JhbCB2YXJpYWJsZSksCit0aGVuIHRoZSByZXN1cnJlY3Rpb24gaXMgcGVybWFuZW50LgorTW9yZW92ZXIsIGlmIHRoZSBmaW5hbGl6ZXIgbWFya3MgYSBmaW5hbGl6aW5nIG9iamVjdCBmb3IgZmluYWxpemF0aW9uIGFnYWluLAoraXRzIGZpbmFsaXplciB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBpbiB0aGUgbmV4dCBjeWNsZSB3aGVyZSB0aGUKK29iamVjdCBpcyB1bnJlYWNoYWJsZS4KK0luIGFueSBjYXNlLAordGhlIG9iamVjdCBtZW1vcnkgaXMgZnJlZWQgb25seSBpbiBhIEdDIGN5Y2xlIHdoZXJlCit0aGUgb2JqZWN0IGlzIHVucmVhY2hhYmxlIGFuZCBub3QgbWFya2VkIGZvciBmaW5hbGl6YXRpb24uCisKK1doZW4geW91IGNsb3NlIGEgc3RhdGUgQHNlZUZ7bHVhX2Nsb3NlfSwKK0x1YSBjYWxscyB0aGUgZmluYWxpemVycyBvZiBhbGwgb2JqZWN0cyBtYXJrZWQgZm9yIGZpbmFsaXphdGlvbiwKK2ZvbGxvd2luZyB0aGUgcmV2ZXJzZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBtYXJrZWQuCitJZiBhbnkgZmluYWxpemVyIG1hcmtzIG9iamVjdHMgZm9yIGNvbGxlY3Rpb24gZHVyaW5nIHRoYXQgcGhhc2UsCit0aGVzZSBtYXJrcyBoYXZlIG5vIGVmZmVjdC4KKworfQorCitAc2VjdDN7d2Vhay10YWJsZXwgQHRpdGxle1dlYWsgVGFibGVzfQorCitBIEBkZWZ7d2VhayB0YWJsZX0gaXMgYSB0YWJsZSB3aG9zZSBlbGVtZW50cyBhcmUKK0BkZWZ7d2VhayByZWZlcmVuY2VzfS4KK0Egd2VhayByZWZlcmVuY2UgaXMgaWdub3JlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCitJbiBvdGhlciB3b3JkcywKK2lmIHRoZSBvbmx5IHJlZmVyZW5jZXMgdG8gYW4gb2JqZWN0IGFyZSB3ZWFrIHJlZmVyZW5jZXMsCit0aGVuIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB3aWxsIGNvbGxlY3QgdGhhdCBvYmplY3QuCisKK0Egd2VhayB0YWJsZSBjYW4gaGF2ZSB3ZWFrIGtleXMsIHdlYWsgdmFsdWVzLCBvciBib3RoLgorQSB0YWJsZSB3aXRoIHdlYWsgdmFsdWVzIGFsbG93cyB0aGUgY29sbGVjdGlvbiBvZiBpdHMgdmFsdWVzLAorYnV0IHByZXZlbnRzIHRoZSBjb2xsZWN0aW9uIG9mIGl0cyBrZXlzLgorQSB0YWJsZSB3aXRoIGJvdGggd2VhayBrZXlzIGFuZCB3ZWFrIHZhbHVlcyBhbGxvd3MgdGhlIGNvbGxlY3Rpb24gb2YKK2JvdGgga2V5cyBhbmQgdmFsdWVzLgorSW4gYW55IGNhc2UsIGlmIGVpdGhlciB0aGUga2V5IG9yIHRoZSB2YWx1ZSBpcyBjb2xsZWN0ZWQsCit0aGUgd2hvbGUgcGFpciBpcyByZW1vdmVkIGZyb20gdGhlIHRhYmxlLgorVGhlIHdlYWtuZXNzIG9mIGEgdGFibGUgaXMgY29udHJvbGxlZCBieSB0aGUKK0BpZHh7X19tb2RlfSBmaWVsZCBvZiBpdHMgbWV0YXRhYmxlLgorVGhpcyBmaWVsZCwgaWYgcHJlc2VudCwgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdHJpbmdzOgorQFN0e2t9LCBmb3IgYSB0YWJsZSB3aXRoIHdlYWsga2V5czsKK0BTdHt2fSwgZm9yIGEgdGFibGUgd2l0aCB3ZWFrIHZhbHVlczsKK29yIEBTdHtrdn0sIGZvciBhIHRhYmxlIHdpdGggYm90aCB3ZWFrIGtleXMgYW5kIHZhbHVlcy4KKworQSB0YWJsZSB3aXRoIHdlYWsga2V5cyBhbmQgc3Ryb25nIHZhbHVlcworaXMgYWxzbyBjYWxsZWQgYW4gQGRlZntlcGhlbWVyb24gdGFibGV9LgorSW4gYW4gZXBoZW1lcm9uIHRhYmxlLAorYSB2YWx1ZSBpcyBjb25zaWRlcmVkIHJlYWNoYWJsZSBvbmx5IGlmIGl0cyBrZXkgaXMgcmVhY2hhYmxlLgorSW4gcGFydGljdWxhciwKK2lmIHRoZSBvbmx5IHJlZmVyZW5jZSB0byBhIGtleSBjb21lcyB0aHJvdWdoIGl0cyB2YWx1ZSwKK3RoZSBwYWlyIGlzIHJlbW92ZWQuCisKK0FueSBjaGFuZ2UgaW4gdGhlIHdlYWtuZXNzIG9mIGEgdGFibGUgbWF5IHRha2UgZWZmZWN0IG9ubHkKK2F0IHRoZSBuZXh0IGNvbGxlY3QgY3ljbGUuCitJbiBwYXJ0aWN1bGFyLCBpZiB5b3UgY2hhbmdlIHRoZSB3ZWFrbmVzcyB0byBhIHN0cm9uZ2VyIG1vZGUsCitMdWEgbWF5IHN0aWxsIGNvbGxlY3Qgc29tZSBpdGVtcyBmcm9tIHRoYXQgdGFibGUKK2JlZm9yZSB0aGUgY2hhbmdlIHRha2VzIGVmZmVjdC4KKworT25seSBvYmplY3RzIHRoYXQgaGF2ZSBhbiBleHBsaWNpdCBjb25zdHJ1Y3Rpb24KK2FyZSByZW1vdmVkIGZyb20gd2VhayB0YWJsZXMuCitWYWx1ZXMsIHN1Y2ggYXMgbnVtYmVycyBhbmQgQHh7bGlnaHQgQE57QyBmdW5jdGlvbnN9fSwKK2FyZSBub3Qgc3ViamVjdCB0byBnYXJiYWdlIGNvbGxlY3Rpb24sCithbmQgdGhlcmVmb3JlIGFyZSBub3QgcmVtb3ZlZCBmcm9tIHdlYWsgdGFibGVzCisodW5sZXNzIHRoZWlyIGFzc29jaWF0ZWQgdmFsdWVzIGFyZSBjb2xsZWN0ZWQpLgorQWx0aG91Z2ggc3RyaW5ncyBhcmUgc3ViamVjdCB0byBnYXJiYWdlIGNvbGxlY3Rpb24sCit0aGV5IGRvIG5vdCBoYXZlIGFuIGV4cGxpY2l0IGNvbnN0cnVjdGlvbiwKK2FuZCB0aGVyZWZvcmUgYXJlIG5vdCByZW1vdmVkIGZyb20gd2VhayB0YWJsZXMuCisKK1Jlc3VycmVjdGVkIG9iamVjdHMKKyh0aGF0IGlzLCBvYmplY3RzIGJlaW5nIGZpbmFsaXplZAorYW5kIG9iamVjdHMgYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggb2JqZWN0cyBiZWluZyBmaW5hbGl6ZWQpCitoYXZlIGEgc3BlY2lhbCBiZWhhdmlvciBpbiB3ZWFrIHRhYmxlcy4KK1RoZXkgYXJlIHJlbW92ZWQgZnJvbSB3ZWFrIHZhbHVlcyBiZWZvcmUgcnVubmluZyB0aGVpciBmaW5hbGl6ZXJzLAorYnV0IGFyZSByZW1vdmVkIGZyb20gd2VhayBrZXlzIG9ubHkgaW4gdGhlIG5leHQgY29sbGVjdGlvbgorYWZ0ZXIgcnVubmluZyB0aGVpciBmaW5hbGl6ZXJzLCB3aGVuIHN1Y2ggb2JqZWN0cyBhcmUgYWN0dWFsbHkgZnJlZWQuCitUaGlzIGJlaGF2aW9yIGFsbG93cyB0aGUgZmluYWxpemVyIHRvIGFjY2VzcyBwcm9wZXJ0aWVzCithc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCB0aHJvdWdoIHdlYWsgdGFibGVzLgorCitJZiBhIHdlYWsgdGFibGUgaXMgYW1vbmcgdGhlIHJlc3VycmVjdGVkIG9iamVjdHMgaW4gYSBjb2xsZWN0aW9uIGN5Y2xlLAoraXQgbWF5IG5vdCBiZSBwcm9wZXJseSBjbGVhcmVkIHVudGlsIHRoZSBuZXh0IGN5Y2xlLgorCit9CisKK30KKworQHNlY3Qye2Nvcm91dGluZXwgQHRpdGxle0Nvcm91dGluZXN9CisKK0x1YSBzdXBwb3J0cyBjb3JvdXRpbmVzLAorYWxzbyBjYWxsZWQgQGVtcGh4e2NvbGxhYm9yYXRpdmUgbXVsdGl0aHJlYWRpbmd9LgorQSBjb3JvdXRpbmUgaW4gTHVhIHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGhyZWFkIG9mIGV4ZWN1dGlvbi4KK1VubGlrZSB0aHJlYWRzIGluIG11bHRpdGhyZWFkIHN5c3RlbXMsIGhvd2V2ZXIsCithIGNvcm91dGluZSBvbmx5IHN1c3BlbmRzIGl0cyBleGVjdXRpb24gYnkgZXhwbGljaXRseSBjYWxsaW5nCithIHlpZWxkIGZ1bmN0aW9uLgorCitZb3UgY3JlYXRlIGEgY29yb3V0aW5lIGJ5IGNhbGxpbmcgQExpZHtjb3JvdXRpbmUuY3JlYXRlfS4KK0l0cyBzb2xlIGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24KK3RoYXQgaXMgdGhlIG1haW4gZnVuY3Rpb24gb2YgdGhlIGNvcm91dGluZS4KK1RoZSBAaWR7Y3JlYXRlfSBmdW5jdGlvbiBvbmx5IGNyZWF0ZXMgYSBuZXcgY29yb3V0aW5lIGFuZAorcmV0dXJucyBhIGhhbmRsZSB0byBpdCAoYW4gb2JqZWN0IG9mIHR5cGUgQGVtcGh7dGhyZWFkfSk7CitpdCBkb2VzIG5vdCBzdGFydCB0aGUgY29yb3V0aW5lLgorCitZb3UgZXhlY3V0ZSBhIGNvcm91dGluZSBieSBjYWxsaW5nIEBMaWR7Y29yb3V0aW5lLnJlc3VtZX0uCitXaGVuIHlvdSBmaXJzdCBjYWxsIEBMaWR7Y29yb3V0aW5lLnJlc3VtZX0sCitwYXNzaW5nIGFzIGl0cyBmaXJzdCBhcmd1bWVudAorYSB0aHJlYWQgcmV0dXJuZWQgYnkgQExpZHtjb3JvdXRpbmUuY3JlYXRlfSwKK3RoZSBjb3JvdXRpbmUgc3RhcnRzIGl0cyBleGVjdXRpb24gYnkKK2NhbGxpbmcgaXRzIG1haW4gZnVuY3Rpb24uCitFeHRyYSBhcmd1bWVudHMgcGFzc2VkIHRvIEBMaWR7Y29yb3V0aW5lLnJlc3VtZX0gYXJlIHBhc3NlZAorYXMgYXJndW1lbnRzIHRvIHRoYXQgZnVuY3Rpb24uCitBZnRlciB0aGUgY29yb3V0aW5lIHN0YXJ0cyBydW5uaW5nLAoraXQgcnVucyB1bnRpbCBpdCB0ZXJtaW5hdGVzIG9yIEBlbXBoe3lpZWxkc30uCisKK0EgY29yb3V0aW5lIGNhbiB0ZXJtaW5hdGUgaXRzIGV4ZWN1dGlvbiBpbiB0d28gd2F5czoKK25vcm1hbGx5LCB3aGVuIGl0cyBtYWluIGZ1bmN0aW9uIHJldHVybnMKKyhleHBsaWNpdGx5IG9yIGltcGxpY2l0bHksIGFmdGVyIHRoZSBsYXN0IGluc3RydWN0aW9uKTsKK2FuZCBhYm5vcm1hbGx5LCBpZiB0aGVyZSBpcyBhbiB1bnByb3RlY3RlZCBlcnJvci4KK0luIGNhc2Ugb2Ygbm9ybWFsIHRlcm1pbmF0aW9uLAorQExpZHtjb3JvdXRpbmUucmVzdW1lfSByZXR1cm5zIEB0cnVlLAorcGx1cyBhbnkgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjb3JvdXRpbmUgbWFpbiBmdW5jdGlvbi4KK0luIGNhc2Ugb2YgZXJyb3JzLCBATGlke2Nvcm91dGluZS5yZXN1bWV9IHJldHVybnMgQGZhbHNlCitwbHVzIGFuIGVycm9yIG9iamVjdC4KKworQSBjb3JvdXRpbmUgeWllbGRzIGJ5IGNhbGxpbmcgQExpZHtjb3JvdXRpbmUueWllbGR9LgorV2hlbiBhIGNvcm91dGluZSB5aWVsZHMsCit0aGUgY29ycmVzcG9uZGluZyBATGlke2Nvcm91dGluZS5yZXN1bWV9IHJldHVybnMgaW1tZWRpYXRlbHksCitldmVuIGlmIHRoZSB5aWVsZCBoYXBwZW5zIGluc2lkZSBuZXN0ZWQgZnVuY3Rpb24gY2FsbHMKKyh0aGF0IGlzLCBub3QgaW4gdGhlIG1haW4gZnVuY3Rpb24sCitidXQgaW4gYSBmdW5jdGlvbiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGNhbGxlZCBieSB0aGUgbWFpbiBmdW5jdGlvbikuCitJbiB0aGUgY2FzZSBvZiBhIHlpZWxkLCBATGlke2Nvcm91dGluZS5yZXN1bWV9IGFsc28gcmV0dXJucyBAdHJ1ZSwKK3BsdXMgYW55IHZhbHVlcyBwYXNzZWQgdG8gQExpZHtjb3JvdXRpbmUueWllbGR9LgorVGhlIG5leHQgdGltZSB5b3UgcmVzdW1lIHRoZSBzYW1lIGNvcm91dGluZSwKK2l0IGNvbnRpbnVlcyBpdHMgZXhlY3V0aW9uIGZyb20gdGhlIHBvaW50IHdoZXJlIGl0IHlpZWxkZWQsCit3aXRoIHRoZSBjYWxsIHRvIEBMaWR7Y29yb3V0aW5lLnlpZWxkfSByZXR1cm5pbmcgYW55IGV4dHJhCithcmd1bWVudHMgcGFzc2VkIHRvIEBMaWR7Y29yb3V0aW5lLnJlc3VtZX0uCisKK0xpa2UgQExpZHtjb3JvdXRpbmUuY3JlYXRlfSwKK3RoZSBATGlke2Nvcm91dGluZS53cmFwfSBmdW5jdGlvbiBhbHNvIGNyZWF0ZXMgYSBjb3JvdXRpbmUsCitidXQgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIGNvcm91dGluZSBpdHNlbGYsCitpdCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHJlc3VtZXMgdGhlIGNvcm91dGluZS4KK0FueSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24KK2dvIGFzIGV4dHJhIGFyZ3VtZW50cyB0byBATGlke2Nvcm91dGluZS5yZXN1bWV9LgorQExpZHtjb3JvdXRpbmUud3JhcH0gcmV0dXJucyBhbGwgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBATGlke2Nvcm91dGluZS5yZXN1bWV9LAorZXhjZXB0IHRoZSBmaXJzdCBvbmUgKHRoZSBib29sZWFuIGVycm9yIGNvZGUpLgorVW5saWtlIEBMaWR7Y29yb3V0aW5lLnJlc3VtZX0sCitATGlke2Nvcm91dGluZS53cmFwfSBkb2VzIG5vdCBjYXRjaCBlcnJvcnM7CithbnkgZXJyb3IgaXMgcHJvcGFnYXRlZCB0byB0aGUgY2FsbGVyLgorCitBcyBhbiBleGFtcGxlIG9mIGhvdyBjb3JvdXRpbmVzIHdvcmssCitjb25zaWRlciB0aGUgZm9sbG93aW5nIGNvZGU6CitAdmVyYmF0aW17CitmdW5jdGlvbiBmb28gKGEpCisgIHByaW50KCJmb28iLCBhKQorICByZXR1cm4gY29yb3V0aW5lLnlpZWxkKDIqYSkKK2VuZAorCitjbyA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKGEsYikKKyAgICAgIHByaW50KCJjby1ib2R5IiwgYSwgYikKKyAgICAgIGxvY2FsIHIgPSBmb28oYSsxKQorICAgICAgcHJpbnQoImNvLWJvZHkiLCByKQorICAgICAgbG9jYWwgciwgcyA9IGNvcm91dGluZS55aWVsZChhK2IsIGEtYikKKyAgICAgIHByaW50KCJjby1ib2R5IiwgciwgcykKKyAgICAgIHJldHVybiBiLCAiZW5kIgorZW5kKQorCitwcmludCgibWFpbiIsIGNvcm91dGluZS5yZXN1bWUoY28sIDEsIDEwKSkKK3ByaW50KCJtYWluIiwgY29yb3V0aW5lLnJlc3VtZShjbywgInIiKSkKK3ByaW50KCJtYWluIiwgY29yb3V0aW5lLnJlc3VtZShjbywgIngiLCAieSIpKQorcHJpbnQoIm1haW4iLCBjb3JvdXRpbmUucmVzdW1lKGNvLCAieCIsICJ5IikpCit9CitXaGVuIHlvdSBydW4gaXQsIGl0IHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0OgorQHZlcmJhdGlteworY28tYm9keSAxICAgICAgIDEwCitmb28gICAgIDIKK21haW4gICAgdHJ1ZSAgICA0Citjby1ib2R5IHIKK21haW4gICAgdHJ1ZSAgICAxMSAgICAgIC05Citjby1ib2R5IHggICAgICAgeQorbWFpbiAgICB0cnVlICAgIDEwICAgICAgZW5kCittYWluICAgIGZhbHNlICAgY2Fubm90IHJlc3VtZSBkZWFkIGNvcm91dGluZQorfQorCitZb3UgY2FuIGFsc28gY3JlYXRlIGFuZCBtYW5pcHVsYXRlIGNvcm91dGluZXMgdGhyb3VnaCB0aGUgQyBBUEk6CitzZWUgZnVuY3Rpb25zIEBMaWR7bHVhX25ld3RocmVhZH0sIEBMaWR7bHVhX3Jlc3VtZX0sCithbmQgQExpZHtsdWFfeWllbGR9LgorCit9CisKK30KKworCitAQ3stLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfQorQHNlY3Qxe2xhbmd1YWdlfCBAdGl0bGV7VGhlIExhbmd1YWdlfQorCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBsZXhpcywgdGhlIHN5bnRheCwgYW5kIHRoZSBzZW1hbnRpY3Mgb2YgTHVhLgorSW4gb3RoZXIgd29yZHMsCit0aGlzIHNlY3Rpb24gZGVzY3JpYmVzCit3aGljaCB0b2tlbnMgYXJlIHZhbGlkLAoraG93IHRoZXkgY2FuIGJlIGNvbWJpbmVkLAorYW5kIHdoYXQgdGhlaXIgY29tYmluYXRpb25zIG1lYW4uCisKK0xhbmd1YWdlIGNvbnN0cnVjdHMgd2lsbCBiZSBleHBsYWluZWQgdXNpbmcgdGhlIHVzdWFsIGV4dGVuZGVkIEJORiBub3RhdGlvbiwKK2luIHdoaWNoCitATntAYm5mcmVwe0ByZXB7YX19IG1lYW5zIDB9IG9yIG1vcmUgQHJlcHthfSdzLCBhbmQKK0BOe0BibmZvcHR7QHJlcHthfX0gbWVhbnN9IGFuIG9wdGlvbmFsIEByZXB7YX0uCitOb24tdGVybWluYWxzIGFyZSBzaG93biBsaWtlIEBibmZOdGVye25vbi10ZXJtaW5hbH0sCitrZXl3b3JkcyBhcmUgc2hvd24gbGlrZSBAcnd7a3dvcmR9LAorYW5kIG90aGVyIHRlcm1pbmFsIHN5bWJvbHMgYXJlIHNob3duIGxpa2UgQGJuZnRlcns9fS4KK1RoZSBjb21wbGV0ZSBzeW50YXggb2YgTHVhIGNhbiBiZSBmb3VuZCBpbiBAcmVmc2Vje0JORn0KK2F0IHRoZSBlbmQgb2YgdGhpcyBtYW51YWwuCisKK0BzZWN0MntsZXhpY2FsfCBAdGl0bGV7TGV4aWNhbCBDb252ZW50aW9uc30KKworTHVhIGlzIGEgQHh7ZnJlZS1mb3JtfSBsYW5ndWFnZS4KK0l0IGlnbm9yZXMgc3BhY2VzIChpbmNsdWRpbmcgbmV3IGxpbmVzKSBhbmQgY29tbWVudHMKK2JldHdlZW4gbGV4aWNhbCBlbGVtZW50cyAoQHh7dG9rZW5zfSksCitleGNlcHQgYXMgZGVsaW1pdGVycyBiZXR3ZWVuIEB4e25hbWVzfSBhbmQgQHh7a2V5d29yZHN9LgorCitAZGVme05hbWVzfQorKGFsc28gY2FsbGVkIEBkZWZ7aWRlbnRpZmllcnN9KQoraW4gTHVhIGNhbiBiZSBhbnkgc3RyaW5nIG9mIGxldHRlcnMsCitkaWdpdHMsIGFuZCB1bmRlcnNjb3JlcywKK25vdCBiZWdpbm5pbmcgd2l0aCBhIGRpZ2l0IGFuZAorbm90IGJlaW5nIGEgcmVzZXJ2ZWQgd29yZC4KK0lkZW50aWZpZXJzIGFyZSB1c2VkIHRvIG5hbWUgdmFyaWFibGVzLCB0YWJsZSBmaWVsZHMsIGFuZCBsYWJlbHMuCisKK1RoZSBmb2xsb3dpbmcgQGRlZntrZXl3b3Jkc30gYXJlIHJlc2VydmVkCithbmQgY2Fubm90IGJlIHVzZWQgYXMgbmFtZXM6CitAaW5kZXh7cmVzZXJ2ZWQgd29yZHN9CitAdmVyYmF0aW17CithbmQgICAgICAgYnJlYWsgICAgIGRvICAgICAgICBlbHNlICAgICAgZWxzZWlmICAgIGVuZAorZmFsc2UgICAgIGZvciAgICAgICBmdW5jdGlvbiAgZ290byAgICAgIGlmICAgICAgICBpbgorbG9jYWwgICAgIG5pbCAgICAgICBub3QgICAgICAgb3IgICAgICAgIHJlcGVhdCAgICByZXR1cm4KK3RoZW4gICAgICB0cnVlICAgICAgdW50aWwgICAgIHdoaWxlCit9CisKK0x1YSBpcyBhIGNhc2Utc2Vuc2l0aXZlIGxhbmd1YWdlOgorQGlke2FuZH0gaXMgYSByZXNlcnZlZCB3b3JkLCBidXQgQGlke0FuZH0gYW5kIEBpZHtBTkR9CithcmUgdHdvIGRpZmZlcmVudCwgdmFsaWQgbmFtZXMuCitBcyBhIGNvbnZlbnRpb24sCitwcm9ncmFtcyBzaG91bGQgYXZvaWQgY3JlYXRpbmcKK25hbWVzIHRoYXQgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5CitvbmUgb3IgbW9yZSB1cHBlcmNhc2UgbGV0dGVycyAoc3VjaCBhcyBATGlke19WRVJTSU9OfSkuCisKK1RoZSBmb2xsb3dpbmcgc3RyaW5ncyBkZW5vdGUgb3RoZXIgQHh7dG9rZW5zfToKK0B2ZXJiYXRpbXsKKysgICAgIC0gICAgICogICAgIC8gICAgICUgICAgIF4gICAgICMKKyYgICAgIH4gICAgIHwgICAgIDw8ICAgID4+ICAgIC8vCis9PSAgICB+PSAgICA8PSAgICA+PSAgICA8ICAgICA+ICAgICA9CisoICAgICApICAgICB7ICAgICB9ICAgICBbICAgICBdICAgICA6OgorOyAgICAgOiAgICAgLCAgICAgLiAgICAgLi4gICAgLi4uCit9CisKK0EgQGRlZntzaG9ydCBsaXRlcmFsIHN0cmluZ30KK2NhbiBiZSBkZWxpbWl0ZWQgYnkgbWF0Y2hpbmcgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMsCithbmQgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBDLWxpa2UgZXNjYXBlIHNlcXVlbmNlczoKK0BDaGFye1xhfSAoYmVsbCksCitAQ2hhcntcYn0gKGJhY2tzcGFjZSksCitAQ2hhcntcZn0gKGZvcm0gZmVlZCksCitAQ2hhcntcbn0gKG5ld2xpbmUpLAorQENoYXJ7XHJ9IChjYXJyaWFnZSByZXR1cm4pLAorQENoYXJ7XHR9IChob3Jpem9udGFsIHRhYiksCitAQ2hhcntcdn0gKHZlcnRpY2FsIHRhYiksCitAQ2hhcntcXH0gKGJhY2tzbGFzaCksCitAQ2hhcntcIn0gKHF1b3RhdGlvbiBtYXJrIFtkb3VibGUgcXVvdGVdKSwKK2FuZCBAQ2hhcntcJ30gKGFwb3N0cm9waGUgW3NpbmdsZSBxdW90ZV0pLgorQSBiYWNrc2xhc2ggZm9sbG93ZWQgYnkgYSBsaW5lIGJyZWFrCityZXN1bHRzIGluIGEgbmV3bGluZSBpbiB0aGUgc3RyaW5nLgorVGhlIGVzY2FwZSBzZXF1ZW5jZSBAQ2hhcntcen0gc2tpcHMgdGhlIGZvbGxvd2luZyBzcGFuCitvZiB3aGl0ZS1zcGFjZSBjaGFyYWN0ZXJzLAoraW5jbHVkaW5nIGxpbmUgYnJlYWtzOworaXQgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB0byBicmVhayBhbmQgaW5kZW50IGEgbG9uZyBsaXRlcmFsIHN0cmluZworaW50byBtdWx0aXBsZSBsaW5lcyB3aXRob3V0IGFkZGluZyB0aGUgbmV3bGluZXMgYW5kIHNwYWNlcworaW50byB0aGUgc3RyaW5nIGNvbnRlbnRzLgorQSBzaG9ydCBsaXRlcmFsIHN0cmluZyBjYW5ub3QgY29udGFpbiB1bmVzY2FwZWQgbGluZSBicmVha3MKK25vciBlc2NhcGVzIG5vdCBmb3JtaW5nIGEgdmFsaWQgZXNjYXBlIHNlcXVlbmNlLgorCitXZSBjYW4gc3BlY2lmeSBhbnkgYnl0ZSBpbiBhIHNob3J0IGxpdGVyYWwgc3RyaW5nLAoraW5jbHVkaW5nIEB4e2VtYmVkZGVkIHplcm9zfSwKK2J5IGl0cyBudW1lcmljIHZhbHVlLgorVGhpcyBjYW4gYmUgZG9uZQord2l0aCB0aGUgZXNjYXBlIHNlcXVlbmNlIEBUe1x4QHJlcHtYWH19LAord2hlcmUgQHJlcHtYWH0gaXMgYSBzZXF1ZW5jZSBvZiBleGFjdGx5IHR3byBoZXhhZGVjaW1hbCBkaWdpdHMsCitvciB3aXRoIHRoZSBlc2NhcGUgc2VxdWVuY2UgQFR7XEByZXB7ZGRkfX0sCit3aGVyZSBAcmVwe2RkZH0gaXMgYSBzZXF1ZW5jZSBvZiB1cCB0byB0aHJlZSBkZWNpbWFsIGRpZ2l0cy4KKyhOb3RlIHRoYXQgaWYgYSBkZWNpbWFsIGVzY2FwZSBzZXF1ZW5jZSBpcyB0byBiZSBmb2xsb3dlZCBieSBhIGRpZ2l0LAoraXQgbXVzdCBiZSBleHByZXNzZWQgdXNpbmcgZXhhY3RseSB0aHJlZSBkaWdpdHMuKQorCitUaGUgQHh7VVRGLTh9IGVuY29kaW5nIG9mIGEgQHh7VW5pY29kZX0gY2hhcmFjdGVyCitjYW4gYmUgaW5zZXJ0ZWQgaW4gYSBsaXRlcmFsIHN0cmluZyB3aXRoCit0aGUgZXNjYXBlIHNlcXVlbmNlIEBUe1x1e0ByZXB7WFhYfX19Cisobm90ZSB0aGUgbWFuZGF0b3J5IGVuY2xvc2luZyBicmFja2V0cyksCit3aGVyZSBAcmVwe1hYWH0gaXMgYSBzZXF1ZW5jZSBvZiBvbmUgb3IgbW9yZSBoZXhhZGVjaW1hbCBkaWdpdHMKK3JlcHJlc2VudGluZyB0aGUgY2hhcmFjdGVyIGNvZGUgcG9pbnQuCisKK0xpdGVyYWwgc3RyaW5ncyBjYW4gYWxzbyBiZSBkZWZpbmVkIHVzaW5nIGEgbG9uZyBmb3JtYXQKK2VuY2xvc2VkIGJ5IEBkZWZ7bG9uZyBicmFja2V0c30uCitXZSBkZWZpbmUgYW4gQGRlZntvcGVuaW5nIGxvbmcgYnJhY2tldCBvZiBsZXZlbCBAcmVwe259fSBhcyBhbiBvcGVuaW5nCitzcXVhcmUgYnJhY2tldCBmb2xsb3dlZCBieSBAcmVwe259IGVxdWFsIHNpZ25zIGZvbGxvd2VkIGJ5IGFub3RoZXIKK29wZW5pbmcgc3F1YXJlIGJyYWNrZXQuCitTbywgYW4gb3BlbmluZyBsb25nIGJyYWNrZXQgb2YgQE57bGV2ZWwgMH0gaXMgd3JpdHRlbiBhcyBAVHtbW30sIEBDe11dfQorYW4gb3BlbmluZyBsb25nIGJyYWNrZXQgb2YgQE57bGV2ZWwgMX0gaXMgd3JpdHRlbiBhcyBAVHtbPVt9LCBAQ3tdXX0KK2FuZCBzbyBvbi4KK0EgQGVtcGh7Y2xvc2luZyBsb25nIGJyYWNrZXR9IGlzIGRlZmluZWQgc2ltaWxhcmx5OworZm9yIGluc3RhbmNlLAorYSBjbG9zaW5nIGxvbmcgYnJhY2tldCBvZiBATntsZXZlbCA0fSBpcyB3cml0dGVuIGFzIEBDe1tbfSBAVHtdPT09PV19LgorQSBAZGVme2xvbmcgbGl0ZXJhbH0gc3RhcnRzIHdpdGggYW4gb3BlbmluZyBsb25nIGJyYWNrZXQgb2YgYW55IGxldmVsIGFuZAorZW5kcyBhdCB0aGUgZmlyc3QgY2xvc2luZyBsb25nIGJyYWNrZXQgb2YgdGhlIHNhbWUgbGV2ZWwuCitJdCBjYW4gY29udGFpbiBhbnkgdGV4dCBleGNlcHQgYSBjbG9zaW5nIGJyYWNrZXQgb2YgdGhlIHNhbWUgbGV2ZWwuCitMaXRlcmFscyBpbiB0aGlzIGJyYWNrZXRlZCBmb3JtIGNhbiBydW4gZm9yIHNldmVyYWwgbGluZXMsCitkbyBub3QgaW50ZXJwcmV0IGFueSBlc2NhcGUgc2VxdWVuY2VzLAorYW5kIGlnbm9yZSBsb25nIGJyYWNrZXRzIG9mIGFueSBvdGhlciBsZXZlbC4KK0FueSBraW5kIG9mIGVuZC1vZi1saW5lIHNlcXVlbmNlCisoY2FycmlhZ2UgcmV0dXJuLCBuZXdsaW5lLCBjYXJyaWFnZSByZXR1cm4gZm9sbG93ZWQgYnkgbmV3bGluZSwKK29yIG5ld2xpbmUgZm9sbG93ZWQgYnkgY2FycmlhZ2UgcmV0dXJuKQoraXMgY29udmVydGVkIHRvIGEgc2ltcGxlIG5ld2xpbmUuCisKK0ZvciBjb252ZW5pZW5jZSwKK3doZW4gdGhlIG9wZW5pbmcgbG9uZyBicmFja2V0IGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgbmV3bGluZSwKK3RoZSBuZXdsaW5lIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nLgorQXMgYW4gZXhhbXBsZSwgaW4gYSBzeXN0ZW0gdXNpbmcgQVNDSUkKKyhpbiB3aGljaCBAQ2hhcnthfSBpcyBjb2RlZCBATnthcyA5N30sCituZXdsaW5lIGlzIGNvZGVkIEBOe2FzIDEwfSwgYW5kIEBDaGFyezF9IGlzIGNvZGVkIEBOe2FzIDQ5fSksCit0aGUgZml2ZSBsaXRlcmFsIHN0cmluZ3MgYmVsb3cgZGVub3RlIHRoZSBzYW1lIHN0cmluZzoKK0B2ZXJiYXRpbXsKK2EgPSAnYWxvXG4xMjMiJworYSA9ICJhbG9cbjEyM1wiIgorYSA9ICdcOTdsb1wxMFwwNDkyMyInCithID0gW1thbG8KKzEyMyJdXQorYSA9IFs9PVsKK2FsbworMTIzIl09PV0KK30KKworQW55IGJ5dGUgaW4gYSBsaXRlcmFsIHN0cmluZyBub3QKK2V4cGxpY2l0bHkgYWZmZWN0ZWQgYnkgdGhlIHByZXZpb3VzIHJ1bGVzIHJlcHJlc2VudHMgaXRzZWxmLgorSG93ZXZlciwgTHVhIG9wZW5zIGZpbGVzIGZvciBwYXJzaW5nIGluIHRleHQgbW9kZSwKK2FuZCB0aGUgc3lzdGVtIGZpbGUgZnVuY3Rpb25zIG1heSBoYXZlIHByb2JsZW1zIHdpdGgKK3NvbWUgY29udHJvbCBjaGFyYWN0ZXJzLgorU28sIGl0IGlzIHNhZmVyIHRvIHJlcHJlc2VudAorbm9uLXRleHQgZGF0YSBhcyBhIHF1b3RlZCBsaXRlcmFsIHdpdGgKK2V4cGxpY2l0IGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHRoZSBub24tdGV4dCBjaGFyYWN0ZXJzLgorCitBIEBkZWZ7bnVtZXJpYyBjb25zdGFudH0gKG9yIEBkZWZ7bnVtZXJhbH0pCitjYW4gYmUgd3JpdHRlbiB3aXRoIGFuIG9wdGlvbmFsIGZyYWN0aW9uYWwgcGFydAorYW5kIGFuIG9wdGlvbmFsIGRlY2ltYWwgZXhwb25lbnQsCittYXJrZWQgYnkgYSBsZXR0ZXIgQENoYXJ7ZX0gb3IgQENoYXJ7RX0uCitMdWEgYWxzbyBhY2NlcHRzIEB4e2hleGFkZWNpbWFsIGNvbnN0YW50c30sCit3aGljaCBzdGFydCB3aXRoIEBUezB4fSBvciBAVHswWH0uCitIZXhhZGVjaW1hbCBjb25zdGFudHMgYWxzbyBhY2NlcHQgYW4gb3B0aW9uYWwgZnJhY3Rpb25hbCBwYXJ0CitwbHVzIGFuIG9wdGlvbmFsIGJpbmFyeSBleHBvbmVudCwKK21hcmtlZCBieSBhIGxldHRlciBAQ2hhcntwfSBvciBAQ2hhcntQfS4KK0EgbnVtZXJpYyBjb25zdGFudCB3aXRoIGEgcmFkaXggcG9pbnQgb3IgYW4gZXhwb25lbnQKK2Rlbm90ZXMgYSBmbG9hdDsKK290aGVyd2lzZSwKK2lmIGl0cyB2YWx1ZSBmaXRzIGluIGFuIGludGVnZXIsCitpdCBkZW5vdGVzIGFuIGludGVnZXIuCitFeGFtcGxlcyBvZiB2YWxpZCBpbnRlZ2VyIGNvbnN0YW50cyBhcmUKK0B2ZXJiYXRpbXsKKzMgICAzNDUgICAweGZmICAgMHhCRUJBREEKK30KK0V4YW1wbGVzIG9mIHZhbGlkIGZsb2F0IGNvbnN0YW50cyBhcmUKK0B2ZXJiYXRpbXsKKzMuMCAgICAgMy4xNDE2ICAgICAzMTQuMTZlLTIgICAgIDAuMzE0MTZFMSAgICAgMzRlMQorMHgwLjFFICAweEEyM3AtNCAgIDBYMS45MjFGQjU0NDQyRDE4UCsxCit9CisKK0EgQGRlZntjb21tZW50fSBzdGFydHMgd2l0aCBhIGRvdWJsZSBoeXBoZW4gKEBUey0tfSkKK2FueXdoZXJlIG91dHNpZGUgYSBzdHJpbmcuCitJZiB0aGUgdGV4dCBpbW1lZGlhdGVseSBhZnRlciBAVHstLX0gaXMgbm90IGFuIG9wZW5pbmcgbG9uZyBicmFja2V0LAordGhlIGNvbW1lbnQgaXMgYSBAZGVme3Nob3J0IGNvbW1lbnR9LAord2hpY2ggcnVucyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lLgorT3RoZXJ3aXNlLCBpdCBpcyBhIEBkZWZ7bG9uZyBjb21tZW50fSwKK3doaWNoIHJ1bnMgdW50aWwgdGhlIGNvcnJlc3BvbmRpbmcgY2xvc2luZyBsb25nIGJyYWNrZXQuCisKK30KKworQHNlY3Qye3ZhcmlhYmxlc3wgQHRpdGxle1ZhcmlhYmxlc30KKworVmFyaWFibGVzIGFyZSBwbGFjZXMgdGhhdCBzdG9yZSB2YWx1ZXMuCitUaGVyZSBhcmUgdGhyZWUga2luZHMgb2YgdmFyaWFibGVzIGluIEx1YToKK2dsb2JhbCB2YXJpYWJsZXMsIGxvY2FsIHZhcmlhYmxlcywgYW5kIHRhYmxlIGZpZWxkcy4KKworQSBzaW5nbGUgbmFtZSBjYW4gZGVub3RlIGEgZ2xvYmFsIHZhcmlhYmxlIG9yIGEgbG9jYWwgdmFyaWFibGUKKyhvciBhIGZ1bmN0aW9uJ3MgZm9ybWFsIHBhcmFtZXRlciwKK3doaWNoIGlzIGEgcGFydGljdWxhciBraW5kIG9mIGxvY2FsIHZhcmlhYmxlKToKK0BQcm9kdWN7CitAcHJvZHVjbmFtZXt2YXJ9QHByb2R1Y2JvZHl7QGJuZk50ZXJ7TmFtZX19Cit9CitAYm5mTnRlcntOYW1lfSBkZW5vdGVzIGlkZW50aWZpZXJzLCBhcyBkZWZpbmVkIGluIEBTZWV7bGV4aWNhbH0uCisKK0FueSB2YXJpYWJsZSBuYW1lIGlzIGFzc3VtZWQgdG8gYmUgZ2xvYmFsIHVubGVzcyBleHBsaWNpdGx5IGRlY2xhcmVkCithcyBhIGxvY2FsIEBzZWV7bG9jYWx2YXJ9LgorQHh7TG9jYWwgdmFyaWFibGVzfSBhcmUgQGVtcGh7bGV4aWNhbGx5IHNjb3BlZH06Citsb2NhbCB2YXJpYWJsZXMgY2FuIGJlIGZyZWVseSBhY2Nlc3NlZCBieSBmdW5jdGlvbnMKK2RlZmluZWQgaW5zaWRlIHRoZWlyIHNjb3BlIEBzZWV7dmlzaWJpbGl0eX0uCisKK0JlZm9yZSB0aGUgZmlyc3QgYXNzaWdubWVudCB0byBhIHZhcmlhYmxlLCBpdHMgdmFsdWUgaXMgQG5pbC4KKworU3F1YXJlIGJyYWNrZXRzIGFyZSB1c2VkIHRvIGluZGV4IGEgdGFibGU6CitAUHJvZHVjeworQHByb2R1Y25hbWV7dmFyfUBwcm9kdWNib2R5e3ByZWZpeGV4cCBAYm5mdGVye1t9IGV4cCBAYm5mdGVye119fQorfQorVGhlIG1lYW5pbmcgb2YgYWNjZXNzZXMgdG8gdGFibGUgZmllbGRzIGNhbiBiZSBjaGFuZ2VkIHZpYSBtZXRhdGFibGVzCitAc2Vle21ldGF0YWJsZX0uCisKK1RoZSBzeW50YXggQGlke3Zhci5OYW1lfSBpcyBqdXN0IHN5bnRhY3RpYyBzdWdhciBmb3IKK0BUe3ZhclsiTmFtZSJdfToKK0BQcm9kdWN7CitAcHJvZHVjbmFtZXt2YXJ9QHByb2R1Y2JvZHl7cHJlZml4ZXhwIEBibmZ0ZXJ7Ln0gQGJuZk50ZXJ7TmFtZX19Cit9CisKK0FuIGFjY2VzcyB0byBhIGdsb2JhbCB2YXJpYWJsZSBAaWR7eH0KK2lzIGVxdWl2YWxlbnQgdG8gQGlke19FTlYueH0uCitEdWUgdG8gdGhlIHdheSB0aGF0IGNodW5rcyBhcmUgY29tcGlsZWQsCit0aGUgdmFyaWFibGUgQGlke19FTlZ9IGl0c2VsZiBpcyBuZXZlciBnbG9iYWwgQHNlZXtnbG9iYWxlbnZ9LgorCit9CisKK0BzZWN0MntzdGF0c3wgQHRpdGxle1N0YXRlbWVudHN9CisKK0x1YSBzdXBwb3J0cyBhbiBhbG1vc3QgY29udmVudGlvbmFsIHNldCBvZiBAeHtzdGF0ZW1lbnRzfSwKK3NpbWlsYXIgdG8gdGhvc2UgaW4gUGFzY2FsIG9yIEMuCitUaGlzIHNldCBpbmNsdWRlcworYXNzaWdubWVudHMsIGNvbnRyb2wgc3RydWN0dXJlcywgZnVuY3Rpb24gY2FsbHMsCithbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zLgorCitAc2VjdDN7QHRpdGxle0Jsb2Nrc30KKworQSBAeHtibG9ja30gaXMgYSBsaXN0IG9mIHN0YXRlbWVudHMsCit3aGljaCBhcmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5OgorQFByb2R1Y3sKK0Bwcm9kdWNuYW1le2Jsb2NrfUBwcm9kdWNib2R5e0BibmZyZXB7c3RhdH19Cit9CitMdWEgaGFzIEBkZWZ7ZW1wdHkgc3RhdGVtZW50c30KK3RoYXQgYWxsb3cgeW91IHRvIHNlcGFyYXRlIHN0YXRlbWVudHMgd2l0aCBzZW1pY29sb25zLAorc3RhcnQgYSBibG9jayB3aXRoIGEgc2VtaWNvbG9uCitvciB3cml0ZSB0d28gc2VtaWNvbG9ucyBpbiBzZXF1ZW5jZToKK0BQcm9kdWN7CitAcHJvZHVjbmFtZXtzdGF0fUBwcm9kdWNib2R5e0BibmZ0ZXJ7O319Cit9CisKK0Z1bmN0aW9uIGNhbGxzIGFuZCBhc3NpZ25tZW50cworY2FuIHN0YXJ0IHdpdGggYW4gb3BlbiBwYXJlbnRoZXNpcy4KK1RoaXMgcG9zc2liaWxpdHkgbGVhZHMgdG8gYW4gYW1iaWd1aXR5IGluIEx1YSdzIGdyYW1tYXIuCitDb25zaWRlciB0aGUgZm9sbG93aW5nIGZyYWdtZW50OgorQHZlcmJhdGlteworYSA9IGIgKyBjCisocHJpbnQgb3IgaW8ud3JpdGUpKCdkb25lJykKK30KK1RoZSBncmFtbWFyIGNvdWxkIHNlZSBpdCBpbiB0d28gd2F5czoKK0B2ZXJiYXRpbXsKK2EgPSBiICsgYyhwcmludCBvciBpby53cml0ZSkoJ2RvbmUnKQorCithID0gYiArIGM7IChwcmludCBvciBpby53cml0ZSkoJ2RvbmUnKQorfQorVGhlIGN1cnJlbnQgcGFyc2VyIGFsd2F5cyBzZWVzIHN1Y2ggY29uc3RydWN0aW9ucworaW4gdGhlIGZpcnN0IHdheSwKK2ludGVycHJldGluZyB0aGUgb3BlbiBwYXJlbnRoZXNpcworYXMgdGhlIHN0YXJ0IG9mIHRoZSBhcmd1bWVudHMgdG8gYSBjYWxsLgorVG8gYXZvaWQgdGhpcyBhbWJpZ3VpdHksCitpdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gYWx3YXlzIHByZWNlZGUgd2l0aCBhIHNlbWljb2xvbgorc3RhdGVtZW50cyB0aGF0IHN0YXJ0IHdpdGggYSBwYXJlbnRoZXNpczoKK0B2ZXJiYXRpbXsKKzsocHJpbnQgb3IgaW8ud3JpdGUpKCdkb25lJykKK30KKworQSBibG9jayBjYW4gYmUgZXhwbGljaXRseSBkZWxpbWl0ZWQgdG8gcHJvZHVjZSBhIHNpbmdsZSBzdGF0ZW1lbnQ6CitAUHJvZHVjeworQHByb2R1Y25hbWV7c3RhdH1AcHJvZHVjYm9keXtAUnd7ZG99IGJsb2NrIEBSd3tlbmR9fQorfQorRXhwbGljaXQgYmxvY2tzIGFyZSB1c2VmdWwKK3RvIGNvbnRyb2wgdGhlIHNjb3BlIG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KK0V4cGxpY2l0IGJsb2NrcyBhcmUgYWxzbyBzb21ldGltZXMgdXNlZCB0bworYWRkIGEgQFJ3e3JldHVybn0gc3RhdGVtZW50IGluIHRoZSBtaWRkbGUKK29mIGFub3RoZXIgYmxvY2sgQHNlZXtjb250cm9sfS4KKworfQorCitAc2VjdDN7Y2h1bmtzfCBAdGl0bGV7Q2h1bmtzfQorCitUaGUgdW5pdCBvZiBjb21waWxhdGlvbiBvZiBMdWEgaXMgY2FsbGVkIGEgQGRlZntjaHVua30uCitTeW50YWN0aWNhbGx5LAorYSBjaHVuayBpcyBzaW1wbHkgYSBibG9jazoKK0BQcm9kdWN7CitAcHJvZHVjbmFtZXtjaHVua31AcHJvZHVjYm9keXtibG9ja30KK30KKworTHVhIGhhbmRsZXMgYSBjaHVuayBhcyB0aGUgYm9keSBvZiBhbiBhbm9ueW1vdXMgZnVuY3Rpb24KK3dpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzCitAc2Vle2Z1bmMtZGVmfS4KK0FzIHN1Y2gsIGNodW5rcyBjYW4gZGVmaW5lIGxvY2FsIHZhcmlhYmxlcywKK3JlY2VpdmUgYXJndW1lbnRzLCBhbmQgcmV0dXJuIHZhbHVlcy4KK01vcmVvdmVyLCBzdWNoIGFub255bW91cyBmdW5jdGlvbiBpcyBjb21waWxlZCBhcyBpbiB0aGUKK3Njb3BlIG9mIGFuIGV4dGVybmFsIGxvY2FsIHZhcmlhYmxlIGNhbGxlZCBAaWR7X0VOVn0gQHNlZXtnbG9iYWxlbnZ9LgorVGhlIHJlc3VsdGluZyBmdW5jdGlvbiBhbHdheXMgaGFzIEBpZHtfRU5WfSBhcyBpdHMgb25seSB1cHZhbHVlLAorZXZlbiBpZiBpdCBkb2VzIG5vdCB1c2UgdGhhdCB2YXJpYWJsZS4KKworQSBjaHVuayBjYW4gYmUgc3RvcmVkIGluIGEgZmlsZSBvciBpbiBhIHN0cmluZyBpbnNpZGUgdGhlIGhvc3QgcHJvZ3JhbS4KK1RvIGV4ZWN1dGUgYSBjaHVuaywKK0x1YSBmaXJzdCBAZW1waHtsb2Fkc30gaXQsCitwcmVjb21waWxpbmcgdGhlIGNodW5rJ3MgY29kZSBpbnRvIGluc3RydWN0aW9ucyBmb3IgYSB2aXJ0dWFsIG1hY2hpbmUsCithbmQgdGhlbiBMdWEgZXhlY3V0ZXMgdGhlIGNvbXBpbGVkIGNvZGUKK3dpdGggYW4gaW50ZXJwcmV0ZXIgZm9yIHRoZSB2aXJ0dWFsIG1hY2hpbmUuCisKK0NodW5rcyBjYW4gYWxzbyBiZSBwcmVjb21waWxlZCBpbnRvIGJpbmFyeSBmb3JtOworc2VlIHByb2dyYW0gQGlkeHtsdWFjfSBhbmQgZnVuY3Rpb24gQExpZHtzdHJpbmcuZHVtcH0gZm9yIGRldGFpbHMuCitQcm9ncmFtcyBpbiBzb3VyY2UgYW5kIGNvbXBpbGVkIGZvcm1zIGFyZSBpbnRlcmNoYW5nZWFibGU7CitMdWEgYXV0b21hdGljYWxseSBkZXRlY3RzIHRoZSBmaWxlIHR5cGUgYW5kIGFjdHMgYWNjb3JkaW5nbHkgQHNlZUZ7bG9hZH0uCisKK30KKworQHNlY3Qze2Fzc2lnbm1lbnR8IEB0aXRsZXtBc3NpZ25tZW50fQorCitMdWEgYWxsb3dzIEB4e211bHRpcGxlIGFzc2lnbm1lbnRzfS4KK1RoZXJlZm9yZSwgdGhlIHN5bnRheCBmb3IgYXNzaWdubWVudAorZGVmaW5lcyBhIGxpc3Qgb2YgdmFyaWFibGVzIG9uIHRoZSBsZWZ0IHNpZGUKK2FuZCBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMgb24gdGhlIHJpZ2h0IHNpZGUuCitUaGUgZWxlbWVudHMgaW4gYm90aCBsaXN0cyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hczoKK0BQcm9kdWN7CitAcHJvZHVjbmFtZXtzdGF0fUBwcm9kdWNib2R5e3Zhcmxpc3QgQGJuZnRlcns9fSBleHBsaXN0fQorQHByb2R1Y25hbWV7dmFybGlzdH1AcHJvZHVjYm9keXt2YXIgQGJuZnJlcHtAYm5mdGVyeyx9IHZhcn19CitAcHJvZHVjbmFtZXtleHBsaXN0fUBwcm9kdWNib2R5e2V4cCBAYm5mcmVwe0BibmZ0ZXJ7LH0gZXhwfX0KK30KK0V4cHJlc3Npb25zIGFyZSBkaXNjdXNzZWQgaW4gQFNlZXtleHByZXNzaW9uc30uCisKK0JlZm9yZSB0aGUgYXNzaWdubWVudCwKK3RoZSBsaXN0IG9mIHZhbHVlcyBpcyBAZW1waHthZGp1c3RlZH0gdG8gdGhlIGxlbmd0aCBvZgordGhlIGxpc3Qgb2YgdmFyaWFibGVzLkBpbmRleHthZGp1c3RtZW50fQorSWYgdGhlcmUgYXJlIG1vcmUgdmFsdWVzIHRoYW4gbmVlZGVkLAordGhlIGV4Y2VzcyB2YWx1ZXMgYXJlIHRocm93biBhd2F5LgorSWYgdGhlcmUgYXJlIGZld2VyIHZhbHVlcyB0aGFuIG5lZWRlZCwKK3RoZSBsaXN0IGlzIGV4dGVuZGVkIHdpdGggYXMgbWFueSAgQG5pbCdzIGFzIG5lZWRlZC4KK0lmIHRoZSBsaXN0IG9mIGV4cHJlc3Npb25zIGVuZHMgd2l0aCBhIGZ1bmN0aW9uIGNhbGwsCit0aGVuIGFsbCB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhhdCBjYWxsIGVudGVyIHRoZSBsaXN0IG9mIHZhbHVlcywKK2JlZm9yZSB0aGUgYWRqdXN0bWVudAorKGV4Y2VwdCB3aGVuIHRoZSBjYWxsIGlzIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzOyBzZWUgQFNlZXtleHByZXNzaW9uc30pLgorCitUaGUgYXNzaWdubWVudCBzdGF0ZW1lbnQgZmlyc3QgZXZhbHVhdGVzIGFsbCBpdHMgZXhwcmVzc2lvbnMKK2FuZCBvbmx5IHRoZW4gdGhlIGFzc2lnbm1lbnRzIGFyZSBwZXJmb3JtZWQuCitUaHVzIHRoZSBjb2RlCitAdmVyYmF0aW17CitpID0gMworaSwgYVtpXSA9IGkrMSwgMjAKK30KK3NldHMgQFR7YVszXX0gdG8gMjAsIHdpdGhvdXQgYWZmZWN0aW5nIEBUe2FbNF19CitiZWNhdXNlIHRoZSBAaWR7aX0gaW4gQFR7YVtpXX0gaXMgZXZhbHVhdGVkICh0byAzKQorYmVmb3JlIGl0IGlzIEBOe2Fzc2lnbmVkIDR9LgorU2ltaWxhcmx5LCB0aGUgbGluZQorQHZlcmJhdGlteworeCwgeSA9IHksIHgKK30KK2V4Y2hhbmdlcyB0aGUgdmFsdWVzIG9mIEBpZHt4fSBhbmQgQGlke3l9LAorYW5kCitAdmVyYmF0aW17Cit4LCB5LCB6ID0geSwgeiwgeAorfQorY3ljbGljYWxseSBwZXJtdXRlcyB0aGUgdmFsdWVzIG9mIEBpZHt4fSwgQGlke3l9LCBhbmQgQGlke3p9LgorCitBbiBhc3NpZ25tZW50IHRvIGEgZ2xvYmFsIG5hbWUgQFR7eCA9IHZhbH0KK2lzIGVxdWl2YWxlbnQgdG8gdGhlIGFzc2lnbm1lbnQKK0BUe19FTlYueCA9IHZhbH0gQHNlZXtnbG9iYWxlbnZ9LgorCitUaGUgbWVhbmluZyBvZiBhc3NpZ25tZW50cyB0byB0YWJsZSBmaWVsZHMgYW5kCitnbG9iYWwgdmFyaWFibGVzICh3aGljaCBhcmUgYWN0dWFsbHkgdGFibGUgZmllbGRzLCB0b28pCitjYW4gYmUgY2hhbmdlZCB2aWEgbWV0YXRhYmxlcyBAc2Vle21ldGF0YWJsZX0uCisKK30KKworQHNlY3Qze2NvbnRyb2x8IEB0aXRsZXtDb250cm9sIFN0cnVjdHVyZXN9CitUaGUgY29udHJvbCBzdHJ1Y3R1cmVzCitAUnd7aWZ9LCBAUnd7d2hpbGV9LCBhbmQgQFJ3e3JlcGVhdH0gaGF2ZSB0aGUgdXN1YWwgbWVhbmluZyBhbmQKK2ZhbWlsaWFyIHN5bnRheDoKK0BpbmRleHt3aGlsZS1kbyBzdGF0ZW1lbnR9CitAaW5kZXh7cmVwZWF0LXVudGlsIHN0YXRlbWVudH0KK0BpbmRleHtpZi10aGVuLWVsc2Ugc3RhdGVtZW50fQorQFByb2R1Y3sKK0Bwcm9kdWNuYW1le3N0YXR9QHByb2R1Y2JvZHl7QFJ3e3doaWxlfSBleHAgQFJ3e2RvfSBibG9jayBAUnd7ZW5kfX0KK0Bwcm9kdWNuYW1le3N0YXR9QHByb2R1Y2JvZHl7QFJ3e3JlcGVhdH0gYmxvY2sgQFJ3e3VudGlsfSBleHB9CitAcHJvZHVjbmFtZXtzdGF0fUBwcm9kdWNib2R5e0BSd3tpZn0gZXhwIEBSd3t0aGVufSBibG9jaworICBAYm5mcmVwe0BSd3tlbHNlaWZ9IGV4cCBAUnd7dGhlbn0gYmxvY2t9CisgICBAYm5mb3B0e0BSd3tlbHNlfSBibG9ja30gQFJ3e2VuZH19Cit9CitMdWEgYWxzbyBoYXMgYSBAUnd7Zm9yfSBzdGF0ZW1lbnQsIGluIHR3byBmbGF2b3JzIEBzZWV7Zm9yfS4KKworVGhlIEB4e2NvbmRpdGlvbiBleHByZXNzaW9ufSBvZiBhCitjb250cm9sIHN0cnVjdHVyZSBjYW4gcmV0dXJuIGFueSB2YWx1ZS4KK0JvdGggQGZhbHNlIGFuZCBAbmlsIHRlc3QgZmFsc2UuCitBbGwgdmFsdWVzIGRpZmZlcmVudCBmcm9tIEBuaWwgYW5kIEBmYWxzZSB0ZXN0IHRydWUuCisoSW4gcGFydGljdWxhciwgdGhlIG51bWJlciAwIGFuZCB0aGUgZW1wdHkgc3RyaW5nIGFsc28gdGVzdCB0cnVlKS4KKworSW4gdGhlIEBSd3tyZXBlYXR9QEVuQFJ3e3VudGlsfSBsb29wLAordGhlIGlubmVyIGJsb2NrIGRvZXMgbm90IGVuZCBhdCB0aGUgQFJ3e3VudGlsfSBrZXl3b3JkLAorYnV0IG9ubHkgYWZ0ZXIgdGhlIGNvbmRpdGlvbi4KK1NvLCB0aGUgY29uZGl0aW9uIGNhbiByZWZlciB0byBsb2NhbCB2YXJpYWJsZXMKK2RlY2xhcmVkIGluc2lkZSB0aGUgbG9vcCBibG9jay4KKworVGhlIEBSd3tnb3RvfSBzdGF0ZW1lbnQgdHJhbnNmZXJzIHRoZSBwcm9ncmFtIGNvbnRyb2wgdG8gYSBsYWJlbC4KK0ZvciBzeW50YWN0aWNhbCByZWFzb25zLAorbGFiZWxzIGluIEx1YSBhcmUgY29uc2lkZXJlZCBzdGF0ZW1lbnRzIHRvbzoKK0BpbmRleHtnb3RvIHN0YXRlbWVudH0KK0BpbmRleHtsYWJlbH0KK0BQcm9kdWN7CitAcHJvZHVjbmFtZXtzdGF0fUBwcm9kdWNib2R5e0BSd3tnb3RvfSBOYW1lfQorQHByb2R1Y25hbWV7c3RhdH1AcHJvZHVjYm9keXtsYWJlbH0KK0Bwcm9kdWNuYW1le2xhYmVsfUBwcm9kdWNib2R5e0BibmZ0ZXJ7Ojp9IE5hbWUgQGJuZnRlcns6On19Cit9CisKK0EgbGFiZWwgaXMgdmlzaWJsZSBpbiB0aGUgZW50aXJlIGJsb2NrIHdoZXJlIGl0IGlzIGRlZmluZWQsCitleGNlcHQKK2luc2lkZSBuZXN0ZWQgYmxvY2tzIHdoZXJlIGEgbGFiZWwgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGRlZmluZWQgYW5kCitpbnNpZGUgbmVzdGVkIGZ1bmN0aW9ucy4KK0EgZ290byBtYXkganVtcCB0byBhbnkgdmlzaWJsZSBsYWJlbCBhcyBsb25nIGFzIGl0IGRvZXMgbm90CitlbnRlciBpbnRvIHRoZSBzY29wZSBvZiBhIGxvY2FsIHZhcmlhYmxlLgorCitMYWJlbHMgYW5kIGVtcHR5IHN0YXRlbWVudHMgYXJlIGNhbGxlZCBAZGVme3ZvaWQgc3RhdGVtZW50c30sCithcyB0aGV5IHBlcmZvcm0gbm8gYWN0aW9ucy4KKworVGhlIEBSd3ticmVha30gc3RhdGVtZW50IHRlcm1pbmF0ZXMgdGhlIGV4ZWN1dGlvbiBvZiBhCitAUnd7d2hpbGV9LCBAUnd7cmVwZWF0fSwgb3IgQFJ3e2Zvcn0gbG9vcCwKK3NraXBwaW5nIHRvIHRoZSBuZXh0IHN0YXRlbWVudCBhZnRlciB0aGUgbG9vcDoKK0BpbmRleHticmVhayBzdGF0ZW1lbnR9CitAUHJvZHVjeworQHByb2R1Y25hbWV7c3RhdH1AcHJvZHVjYm9keXtAUnd7YnJlYWt9fQorfQorQSBAUnd7YnJlYWt9IGVuZHMgdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgbG9vcC4KKworVGhlIEBSd3tyZXR1cm59IHN0YXRlbWVudCBpcyB1c2VkIHRvIHJldHVybiB2YWx1ZXMKK2Zyb20gYSBmdW5jdGlvbiBvciBhIGNodW5rCisod2hpY2ggaXMgYW4gYW5vbnltb3VzIGZ1bmN0aW9uKS4KK0BpbmRleHtyZXR1cm4gc3RhdGVtZW50fQorRnVuY3Rpb25zIGNhbiByZXR1cm4gbW9yZSB0aGFuIG9uZSB2YWx1ZSwKK3NvIHRoZSBzeW50YXggZm9yIHRoZSBAUnd7cmV0dXJufSBzdGF0ZW1lbnQgaXMKK0BQcm9kdWN7CitAcHJvZHVjbmFtZXtzdGF0fUBwcm9kdWNib2R5e0BSd3tyZXR1cm59IEBibmZvcHR7ZXhwbGlzdH0gQGJuZm9wdHtAYm5mdGVyezt9fX0KK30KKworVGhlIEBSd3tyZXR1cm59IHN0YXRlbWVudCBjYW4gb25seSBiZSB3cml0dGVuCithcyB0aGUgbGFzdCBzdGF0ZW1lbnQgb2YgYSBibG9jay4KK0lmIGl0IGlzIHJlYWxseSBuZWNlc3NhcnkgdG8gQFJ3e3JldHVybn0gaW4gdGhlIG1pZGRsZSBvZiBhIGJsb2NrLAordGhlbiBhbiBleHBsaWNpdCBpbm5lciBibG9jayBjYW4gYmUgdXNlZCwKK2FzIGluIHRoZSBpZGlvbSBAVHtkbyByZXR1cm4gZW5kfSwKK2JlY2F1c2Ugbm93IEBSd3tyZXR1cm59IGlzIHRoZSBsYXN0IHN0YXRlbWVudCBpbiBpdHMgKGlubmVyKSBibG9jay4KKworfQorCitAc2VjdDN7Zm9yfCBAdGl0bGV7Rm9yIFN0YXRlbWVudH0KKworQGluZGV4e2ZvciBzdGF0ZW1lbnR9CitUaGUgQFJ3e2Zvcn0gc3RhdGVtZW50IGhhcyB0d28gZm9ybXM6CitvbmUgbnVtZXJpY2FsIGFuZCBvbmUgZ2VuZXJpYy4KKworVGhlIG51bWVyaWNhbCBAUnd7Zm9yfSBsb29wIHJlcGVhdHMgYSBibG9jayBvZiBjb2RlIHdoaWxlIGEKK2NvbnRyb2wgdmFyaWFibGUgcnVucyB0aHJvdWdoIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24uCitJdCBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXg6CitAUHJvZHVjeworQHByb2R1Y25hbWV7c3RhdH1AcHJvZHVjYm9keXtAUnd7Zm9yfSBAYm5mTnRlcntOYW1lfSBAYm5mdGVyez19CisgIGV4cCBAYm5mdGVyeyx9IGV4cCBAYm5mb3B0e0BibmZ0ZXJ7LH0gZXhwfSBAUnd7ZG99IGJsb2NrIEBSd3tlbmR9fQorfQorVGhlIEBlbXBoe2Jsb2NrfSBpcyByZXBlYXRlZCBmb3IgQGVtcGh7bmFtZX0gc3RhcnRpbmcgYXQgdGhlIHZhbHVlIG9mCit0aGUgZmlyc3QgQGVtcGh7ZXhwfSwgdW50aWwgaXQgcGFzc2VzIHRoZSBzZWNvbmQgQGVtcGh7ZXhwfSBieSBzdGVwcyBvZiB0aGUKK3RoaXJkIEBlbXBoe2V4cH0uCitNb3JlIHByZWNpc2VseSwgYSBAUnd7Zm9yfSBzdGF0ZW1lbnQgbGlrZQorQHZlcmJhdGlteworZm9yIHYgPSBAcmVwe2UxfSwgQHJlcHtlMn0sIEByZXB7ZTN9IGRvIEByZXB7YmxvY2t9IGVuZAorfQoraXMgZXF1aXZhbGVudCB0byB0aGUgY29kZToKK0B2ZXJiYXRpbXsKK2RvCisgIGxvY2FsIEByZXB7dmFyfSwgQHJlcHtsaW1pdH0sIEByZXB7c3RlcH0gPSB0b251bWJlcihAcmVwe2UxfSksIHRvbnVtYmVyKEByZXB7ZTJ9KSwgdG9udW1iZXIoQHJlcHtlM30pCisgIGlmIG5vdCAoQHJlcHt2YXJ9IGFuZCBAcmVwe2xpbWl0fSBhbmQgQHJlcHtzdGVwfSkgdGhlbiBlcnJvcigpIGVuZAorICBAcmVwe3Zhcn0gPSBAcmVwe3Zhcn0gLSBAcmVwe3N0ZXB9CisgIHdoaWxlIHRydWUgZG8KKyAgICBAcmVwe3Zhcn0gPSBAcmVwe3Zhcn0gKyBAcmVwe3N0ZXB9CisgICAgaWYgKEByZXB7c3RlcH0gPj0gMCBhbmQgQHJlcHt2YXJ9ID4gQHJlcHtsaW1pdH0pIG9yIChAcmVwe3N0ZXB9IDwgMCBhbmQgQHJlcHt2YXJ9IDwgQHJlcHtsaW1pdH0pIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZW5kCisgICAgbG9jYWwgdiA9IEByZXB7dmFyfQorICAgIEByZXB7YmxvY2t9CisgIGVuZAorZW5kCit9CisKK05vdGUgdGhlIGZvbGxvd2luZzoKK0BpdGVtaXpleworCitAaXRlbXsKK0FsbCB0aHJlZSBjb250cm9sIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgb25seSBvbmNlLAorYmVmb3JlIHRoZSBsb29wIHN0YXJ0cy4KK1RoZXkgbXVzdCBhbGwgcmVzdWx0IGluIG51bWJlcnMuCit9CisKK0BpdGVteworQFR7QHJlcHt2YXJ9fSwgQFR7QHJlcHtsaW1pdH19LCBhbmQgQFR7QHJlcHtzdGVwfX0gYXJlIGludmlzaWJsZSB2YXJpYWJsZXMuCitUaGUgbmFtZXMgc2hvd24gaGVyZSBhcmUgZm9yIGV4cGxhbmF0b3J5IHB1cnBvc2VzIG9ubHkuCit9CisKK0BpdGVteworSWYgdGhlIHRoaXJkIGV4cHJlc3Npb24gKHRoZSBzdGVwKSBpcyBhYnNlbnQsCit0aGVuIGEgc3RlcCBATntvZiAxfSBpcyB1c2VkLgorfQorCitAaXRlbXsKK1lvdSBjYW4gdXNlIEBSd3ticmVha30gYW5kIEBSd3tnb3RvfSB0byBleGl0IGEgQFJ3e2Zvcn0gbG9vcC4KK30KKworQGl0ZW17CitUaGUgbG9vcCB2YXJpYWJsZSBAVHt2fSBpcyBsb2NhbCB0byB0aGUgbG9vcCBib2R5LgorSWYgeW91IG5lZWQgaXRzIHZhbHVlIGFmdGVyIHRoZSBsb29wLAorYXNzaWduIGl0IHRvIGFub3RoZXIgdmFyaWFibGUgYmVmb3JlIGV4aXRpbmcgdGhlIGxvb3AuCit9CisKK0BpdGVteworVGhlIHZhbHVlcyBpbiBAcmVwe3Zhcn0sIEByZXB7bGltaXR9LCBhbmQgQHJlcHtzdGVwfQorY2FuIGJlIGludGVnZXJzIG9yIGZsb2F0cy4KK0FsbCBvcGVyYXRpb25zIG9uIHRoZW0gcmVzcGVjdCB0aGUgdXN1YWwgcnVsZXMgaW4gTHVhLgorfQorCit9CisKK1RoZSBnZW5lcmljIEBSd3tmb3J9IHN0YXRlbWVudCB3b3JrcyBvdmVyIGZ1bmN0aW9ucywKK2NhbGxlZCBAZGVme2l0ZXJhdG9yc30uCitPbiBlYWNoIGl0ZXJhdGlvbiwgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9kdWNlIGEgbmV3IHZhbHVlLAorc3RvcHBpbmcgd2hlbiB0aGlzIG5ldyB2YWx1ZSBpcyBAbmlsLgorVGhlIGdlbmVyaWMgQFJ3e2Zvcn0gbG9vcCBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXg6CitAUHJvZHVjeworQHByb2R1Y25hbWV7c3RhdH1AcHJvZHVjYm9keXtAUnd7Zm9yfSBuYW1lbGlzdCBAUnd7aW59IGV4cGxpc3QKKyAgICAgICAgICAgICAgICAgICAgQFJ3e2RvfSBibG9jayBAUnd7ZW5kfX0KK0Bwcm9kdWNuYW1le25hbWVsaXN0fUBwcm9kdWNib2R5e0BibmZOdGVye05hbWV9IEBibmZyZXB7QGJuZnRlcnssfSBAYm5mTnRlcntOYW1lfX19Cit9CitBIEBSd3tmb3J9IHN0YXRlbWVudCBsaWtlCitAdmVyYmF0aW17Citmb3IgQHJlcHt2YXJfMX0sIEBDZG90cywgQHJlcHt2YXJfbn0gaW4gQHJlcHtleHBsaXN0fSBkbyBAcmVwe2Jsb2NrfSBlbmQKK30KK2lzIGVxdWl2YWxlbnQgdG8gdGhlIGNvZGU6CitAdmVyYmF0aW17CitkbworICBsb2NhbCBAcmVwe2Z9LCBAcmVwe3N9LCBAcmVwe3Zhcn0gPSBAcmVwe2V4cGxpc3R9CisgIHdoaWxlIHRydWUgZG8KKyAgICBsb2NhbCBAcmVwe3Zhcl8xfSwgQENkb3RzLCBAcmVwe3Zhcl9ufSA9IEByZXB7Zn0oQHJlcHtzfSwgQHJlcHt2YXJ9KQorICAgIGlmIEByZXB7dmFyXzF9ID09IG5pbCB0aGVuIGJyZWFrIGVuZAorICAgIEByZXB7dmFyfSA9IEByZXB7dmFyXzF9CisgICAgQHJlcHtibG9ja30KKyAgZW5kCitlbmQKK30KK05vdGUgdGhlIGZvbGxvd2luZzoKK0BpdGVtaXpleworCitAaXRlbXsKK0BUe0ByZXB7ZXhwbGlzdH19IGlzIGV2YWx1YXRlZCBvbmx5IG9uY2UuCitJdHMgcmVzdWx0cyBhcmUgYW4gQGVtcGh7aXRlcmF0b3J9IGZ1bmN0aW9uLAorYSBAZW1waHtzdGF0ZX0sCithbmQgYW4gaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGZpcnN0IEBlbXBoe2l0ZXJhdG9yIHZhcmlhYmxlfS4KK30KKworQGl0ZW17CitAVHtAcmVwe2Z9fSwgQFR7QHJlcHtzfX0sIGFuZCBAVHtAcmVwe3Zhcn19IGFyZSBpbnZpc2libGUgdmFyaWFibGVzLgorVGhlIG5hbWVzIGFyZSBoZXJlIGZvciBleHBsYW5hdG9yeSBwdXJwb3NlcyBvbmx5LgorfQorCitAaXRlbXsKK1lvdSBjYW4gdXNlIEBSd3ticmVha30gdG8gZXhpdCBhIEBSd3tmb3J9IGxvb3AuCit9CisKK0BpdGVteworVGhlIGxvb3AgdmFyaWFibGVzIEBUe0ByZXB7dmFyX2l9fSBhcmUgbG9jYWwgdG8gdGhlIGxvb3A7Cit5b3UgY2Fubm90IHVzZSB0aGVpciB2YWx1ZXMgYWZ0ZXIgdGhlIEBSd3tmb3J9IGVuZHMuCitJZiB5b3UgbmVlZCB0aGVzZSB2YWx1ZXMsCit0aGVuIGFzc2lnbiB0aGVtIHRvIG90aGVyIHZhcmlhYmxlcyBiZWZvcmUgYnJlYWtpbmcgb3IgZXhpdGluZyB0aGUgbG9vcC4KK30KKworfQorCit9CisKK0BzZWN0M3tmdW5jc3RhdHwgQHRpdGxle0Z1bmN0aW9uIENhbGxzIGFzIFN0YXRlbWVudHN9CitUbyBhbGxvdyBwb3NzaWJsZSBzaWRlLWVmZmVjdHMsCitmdW5jdGlvbiBjYWxscyBjYW4gYmUgZXhlY3V0ZWQgYXMgc3RhdGVtZW50czoKK0BQcm9kdWN7CitAcHJvZHVjbmFtZXtzdGF0fUBwcm9kdWNib2R5e2Z1bmN0aW9uY2FsbH0KK30KK0luIHRoaXMgY2FzZSwgYWxsIHJldHVybmVkIHZhbHVlcyBhcmUgdGhyb3duIGF3YXkuCitGdW5jdGlvbiBjYWxscyBhcmUgZXhwbGFpbmVkIGluIEBTZWV7ZnVuY3Rpb25jYWxsfS4KKworfQorCitAc2VjdDN7bG9jYWx2YXJ8IEB0aXRsZXtMb2NhbCBEZWNsYXJhdGlvbnN9CitAeHtMb2NhbCB2YXJpYWJsZXN9IGNhbiBiZSBkZWNsYXJlZCBhbnl3aGVyZSBpbnNpZGUgYSBibG9jay4KK1RoZSBkZWNsYXJhdGlvbiBjYW4gaW5jbHVkZSBhbiBpbml0aWFsIGFzc2lnbm1lbnQ6CitAUHJvZHVjeworQHByb2R1Y25hbWV7c3RhdH1AcHJvZHVjYm9keXtAUnd7bG9jYWx9IG5hbWVsaXN0IEBibmZvcHR7QGJuZnRlcns9fSBleHBsaXN0fX0KK30KK0lmIHByZXNlbnQsIGFuIGluaXRpYWwgYXNzaWdubWVudCBoYXMgdGhlIHNhbWUgc2VtYW50aWNzCitvZiBhIG11bHRpcGxlIGFzc2lnbm1lbnQgQHNlZXthc3NpZ25tZW50fS4KK090aGVyd2lzZSwgYWxsIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCBAbmlsLgorCitBIGNodW5rIGlzIGFsc28gYSBibG9jayBAc2Vle2NodW5rc30sCithbmQgc28gbG9jYWwgdmFyaWFibGVzIGNhbiBiZSBkZWNsYXJlZCBpbiBhIGNodW5rIG91dHNpZGUgYW55IGV4cGxpY2l0IGJsb2NrLgorCitUaGUgdmlzaWJpbGl0eSBydWxlcyBmb3IgbG9jYWwgdmFyaWFibGVzIGFyZSBleHBsYWluZWQgaW4gQFNlZXt2aXNpYmlsaXR5fS4KKworfQorCit9CisKK0BzZWN0MntleHByZXNzaW9uc3wgQHRpdGxle0V4cHJlc3Npb25zfQorCitUaGUgYmFzaWMgZXhwcmVzc2lvbnMgaW4gTHVhIGFyZSB0aGUgZm9sbG93aW5nOgorQFByb2R1Y3sKK0Bwcm9kdWNuYW1le2V4cH1AcHJvZHVjYm9keXtwcmVmaXhleHB9CitAcHJvZHVjbmFtZXtleHB9QHByb2R1Y2JvZHl7QFJ3e25pbH0gQE9yIEBSd3tmYWxzZX0gQE9yIEBSd3t0cnVlfX0KK0Bwcm9kdWNuYW1le2V4cH1AcHJvZHVjYm9keXtAYm5mTnRlcntOdW1lcmFsfX0KK0Bwcm9kdWNuYW1le2V4cH1AcHJvZHVjYm9keXtAYm5mTnRlcntMaXRlcmFsU3RyaW5nfX0KK0Bwcm9kdWNuYW1le2V4cH1AcHJvZHVjYm9keXtmdW5jdGlvbmRlZn0KK0Bwcm9kdWNuYW1le2V4cH1AcHJvZHVjYm9keXt0YWJsZWNvbnN0cnVjdG9yfQorQHByb2R1Y25hbWV7ZXhwfUBwcm9kdWNib2R5e0BibmZ0ZXJ7Li4ufX0KK0Bwcm9kdWNuYW1le2V4cH1AcHJvZHVjYm9keXtleHAgYmlub3AgZXhwfQorQHByb2R1Y25hbWV7ZXhwfUBwcm9kdWNib2R5e3Vub3AgZXhwfQorQHByb2R1Y25hbWV7cHJlZml4ZXhwfUBwcm9kdWNib2R5e3ZhciBAT3IgZnVuY3Rpb25jYWxsIEBPcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBibmZ0ZXJ7KH0gZXhwIEBibmZ0ZXJ7KX19Cit9CisKK051bWVyYWxzIGFuZCBsaXRlcmFsIHN0cmluZ3MgYXJlIGV4cGxhaW5lZCBpbiBAU2Vle2xleGljYWx9OwordmFyaWFibGVzIGFyZSBleHBsYWluZWQgaW4gQFNlZXt2YXJpYWJsZXN9OworZnVuY3Rpb24gZGVmaW5pdGlvbnMgYXJlIGV4cGxhaW5lZCBpbiBAU2Vle2Z1bmMtZGVmfTsKK2Z1bmN0aW9uIGNhbGxzIGFyZSBleHBsYWluZWQgaW4gQFNlZXtmdW5jdGlvbmNhbGx9OwordGFibGUgY29uc3RydWN0b3JzIGFyZSBleHBsYWluZWQgaW4gQFNlZXt0YWJsZWNvbnN0cnVjdG9yfS4KK1ZhcmFyZyBleHByZXNzaW9ucywKK2Rlbm90ZWQgYnkgdGhyZWUgZG90cyAoQENoYXJ7Li4ufSksIGNhbiBvbmx5IGJlIHVzZWQgd2hlbgorZGlyZWN0bHkgaW5zaWRlIGEgdmFyYXJnIGZ1bmN0aW9uOwordGhleSBhcmUgZXhwbGFpbmVkIGluIEBTZWV7ZnVuYy1kZWZ9LgorCitCaW5hcnkgb3BlcmF0b3JzIGNvbXByaXNlIGFyaXRobWV0aWMgb3BlcmF0b3JzIEBzZWV7YXJpdGh9LAorYml0d2lzZSBvcGVyYXRvcnMgQHNlZXtiaXR3aXNlfSwKK3JlbGF0aW9uYWwgb3BlcmF0b3JzIEBzZWV7cmVsLW9wc30sIGxvZ2ljYWwgb3BlcmF0b3JzIEBzZWV7bG9naWN9LAorYW5kIHRoZSBjb25jYXRlbmF0aW9uIG9wZXJhdG9yIEBzZWV7Y29uY2F0fS4KK1VuYXJ5IG9wZXJhdG9ycyBjb21wcmlzZSB0aGUgdW5hcnkgbWludXMgQHNlZXthcml0aH0sCit0aGUgdW5hcnkgYml0d2lzZSBOT1QgQHNlZXtiaXR3aXNlfSwKK3RoZSB1bmFyeSBsb2dpY2FsIEBSd3tub3R9IEBzZWV7bG9naWN9LAorYW5kIHRoZSB1bmFyeSBAZGVme2xlbmd0aCBvcGVyYXRvcn0gQHNlZXtsZW4tb3B9LgorCitCb3RoIGZ1bmN0aW9uIGNhbGxzIGFuZCB2YXJhcmcgZXhwcmVzc2lvbnMgY2FuIHJlc3VsdCBpbiBtdWx0aXBsZSB2YWx1ZXMuCitJZiBhIGZ1bmN0aW9uIGNhbGwgaXMgdXNlZCBhcyBhIHN0YXRlbWVudCBAc2Vle2Z1bmNzdGF0fSwKK3RoZW4gaXRzIHJldHVybiBsaXN0IGlzIGFkanVzdGVkIHRvIHplcm8gZWxlbWVudHMsCit0aHVzIGRpc2NhcmRpbmcgYWxsIHJldHVybmVkIHZhbHVlcy4KK0lmIGFuIGV4cHJlc3Npb24gaXMgdXNlZCBhcyB0aGUgbGFzdCAob3IgdGhlIG9ubHkpIGVsZW1lbnQKK29mIGEgbGlzdCBvZiBleHByZXNzaW9ucywKK3RoZW4gbm8gYWRqdXN0bWVudCBpcyBtYWRlCisodW5sZXNzIHRoZSBleHByZXNzaW9uIGlzIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzKS4KK0luIGFsbCBvdGhlciBjb250ZXh0cywKK0x1YSBhZGp1c3RzIHRoZSByZXN1bHQgbGlzdCB0byBvbmUgZWxlbWVudCwKK2VpdGhlciBkaXNjYXJkaW5nIGFsbCB2YWx1ZXMgZXhjZXB0IHRoZSBmaXJzdCBvbmUKK29yIGFkZGluZyBhIHNpbmdsZSBAbmlsIGlmIHRoZXJlIGFyZSBubyB2YWx1ZXMuCisKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CitAdmVyYmF0aW17CitmKCkgICAgICAgICAgICAgICAgLS0gYWRqdXN0ZWQgdG8gMCByZXN1bHRzCitnKGYoKSwgeCkgICAgICAgICAgLS0gZigpIGlzIGFkanVzdGVkIHRvIDEgcmVzdWx0CitnKHgsIGYoKSkgICAgICAgICAgLS0gZyBnZXRzIHggcGx1cyBhbGwgcmVzdWx0cyBmcm9tIGYoKQorYSxiLGMgPSBmKCksIHggICAgIC0tIGYoKSBpcyBhZGp1c3RlZCB0byAxIHJlc3VsdCAoYyBnZXRzIG5pbCkKK2EsYiA9IC4uLiAgICAgICAgICAtLSBhIGdldHMgdGhlIGZpcnN0IHZhcmFyZyBhcmd1bWVudCwgYiBnZXRzCisgICAgICAgICAgICAgICAgICAgLS0gdGhlIHNlY29uZCAoYm90aCBhIGFuZCBiIGNhbiBnZXQgbmlsIGlmIHRoZXJlCisgICAgICAgICAgICAgICAgICAgLS0gaXMgbm8gY29ycmVzcG9uZGluZyB2YXJhcmcgYXJndW1lbnQpCisKK2EsYixjID0geCwgZigpICAgICAtLSBmKCkgaXMgYWRqdXN0ZWQgdG8gMiByZXN1bHRzCithLGIsYyA9IGYoKSAgICAgICAgLS0gZigpIGlzIGFkanVzdGVkIHRvIDMgcmVzdWx0cworcmV0dXJuIGYoKSAgICAgICAgIC0tIHJldHVybnMgYWxsIHJlc3VsdHMgZnJvbSBmKCkKK3JldHVybiAuLi4gICAgICAgICAtLSByZXR1cm5zIGFsbCByZWNlaXZlZCB2YXJhcmcgYXJndW1lbnRzCityZXR1cm4geCx5LGYoKSAgICAgLS0gcmV0dXJucyB4LCB5LCBhbmQgYWxsIHJlc3VsdHMgZnJvbSBmKCkKK3tmKCl9ICAgICAgICAgICAgICAtLSBjcmVhdGVzIGEgbGlzdCB3aXRoIGFsbCByZXN1bHRzIGZyb20gZigpCit7Li4ufSAgICAgICAgICAgICAgLS0gY3JlYXRlcyBhIGxpc3Qgd2l0aCBhbGwgdmFyYXJnIGFyZ3VtZW50cwore2YoKSwgbmlsfSAgICAgICAgIC0tIGYoKSBpcyBhZGp1c3RlZCB0byAxIHJlc3VsdAorfQorCitBbnkgZXhwcmVzc2lvbiBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcyBhbHdheXMgcmVzdWx0cyBpbiBvbmx5IG9uZSB2YWx1ZS4KK1RodXMsCitAVHsoZih4LHkseikpfSBpcyBhbHdheXMgYSBzaW5nbGUgdmFsdWUsCitldmVuIGlmIEBpZHtmfSByZXR1cm5zIHNldmVyYWwgdmFsdWVzLgorKFRoZSB2YWx1ZSBvZiBAVHsoZih4LHkseikpfSBpcyB0aGUgZmlyc3QgdmFsdWUgcmV0dXJuZWQgYnkgQGlke2Z9CitvciBAbmlsIGlmIEBpZHtmfSBkb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlcy4pCisKKworCitAc2VjdDN7YXJpdGh8IEB0aXRsZXtBcml0aG1ldGljIE9wZXJhdG9yc30KK0x1YSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIEB4e2FyaXRobWV0aWMgb3BlcmF0b3JzfToKK0BkZXNjcmlwdGlvbnsKK0BpdGVte0BUeyt9fGFkZGl0aW9ufQorQGl0ZW17QFR7LX18c3VidHJhY3Rpb259CitAaXRlbXtAVHsqfXxtdWx0aXBsaWNhdGlvbn0KK0BpdGVte0BUey99fGZsb2F0IGRpdmlzaW9ufQorQGl0ZW17QFR7Ly99fGZsb29yIGRpdmlzaW9ufQorQGl0ZW17QFR7JX18bW9kdWxvfQorQGl0ZW17QFR7Xn18ZXhwb25lbnRpYXRpb259CitAaXRlbXtAVHstfXx1bmFyeSBtaW51c30KK30KKworV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGV4cG9uZW50aWF0aW9uIGFuZCBmbG9hdCBkaXZpc2lvbiwKK3RoZSBhcml0aG1ldGljIG9wZXJhdG9ycyB3b3JrIGFzIGZvbGxvd3M6CitJZiBib3RoIG9wZXJhbmRzIGFyZSBpbnRlZ2VycywKK3RoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG92ZXIgaW50ZWdlcnMgYW5kIHRoZSByZXN1bHQgaXMgYW4gaW50ZWdlci4KK090aGVyd2lzZSwgaWYgYm90aCBvcGVyYW5kcyBhcmUgbnVtYmVycywKK3RoZW4gdGhleSBhcmUgY29udmVydGVkIHRvIGZsb2F0cywKK3RoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGZvbGxvd2luZyB0aGUgdXN1YWwgcnVsZXMKK2ZvciBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljCisodXN1YWxseSB0aGUgQHh7SUVFRSA3NTR9IHN0YW5kYXJkKSwKK2FuZCB0aGUgcmVzdWx0IGlzIGEgZmxvYXQuCisoVGhlIHN0cmluZyBsaWJyYXJ5IGNvZXJjZXMgc3RyaW5ncyB0byBudW1iZXJzIGluCithcml0aG1ldGljIG9wZXJhdGlvbnM7IHNlZSBAU2Vle2NvZXJjaW9ufSBmb3IgZGV0YWlscy4pCisKK0V4cG9uZW50aWF0aW9uIGFuZCBmbG9hdCBkaXZpc2lvbiAoQFR7L30pCithbHdheXMgY29udmVydCB0aGVpciBvcGVyYW5kcyB0byBmbG9hdHMKK2FuZCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBhIGZsb2F0LgorRXhwb25lbnRpYXRpb24gdXNlcyB0aGUgQEFOU0l7cG93fSwKK3NvIHRoYXQgaXQgd29ya3MgZm9yIG5vbi1pbnRlZ2VyIGV4cG9uZW50cyB0b28uCisKK0Zsb29yIGRpdmlzaW9uIChAVHsvL30pIGlzIGEgZGl2aXNpb24KK3RoYXQgcm91bmRzIHRoZSBxdW90aWVudCB0b3dhcmRzIG1pbnVzIGluZmluaXR5LAordGhhdCBpcywgdGhlIGZsb29yIG9mIHRoZSBkaXZpc2lvbiBvZiBpdHMgb3BlcmFuZHMuCisKK01vZHVsbyBpcyBkZWZpbmVkIGFzIHRoZSByZW1haW5kZXIgb2YgYSBkaXZpc2lvbgordGhhdCByb3VuZHMgdGhlIHF1b3RpZW50IHRvd2FyZHMgbWludXMgaW5maW5pdHkgKGZsb29yIGRpdmlzaW9uKS4KKworSW4gY2FzZSBvZiBvdmVyZmxvd3MgaW4gaW50ZWdlciBhcml0aG1ldGljLAorYWxsIG9wZXJhdGlvbnMgQGVtcGh4e3dyYXAgYXJvdW5kfSwKK2FjY29yZGluZyB0byB0aGUgdXN1YWwgcnVsZXMgb2YgdHdvLWNvbXBsZW1lbnQgYXJpdGhtZXRpYy4KKyhJbiBvdGhlciB3b3JkcywKK3RoZXkgcmV0dXJuIHRoZSB1bmlxdWUgcmVwcmVzZW50YWJsZSBpbnRlZ2VyCit0aGF0IGlzIGVxdWFsIG1vZHVsbyBATXsyQHNwezY0fX0gdG8gdGhlIG1hdGhlbWF0aWNhbCByZXN1bHQuKQorfQorCitAc2VjdDN7Yml0d2lzZXwgQHRpdGxle0JpdHdpc2UgT3BlcmF0b3JzfQorTHVhIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgQHh7Yml0d2lzZSBvcGVyYXRvcnN9OgorQGRlc2NyaXB0aW9ueworQGl0ZW17QFR7Jn18Yml0d2lzZSBBTkR9CitAaXRlbXtAVHtAVmVyQmFyfXxiaXR3aXNlIE9SfQorQGl0ZW17QFR7fn18Yml0d2lzZSBleGNsdXNpdmUgT1J9CitAaXRlbXtAVHs+Pn18cmlnaHQgc2hpZnR9CitAaXRlbXtAVHs8PH18bGVmdCBzaGlmdH0KK0BpdGVte0BUe359fHVuYXJ5IGJpdHdpc2UgTk9UfQorfQorCitBbGwgYml0d2lzZSBvcGVyYXRpb25zIGNvbnZlcnQgaXRzIG9wZXJhbmRzIHRvIGludGVnZXJzCitAc2Vle2NvZXJjaW9ufSwKK29wZXJhdGUgb24gYWxsIGJpdHMgb2YgdGhvc2UgaW50ZWdlcnMsCithbmQgcmVzdWx0IGluIGFuIGludGVnZXIuCisKK0JvdGggcmlnaHQgYW5kIGxlZnQgc2hpZnRzIGZpbGwgdGhlIHZhY2FudCBiaXRzIHdpdGggemVyb3MuCitOZWdhdGl2ZSBkaXNwbGFjZW1lbnRzIHNoaWZ0IHRvIHRoZSBvdGhlciBkaXJlY3Rpb247CitkaXNwbGFjZW1lbnRzIHdpdGggYWJzb2x1dGUgdmFsdWVzIGVxdWFsIHRvIG9yIGhpZ2hlciB0aGFuCit0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYW4gaW50ZWdlcgorcmVzdWx0IGluIHplcm8gKGFzIGFsbCBiaXRzIGFyZSBzaGlmdGVkIG91dCkuCisKK30KKworQHNlY3Qze2NvZXJjaW9ufCBAdGl0bGV7Q29lcmNpb25zIGFuZCBDb252ZXJzaW9uc30KK0x1YSBwcm92aWRlcyBzb21lIGF1dG9tYXRpYyBjb252ZXJzaW9ucyBiZXR3ZWVuIHNvbWUKK3R5cGVzIGFuZCByZXByZXNlbnRhdGlvbnMgYXQgcnVuIHRpbWUuCitCaXR3aXNlIG9wZXJhdG9ycyBhbHdheXMgY29udmVydCBmbG9hdCBvcGVyYW5kcyB0byBpbnRlZ2Vycy4KK0V4cG9uZW50aWF0aW9uIGFuZCBmbG9hdCBkaXZpc2lvbgorYWx3YXlzIGNvbnZlcnQgaW50ZWdlciBvcGVyYW5kcyB0byBmbG9hdHMuCitBbGwgb3RoZXIgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGFwcGxpZWQgdG8gbWl4ZWQgbnVtYmVycworKGludGVnZXJzIGFuZCBmbG9hdHMpIGNvbnZlcnQgdGhlIGludGVnZXIgb3BlcmFuZCB0byBhIGZsb2F0LgorVGhlIEMgQVBJIGFsc28gY29udmVydHMgYm90aCBpbnRlZ2VycyB0byBmbG9hdHMgYW5kCitmbG9hdHMgdG8gaW50ZWdlcnMsIGFzIG5lZWRlZC4KK01vcmVvdmVyLCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBhY2NlcHRzIG51bWJlcnMgYXMgYXJndW1lbnRzLAorYmVzaWRlcyBzdHJpbmdzLgorCitJbiBhIGNvbnZlcnNpb24gZnJvbSBpbnRlZ2VyIHRvIGZsb2F0LAoraWYgdGhlIGludGVnZXIgdmFsdWUgaGFzIGFuIGV4YWN0IHJlcHJlc2VudGF0aW9uIGFzIGEgZmxvYXQsCit0aGF0IGlzIHRoZSByZXN1bHQuCitPdGhlcndpc2UsCit0aGUgY29udmVyc2lvbiBnZXRzIHRoZSBuZWFyZXN0IGhpZ2hlciBvcgordGhlIG5lYXJlc3QgbG93ZXIgcmVwcmVzZW50YWJsZSB2YWx1ZS4KK1RoaXMga2luZCBvZiBjb252ZXJzaW9uIG5ldmVyIGZhaWxzLgorCitUaGUgY29udmVyc2lvbiBmcm9tIGZsb2F0IHRvIGludGVnZXIKK2NoZWNrcyB3aGV0aGVyIHRoZSBmbG9hdCBoYXMgYW4gZXhhY3QgcmVwcmVzZW50YXRpb24gYXMgYW4gaW50ZWdlcgorKHRoYXQgaXMsIHRoZSBmbG9hdCBoYXMgYW4gaW50ZWdyYWwgdmFsdWUgYW5kCitpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgaW50ZWdlciByZXByZXNlbnRhdGlvbikuCitJZiBpdCBkb2VzLCB0aGF0IHJlcHJlc2VudGF0aW9uIGlzIHRoZSByZXN1bHQuCitPdGhlcndpc2UsIHRoZSBjb252ZXJzaW9uIGZhaWxzLgorCitUaGUgc3RyaW5nIGxpYnJhcnkgdXNlcyBtZXRhbWV0aG9kcyB0aGF0IHRyeSB0byBjb2VyY2UKK3N0cmluZ3MgdG8gbnVtYmVycyBpbiBhbGwgYXJpdGhtZXRpYyBvcGVyYXRpb25zLgorQW55IHN0cmluZyBvcGVyYXRvciBpcyBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciBvciBhIGZsb2F0LAorZm9sbG93aW5nIGl0cyBzeW50YXggYW5kIHRoZSBydWxlcyBvZiB0aGUgTHVhIGxleGVyLgorKFRoZSBzdHJpbmcgbWF5IGhhdmUgYWxzbyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgYW5kIGEgc2lnbi4pCitBbGwgY29udmVyc2lvbnMgZnJvbSBzdHJpbmdzIHRvIG51bWJlcnMKK2FjY2VwdCBib3RoIGEgZG90IGFuZCB0aGUgY3VycmVudCBsb2NhbGUgbWFyaworYXMgdGhlIHJhZGl4IGNoYXJhY3Rlci4KKyhUaGUgTHVhIGxleGVyLCBob3dldmVyLCBhY2NlcHRzIG9ubHkgYSBkb3QuKQorCitUaGUgY29udmVyc2lvbiBmcm9tIG51bWJlcnMgdG8gc3RyaW5ncyB1c2VzIGEKK25vbi1zcGVjaWZpZWQgaHVtYW4tcmVhZGFibGUgZm9ybWF0LgorRm9yIGNvbXBsZXRlIGNvbnRyb2wgb3ZlciBob3cgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIHN0cmluZ3MsCit1c2UgdGhlIEBpZHtmb3JtYXR9IGZ1bmN0aW9uIGZyb20gdGhlIHN0cmluZyBsaWJyYXJ5CitAc2VlRntzdHJpbmcuZm9ybWF0fS4KKworfQorCitAc2VjdDN7cmVsLW9wc3wgQHRpdGxle1JlbGF0aW9uYWwgT3BlcmF0b3JzfQorTHVhIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgQHh7cmVsYXRpb25hbCBvcGVyYXRvcnN9OgorQGRlc2NyaXB0aW9ueworQGl0ZW17QFR7PT19fGVxdWFsaXR5fQorQGl0ZW17QFR7fj19fGluZXF1YWxpdHl9CitAaXRlbXtAVHs8fXxsZXNzIHRoYW59CitAaXRlbXtAVHs+fXxncmVhdGVyIHRoYW59CitAaXRlbXtAVHs8PX18bGVzcyBvciBlcXVhbH0KK0BpdGVte0BUez49fXxncmVhdGVyIG9yIGVxdWFsfQorfQorVGhlc2Ugb3BlcmF0b3JzIGFsd2F5cyByZXN1bHQgaW4gQGZhbHNlIG9yIEB0cnVlLgorCitFcXVhbGl0eSAoQFR7PT19KSBmaXJzdCBjb21wYXJlcyB0aGUgdHlwZSBvZiBpdHMgb3BlcmFuZHMuCitJZiB0aGUgdHlwZXMgYXJlIGRpZmZlcmVudCwgdGhlbiB0aGUgcmVzdWx0IGlzIEBmYWxzZS4KK090aGVyd2lzZSwgdGhlIHZhbHVlcyBvZiB0aGUgb3BlcmFuZHMgYXJlIGNvbXBhcmVkLgorU3RyaW5ncyBhcmUgY29tcGFyZWQgaW4gdGhlIG9idmlvdXMgd2F5LgorTnVtYmVycyBhcmUgZXF1YWwgaWYgdGhleSBkZW5vdGUgdGhlIHNhbWUgbWF0aGVtYXRpY2FsIHZhbHVlLgorCitUYWJsZXMsIHVzZXJkYXRhLCBhbmQgdGhyZWFkcworYXJlIGNvbXBhcmVkIGJ5IHJlZmVyZW5jZToKK3R3byBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsIG9ubHkgaWYgdGhleSBhcmUgdGhlIHNhbWUgb2JqZWN0LgorRXZlcnkgdGltZSB5b3UgY3JlYXRlIGEgbmV3IG9iamVjdAorKGEgdGFibGUsIHVzZXJkYXRhLCBvciB0aHJlYWQpLAordGhpcyBuZXcgb2JqZWN0IGlzIGRpZmZlcmVudCBmcm9tIGFueSBwcmV2aW91c2x5IGV4aXN0aW5nIG9iamVjdC4KK0EgY2xvc3VyZSBpcyBhbHdheXMgZXF1YWwgdG8gaXRzZWxmLgorQ2xvc3VyZXMgd2l0aCBhbnkgZGV0ZWN0YWJsZSBkaWZmZXJlbmNlCisoZGlmZmVyZW50IGJlaGF2aW9yLCBkaWZmZXJlbnQgZGVmaW5pdGlvbikgYXJlIGFsd2F5cyBkaWZmZXJlbnQuCitDbG9zdXJlcyBjcmVhdGVkIGF0IGRpZmZlcmVudCB0aW1lcyBidXQgd2l0aCBubyBkZXRlY3RhYmxlIGRpZmZlcmVuY2VzCittYXkgYmUgY2xhc3NpZmllZCBhcyBlcXVhbCBvciBub3QKKyhkZXBlbmRpbmcgb24gaW50ZXJuYWwgY2FzaGluZyBkZXRhaWxzKS4KKworWW91IGNhbiBjaGFuZ2UgdGhlIHdheSB0aGF0IEx1YSBjb21wYXJlcyB0YWJsZXMgYW5kIHVzZXJkYXRhCitieSB1c2luZyB0aGUgQGlkeHtfX2VxfSBtZXRhbWV0aG9kIEBzZWV7bWV0YXRhYmxlfS4KKworRXF1YWxpdHkgY29tcGFyaXNvbnMgZG8gbm90IGNvbnZlcnQgc3RyaW5ncyB0byBudW1iZXJzCitvciB2aWNlIHZlcnNhLgorVGh1cywgQFR7IjAiPT0wfSBldmFsdWF0ZXMgdG8gQGZhbHNlLAorYW5kIEBUe3RbMF19IGFuZCBAVHt0WyIwIl19IGRlbm90ZSBkaWZmZXJlbnQKK2VudHJpZXMgaW4gYSB0YWJsZS4KKworVGhlIG9wZXJhdG9yIEBUe349fSBpcyBleGFjdGx5IHRoZSBuZWdhdGlvbiBvZiBlcXVhbGl0eSAoQFR7PT19KS4KKworVGhlIG9yZGVyIG9wZXJhdG9ycyB3b3JrIGFzIGZvbGxvd3MuCitJZiBib3RoIGFyZ3VtZW50cyBhcmUgbnVtYmVycywKK3RoZW4gdGhleSBhcmUgY29tcGFyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIG1hdGhlbWF0aWNhbCB2YWx1ZXMKKyhyZWdhcmRsZXNzIG9mIHRoZWlyIHN1YnR5cGVzKS4KK090aGVyd2lzZSwgaWYgYm90aCBhcmd1bWVudHMgYXJlIHN0cmluZ3MsCit0aGVuIHRoZWlyIHZhbHVlcyBhcmUgY29tcGFyZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4KK090aGVyd2lzZSwgTHVhIHRyaWVzIHRvIGNhbGwgdGhlIEBpZHh7X19sdH0gb3IgdGhlIEBpZHh7X19sZX0KK21ldGFtZXRob2QgQHNlZXttZXRhdGFibGV9LgorQSBjb21wYXJpc29uIEBUe2EgPiBifSBpcyB0cmFuc2xhdGVkIHRvIEBUe2IgPCBhfQorYW5kIEBUe2EgPj0gYn0gaXMgdHJhbnNsYXRlZCB0byBAVHtiIDw9IGF9LgorCitGb2xsb3dpbmcgdGhlIEB4e0lFRUUgNzU0fSBzdGFuZGFyZCwKK0B4e05hTn0gaXMgY29uc2lkZXJlZCBuZWl0aGVyIHNtYWxsZXIgdGhhbiwKK25vciBlcXVhbCB0bywgbm9yIGdyZWF0ZXIgdGhhbiBhbnkgdmFsdWUgKGluY2x1ZGluZyBpdHNlbGYpLgorCit9CisKK0BzZWN0M3tsb2dpY3wgQHRpdGxle0xvZ2ljYWwgT3BlcmF0b3JzfQorVGhlIEB4e2xvZ2ljYWwgb3BlcmF0b3JzfSBpbiBMdWEgYXJlCitAUnd7YW5kfSwgQFJ3e29yfSwgYW5kIEBSd3tub3R9LgorTGlrZSB0aGUgY29udHJvbCBzdHJ1Y3R1cmVzIEBzZWV7Y29udHJvbH0sCithbGwgbG9naWNhbCBvcGVyYXRvcnMgY29uc2lkZXIgYm90aCBAZmFsc2UgYW5kIEBuaWwgYXMgZmFsc2UKK2FuZCBhbnl0aGluZyBlbHNlIGFzIHRydWUuCisKK1RoZSBuZWdhdGlvbiBvcGVyYXRvciBAUnd7bm90fSBhbHdheXMgcmV0dXJucyBAZmFsc2Ugb3IgQHRydWUuCitUaGUgY29uanVuY3Rpb24gb3BlcmF0b3IgQFJ3e2FuZH0gcmV0dXJucyBpdHMgZmlyc3QgYXJndW1lbnQKK2lmIHRoaXMgdmFsdWUgaXMgQGZhbHNlIG9yIEBuaWw7CitvdGhlcndpc2UsIEBSd3thbmR9IHJldHVybnMgaXRzIHNlY29uZCBhcmd1bWVudC4KK1RoZSBkaXNqdW5jdGlvbiBvcGVyYXRvciBAUnd7b3J9IHJldHVybnMgaXRzIGZpcnN0IGFyZ3VtZW50CitpZiB0aGlzIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIEBuaWwgYW5kIEBmYWxzZTsKK290aGVyd2lzZSwgQFJ3e29yfSByZXR1cm5zIGl0cyBzZWNvbmQgYXJndW1lbnQuCitCb3RoIEBSd3thbmR9IGFuZCBAUnd7b3J9IHVzZSBAeHtzaG9ydC1jaXJjdWl0IGV2YWx1YXRpb259OwordGhhdCBpcywKK3RoZSBzZWNvbmQgb3BlcmFuZCBpcyBldmFsdWF0ZWQgb25seSBpZiBuZWNlc3NhcnkuCitIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgorQHZlcmJhdGlteworMTAgb3IgMjAgICAgICAgICAgICAtLT4gMTAKKzEwIG9yIGVycm9yKCkgICAgICAgLS0+IDEwCituaWwgb3IgImEiICAgICAgICAgIC0tPiAiYSIKK25pbCBhbmQgMTAgICAgICAgICAgLS0+IG5pbAorZmFsc2UgYW5kIGVycm9yKCkgICAtLT4gZmFsc2UKK2ZhbHNlIGFuZCBuaWwgICAgICAgLS0+IGZhbHNlCitmYWxzZSBvciBuaWwgICAgICAgIC0tPiBuaWwKKzEwIGFuZCAyMCAgICAgICAgICAgLS0+IDIwCit9CisKK30KKworQHNlY3Qze2NvbmNhdHwgQHRpdGxle0NvbmNhdGVuYXRpb259CitUaGUgc3RyaW5nIEB4e2NvbmNhdGVuYXRpb259IG9wZXJhdG9yIGluIEx1YSBpcworZGVub3RlZCBieSB0d28gZG90cyAoQENoYXJ7Li59KS4KK0lmIGJvdGggb3BlcmFuZHMgYXJlIHN0cmluZ3Mgb3IgbnVtYmVycywgdGhlbiB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8KK3N0cmluZ3MgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBkZXNjcmliZWQgaW4gQFNlZXtjb2VyY2lvbn0uCitPdGhlcndpc2UsIHRoZSBAaWR4e19fY29uY2F0fSBtZXRhbWV0aG9kIGlzIGNhbGxlZCBAc2Vle21ldGF0YWJsZX0uCisKK30KKworQHNlY3Qze2xlbi1vcHwgQHRpdGxle1RoZSBMZW5ndGggT3BlcmF0b3J9CisKK1RoZSBsZW5ndGggb3BlcmF0b3IgaXMgZGVub3RlZCBieSB0aGUgdW5hcnkgcHJlZml4IG9wZXJhdG9yIEBUeyN9LgorCitUaGUgbGVuZ3RoIG9mIGEgc3RyaW5nIGlzIGl0cyBudW1iZXIgb2YgYnl0ZXMKKyh0aGF0IGlzLCB0aGUgdXN1YWwgbWVhbmluZyBvZiBzdHJpbmcgbGVuZ3RoIHdoZW4gZWFjaAorY2hhcmFjdGVyIGlzIG9uZSBieXRlKS4KKworVGhlIGxlbmd0aCBvcGVyYXRvciBhcHBsaWVkIG9uIGEgdGFibGUKK3JldHVybnMgYSBAeHtib3JkZXJ9IGluIHRoYXQgdGFibGUuCitBIEBkZWZ7Ym9yZGVyfSBpbiBhIHRhYmxlIEBpZHt0fSBpcyBhbnkgbmF0dXJhbCBudW1iZXIKK3RoYXQgc2F0aXNmaWVzIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uOgorQHZlcmJhdGlteworKGJvcmRlciA9PSAwIG9yIHRbYm9yZGVyXSB+PSBuaWwpIGFuZCB0W2JvcmRlciArIDFdID09IG5pbAorfQorSW4gd29yZHMsCithIGJvcmRlciBpcyBhbnkgKG5hdHVyYWwpIGluZGV4IHByZXNlbnQgaW4gdGhlIHRhYmxlCit0aGF0IGlzIGZvbGxvd2VkIGJ5IGFuIGFic2VudCBpbmRleAorKG9yIHplcm8sIHdoZW4gaW5kZXggMSBpcyBhYnNlbnQpLgorCitBIHRhYmxlIHdpdGggZXhhY3RseSBvbmUgYm9yZGVyIGlzIGNhbGxlZCBhIEBkZWZ7c2VxdWVuY2V9LgorRm9yIGluc3RhbmNlLCB0aGUgdGFibGUgQFR7ezEwLCAyMCwgMzAsIDQwLCA1MH19IGlzIGEgc2VxdWVuY2UsCithcyBpdCBoYXMgb25seSBvbmUgYm9yZGVyICg1KS4KK1RoZSB0YWJsZSBAVHt7MTAsIDIwLCAzMCwgbmlsLCA1MH19IGhhcyB0d28gYm9yZGVycyAoMyBhbmQgNSksCithbmQgdGhlcmVmb3JlIGl0IGlzIG5vdCBhIHNlcXVlbmNlLgorVGhlIHRhYmxlIEBUe3tuaWwsIDIwLCAzMCwgbmlsLCBuaWwsIDYwLCBuaWx9fQoraGFzIHRocmVlIGJvcmRlcnMgKDAsIDMsIGFuZCA2KSwKK3NvIGl0IGlzIG5vdCBhIHNlcXVlbmNlLCB0b28uCitUaGUgdGFibGUgQFR7e319IGlzIGEgc2VxdWVuY2Ugd2l0aCBib3JkZXIgMC4KK05vdGUgdGhhdCBub24tbmF0dXJhbCBrZXlzIGRvIG5vdCBpbnRlcmZlcmUKK3dpdGggd2hldGhlciBhIHRhYmxlIGlzIGEgc2VxdWVuY2UuCisKK1doZW4gQGlke3R9IGlzIGEgc2VxdWVuY2UsCitAVHsjdH0gcmV0dXJucyBpdHMgb25seSBib3JkZXIsCit3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgaW50dWl0aXZlIG5vdGlvbiBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZS4KK1doZW4gQGlke3R9IGlzIG5vdCBhIHNlcXVlbmNlLAorQFR7I3R9IGNhbiByZXR1cm4gYW55IG9mIGl0cyBib3JkZXJzLgorKFRoZSBleGFjdCBvbmUgZGVwZW5kcyBvbiBkZXRhaWxzIG9mCit0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRhYmxlLAord2hpY2ggaW4gdHVybiBjYW4gZGVwZW5kIG9uIGhvdyB0aGUgdGFibGUgd2FzIHBvcHVsYXRlZCBhbmQKK3RoZSBtZW1vcnkgYWRkcmVzc2VzIG9mIGl0cyBub24tbnVtZXJpYyBrZXlzLikKKworVGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBsZW5ndGggb2YgYSB0YWJsZQoraGFzIGEgZ3VhcmFudGVlZCB3b3JzdCB0aW1lIG9mIEBNe08obG9nIG4pfSwKK3doZXJlIEBNe259IGlzIHRoZSBsYXJnZXN0IG5hdHVyYWwga2V5IGluIHRoZSB0YWJsZS4KKworQSBwcm9ncmFtIGNhbiBtb2RpZnkgdGhlIGJlaGF2aW9yIG9mIHRoZSBsZW5ndGggb3BlcmF0b3IgZm9yCithbnkgdmFsdWUgYnV0IHN0cmluZ3MgdGhyb3VnaCB0aGUgQGlkeHtfX2xlbn0gbWV0YW1ldGhvZCBAc2Vle21ldGF0YWJsZX0uCisKK30KKworQHNlY3Qze3ByZWN8IEB0aXRsZXtQcmVjZWRlbmNlfQorQHh7T3BlcmF0b3IgcHJlY2VkZW5jZX0gaW4gTHVhIGZvbGxvd3MgdGhlIHRhYmxlIGJlbG93LAorZnJvbSBsb3dlciB0byBoaWdoZXIgcHJpb3JpdHk6CitAdmVyYmF0aW17CitvcgorYW5kCis8ICAgICA+ICAgICA8PSAgICA+PSAgICB+PSAgICA9PQorfAorfgorJgorPDwgICAgPj4KKy4uCisrICAgICAtCisqICAgICAvICAgICAvLyAgICAlCit1bmFyeSBvcGVyYXRvcnMgKG5vdCAgICMgICAgIC0gICAgIH4pCiteCit9CitBcyB1c3VhbCwKK3lvdSBjYW4gdXNlIHBhcmVudGhlc2VzIHRvIGNoYW5nZSB0aGUgcHJlY2VkZW5jZXMgb2YgYW4gZXhwcmVzc2lvbi4KK1RoZSBjb25jYXRlbmF0aW9uIChAQ2hhcnsuLn0pIGFuZCBleHBvbmVudGlhdGlvbiAoQENoYXJ7Xn0pCitvcGVyYXRvcnMgYXJlIHJpZ2h0IGFzc29jaWF0aXZlLgorQWxsIG90aGVyIGJpbmFyeSBvcGVyYXRvcnMgYXJlIGxlZnQgYXNzb2NpYXRpdmUuCisKK30KKworQHNlY3Qze3RhYmxlY29uc3RydWN0b3J8IEB0aXRsZXtUYWJsZSBDb25zdHJ1Y3RvcnN9CitUYWJsZSBAeHtjb25zdHJ1Y3RvcnN9IGFyZSBleHByZXNzaW9ucyB0aGF0IGNyZWF0ZSB0YWJsZXMuCitFdmVyeSB0aW1lIGEgY29uc3RydWN0b3IgaXMgZXZhbHVhdGVkLCBhIG5ldyB0YWJsZSBpcyBjcmVhdGVkLgorQSBjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gZW1wdHkgdGFibGUKK29yIHRvIGNyZWF0ZSBhIHRhYmxlIGFuZCBpbml0aWFsaXplIHNvbWUgb2YgaXRzIGZpZWxkcy4KK1RoZSBnZW5lcmFsIHN5bnRheCBmb3IgY29uc3RydWN0b3JzIGlzCitAUHJvZHVjeworQHByb2R1Y25hbWV7dGFibGVjb25zdHJ1Y3Rvcn1AcHJvZHVjYm9keXtAYm5mdGVye0BPcGVufSBAYm5mb3B0e2ZpZWxkbGlzdH0gQGJuZnRlcntAQ2xvc2V9fQorQHByb2R1Y25hbWV7ZmllbGRsaXN0fUBwcm9kdWNib2R5e2ZpZWxkIEBibmZyZXB7ZmllbGRzZXAgZmllbGR9IEBibmZvcHR7ZmllbGRzZXB9fQorQHByb2R1Y25hbWV7ZmllbGR9QHByb2R1Y2JvZHl7QGJuZnRlcntbfSBleHAgQGJuZnRlcntdfSBAYm5mdGVyez19IGV4cCBAT3IKKyAgICAgICAgICAgICAgIEBibmZOdGVye05hbWV9IEBibmZ0ZXJ7PX0gZXhwIEBPciBleHB9CitAcHJvZHVjbmFtZXtmaWVsZHNlcH1AcHJvZHVjYm9keXtAYm5mdGVyeyx9IEBPciBAYm5mdGVyezt9fQorfQorCitFYWNoIGZpZWxkIG9mIHRoZSBmb3JtIEBUe1tleHAxXSA9IGV4cDJ9IGFkZHMgdG8gdGhlIG5ldyB0YWJsZSBhbiBlbnRyeQord2l0aCBrZXkgQGlke2V4cDF9IGFuZCB2YWx1ZSBAaWR7ZXhwMn0uCitBIGZpZWxkIG9mIHRoZSBmb3JtIEBUe25hbWUgPSBleHB9IGlzIGVxdWl2YWxlbnQgdG8KK0BUe1sibmFtZSJdID0gZXhwfS4KK0ZpbmFsbHksIGZpZWxkcyBvZiB0aGUgZm9ybSBAaWR7ZXhwfSBhcmUgZXF1aXZhbGVudCB0bworQFR7W2ldID0gZXhwfSwgd2hlcmUgQGlke2l9IGFyZSBjb25zZWN1dGl2ZSBpbnRlZ2Vycworc3RhcnRpbmcgd2l0aCAxLgorRmllbGRzIGluIHRoZSBvdGhlciBmb3JtYXRzIGRvIG5vdCBhZmZlY3QgdGhpcyBjb3VudGluZy4KK0ZvciBleGFtcGxlLAorQHZlcmJhdGlteworYSA9IHsgW2YoMSldID0gZzsgIngiLCAieSI7IHggPSAxLCBmKHgpLCBbMzBdID0gMjM7IDQ1IH0KK30KK2lzIGVxdWl2YWxlbnQgdG8KK0B2ZXJiYXRpbXsKK2RvCisgIGxvY2FsIHQgPSB7fQorICB0W2YoMSldID0gZworICB0WzFdID0gIngiICAgICAgICAgLS0gMXN0IGV4cAorICB0WzJdID0gInkiICAgICAgICAgLS0gMm5kIGV4cAorICB0LnggPSAxICAgICAgICAgICAgLS0gdFsieCJdID0gMQorICB0WzNdID0gZih4KSAgICAgICAgLS0gM3JkIGV4cAorICB0WzMwXSA9IDIzCisgIHRbNF0gPSA0NSAgICAgICAgICAtLSA0dGggZXhwCisgIGEgPSB0CitlbmQKK30KKworVGhlIG9yZGVyIG9mIHRoZSBhc3NpZ25tZW50cyBpbiBhIGNvbnN0cnVjdG9yIGlzIHVuZGVmaW5lZC4KKyhUaGlzIG9yZGVyIHdvdWxkIGJlIHJlbGV2YW50IG9ubHkgd2hlbiB0aGVyZSBhcmUgcmVwZWF0ZWQga2V5cy4pCisKK0lmIHRoZSBsYXN0IGZpZWxkIGluIHRoZSBsaXN0IGhhcyB0aGUgZm9ybSBAaWR7ZXhwfQorYW5kIHRoZSBleHByZXNzaW9uIGlzIGEgZnVuY3Rpb24gY2FsbCBvciBhIHZhcmFyZyBleHByZXNzaW9uLAordGhlbiBhbGwgdmFsdWVzIHJldHVybmVkIGJ5IHRoaXMgZXhwcmVzc2lvbiBlbnRlciB0aGUgbGlzdCBjb25zZWN1dGl2ZWx5CitAc2Vle2Z1bmN0aW9uY2FsbH0uCisKK1RoZSBmaWVsZCBsaXN0IGNhbiBoYXZlIGFuIG9wdGlvbmFsIHRyYWlsaW5nIHNlcGFyYXRvciwKK2FzIGEgY29udmVuaWVuY2UgZm9yIG1hY2hpbmUtZ2VuZXJhdGVkIGNvZGUuCisKK30KKworQHNlY3Qze2Z1bmN0aW9uY2FsbHwgQHRpdGxle0Z1bmN0aW9uIENhbGxzfQorQSBAeHtmdW5jdGlvbiBjYWxsfSBpbiBMdWEgaGFzIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorQFByb2R1Y3sKK0Bwcm9kdWNuYW1le2Z1bmN0aW9uY2FsbH1AcHJvZHVjYm9keXtwcmVmaXhleHAgYXJnc30KK30KK0luIGEgZnVuY3Rpb24gY2FsbCwKK2ZpcnN0IEBibmZOdGVye3ByZWZpeGV4cH0gYW5kIEBibmZOdGVye2FyZ3N9IGFyZSBldmFsdWF0ZWQuCitJZiB0aGUgdmFsdWUgb2YgQGJuZk50ZXJ7cHJlZml4ZXhwfSBoYXMgdHlwZSBAZW1waHtmdW5jdGlvbn0sCit0aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCit3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCitPdGhlcndpc2UsIHRoZSBAYm5mTnRlcntwcmVmaXhleHB9IEBpZHh7X19jYWxsfSBtZXRhbWV0aG9kIGlzIGNhbGxlZCwKK2hhdmluZyBhcyBmaXJzdCBhcmd1bWVudCB0aGUgdmFsdWUgb2YgQGJuZk50ZXJ7cHJlZml4ZXhwfSwKK2ZvbGxvd2VkIGJ5IHRoZSBvcmlnaW5hbCBjYWxsIGFyZ3VtZW50cworQHNlZXttZXRhdGFibGV9LgorCitUaGUgZm9ybQorQFByb2R1Y3sKK0Bwcm9kdWNuYW1le2Z1bmN0aW9uY2FsbH1AcHJvZHVjYm9keXtwcmVmaXhleHAgQGJuZnRlcns6fSBAYm5mTnRlcntOYW1lfSBhcmdzfQorfQorY2FuIGJlIHVzZWQgdG8gY2FsbCBAUXttZXRob2RzfS4KK0EgY2FsbCBAVHt2Om5hbWUoQHJlcHthcmdzfSl9CitpcyBzeW50YWN0aWMgc3VnYXIgZm9yIEBUe3YubmFtZSh2LEByZXB7YXJnc30pfSwKK2V4Y2VwdCB0aGF0IEBpZHt2fSBpcyBldmFsdWF0ZWQgb25seSBvbmNlLgorCitBcmd1bWVudHMgaGF2ZSB0aGUgZm9sbG93aW5nIHN5bnRheDoKK0BQcm9kdWN7CitAcHJvZHVjbmFtZXthcmdzfUBwcm9kdWNib2R5e0BibmZ0ZXJ7KH0gQGJuZm9wdHtleHBsaXN0fSBAYm5mdGVyeyl9fQorQHByb2R1Y25hbWV7YXJnc31AcHJvZHVjYm9keXt0YWJsZWNvbnN0cnVjdG9yfQorQHByb2R1Y25hbWV7YXJnc31AcHJvZHVjYm9keXtAYm5mTnRlcntMaXRlcmFsU3RyaW5nfX0KK30KK0FsbCBhcmd1bWVudCBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGJlZm9yZSB0aGUgY2FsbC4KK0EgY2FsbCBvZiB0aGUgZm9ybSBAVHtme0ByZXB7ZmllbGRzfX19IGlzCitzeW50YWN0aWMgc3VnYXIgZm9yIEBUe2Yoe0ByZXB7ZmllbGRzfX0pfTsKK3RoYXQgaXMsIHRoZSBhcmd1bWVudCBsaXN0IGlzIGEgc2luZ2xlIG5ldyB0YWJsZS4KK0EgY2FsbCBvZiB0aGUgZm9ybSBAVHtmJ0ByZXB7c3RyaW5nfSd9Cisob3IgQFR7ZiJAcmVwe3N0cmluZ30ifSBvciBAVHtmW1tAcmVwe3N0cmluZ31dXX0pCitpcyBzeW50YWN0aWMgc3VnYXIgZm9yIEBUe2YoJ0ByZXB7c3RyaW5nfScpfTsKK3RoYXQgaXMsIHRoZSBhcmd1bWVudCBsaXN0IGlzIGEgc2luZ2xlIGxpdGVyYWwgc3RyaW5nLgorCitBIGNhbGwgb2YgdGhlIGZvcm0gQFR7cmV0dXJuIEByZXB7ZnVuY3Rpb25jYWxsfX0gaXMgY2FsbGVkCithIEBkZWZ7dGFpbCBjYWxsfS4KK0x1YSBpbXBsZW1lbnRzIEBkZWZ7cHJvcGVyIHRhaWwgY2FsbHN9Cisob3IgQGVtcGh7cHJvcGVyIHRhaWwgcmVjdXJzaW9ufSk6CitpbiBhIHRhaWwgY2FsbCwKK3RoZSBjYWxsZWQgZnVuY3Rpb24gcmV1c2VzIHRoZSBzdGFjayBlbnRyeSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi4KK1RoZXJlZm9yZSwgdGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBuZXN0ZWQgdGFpbCBjYWxscyB0aGF0CithIHByb2dyYW0gY2FuIGV4ZWN1dGUuCitIb3dldmVyLCBhIHRhaWwgY2FsbCBlcmFzZXMgYW55IGRlYnVnIGluZm9ybWF0aW9uIGFib3V0IHRoZQorY2FsbGluZyBmdW5jdGlvbi4KK05vdGUgdGhhdCBhIHRhaWwgY2FsbCBvbmx5IGhhcHBlbnMgd2l0aCBhIHBhcnRpY3VsYXIgc3ludGF4LAord2hlcmUgdGhlIEBSd3tyZXR1cm59IGhhcyBvbmUgc2luZ2xlIGZ1bmN0aW9uIGNhbGwgYXMgYXJndW1lbnQ7Cit0aGlzIHN5bnRheCBtYWtlcyB0aGUgY2FsbGluZyBmdW5jdGlvbiByZXR1cm4gZXhhY3RseQordGhlIHJldHVybnMgb2YgdGhlIGNhbGxlZCBmdW5jdGlvbi4KK1NvLCBub25lIG9mIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYXJlIHRhaWwgY2FsbHM6CitAdmVyYmF0aW17CityZXR1cm4gKGYoeCkpICAgICAgICAtLSByZXN1bHRzIGFkanVzdGVkIHRvIDEKK3JldHVybiAyICogZih4KQorcmV0dXJuIHgsIGYoeCkgICAgICAgLS0gYWRkaXRpb25hbCByZXN1bHRzCitmKHgpOyByZXR1cm4gICAgICAgICAtLSByZXN1bHRzIGRpc2NhcmRlZAorcmV0dXJuIHggb3IgZih4KSAgICAgLS0gcmVzdWx0cyBhZGp1c3RlZCB0byAxCit9CisKK30KKworQHNlY3Qze2Z1bmMtZGVmfCBAdGl0bGV7RnVuY3Rpb24gRGVmaW5pdGlvbnN9CisKK1RoZSBzeW50YXggZm9yIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMKK0BQcm9kdWN7CitAcHJvZHVjbmFtZXtmdW5jdGlvbmRlZn1AcHJvZHVjYm9keXtAUnd7ZnVuY3Rpb259IGZ1bmNib2R5fQorQHByb2R1Y25hbWV7ZnVuY2JvZHl9QHByb2R1Y2JvZHl7QGJuZnRlcnsofSBAYm5mb3B0e3Bhcmxpc3R9IEBibmZ0ZXJ7KX0gYmxvY2sgQFJ3e2VuZH19Cit9CisKK1RoZSBmb2xsb3dpbmcgc3ludGFjdGljIHN1Z2FyIHNpbXBsaWZpZXMgZnVuY3Rpb24gZGVmaW5pdGlvbnM6CitAUHJvZHVjeworQHByb2R1Y25hbWV7c3RhdH1AcHJvZHVjYm9keXtAUnd7ZnVuY3Rpb259IGZ1bmNuYW1lIGZ1bmNib2R5fQorQHByb2R1Y25hbWV7c3RhdH1AcHJvZHVjYm9keXtAUnd7bG9jYWx9IEBSd3tmdW5jdGlvbn0gQGJuZk50ZXJ7TmFtZX0gZnVuY2JvZHl9CitAcHJvZHVjbmFtZXtmdW5jbmFtZX1AcHJvZHVjYm9keXtAYm5mTnRlcntOYW1lfSBAYm5mcmVwe0BibmZ0ZXJ7Ln0gQGJuZk50ZXJ7TmFtZX19IEBibmZvcHR7QGJuZnRlcns6fSBAYm5mTnRlcntOYW1lfX19Cit9CitUaGUgc3RhdGVtZW50CitAdmVyYmF0aW17CitmdW5jdGlvbiBmICgpIEByZXB7Ym9keX0gZW5kCit9Cit0cmFuc2xhdGVzIHRvCitAdmVyYmF0aW17CitmID0gZnVuY3Rpb24gKCkgQHJlcHtib2R5fSBlbmQKK30KK1RoZSBzdGF0ZW1lbnQKK0B2ZXJiYXRpbXsKK2Z1bmN0aW9uIHQuYS5iLmMuZiAoKSBAcmVwe2JvZHl9IGVuZAorfQordHJhbnNsYXRlcyB0bworQHZlcmJhdGltewordC5hLmIuYy5mID0gZnVuY3Rpb24gKCkgQHJlcHtib2R5fSBlbmQKK30KK1RoZSBzdGF0ZW1lbnQKK0B2ZXJiYXRpbXsKK2xvY2FsIGZ1bmN0aW9uIGYgKCkgQHJlcHtib2R5fSBlbmQKK30KK3RyYW5zbGF0ZXMgdG8KK0B2ZXJiYXRpbXsKK2xvY2FsIGY7IGYgPSBmdW5jdGlvbiAoKSBAcmVwe2JvZHl9IGVuZAorfQorbm90IHRvCitAdmVyYmF0aW17Citsb2NhbCBmID0gZnVuY3Rpb24gKCkgQHJlcHtib2R5fSBlbmQKK30KKyhUaGlzIG9ubHkgbWFrZXMgYSBkaWZmZXJlbmNlIHdoZW4gdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uCitjb250YWlucyByZWZlcmVuY2VzIHRvIEBpZHtmfS4pCisKK0EgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIGV4cHJlc3Npb24sCit3aG9zZSB2YWx1ZSBoYXMgdHlwZSBAZW1waHtmdW5jdGlvbn0uCitXaGVuIEx1YSBwcmVjb21waWxlcyBhIGNodW5rLAorYWxsIGl0cyBmdW5jdGlvbiBib2RpZXMgYXJlIHByZWNvbXBpbGVkIHRvby4KK1RoZW4sIHdoZW5ldmVyIEx1YSBleGVjdXRlcyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiwKK3RoZSBmdW5jdGlvbiBpcyBAZW1waHtpbnN0YW50aWF0ZWR9IChvciBAZW1waHtjbG9zZWR9KS4KK1RoaXMgZnVuY3Rpb24gaW5zdGFuY2UgKG9yIEBlbXBoeHtjbG9zdXJlfSkKK2lzIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4KKworUGFyYW1ldGVycyBhY3QgYXMgbG9jYWwgdmFyaWFibGVzIHRoYXQgYXJlCitpbml0aWFsaXplZCB3aXRoIHRoZSBhcmd1bWVudCB2YWx1ZXM6CitAUHJvZHVjeworQHByb2R1Y25hbWV7cGFybGlzdH1AcHJvZHVjYm9keXtuYW1lbGlzdCBAYm5mb3B0e0BibmZ0ZXJ7LH0gQGJuZnRlcnsuLi59fSBAT3IKKyAgQGJuZnRlcnsuLi59fQorfQorV2hlbiBhIEx1YSBmdW5jdGlvbiBpcyBjYWxsZWQsCitpdCBhZGp1c3RzIGl0cyBsaXN0IG9mIEB4e2FyZ3VtZW50c30gdG8KK3RoZSBsZW5ndGggb2YgaXRzIGxpc3Qgb2YgcGFyYW1ldGVycywKK3VubGVzcyB0aGUgZnVuY3Rpb24gaXMgYSBAZGVme3ZhcmFyZyBmdW5jdGlvbn0sCit3aGljaCBpcyBpbmRpY2F0ZWQgYnkgdGhyZWUgZG90cyAoQENoYXJ7Li4ufSkKK2F0IHRoZSBlbmQgb2YgaXRzIHBhcmFtZXRlciBsaXN0LgorQSB2YXJhcmcgZnVuY3Rpb24gZG9lcyBub3QgYWRqdXN0IGl0cyBhcmd1bWVudCBsaXN0OworaW5zdGVhZCwgaXQgY29sbGVjdHMgYWxsIGV4dHJhIGFyZ3VtZW50cyBhbmQgc3VwcGxpZXMgdGhlbQordG8gdGhlIGZ1bmN0aW9uIHRocm91Z2ggYSBAZGVme3ZhcmFyZyBleHByZXNzaW9ufSwKK3doaWNoIGlzIGFsc28gd3JpdHRlbiBhcyB0aHJlZSBkb3RzLgorVGhlIHZhbHVlIG9mIHRoaXMgZXhwcmVzc2lvbiBpcyBhIGxpc3Qgb2YgYWxsIGFjdHVhbCBleHRyYSBhcmd1bWVudHMsCitzaW1pbGFyIHRvIGEgZnVuY3Rpb24gd2l0aCBtdWx0aXBsZSByZXN1bHRzLgorSWYgYSB2YXJhcmcgZXhwcmVzc2lvbiBpcyB1c2VkIGluc2lkZSBhbm90aGVyIGV4cHJlc3Npb24KK29yIGluIHRoZSBtaWRkbGUgb2YgYSBsaXN0IG9mIGV4cHJlc3Npb25zLAordGhlbiBpdHMgcmV0dXJuIGxpc3QgaXMgYWRqdXN0ZWQgdG8gb25lIGVsZW1lbnQuCitJZiB0aGUgZXhwcmVzc2lvbiBpcyB1c2VkIGFzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYSBsaXN0IG9mIGV4cHJlc3Npb25zLAordGhlbiBubyBhZGp1c3RtZW50IGlzIG1hZGUKKyh1bmxlc3MgdGhhdCBsYXN0IGV4cHJlc3Npb24gaXMgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMpLgorCisKK0FzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnM6CitAdmVyYmF0aW17CitmdW5jdGlvbiBmKGEsIGIpIGVuZAorZnVuY3Rpb24gZyhhLCBiLCAuLi4pIGVuZAorZnVuY3Rpb24gcigpIHJldHVybiAxLDIsMyBlbmQKK30KK1RoZW4sIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBtYXBwaW5nIGZyb20gYXJndW1lbnRzIHRvIHBhcmFtZXRlcnMgYW5kCit0byB0aGUgdmFyYXJnIGV4cHJlc3Npb246CitAdmVyYmF0aW17CitDQUxMICAgICAgICAgICAgUEFSQU1FVEVSUworCitmKDMpICAgICAgICAgICAgIGE9MywgYj1uaWwKK2YoMywgNCkgICAgICAgICAgYT0zLCBiPTQKK2YoMywgNCwgNSkgICAgICAgYT0zLCBiPTQKK2YocigpLCAxMCkgICAgICAgYT0xLCBiPTEwCitmKHIoKSkgICAgICAgICAgIGE9MSwgYj0yCisKK2coMykgICAgICAgICAgICAgYT0zLCBiPW5pbCwgLi4uIC0tPiAgKG5vdGhpbmcpCitnKDMsIDQpICAgICAgICAgIGE9MywgYj00LCAgIC4uLiAtLT4gIChub3RoaW5nKQorZygzLCA0LCA1LCA4KSAgICBhPTMsIGI9NCwgICAuLi4gLS0+ICA1ICA4CitnKDUsIHIoKSkgICAgICAgIGE9NSwgYj0xLCAgIC4uLiAtLT4gIDIgIDMKK30KKworUmVzdWx0cyBhcmUgcmV0dXJuZWQgdXNpbmcgdGhlIEBSd3tyZXR1cm59IHN0YXRlbWVudCBAc2Vle2NvbnRyb2x9LgorSWYgY29udHJvbCByZWFjaGVzIHRoZSBlbmQgb2YgYSBmdW5jdGlvbgord2l0aG91dCBlbmNvdW50ZXJpbmcgYSBAUnd7cmV0dXJufSBzdGF0ZW1lbnQsCit0aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zIHdpdGggbm8gcmVzdWx0cy4KKworQGluZGV4e211bHRpcGxlIHJldHVybn0KK1RoZXJlIGlzIGEgc3lzdGVtLWRlcGVuZGVudCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHZhbHVlcwordGhhdCBhIGZ1bmN0aW9uIG1heSByZXR1cm4uCitUaGlzIGxpbWl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgbGFyZ2VyIHRoYW4gMTAwMC4KKworVGhlIEBlbXBoeHtjb2xvbn0gc3ludGF4CitpcyB1c2VkIGZvciBkZWZpbmluZyBAZGVme21ldGhvZHN9LAordGhhdCBpcywgZnVuY3Rpb25zIHRoYXQgaGF2ZSBhbiBpbXBsaWNpdCBleHRyYSBwYXJhbWV0ZXIgQGlkeHtzZWxmfS4KK1RodXMsIHRoZSBzdGF0ZW1lbnQKK0B2ZXJiYXRpbXsKK2Z1bmN0aW9uIHQuYS5iLmM6ZiAoQHJlcHtwYXJhbXN9KSBAcmVwe2JvZHl9IGVuZAorfQoraXMgc3ludGFjdGljIHN1Z2FyIGZvcgorQHZlcmJhdGltewordC5hLmIuYy5mID0gZnVuY3Rpb24gKHNlbGYsIEByZXB7cGFyYW1zfSkgQHJlcHtib2R5fSBlbmQKK30KKworfQorCit9CisKK0BzZWN0Mnt2aXNpYmlsaXR5fCBAdGl0bGV7VmlzaWJpbGl0eSBSdWxlc30KKworQGluZGV4e3Zpc2liaWxpdHl9CitMdWEgaXMgYSBsZXhpY2FsbHkgc2NvcGVkIGxhbmd1YWdlLgorVGhlIHNjb3BlIG9mIGEgbG9jYWwgdmFyaWFibGUgYmVnaW5zIGF0IHRoZSBmaXJzdCBzdGF0ZW1lbnQgYWZ0ZXIKK2l0cyBkZWNsYXJhdGlvbiBhbmQgbGFzdHMgdW50aWwgdGhlIGxhc3Qgbm9uLXZvaWQgc3RhdGVtZW50CitvZiB0aGUgaW5uZXJtb3N0IGJsb2NrIHRoYXQgaW5jbHVkZXMgdGhlIGRlY2xhcmF0aW9uLgorQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlOgorQHZlcmJhdGlteworeCA9IDEwICAgICAgICAgICAgICAgIC0tIGdsb2JhbCB2YXJpYWJsZQorZG8gICAgICAgICAgICAgICAgICAgIC0tIG5ldyBibG9jaworICBsb2NhbCB4ID0geCAgICAgICAgIC0tIG5ldyAneCcsIHdpdGggdmFsdWUgMTAKKyAgcHJpbnQoeCkgICAgICAgICAgICAtLT4gMTAKKyAgeCA9IHgrMQorICBkbyAgICAgICAgICAgICAgICAgIC0tIGFub3RoZXIgYmxvY2sKKyAgICBsb2NhbCB4ID0geCsxICAgICAtLSBhbm90aGVyICd4JworICAgIHByaW50KHgpICAgICAgICAgIC0tPiAxMgorICBlbmQKKyAgcHJpbnQoeCkgICAgICAgICAgICAtLT4gMTEKK2VuZAorcHJpbnQoeCkgICAgICAgICAgICAgIC0tPiAxMCAgKHRoZSBnbG9iYWwgb25lKQorfQorCitOb3RpY2UgdGhhdCwgaW4gYSBkZWNsYXJhdGlvbiBsaWtlIEBUe2xvY2FsIHggPSB4fSwKK3RoZSBuZXcgQGlke3h9IGJlaW5nIGRlY2xhcmVkIGlzIG5vdCBpbiBzY29wZSB5ZXQsCithbmQgc28gdGhlIHNlY29uZCBAaWR7eH0gcmVmZXJzIHRvIHRoZSBvdXRzaWRlIHZhcmlhYmxlLgorCitCZWNhdXNlIG9mIHRoZSBAeHtsZXhpY2FsIHNjb3Bpbmd9IHJ1bGVzLAorbG9jYWwgdmFyaWFibGVzIGNhbiBiZSBmcmVlbHkgYWNjZXNzZWQgYnkgZnVuY3Rpb25zCitkZWZpbmVkIGluc2lkZSB0aGVpciBzY29wZS4KK0EgbG9jYWwgdmFyaWFibGUgdXNlZCBieSBhbiBpbm5lciBmdW5jdGlvbiBpcyBjYWxsZWQKK2FuIEBkZWZ7dXB2YWx1ZX0sIG9yIEBlbXBoeHtleHRlcm5hbCBsb2NhbCB2YXJpYWJsZX0sCitpbnNpZGUgdGhlIGlubmVyIGZ1bmN0aW9uLgorCitOb3RpY2UgdGhhdCBlYWNoIGV4ZWN1dGlvbiBvZiBhIEBSd3tsb2NhbH0gc3RhdGVtZW50CitkZWZpbmVzIG5ldyBsb2NhbCB2YXJpYWJsZXMuCitDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CitAdmVyYmF0aW17CithID0ge30KK2xvY2FsIHggPSAyMAorZm9yIGk9MSwxMCBkbworICBsb2NhbCB5ID0gMAorICBhW2ldID0gZnVuY3Rpb24gKCkgeT15KzE7IHJldHVybiB4K3kgZW5kCitlbmQKK30KK1RoZSBsb29wIGNyZWF0ZXMgdGVuIGNsb3N1cmVzCisodGhhdCBpcywgdGVuIGluc3RhbmNlcyBvZiB0aGUgYW5vbnltb3VzIGZ1bmN0aW9uKS4KK0VhY2ggb2YgdGhlc2UgY2xvc3VyZXMgdXNlcyBhIGRpZmZlcmVudCBAaWR7eX0gdmFyaWFibGUsCit3aGlsZSBhbGwgb2YgdGhlbSBzaGFyZSB0aGUgc2FtZSBAaWR7eH0uCisKK30KKworfQorCisKK0BDey0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS19CitAc2VjdDF7QVBJfCBAdGl0bGV7VGhlIEFwcGxpY2F0aW9uIFByb2dyYW0gSW50ZXJmYWNlfQorCitAaW5kZXh7QyBBUEl9CitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBATntDIEFQSX0gZm9yIEx1YSwgdGhhdCBpcywKK3RoZSBzZXQgb2YgQE57QyBmdW5jdGlvbnN9IGF2YWlsYWJsZSB0byB0aGUgaG9zdCBwcm9ncmFtIHRvIGNvbW11bmljYXRlCit3aXRoIEx1YS4KK0FsbCBBUEkgZnVuY3Rpb25zIGFuZCByZWxhdGVkIHR5cGVzIGFuZCBjb25zdGFudHMKK2FyZSBkZWNsYXJlZCBpbiB0aGUgaGVhZGVyIGZpbGUgQGRlZmlke2x1YS5ofS4KKworRXZlbiB3aGVuIHdlIHVzZSB0aGUgdGVybSBAUXtmdW5jdGlvbn0sCithbnkgZmFjaWxpdHkgaW4gdGhlIEFQSSBtYXkgYmUgcHJvdmlkZWQgYXMgYSBtYWNybyBpbnN0ZWFkLgorRXhjZXB0IHdoZXJlIHN0YXRlZCBvdGhlcndpc2UsCithbGwgc3VjaCBtYWNyb3MgdXNlIGVhY2ggb2YgdGhlaXIgYXJndW1lbnRzIGV4YWN0bHkgb25jZQorKGV4Y2VwdCBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50LCB3aGljaCBpcyBhbHdheXMgYSBMdWEgc3RhdGUpLAorYW5kIHNvIGRvIG5vdCBnZW5lcmF0ZSBhbnkgaGlkZGVuIHNpZGUtZWZmZWN0cy4KKworQXMgaW4gbW9zdCBATntDIGxpYnJhcmllc30sCit0aGUgTHVhIEFQSSBmdW5jdGlvbnMgZG8gbm90IGNoZWNrIHRoZWlyIGFyZ3VtZW50cworZm9yIHZhbGlkaXR5IG9yIGNvbnNpc3RlbmN5LgorSG93ZXZlciwgeW91IGNhbiBjaGFuZ2UgdGhpcyBiZWhhdmlvciBieSBjb21waWxpbmcgTHVhCit3aXRoIHRoZSBtYWNybyBAZGVmaWR7TFVBX1VTRV9BUElDSEVDS30gZGVmaW5lZC4KKworVGhlIEx1YSBsaWJyYXJ5IGlzIGZ1bGx5IHJlZW50cmFudDoKK2l0IGhhcyBubyBnbG9iYWwgdmFyaWFibGVzLgorSXQga2VlcHMgYWxsIGluZm9ybWF0aW9uIGl0IG5lZWRzIGluIGEgZHluYW1pYyBzdHJ1Y3R1cmUsCitjYWxsZWQgdGhlIEBkZWZ7THVhIHN0YXRlfS4KKworRWFjaCBMdWEgc3RhdGUgaGFzIG9uZSBvciBtb3JlIHRocmVhZHMsCit3aGljaCBjb3JyZXNwb25kIHRvIGluZGVwZW5kZW50LCBjb29wZXJhdGl2ZSBsaW5lcyBvZiBleGVjdXRpb24uCitUaGUgdHlwZSBATGlke2x1YV9TdGF0ZX0gKGRlc3BpdGUgaXRzIG5hbWUpIHJlZmVycyB0byBhIHRocmVhZC4KKyhJbmRpcmVjdGx5LCB0aHJvdWdoIHRoZSB0aHJlYWQsIGl0IGFsc28gcmVmZXJzIHRvIHRoZQorTHVhIHN0YXRlIGFzc29jaWF0ZWQgdG8gdGhlIHRocmVhZC4pCisKK0EgcG9pbnRlciB0byBhIHRocmVhZCBtdXN0IGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8KK2V2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBsaWJyYXJ5LCBleGNlcHQgdG8gQExpZHtsdWFfbmV3c3RhdGV9LAord2hpY2ggY3JlYXRlcyBhIEx1YSBzdGF0ZSBmcm9tIHNjcmF0Y2ggYW5kIHJldHVybnMgYSBwb2ludGVyCit0byB0aGUgQGVtcGh7bWFpbiB0aHJlYWR9IGluIHRoZSBuZXcgc3RhdGUuCisKKworQHNlY3Qye0B0aXRsZXtUaGUgU3RhY2t9CisKK0x1YSB1c2VzIGEgQGVtcGh7dmlydHVhbCBzdGFja30gdG8gcGFzcyB2YWx1ZXMgdG8gYW5kIGZyb20gQy4KK0VhY2ggZWxlbWVudCBpbiB0aGlzIHN0YWNrIHJlcHJlc2VudHMgYSBMdWEgdmFsdWUKKyhAbmlsLCBudW1iZXIsIHN0cmluZywgZXRjLikuCitGdW5jdGlvbnMgaW4gdGhlIEFQSSBjYW4gYWNjZXNzIHRoaXMgc3RhY2sgdGhyb3VnaCB0aGUKK0x1YSBzdGF0ZSBwYXJhbWV0ZXIgdGhhdCB0aGV5IHJlY2VpdmUuCisKK1doZW5ldmVyIEx1YSBjYWxscyBDLCB0aGUgY2FsbGVkIGZ1bmN0aW9uIGdldHMgYSBuZXcgc3RhY2ssCit3aGljaCBpcyBpbmRlcGVuZGVudCBvZiBwcmV2aW91cyBzdGFja3MgYW5kIG9mIHN0YWNrcyBvZgorQE57QyBmdW5jdGlvbnN9IHRoYXQgYXJlIHN0aWxsIGFjdGl2ZS4KK1RoaXMgc3RhY2sgaW5pdGlhbGx5IGNvbnRhaW5zIGFueSBhcmd1bWVudHMgdG8gdGhlIEBOe0MgZnVuY3Rpb259CithbmQgaXQgaXMgd2hlcmUgdGhlIEBOe0MgZnVuY3Rpb259IGNhbiBzdG9yZSB0ZW1wb3JhcnkKK0x1YSB2YWx1ZXMgYW5kIG11c3QgcHVzaCBpdHMgcmVzdWx0cwordG8gYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBAc2VlQ3tsdWFfQ0Z1bmN0aW9ufS4KKworRm9yIGNvbnZlbmllbmNlLAorbW9zdCBxdWVyeSBvcGVyYXRpb25zIGluIHRoZSBBUEkgZG8gbm90IGZvbGxvdyBhIHN0cmljdCBzdGFjayBkaXNjaXBsaW5lLgorSW5zdGVhZCwgdGhleSBjYW4gcmVmZXIgdG8gYW55IGVsZW1lbnQgaW4gdGhlIHN0YWNrCitieSB1c2luZyBhbiBAZW1waHtpbmRleH06QGluZGV4e2luZGV4IChBUEkgc3RhY2spfQorQSBwb3NpdGl2ZSBpbmRleCByZXByZXNlbnRzIGFuIGFic29sdXRlIHN0YWNrIHBvc2l0aW9uCisoc3RhcnRpbmcgQE57YXQgMX0pOworYSBuZWdhdGl2ZSBpbmRleCByZXByZXNlbnRzIGFuIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgdG9wIG9mIHRoZSBzdGFjay4KK01vcmUgc3BlY2lmaWNhbGx5LCBpZiB0aGUgc3RhY2sgaGFzIEByZXB7bn0gZWxlbWVudHMsCit0aGVuIEBOe2luZGV4IDF9IHJlcHJlc2VudHMgdGhlIGZpcnN0IGVsZW1lbnQKKyh0aGF0IGlzLCB0aGUgZWxlbWVudCB0aGF0IHdhcyBwdXNoZWQgb250byB0aGUgc3RhY2sgZmlyc3QpCithbmQKK0BOe2luZGV4IEByZXB7bn19IHJlcHJlc2VudHMgdGhlIGxhc3QgZWxlbWVudDsKK0BOe2luZGV4IEBudW17LTF9fSBhbHNvIHJlcHJlc2VudHMgdGhlIGxhc3QgZWxlbWVudAorKHRoYXQgaXMsIHRoZSBlbGVtZW50IGF0IEBOe3RoZSB0b3B9KQorYW5kIGluZGV4IEBNey1ufSByZXByZXNlbnRzIHRoZSBmaXJzdCBlbGVtZW50LgorCit9CisKK0BzZWN0MntzdGFja3NpemV8IEB0aXRsZXtTdGFjayBTaXplfQorCitXaGVuIHlvdSBpbnRlcmFjdCB3aXRoIHRoZSBMdWEgQVBJLAoreW91IGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgY29uc2lzdGVuY3kuCitJbiBwYXJ0aWN1bGFyLAorQGVtcGh7eW91IGFyZSByZXNwb25zaWJsZSBmb3IgY29udHJvbGxpbmcgc3RhY2sgb3ZlcmZsb3d9LgorWW91IGNhbiB1c2UgdGhlIGZ1bmN0aW9uIEBMaWR7bHVhX2NoZWNrc3RhY2t9Cit0byBlbnN1cmUgdGhhdCB0aGUgc3RhY2sgaGFzIGVub3VnaCBzcGFjZSBmb3IgcHVzaGluZyBuZXcgZWxlbWVudHMuCisKK1doZW5ldmVyIEx1YSBjYWxscyBDLAoraXQgZW5zdXJlcyB0aGF0IHRoZSBzdGFjayBoYXMgc3BhY2UgZm9yCithdCBsZWFzdCBAZGVmaWR7TFVBX01JTlNUQUNLfSBleHRyYSBzbG90cy4KK0BpZHtMVUFfTUlOU1RBQ0t9IGlzIGRlZmluZWQgYXMgMjAsCitzbyB0aGF0IHVzdWFsbHkgeW91IGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHN0YWNrIHNwYWNlCit1bmxlc3MgeW91ciBjb2RlIGhhcyBsb29wcyBwdXNoaW5nIGVsZW1lbnRzIG9udG8gdGhlIHN0YWNrLgorCitXaGVuIHlvdSBjYWxsIGEgTHVhIGZ1bmN0aW9uCit3aXRob3V0IGEgZml4ZWQgbnVtYmVyIG9mIHJlc3VsdHMgQHNlZUZ7bHVhX2NhbGx9LAorTHVhIGVuc3VyZXMgdGhhdCB0aGUgc3RhY2sgaGFzIGVub3VnaCBzcGFjZSBmb3IgYWxsIHJlc3VsdHMsCitidXQgaXQgZG9lcyBub3QgZW5zdXJlIGFueSBleHRyYSBzcGFjZS4KK1NvLCBiZWZvcmUgcHVzaGluZyBhbnl0aGluZyBpbiB0aGUgc3RhY2sgYWZ0ZXIgc3VjaCBhIGNhbGwKK3lvdSBzaG91bGQgdXNlIEBMaWR7bHVhX2NoZWNrc3RhY2t9LgorCit9CisKK0BzZWN0MntAdGl0bGV7VmFsaWQgYW5kIEFjY2VwdGFibGUgSW5kaWNlc30KKworQW55IGZ1bmN0aW9uIGluIHRoZSBBUEkgdGhhdCByZWNlaXZlcyBzdGFjayBpbmRpY2VzCit3b3JrcyBvbmx5IHdpdGggQGVtcGh4e3ZhbGlkIGluZGljZXN9IG9yIEBlbXBoeHthY2NlcHRhYmxlIGluZGljZXN9LgorCitBIEBkZWZ7dmFsaWQgaW5kZXh9IGlzIGFuIGluZGV4IHRoYXQgcmVmZXJzIHRvIGEKK3Bvc2l0aW9uIHRoYXQgc3RvcmVzIGEgbW9kaWZpYWJsZSBMdWEgdmFsdWUuCitJdCBjb21wcmlzZXMgc3RhY2sgaW5kaWNlcyBATntiZXR3ZWVuIDF9IGFuZCB0aGUgc3RhY2sgdG9wCisoQFR7MSBAbGVxIGFicyhpbmRleCkgQGxlcSB0b3B9KQorQGluZGV4e3N0YWNrIGluZGV4fQorcGx1cyBAZGVme3BzZXVkby1pbmRpY2VzfSwKK3doaWNoIHJlcHJlc2VudCBzb21lIHBvc2l0aW9ucyB0aGF0IGFyZSBhY2Nlc3NpYmxlIHRvIEBOe0MgY29kZX0KK2J1dCB0aGF0IGFyZSBub3QgaW4gdGhlIHN0YWNrLgorUHNldWRvLWluZGljZXMgYXJlIHVzZWQgdG8gYWNjZXNzIHRoZSByZWdpc3RyeSBAc2Vle3JlZ2lzdHJ5fQorYW5kIHRoZSB1cHZhbHVlcyBvZiBhIEBOe0MgZnVuY3Rpb259IEBzZWV7Yy1jbG9zdXJlfS4KKworRnVuY3Rpb25zIHRoYXQgZG8gbm90IG5lZWQgYSBzcGVjaWZpYyBtdXRhYmxlIHBvc2l0aW9uLAorYnV0IG9ubHkgYSB2YWx1ZSAoZS5nLiwgcXVlcnkgZnVuY3Rpb25zKSwKK2NhbiBiZSBjYWxsZWQgd2l0aCBhY2NlcHRhYmxlIGluZGljZXMuCitBbiBAZGVme2FjY2VwdGFibGUgaW5kZXh9IGNhbiBiZSBhbnkgdmFsaWQgaW5kZXgsCitidXQgaXQgYWxzbyBjYW4gYmUgYW55IHBvc2l0aXZlIGluZGV4IGFmdGVyIHRoZSBzdGFjayB0b3AKK3dpdGhpbiB0aGUgc3BhY2UgYWxsb2NhdGVkIGZvciB0aGUgc3RhY2ssCit0aGF0IGlzLCBpbmRpY2VzIHVwIHRvIHRoZSBzdGFjayBzaXplLgorKE5vdGUgdGhhdCAwIGlzIG5ldmVyIGFuIGFjY2VwdGFibGUgaW5kZXguKQorSW5kaWNlcyB0byB1cHZhbHVlcyBAc2Vle2MtY2xvc3VyZX0gbGFyZ2VyIHRoYW4gdGhlIHJlYWwgbnVtYmVyCitvZiB1cHZhbHVlcyBpbiB0aGUgY3VycmVudCBATntDIGZ1bmN0aW9ufSBhcmUgYWxzbyBhY2NlcHRhYmxlIChidXQgaW52YWxpZCkuCitFeGNlcHQgd2hlbiBub3RlZCBvdGhlcndpc2UsCitmdW5jdGlvbnMgaW4gdGhlIEFQSSB3b3JrIHdpdGggYWNjZXB0YWJsZSBpbmRpY2VzLgorCitBY2NlcHRhYmxlIGluZGljZXMgc2VydmUgdG8gYXZvaWQgZXh0cmEgdGVzdHMKK2FnYWluc3QgdGhlIHN0YWNrIHRvcCB3aGVuIHF1ZXJ5aW5nIHRoZSBzdGFjay4KK0ZvciBpbnN0YW5jZSwgYSBATntDIGZ1bmN0aW9ufSBjYW4gcXVlcnkgaXRzIHRoaXJkIGFyZ3VtZW50Cit3aXRob3V0IHRoZSBuZWVkIHRvIGZpcnN0IGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYSB0aGlyZCBhcmd1bWVudCwKK3RoYXQgaXMsIHdpdGhvdXQgdGhlIG5lZWQgdG8gY2hlY2sgd2hldGhlciAzIGlzIGEgdmFsaWQgaW5kZXguCisKK0ZvciBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggYWNjZXB0YWJsZSBpbmRpY2VzLAorYW55IG5vbi12YWxpZCBpbmRleCBpcyB0cmVhdGVkIGFzIGlmIGl0Citjb250YWlucyBhIHZhbHVlIG9mIGEgdmlydHVhbCB0eXBlIEBkZWZpZHtMVUFfVE5PTkV9LAord2hpY2ggYmVoYXZlcyBsaWtlIGEgbmlsIHZhbHVlLgorCit9CisKK0BzZWN0MntjLWNsb3N1cmV8IEB0aXRsZXtDIENsb3N1cmVzfQorCitXaGVuIGEgQE57QyBmdW5jdGlvbn0gaXMgY3JlYXRlZCwKK2l0IGlzIHBvc3NpYmxlIHRvIGFzc29jaWF0ZSBzb21lIHZhbHVlcyB3aXRoIGl0LAordGh1cyBjcmVhdGluZyBhIEBkZWZ7QE57QyBjbG9zdXJlfX0KK0BzZWVDe2x1YV9wdXNoY2Nsb3N1cmV9OwordGhlc2UgdmFsdWVzIGFyZSBjYWxsZWQgQGRlZnt1cHZhbHVlc30gYW5kIGFyZQorYWNjZXNzaWJsZSB0byB0aGUgZnVuY3Rpb24gd2hlbmV2ZXIgaXQgaXMgY2FsbGVkLgorCitXaGVuZXZlciBhIEBOe0MgZnVuY3Rpb259IGlzIGNhbGxlZCwKK2l0cyB1cHZhbHVlcyBhcmUgbG9jYXRlZCBhdCBzcGVjaWZpYyBwc2V1ZG8taW5kaWNlcy4KK1RoZXNlIHBzZXVkby1pbmRpY2VzIGFyZSBwcm9kdWNlZCBieSB0aGUgbWFjcm8KK0BMaWR7bHVhX3VwdmFsdWVpbmRleH0uCitUaGUgZmlyc3QgdXB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBmdW5jdGlvbiBpcyBhdCBpbmRleAorQFR7bHVhX3VwdmFsdWVpbmRleCgxKX0sIGFuZCBzbyBvbi4KK0FueSBhY2Nlc3MgdG8gQFR7bHVhX3VwdmFsdWVpbmRleChAcmVwe259KX0sCit3aGVyZSBAcmVwe259IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHVwdmFsdWVzIG9mIHRoZQorY3VycmVudCBmdW5jdGlvbgorKGJ1dCBub3QgZ3JlYXRlciB0aGFuIDI1NiwKK3doaWNoIGlzIG9uZSBwbHVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB1cHZhbHVlcyBpbiBhIGNsb3N1cmUpLAorcHJvZHVjZXMgYW4gYWNjZXB0YWJsZSBidXQgaW52YWxpZCBpbmRleC4KKworQSBATntDIGNsb3N1cmV9IGNhbiBhbHNvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGl0cyBjb3JyZXNwb25kaW5nIHVwdmFsdWVzLgorCit9CisKK0BzZWN0MntyZWdpc3RyeXwgQHRpdGxle1JlZ2lzdHJ5fQorCitMdWEgcHJvdmlkZXMgYSBAZGVme3JlZ2lzdHJ5fSwKK2EgcHJlZGVmaW5lZCB0YWJsZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IGFueSBATntDIGNvZGV9IHRvCitzdG9yZSB3aGF0ZXZlciBMdWEgdmFsdWVzIGl0IG5lZWRzIHRvIHN0b3JlLgorVGhlIHJlZ2lzdHJ5IHRhYmxlIGlzIGFsd2F5cyBsb2NhdGVkIGF0IHBzZXVkby1pbmRleAorQGRlZmlke0xVQV9SRUdJU1RSWUlOREVYfS4KK0FueSBATntDIGxpYnJhcnl9IGNhbiBzdG9yZSBkYXRhIGludG8gdGhpcyB0YWJsZSwKK2J1dCBpdCBtdXN0IHRha2UgY2FyZSB0byBjaG9vc2Uga2V5cwordGhhdCBhcmUgZGlmZmVyZW50IGZyb20gdGhvc2UgdXNlZAorYnkgb3RoZXIgbGlicmFyaWVzLCB0byBhdm9pZCBjb2xsaXNpb25zLgorVHlwaWNhbGx5LCB5b3Ugc2hvdWxkIHVzZSBhcyBrZXkgYSBzdHJpbmcgY29udGFpbmluZyB5b3VyIGxpYnJhcnkgbmFtZSwKK29yIGEgbGlnaHQgdXNlcmRhdGEgd2l0aCB0aGUgYWRkcmVzcyBvZiBhIEBOe0Mgb2JqZWN0fSBpbiB5b3VyIGNvZGUsCitvciBhbnkgTHVhIG9iamVjdCBjcmVhdGVkIGJ5IHlvdXIgY29kZS4KK0FzIHdpdGggdmFyaWFibGUgbmFtZXMsCitzdHJpbmcga2V5cyBzdGFydGluZyB3aXRoIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkKK3VwcGVyY2FzZSBsZXR0ZXJzIGFyZSByZXNlcnZlZCBmb3IgTHVhLgorCitUaGUgaW50ZWdlciBrZXlzIGluIHRoZSByZWdpc3RyeSBhcmUgdXNlZAorYnkgdGhlIHJlZmVyZW5jZSBtZWNoYW5pc20gQHNlZUN7bHVhTF9yZWZ9CithbmQgYnkgc29tZSBwcmVkZWZpbmVkIHZhbHVlcy4KK1RoZXJlZm9yZSwgaW50ZWdlciBrZXlzIG11c3Qgbm90IGJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzLgorCitXaGVuIHlvdSBjcmVhdGUgYSBuZXcgTHVhIHN0YXRlLAoraXRzIHJlZ2lzdHJ5IGNvbWVzIHdpdGggc29tZSBwcmVkZWZpbmVkIHZhbHVlcy4KK1RoZXNlIHByZWRlZmluZWQgdmFsdWVzIGFyZSBpbmRleGVkIHdpdGggaW50ZWdlciBrZXlzCitkZWZpbmVkIGFzIGNvbnN0YW50cyBpbiBAaWR7bHVhLmh9LgorVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIGRlZmluZWQ6CitAZGVzY3JpcHRpb257CitAaXRlbXtAZGVmaWR7TFVBX1JJRFhfTUFJTlRIUkVBRH18IEF0IHRoaXMgaW5kZXggdGhlIHJlZ2lzdHJ5IGhhcwordGhlIG1haW4gdGhyZWFkIG9mIHRoZSBzdGF0ZS4KKyhUaGUgbWFpbiB0aHJlYWQgaXMgdGhlIG9uZSBjcmVhdGVkIHRvZ2V0aGVyIHdpdGggdGhlIHN0YXRlLikKK30KKworQGl0ZW17QGRlZmlke0xVQV9SSURYX0dMT0JBTFN9fCBBdCB0aGlzIGluZGV4IHRoZSByZWdpc3RyeSBoYXMKK3RoZSBAeHtnbG9iYWwgZW52aXJvbm1lbnR9LgorfQorfQorCit9CisKK0BzZWN0MntDLWVycm9yfEB0aXRsZXtFcnJvciBIYW5kbGluZyBpbiBDfQorCitJbnRlcm5hbGx5LCBMdWEgdXNlcyB0aGUgQyBAaWR7bG9uZ2ptcH0gZmFjaWxpdHkgdG8gaGFuZGxlIGVycm9ycy4KKyhMdWEgd2lsbCB1c2UgZXhjZXB0aW9ucyBpZiB5b3UgY29tcGlsZSBpdCBhcyBDKys7CitzZWFyY2ggZm9yIEBpZHtMVUFJX1RIUk9XfSBpbiB0aGUgc291cmNlIGNvZGUgZm9yIGRldGFpbHMuKQorV2hlbiBMdWEgZmFjZXMgYW55IGVycm9yCisoc3VjaCBhcyBhIEB4e21lbW9yeSBhbGxvY2F0aW9uIGVycm9yfSBvciBhIHR5cGUgZXJyb3IpCitpdCBAZW1waHtyYWlzZXN9IGFuIGVycm9yOwordGhhdCBpcywgaXQgZG9lcyBhIGxvbmcganVtcC4KK0EgQGVtcGh4e3Byb3RlY3RlZCBlbnZpcm9ubWVudH0gdXNlcyBAaWR7c2V0am1wfQordG8gc2V0IGEgcmVjb3ZlcnkgcG9pbnQ7CithbnkgZXJyb3IganVtcHMgdG8gdGhlIG1vc3QgcmVjZW50IGFjdGl2ZSByZWNvdmVyeSBwb2ludC4KKworSW5zaWRlIGEgQE57QyBmdW5jdGlvbn0geW91IGNhbiByYWlzZSBhbiBlcnJvciBieSBjYWxsaW5nIEBMaWR7bHVhX2Vycm9yfS4KKworTW9zdCBmdW5jdGlvbnMgaW4gdGhlIEFQSSBjYW4gcmFpc2UgYW4gZXJyb3IsCitmb3IgaW5zdGFuY2UgZHVlIHRvIGEgQHh7bWVtb3J5IGFsbG9jYXRpb24gZXJyb3J9LgorVGhlIGRvY3VtZW50YXRpb24gZm9yIGVhY2ggZnVuY3Rpb24gaW5kaWNhdGVzIHdoZXRoZXIKK2l0IGNhbiByYWlzZSBlcnJvcnMuCisKK0lmIGFuIGVycm9yIGhhcHBlbnMgb3V0c2lkZSBhbnkgcHJvdGVjdGVkIGVudmlyb25tZW50LAorTHVhIGNhbGxzIGEgQGRlZntwYW5pYyBmdW5jdGlvbn0gKHNlZSBATGlke2x1YV9hdHBhbmljfSkKK2FuZCB0aGVuIGNhbGxzIEBUe2Fib3J0fSwKK3RodXMgZXhpdGluZyB0aGUgaG9zdCBhcHBsaWNhdGlvbi4KK1lvdXIgcGFuaWMgZnVuY3Rpb24gY2FuIGF2b2lkIHRoaXMgZXhpdCBieQorbmV2ZXIgcmV0dXJuaW5nCisoZS5nLiwgZG9pbmcgYSBsb25nIGp1bXAgdG8geW91ciBvd24gcmVjb3ZlcnkgcG9pbnQgb3V0c2lkZSBMdWEpLgorCitUaGUgcGFuaWMgZnVuY3Rpb24sCithcyBpdHMgbmFtZSBpbXBsaWVzLAoraXMgYSBtZWNoYW5pc20gb2YgbGFzdCByZXNvcnQuCitQcm9ncmFtcyBzaG91bGQgYXZvaWQgaXQuCitBcyBhIGdlbmVyYWwgcnVsZSwKK3doZW4gYSBATntDIGZ1bmN0aW9ufSBpcyBjYWxsZWQgYnkgTHVhIHdpdGggYSBMdWEgc3RhdGUsCitpdCBjYW4gZG8gd2hhdGV2ZXIgaXQgd2FudHMgb24gdGhhdCBMdWEgc3RhdGUsCithcyBpdCBzaG91bGQgYmUgYWxyZWFkeSBwcm90ZWN0ZWQuCitIb3dldmVyLAord2hlbiBDIGNvZGUgb3BlcmF0ZXMgb24gb3RoZXIgTHVhIHN0YXRlcworKGUuZy4sIGEgTHVhIHBhcmFtZXRlciB0byB0aGUgZnVuY3Rpb24sCithIEx1YSBzdGF0ZSBzdG9yZWQgaW4gdGhlIHJlZ2lzdHJ5LCBvcgordGhlIHJlc3VsdCBvZiBATGlke2x1YV9uZXd0aHJlYWR9KSwKK2l0IHNob3VsZCB1c2UgdGhlbSBvbmx5IGluIEFQSSBjYWxscyB0aGF0IGNhbm5vdCByYWlzZSBlcnJvcnMuCisKK1RoZSBwYW5pYyBmdW5jdGlvbiBydW5zIGFzIGlmIGl0IHdlcmUgYSBAeHttZXNzYWdlIGhhbmRsZXJ9IEBzZWV7ZXJyb3J9OworaW4gcGFydGljdWxhciwgdGhlIGVycm9yIG9iamVjdCBpcyBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KK0hvd2V2ZXIsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSBhYm91dCBzdGFjayBzcGFjZS4KK1RvIHB1c2ggYW55dGhpbmcgb24gdGhlIHN0YWNrLAordGhlIHBhbmljIGZ1bmN0aW9uIG11c3QgZmlyc3QgY2hlY2sgdGhlIGF2YWlsYWJsZSBzcGFjZSBAc2Vle3N0YWNrc2l6ZX0uCisKK30KKworQHNlY3Qye2NvbnRpbnVhdGlvbnN8QHRpdGxle0hhbmRsaW5nIFlpZWxkcyBpbiBDfQorCitJbnRlcm5hbGx5LCBMdWEgdXNlcyB0aGUgQyBAaWR7bG9uZ2ptcH0gZmFjaWxpdHkgdG8geWllbGQgYSBjb3JvdXRpbmUuCitUaGVyZWZvcmUsIGlmIGEgQE57QyBmdW5jdGlvbn0gQGlke2Zvb30gY2FsbHMgYW4gQVBJIGZ1bmN0aW9uCithbmQgdGhpcyBBUEkgZnVuY3Rpb24geWllbGRzCisoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBieSBjYWxsaW5nIGFub3RoZXIgZnVuY3Rpb24gdGhhdCB5aWVsZHMpLAorTHVhIGNhbm5vdCByZXR1cm4gdG8gQGlke2Zvb30gYW55IG1vcmUsCitiZWNhdXNlIHRoZSBAaWR7bG9uZ2ptcH0gcmVtb3ZlcyBpdHMgZnJhbWUgZnJvbSB0aGUgQyBzdGFjay4KKworVG8gYXZvaWQgdGhpcyBraW5kIG9mIHByb2JsZW0sCitMdWEgcmFpc2VzIGFuIGVycm9yIHdoZW5ldmVyIGl0IHRyaWVzIHRvIHlpZWxkIGFjcm9zcyBhbiBBUEkgY2FsbCwKK2V4Y2VwdCBmb3IgdGhyZWUgZnVuY3Rpb25zOgorQExpZHtsdWFfeWllbGRrfSwgQExpZHtsdWFfY2FsbGt9LCBhbmQgQExpZHtsdWFfcGNhbGxrfS4KK0FsbCB0aG9zZSBmdW5jdGlvbnMgcmVjZWl2ZSBhIEBkZWZ7Y29udGludWF0aW9uIGZ1bmN0aW9ufQorKGFzIGEgcGFyYW1ldGVyIG5hbWVkIEBpZHtrfSkgdG8gY29udGludWUgZXhlY3V0aW9uIGFmdGVyIGEgeWllbGQuCisKK1dlIG5lZWQgdG8gc2V0IHNvbWUgdGVybWlub2xvZ3kgdG8gZXhwbGFpbiBjb250aW51YXRpb25zLgorV2UgaGF2ZSBhIEBOe0MgZnVuY3Rpb259IGNhbGxlZCBmcm9tIEx1YSB3aGljaCB3ZSB3aWxsIGNhbGwKK3RoZSBAZW1waHtvcmlnaW5hbCBmdW5jdGlvbn0uCitUaGlzIG9yaWdpbmFsIGZ1bmN0aW9uIHRoZW4gY2FsbHMgb25lIG9mIHRob3NlIHRocmVlIGZ1bmN0aW9ucyBpbiB0aGUgQyBBUEksCit3aGljaCB3ZSB3aWxsIGNhbGwgdGhlIEBlbXBoe2NhbGxlZSBmdW5jdGlvbn0sCit0aGF0IHRoZW4geWllbGRzIHRoZSBjdXJyZW50IHRocmVhZC4KKyhUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgY2FsbGVlIGZ1bmN0aW9uIGlzIEBMaWR7bHVhX3lpZWxka30sCitvciB3aGVuIHRoZSBjYWxsZWUgZnVuY3Rpb24gaXMgZWl0aGVyIEBMaWR7bHVhX2NhbGxrfSBvciBATGlke2x1YV9wY2FsbGt9CithbmQgdGhlIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGVtIHlpZWxkcy4pCisKK1N1cHBvc2UgdGhlIHJ1bm5pbmcgdGhyZWFkIHlpZWxkcyB3aGlsZSBleGVjdXRpbmcgdGhlIGNhbGxlZSBmdW5jdGlvbi4KK0FmdGVyIHRoZSB0aHJlYWQgcmVzdW1lcywKK2l0IGV2ZW50dWFsbHkgd2lsbCBmaW5pc2ggcnVubmluZyB0aGUgY2FsbGVlIGZ1bmN0aW9uLgorSG93ZXZlciwKK3RoZSBjYWxsZWUgZnVuY3Rpb24gY2Fubm90IHJldHVybiB0byB0aGUgb3JpZ2luYWwgZnVuY3Rpb24sCitiZWNhdXNlIGl0cyBmcmFtZSBpbiB0aGUgQyBzdGFjayB3YXMgZGVzdHJveWVkIGJ5IHRoZSB5aWVsZC4KK0luc3RlYWQsIEx1YSBjYWxscyBhIEBkZWZ7Y29udGludWF0aW9uIGZ1bmN0aW9ufSwKK3doaWNoIHdhcyBnaXZlbiBhcyBhbiBhcmd1bWVudCB0byB0aGUgY2FsbGVlIGZ1bmN0aW9uLgorQXMgdGhlIG5hbWUgaW1wbGllcywKK3RoZSBjb250aW51YXRpb24gZnVuY3Rpb24gc2hvdWxkIGNvbnRpbnVlIHRoZSB0YXNrCitvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uCisKK0FzIGFuIGlsbHVzdHJhdGlvbiwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKK0B2ZXJiYXRpbXsKK2ludCBvcmlnaW5hbF9mdW5jdGlvbiAobHVhX1N0YXRlICpMKSB7CisgIC4uLiAgICAgLyogY29kZSAxICovCisgIHN0YXR1cyA9IGx1YV9wY2FsbChMLCBuLCBtLCBoKTsgIC8qIGNhbGxzIEx1YSAqLworICAuLi4gICAgIC8qIGNvZGUgMiAqLworfQorfQorTm93IHdlIHdhbnQgdG8gYWxsb3cKK3RoZSBMdWEgY29kZSBiZWluZyBydW4gYnkgQExpZHtsdWFfcGNhbGx9IHRvIHlpZWxkLgorRmlyc3QsIHdlIGNhbiByZXdyaXRlIG91ciBmdW5jdGlvbiBsaWtlIGhlcmU6CitAdmVyYmF0aW17CitpbnQgayAobHVhX1N0YXRlICpMLCBpbnQgc3RhdHVzLCBsdWFfS0NvbnRleHQgY3R4KSB7CisgIC4uLiAgLyogY29kZSAyICovCit9CisKK2ludCBvcmlnaW5hbF9mdW5jdGlvbiAobHVhX1N0YXRlICpMKSB7CisgIC4uLiAgICAgLyogY29kZSAxICovCisgIHJldHVybiBrKEwsIGx1YV9wY2FsbChMLCBuLCBtLCBoKSwgY3R4KTsKK30KK30KK0luIHRoZSBhYm92ZSBjb2RlLAordGhlIG5ldyBmdW5jdGlvbiBAaWR7a30gaXMgYQorQGVtcGh7Y29udGludWF0aW9uIGZ1bmN0aW9ufSAod2l0aCB0eXBlIEBMaWR7bHVhX0tGdW5jdGlvbn0pLAord2hpY2ggc2hvdWxkIGRvIGFsbCB0aGUgd29yayB0aGF0IHRoZSBvcmlnaW5hbCBmdW5jdGlvbgord2FzIGRvaW5nIGFmdGVyIGNhbGxpbmcgQExpZHtsdWFfcGNhbGx9LgorTm93LCB3ZSBtdXN0IGluZm9ybSBMdWEgdGhhdCBpdCBtdXN0IGNhbGwgQGlke2t9IGlmIHRoZSBMdWEgY29kZQorYmVpbmcgZXhlY3V0ZWQgYnkgQExpZHtsdWFfcGNhbGx9IGdldHMgaW50ZXJydXB0ZWQgaW4gc29tZSB3YXkKKyhlcnJvcnMgb3IgeWllbGRpbmcpLAorc28gd2UgcmV3cml0ZSB0aGUgY29kZSBhcyBoZXJlLAorcmVwbGFjaW5nIEBMaWR7bHVhX3BjYWxsfSBieSBATGlke2x1YV9wY2FsbGt9OgorQHZlcmJhdGlteworaW50IG9yaWdpbmFsX2Z1bmN0aW9uIChsdWFfU3RhdGUgKkwpIHsKKyAgLi4uICAgICAvKiBjb2RlIDEgKi8KKyAgcmV0dXJuIGsoTCwgbHVhX3BjYWxsayhMLCBuLCBtLCBoLCBjdHgyLCBrKSwgY3R4MSk7Cit9Cit9CitOb3RlIHRoZSBleHRlcm5hbCwgZXhwbGljaXQgY2FsbCB0byB0aGUgY29udGludWF0aW9uOgorTHVhIHdpbGwgY2FsbCB0aGUgY29udGludWF0aW9uIG9ubHkgaWYgbmVlZGVkLCB0aGF0IGlzLAoraW4gY2FzZSBvZiBlcnJvcnMgb3IgcmVzdW1pbmcgYWZ0ZXIgYSB5aWVsZC4KK0lmIHRoZSBjYWxsZWQgZnVuY3Rpb24gcmV0dXJucyBub3JtYWxseSB3aXRob3V0IGV2ZXIgeWllbGRpbmcsCitATGlke2x1YV9wY2FsbGt9IChhbmQgQExpZHtsdWFfY2FsbGt9KSB3aWxsIGFsc28gcmV0dXJuIG5vcm1hbGx5LgorKE9mIGNvdXJzZSwgaW5zdGVhZCBvZiBjYWxsaW5nIHRoZSBjb250aW51YXRpb24gaW4gdGhhdCBjYXNlLAoreW91IGNhbiBkbyB0aGUgZXF1aXZhbGVudCB3b3JrIGRpcmVjdGx5IGluc2lkZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uKQorCitCZXNpZGVzIHRoZSBMdWEgc3RhdGUsCit0aGUgY29udGludWF0aW9uIGZ1bmN0aW9uIGhhcyB0d28gb3RoZXIgcGFyYW1ldGVyczoKK3RoZSBmaW5hbCBzdGF0dXMgb2YgdGhlIGNhbGwgcGx1cyB0aGUgY29udGV4dCB2YWx1ZSAoQGlke2N0eH0pIHRoYXQKK3dhcyBwYXNzZWQgb3JpZ2luYWxseSB0byBATGlke2x1YV9wY2FsbGt9LgorKEx1YSBkb2VzIG5vdCB1c2UgdGhpcyBjb250ZXh0IHZhbHVlOworaXQgb25seSBwYXNzZXMgdGhpcyB2YWx1ZSBmcm9tIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB0byB0aGUKK2NvbnRpbnVhdGlvbiBmdW5jdGlvbi4pCitGb3IgQExpZHtsdWFfcGNhbGxrfSwKK3RoZSBzdGF0dXMgaXMgdGhlIHNhbWUgdmFsdWUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieSBATGlke2x1YV9wY2FsbGt9LAorZXhjZXB0IHRoYXQgaXQgaXMgQExpZHtMVUFfWUlFTER9IHdoZW4gYmVpbmcgZXhlY3V0ZWQgYWZ0ZXIgYSB5aWVsZAorKGluc3RlYWQgb2YgQExpZHtMVUFfT0t9KS4KK0ZvciBATGlke2x1YV95aWVsZGt9IGFuZCBATGlke2x1YV9jYWxsa30sCit0aGUgc3RhdHVzIGlzIGFsd2F5cyBATGlke0xVQV9ZSUVMRH0gd2hlbiBMdWEgY2FsbHMgdGhlIGNvbnRpbnVhdGlvbi4KKyhGb3IgdGhlc2UgdHdvIGZ1bmN0aW9ucywKK0x1YSB3aWxsIG5vdCBjYWxsIHRoZSBjb250aW51YXRpb24gaW4gY2FzZSBvZiBlcnJvcnMsCitiZWNhdXNlIHRoZXkgZG8gbm90IGhhbmRsZSBlcnJvcnMuKQorU2ltaWxhcmx5LCB3aGVuIHVzaW5nIEBMaWR7bHVhX2NhbGxrfSwKK3lvdSBzaG91bGQgY2FsbCB0aGUgY29udGludWF0aW9uIGZ1bmN0aW9uCit3aXRoIEBMaWR7TFVBX09LfSBhcyB0aGUgc3RhdHVzLgorKEZvciBATGlke2x1YV95aWVsZGt9LCB0aGVyZSBpcyBub3QgbXVjaCBwb2ludCBpbiBjYWxsaW5nCitkaXJlY3RseSB0aGUgY29udGludWF0aW9uIGZ1bmN0aW9uLAorYmVjYXVzZSBATGlke2x1YV95aWVsZGt9IHVzdWFsbHkgZG9lcyBub3QgcmV0dXJuLikKKworTHVhIHRyZWF0cyB0aGUgY29udGludWF0aW9uIGZ1bmN0aW9uIGFzIGlmIGl0IHdlcmUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLgorVGhlIGNvbnRpbnVhdGlvbiBmdW5jdGlvbiByZWNlaXZlcyB0aGUgc2FtZSBMdWEgc3RhY2sKK2Zyb20gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLAoraW4gdGhlIHNhbWUgc3RhdGUgaXQgd291bGQgYmUgaWYgdGhlIGNhbGxlZSBmdW5jdGlvbiBoYWQgcmV0dXJuZWQuCisoRm9yIGluc3RhbmNlLAorYWZ0ZXIgYSBATGlke2x1YV9jYWxsa30gdGhlIGZ1bmN0aW9uIGFuZCBpdHMgYXJndW1lbnRzIGFyZQorcmVtb3ZlZCBmcm9tIHRoZSBzdGFjayBhbmQgcmVwbGFjZWQgYnkgdGhlIHJlc3VsdHMgZnJvbSB0aGUgY2FsbC4pCitJdCBhbHNvIGhhcyB0aGUgc2FtZSB1cHZhbHVlcy4KK1doYXRldmVyIGl0IHJldHVybnMgaXMgaGFuZGxlZCBieSBMdWEgYXMgaWYgaXQgd2VyZSB0aGUgcmV0dXJuCitvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uCisKK30KKworQHNlY3Qye0B0aXRsZXtGdW5jdGlvbnMgYW5kIFR5cGVzfQorCitIZXJlIHdlIGxpc3QgYWxsIGZ1bmN0aW9ucyBhbmQgdHlwZXMgZnJvbSB0aGUgQE57QyBBUEl9IGluCithbHBoYWJldGljYWwgb3JkZXIuCitFYWNoIGZ1bmN0aW9uIGhhcyBhbiBpbmRpY2F0b3IgbGlrZSB0aGlzOgorQGFwaWl7byxwLHh9CisKK1RoZSBmaXJzdCBmaWVsZCwgQFR7b30sCitpcyBob3cgbWFueSBlbGVtZW50cyB0aGUgZnVuY3Rpb24gcG9wcyBmcm9tIHRoZSBzdGFjay4KK1RoZSBzZWNvbmQgZmllbGQsIEBUe3B9LAoraXMgaG93IG1hbnkgZWxlbWVudHMgdGhlIGZ1bmN0aW9uIHB1c2hlcyBvbnRvIHRoZSBzdGFjay4KKyhBbnkgZnVuY3Rpb24gYWx3YXlzIHB1c2hlcyBpdHMgcmVzdWx0cyBhZnRlciBwb3BwaW5nIGl0cyBhcmd1bWVudHMuKQorQSBmaWVsZCBpbiB0aGUgZm9ybSBAVHt4fHl9IG1lYW5zIHRoZSBmdW5jdGlvbiBjYW4gcHVzaCAob3IgcG9wKQorQFR7eH0gb3IgQFR7eX0gZWxlbWVudHMsCitkZXBlbmRpbmcgb24gdGhlIHNpdHVhdGlvbjsKK2FuIGludGVycm9nYXRpb24gbWFyayBAQ2hhcns/fSBtZWFucyB0aGF0Cit3ZSBjYW5ub3Qga25vdyBob3cgbWFueSBlbGVtZW50cyB0aGUgZnVuY3Rpb24gcG9wcy9wdXNoZXMKK2J5IGxvb2tpbmcgb25seSBhdCBpdHMgYXJndW1lbnRzCisoZS5nLiwgdGhleSBtYXkgZGVwZW5kIG9uIHdoYXQgaXMgb24gdGhlIHN0YWNrKS4KK1RoZSB0aGlyZCBmaWVsZCwgQFR7eH0sCit0ZWxscyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBtYXkgcmFpc2UgZXJyb3JzOgorQENoYXJ7LX0gbWVhbnMgdGhlIGZ1bmN0aW9uIG5ldmVyIHJhaXNlcyBhbnkgZXJyb3I7CitAQ2hhcnttfSBtZWFucyB0aGUgZnVuY3Rpb24gbWF5IHJhaXNlIG91dC1vZi1tZW1vcnkgZXJyb3JzCithbmQgZXJyb3JzIHJ1bm5pbmcgYSBmaW5hbGl6ZXI7CitAQ2hhcnt2fSBtZWFucyB0aGUgZnVuY3Rpb24gbWF5IHJhaXNlIHRoZSBlcnJvcnMgZXhwbGFpbmVkIGluIHRoZSB0ZXh0OworQENoYXJ7ZX0gbWVhbnMgdGhlIGZ1bmN0aW9uIG1heSByYWlzZSBhbnkgZXJyb3JzCisoYmVjYXVzZSBpdCBjYW4gcnVuIGFyYml0cmFyeSBMdWEgY29kZSwKK2VpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIG1ldGFtZXRob2RzKS4KKworCitAQVBJRW50cnl7aW50IGx1YV9hYnNpbmRleCAobHVhX1N0YXRlICpMLCBpbnQgaWR4KTt8CitAYXBpaXswLDAsLX0KKworQ29udmVydHMgdGhlIEB4e2FjY2VwdGFibGUgaW5kZXh9IEBpZHtpZHh9CitpbnRvIGFuIGVxdWl2YWxlbnQgQHh7YWJzb2x1dGUgaW5kZXh9CisodGhhdCBpcywgb25lIHRoYXQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBzdGFjayB0b3ApLgorCit9CisKKworQEFQSUVudHJ5ewordHlwZWRlZiB2b2lkICogKCpsdWFfQWxsb2MpICh2b2lkICp1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuc2l6ZSk7fAorCitUaGUgdHlwZSBvZiB0aGUgQHh7bWVtb3J5LWFsbG9jYXRpb24gZnVuY3Rpb259IHVzZWQgYnkgTHVhIHN0YXRlcy4KK1RoZSBhbGxvY2F0b3IgZnVuY3Rpb24gbXVzdCBwcm92aWRlIGEKK2Z1bmN0aW9uYWxpdHkgc2ltaWxhciB0byBAaWR7cmVhbGxvY30sCitidXQgbm90IGV4YWN0bHkgdGhlIHNhbWUuCitJdHMgYXJndW1lbnRzIGFyZQorQGlke3VkfSwgYW4gb3BhcXVlIHBvaW50ZXIgcGFzc2VkIHRvIEBMaWR7bHVhX25ld3N0YXRlfTsKK0BpZHtwdHJ9LCBhIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGJlaW5nIGFsbG9jYXRlZC9yZWFsbG9jYXRlZC9mcmVlZDsKK0BpZHtvc2l6ZX0sIHRoZSBvcmlnaW5hbCBzaXplIG9mIHRoZSBibG9jayBvciBzb21lIGNvZGUgYWJvdXQgd2hhdAoraXMgYmVpbmcgYWxsb2NhdGVkOworYW5kIEBpZHtuc2l6ZX0sIHRoZSBuZXcgc2l6ZSBvZiB0aGUgYmxvY2suCisKK1doZW4gQGlke3B0cn0gaXMgbm90IEBpZHtOVUxMfSwKK0BpZHtvc2l6ZX0gaXMgdGhlIHNpemUgb2YgdGhlIGJsb2NrIHBvaW50ZWQgYnkgQGlke3B0cn0sCit0aGF0IGlzLCB0aGUgc2l6ZSBnaXZlbiB3aGVuIGl0IHdhcyBhbGxvY2F0ZWQgb3IgcmVhbGxvY2F0ZWQuCisKK1doZW4gQGlke3B0cn0gaXMgQGlke05VTEx9LAorQGlke29zaXplfSBlbmNvZGVzIHRoZSBraW5kIG9mIG9iamVjdCB0aGF0IEx1YSBpcyBhbGxvY2F0aW5nLgorQGlke29zaXplfSBpcyBhbnkgb2YKK0BMaWR7TFVBX1RTVFJJTkd9LCBATGlke0xVQV9UVEFCTEV9LCBATGlke0xVQV9URlVOQ1RJT059LAorQExpZHtMVUFfVFVTRVJEQVRBfSwgb3IgQExpZHtMVUFfVFRIUkVBRH0gd2hlbiAoYW5kIG9ubHkgd2hlbikKK0x1YSBpcyBjcmVhdGluZyBhIG5ldyBvYmplY3Qgb2YgdGhhdCB0eXBlLgorV2hlbiBAaWR7b3NpemV9IGlzIHNvbWUgb3RoZXIgdmFsdWUsCitMdWEgaXMgYWxsb2NhdGluZyBtZW1vcnkgZm9yIHNvbWV0aGluZyBlbHNlLgorCitMdWEgYXNzdW1lcyB0aGUgZm9sbG93aW5nIGJlaGF2aW9yIGZyb20gdGhlIGFsbG9jYXRvciBmdW5jdGlvbjoKKworV2hlbiBAaWR7bnNpemV9IGlzIHplcm8sCit0aGUgYWxsb2NhdG9yIG11c3QgYmVoYXZlIGxpa2UgQGlke2ZyZWV9CithbmQgcmV0dXJuIEBpZHtOVUxMfS4KKworV2hlbiBAaWR7bnNpemV9IGlzIG5vdCB6ZXJvLAordGhlIGFsbG9jYXRvciBtdXN0IGJlaGF2ZSBsaWtlIEBpZHtyZWFsbG9jfS4KK1RoZSBhbGxvY2F0b3IgcmV0dXJucyBAaWR7TlVMTH0KK2lmIGFuZCBvbmx5IGlmIGl0IGNhbm5vdCBmdWxmaWxsIHRoZSByZXF1ZXN0LgorCitIZXJlIGlzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgQHh7YWxsb2NhdG9yIGZ1bmN0aW9ufS4KK0l0IGlzIHVzZWQgaW4gdGhlIGF1eGlsaWFyeSBsaWJyYXJ5IGJ5IEBMaWR7bHVhTF9uZXdzdGF0ZX0uCitAdmVyYmF0aW17CitzdGF0aWMgdm9pZCAqbF9hbGxvYyAodm9pZCAqdWQsIHZvaWQgKnB0ciwgc2l6ZV90IG9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuc2l6ZSkgeworICAodm9pZCl1ZDsgICh2b2lkKW9zaXplOyAgLyogbm90IHVzZWQgKi8KKyAgaWYgKG5zaXplID09IDApIHsKKyAgICBmcmVlKHB0cik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiByZWFsbG9jKHB0ciwgbnNpemUpOworfQorfQorTm90ZSB0aGF0IEBOe1N0YW5kYXJkIEN9IGVuc3VyZXMKK3RoYXQgQFR7ZnJlZShOVUxMKX0gaGFzIG5vIGVmZmVjdCBhbmQgdGhhdAorQFR7cmVhbGxvYyhOVUxMLHNpemUpfSBpcyBlcXVpdmFsZW50IHRvIEBUe21hbGxvYyhzaXplKX0uCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhX2FyaXRoIChsdWFfU3RhdGUgKkwsIGludCBvcCk7fAorQGFwaWl7MnwxLDEsZX0KKworUGVyZm9ybXMgYW4gYXJpdGhtZXRpYyBvciBiaXR3aXNlIG9wZXJhdGlvbiBvdmVyIHRoZSB0d28gdmFsdWVzCisob3Igb25lLCBpbiB0aGUgY2FzZSBvZiBuZWdhdGlvbnMpCithdCB0aGUgdG9wIG9mIHRoZSBzdGFjaywKK3dpdGggdGhlIHZhbHVlIGF0IHRoZSB0b3AgYmVpbmcgdGhlIHNlY29uZCBvcGVyYW5kLAorcG9wcyB0aGVzZSB2YWx1ZXMsIGFuZCBwdXNoZXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorVGhlIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNlbWFudGljcyBvZiB0aGUgY29ycmVzcG9uZGluZyBMdWEgb3BlcmF0b3IKKyh0aGF0IGlzLCBpdCBtYXkgY2FsbCBtZXRhbWV0aG9kcykuCisKK1RoZSB2YWx1ZSBvZiBAaWR7b3B9IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorQGRlc2NyaXB0aW9ueworCitAaXRlbXtAZGVmaWR7TFVBX09QQUREfXwgcGVyZm9ybXMgYWRkaXRpb24gKEBUeyt9KX0KK0BpdGVte0BkZWZpZHtMVUFfT1BTVUJ9fCBwZXJmb3JtcyBzdWJ0cmFjdGlvbiAoQFR7LX0pfQorQGl0ZW17QGRlZmlke0xVQV9PUE1VTH18IHBlcmZvcm1zIG11bHRpcGxpY2F0aW9uIChAVHsqfSl9CitAaXRlbXtAZGVmaWR7TFVBX09QRElWfXwgcGVyZm9ybXMgZmxvYXQgZGl2aXNpb24gKEBUey99KX0KK0BpdGVte0BkZWZpZHtMVUFfT1BJRElWfXwgcGVyZm9ybXMgZmxvb3IgZGl2aXNpb24gKEBUey8vfSl9CitAaXRlbXtAZGVmaWR7TFVBX09QTU9EfXwgcGVyZm9ybXMgbW9kdWxvIChAVHslfSl9CitAaXRlbXtAZGVmaWR7TFVBX09QUE9XfXwgcGVyZm9ybXMgZXhwb25lbnRpYXRpb24gKEBUe159KX0KK0BpdGVte0BkZWZpZHtMVUFfT1BVTk19fCBwZXJmb3JtcyBtYXRoZW1hdGljYWwgbmVnYXRpb24gKHVuYXJ5IEBUey19KX0KK0BpdGVte0BkZWZpZHtMVUFfT1BCTk9UfXwgcGVyZm9ybXMgYml0d2lzZSBOT1QgKEBUe359KX0KK0BpdGVte0BkZWZpZHtMVUFfT1BCQU5EfXwgcGVyZm9ybXMgYml0d2lzZSBBTkQgKEBUeyZ9KX0KK0BpdGVte0BkZWZpZHtMVUFfT1BCT1J9fCBwZXJmb3JtcyBiaXR3aXNlIE9SIChAVHt8fSl9CitAaXRlbXtAZGVmaWR7TFVBX09QQlhPUn18IHBlcmZvcm1zIGJpdHdpc2UgZXhjbHVzaXZlIE9SIChAVHt+fSl9CitAaXRlbXtAZGVmaWR7TFVBX09QU0hMfXwgcGVyZm9ybXMgbGVmdCBzaGlmdCAoQFR7PDx9KX0KK0BpdGVte0BkZWZpZHtMVUFfT1BTSFJ9fCBwZXJmb3JtcyByaWdodCBzaGlmdCAoQFR7Pj59KX0KKworfQorCit9CisKK0BBUElFbnRyeXtsdWFfQ0Z1bmN0aW9uIGx1YV9hdHBhbmljIChsdWFfU3RhdGUgKkwsIGx1YV9DRnVuY3Rpb24gcGFuaWNmKTt8CitAYXBpaXswLDAsLX0KKworU2V0cyBhIG5ldyBwYW5pYyBmdW5jdGlvbiBhbmQgcmV0dXJucyB0aGUgb2xkIG9uZSBAc2Vle0MtZXJyb3J9LgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9jYWxsIChsdWFfU3RhdGUgKkwsIGludCBuYXJncywgaW50IG5yZXN1bHRzKTt8CitAYXBpaXtuYXJncysxLG5yZXN1bHRzLGV9CisKK0NhbGxzIGEgZnVuY3Rpb24uCisKK1RvIGRvIGEgY2FsbCB5b3UgbXVzdCB1c2UgdGhlIGZvbGxvd2luZyBwcm90b2NvbDoKK2ZpcnN0LCB0aGUgdmFsdWUgdG8gYmUgY2FsbGVkIGlzIHB1c2hlZCBvbnRvIHRoZSBzdGFjazsKK3RoZW4sIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNhbGwgYXJlIHB1c2hlZAoraW4gZGlyZWN0IG9yZGVyOwordGhhdCBpcywgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHB1c2hlZCBmaXJzdC4KK0ZpbmFsbHkgeW91IGNhbGwgQExpZHtsdWFfY2FsbH07CitAaWR7bmFyZ3N9IGlzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoYXQgeW91IHB1c2hlZCBvbnRvIHRoZSBzdGFjay4KK0FsbCBhcmd1bWVudHMgYW5kIHRoZSBmdW5jdGlvbiB2YWx1ZSBhcmUgcG9wcGVkIGZyb20gdGhlIHN0YWNrCit3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCitUaGUgZnVuY3Rpb24gcmVzdWx0cyBhcmUgcHVzaGVkIG9udG8gdGhlIHN0YWNrIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMuCitUaGUgbnVtYmVyIG9mIHJlc3VsdHMgaXMgYWRqdXN0ZWQgdG8gQGlke25yZXN1bHRzfSwKK3VubGVzcyBAaWR7bnJlc3VsdHN9IGlzIEBkZWZpZHtMVUFfTVVMVFJFVH0uCitJbiB0aGlzIGNhc2UsIGFsbCByZXN1bHRzIGZyb20gdGhlIGZ1bmN0aW9uIGFyZSBwdXNoZWQ7CitMdWEgdGFrZXMgY2FyZSB0aGF0IHRoZSByZXR1cm5lZCB2YWx1ZXMgZml0IGludG8gdGhlIHN0YWNrIHNwYWNlLAorYnV0IGl0IGRvZXMgbm90IGVuc3VyZSBhbnkgZXh0cmEgc3BhY2UgaW4gdGhlIHN0YWNrLgorVGhlIGZ1bmN0aW9uIHJlc3VsdHMgYXJlIHB1c2hlZCBvbnRvIHRoZSBzdGFjayBpbiBkaXJlY3Qgb3JkZXIKKyh0aGUgZmlyc3QgcmVzdWx0IGlzIHB1c2hlZCBmaXJzdCksCitzbyB0aGF0IGFmdGVyIHRoZSBjYWxsIHRoZSBsYXN0IHJlc3VsdCBpcyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKworQW55IGVycm9yIHdoaWxlIGNhbGxpbmcgYW5kIHJ1bm5pbmcgdGhlIGZ1bmN0aW9uIGlzIHByb3BhZ2F0ZWQgdXB3YXJkcworKHdpdGggYSBAaWR7bG9uZ2ptcH0pLgorTGlrZSByZWd1bGFyIEx1YSBjYWxscywKK3RoaXMgZnVuY3Rpb24gcmVzcGVjdHMgdGhlIEBpZHh7X19jYWxsfSBtZXRhbWV0aG9kLgorCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRoZSBob3N0IHByb2dyYW0gY2FuIGRvIHRoZQorZXF1aXZhbGVudCB0byB0aGlzIEx1YSBjb2RlOgorQHZlcmJhdGlteworYSA9IGYoImhvdyIsIHQueCwgMTQpCit9CitIZXJlIGl0IGlzIEBOe2luIEN9OgorQHZlcmJhdGlteworbHVhX2dldGdsb2JhbChMLCAiZiIpOyAgICAgICAgICAgICAgICAgIC8qIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCAqLworbHVhX3B1c2hsaXRlcmFsKEwsICJob3ciKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIDFzdCBhcmd1bWVudCAqLworbHVhX2dldGdsb2JhbChMLCAidCIpOyAgICAgICAgICAgICAgICAgICAgLyogdGFibGUgdG8gYmUgaW5kZXhlZCAqLworbHVhX2dldGZpZWxkKEwsIC0xLCAieCIpOyAgICAgICAgLyogcHVzaCByZXN1bHQgb2YgdC54ICgybmQgYXJnKSAqLworbHVhX3JlbW92ZShMLCAtMik7ICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlICd0JyBmcm9tIHRoZSBzdGFjayAqLworbHVhX3B1c2hpbnRlZ2VyKEwsIDE0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDNyZCBhcmd1bWVudCAqLworbHVhX2NhbGwoTCwgMywgMSk7ICAgICAvKiBjYWxsICdmJyB3aXRoIDMgYXJndW1lbnRzIGFuZCAxIHJlc3VsdCAqLworbHVhX3NldGdsb2JhbChMLCAiYSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgZ2xvYmFsICdhJyAqLworfQorTm90ZSB0aGF0IHRoZSBjb2RlIGFib3ZlIGlzIEBlbXBoe2JhbGFuY2VkfToKK2F0IGl0cyBlbmQsIHRoZSBzdGFjayBpcyBiYWNrIHRvIGl0cyBvcmlnaW5hbCBjb25maWd1cmF0aW9uLgorVGhpcyBpcyBjb25zaWRlcmVkIGdvb2QgcHJvZ3JhbW1pbmcgcHJhY3RpY2UuCisKK30KKworQEFQSUVudHJ5ewordm9pZCBsdWFfY2FsbGsgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICBpbnQgbmFyZ3MsCisgICAgICAgICAgICAgICAgaW50IG5yZXN1bHRzLAorICAgICAgICAgICAgICAgIGx1YV9LQ29udGV4dCBjdHgsCisgICAgICAgICAgICAgICAgbHVhX0tGdW5jdGlvbiBrKTt8CitAYXBpaXtuYXJncyArIDEsbnJlc3VsdHMsZX0KKworVGhpcyBmdW5jdGlvbiBiZWhhdmVzIGV4YWN0bHkgbGlrZSBATGlke2x1YV9jYWxsfSwKK2J1dCBhbGxvd3MgdGhlIGNhbGxlZCBmdW5jdGlvbiB0byB5aWVsZCBAc2Vle2NvbnRpbnVhdGlvbnN9LgorCit9CisKK0BBUElFbnRyeXt0eXBlZGVmIGludCAoKmx1YV9DRnVuY3Rpb24pIChsdWFfU3RhdGUgKkwpO3wKKworVHlwZSBmb3IgQE57QyBmdW5jdGlvbnN9LgorCitJbiBvcmRlciB0byBjb21tdW5pY2F0ZSBwcm9wZXJseSB3aXRoIEx1YSwKK2EgQE57QyBmdW5jdGlvbn0gbXVzdCB1c2UgdGhlIGZvbGxvd2luZyBwcm90b2NvbCwKK3doaWNoIGRlZmluZXMgdGhlIHdheSBwYXJhbWV0ZXJzIGFuZCByZXN1bHRzIGFyZSBwYXNzZWQ6CithIEBOe0MgZnVuY3Rpb259IHJlY2VpdmVzIGl0cyBhcmd1bWVudHMgZnJvbSBMdWEgaW4gaXRzIHN0YWNrCitpbiBkaXJlY3Qgb3JkZXIgKHRoZSBmaXJzdCBhcmd1bWVudCBpcyBwdXNoZWQgZmlyc3QpLgorU28sIHdoZW4gdGhlIGZ1bmN0aW9uIHN0YXJ0cywKK0BUe2x1YV9nZXR0b3AoTCl9IHJldHVybnMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcmVjZWl2ZWQgYnkgdGhlIGZ1bmN0aW9uLgorVGhlIGZpcnN0IGFyZ3VtZW50IChpZiBhbnkpIGlzIGF0IGluZGV4IDEKK2FuZCBpdHMgbGFzdCBhcmd1bWVudCBpcyBhdCBpbmRleCBAVHtsdWFfZ2V0dG9wKEwpfS4KK1RvIHJldHVybiB2YWx1ZXMgdG8gTHVhLCBhIEBOe0MgZnVuY3Rpb259IGp1c3QgcHVzaGVzIHRoZW0gb250byB0aGUgc3RhY2ssCitpbiBkaXJlY3Qgb3JkZXIgKHRoZSBmaXJzdCByZXN1bHQgaXMgcHVzaGVkIGZpcnN0KSwKK2FuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVzdWx0cy4KK0FueSBvdGhlciB2YWx1ZSBpbiB0aGUgc3RhY2sgYmVsb3cgdGhlIHJlc3VsdHMgd2lsbCBiZSBwcm9wZXJseQorZGlzY2FyZGVkIGJ5IEx1YS4KK0xpa2UgYSBMdWEgZnVuY3Rpb24sIGEgQE57QyBmdW5jdGlvbn0gY2FsbGVkIGJ5IEx1YSBjYW4gYWxzbyByZXR1cm4KK21hbnkgcmVzdWx0cy4KKworQXMgYW4gZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiByZWNlaXZlcyBhIHZhcmlhYmxlIG51bWJlcgorb2YgbnVtZXJpYyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlaXIgYXZlcmFnZSBhbmQgdGhlaXIgc3VtOgorQHZlcmJhdGlteworc3RhdGljIGludCBmb28gKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgbiA9IGx1YV9nZXR0b3AoTCk7ICAgIC8qIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKyAgbHVhX051bWJlciBzdW0gPSAwLjA7CisgIGludCBpOworICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykgeworICAgIGlmICghbHVhX2lzbnVtYmVyKEwsIGkpKSB7CisgICAgICBsdWFfcHVzaGxpdGVyYWwoTCwgImluY29ycmVjdCBhcmd1bWVudCIpOworICAgICAgbHVhX2Vycm9yKEwpOworICAgIH0KKyAgICBzdW0gKz0gbHVhX3RvbnVtYmVyKEwsIGkpOworICB9CisgIGx1YV9wdXNobnVtYmVyKEwsIHN1bS9uKTsgICAgICAgIC8qIGZpcnN0IHJlc3VsdCAqLworICBsdWFfcHVzaG51bWJlcihMLCBzdW0pOyAgICAgICAgIC8qIHNlY29uZCByZXN1bHQgKi8KKyAgcmV0dXJuIDI7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZXN1bHRzICovCit9Cit9CisKKworCit9CisKKworQEFQSUVudHJ5e2ludCBsdWFfY2hlY2tzdGFjayAobHVhX1N0YXRlICpMLCBpbnQgbik7fAorQGFwaWl7MCwwLC19CisKK0Vuc3VyZXMgdGhhdCB0aGUgc3RhY2sgaGFzIHNwYWNlIGZvciBhdCBsZWFzdCBAaWR7bn0gZXh0cmEgc2xvdHMKKyh0aGF0IGlzLCB0aGF0IHlvdSBjYW4gc2FmZWx5IHB1c2ggdXAgdG8gQGlke259IHZhbHVlcyBpbnRvIGl0KS4KK0l0IHJldHVybnMgZmFsc2UgaWYgaXQgY2Fubm90IGZ1bGZpbGwgdGhlIHJlcXVlc3QsCitlaXRoZXIgYmVjYXVzZSBpdCB3b3VsZCBjYXVzZSB0aGUgc3RhY2sKK3RvIGJlIGxhcmdlciB0aGFuIGEgZml4ZWQgbWF4aW11bSBzaXplCisodHlwaWNhbGx5IGF0IGxlYXN0IHNldmVyYWwgdGhvdXNhbmQgZWxlbWVudHMpIG9yCitiZWNhdXNlIGl0IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBleHRyYSBzcGFjZS4KK1RoaXMgZnVuY3Rpb24gbmV2ZXIgc2hyaW5rcyB0aGUgc3RhY2s7CitpZiB0aGUgc3RhY2sgYWxyZWFkeSBoYXMgc3BhY2UgZm9yIHRoZSBleHRyYSBzbG90cywKK2l0IGlzIGxlZnQgdW5jaGFuZ2VkLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9jbG9zZSAobHVhX1N0YXRlICpMKTt8CitAYXBpaXswLDAsLX0KKworRGVzdHJveXMgYWxsIG9iamVjdHMgaW4gdGhlIGdpdmVuIEx1YSBzdGF0ZQorKGNhbGxpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZ2FyYmFnZS1jb2xsZWN0aW9uIG1ldGFtZXRob2RzLCBpZiBhbnkpCithbmQgZnJlZXMgYWxsIGR5bmFtaWMgbWVtb3J5IHVzZWQgYnkgdGhpcyBzdGF0ZS4KK09uIHNldmVyYWwgcGxhdGZvcm1zLCB5b3UgbWF5IG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiwKK2JlY2F1c2UgYWxsIHJlc291cmNlcyBhcmUgbmF0dXJhbGx5IHJlbGVhc2VkIHdoZW4gdGhlIGhvc3QgcHJvZ3JhbSBlbmRzLgorT24gdGhlIG90aGVyIGhhbmQsIGxvbmctcnVubmluZyBwcm9ncmFtcyB0aGF0IGNyZWF0ZSBtdWx0aXBsZSBzdGF0ZXMsCitzdWNoIGFzIGRhZW1vbnMgb3Igd2ViIHNlcnZlcnMsCit3aWxsIHByb2JhYmx5IG5lZWQgdG8gY2xvc2Ugc3RhdGVzIGFzIHNvb24gYXMgdGhleSBhcmUgbm90IG5lZWRlZC4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9jb21wYXJlIChsdWFfU3RhdGUgKkwsIGludCBpbmRleDEsIGludCBpbmRleDIsIGludCBvcCk7fAorQGFwaWl7MCwwLGV9CisKK0NvbXBhcmVzIHR3byBMdWEgdmFsdWVzLgorUmV0dXJucyAxIGlmIHRoZSB2YWx1ZSBhdCBpbmRleCBAaWR7aW5kZXgxfSBzYXRpc2ZpZXMgQGlke29wfQord2hlbiBjb21wYXJlZCB3aXRoIHRoZSB2YWx1ZSBhdCBpbmRleCBAaWR7aW5kZXgyfSwKK2ZvbGxvd2luZyB0aGUgc2VtYW50aWNzIG9mIHRoZSBjb3JyZXNwb25kaW5nIEx1YSBvcGVyYXRvcgorKHRoYXQgaXMsIGl0IG1heSBjYWxsIG1ldGFtZXRob2RzKS4KK090aGVyd2lzZSBATntyZXR1cm5zIDB9LgorQWxzbyBATntyZXR1cm5zIDB9IGlmIGFueSBvZiB0aGUgaW5kaWNlcyBpcyBub3QgdmFsaWQuCisKK1RoZSB2YWx1ZSBvZiBAaWR7b3B9IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorQGRlc2NyaXB0aW9ueworCitAaXRlbXtAZGVmaWR7TFVBX09QRVF9fCBjb21wYXJlcyBmb3IgZXF1YWxpdHkgKEBUez09fSl9CitAaXRlbXtAZGVmaWR7TFVBX09QTFR9fCBjb21wYXJlcyBmb3IgbGVzcyB0aGFuIChAVHs8fSl9CitAaXRlbXtAZGVmaWR7TFVBX09QTEV9fCBjb21wYXJlcyBmb3IgbGVzcyBvciBlcXVhbCAoQFR7PD19KX0KKworfQorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9jb25jYXQgKGx1YV9TdGF0ZSAqTCwgaW50IG4pO3wKK0BhcGlpe24sMSxlfQorCitDb25jYXRlbmF0ZXMgdGhlIEBpZHtufSB2YWx1ZXMgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2ssCitwb3BzIHRoZW0sIGFuZCBsZWF2ZXMgdGhlIHJlc3VsdCBhdCB0aGUgdG9wLgorSWYgQE57QFR7bn0gaXMgMX0sIHRoZSByZXN1bHQgaXMgdGhlIHNpbmdsZSB2YWx1ZSBvbiB0aGUgc3RhY2sKKyh0aGF0IGlzLCB0aGUgZnVuY3Rpb24gZG9lcyBub3RoaW5nKTsKK2lmIEBpZHtufSBpcyAwLCB0aGUgcmVzdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuCitDb25jYXRlbmF0aW9uIGlzIHBlcmZvcm1lZCBmb2xsb3dpbmcgdGhlIHVzdWFsIHNlbWFudGljcyBvZiBMdWEKK0BzZWV7Y29uY2F0fS4KKworfQorCitAQVBJRW50cnl7dm9pZCBsdWFfY29weSAobHVhX1N0YXRlICpMLCBpbnQgZnJvbWlkeCwgaW50IHRvaWR4KTt8CitAYXBpaXswLDAsLX0KKworQ29waWVzIHRoZSBlbGVtZW50IGF0IGluZGV4IEBpZHtmcm9taWR4fQoraW50byB0aGUgdmFsaWQgaW5kZXggQGlke3RvaWR4fSwKK3JlcGxhY2luZyB0aGUgdmFsdWUgYXQgdGhhdCBwb3NpdGlvbi4KK1ZhbHVlcyBhdCBvdGhlciBwb3NpdGlvbnMgYXJlIG5vdCBhZmZlY3RlZC4KKworfQorCitAQVBJRW50cnl7dm9pZCBsdWFfY3JlYXRldGFibGUgKGx1YV9TdGF0ZSAqTCwgaW50IG5hcnIsIGludCBucmVjKTt8CitAYXBpaXswLDEsbX0KKworQ3JlYXRlcyBhIG5ldyBlbXB0eSB0YWJsZSBhbmQgcHVzaGVzIGl0IG9udG8gdGhlIHN0YWNrLgorUGFyYW1ldGVyIEBpZHtuYXJyfSBpcyBhIGhpbnQgZm9yIGhvdyBtYW55IGVsZW1lbnRzIHRoZSB0YWJsZQord2lsbCBoYXZlIGFzIGEgc2VxdWVuY2U7CitwYXJhbWV0ZXIgQGlke25yZWN9IGlzIGEgaGludCBmb3IgaG93IG1hbnkgb3RoZXIgZWxlbWVudHMKK3RoZSB0YWJsZSB3aWxsIGhhdmUuCitMdWEgbWF5IHVzZSB0aGVzZSBoaW50cyB0byBwcmVhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBuZXcgdGFibGUuCitUaGlzIHByZWFsbG9jYXRpb24gaXMgdXNlZnVsIGZvciBwZXJmb3JtYW5jZSB3aGVuIHlvdSBrbm93IGluIGFkdmFuY2UKK2hvdyBtYW55IGVsZW1lbnRzIHRoZSB0YWJsZSB3aWxsIGhhdmUuCitPdGhlcndpc2UgeW91IGNhbiB1c2UgdGhlIGZ1bmN0aW9uIEBMaWR7bHVhX25ld3RhYmxlfS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9kdW1wIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICBsdWFfV3JpdGVyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaXApO3wKK0BhcGlpezAsMCwtfQorCitEdW1wcyBhIGZ1bmN0aW9uIGFzIGEgYmluYXJ5IGNodW5rLgorUmVjZWl2ZXMgYSBMdWEgZnVuY3Rpb24gb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sKK2FuZCBwcm9kdWNlcyBhIGJpbmFyeSBjaHVuayB0aGF0LAoraWYgbG9hZGVkIGFnYWluLAorcmVzdWx0cyBpbiBhIGZ1bmN0aW9uIGVxdWl2YWxlbnQgdG8gdGhlIG9uZSBkdW1wZWQuCitBcyBpdCBwcm9kdWNlcyBwYXJ0cyBvZiB0aGUgY2h1bmssCitATGlke2x1YV9kdW1wfSBjYWxscyBmdW5jdGlvbiBAaWR7d3JpdGVyfSBAc2VlQ3tsdWFfV3JpdGVyfQord2l0aCB0aGUgZ2l2ZW4gQGlke2RhdGF9Cit0byB3cml0ZSB0aGVtLgorCitJZiBAaWR7c3RyaXB9IGlzIHRydWUsCit0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG1heSBub3QgaW5jbHVkZSBhbGwgZGVidWcgaW5mb3JtYXRpb24KK2Fib3V0IHRoZSBmdW5jdGlvbiwKK3RvIHNhdmUgc3BhY2UuCisKK1RoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgZXJyb3IgY29kZSByZXR1cm5lZCBieSB0aGUgbGFzdAorY2FsbCB0byB0aGUgd3JpdGVyOworQE57MCBtZWFuc30gbm8gZXJyb3JzLgorCitUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBvcCB0aGUgTHVhIGZ1bmN0aW9uIGZyb20gdGhlIHN0YWNrLgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX2Vycm9yIChsdWFfU3RhdGUgKkwpO3wKK0BhcGlpezEsMCx2fQorCitHZW5lcmF0ZXMgYSBMdWEgZXJyb3IsCit1c2luZyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgYXMgdGhlIGVycm9yIG9iamVjdC4KK1RoaXMgZnVuY3Rpb24gZG9lcyBhIGxvbmcganVtcCwKK2FuZCB0aGVyZWZvcmUgbmV2ZXIgcmV0dXJucworQHNlZUN7bHVhTF9lcnJvcn0uCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfZ2MgKGx1YV9TdGF0ZSAqTCwgaW50IHdoYXQsIGludCBkYXRhKTt8CitAYXBpaXswLDAsdn0KKworQ29udHJvbHMgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorCitUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHNldmVyYWwgdGFza3MsCithY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgQGlke3doYXR9OgorQGRlc2NyaXB0aW9ueworCitAaXRlbXtAaWR7TFVBX0dDU1RPUH18CitzdG9wcyB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCit9CisKK0BpdGVte0BpZHtMVUFfR0NSRVNUQVJUfXwKK3Jlc3RhcnRzIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KK30KKworQGl0ZW17QGlke0xVQV9HQ0NPTExFQ1R9fAorcGVyZm9ybXMgYSBmdWxsIGdhcmJhZ2UtY29sbGVjdGlvbiBjeWNsZS4KK30KKworQGl0ZW17QGlke0xVQV9HQ0NPVU5UfXwKK3JldHVybnMgdGhlIGN1cnJlbnQgYW1vdW50IG9mIG1lbW9yeSAoaW4gS2J5dGVzKSBpbiB1c2UgYnkgTHVhLgorfQorCitAaXRlbXtAaWR7TFVBX0dDQ09VTlRCfXwKK3JldHVybnMgdGhlIHJlbWFpbmRlciBvZiBkaXZpZGluZyB0aGUgY3VycmVudCBhbW91bnQgb2YgYnl0ZXMgb2YKK21lbW9yeSBpbiB1c2UgYnkgTHVhIGJ5IDEwMjQuCit9CisKK0BpdGVte0BpZHtMVUFfR0NTVEVQfXwKK3BlcmZvcm1zIGFuIGluY3JlbWVudGFsIHN0ZXAgb2YgZ2FyYmFnZSBjb2xsZWN0aW9uLgorfQorCitAaXRlbXtAaWR7TFVBX0dDU0VUUEFVU0V9fAorc2V0cyBAaWR7ZGF0YX0gYXMgdGhlIG5ldyB2YWx1ZQorZm9yIHRoZSBAZW1waHtwYXVzZX0gb2YgdGhlIGNvbGxlY3RvciBAc2Vle0dDfQorYW5kIHJldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBwYXVzZS4KK30KKworQGl0ZW17QGlke0xVQV9HQ1NFVFNURVBNVUx9fAorc2V0cyBAaWR7ZGF0YX0gYXMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIEBlbXBoe3N0ZXAgbXVsdGlwbGllcn0gb2YKK3RoZSBjb2xsZWN0b3IgQHNlZXtHQ30KK2FuZCByZXR1cm5zIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgc3RlcCBtdWx0aXBsaWVyLgorfQorCitAaXRlbXtAaWR7TFVBX0dDSVNSVU5OSU5HfXwKK3JldHVybnMgYSBib29sZWFuIHRoYXQgdGVsbHMgd2hldGhlciB0aGUgY29sbGVjdG9yIGlzIHJ1bm5pbmcKKyhpLmUuLCBub3Qgc3RvcHBlZCkuCit9CisKK30KK0ZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlc2Ugb3B0aW9ucywKK3NlZSBATGlke2NvbGxlY3RnYXJiYWdlfS4KKworVGhpcyBmdW5jdGlvbiBtYXkgcmFpc2UgZXJyb3JzIHdoZW4gY2FsbGluZyBmaW5hbGl6ZXJzLgorCit9CisKK0BBUElFbnRyeXtsdWFfQWxsb2MgbHVhX2dldGFsbG9jZiAobHVhX1N0YXRlICpMLCB2b2lkICoqdWQpO3wKK0BhcGlpezAsMCwtfQorCitSZXR1cm5zIHRoZSBAeHttZW1vcnktYWxsb2NhdGlvbiBmdW5jdGlvbn0gb2YgYSBnaXZlbiBzdGF0ZS4KK0lmIEBpZHt1ZH0gaXMgbm90IEBpZHtOVUxMfSwgTHVhIHN0b3JlcyBpbiBAVHsqdWR9IHRoZQorb3BhcXVlIHBvaW50ZXIgZ2l2ZW4gd2hlbiB0aGUgbWVtb3J5LWFsbG9jYXRvciBmdW5jdGlvbiB3YXMgc2V0LgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX2dldGZpZWxkIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgY29uc3QgY2hhciAqayk7fAorQGFwaWl7MCwxLGV9CisKK1B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgdmFsdWUgQFR7dFtrXX0sCit3aGVyZSBAaWR7dH0gaXMgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleC4KK0FzIGluIEx1YSwgdGhpcyBmdW5jdGlvbiBtYXkgdHJpZ2dlciBhIG1ldGFtZXRob2QKK2ZvciB0aGUgQFF7aW5kZXh9IGV2ZW50IEBzZWV7bWV0YXRhYmxlfS4KKworUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgcHVzaGVkIHZhbHVlLgorCit9CisKK0BBUElFbnRyeXt2b2lkICpsdWFfZ2V0ZXh0cmFzcGFjZSAobHVhX1N0YXRlICpMKTt8CitAYXBpaXswLDAsLX0KKworUmV0dXJucyBhIHBvaW50ZXIgdG8gYSByYXcgbWVtb3J5IGFyZWEgYXNzb2NpYXRlZCB3aXRoIHRoZQorZ2l2ZW4gTHVhIHN0YXRlLgorVGhlIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhpcyBhcmVhIGZvciBhbnkgcHVycG9zZTsKK0x1YSBkb2VzIG5vdCB1c2UgaXQgZm9yIGFueXRoaW5nLgorCitFYWNoIG5ldyB0aHJlYWQgaGFzIHRoaXMgYXJlYSBpbml0aWFsaXplZCB3aXRoIGEgY29weQorb2YgdGhlIGFyZWEgb2YgdGhlIEB4e21haW4gdGhyZWFkfS4KKworQnkgZGVmYXVsdCwgdGhpcyBhcmVhIGhhcyB0aGUgc2l6ZSBvZiBhIHBvaW50ZXIgdG8gdm9pZCwKK2J1dCB5b3UgY2FuIHJlY29tcGlsZSBMdWEgd2l0aCBhIGRpZmZlcmVudCBzaXplIGZvciB0aGlzIGFyZWEuCisoU2VlIEBpZHtMVUFfRVhUUkFTUEFDRX0gaW4gQGlke2x1YWNvbmYuaH0uKQorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX2dldGdsb2JhbCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpuYW1lKTt8CitAYXBpaXswLDEsZX0KKworUHVzaGVzIG9udG8gdGhlIHN0YWNrIHRoZSB2YWx1ZSBvZiB0aGUgZ2xvYmFsIEBpZHtuYW1lfS4KK1JldHVybnMgdGhlIHR5cGUgb2YgdGhhdCB2YWx1ZS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9nZXRpIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgbHVhX0ludGVnZXIgaSk7fAorQGFwaWl7MCwxLGV9CisKK1B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgdmFsdWUgQFR7dFtpXX0sCit3aGVyZSBAaWR7dH0gaXMgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleC4KK0FzIGluIEx1YSwgdGhpcyBmdW5jdGlvbiBtYXkgdHJpZ2dlciBhIG1ldGFtZXRob2QKK2ZvciB0aGUgQFF7aW5kZXh9IGV2ZW50IEBzZWV7bWV0YXRhYmxlfS4KKworUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgcHVzaGVkIHZhbHVlLgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX2dldG1ldGF0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpO3wKK0BhcGlpezAsMHwxLC19CisKK0lmIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggaGFzIGEgbWV0YXRhYmxlLAordGhlIGZ1bmN0aW9uIHB1c2hlcyB0aGF0IG1ldGF0YWJsZSBvbnRvIHRoZSBzdGFjayBhbmQgQE57cmV0dXJucyAxfS4KK090aGVyd2lzZSwKK3RoZSBmdW5jdGlvbiBATntyZXR1cm5zIDB9IGFuZCBwdXNoZXMgbm90aGluZyBvbiB0aGUgc3RhY2suCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfZ2V0dGFibGUgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXsxLDEsZX0KKworUHVzaGVzIG9udG8gdGhlIHN0YWNrIHRoZSB2YWx1ZSBAVHt0W2tdfSwKK3doZXJlIEBpZHt0fSBpcyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4CithbmQgQGlke2t9IGlzIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKworVGhpcyBmdW5jdGlvbiBwb3BzIHRoZSBrZXkgZnJvbSB0aGUgc3RhY2ssCitwdXNoaW5nIHRoZSByZXN1bHRpbmcgdmFsdWUgaW4gaXRzIHBsYWNlLgorQXMgaW4gTHVhLCB0aGlzIGZ1bmN0aW9uIG1heSB0cmlnZ2VyIGEgbWV0YW1ldGhvZAorZm9yIHRoZSBAUXtpbmRleH0gZXZlbnQgQHNlZXttZXRhdGFibGV9LgorCitSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBwdXNoZWQgdmFsdWUuCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfZ2V0dG9wIChsdWFfU3RhdGUgKkwpO3wKK0BhcGlpezAsMCwtfQorCitSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgdG9wIGVsZW1lbnQgaW4gdGhlIHN0YWNrLgorQmVjYXVzZSBpbmRpY2VzIHN0YXJ0IEBOe2F0IDF9LAordGhpcyByZXN1bHQgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc3RhY2s7CitpbiBwYXJ0aWN1bGFyLCBATnswIG1lYW5zfSBhbiBlbXB0eSBzdGFjay4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9nZXRpdXNlcnZhbHVlIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgaW50IG4pO3wKK0BhcGlpezAsMSwtfQorCitQdXNoZXMgb250byB0aGUgc3RhY2sgdGhlIEBpZHtufS10aCB1c2VyIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUKK2Z1bGwgdXNlcmRhdGEgYXQgdGhlIGdpdmVuIGluZGV4IGFuZAorcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgcHVzaGVkIHZhbHVlLgorCitJZiB0aGUgdXNlcmRhdGEgZG9lcyBub3QgaGF2ZSB0aGF0IHZhbHVlLAorcHVzaGVzIEBuaWwgYW5kIHJldHVybnMgQExpZHtMVUFfVE5PTkV9LgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9pbnNlcnQgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXsxLDEsLX0KKworTW92ZXMgdGhlIHRvcCBlbGVtZW50IGludG8gdGhlIGdpdmVuIHZhbGlkIGluZGV4LAorc2hpZnRpbmcgdXAgdGhlIGVsZW1lbnRzIGFib3ZlIHRoaXMgaW5kZXggdG8gb3BlbiBzcGFjZS4KK1RoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIGEgcHNldWRvLWluZGV4LAorYmVjYXVzZSBhIHBzZXVkby1pbmRleCBpcyBub3QgYW4gYWN0dWFsIHN0YWNrIHBvc2l0aW9uLgorCit9CisKK0BBUElFbnRyeXt0eXBlZGVmIEBsZG90cyBsdWFfSW50ZWdlcjt8CisKK1RoZSB0eXBlIG9mIGludGVnZXJzIGluIEx1YS4KKworQnkgZGVmYXVsdCB0aGlzIHR5cGUgaXMgQGlke2xvbmcgbG9uZ30sCisodXN1YWxseSBhIDY0LWJpdCB0d28tY29tcGxlbWVudCBpbnRlZ2VyKSwKK2J1dCB0aGF0IGNhbiBiZSBjaGFuZ2VkIHRvIEBpZHtsb25nfSBvciBAaWR7aW50fQorKHVzdWFsbHkgYSAzMi1iaXQgdHdvLWNvbXBsZW1lbnQgaW50ZWdlcikuCisoU2VlIEBpZHtMVUFfSU5UX1RZUEV9IGluIEBpZHtsdWFjb25mLmh9LikKKworTHVhIGFsc28gZGVmaW5lcyB0aGUgY29uc3RhbnRzCitAZGVmaWR7TFVBX01JTklOVEVHRVJ9IGFuZCBAZGVmaWR7TFVBX01BWElOVEVHRVJ9LAord2l0aCB0aGUgbWluaW11bSBhbmQgdGhlIG1heGltdW0gdmFsdWVzIHRoYXQgZml0IGluIHRoaXMgdHlwZS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9pc2Jvb2xlYW4gKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXswLDAsLX0KKworUmV0dXJucyAxIGlmIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgYSBib29sZWFuLAorYW5kIEBOezAgb3RoZXJ3aXNlfS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9pc2NmdW5jdGlvbiAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpO3wKK0BhcGlpezAsMCwtfQorCitSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCBpcyBhIEBOe0MgZnVuY3Rpb259LAorYW5kIEBOezAgb3RoZXJ3aXNlfS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9pc2Z1bmN0aW9uIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IGlzIGEgZnVuY3Rpb24KKyhlaXRoZXIgQyBvciBMdWEpLCBhbmQgQE57MCBvdGhlcndpc2V9LgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX2lzaW50ZWdlciAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpO3wKK0BhcGlpezAsMCwtfQorCitSZXR1cm5zIDEgaWYgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCBpcyBhbiBpbnRlZ2VyCisodGhhdCBpcywgdGhlIHZhbHVlIGlzIGEgbnVtYmVyIGFuZCBpcyByZXByZXNlbnRlZCBhcyBhbiBpbnRlZ2VyKSwKK2FuZCBATnswIG90aGVyd2lzZX0uCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfaXNsaWdodHVzZXJkYXRhIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IGlzIGEgbGlnaHQgdXNlcmRhdGEsCithbmQgQE57MCBvdGhlcndpc2V9LgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX2lzbmlsIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IGlzIEBuaWwsCithbmQgQE57MCBvdGhlcndpc2V9LgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX2lzbm9uZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpO3wKK0BhcGlpezAsMCwtfQorCitSZXR1cm5zIDEgaWYgdGhlIGdpdmVuIGluZGV4IGlzIG5vdCB2YWxpZCwKK2FuZCBATnswIG90aGVyd2lzZX0uCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfaXNub25lb3JuaWwgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXswLDAsLX0KKworUmV0dXJucyAxIGlmIHRoZSBnaXZlbiBpbmRleCBpcyBub3QgdmFsaWQKK29yIGlmIHRoZSB2YWx1ZSBhdCB0aGlzIGluZGV4IGlzIEBuaWwsCithbmQgQE57MCBvdGhlcndpc2V9LgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX2lzbnVtYmVyIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IGlzIGEgbnVtYmVyCitvciBhIHN0cmluZyBjb252ZXJ0aWJsZSB0byBhIG51bWJlciwKK2FuZCBATnswIG90aGVyd2lzZX0uCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfaXNzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXswLDAsLX0KKworUmV0dXJucyAxIGlmIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgYSBzdHJpbmcKK29yIGEgbnVtYmVyICh3aGljaCBpcyBhbHdheXMgY29udmVydGlibGUgdG8gYSBzdHJpbmcpLAorYW5kIEBOezAgb3RoZXJ3aXNlfS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9pc3RhYmxlIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IGlzIGEgdGFibGUsCithbmQgQE57MCBvdGhlcndpc2V9LgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX2lzdGhyZWFkIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IGlzIGEgdGhyZWFkLAorYW5kIEBOezAgb3RoZXJ3aXNlfS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9pc3VzZXJkYXRhIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgMSBpZiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4IGlzIGEgdXNlcmRhdGEKKyhlaXRoZXIgZnVsbCBvciBsaWdodCksIGFuZCBATnswIG90aGVyd2lzZX0uCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfaXN5aWVsZGFibGUgKGx1YV9TdGF0ZSAqTCk7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgMSBpZiB0aGUgZ2l2ZW4gY29yb3V0aW5lIGNhbiB5aWVsZCwKK2FuZCBATnswIG90aGVyd2lzZX0uCisKK30KKworQEFQSUVudHJ5e3R5cGVkZWYgQGxkb3RzIGx1YV9LQ29udGV4dDt8CisKK1RoZSB0eXBlIGZvciBjb250aW51YXRpb24tZnVuY3Rpb24gY29udGV4dHMuCitJdCBtdXN0IGJlIGEgbnVtZXJpYyB0eXBlLgorVGhpcyB0eXBlIGlzIGRlZmluZWQgYXMgQGlke2ludHB0cl90fQord2hlbiBAaWR7aW50cHRyX3R9IGlzIGF2YWlsYWJsZSwKK3NvIHRoYXQgaXQgY2FuIHN0b3JlIHBvaW50ZXJzIHRvby4KK090aGVyd2lzZSwgaXQgaXMgZGVmaW5lZCBhcyBAaWR7cHRyZGlmZl90fS4KKworfQorCitAQVBJRW50cnl7Cit0eXBlZGVmIGludCAoKmx1YV9LRnVuY3Rpb24pIChsdWFfU3RhdGUgKkwsIGludCBzdGF0dXMsIGx1YV9LQ29udGV4dCBjdHgpO3wKKworVHlwZSBmb3IgY29udGludWF0aW9uIGZ1bmN0aW9ucyBAc2Vle2NvbnRpbnVhdGlvbnN9LgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9sZW4gKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXswLDEsZX0KKworUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCitJdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBAQ2hhcnsjfSBvcGVyYXRvciBpbiBMdWEgQHNlZXtsZW4tb3B9IGFuZAorbWF5IHRyaWdnZXIgYSBtZXRhbWV0aG9kIGZvciB0aGUgQFF7bGVuZ3RofSBldmVudCBAc2Vle21ldGF0YWJsZX0uCitUaGUgcmVzdWx0IGlzIHB1c2hlZCBvbiB0aGUgc3RhY2suCisKK30KKworQEFQSUVudHJ5eworaW50IGx1YV9sb2FkIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgIGx1YV9SZWFkZXIgcmVhZGVyLAorICAgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgICBjb25zdCBjaGFyICpjaHVua25hbWUsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGUpO3wKK0BhcGlpezAsMSwtfQorCitMb2FkcyBhIEx1YSBjaHVuayB3aXRob3V0IHJ1bm5pbmcgaXQuCitJZiB0aGVyZSBhcmUgbm8gZXJyb3JzLAorQGlke2x1YV9sb2FkfSBwdXNoZXMgdGhlIGNvbXBpbGVkIGNodW5rIGFzIGEgTHVhCitmdW5jdGlvbiBvbiB0b3Agb2YgdGhlIHN0YWNrLgorT3RoZXJ3aXNlLCBpdCBwdXNoZXMgYW4gZXJyb3IgbWVzc2FnZS4KKworVGhlIHJldHVybiB2YWx1ZXMgb2YgQGlke2x1YV9sb2FkfSBhcmU6CitAZGVzY3JpcHRpb257CisKK0BpdGVte0BMaWR7TFVBX09LfXwgbm8gZXJyb3JzO30KKworQGl0ZW17QGRlZmlke0xVQV9FUlJTWU5UQVh9fAorc3ludGF4IGVycm9yIGR1cmluZyBwcmVjb21waWxhdGlvbjt9CisKK0BpdGVte0BMaWR7TFVBX0VSUk1FTX18CitAeHttZW1vcnkgYWxsb2NhdGlvbiAob3V0LW9mLW1lbW9yeSkgZXJyb3J9O30KKworQGl0ZW17QExpZHtMVUFfRVJSR0NNTX18CitlcnJvciB3aGlsZSBydW5uaW5nIGEgQGlkeHtfX2djfSBtZXRhbWV0aG9kLgorKFRoaXMgZXJyb3IgaGFzIG5vIHJlbGF0aW9uIHdpdGggdGhlIGNodW5rIGJlaW5nIGxvYWRlZC4KK0l0IGlzIGdlbmVyYXRlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuKQorfQorCit9CisKK1RoZSBAaWR7bHVhX2xvYWR9IGZ1bmN0aW9uIHVzZXMgYSB1c2VyLXN1cHBsaWVkIEBpZHtyZWFkZXJ9IGZ1bmN0aW9uCit0byByZWFkIHRoZSBjaHVuayBAc2VlQ3tsdWFfUmVhZGVyfS4KK1RoZSBAaWR7ZGF0YX0gYXJndW1lbnQgaXMgYW4gb3BhcXVlIHZhbHVlIHBhc3NlZCB0byB0aGUgcmVhZGVyIGZ1bmN0aW9uLgorCitUaGUgQGlke2NodW5rbmFtZX0gYXJndW1lbnQgZ2l2ZXMgYSBuYW1lIHRvIHRoZSBjaHVuaywKK3doaWNoIGlzIHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzIGFuZCBpbiBkZWJ1ZyBpbmZvcm1hdGlvbiBAc2Vle2RlYnVnSX0uCisKK0BpZHtsdWFfbG9hZH0gYXV0b21hdGljYWxseSBkZXRlY3RzIHdoZXRoZXIgdGhlIGNodW5rIGlzIHRleHQgb3IgYmluYXJ5CithbmQgbG9hZHMgaXQgYWNjb3JkaW5nbHkgKHNlZSBwcm9ncmFtIEBpZHh7bHVhY30pLgorVGhlIHN0cmluZyBAaWR7bW9kZX0gd29ya3MgYXMgaW4gZnVuY3Rpb24gQExpZHtsb2FkfSwKK3dpdGggdGhlIGFkZGl0aW9uIHRoYXQKK2EgQGlke05VTEx9IHZhbHVlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHN0cmluZyBAU3R7YnR9LgorCitAaWR7bHVhX2xvYWR9IHVzZXMgdGhlIHN0YWNrIGludGVybmFsbHksCitzbyB0aGUgcmVhZGVyIGZ1bmN0aW9uIG11c3QgYWx3YXlzIGxlYXZlIHRoZSBzdGFjawordW5tb2RpZmllZCB3aGVuIHJldHVybmluZy4KKworSWYgdGhlIHJlc3VsdGluZyBmdW5jdGlvbiBoYXMgdXB2YWx1ZXMsCitpdHMgZmlyc3QgdXB2YWx1ZSBpcyBzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBAeHtnbG9iYWwgZW52aXJvbm1lbnR9CitzdG9yZWQgYXQgaW5kZXggQGlke0xVQV9SSURYX0dMT0JBTFN9IGluIHRoZSByZWdpc3RyeSBAc2Vle3JlZ2lzdHJ5fS4KK1doZW4gbG9hZGluZyBtYWluIGNodW5rcywKK3RoaXMgdXB2YWx1ZSB3aWxsIGJlIHRoZSBAaWR7X0VOVn0gdmFyaWFibGUgQHNlZXtnbG9iYWxlbnZ9LgorT3RoZXIgdXB2YWx1ZXMgYXJlIGluaXRpYWxpemVkIHdpdGggQG5pbC4KKworfQorCitAQVBJRW50cnl7bHVhX1N0YXRlICpsdWFfbmV3c3RhdGUgKGx1YV9BbGxvYyBmLCB2b2lkICp1ZCk7fAorQGFwaWl7MCwwLC19CisKK0NyZWF0ZXMgYSBuZXcgdGhyZWFkIHJ1bm5pbmcgaW4gYSBuZXcsIGluZGVwZW5kZW50IHN0YXRlLgorUmV0dXJucyBAaWR7TlVMTH0gaWYgaXQgY2Fubm90IGNyZWF0ZSB0aGUgdGhyZWFkIG9yIHRoZSBzdGF0ZQorKGR1ZSB0byBsYWNrIG9mIG1lbW9yeSkuCitUaGUgYXJndW1lbnQgQGlke2Z9IGlzIHRoZSBAeHthbGxvY2F0b3IgZnVuY3Rpb259OworTHVhIGRvZXMgYWxsIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGlzIHN0YXRlCit0aHJvdWdoIHRoaXMgZnVuY3Rpb24gQHNlZUZ7bHVhX0FsbG9jfS4KK1RoZSBzZWNvbmQgYXJndW1lbnQsIEBpZHt1ZH0sIGlzIGFuIG9wYXF1ZSBwb2ludGVyIHRoYXQgTHVhCitwYXNzZXMgdG8gdGhlIGFsbG9jYXRvciBpbiBldmVyeSBjYWxsLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9uZXd0YWJsZSAobHVhX1N0YXRlICpMKTt8CitAYXBpaXswLDEsbX0KKworQ3JlYXRlcyBhIG5ldyBlbXB0eSB0YWJsZSBhbmQgcHVzaGVzIGl0IG9udG8gdGhlIHN0YWNrLgorSXQgaXMgZXF1aXZhbGVudCB0byBAVHtsdWFfY3JlYXRldGFibGUoTCwgMCwgMCl9LgorCit9CisKK0BBUElFbnRyeXtsdWFfU3RhdGUgKmx1YV9uZXd0aHJlYWQgKGx1YV9TdGF0ZSAqTCk7fAorQGFwaWl7MCwxLG19CisKK0NyZWF0ZXMgYSBuZXcgdGhyZWFkLCBwdXNoZXMgaXQgb24gdGhlIHN0YWNrLAorYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGEgQExpZHtsdWFfU3RhdGV9IHRoYXQgcmVwcmVzZW50cyB0aGlzIG5ldyB0aHJlYWQuCitUaGUgbmV3IHRocmVhZCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIHNoYXJlcyB3aXRoIHRoZSBvcmlnaW5hbCB0aHJlYWQKK2l0cyBnbG9iYWwgZW52aXJvbm1lbnQsCitidXQgaGFzIGFuIGluZGVwZW5kZW50IGV4ZWN1dGlvbiBzdGFjay4KKworVGhlcmUgaXMgbm8gZXhwbGljaXQgZnVuY3Rpb24gdG8gY2xvc2Ugb3IgdG8gZGVzdHJveSBhIHRocmVhZC4KK1RocmVhZHMgYXJlIHN1YmplY3QgdG8gZ2FyYmFnZSBjb2xsZWN0aW9uLAorbGlrZSBhbnkgTHVhIG9iamVjdC4KKworfQorCitAQVBJRW50cnl7dm9pZCAqbHVhX25ld3VzZXJkYXRhdXYgKGx1YV9TdGF0ZSAqTCwgc2l6ZV90IHNpemUsIGludCBudXZhbHVlKTt8CitAYXBpaXswLDEsbX0KKworVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuZCBwdXNoZXMgb24gdGhlIHN0YWNrIGEgbmV3IGZ1bGwgdXNlcmRhdGEsCit3aXRoIEBpZHtudXZhbHVlfSBhc3NvY2lhdGVkIEx1YSB2YWx1ZXMgKGNhbGxlZCBAaWR7dXNlciB2YWx1ZXN9KQorcGx1cyBhbiBhc3NvY2lhdGVkIGJsb2NrIG9mIHJhdyBtZW1vcnkgd2l0aCBAaWR7c2l6ZX0gYnl0ZXMuCisoVGhlIHVzZXIgdmFsdWVzIGNhbiBiZSBzZXQgYW5kIHJlYWQgd2l0aCB0aGUgZnVuY3Rpb25zCitATGlke2x1YV9zZXRpdXNlcnZhbHVlfSBhbmQgQExpZHtsdWFfZ2V0aXVzZXJ2YWx1ZX0uKQorCitUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgYmxvY2sgb2YgbWVtb3J5LgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX25leHQgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXsxLDJ8MCx2fQorCitQb3BzIGEga2V5IGZyb20gdGhlIHN0YWNrLAorYW5kIHB1c2hlcyBhIGtleUBFbnt9dmFsdWUgcGFpciBmcm9tIHRoZSB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKyh0aGUgQFF7bmV4dH0gcGFpciBhZnRlciB0aGUgZ2l2ZW4ga2V5KS4KK0lmIHRoZXJlIGFyZSBubyBtb3JlIGVsZW1lbnRzIGluIHRoZSB0YWJsZSwKK3RoZW4gQExpZHtsdWFfbmV4dH0gcmV0dXJucyAwIChhbmQgcHVzaGVzIG5vdGhpbmcpLgorCitBIHR5cGljYWwgdHJhdmVyc2FsIGxvb2tzIGxpa2UgdGhpczoKK0B2ZXJiYXRpbXsKKy8qIHRhYmxlIGlzIGluIHRoZSBzdGFjayBhdCBpbmRleCAndCcgKi8KK2x1YV9wdXNobmlsKEwpOyAgLyogZmlyc3Qga2V5ICovCit3aGlsZSAobHVhX25leHQoTCwgdCkgIT0gMCkgeworICAvKiB1c2VzICdrZXknIChhdCBpbmRleCAtMikgYW5kICd2YWx1ZScgKGF0IGluZGV4IC0xKSAqLworICBwcmludGYoIiVzIC0gJXNcbiIsCisgICAgICAgICBsdWFfdHlwZW5hbWUoTCwgbHVhX3R5cGUoTCwgLTIpKSwKKyAgICAgICAgIGx1YV90eXBlbmFtZShMLCBsdWFfdHlwZShMLCAtMSkpKTsKKyAgLyogcmVtb3ZlcyAndmFsdWUnOyBrZWVwcyAna2V5JyBmb3IgbmV4dCBpdGVyYXRpb24gKi8KKyAgbHVhX3BvcChMLCAxKTsKK30KK30KKworV2hpbGUgdHJhdmVyc2luZyBhIHRhYmxlLAorZG8gbm90IGNhbGwgQExpZHtsdWFfdG9sc3RyaW5nfSBkaXJlY3RseSBvbiBhIGtleSwKK3VubGVzcyB5b3Uga25vdyB0aGF0IHRoZSBrZXkgaXMgYWN0dWFsbHkgYSBzdHJpbmcuCitSZWNhbGwgdGhhdCBATGlke2x1YV90b2xzdHJpbmd9IG1heSBjaGFuZ2UKK3RoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXg7Cit0aGlzIGNvbmZ1c2VzIHRoZSBuZXh0IGNhbGwgdG8gQExpZHtsdWFfbmV4dH0uCisKK1RoaXMgZnVuY3Rpb24gbWF5IHJhaXNlIGFuIGVycm9yIGlmIHRoZSBnaXZlbiBrZXkKK2lzIG5laXRoZXIgQG5pbCBub3IgcHJlc2VudCBpbiB0aGUgdGFibGUuCitTZWUgZnVuY3Rpb24gQExpZHtuZXh0fSBmb3IgdGhlIGNhdmVhdHMgb2YgbW9kaWZ5aW5nCit0aGUgdGFibGUgZHVyaW5nIGl0cyB0cmF2ZXJzYWwuCisKK30KKworQEFQSUVudHJ5e3R5cGVkZWYgQGxkb3RzIGx1YV9OdW1iZXI7fAorCitUaGUgdHlwZSBvZiBmbG9hdHMgaW4gTHVhLgorCitCeSBkZWZhdWx0IHRoaXMgdHlwZSBpcyBkb3VibGUsCitidXQgdGhhdCBjYW4gYmUgY2hhbmdlZCB0byBhIHNpbmdsZSBmbG9hdCBvciBhIGxvbmcgZG91YmxlLgorKFNlZSBAaWR7TFVBX0ZMT0FUX1RZUEV9IGluIEBpZHtsdWFjb25mLmh9LikKKworfQorCitAQVBJRW50cnl7aW50IGx1YV9udW1iZXJ0b2ludGVnZXIgKGx1YV9OdW1iZXIgbiwgbHVhX0ludGVnZXIgKnApO3wKKworQ29udmVydHMgYSBMdWEgZmxvYXQgdG8gYSBMdWEgaW50ZWdlci4KK1RoaXMgbWFjcm8gYXNzdW1lcyB0aGF0IEBpZHtufSBoYXMgYW4gaW50ZWdyYWwgdmFsdWUuCitJZiB0aGF0IHZhbHVlIGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgTHVhIGludGVnZXJzLAoraXQgaXMgY29udmVydGVkIHRvIGFuIGludGVnZXIgYW5kIGFzc2lnbmVkIHRvIEBUeypwfS4KK1RoZSBtYWNybyByZXN1bHRzIGluIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCitjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsLgorKE5vdGUgdGhhdCB0aGlzIHJhbmdlIHRlc3QgY2FuIGJlIHRyaWNreSB0byBkbworY29ycmVjdGx5IHdpdGhvdXQgdGhpcyBtYWNybywKK2R1ZSB0byByb3VuZGluZ3MuKQorCitUaGlzIG1hY3JvIG1heSBldmFsdWF0ZSBpdHMgYXJndW1lbnRzIG1vcmUgdGhhbiBvbmNlLgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX3BjYWxsIChsdWFfU3RhdGUgKkwsIGludCBuYXJncywgaW50IG5yZXN1bHRzLCBpbnQgbXNnaCk7fAorQGFwaWl7bmFyZ3MgKyAxLG5yZXN1bHRzfDEsLX0KKworQ2FsbHMgYSBmdW5jdGlvbiAob3IgYSBjYWxsYWJsZSBvYmplY3QpIGluIHByb3RlY3RlZCBtb2RlLgorCitCb3RoIEBpZHtuYXJnc30gYW5kIEBpZHtucmVzdWx0c30gaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzCitpbiBATGlke2x1YV9jYWxsfS4KK0lmIHRoZXJlIGFyZSBubyBlcnJvcnMgZHVyaW5nIHRoZSBjYWxsLAorQExpZHtsdWFfcGNhbGx9IGJlaGF2ZXMgZXhhY3RseSBsaWtlIEBMaWR7bHVhX2NhbGx9LgorSG93ZXZlciwgaWYgdGhlcmUgaXMgYW55IGVycm9yLAorQExpZHtsdWFfcGNhbGx9IGNhdGNoZXMgaXQsCitwdXNoZXMgYSBzaW5nbGUgdmFsdWUgb24gdGhlIHN0YWNrICh0aGUgZXJyb3Igb2JqZWN0KSwKK2FuZCByZXR1cm5zIGFuIGVycm9yIGNvZGUuCitMaWtlIEBMaWR7bHVhX2NhbGx9LAorQExpZHtsdWFfcGNhbGx9IGFsd2F5cyByZW1vdmVzIHRoZSBmdW5jdGlvbgorYW5kIGl0cyBhcmd1bWVudHMgZnJvbSB0aGUgc3RhY2suCisKK0lmIEBpZHttc2dofSBpcyAwLAordGhlbiB0aGUgZXJyb3Igb2JqZWN0IHJldHVybmVkIG9uIHRoZSBzdGFjaworaXMgZXhhY3RseSB0aGUgb3JpZ2luYWwgZXJyb3Igb2JqZWN0LgorT3RoZXJ3aXNlLCBAaWR7bXNnaH0gaXMgdGhlIHN0YWNrIGluZGV4IG9mIGEKK0BlbXBoe21lc3NhZ2UgaGFuZGxlcn0uCisoVGhpcyBpbmRleCBjYW5ub3QgYmUgYSBwc2V1ZG8taW5kZXguKQorSW4gY2FzZSBvZiBydW50aW1lIGVycm9ycywKK3RoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZXJyb3Igb2JqZWN0CithbmQgaXRzIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBvYmplY3QKK3JldHVybmVkIG9uIHRoZSBzdGFjayBieSBATGlke2x1YV9wY2FsbH0uCisKK1R5cGljYWxseSwgdGhlIG1lc3NhZ2UgaGFuZGxlciBpcyB1c2VkIHRvIGFkZCBtb3JlIGRlYnVnCitpbmZvcm1hdGlvbiB0byB0aGUgZXJyb3Igb2JqZWN0LCBzdWNoIGFzIGEgc3RhY2sgdHJhY2ViYWNrLgorU3VjaCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgZ2F0aGVyZWQgYWZ0ZXIgdGhlIHJldHVybiBvZiBATGlke2x1YV9wY2FsbH0sCitzaW5jZSBieSB0aGVuIHRoZSBzdGFjayBoYXMgdW53b3VuZC4KKworVGhlIEBMaWR7bHVhX3BjYWxsfSBmdW5jdGlvbiByZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50cworKGRlZmluZWQgaW4gQGlke2x1YS5ofSk6CitAZGVzY3JpcHRpb257CisKK0BpdGVte0BkZWZpZHtMVUFfT0t9ICgwKXwKK3N1Y2Nlc3MufQorCitAaXRlbXtAZGVmaWR7TFVBX0VSUlJVTn18CithIHJ1bnRpbWUgZXJyb3IuCit9CisKK0BpdGVte0BkZWZpZHtMVUFfRVJSTUVNfXwKK0B4e21lbW9yeSBhbGxvY2F0aW9uIGVycm9yfS4KK0ZvciBzdWNoIGVycm9ycywgTHVhIGRvZXMgbm90IGNhbGwgdGhlIEB4e21lc3NhZ2UgaGFuZGxlcn0uCit9CisKK0BpdGVte0BkZWZpZHtMVUFfRVJSRVJSfXwKK2Vycm9yIHdoaWxlIHJ1bm5pbmcgdGhlIEB4e21lc3NhZ2UgaGFuZGxlcn0uCit9CisKK0BpdGVte0BkZWZpZHtMVUFfRVJSR0NNTX18CitlcnJvciB3aGlsZSBydW5uaW5nIGEgQGlkeHtfX2djfSBtZXRhbWV0aG9kLgorRm9yIHN1Y2ggZXJyb3JzLCBMdWEgZG9lcyBub3QgY2FsbCB0aGUgQHh7bWVzc2FnZSBoYW5kbGVyfQorKGFzIHRoaXMga2luZCBvZiBlcnJvciB0eXBpY2FsbHkgaGFzIG5vIHJlbGF0aW9uCit3aXRoIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQpLgorfQorCit9CisKK30KKworQEFQSUVudHJ5eworaW50IGx1YV9wY2FsbGsgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICBpbnQgbmFyZ3MsCisgICAgICAgICAgICAgICAgaW50IG5yZXN1bHRzLAorICAgICAgICAgICAgICAgIGludCBtc2doLAorICAgICAgICAgICAgICAgIGx1YV9LQ29udGV4dCBjdHgsCisgICAgICAgICAgICAgICAgbHVhX0tGdW5jdGlvbiBrKTt8CitAYXBpaXtuYXJncyArIDEsbnJlc3VsdHN8MSwtfQorCitUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgZXhhY3RseSBsaWtlIEBMaWR7bHVhX3BjYWxsfSwKK2J1dCBhbGxvd3MgdGhlIGNhbGxlZCBmdW5jdGlvbiB0byB5aWVsZCBAc2Vle2NvbnRpbnVhdGlvbnN9LgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9wb3AgKGx1YV9TdGF0ZSAqTCwgaW50IG4pO3wKK0BhcGlpe24sMCwtfQorCitQb3BzIEBpZHtufSBlbGVtZW50cyBmcm9tIHRoZSBzdGFjay4KKworfQorCitAQVBJRW50cnl7dm9pZCBsdWFfcHVzaGJvb2xlYW4gKGx1YV9TdGF0ZSAqTCwgaW50IGIpO3wKK0BhcGlpezAsMSwtfQorCitQdXNoZXMgYSBib29sZWFuIHZhbHVlIHdpdGggdmFsdWUgQGlke2J9IG9udG8gdGhlIHN0YWNrLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9wdXNoY2Nsb3N1cmUgKGx1YV9TdGF0ZSAqTCwgbHVhX0NGdW5jdGlvbiBmbiwgaW50IG4pO3wKK0BhcGlpe24sMSxtfQorCitQdXNoZXMgYSBuZXcgQE57QyBjbG9zdXJlfSBvbnRvIHRoZSBzdGFjay4KK1RoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgYSBwb2ludGVyIHRvIGEgQE57QyBmdW5jdGlvbn0KK2FuZCBwdXNoZXMgb250byB0aGUgc3RhY2sgYSBMdWEgdmFsdWUgb2YgdHlwZSBAaWR7ZnVuY3Rpb259IHRoYXQsCit3aGVuIGNhbGxlZCwgaW52b2tlcyB0aGUgY29ycmVzcG9uZGluZyBATntDIGZ1bmN0aW9ufS4KK1RoZSBwYXJhbWV0ZXIgQGlke259IHRlbGxzIGhvdyBtYW55IHVwdmFsdWVzIHRoaXMgZnVuY3Rpb24gd2lsbCBoYXZlCitAc2Vle2MtY2xvc3VyZX0uCisKK0FueSBmdW5jdGlvbiB0byBiZSBjYWxsYWJsZSBieSBMdWEgbXVzdAorZm9sbG93IHRoZSBjb3JyZWN0IHByb3RvY29sIHRvIHJlY2VpdmUgaXRzIHBhcmFtZXRlcnMKK2FuZCByZXR1cm4gaXRzIHJlc3VsdHMgQHNlZUN7bHVhX0NGdW5jdGlvbn0uCisKK1doZW4gYSBATntDIGZ1bmN0aW9ufSBpcyBjcmVhdGVkLAoraXQgaXMgcG9zc2libGUgdG8gYXNzb2NpYXRlIHNvbWUgdmFsdWVzIHdpdGggaXQsCit0aHVzIGNyZWF0aW5nIGEgQHh7QE57QyBjbG9zdXJlfX0gQHNlZXtjLWNsb3N1cmV9OwordGhlc2UgdmFsdWVzIGFyZSB0aGVuIGFjY2Vzc2libGUgdG8gdGhlIGZ1bmN0aW9uIHdoZW5ldmVyIGl0IGlzIGNhbGxlZC4KK1RvIGFzc29jaWF0ZSB2YWx1ZXMgd2l0aCBhIEBOe0MgZnVuY3Rpb259LAorZmlyc3QgdGhlc2UgdmFsdWVzIG11c3QgYmUgcHVzaGVkIG9udG8gdGhlIHN0YWNrCisod2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgdmFsdWVzLCB0aGUgZmlyc3QgdmFsdWUgaXMgcHVzaGVkIGZpcnN0KS4KK1RoZW4gQExpZHtsdWFfcHVzaGNjbG9zdXJlfQoraXMgY2FsbGVkIHRvIGNyZWF0ZSBhbmQgcHVzaCB0aGUgQE57QyBmdW5jdGlvbn0gb250byB0aGUgc3RhY2ssCit3aXRoIHRoZSBhcmd1bWVudCBAaWR7bn0gdGVsbGluZyBob3cgbWFueSB2YWx1ZXMgd2lsbCBiZQorYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbi4KK0BMaWR7bHVhX3B1c2hjY2xvc3VyZX0gYWxzbyBwb3BzIHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBzdGFjay4KKworVGhlIG1heGltdW0gdmFsdWUgZm9yIEBpZHtufSBpcyAyNTUuCisKK1doZW4gQGlke259IGlzIHplcm8sCit0aGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBAZGVme2xpZ2h0IEBOe0MgZnVuY3Rpb259fSwKK3doaWNoIGlzIGp1c3QgYSBwb2ludGVyIHRvIHRoZSBATntDIGZ1bmN0aW9ufS4KK0luIHRoYXQgY2FzZSwgaXQgbmV2ZXIgcmFpc2VzIGEgbWVtb3J5IGVycm9yLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9wdXNoY2Z1bmN0aW9uIChsdWFfU3RhdGUgKkwsIGx1YV9DRnVuY3Rpb24gZik7fAorQGFwaWl7MCwxLC19CisKK1B1c2hlcyBhIEBOe0MgZnVuY3Rpb259IG9udG8gdGhlIHN0YWNrLgorCit9CisKK0BBUElFbnRyeXtjb25zdCBjaGFyICpsdWFfcHVzaGZzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZm10LCAuLi4pO3wKK0BhcGlpezAsMSx2fQorCitQdXNoZXMgb250byB0aGUgc3RhY2sgYSBmb3JtYXR0ZWQgc3RyaW5nCithbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJpbmcuCitJdCBpcyBzaW1pbGFyIHRvIHRoZSBAQU5TSXtzcHJpbnRmfSwKK2J1dCBoYXMgdHdvIGltcG9ydGFudCBkaWZmZXJlbmNlcy4KK0ZpcnN0LAoreW91IGRvIG5vdCBoYXZlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmVzdWx0OwordGhlIHJlc3VsdCBpcyBhIEx1YSBzdHJpbmcgYW5kIEx1YSB0YWtlcyBjYXJlIG9mIG1lbW9yeSBhbGxvY2F0aW9uCisoYW5kIGRlYWxsb2NhdGlvbiwgdGhyb3VnaCBnYXJiYWdlIGNvbGxlY3Rpb24pLgorU2Vjb25kLAordGhlIGNvbnZlcnNpb24gc3BlY2lmaWVycyBhcmUgcXVpdGUgcmVzdHJpY3RlZC4KK1RoZXJlIGFyZSBubyBmbGFncywgd2lkdGhzLCBvciBwcmVjaXNpb25zLgorVGhlIGNvbnZlcnNpb24gc3BlY2lmaWVycyBjYW4gb25seSBiZQorQENoYXJ7JSV9IChpbnNlcnRzIHRoZSBjaGFyYWN0ZXIgQENoYXJ7JX0pLAorQENoYXJ7JXN9IChpbnNlcnRzIGEgemVyby10ZXJtaW5hdGVkIHN0cmluZywgd2l0aCBubyBzaXplIHJlc3RyaWN0aW9ucyksCitAQ2hhcnslZn0gKGluc2VydHMgYSBATGlke2x1YV9OdW1iZXJ9KSwKK0BDaGFyeyVJfSAoaW5zZXJ0cyBhIEBMaWR7bHVhX0ludGVnZXJ9KSwKK0BDaGFyeyVwfSAoaW5zZXJ0cyBhIHBvaW50ZXIgYXMgYSBoZXhhZGVjaW1hbCBudW1lcmFsKSwKK0BDaGFyeyVkfSAoaW5zZXJ0cyBhbiBAVHtpbnR9KSwKK0BDaGFyeyVjfSAoaW5zZXJ0cyBhbiBAVHtpbnR9IGFzIGEgb25lLWJ5dGUgY2hhcmFjdGVyKSwgYW5kCitAQ2hhcnslVX0gKGluc2VydHMgYSBAVHtsb25nIGludH0gYXMgYSBAeHtVVEYtOH0gYnl0ZSBzZXF1ZW5jZSkuCisKK1RoaXMgZnVuY3Rpb24gbWF5IHJhaXNlIGVycm9ycyBkdWUgdG8gbWVtb3J5IG92ZXJmbG93CitvciBhbiBpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9wdXNoZ2xvYmFsdGFibGUgKGx1YV9TdGF0ZSAqTCk7fAorQGFwaWl7MCwxLC19CisKK1B1c2hlcyB0aGUgQHh7Z2xvYmFsIGVudmlyb25tZW50fSBvbnRvIHRoZSBzdGFjay4KKworfQorCitAQVBJRW50cnl7dm9pZCBsdWFfcHVzaGludGVnZXIgKGx1YV9TdGF0ZSAqTCwgbHVhX0ludGVnZXIgbik7fAorQGFwaWl7MCwxLC19CisKK1B1c2hlcyBhbiBpbnRlZ2VyIHdpdGggdmFsdWUgQGlke259IG9udG8gdGhlIHN0YWNrLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9wdXNobGlnaHR1c2VyZGF0YSAobHVhX1N0YXRlICpMLCB2b2lkICpwKTt8CitAYXBpaXswLDEsLX0KKworUHVzaGVzIGEgbGlnaHQgdXNlcmRhdGEgb250byB0aGUgc3RhY2suCisKK1VzZXJkYXRhIHJlcHJlc2VudCBATntDIHZhbHVlc30gaW4gTHVhLgorQSBAZGVme2xpZ2h0IHVzZXJkYXRhfSByZXByZXNlbnRzIGEgcG9pbnRlciwgYSBAVHt2b2lkKn0uCitJdCBpcyBhIHZhbHVlIChsaWtlIGEgbnVtYmVyKToKK3lvdSBkbyBub3QgY3JlYXRlIGl0LCBpdCBoYXMgbm8gaW5kaXZpZHVhbCBtZXRhdGFibGUsCithbmQgaXQgaXMgbm90IGNvbGxlY3RlZCAoYXMgaXQgd2FzIG5ldmVyIGNyZWF0ZWQpLgorQSBsaWdodCB1c2VyZGF0YSBpcyBlcXVhbCB0byBAUXthbnl9CitsaWdodCB1c2VyZGF0YSB3aXRoIHRoZSBzYW1lIEBOe0MgYWRkcmVzc30uCisKK30KKworQEFQSUVudHJ5e2NvbnN0IGNoYXIgKmx1YV9wdXNobGl0ZXJhbCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzKTt8CitAYXBpaXswLDEsbX0KKworVGhpcyBtYWNybyBpcyBlcXVpdmFsZW50IHRvIEBMaWR7bHVhX3B1c2hzdHJpbmd9LAorYnV0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBAaWR7c30gaXMgYSBsaXRlcmFsIHN0cmluZy4KKworfQorCitAQVBJRW50cnl7Y29uc3QgY2hhciAqbHVhX3B1c2hsc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pO3wKK0BhcGlpezAsMSxtfQorCitQdXNoZXMgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IEBpZHtzfSB3aXRoIHNpemUgQGlke2xlbn0KK29udG8gdGhlIHN0YWNrLgorTHVhIG1ha2VzIChvciByZXVzZXMpIGFuIGludGVybmFsIGNvcHkgb2YgdGhlIGdpdmVuIHN0cmluZywKK3NvIHRoZSBtZW1vcnkgYXQgQGlke3N9IGNhbiBiZSBmcmVlZCBvciByZXVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKK3RoZSBmdW5jdGlvbiByZXR1cm5zLgorVGhlIHN0cmluZyBjYW4gY29udGFpbiBhbnkgYmluYXJ5IGRhdGEsCitpbmNsdWRpbmcgQHh7ZW1iZWRkZWQgemVyb3N9LgorCitSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgY29weSBvZiB0aGUgc3RyaW5nLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9wdXNobmlsIChsdWFfU3RhdGUgKkwpO3wKK0BhcGlpezAsMSwtfQorCitQdXNoZXMgYSBuaWwgdmFsdWUgb250byB0aGUgc3RhY2suCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhX3B1c2hudW1iZXIgKGx1YV9TdGF0ZSAqTCwgbHVhX051bWJlciBuKTt8CitAYXBpaXswLDEsLX0KKworUHVzaGVzIGEgZmxvYXQgd2l0aCB2YWx1ZSBAaWR7bn0gb250byB0aGUgc3RhY2suCisKK30KKworQEFQSUVudHJ5e2NvbnN0IGNoYXIgKmx1YV9wdXNoc3RyaW5nIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKnMpO3wKK0BhcGlpezAsMSxtfQorCitQdXNoZXMgdGhlIHplcm8tdGVybWluYXRlZCBzdHJpbmcgcG9pbnRlZCB0byBieSBAaWR7c30KK29udG8gdGhlIHN0YWNrLgorTHVhIG1ha2VzIChvciByZXVzZXMpIGFuIGludGVybmFsIGNvcHkgb2YgdGhlIGdpdmVuIHN0cmluZywKK3NvIHRoZSBtZW1vcnkgYXQgQGlke3N9IGNhbiBiZSBmcmVlZCBvciByZXVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKK3RoZSBmdW5jdGlvbiByZXR1cm5zLgorCitSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgY29weSBvZiB0aGUgc3RyaW5nLgorCitJZiBAaWR7c30gaXMgQGlke05VTEx9LCBwdXNoZXMgQG5pbCBhbmQgcmV0dXJucyBAaWR7TlVMTH0uCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfcHVzaHRocmVhZCAobHVhX1N0YXRlICpMKTt8CitAYXBpaXswLDEsLX0KKworUHVzaGVzIHRoZSB0aHJlYWQgcmVwcmVzZW50ZWQgYnkgQGlke0x9IG9udG8gdGhlIHN0YWNrLgorUmV0dXJucyAxIGlmIHRoaXMgdGhyZWFkIGlzIHRoZSBAeHttYWluIHRocmVhZH0gb2YgaXRzIHN0YXRlLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9wdXNodmFsdWUgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXswLDEsLX0KKworUHVzaGVzIGEgY29weSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXgKK29udG8gdGhlIHN0YWNrLgorCit9CisKK0BBUElFbnRyeXsKK2NvbnN0IGNoYXIgKmx1YV9wdXNodmZzdHJpbmcgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncCk7fAorQGFwaWl7MCwxLHZ9CisKK0VxdWl2YWxlbnQgdG8gQExpZHtsdWFfcHVzaGZzdHJpbmd9LCBleGNlcHQgdGhhdCBpdCByZWNlaXZlcyBhIEBpZHt2YV9saXN0fQoraW5zdGVhZCBvZiBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfcmF3ZXF1YWwgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4MSwgaW50IGluZGV4Mik7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgMSBpZiB0aGUgdHdvIHZhbHVlcyBpbiBpbmRpY2VzIEBpZHtpbmRleDF9IGFuZAorQGlke2luZGV4Mn0gYXJlIHByaW1pdGl2ZWx5IGVxdWFsCisodGhhdCBpcywgd2l0aG91dCBjYWxsaW5nIHRoZSBAaWR4e19fZXF9IG1ldGFtZXRob2QpLgorT3RoZXJ3aXNlIEBOe3JldHVybnMgMH0uCitBbHNvIEBOe3JldHVybnMgMH0gaWYgYW55IG9mIHRoZSBpbmRpY2VzIGFyZSBub3QgdmFsaWQuCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfcmF3Z2V0IChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MSwxLC19CisKK1NpbWlsYXIgdG8gQExpZHtsdWFfZ2V0dGFibGV9LCBidXQgZG9lcyBhIHJhdyBhY2Nlc3MKKyhpLmUuLCB3aXRob3V0IG1ldGFtZXRob2RzKS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9yYXdnZXRpIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgbHVhX0ludGVnZXIgbik7fAorQGFwaWl7MCwxLC19CisKK1B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgdmFsdWUgQFR7dFtuXX0sCit3aGVyZSBAaWR7dH0gaXMgdGhlIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4KK1RoZSBhY2Nlc3MgaXMgcmF3LAordGhhdCBpcywgaXQgZG9lcyBub3QgaW52b2tlIHRoZSBAaWR4e19faW5kZXh9IG1ldGFtZXRob2QuCisKK1JldHVybnMgdGhlIHR5cGUgb2YgdGhlIHB1c2hlZCB2YWx1ZS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9yYXdnZXRwIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgY29uc3Qgdm9pZCAqcCk7fAorQGFwaWl7MCwxLC19CisKK1B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgdmFsdWUgQFR7dFtrXX0sCit3aGVyZSBAaWR7dH0gaXMgdGhlIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleCBhbmQKK0BpZHtrfSBpcyB0aGUgcG9pbnRlciBAaWR7cH0gcmVwcmVzZW50ZWQgYXMgYSBsaWdodCB1c2VyZGF0YS4KK1RoZSBhY2Nlc3MgaXMgcmF3OwordGhhdCBpcywgaXQgZG9lcyBub3QgaW52b2tlIHRoZSBAaWR4e19faW5kZXh9IG1ldGFtZXRob2QuCisKK1JldHVybnMgdGhlIHR5cGUgb2YgdGhlIHB1c2hlZCB2YWx1ZS4KKworfQorCitAQVBJRW50cnl7bHVhX1Vuc2lnbmVkIGx1YV9yYXdsZW4gKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXswLDAsLX0KKworUmV0dXJucyB0aGUgcmF3IEBRe2xlbmd0aH0gb2YgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleDoKK2ZvciBzdHJpbmdzLCB0aGlzIGlzIHRoZSBzdHJpbmcgbGVuZ3RoOworZm9yIHRhYmxlcywgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIHRoZSBsZW5ndGggb3BlcmF0b3IgKEBDaGFyeyN9KQord2l0aCBubyBtZXRhbWV0aG9kczsKK2ZvciB1c2VyZGF0YSwgdGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sgb2YgbWVtb3J5IGFsbG9jYXRlZAorZm9yIHRoZSB1c2VyZGF0YTsKK2ZvciBvdGhlciB2YWx1ZXMsIGl0IEBOe2lzIDB9LgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9yYXdzZXQgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXsyLDAsbX0KKworU2ltaWxhciB0byBATGlke2x1YV9zZXR0YWJsZX0sIGJ1dCBkb2VzIGEgcmF3IGFzc2lnbm1lbnQKKyhpLmUuLCB3aXRob3V0IG1ldGFtZXRob2RzKS4KKworfQorCitAQVBJRW50cnl7dm9pZCBsdWFfcmF3c2V0aSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIGx1YV9JbnRlZ2VyIGkpO3wKK0BhcGlpezEsMCxtfQorCitEb2VzIHRoZSBlcXVpdmFsZW50IG9mIEBUe3RbaV0gPSB2fSwKK3doZXJlIEBpZHt0fSBpcyB0aGUgdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4CithbmQgQGlke3Z9IGlzIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKworVGhpcyBmdW5jdGlvbiBwb3BzIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjay4KK1RoZSBhc3NpZ25tZW50IGlzIHJhdywKK3RoYXQgaXMsIGl0IGRvZXMgbm90IGludm9rZSB0aGUgQGlkeHtfX25ld2luZGV4fSBtZXRhbWV0aG9kLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9yYXdzZXRwIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgY29uc3Qgdm9pZCAqcCk7fAorQGFwaWl7MSwwLG19CisKK0RvZXMgdGhlIGVxdWl2YWxlbnQgb2YgQFR7dFtwXSA9IHZ9LAord2hlcmUgQGlke3R9IGlzIHRoZSB0YWJsZSBhdCB0aGUgZ2l2ZW4gaW5kZXgsCitAaWR7cH0gaXMgZW5jb2RlZCBhcyBhIGxpZ2h0IHVzZXJkYXRhLAorYW5kIEBpZHt2fSBpcyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suCisKK1RoaXMgZnVuY3Rpb24gcG9wcyB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2suCitUaGUgYXNzaWdubWVudCBpcyByYXcsCit0aGF0IGlzLCBpdCBkb2VzIG5vdCBpbnZva2UgQGlkeHtfX25ld2luZGV4fSBtZXRhbWV0aG9kLgorCit9CisKK0BBUElFbnRyeXsKK3R5cGVkZWYgY29uc3QgY2hhciAqICgqbHVhX1JlYWRlcikgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnNpemUpO3wKKworVGhlIHJlYWRlciBmdW5jdGlvbiB1c2VkIGJ5IEBMaWR7bHVhX2xvYWR9LgorRXZlcnkgdGltZSBpdCBuZWVkcyBhbm90aGVyIHBpZWNlIG9mIHRoZSBjaHVuaywKK0BMaWR7bHVhX2xvYWR9IGNhbGxzIHRoZSByZWFkZXIsCitwYXNzaW5nIGFsb25nIGl0cyBAaWR7ZGF0YX0gcGFyYW1ldGVyLgorVGhlIHJlYWRlciBtdXN0IHJldHVybiBhIHBvaW50ZXIgdG8gYSBibG9jayBvZiBtZW1vcnkKK3dpdGggYSBuZXcgcGllY2Ugb2YgdGhlIGNodW5rCithbmQgc2V0IEBpZHtzaXplfSB0byB0aGUgYmxvY2sgc2l6ZS4KK1RoZSBibG9jayBtdXN0IGV4aXN0IHVudGlsIHRoZSByZWFkZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGFnYWluLgorVG8gc2lnbmFsIHRoZSBlbmQgb2YgdGhlIGNodW5rLAordGhlIHJlYWRlciBtdXN0IHJldHVybiBAaWR7TlVMTH0gb3Igc2V0IEBpZHtzaXplfSB0byB6ZXJvLgorVGhlIHJlYWRlciBmdW5jdGlvbiBtYXkgcmV0dXJuIHBpZWNlcyBvZiBhbnkgc2l6ZSBncmVhdGVyIHRoYW4gemVyby4KKworfQorCitAQVBJRW50cnl7dm9pZCBsdWFfcmVnaXN0ZXIgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbmFtZSwgbHVhX0NGdW5jdGlvbiBmKTt8CitAYXBpaXswLDAsZX0KKworU2V0cyB0aGUgQE57QyBmdW5jdGlvbn0gQGlke2Z9IGFzIHRoZSBuZXcgdmFsdWUgb2YgZ2xvYmFsIEBpZHtuYW1lfS4KK0l0IGlzIGRlZmluZWQgYXMgYSBtYWNybzoKK0B2ZXJiYXRpbXsKKyNkZWZpbmUgbHVhX3JlZ2lzdGVyKEwsbixmKSBcCisgICAgICAgKGx1YV9wdXNoY2Z1bmN0aW9uKEwsIGYpLCBsdWFfc2V0Z2xvYmFsKEwsIG4pKQorfQorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9yZW1vdmUgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXsxLDAsLX0KKworUmVtb3ZlcyB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gdmFsaWQgaW5kZXgsCitzaGlmdGluZyBkb3duIHRoZSBlbGVtZW50cyBhYm92ZSB0aGlzIGluZGV4IHRvIGZpbGwgdGhlIGdhcC4KK1RoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIGEgcHNldWRvLWluZGV4LAorYmVjYXVzZSBhIHBzZXVkby1pbmRleCBpcyBub3QgYW4gYWN0dWFsIHN0YWNrIHBvc2l0aW9uLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9yZXBsYWNlIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MSwwLC19CisKK01vdmVzIHRoZSB0b3AgZWxlbWVudCBpbnRvIHRoZSBnaXZlbiB2YWxpZCBpbmRleAord2l0aG91dCBzaGlmdGluZyBhbnkgZWxlbWVudAorKHRoZXJlZm9yZSByZXBsYWNpbmcgdGhlIHZhbHVlIGF0IHRoYXQgZ2l2ZW4gaW5kZXgpLAorYW5kIHRoZW4gcG9wcyB0aGUgdG9wIGVsZW1lbnQuCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfcmVzdW1lIChsdWFfU3RhdGUgKkwsIGx1YV9TdGF0ZSAqZnJvbSwgaW50IG5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5yZXN1bHRzKTt8CitAYXBpaXs/LD8sLX0KKworU3RhcnRzIGFuZCByZXN1bWVzIGEgY29yb3V0aW5lIGluIHRoZSBnaXZlbiB0aHJlYWQgQGlke0x9LgorCitUbyBzdGFydCBhIGNvcm91dGluZSwKK3lvdSBwdXNoIG9udG8gdGhlIHRocmVhZCBzdGFjayB0aGUgbWFpbiBmdW5jdGlvbiBwbHVzIGFueSBhcmd1bWVudHM7Cit0aGVuIHlvdSBjYWxsIEBMaWR7bHVhX3Jlc3VtZX0sCit3aXRoIEBpZHtuYXJnc30gYmVpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCitUaGlzIGNhbGwgcmV0dXJucyB3aGVuIHRoZSBjb3JvdXRpbmUgc3VzcGVuZHMgb3IgZmluaXNoZXMgaXRzIGV4ZWN1dGlvbi4KK1doZW4gaXQgcmV0dXJucywKK0BpZHtucmVzdWx0c30gaXMgdXBkYXRlZCBhbmQKK3RoZSB0b3Agb2YgdGhlIHN0YWNrIGNvbnRhaW5zCit0aGUgQGlke25yZXN1bHRzfSB2YWx1ZXMgcGFzc2VkIHRvIEBMaWR7bHVhX3lpZWxkfQorb3IgcmV0dXJuZWQgYnkgdGhlIGJvZHkgZnVuY3Rpb24uCitATGlke2x1YV9yZXN1bWV9IHJldHVybnMKK0BMaWR7TFVBX1lJRUxEfSBpZiB0aGUgY29yb3V0aW5lIHlpZWxkcywKK0BMaWR7TFVBX09LfSBpZiB0aGUgY29yb3V0aW5lIGZpbmlzaGVzIGl0cyBleGVjdXRpb24KK3dpdGhvdXQgZXJyb3JzLAorb3IgYW4gZXJyb3IgY29kZSBpbiBjYXNlIG9mIGVycm9ycyBAc2VlQ3tsdWFfcGNhbGx9LgorCitJbiBjYXNlIG9mIGVycm9ycywKK3RoZSBzdGFjayBpcyBub3QgdW53b3VuZCwKK3NvIHlvdSBjYW4gdXNlIHRoZSBkZWJ1ZyBBUEkgb3ZlciBpdC4KK1RoZSBlcnJvciBvYmplY3QgaXMgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suCisKK1RvIHJlc3VtZSBhIGNvcm91dGluZSwKK3lvdSByZW1vdmUgYWxsIHJlc3VsdHMgZnJvbSB0aGUgbGFzdCBATGlke2x1YV95aWVsZH0sCitwdXQgb24gaXRzIHN0YWNrIG9ubHkgdGhlIHZhbHVlcyB0bworYmUgcGFzc2VkIGFzIHJlc3VsdHMgZnJvbSBAaWR7eWllbGR9LAorYW5kIHRoZW4gY2FsbCBATGlke2x1YV9yZXN1bWV9LgorCitUaGUgcGFyYW1ldGVyIEBpZHtmcm9tfSByZXByZXNlbnRzIHRoZSBjb3JvdXRpbmUgdGhhdCBpcyByZXN1bWluZyBAaWR7TH0uCitJZiB0aGVyZSBpcyBubyBzdWNoIGNvcm91dGluZSwKK3RoaXMgcGFyYW1ldGVyIGNhbiBiZSBAaWR7TlVMTH0uCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhX3JvdGF0ZSAobHVhX1N0YXRlICpMLCBpbnQgaWR4LCBpbnQgbik7fAorQGFwaWl7MCwwLC19CisKK1JvdGF0ZXMgdGhlIHN0YWNrIGVsZW1lbnRzIGJldHdlZW4gdGhlIHZhbGlkIGluZGV4IEBpZHtpZHh9CithbmQgdGhlIHRvcCBvZiB0aGUgc3RhY2suCitUaGUgZWxlbWVudHMgYXJlIHJvdGF0ZWQgQGlke259IHBvc2l0aW9ucyBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0b3AsCitmb3IgYSBwb3NpdGl2ZSBAaWR7bn0sCitvciBAVHstbn0gcG9zaXRpb25zIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJvdHRvbSwKK2ZvciBhIG5lZ2F0aXZlIEBpZHtufS4KK1RoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBAaWR7bn0gbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBzaXplCitvZiB0aGUgc2xpY2UgYmVpbmcgcm90YXRlZC4KK1RoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIGEgcHNldWRvLWluZGV4LAorYmVjYXVzZSBhIHBzZXVkby1pbmRleCBpcyBub3QgYW4gYWN0dWFsIHN0YWNrIHBvc2l0aW9uLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9zZXRhbGxvY2YgKGx1YV9TdGF0ZSAqTCwgbHVhX0FsbG9jIGYsIHZvaWQgKnVkKTt8CitAYXBpaXswLDAsLX0KKworQ2hhbmdlcyB0aGUgQHh7YWxsb2NhdG9yIGZ1bmN0aW9ufSBvZiBhIGdpdmVuIHN0YXRlIHRvIEBpZHtmfQord2l0aCB1c2VyIGRhdGEgQGlke3VkfS4KKworfQorCitAQVBJRW50cnl7dm9pZCBsdWFfc2V0ZmllbGQgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBjb25zdCBjaGFyICprKTt8CitAYXBpaXsxLDAsZX0KKworRG9lcyB0aGUgZXF1aXZhbGVudCB0byBAVHt0W2tdID0gdn0sCit3aGVyZSBAaWR7dH0gaXMgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleAorYW5kIEBpZHt2fSBpcyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suCisKK1RoaXMgZnVuY3Rpb24gcG9wcyB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2suCitBcyBpbiBMdWEsIHRoaXMgZnVuY3Rpb24gbWF5IHRyaWdnZXIgYSBtZXRhbWV0aG9kCitmb3IgdGhlIEBRe25ld2luZGV4fSBldmVudCBAc2Vle21ldGF0YWJsZX0uCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhX3NldGdsb2JhbCAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpuYW1lKTt8CitAYXBpaXsxLDAsZX0KKworUG9wcyBhIHZhbHVlIGZyb20gdGhlIHN0YWNrIGFuZAorc2V0cyBpdCBhcyB0aGUgbmV3IHZhbHVlIG9mIGdsb2JhbCBAaWR7bmFtZX0uCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhX3NldGkgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBsdWFfSW50ZWdlciBuKTt8CitAYXBpaXsxLDAsZX0KKworRG9lcyB0aGUgZXF1aXZhbGVudCB0byBAVHt0W25dID0gdn0sCit3aGVyZSBAaWR7dH0gaXMgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleAorYW5kIEBpZHt2fSBpcyB0aGUgdmFsdWUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suCisKK1RoaXMgZnVuY3Rpb24gcG9wcyB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2suCitBcyBpbiBMdWEsIHRoaXMgZnVuY3Rpb24gbWF5IHRyaWdnZXIgYSBtZXRhbWV0aG9kCitmb3IgdGhlIEBRe25ld2luZGV4fSBldmVudCBAc2Vle21ldGF0YWJsZX0uCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhX3NldG1ldGF0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpO3wKK0BhcGlpezEsMCwtfQorCitQb3BzIGEgdGFibGUgZnJvbSB0aGUgc3RhY2sgYW5kCitzZXRzIGl0IGFzIHRoZSBuZXcgbWV0YXRhYmxlIGZvciB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4LgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9zZXR0YWJsZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpO3wKK0BhcGlpezIsMCxlfQorCitEb2VzIHRoZSBlcXVpdmFsZW50IHRvIEBUe3Rba10gPSB2fSwKK3doZXJlIEBpZHt0fSBpcyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4LAorQGlke3Z9IGlzIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaywKK2FuZCBAaWR7a30gaXMgdGhlIHZhbHVlIGp1c3QgYmVsb3cgdGhlIHRvcC4KKworVGhpcyBmdW5jdGlvbiBwb3BzIGJvdGggdGhlIGtleSBhbmQgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrLgorQXMgaW4gTHVhLCB0aGlzIGZ1bmN0aW9uIG1heSB0cmlnZ2VyIGEgbWV0YW1ldGhvZAorZm9yIHRoZSBAUXtuZXdpbmRleH0gZXZlbnQgQHNlZXttZXRhdGFibGV9LgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV9zZXR0b3AgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXs/LD8sLX0KKworQWNjZXB0cyBhbnkgaW5kZXgsIEBOe29yIDB9LAorYW5kIHNldHMgdGhlIHN0YWNrIHRvcCB0byB0aGlzIGluZGV4LgorSWYgdGhlIG5ldyB0b3AgaXMgbGFyZ2VyIHRoYW4gdGhlIG9sZCBvbmUsCit0aGVuIHRoZSBuZXcgZWxlbWVudHMgYXJlIGZpbGxlZCB3aXRoIEBuaWwuCitJZiBAaWR7aW5kZXh9IEBOe2lzIDB9LCB0aGVuIGFsbCBzdGFjayBlbGVtZW50cyBhcmUgcmVtb3ZlZC4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9zZXRpdXNlcnZhbHVlIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgaW50IG4pO3wKK0BhcGlpezEsMCwtfQorCitQb3BzIGEgdmFsdWUgZnJvbSB0aGUgc3RhY2sgYW5kIHNldHMgaXQgYXMKK3RoZSBuZXcgQGlke259LXRoIHVzZXIgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGUKK2Z1bGwgdXNlcmRhdGEgYXQgdGhlIGdpdmVuIGluZGV4LgorUmV0dXJucyAwIGlmIHRoZSB1c2VyZGF0YSBkb2VzIG5vdCBoYXZlIHRoYXQgdmFsdWUuCisKK30KKworQEFQSUVudHJ5e3R5cGVkZWYgc3RydWN0IGx1YV9TdGF0ZSBsdWFfU3RhdGU7fAorCitBbiBvcGFxdWUgc3RydWN0dXJlIHRoYXQgcG9pbnRzIHRvIGEgdGhyZWFkIGFuZCBpbmRpcmVjdGx5CisodGhyb3VnaCB0aGUgdGhyZWFkKSB0byB0aGUgd2hvbGUgc3RhdGUgb2YgYSBMdWEgaW50ZXJwcmV0ZXIuCitUaGUgTHVhIGxpYnJhcnkgaXMgZnVsbHkgcmVlbnRyYW50OgoraXQgaGFzIG5vIGdsb2JhbCB2YXJpYWJsZXMuCitBbGwgaW5mb3JtYXRpb24gYWJvdXQgYSBzdGF0ZSBpcyBhY2Nlc3NpYmxlIHRocm91Z2ggdGhpcyBzdHJ1Y3R1cmUuCisKK0EgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBtdXN0IGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8KK2V2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBsaWJyYXJ5LCBleGNlcHQgdG8gQExpZHtsdWFfbmV3c3RhdGV9LAord2hpY2ggY3JlYXRlcyBhIEx1YSBzdGF0ZSBmcm9tIHNjcmF0Y2guCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfc3RhdHVzIChsdWFfU3RhdGUgKkwpO3wKK0BhcGlpezAsMCwtfQorCitSZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIHRocmVhZCBAaWR7TH0uCisKK1RoZSBzdGF0dXMgY2FuIGJlIDAgKEBMaWR7TFVBX09LfSkgZm9yIGEgbm9ybWFsIHRocmVhZCwKK2FuIGVycm9yIGNvZGUgaWYgdGhlIHRocmVhZCBmaW5pc2hlZCB0aGUgZXhlY3V0aW9uCitvZiBhIEBMaWR7bHVhX3Jlc3VtZX0gd2l0aCBhbiBlcnJvciwKK29yIEBkZWZpZHtMVUFfWUlFTER9IGlmIHRoZSB0aHJlYWQgaXMgc3VzcGVuZGVkLgorCitZb3UgY2FuIG9ubHkgY2FsbCBmdW5jdGlvbnMgaW4gdGhyZWFkcyB3aXRoIHN0YXR1cyBATGlke0xVQV9PS30uCitZb3UgY2FuIHJlc3VtZSB0aHJlYWRzIHdpdGggc3RhdHVzIEBMaWR7TFVBX09LfQorKHRvIHN0YXJ0IGEgbmV3IGNvcm91dGluZSkgb3IgQExpZHtMVUFfWUlFTER9CisodG8gcmVzdW1lIGEgY29yb3V0aW5lKS4KKworfQorCitAQVBJRW50cnl7c2l6ZV90IGx1YV9zdHJpbmd0b251bWJlciAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzKTt8CitAYXBpaXswLDEsLX0KKworQ29udmVydHMgdGhlIHplcm8tdGVybWluYXRlZCBzdHJpbmcgQGlke3N9IHRvIGEgbnVtYmVyLAorcHVzaGVzIHRoYXQgbnVtYmVyIGludG8gdGhlIHN0YWNrLAorYW5kIHJldHVybnMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHN0cmluZywKK3RoYXQgaXMsIGl0cyBsZW5ndGggcGx1cyBvbmUuCitUaGUgY29udmVyc2lvbiBjYW4gcmVzdWx0IGluIGFuIGludGVnZXIgb3IgYSBmbG9hdCwKK2FjY29yZGluZyB0byB0aGUgbGV4aWNhbCBjb252ZW50aW9ucyBvZiBMdWEgQHNlZXtsZXhpY2FsfS4KK1RoZSBzdHJpbmcgbWF5IGhhdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIGFuZCBhIHNpZ24uCitJZiB0aGUgc3RyaW5nIGlzIG5vdCBhIHZhbGlkIG51bWVyYWwsCityZXR1cm5zIDAgYW5kIHB1c2hlcyBub3RoaW5nLgorKE5vdGUgdGhhdCB0aGUgcmVzdWx0IGNhbiBiZSB1c2VkIGFzIGEgYm9vbGVhbiwKK3RydWUgaWYgdGhlIGNvbnZlcnNpb24gc3VjY2VlZHMuKQorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX3RvYm9vbGVhbiAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpO3wKK0BhcGlpezAsMCwtfQorCitDb252ZXJ0cyB0aGUgTHVhIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCB0byBhIEBOe0MgYm9vbGVhbn0KK3ZhbHVlIChATnswIG9yIDF9KS4KK0xpa2UgYWxsIHRlc3RzIGluIEx1YSwKK0BMaWR7bHVhX3RvYm9vbGVhbn0gcmV0dXJucyB0cnVlIGZvciBhbnkgTHVhIHZhbHVlCitkaWZmZXJlbnQgZnJvbSBAZmFsc2UgYW5kIEBuaWw7CitvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyhJZiB5b3Ugd2FudCB0byBhY2NlcHQgb25seSBhY3R1YWwgYm9vbGVhbiB2YWx1ZXMsCit1c2UgQExpZHtsdWFfaXNib29sZWFufSB0byB0ZXN0IHRoZSB2YWx1ZSdzIHR5cGUuKQorCit9CisKK0BBUElFbnRyeXtsdWFfQ0Z1bmN0aW9uIGx1YV90b2NmdW5jdGlvbiAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpO3wKK0BhcGlpezAsMCwtfQorCitDb252ZXJ0cyBhIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCB0byBhIEBOe0MgZnVuY3Rpb259LgorVGhhdCB2YWx1ZSBtdXN0IGJlIGEgQE57QyBmdW5jdGlvbn07CitvdGhlcndpc2UsIHJldHVybnMgQGlke05VTEx9LgorCit9CisKK0BBUElFbnRyeXtsdWFfSW50ZWdlciBsdWFfdG9pbnRlZ2VyIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MCwwLC19CisKK0VxdWl2YWxlbnQgdG8gQExpZHtsdWFfdG9pbnRlZ2VyeH0gd2l0aCBAaWR7aXNudW19IGVxdWFsIHRvIEBpZHtOVUxMfS4KKworfQorCitAQVBJRW50cnl7bHVhX0ludGVnZXIgbHVhX3RvaW50ZWdlcnggKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBpbnQgKmlzbnVtKTt8CitAYXBpaXswLDAsLX0KKworQ29udmVydHMgdGhlIEx1YSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKK3RvIHRoZSBzaWduZWQgaW50ZWdyYWwgdHlwZSBATGlke2x1YV9JbnRlZ2VyfS4KK1RoZSBMdWEgdmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyLAorb3IgYSBudW1iZXIgb3Igc3RyaW5nIGNvbnZlcnRpYmxlIHRvIGFuIGludGVnZXIgQHNlZXtjb2VyY2lvbn07CitvdGhlcndpc2UsIEBpZHtsdWFfdG9pbnRlZ2VyeH0gQE57cmV0dXJucyAwfS4KKworSWYgQGlke2lzbnVtfSBpcyBub3QgQGlke05VTEx9LAoraXRzIHJlZmVyZW50IGlzIGFzc2lnbmVkIGEgYm9vbGVhbiB2YWx1ZSB0aGF0CitpbmRpY2F0ZXMgd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KKworfQorCitAQVBJRW50cnl7Y29uc3QgY2hhciAqbHVhX3RvbHN0cmluZyAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIHNpemVfdCAqbGVuKTt8CitAYXBpaXswLDAsbX0KKworQ29udmVydHMgdGhlIEx1YSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggdG8gYSBATntDIHN0cmluZ30uCitJZiBAaWR7bGVufSBpcyBub3QgQGlke05VTEx9LAoraXQgc2V0cyBAVHsqbGVufSB3aXRoIHRoZSBzdHJpbmcgbGVuZ3RoLgorVGhlIEx1YSB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyOworb3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBAaWR7TlVMTH0uCitJZiB0aGUgdmFsdWUgaXMgYSBudW1iZXIsCit0aGVuIEBpZHtsdWFfdG9sc3RyaW5nfSBhbHNvCitAZW1waHtjaGFuZ2VzIHRoZSBhY3R1YWwgdmFsdWUgaW4gdGhlIHN0YWNrIHRvIGEgc3RyaW5nfS4KKyhUaGlzIGNoYW5nZSBjb25mdXNlcyBATGlke2x1YV9uZXh0fQord2hlbiBAaWR7bHVhX3RvbHN0cmluZ30gaXMgYXBwbGllZCB0byBrZXlzIGR1cmluZyBhIHRhYmxlIHRyYXZlcnNhbC4pCisKK0BpZHtsdWFfdG9sc3RyaW5nfSByZXR1cm5zIGEgcG9pbnRlcgordG8gYSBzdHJpbmcgaW5zaWRlIHRoZSBMdWEgc3RhdGUuCitUaGlzIHN0cmluZyBhbHdheXMgaGFzIGEgemVybyAoQENoYXJ7XDB9KQorYWZ0ZXIgaXRzIGxhc3QgY2hhcmFjdGVyIChhcyBATntpbiBDfSksCitidXQgY2FuIGNvbnRhaW4gb3RoZXIgemVyb3MgaW4gaXRzIGJvZHkuCisKK0JlY2F1c2UgTHVhIGhhcyBnYXJiYWdlIGNvbGxlY3Rpb24sCit0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgcG9pbnRlciByZXR1cm5lZCBieSBAaWR7bHVhX3RvbHN0cmluZ30KK3dpbGwgYmUgdmFsaWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgTHVhIHZhbHVlIGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RhY2suCisKK30KKworQEFQSUVudHJ5e2x1YV9OdW1iZXIgbHVhX3RvbnVtYmVyIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MCwwLC19CisKK0VxdWl2YWxlbnQgdG8gQExpZHtsdWFfdG9udW1iZXJ4fSB3aXRoIEBpZHtpc251bX0gZXF1YWwgdG8gQGlke05VTEx9LgorCit9CisKK0BBUElFbnRyeXtsdWFfTnVtYmVyIGx1YV90b251bWJlcnggKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBpbnQgKmlzbnVtKTt8CitAYXBpaXswLDAsLX0KKworQ29udmVydHMgdGhlIEx1YSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKK3RvIHRoZSBATntDIHR5cGV9IEBMaWR7bHVhX051bWJlcn0gQHNlZUN7bHVhX051bWJlcn0uCitUaGUgTHVhIHZhbHVlIG11c3QgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmcgY29udmVydGlibGUgdG8gYSBudW1iZXIKK0BzZWV7Y29lcmNpb259Oworb3RoZXJ3aXNlLCBATGlke2x1YV90b251bWJlcnh9IEBOe3JldHVybnMgMH0uCisKK0lmIEBpZHtpc251bX0gaXMgbm90IEBpZHtOVUxMfSwKK2l0cyByZWZlcmVudCBpcyBhc3NpZ25lZCBhIGJvb2xlYW4gdmFsdWUgdGhhdAoraW5kaWNhdGVzIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCisKK30KKworQEFQSUVudHJ5e2NvbnN0IHZvaWQgKmx1YV90b3BvaW50ZXIgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXswLDAsLX0KKworQ29udmVydHMgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCB0byBhIGdlbmVyaWMKK0BOe0MgcG9pbnRlcn0gKEBUe3ZvaWQqfSkuCitUaGUgdmFsdWUgY2FuIGJlIGEgdXNlcmRhdGEsIGEgdGFibGUsIGEgdGhyZWFkLCBvciBhIGZ1bmN0aW9uOworb3RoZXJ3aXNlLCBAaWR7bHVhX3RvcG9pbnRlcn0gcmV0dXJucyBAaWR7TlVMTH0uCitEaWZmZXJlbnQgb2JqZWN0cyB3aWxsIGdpdmUgZGlmZmVyZW50IHBvaW50ZXJzLgorVGhlcmUgaXMgbm8gd2F5IHRvIGNvbnZlcnQgdGhlIHBvaW50ZXIgYmFjayB0byBpdHMgb3JpZ2luYWwgdmFsdWUuCisKK1R5cGljYWxseSB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBmb3IgaGFzaGluZyBhbmQgZGVidWcgaW5mb3JtYXRpb24uCisKK30KKworQEFQSUVudHJ5e2NvbnN0IGNoYXIgKmx1YV90b3N0cmluZyAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpO3wKK0BhcGlpezAsMCxtfQorCitFcXVpdmFsZW50IHRvIEBMaWR7bHVhX3RvbHN0cmluZ30gd2l0aCBAaWR7bGVufSBlcXVhbCB0byBAaWR7TlVMTH0uCisKK30KKworQEFQSUVudHJ5e2x1YV9TdGF0ZSAqbHVhX3RvdGhyZWFkIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MCwwLC19CisKK0NvbnZlcnRzIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggdG8gYSBMdWEgdGhyZWFkCisocmVwcmVzZW50ZWQgYXMgQFR7bHVhX1N0YXRlKn0pLgorVGhpcyB2YWx1ZSBtdXN0IGJlIGEgdGhyZWFkOworb3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBAaWR7TlVMTH0uCisKK30KKworQEFQSUVudHJ5e3ZvaWQgKmx1YV90b3VzZXJkYXRhIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MCwwLC19CisKK0lmIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgYSBmdWxsIHVzZXJkYXRhLAorcmV0dXJucyBpdHMgbWVtb3J5LWJsb2NrIGFkZHJlc3MuCitJZiB0aGUgdmFsdWUgaXMgYSBsaWdodCB1c2VyZGF0YSwKK3JldHVybnMgaXRzIHBvaW50ZXIuCitPdGhlcndpc2UsIHJldHVybnMgQGlke05VTEx9LgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhX3R5cGUgKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTt8CitAYXBpaXswLDAsLX0KKworUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgaW4gdGhlIGdpdmVuIHZhbGlkIGluZGV4LAorb3IgQGlke0xVQV9UTk9ORX0gZm9yIGEgbm9uLXZhbGlkIChidXQgYWNjZXB0YWJsZSkgaW5kZXguCitUaGUgdHlwZXMgcmV0dXJuZWQgYnkgQExpZHtsdWFfdHlwZX0gYXJlIGNvZGVkIGJ5IHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzCitkZWZpbmVkIGluIEBpZHtsdWEuaH06CitAZGVmaWR7TFVBX1ROSUx9LAorQGRlZmlke0xVQV9UTlVNQkVSfSwKK0BkZWZpZHtMVUFfVEJPT0xFQU59LAorQGRlZmlke0xVQV9UU1RSSU5HfSwKK0BkZWZpZHtMVUFfVFRBQkxFfSwKK0BkZWZpZHtMVUFfVEZVTkNUSU9OfSwKK0BkZWZpZHtMVUFfVFVTRVJEQVRBfSwKK0BkZWZpZHtMVUFfVFRIUkVBRH0sCithbmQKK0BkZWZpZHtMVUFfVExJR0hUVVNFUkRBVEF9LgorCit9CisKK0BBUElFbnRyeXtjb25zdCBjaGFyICpsdWFfdHlwZW5hbWUgKGx1YV9TdGF0ZSAqTCwgaW50IHRwKTt8CitAYXBpaXswLDAsLX0KKworUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBlbmNvZGVkIGJ5IHRoZSB2YWx1ZSBAaWR7dHB9LAord2hpY2ggbXVzdCBiZSBvbmUgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBATGlke2x1YV90eXBlfS4KKworfQorCitAQVBJRW50cnl7dHlwZWRlZiBAbGRvdHMgbHVhX1Vuc2lnbmVkO3wKKworVGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgQExpZHtsdWFfSW50ZWdlcn0uCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfdXB2YWx1ZWluZGV4IChpbnQgaSk7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgdGhlIHBzZXVkby1pbmRleCB0aGF0IHJlcHJlc2VudHMgdGhlIEBpZHtpfS10aCB1cHZhbHVlIG9mCit0aGUgcnVubmluZyBmdW5jdGlvbiBAc2Vle2MtY2xvc3VyZX0uCisKK30KKworQEFQSUVudHJ5e2x1YV9OdW1iZXIgbHVhX3ZlcnNpb24gKGx1YV9TdGF0ZSAqTCk7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgY29yZS4KKworfQorCitAQVBJRW50cnl7Cit0eXBlZGVmIGludCAoKmx1YV9Xcml0ZXIpIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdWQpO3wKKworVGhlIHR5cGUgb2YgdGhlIHdyaXRlciBmdW5jdGlvbiB1c2VkIGJ5IEBMaWR7bHVhX2R1bXB9LgorRXZlcnkgdGltZSBpdCBwcm9kdWNlcyBhbm90aGVyIHBpZWNlIG9mIGNodW5rLAorQExpZHtsdWFfZHVtcH0gY2FsbHMgdGhlIHdyaXRlciwKK3Bhc3NpbmcgYWxvbmcgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuIChAaWR7cH0pLAoraXRzIHNpemUgKEBpZHtzen0pLAorYW5kIHRoZSBAaWR7ZGF0YX0gcGFyYW1ldGVyIHN1cHBsaWVkIHRvIEBMaWR7bHVhX2R1bXB9LgorCitUaGUgd3JpdGVyIHJldHVybnMgYW4gZXJyb3IgY29kZToKK0BOezAgbWVhbnN9IG5vIGVycm9yczsKK2FueSBvdGhlciB2YWx1ZSBtZWFucyBhbiBlcnJvciBhbmQgc3RvcHMgQExpZHtsdWFfZHVtcH0gZnJvbQorY2FsbGluZyB0aGUgd3JpdGVyIGFnYWluLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YV94bW92ZSAobHVhX1N0YXRlICpmcm9tLCBsdWFfU3RhdGUgKnRvLCBpbnQgbik7fAorQGFwaWl7Pyw/LC19CisKK0V4Y2hhbmdlIHZhbHVlcyBiZXR3ZWVuIGRpZmZlcmVudCB0aHJlYWRzIG9mIHRoZSBzYW1lIHN0YXRlLgorCitUaGlzIGZ1bmN0aW9uIHBvcHMgQGlke259IHZhbHVlcyBmcm9tIHRoZSBzdGFjayBAaWR7ZnJvbX0sCithbmQgcHVzaGVzIHRoZW0gb250byB0aGUgc3RhY2sgQGlke3RvfS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV95aWVsZCAobHVhX1N0YXRlICpMLCBpbnQgbnJlc3VsdHMpO3wKK0BhcGlpez8sPyx2fQorCitUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gQExpZHtsdWFfeWllbGRrfSwKK2J1dCBpdCBoYXMgbm8gY29udGludWF0aW9uIEBzZWV7Y29udGludWF0aW9uc30uCitUaGVyZWZvcmUsIHdoZW4gdGhlIHRocmVhZCByZXN1bWVzLAoraXQgY29udGludWVzIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxlZAordGhlIGZ1bmN0aW9uIGNhbGxpbmcgQGlke2x1YV95aWVsZH0uCitUbyBhdm9pZCBzdXJwcmlzZXMsCit0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBpbiBhIHRhaWwgY2FsbC4KKworfQorCisKK0BBUElFbnRyeXsKK2ludCBsdWFfeWllbGRrIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgaW50IG5yZXN1bHRzLAorICAgICAgICAgICAgICAgIGx1YV9LQ29udGV4dCBjdHgsCisgICAgICAgICAgICAgICAgbHVhX0tGdW5jdGlvbiBrKTt8CitAYXBpaXs/LD8sdn0KKworWWllbGRzIGEgY29yb3V0aW5lICh0aHJlYWQpLgorCitXaGVuIGEgQE57QyBmdW5jdGlvbn0gY2FsbHMgQExpZHtsdWFfeWllbGRrfSwKK3RoZSBydW5uaW5nIGNvcm91dGluZSBzdXNwZW5kcyBpdHMgZXhlY3V0aW9uLAorYW5kIHRoZSBjYWxsIHRvIEBMaWR7bHVhX3Jlc3VtZX0gdGhhdCBzdGFydGVkIHRoaXMgY29yb3V0aW5lIHJldHVybnMuCitUaGUgcGFyYW1ldGVyIEBpZHtucmVzdWx0c30gaXMgdGhlIG51bWJlciBvZiB2YWx1ZXMgZnJvbSB0aGUgc3RhY2sKK3RoYXQgd2lsbCBiZSBwYXNzZWQgYXMgcmVzdWx0cyB0byBATGlke2x1YV9yZXN1bWV9LgorCitXaGVuIHRoZSBjb3JvdXRpbmUgaXMgcmVzdW1lZCBhZ2FpbiwKK0x1YSBjYWxscyB0aGUgZ2l2ZW4gQHh7Y29udGludWF0aW9uIGZ1bmN0aW9ufSBAaWR7a30gdG8gY29udGludWUKK3RoZSBleGVjdXRpb24gb2YgdGhlIEBOe0MgZnVuY3Rpb259IHRoYXQgeWllbGRlZCBAc2Vle2NvbnRpbnVhdGlvbnN9LgorVGhpcyBjb250aW51YXRpb24gZnVuY3Rpb24gcmVjZWl2ZXMgdGhlIHNhbWUgc3RhY2sKK2Zyb20gdGhlIHByZXZpb3VzIGZ1bmN0aW9uLAord2l0aCB0aGUgQGlke259IHJlc3VsdHMgcmVtb3ZlZCBhbmQKK3JlcGxhY2VkIGJ5IHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIEBMaWR7bHVhX3Jlc3VtZX0uCitNb3Jlb3ZlciwKK3RoZSBjb250aW51YXRpb24gZnVuY3Rpb24gcmVjZWl2ZXMgdGhlIHZhbHVlIEBpZHtjdHh9Cit0aGF0IHdhcyBwYXNzZWQgdG8gQExpZHtsdWFfeWllbGRrfS4KKworVXN1YWxseSwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm47Cit3aGVuIHRoZSBjb3JvdXRpbmUgZXZlbnR1YWxseSByZXN1bWVzLAoraXQgY29udGludWVzIGV4ZWN1dGluZyB0aGUgY29udGludWF0aW9uIGZ1bmN0aW9uLgorSG93ZXZlciwgdGhlcmUgaXMgb25lIHNwZWNpYWwgY2FzZSwKK3doaWNoIGlzIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKK2Zyb20gaW5zaWRlIGEgbGluZSBvciBhIGNvdW50IGhvb2sgQHNlZXtkZWJ1Z0l9LgorSW4gdGhhdCBjYXNlLCBAaWR7bHVhX3lpZWxka30gc2hvdWxkIGJlIGNhbGxlZCB3aXRoIG5vIGNvbnRpbnVhdGlvbgorKHByb2JhYmx5IGluIHRoZSBmb3JtIG9mIEBMaWR7bHVhX3lpZWxkfSkgYW5kIG5vIHJlc3VsdHMsCithbmQgdGhlIGhvb2sgc2hvdWxkIHJldHVybiBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2FsbC4KK0x1YSB3aWxsIHlpZWxkIGFuZCwKK3doZW4gdGhlIGNvcm91dGluZSByZXN1bWVzIGFnYWluLAoraXQgd2lsbCBjb250aW51ZSB0aGUgbm9ybWFsIGV4ZWN1dGlvbgorb2YgdGhlIChMdWEpIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcmVkIHRoZSBob29rLgorCitUaGlzIGZ1bmN0aW9uIGNhbiByYWlzZSBhbiBlcnJvciBpZiBpdCBpcyBjYWxsZWQgZnJvbSBhIHRocmVhZAord2l0aCBhIHBlbmRpbmcgQyBjYWxsIHdpdGggbm8gY29udGludWF0aW9uIGZ1bmN0aW9uCisod2hhdCBpcyBjYWxsZWQgYSBAZW1waHh7Qy1jYWxsIGJvdW5kYXJ5fSwKK29yIGl0IGlzIGNhbGxlZCBmcm9tIGEgdGhyZWFkIHRoYXQgaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGEgcmVzdW1lCisodHlwaWNhbGx5IHRoZSBtYWluIHRocmVhZCkuCisKK30KKworfQorCitAc2VjdDJ7ZGVidWdJfCBAdGl0bGV7VGhlIERlYnVnIEludGVyZmFjZX0KKworTHVhIGhhcyBubyBidWlsdC1pbiBkZWJ1Z2dpbmcgZmFjaWxpdGllcy4KK0luc3RlYWQsIGl0IG9mZmVycyBhIHNwZWNpYWwgaW50ZXJmYWNlCitieSBtZWFucyBvZiBmdW5jdGlvbnMgYW5kIEBlbXBoe2hvb2tzfS4KK1RoaXMgaW50ZXJmYWNlIGFsbG93cyB0aGUgY29uc3RydWN0aW9uIG9mIGRpZmZlcmVudAora2luZHMgb2YgZGVidWdnZXJzLCBwcm9maWxlcnMsIGFuZCBvdGhlciB0b29scwordGhhdCBuZWVkIEBRe2luc2lkZSBpbmZvcm1hdGlvbn0gZnJvbSB0aGUgaW50ZXJwcmV0ZXIuCisKKworQEFQSUVudHJ5ewordHlwZWRlZiBzdHJ1Y3QgbHVhX0RlYnVnIHsKKyAgaW50IGV2ZW50OworICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgLyogKG4pICovCisgIGNvbnN0IGNoYXIgKm5hbWV3aGF0OyAgICAgICAvKiAobikgKi8KKyAgY29uc3QgY2hhciAqd2hhdDsgICAgICAgICAgIC8qIChTKSAqLworICBjb25zdCBjaGFyICpzb3VyY2U7ICAgICAgICAgLyogKFMpICovCisgIGludCBjdXJyZW50bGluZTsgICAgICAgICAgICAvKiAobCkgKi8KKyAgaW50IGxpbmVkZWZpbmVkOyAgICAgICAgICAgIC8qIChTKSAqLworICBpbnQgbGFzdGxpbmVkZWZpbmVkOyAgICAgICAgLyogKFMpICovCisgIHVuc2lnbmVkIGNoYXIgbnVwczsgICAgICAgICAvKiAodSkgbnVtYmVyIG9mIHVwdmFsdWVzICovCisgIHVuc2lnbmVkIGNoYXIgbnBhcmFtczsgICAgICAvKiAodSkgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKi8KKyAgY2hhciBpc3ZhcmFyZzsgICAgICAgICAgICAgIC8qICh1KSAqLworICBjaGFyIGlzdGFpbGNhbGw7ICAgICAgICAgICAgLyogKHQpICovCisgIHVuc2lnbmVkIHNob3J0IGZ0cmFuc2ZlcjsgICAvKiAocikgaW5kZXggb2YgZmlyc3QgdmFsdWUgdHJhbnNmZXJyZWQgKi8KKyAgdW5zaWduZWQgc2hvcnQgbnRyYW5zZmVyOyAgIC8qIChyKSBudW1iZXIgb2YgdHJhbnNmZXJyZWQgdmFsdWVzICovCisgIGNoYXIgc2hvcnRfc3JjW0xVQV9JRFNJWkVdOyAvKiAoUykgKi8KKyAgLyogcHJpdmF0ZSBwYXJ0ICovCisgIEByZXB7b3RoZXIgZmllbGRzfQorfSBsdWFfRGVidWc7Cit8CisKK0Egc3RydWN0dXJlIHVzZWQgdG8gY2FycnkgZGlmZmVyZW50IHBpZWNlcyBvZgoraW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvbiBvciBhbiBhY3RpdmF0aW9uIHJlY29yZC4KK0BMaWR7bHVhX2dldHN0YWNrfSBmaWxscyBvbmx5IHRoZSBwcml2YXRlIHBhcnQKK29mIHRoaXMgc3RydWN0dXJlLCBmb3IgbGF0ZXIgdXNlLgorVG8gZmlsbCB0aGUgb3RoZXIgZmllbGRzIG9mIEBMaWR7bHVhX0RlYnVnfSB3aXRoIHVzZWZ1bCBpbmZvcm1hdGlvbiwKK2NhbGwgQExpZHtsdWFfZ2V0aW5mb30uCisKK1RoZSBmaWVsZHMgb2YgQExpZHtsdWFfRGVidWd9IGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nOgorQGRlc2NyaXB0aW9ueworCitAaXRlbXtAaWR7c291cmNlfXwKK3RoZSBuYW1lIG9mIHRoZSBjaHVuayB0aGF0IGNyZWF0ZWQgdGhlIGZ1bmN0aW9uLgorSWYgQFR7c291cmNlfSBzdGFydHMgd2l0aCBhIEBDaGFye0BBdH0sCitpdCBtZWFucyB0aGF0IHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZCBpbiBhIGZpbGUgd2hlcmUKK3RoZSBmaWxlIG5hbWUgZm9sbG93cyB0aGUgQENoYXJ7QEF0fS4KK0lmIEBUe3NvdXJjZX0gc3RhcnRzIHdpdGggYSBAQ2hhcns9fSwKK3RoZSByZW1haW5kZXIgb2YgaXRzIGNvbnRlbnRzIGRlc2NyaWJlIHRoZSBzb3VyY2UgaW4gYSB1c2VyLWRlcGVuZGVudCBtYW5uZXIuCitPdGhlcndpc2UsCit0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQgaW4gYSBzdHJpbmcgd2hlcmUKK0BUe3NvdXJjZX0gaXMgdGhhdCBzdHJpbmcuCit9CisKK0BpdGVte0BpZHtzaG9ydF9zcmN9fAorYSBAUXtwcmludGFibGV9IHZlcnNpb24gb2YgQFR7c291cmNlfSwgdG8gYmUgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy4KK30KKworQGl0ZW17QGlke2xpbmVkZWZpbmVkfXwKK3RoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb24gc3RhcnRzLgorfQorCitAaXRlbXtAaWR7bGFzdGxpbmVkZWZpbmVkfXwKK3RoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb24gZW5kcy4KK30KKworQGl0ZW17QGlke3doYXR9fAordGhlIHN0cmluZyBAVHsiTHVhIn0gaWYgdGhlIGZ1bmN0aW9uIGlzIGEgTHVhIGZ1bmN0aW9uLAorQFR7IkMifSBpZiBpdCBpcyBhIEBOe0MgZnVuY3Rpb259LAorQFR7Im1haW4ifSBpZiBpdCBpcyB0aGUgbWFpbiBwYXJ0IG9mIGEgY2h1bmsuCit9CisKK0BpdGVte0BpZHtjdXJyZW50bGluZX18Cit0aGUgY3VycmVudCBsaW5lIHdoZXJlIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBleGVjdXRpbmcuCitXaGVuIG5vIGxpbmUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLAorQFR7Y3VycmVudGxpbmV9IGlzIHNldCB0byBAbnVtey0xfS4KK30KKworQGl0ZW17QGlke25hbWV9fAorYSByZWFzb25hYmxlIG5hbWUgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbi4KK0JlY2F1c2UgZnVuY3Rpb25zIGluIEx1YSBhcmUgZmlyc3QtY2xhc3MgdmFsdWVzLAordGhleSBkbyBub3QgaGF2ZSBhIGZpeGVkIG5hbWU6Citzb21lIGZ1bmN0aW9ucyBjYW4gYmUgdGhlIHZhbHVlIG9mIG11bHRpcGxlIGdsb2JhbCB2YXJpYWJsZXMsCit3aGlsZSBvdGhlcnMgY2FuIGJlIHN0b3JlZCBvbmx5IGluIGEgdGFibGUgZmllbGQuCitUaGUgQFR7bHVhX2dldGluZm99IGZ1bmN0aW9uIGNoZWNrcyBob3cgdGhlIGZ1bmN0aW9uIHdhcworY2FsbGVkIHRvIGZpbmQgYSBzdWl0YWJsZSBuYW1lLgorSWYgaXQgY2Fubm90IGZpbmQgYSBuYW1lLAordGhlbiBAaWR7bmFtZX0gaXMgc2V0IHRvIEBpZHtOVUxMfS4KK30KKworQGl0ZW17QGlke25hbWV3aGF0fXwKK2V4cGxhaW5zIHRoZSBAVHtuYW1lfSBmaWVsZC4KK1RoZSB2YWx1ZSBvZiBAVHtuYW1ld2hhdH0gY2FuIGJlCitAVHsiZ2xvYmFsIn0sIEBUeyJsb2NhbCJ9LCBAVHsibWV0aG9kIn0sCitAVHsiZmllbGQifSwgQFR7InVwdmFsdWUifSwgb3IgQFR7IiJ9ICh0aGUgZW1wdHkgc3RyaW5nKSwKK2FjY29yZGluZyB0byBob3cgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQuCisoTHVhIHVzZXMgdGhlIGVtcHR5IHN0cmluZyB3aGVuIG5vIG90aGVyIG9wdGlvbiBzZWVtcyB0byBhcHBseS4pCit9CisKK0BpdGVte0BpZHtpc3RhaWxjYWxsfXwKK3RydWUgaWYgdGhpcyBmdW5jdGlvbiBpbnZvY2F0aW9uIHdhcyBjYWxsZWQgYnkgYSB0YWlsIGNhbGwuCitJbiB0aGlzIGNhc2UsIHRoZSBjYWxsZXIgb2YgdGhpcyBsZXZlbCBpcyBub3QgaW4gdGhlIHN0YWNrLgorfQorCitAaXRlbXtAaWR7bnVwc318Cit0aGUgbnVtYmVyIG9mIHVwdmFsdWVzIG9mIHRoZSBmdW5jdGlvbi4KK30KKworQGl0ZW17QGlke25wYXJhbXN9fAordGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIG9mIHRoZSBmdW5jdGlvbgorKGFsd2F5cyBATnswIGZvcn0gQE57QyBmdW5jdGlvbnN9KS4KK30KKworQGl0ZW17QGlke2lzdmFyYXJnfXwKK3RydWUgaWYgdGhlIGZ1bmN0aW9uIGlzIGEgdmFyYXJnIGZ1bmN0aW9uCisoYWx3YXlzIHRydWUgZm9yIEBOe0MgZnVuY3Rpb25zfSkuCit9CisKK0BpdGVte0BpZHtmdHJhbnNmZXJ9fAordGhlIGluZGV4IG9uIHRoZSBzdGFjayBvZiB0aGUgZmlyc3QgdmFsdWUgYmVpbmcgQFF7dHJhbnNmZXJyZWR9LAordGhhdCBpcywgcGFyYW1ldGVycyBpbiBhIGNhbGwgb3IgcmV0dXJuIHZhbHVlcyBpbiBhIHJldHVybi4KKyhUaGUgb3RoZXIgdmFsdWVzIGFyZSBpbiBjb25zZWN1dGl2ZSBpbmRpY2VzLikKK1VzaW5nIHRoaXMgaW5kZXgsIHlvdSBjYW4gYWNjZXNzIGFuZCBtb2RpZnkgdGhlc2UgdmFsdWVzCit0aHJvdWdoIEBMaWR7bHVhX2dldGxvY2FsfSBhbmQgQExpZHtsdWFfc2V0bG9jYWx9LgorVGhpcyBmaWVsZCBpcyBvbmx5IG1lYW5pbmdmdWwgZHVyaW5nIGEKK2NhbGwgaG9vaywgZGVub3RpbmcgdGhlIGZpcnN0IHBhcmFtZXRlciwKK29yIGEgcmV0dXJuIGhvb2ssIGRlbm90aW5nIHRoZSBmaXJzdCB2YWx1ZSBiZWluZyByZXR1cm5lZC4KKyhGb3IgY2FsbCBob29rcywgdGhpcyB2YWx1ZSBpcyBhbHdheXMgMS4pCit9CisKK0BpdGVte0BpZHtudHJhbnNmZXJ9fAorVGhlIG51bWJlciBvZiB2YWx1ZXMgYmVpbmcgdHJhbnNmZXJyZWQgKHNlZSBwcmV2aW91cyBpdGVtKS4KKyhGb3IgY2FsbHMgb2YgTHVhIGZ1bmN0aW9ucywKK3RoaXMgdmFsdWUgaXMgYWx3YXlzIGVxdWFsIHRvIEBpZHtucGFyYW1zfS4pCit9CisKK30KKworfQorCitAQVBJRW50cnl7bHVhX0hvb2sgbHVhX2dldGhvb2sgKGx1YV9TdGF0ZSAqTCk7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgdGhlIGN1cnJlbnQgaG9vayBmdW5jdGlvbi4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9nZXRob29rY291bnQgKGx1YV9TdGF0ZSAqTCk7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgdGhlIGN1cnJlbnQgaG9vayBjb3VudC4KKworfQorCitAQVBJRW50cnl7aW50IGx1YV9nZXRob29rbWFzayAobHVhX1N0YXRlICpMKTt8CitAYXBpaXswLDAsLX0KKworUmV0dXJucyB0aGUgY3VycmVudCBob29rIG1hc2suCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfZ2V0aW5mbyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICp3aGF0LCBsdWFfRGVidWcgKmFyKTt8CitAYXBpaXswfDEsMHwxfDIsbX0KKworR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGZ1bmN0aW9uIG9yIGZ1bmN0aW9uIGludm9jYXRpb24uCisKK1RvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uIGludm9jYXRpb24sCit0aGUgcGFyYW1ldGVyIEBpZHthcn0gbXVzdCBiZSBhIHZhbGlkIGFjdGl2YXRpb24gcmVjb3JkIHRoYXQgd2FzCitmaWxsZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIEBMaWR7bHVhX2dldHN0YWNrfSBvcgorZ2l2ZW4gYXMgYXJndW1lbnQgdG8gYSBob29rIEBzZWVDe2x1YV9Ib29rfS4KKworVG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb24sIHlvdSBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCithbmQgc3RhcnQgdGhlIEBpZHt3aGF0fSBzdHJpbmcgd2l0aCB0aGUgY2hhcmFjdGVyIEBDaGFyez59LgorKEluIHRoYXQgY2FzZSwKK0BpZHtsdWFfZ2V0aW5mb30gcG9wcyB0aGUgZnVuY3Rpb24gZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjay4pCitGb3IgaW5zdGFuY2UsIHRvIGtub3cgaW4gd2hpY2ggbGluZSBhIGZ1bmN0aW9uIEBpZHtmfSB3YXMgZGVmaW5lZCwKK3lvdSBjYW4gd3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOgorQHZlcmJhdGlteworbHVhX0RlYnVnIGFyOworbHVhX2dldGdsb2JhbChMLCAiZiIpOyAgLyogZ2V0IGdsb2JhbCAnZicgKi8KK2x1YV9nZXRpbmZvKEwsICI+UyIsICZhcik7CitwcmludGYoIiVkXG4iLCBhci5saW5lZGVmaW5lZCk7Cit9CisKK0VhY2ggY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgQGlke3doYXR9CitzZWxlY3RzIHNvbWUgZmllbGRzIG9mIHRoZSBzdHJ1Y3R1cmUgQGlke2FyfSB0byBiZSBmaWxsZWQgb3IKK2EgdmFsdWUgdG8gYmUgcHVzaGVkIG9uIHRoZSBzdGFjazoKK0BkZXNjcmlwdGlvbnsKKworQGl0ZW17QENoYXJ7bn18IGZpbGxzIGluIHRoZSBmaWVsZCBAaWR7bmFtZX0gYW5kIEBpZHtuYW1ld2hhdH07Cit9CisKK0BpdGVte0BDaGFye1N9fAorZmlsbHMgaW4gdGhlIGZpZWxkcyBAaWR7c291cmNlfSwgQGlke3Nob3J0X3NyY30sCitAaWR7bGluZWRlZmluZWR9LCBAaWR7bGFzdGxpbmVkZWZpbmVkfSwgYW5kIEBpZHt3aGF0fTsKK30KKworQGl0ZW17QENoYXJ7bH18IGZpbGxzIGluIHRoZSBmaWVsZCBAaWR7Y3VycmVudGxpbmV9OworfQorCitAaXRlbXtAQ2hhcnt0fXwgZmlsbHMgaW4gdGhlIGZpZWxkIEBpZHtpc3RhaWxjYWxsfTsKK30KKworQGl0ZW17QENoYXJ7dX18IGZpbGxzIGluIHRoZSBmaWVsZHMKK0BpZHtudXBzfSwgQGlke25wYXJhbXN9LCBhbmQgQGlke2lzdmFyYXJnfTsKK30KKworQGl0ZW17QENoYXJ7Zn18CitwdXNoZXMgb250byB0aGUgc3RhY2sgdGhlIGZ1bmN0aW9uIHRoYXQgaXMKK3J1bm5pbmcgYXQgdGhlIGdpdmVuIGxldmVsOworfQorCitAaXRlbXtAQ2hhcntMfXwKK3B1c2hlcyBvbnRvIHRoZSBzdGFjayBhIHRhYmxlIHdob3NlIGluZGljZXMgYXJlIHRoZQorbnVtYmVycyBvZiB0aGUgbGluZXMgdGhhdCBhcmUgdmFsaWQgb24gdGhlIGZ1bmN0aW9uLgorKEEgQGVtcGh7dmFsaWQgbGluZX0gaXMgYSBsaW5lIHdpdGggc29tZSBhc3NvY2lhdGVkIGNvZGUsCit0aGF0IGlzLCBhIGxpbmUgd2hlcmUgeW91IGNhbiBwdXQgYSBicmVhayBwb2ludC4KK05vbi12YWxpZCBsaW5lcyBpbmNsdWRlIGVtcHR5IGxpbmVzIGFuZCBjb21tZW50cy4pCisKK0lmIHRoaXMgb3B0aW9uIGlzIGdpdmVuIHRvZ2V0aGVyIHdpdGggb3B0aW9uIEBDaGFye2Z9LAoraXRzIHRhYmxlIGlzIHB1c2hlZCBhZnRlciB0aGUgZnVuY3Rpb24uCisKK1RoaXMgaXMgdGhlIG9ubHkgb3B0aW9uIHRoYXQgY2FuIHJhaXNlIGEgbWVtb3J5IGVycm9yLgorfQorCit9CisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGlmIGdpdmVuIGFuIGludmFsaWQgb3B0aW9uIGluIEBpZHt3aGF0fS4KKworfQorCitAQVBJRW50cnl7Y29uc3QgY2hhciAqbHVhX2dldGxvY2FsIChsdWFfU3RhdGUgKkwsIGNvbnN0IGx1YV9EZWJ1ZyAqYXIsIGludCBuKTt8CitAYXBpaXswLDB8MSwtfQorCitHZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgbG9jYWwgdmFyaWFibGUgb3IgYSB0ZW1wb3JhcnkgdmFsdWUKK29mIGEgZ2l2ZW4gYWN0aXZhdGlvbiByZWNvcmQgb3IgYSBnaXZlbiBmdW5jdGlvbi4KKworSW4gdGhlIGZpcnN0IGNhc2UsCit0aGUgcGFyYW1ldGVyIEBpZHthcn0gbXVzdCBiZSBhIHZhbGlkIGFjdGl2YXRpb24gcmVjb3JkIHRoYXQgd2FzCitmaWxsZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIEBMaWR7bHVhX2dldHN0YWNrfSBvcgorZ2l2ZW4gYXMgYXJndW1lbnQgdG8gYSBob29rIEBzZWVDe2x1YV9Ib29rfS4KK1RoZSBpbmRleCBAaWR7bn0gc2VsZWN0cyB3aGljaCBsb2NhbCB2YXJpYWJsZSB0byBpbnNwZWN0Oworc2VlIEBMaWR7ZGVidWcuZ2V0bG9jYWx9IGZvciBkZXRhaWxzIGFib3V0IHZhcmlhYmxlIGluZGljZXMKK2FuZCBuYW1lcy4KKworQExpZHtsdWFfZ2V0bG9jYWx9IHB1c2hlcyB0aGUgdmFyaWFibGUncyB2YWx1ZSBvbnRvIHRoZSBzdGFjaworYW5kIHJldHVybnMgaXRzIG5hbWUuCisKK0luIHRoZSBzZWNvbmQgY2FzZSwgQGlke2FyfSBtdXN0IGJlIEBpZHtOVUxMfSBhbmQgdGhlIGZ1bmN0aW9uCit0byBiZSBpbnNwZWN0ZWQgbXVzdCBiZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KK0luIHRoaXMgY2FzZSwgb25seSBwYXJhbWV0ZXJzIG9mIEx1YSBmdW5jdGlvbnMgYXJlIHZpc2libGUKKyhhcyB0aGVyZSBpcyBubyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHZhcmlhYmxlcyBhcmUgYWN0aXZlKQorYW5kIG5vIHZhbHVlcyBhcmUgcHVzaGVkIG9udG8gdGhlIHN0YWNrLgorCitSZXR1cm5zIEBpZHtOVUxMfSAoYW5kIHB1c2hlcyBub3RoaW5nKQord2hlbiB0aGUgaW5kZXggaXMgZ3JlYXRlciB0aGFuCit0aGUgbnVtYmVyIG9mIGFjdGl2ZSBsb2NhbCB2YXJpYWJsZXMuCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFfZ2V0c3RhY2sgKGx1YV9TdGF0ZSAqTCwgaW50IGxldmVsLCBsdWFfRGVidWcgKmFyKTt8CitAYXBpaXswLDAsLX0KKworR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJwcmV0ZXIgcnVudGltZSBzdGFjay4KKworVGhpcyBmdW5jdGlvbiBmaWxscyBwYXJ0cyBvZiBhIEBMaWR7bHVhX0RlYnVnfSBzdHJ1Y3R1cmUgd2l0aAorYW4gaWRlbnRpZmljYXRpb24gb2YgdGhlIEBlbXBoe2FjdGl2YXRpb24gcmVjb3JkfQorb2YgdGhlIGZ1bmN0aW9uIGV4ZWN1dGluZyBhdCBhIGdpdmVuIGxldmVsLgorQE57TGV2ZWwgMH0gaXMgdGhlIGN1cnJlbnQgcnVubmluZyBmdW5jdGlvbiwKK3doZXJlYXMgbGV2ZWwgQE17bisxfSBpcyB0aGUgZnVuY3Rpb24gdGhhdCBoYXMgY2FsbGVkIGxldmVsIEBNe259CisoZXhjZXB0IGZvciB0YWlsIGNhbGxzLCB3aGljaCBkbyBub3QgY291bnQgb24gdGhlIHN0YWNrKS4KK1doZW4gdGhlcmUgYXJlIG5vIGVycm9ycywgQExpZHtsdWFfZ2V0c3RhY2t9IHJldHVybnMgMTsKK3doZW4gY2FsbGVkIHdpdGggYSBsZXZlbCBncmVhdGVyIHRoYW4gdGhlIHN0YWNrIGRlcHRoLAoraXQgcmV0dXJucyAwLgorCit9CisKK0BBUElFbnRyeXtjb25zdCBjaGFyICpsdWFfZ2V0dXB2YWx1ZSAobHVhX1N0YXRlICpMLCBpbnQgZnVuY2luZGV4LCBpbnQgbik7fAorQGFwaWl7MCwwfDEsLX0KKworR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQGlke259LXRoIHVwdmFsdWUKK29mIHRoZSBjbG9zdXJlIGF0IGluZGV4IEBpZHtmdW5jaW5kZXh9LgorSXQgcHVzaGVzIHRoZSB1cHZhbHVlJ3MgdmFsdWUgb250byB0aGUgc3RhY2sKK2FuZCByZXR1cm5zIGl0cyBuYW1lLgorUmV0dXJucyBAaWR7TlVMTH0gKGFuZCBwdXNoZXMgbm90aGluZykKK3doZW4gdGhlIGluZGV4IEBpZHtufSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiB1cHZhbHVlcy4KKworRm9yIEBOe0MgZnVuY3Rpb25zfSwgdGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBlbXB0eSBzdHJpbmcgQFR7IiJ9CithcyBhIG5hbWUgZm9yIGFsbCB1cHZhbHVlcy4KKyhGb3IgTHVhIGZ1bmN0aW9ucywKK3VwdmFsdWVzIGFyZSB0aGUgZXh0ZXJuYWwgbG9jYWwgdmFyaWFibGVzIHRoYXQgdGhlIGZ1bmN0aW9uIHVzZXMsCithbmQgdGhhdCBhcmUgY29uc2VxdWVudGx5IGluY2x1ZGVkIGluIGl0cyBjbG9zdXJlLikKKworVXB2YWx1ZXMgaGF2ZSBubyBwYXJ0aWN1bGFyIG9yZGVyLAorYXMgdGhleSBhcmUgYWN0aXZlIHRocm91Z2ggdGhlIHdob2xlIGZ1bmN0aW9uLgorVGhleSBhcmUgbnVtYmVyZWQgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyLgorCit9CisKK0BBUElFbnRyeXt0eXBlZGVmIHZvaWQgKCpsdWFfSG9vaykgKGx1YV9TdGF0ZSAqTCwgbHVhX0RlYnVnICphcik7fAorCitUeXBlIGZvciBkZWJ1Z2dpbmcgaG9vayBmdW5jdGlvbnMuCisKK1doZW5ldmVyIGEgaG9vayBpcyBjYWxsZWQsIGl0cyBAaWR7YXJ9IGFyZ3VtZW50IGhhcyBpdHMgZmllbGQKK0BpZHtldmVudH0gc2V0IHRvIHRoZSBzcGVjaWZpYyBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgaG9vay4KK0x1YSBpZGVudGlmaWVzIHRoZXNlIGV2ZW50cyB3aXRoIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorQGRlZmlke0xVQV9IT09LQ0FMTH0sIEBkZWZpZHtMVUFfSE9PS1JFVH0sCitAZGVmaWR7TFVBX0hPT0tUQUlMQ0FMTH0sIEBkZWZpZHtMVUFfSE9PS0xJTkV9LAorYW5kIEBkZWZpZHtMVUFfSE9PS0NPVU5UfS4KK01vcmVvdmVyLCBmb3IgbGluZSBldmVudHMsIHRoZSBmaWVsZCBAaWR7Y3VycmVudGxpbmV9IGlzIGFsc28gc2V0LgorVG8gZ2V0IHRoZSB2YWx1ZSBvZiBhbnkgb3RoZXIgZmllbGQgaW4gQGlke2FyfSwKK3RoZSBob29rIG11c3QgY2FsbCBATGlke2x1YV9nZXRpbmZvfS4KKworRm9yIGNhbGwgZXZlbnRzLCBAaWR7ZXZlbnR9IGNhbiBiZSBAaWR7TFVBX0hPT0tDQUxMfSwKK3RoZSBub3JtYWwgdmFsdWUsIG9yIEBpZHtMVUFfSE9PS1RBSUxDQUxMfSwgZm9yIGEgdGFpbCBjYWxsOworaW4gdGhpcyBjYXNlLCB0aGVyZSB3aWxsIGJlIG5vIGNvcnJlc3BvbmRpbmcgcmV0dXJuIGV2ZW50LgorCitXaGlsZSBMdWEgaXMgcnVubmluZyBhIGhvb2ssIGl0IGRpc2FibGVzIG90aGVyIGNhbGxzIHRvIGhvb2tzLgorVGhlcmVmb3JlLCBpZiBhIGhvb2sgY2FsbHMgYmFjayBMdWEgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIG9yIGEgY2h1bmssCit0aGlzIGV4ZWN1dGlvbiBvY2N1cnMgd2l0aG91dCBhbnkgY2FsbHMgdG8gaG9va3MuCisKK0hvb2sgZnVuY3Rpb25zIGNhbm5vdCBoYXZlIGNvbnRpbnVhdGlvbnMsCit0aGF0IGlzLCB0aGV5IGNhbm5vdCBjYWxsIEBMaWR7bHVhX3lpZWxka30sCitATGlke2x1YV9wY2FsbGt9LCBvciBATGlke2x1YV9jYWxsa30gd2l0aCBhIG5vbi1udWxsIEBpZHtrfS4KKworSG9vayBmdW5jdGlvbnMgY2FuIHlpZWxkIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKK09ubHkgY291bnQgYW5kIGxpbmUgZXZlbnRzIGNhbiB5aWVsZDsKK3RvIHlpZWxkLCBhIGhvb2sgZnVuY3Rpb24gbXVzdCBmaW5pc2ggaXRzIGV4ZWN1dGlvbgorY2FsbGluZyBATGlke2x1YV95aWVsZH0gd2l0aCBAaWR7bnJlc3VsdHN9IGVxdWFsIHRvIHplcm8KKyh0aGF0IGlzLCB3aXRoIG5vIHZhbHVlcykuCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhX3NldGhvb2sgKGx1YV9TdGF0ZSAqTCwgbHVhX0hvb2sgZiwgaW50IG1hc2ssIGludCBjb3VudCk7fAorQGFwaWl7MCwwLC19CisKK1NldHMgdGhlIGRlYnVnZ2luZyBob29rIGZ1bmN0aW9uLgorCitBcmd1bWVudCBAaWR7Zn0gaXMgdGhlIGhvb2sgZnVuY3Rpb24uCitAaWR7bWFza30gc3BlY2lmaWVzIG9uIHdoaWNoIGV2ZW50cyB0aGUgaG9vayB3aWxsIGJlIGNhbGxlZDoKK2l0IGlzIGZvcm1lZCBieSBhIGJpdHdpc2UgT1Igb2YgdGhlIGNvbnN0YW50cworQGRlZmlke0xVQV9NQVNLQ0FMTH0sCitAZGVmaWR7TFVBX01BU0tSRVR9LAorQGRlZmlke0xVQV9NQVNLTElORX0sCithbmQgQGRlZmlke0xVQV9NQVNLQ09VTlR9LgorVGhlIEBpZHtjb3VudH0gYXJndW1lbnQgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gdGhlIG1hc2sKK2luY2x1ZGVzIEBpZHtMVUFfTUFTS0NPVU5UfS4KK0ZvciBlYWNoIGV2ZW50LCB0aGUgaG9vayBpcyBjYWxsZWQgYXMgZXhwbGFpbmVkIGJlbG93OgorQGRlc2NyaXB0aW9ueworCitAaXRlbXtUaGUgY2FsbCBob29rfCBpcyBjYWxsZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgY2FsbHMgYSBmdW5jdGlvbi4KK1RoZSBob29rIGlzIGNhbGxlZCBqdXN0IGFmdGVyIEx1YSBlbnRlcnMgdGhlIG5ldyBmdW5jdGlvbiwKK2JlZm9yZSB0aGUgZnVuY3Rpb24gZ2V0cyBpdHMgYXJndW1lbnRzLgorfQorCitAaXRlbXtUaGUgcmV0dXJuIGhvb2t8IGlzIGNhbGxlZCB3aGVuIHRoZSBpbnRlcnByZXRlciByZXR1cm5zIGZyb20gYSBmdW5jdGlvbi4KK1RoZSBob29rIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBMdWEgbGVhdmVzIHRoZSBmdW5jdGlvbi4KK1RoZXJlIGlzIG5vIHN0YW5kYXJkIHdheSB0byBhY2Nlc3MgdGhlIHZhbHVlcwordG8gYmUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLgorfQorCitAaXRlbXtUaGUgbGluZSBob29rfCBpcyBjYWxsZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgaXMgYWJvdXQgdG8KK3N0YXJ0IHRoZSBleGVjdXRpb24gb2YgYSBuZXcgbGluZSBvZiBjb2RlLAorb3Igd2hlbiBpdCBqdW1wcyBiYWNrIGluIHRoZSBjb2RlIChldmVuIHRvIHRoZSBzYW1lIGxpbmUpLgorKFRoaXMgZXZlbnQgb25seSBoYXBwZW5zIHdoaWxlIEx1YSBpcyBleGVjdXRpbmcgYSBMdWEgZnVuY3Rpb24uKQorfQorCitAaXRlbXtUaGUgY291bnQgaG9va3wgaXMgY2FsbGVkIGFmdGVyIHRoZSBpbnRlcnByZXRlciBleGVjdXRlcyBldmVyeQorQFR7Y291bnR9IGluc3RydWN0aW9ucy4KKyhUaGlzIGV2ZW50IG9ubHkgaGFwcGVucyB3aGlsZSBMdWEgaXMgZXhlY3V0aW5nIGEgTHVhIGZ1bmN0aW9uLikKK30KKworfQorCitBIGhvb2sgaXMgZGlzYWJsZWQgYnkgc2V0dGluZyBAaWR7bWFza30gdG8gemVyby4KKworfQorCitAQVBJRW50cnl7Y29uc3QgY2hhciAqbHVhX3NldGxvY2FsIChsdWFfU3RhdGUgKkwsIGNvbnN0IGx1YV9EZWJ1ZyAqYXIsIGludCBuKTt8CitAYXBpaXswfDEsMCwtfQorCitTZXRzIHRoZSB2YWx1ZSBvZiBhIGxvY2FsIHZhcmlhYmxlIG9mIGEgZ2l2ZW4gYWN0aXZhdGlvbiByZWNvcmQuCitJdCBhc3NpZ25zIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawordG8gdGhlIHZhcmlhYmxlIGFuZCByZXR1cm5zIGl0cyBuYW1lLgorSXQgYWxzbyBwb3BzIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjay4KKworUmV0dXJucyBAaWR7TlVMTH0gKGFuZCBwb3BzIG5vdGhpbmcpCit3aGVuIHRoZSBpbmRleCBpcyBncmVhdGVyIHRoYW4KK3RoZSBudW1iZXIgb2YgYWN0aXZlIGxvY2FsIHZhcmlhYmxlcy4KKworUGFyYW1ldGVycyBAaWR7YXJ9IGFuZCBAaWR7bn0gYXJlIGFzIGluIGZ1bmN0aW9uIEBMaWR7bHVhX2dldGxvY2FsfS4KKworfQorCitAQVBJRW50cnl7Y29uc3QgY2hhciAqbHVhX3NldHVwdmFsdWUgKGx1YV9TdGF0ZSAqTCwgaW50IGZ1bmNpbmRleCwgaW50IG4pO3wKK0BhcGlpezB8MSwwLC19CisKK1NldHMgdGhlIHZhbHVlIG9mIGEgY2xvc3VyZSdzIHVwdmFsdWUuCitJdCBhc3NpZ25zIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawordG8gdGhlIHVwdmFsdWUgYW5kIHJldHVybnMgaXRzIG5hbWUuCitJdCBhbHNvIHBvcHMgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrLgorCitSZXR1cm5zIEBpZHtOVUxMfSAoYW5kIHBvcHMgbm90aGluZykKK3doZW4gdGhlIGluZGV4IEBpZHtufSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiB1cHZhbHVlcy4KKworUGFyYW1ldGVycyBAaWR7ZnVuY2luZGV4fSBhbmQgQGlke259IGFyZSBhcyBpbiBmdW5jdGlvbiBATGlke2x1YV9nZXR1cHZhbHVlfS4KKworfQorCitAQVBJRW50cnl7dm9pZCAqbHVhX3VwdmFsdWVpZCAobHVhX1N0YXRlICpMLCBpbnQgZnVuY2luZGV4LCBpbnQgbik7fAorQGFwaWl7MCwwLC19CisKK1JldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVwdmFsdWUgbnVtYmVyZWQgQGlke259Citmcm9tIHRoZSBjbG9zdXJlIGF0IGluZGV4IEBpZHtmdW5jaW5kZXh9LgorCitUaGVzZSB1bmlxdWUgaWRlbnRpZmllcnMgYWxsb3cgYSBwcm9ncmFtIHRvIGNoZWNrIHdoZXRoZXIgZGlmZmVyZW50CitjbG9zdXJlcyBzaGFyZSB1cHZhbHVlcy4KK0x1YSBjbG9zdXJlcyB0aGF0IHNoYXJlIGFuIHVwdmFsdWUKKyh0aGF0IGlzLCB0aGF0IGFjY2VzcyBhIHNhbWUgZXh0ZXJuYWwgbG9jYWwgdmFyaWFibGUpCit3aWxsIHJldHVybiBpZGVudGljYWwgaWRzIGZvciB0aG9zZSB1cHZhbHVlIGluZGljZXMuCisKK1BhcmFtZXRlcnMgQGlke2Z1bmNpbmRleH0gYW5kIEBpZHtufSBhcmUgYXMgaW4gZnVuY3Rpb24gQExpZHtsdWFfZ2V0dXB2YWx1ZX0sCitidXQgQGlke259IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiB1cHZhbHVlcy4KKworfQorCitAQVBJRW50cnl7Cit2b2lkIGx1YV91cHZhbHVlam9pbiAobHVhX1N0YXRlICpMLCBpbnQgZnVuY2luZGV4MSwgaW50IG4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZ1bmNpbmRleDIsIGludCBuMik7fAorQGFwaWl7MCwwLC19CisKK01ha2UgdGhlIEBpZHtuMX0tdGggdXB2YWx1ZSBvZiB0aGUgTHVhIGNsb3N1cmUgYXQgaW5kZXggQGlke2Z1bmNpbmRleDF9CityZWZlciB0byB0aGUgQGlke24yfS10aCB1cHZhbHVlIG9mIHRoZSBMdWEgY2xvc3VyZSBhdCBpbmRleCBAaWR7ZnVuY2luZGV4Mn0uCisKK30KKworfQorCit9CisKKworQEN7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLX0KK0BzZWN0MXtAdGl0bGV7VGhlIEF1eGlsaWFyeSBMaWJyYXJ5fQorCitAaW5kZXh7bGF1eGxpYi5ofQorVGhlIEBkZWZ7YXV4aWxpYXJ5IGxpYnJhcnl9IHByb3ZpZGVzIHNldmVyYWwgY29udmVuaWVudCBmdW5jdGlvbnMKK3RvIGludGVyZmFjZSBDIHdpdGggTHVhLgorV2hpbGUgdGhlIGJhc2ljIEFQSSBwcm92aWRlcyB0aGUgcHJpbWl0aXZlIGZ1bmN0aW9ucyBmb3IgYWxsCitpbnRlcmFjdGlvbnMgYmV0d2VlbiBDIGFuZCBMdWEsCit0aGUgYXV4aWxpYXJ5IGxpYnJhcnkgcHJvdmlkZXMgaGlnaGVyLWxldmVsIGZ1bmN0aW9ucyBmb3Igc29tZQorY29tbW9uIHRhc2tzLgorCitBbGwgZnVuY3Rpb25zIGFuZCB0eXBlcyBmcm9tIHRoZSBhdXhpbGlhcnkgbGlicmFyeQorYXJlIGRlZmluZWQgaW4gaGVhZGVyIGZpbGUgQGlke2xhdXhsaWIuaH0gYW5kCitoYXZlIGEgcHJlZml4IEBpZHtsdWFMX30uCisKK0FsbCBmdW5jdGlvbnMgaW4gdGhlIGF1eGlsaWFyeSBsaWJyYXJ5IGFyZSBidWlsdCBvbgordG9wIG9mIHRoZSBiYXNpYyBBUEksCithbmQgc28gdGhleSBwcm92aWRlIG5vdGhpbmcgdGhhdCBjYW5ub3QgYmUgZG9uZSB3aXRoIHRoYXQgQVBJLgorTmV2ZXJ0aGVsZXNzLCB0aGUgdXNlIG9mIHRoZSBhdXhpbGlhcnkgbGlicmFyeSBlbnN1cmVzCittb3JlIGNvbnNpc3RlbmN5IHRvIHlvdXIgY29kZS4KKworCitTZXZlcmFsIGZ1bmN0aW9ucyBpbiB0aGUgYXV4aWxpYXJ5IGxpYnJhcnkgdXNlIGludGVybmFsbHkgc29tZQorZXh0cmEgc3RhY2sgc2xvdHMuCitXaGVuIGEgZnVuY3Rpb24gaW4gdGhlIGF1eGlsaWFyeSBsaWJyYXJ5IHVzZXMgbGVzcyB0aGFuIGZpdmUgc2xvdHMsCitpdCBkb2VzIG5vdCBjaGVjayB0aGUgc3RhY2sgc2l6ZTsKK2l0IHNpbXBseSBhc3N1bWVzIHRoYXQgdGhlcmUgYXJlIGVub3VnaCBzbG90cy4KKworU2V2ZXJhbCBmdW5jdGlvbnMgaW4gdGhlIGF1eGlsaWFyeSBsaWJyYXJ5IGFyZSB1c2VkIHRvCitjaGVjayBATntDIGZ1bmN0aW9ufSBhcmd1bWVudHMuCitCZWNhdXNlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGZvcm1hdHRlZCBmb3IgYXJndW1lbnRzCisoZS5nLiwgQFN0e2JhZCBhcmd1bWVudCAjMX0pLAoreW91IHNob3VsZCBub3QgdXNlIHRoZXNlIGZ1bmN0aW9ucyBmb3Igb3RoZXIgc3RhY2sgdmFsdWVzLgorCitGdW5jdGlvbnMgY2FsbGVkIEBpZHtsdWFMX2NoZWNrKn0KK2Fsd2F5cyByYWlzZSBhbiBlcnJvciBpZiB0aGUgY2hlY2sgaXMgbm90IHNhdGlzZmllZC4KKworQHNlY3Qye0B0aXRsZXtGdW5jdGlvbnMgYW5kIFR5cGVzfQorCitIZXJlIHdlIGxpc3QgYWxsIGZ1bmN0aW9ucyBhbmQgdHlwZXMgZnJvbSB0aGUgYXV4aWxpYXJ5IGxpYnJhcnkKK2luIGFscGhhYmV0aWNhbCBvcmRlci4KKworCitAQVBJRW50cnl7dm9pZCBsdWFMX2FkZGNoYXIgKGx1YUxfQnVmZmVyICpCLCBjaGFyIGMpO3wKK0BhcGlpez8sPyxtfQorCitBZGRzIHRoZSBieXRlIEBpZHtjfSB0byB0aGUgYnVmZmVyIEBpZHtCfQorQHNlZUN7bHVhTF9CdWZmZXJ9LgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YUxfYWRkbHN0cmluZyAobHVhTF9CdWZmZXIgKkIsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsKTt8CitAYXBpaXs/LD8sbX0KKworQWRkcyB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgQGlke3N9IHdpdGggbGVuZ3RoIEBpZHtsfSB0bwordGhlIGJ1ZmZlciBAaWR7Qn0KK0BzZWVDe2x1YUxfQnVmZmVyfS4KK1RoZSBzdHJpbmcgY2FuIGNvbnRhaW4gQHh7ZW1iZWRkZWQgemVyb3N9LgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YUxfYWRkc2l6ZSAobHVhTF9CdWZmZXIgKkIsIHNpemVfdCBuKTt8CitAYXBpaXs/LD8sLX0KKworQWRkcyB0byB0aGUgYnVmZmVyIEBpZHtCfSBAc2VlQ3tsdWFMX0J1ZmZlcn0KK2Egc3RyaW5nIG9mIGxlbmd0aCBAaWR7bn0gcHJldmlvdXNseSBjb3BpZWQgdG8gdGhlCitidWZmZXIgYXJlYSBAc2VlQ3tsdWFMX3ByZXBidWZmZXJ9LgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YUxfYWRkc3RyaW5nIChsdWFMX0J1ZmZlciAqQiwgY29uc3QgY2hhciAqcyk7fAorQGFwaWl7Pyw/LG19CisKK0FkZHMgdGhlIHplcm8tdGVybWluYXRlZCBzdHJpbmcgcG9pbnRlZCB0byBieSBAaWR7c30KK3RvIHRoZSBidWZmZXIgQGlke0J9CitAc2VlQ3tsdWFMX0J1ZmZlcn0uCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhTF9hZGR2YWx1ZSAobHVhTF9CdWZmZXIgKkIpO3wKK0BhcGlpezEsPyxtfQorCitBZGRzIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawordG8gdGhlIGJ1ZmZlciBAaWR7Qn0KK0BzZWVDe2x1YUxfQnVmZmVyfS4KK1BvcHMgdGhlIHZhbHVlLgorCitUaGlzIGlzIHRoZSBvbmx5IGZ1bmN0aW9uIG9uIHN0cmluZyBidWZmZXJzIHRoYXQgY2FuIChhbmQgbXVzdCkKK2JlIGNhbGxlZCB3aXRoIGFuIGV4dHJhIGVsZW1lbnQgb24gdGhlIHN0YWNrLAord2hpY2ggaXMgdGhlIHZhbHVlIHRvIGJlIGFkZGVkIHRvIHRoZSBidWZmZXIuCisKK30KKworQEFQSUVudHJ5ewordm9pZCBsdWFMX2FyZ2NoZWNrIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICAgIGludCBjb25kLAorICAgICAgICAgICAgICAgICAgICBpbnQgYXJnLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleHRyYW1zZyk7fAorQGFwaWl7MCwwLHZ9CisKK0NoZWNrcyB3aGV0aGVyIEBpZHtjb25kfSBpcyB0cnVlLgorSWYgaXQgaXMgbm90LCByYWlzZXMgYW4gZXJyb3Igd2l0aCBhIHN0YW5kYXJkIG1lc3NhZ2UgQHNlZUZ7bHVhTF9hcmdlcnJvcn0uCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFMX2FyZ2Vycm9yIChsdWFfU3RhdGUgKkwsIGludCBhcmcsIGNvbnN0IGNoYXIgKmV4dHJhbXNnKTt8CitAYXBpaXswLDAsdn0KKworUmFpc2VzIGFuIGVycm9yIHJlcG9ydGluZyBhIHByb2JsZW0gd2l0aCBhcmd1bWVudCBAaWR7YXJnfQorb2YgdGhlIEBOe0MgZnVuY3Rpb259IHRoYXQgY2FsbGVkIGl0LAordXNpbmcgYSBzdGFuZGFyZCBtZXNzYWdlCit0aGF0IGluY2x1ZGVzIEBpZHtleHRyYW1zZ30gYXMgYSBjb21tZW50OgorQHZlcmJhdGlteworYmFkIGFyZ3VtZW50ICNAcmVwe2FyZ30gdG8gJ0ByZXB7ZnVuY25hbWV9JyAoQHJlcHtleHRyYW1zZ30pCit9CitUaGlzIGZ1bmN0aW9uIG5ldmVyIHJldHVybnMuCisKK30KKworQEFQSUVudHJ5e3R5cGVkZWYgc3RydWN0IGx1YUxfQnVmZmVyIGx1YUxfQnVmZmVyO3wKKworVHlwZSBmb3IgYSBAZGVme3N0cmluZyBidWZmZXJ9LgorCitBIHN0cmluZyBidWZmZXIgYWxsb3dzIEBOe0MgY29kZX0gdG8gYnVpbGQgTHVhIHN0cmluZ3MgcGllY2VtZWFsLgorSXRzIHBhdHRlcm4gb2YgdXNlIGlzIGFzIGZvbGxvd3M6CitAaXRlbWl6ZXsKKworQGl0ZW17Rmlyc3QgZGVjbGFyZSBhIHZhcmlhYmxlIEBpZHtifSBvZiB0eXBlIEBMaWR7bHVhTF9CdWZmZXJ9Ln0KKworQGl0ZW17VGhlbiBpbml0aWFsaXplIGl0IHdpdGggYSBjYWxsIEBUe2x1YUxfYnVmZmluaXQoTCwgJmIpfS59CisKK0BpdGVteworVGhlbiBhZGQgc3RyaW5nIHBpZWNlcyB0byB0aGUgYnVmZmVyIGNhbGxpbmcgYW55IG9mCit0aGUgQGlke2x1YUxfYWRkKn0gZnVuY3Rpb25zLgorfQorCitAaXRlbXsKK0ZpbmlzaCBieSBjYWxsaW5nIEBUe2x1YUxfcHVzaHJlc3VsdCgmYil9LgorVGhpcyBjYWxsIGxlYXZlcyB0aGUgZmluYWwgc3RyaW5nIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorfQorCit9CisKK0lmIHlvdSBrbm93IGJlZm9yZWhhbmQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcsCit5b3UgY2FuIHVzZSB0aGUgYnVmZmVyIGxpa2UgdGhpczoKK0BpdGVtaXpleworCitAaXRlbXtGaXJzdCBkZWNsYXJlIGEgdmFyaWFibGUgQGlke2J9IG9mIHR5cGUgQExpZHtsdWFMX0J1ZmZlcn0ufQorCitAaXRlbXtUaGVuIGluaXRpYWxpemUgaXQgYW5kIHByZWFsbG9jYXRlIGEgc3BhY2Ugb2YKK3NpemUgQGlke3N6fSB3aXRoIGEgY2FsbCBAVHtsdWFMX2J1ZmZpbml0c2l6ZShMLCAmYiwgc3opfS59CisKK0BpdGVte1RoZW4gcHJvZHVjZSB0aGUgc3RyaW5nIGludG8gdGhhdCBzcGFjZS59CisKK0BpdGVteworRmluaXNoIGJ5IGNhbGxpbmcgQFR7bHVhTF9wdXNocmVzdWx0c2l6ZSgmYiwgc3opfSwKK3doZXJlIEBpZHtzen0gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcKK2NvcGllZCBpbnRvIHRoYXQgc3BhY2UuCit9CisKK30KKworRHVyaW5nIGl0cyBub3JtYWwgb3BlcmF0aW9uLAorYSBzdHJpbmcgYnVmZmVyIHVzZXMgYSB2YXJpYWJsZSBudW1iZXIgb2Ygc3RhY2sgc2xvdHMuCitTbywgd2hpbGUgdXNpbmcgYSBidWZmZXIsIHlvdSBjYW5ub3QgYXNzdW1lIHRoYXQgeW91IGtub3cgd2hlcmUKK3RoZSB0b3Agb2YgdGhlIHN0YWNrIGlzLgorWW91IGNhbiB1c2UgdGhlIHN0YWNrIGJldHdlZW4gc3VjY2Vzc2l2ZSBjYWxscyB0byBidWZmZXIgb3BlcmF0aW9ucworYXMgbG9uZyBhcyB0aGF0IHVzZSBpcyBiYWxhbmNlZDsKK3RoYXQgaXMsCit3aGVuIHlvdSBjYWxsIGEgYnVmZmVyIG9wZXJhdGlvbiwKK3RoZSBzdGFjayBpcyBhdCB0aGUgc2FtZSBsZXZlbAoraXQgd2FzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBwcmV2aW91cyBidWZmZXIgb3BlcmF0aW9uLgorKFRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUgaXMgQExpZHtsdWFMX2FkZHZhbHVlfS4pCitBZnRlciBjYWxsaW5nIEBMaWR7bHVhTF9wdXNocmVzdWx0fSB0aGUgc3RhY2sgaXMgYmFjayB0byBpdHMKK2xldmVsIHdoZW4gdGhlIGJ1ZmZlciB3YXMgaW5pdGlhbGl6ZWQsCitwbHVzIHRoZSBmaW5hbCBzdHJpbmcgb24gaXRzIHRvcC4KKworfQorCitAQVBJRW50cnl7dm9pZCBsdWFMX2J1ZmZpbml0IChsdWFfU3RhdGUgKkwsIGx1YUxfQnVmZmVyICpCKTt8CitAYXBpaXswLDAsLX0KKworSW5pdGlhbGl6ZXMgYSBidWZmZXIgQGlke0J9LgorVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhbGxvY2F0ZSBhbnkgc3BhY2U7Cit0aGUgYnVmZmVyIG11c3QgYmUgZGVjbGFyZWQgYXMgYSB2YXJpYWJsZQorQHNlZUN7bHVhTF9CdWZmZXJ9LgorCit9CisKK0BBUElFbnRyeXtjaGFyICpsdWFMX2J1ZmZpbml0c2l6ZSAobHVhX1N0YXRlICpMLCBsdWFMX0J1ZmZlciAqQiwgc2l6ZV90IHN6KTt8CitAYXBpaXs/LD8sbX0KKworRXF1aXZhbGVudCB0byB0aGUgc2VxdWVuY2UKK0BMaWR7bHVhTF9idWZmaW5pdH0sIEBMaWR7bHVhTF9wcmVwYnVmZnNpemV9LgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhTF9jYWxsbWV0YSAobHVhX1N0YXRlICpMLCBpbnQgb2JqLCBjb25zdCBjaGFyICplKTt8CitAYXBpaXswLDB8MSxlfQorCitDYWxscyBhIG1ldGFtZXRob2QuCisKK0lmIHRoZSBvYmplY3QgYXQgaW5kZXggQGlke29ian0gaGFzIGEgbWV0YXRhYmxlIGFuZCB0aGlzCittZXRhdGFibGUgaGFzIGEgZmllbGQgQGlke2V9LAordGhpcyBmdW5jdGlvbiBjYWxscyB0aGlzIGZpZWxkIHBhc3NpbmcgdGhlIG9iamVjdCBhcyBpdHMgb25seSBhcmd1bWVudC4KK0luIHRoaXMgY2FzZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBhbmQgcHVzaGVzIG9udG8gdGhlCitzdGFjayB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGNhbGwuCitJZiB0aGVyZSBpcyBubyBtZXRhdGFibGUgb3Igbm8gbWV0YW1ldGhvZCwKK3RoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSAod2l0aG91dCBwdXNoaW5nIGFueSB2YWx1ZSBvbiB0aGUgc3RhY2spLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YUxfY2hlY2thbnkgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZyk7fAorQGFwaWl7MCwwLHZ9CisKK0NoZWNrcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBoYXMgYW4gYXJndW1lbnQKK29mIGFueSB0eXBlIChpbmNsdWRpbmcgQG5pbCkgYXQgcG9zaXRpb24gQGlke2FyZ30uCisKK30KKworQEFQSUVudHJ5e2x1YV9JbnRlZ2VyIGx1YUxfY2hlY2tpbnRlZ2VyIChsdWFfU3RhdGUgKkwsIGludCBhcmcpO3wKK0BhcGlpezAsMCx2fQorCitDaGVja3Mgd2hldGhlciB0aGUgZnVuY3Rpb24gYXJndW1lbnQgQGlke2FyZ30gaXMgYW4gaW50ZWdlcgorKG9yIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlcikKK2FuZCByZXR1cm5zIHRoaXMgaW50ZWdlciBjYXN0IHRvIGEgQExpZHtsdWFfSW50ZWdlcn0uCisKK30KKworQEFQSUVudHJ5e2NvbnN0IGNoYXIgKmx1YUxfY2hlY2tsc3RyaW5nIChsdWFfU3RhdGUgKkwsIGludCBhcmcsIHNpemVfdCAqbCk7fAorQGFwaWl7MCwwLHZ9CisKK0NoZWNrcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBhcmd1bWVudCBAaWR7YXJnfSBpcyBhIHN0cmluZworYW5kIHJldHVybnMgdGhpcyBzdHJpbmc7CitpZiBAaWR7bH0gaXMgbm90IEBpZHtOVUxMfSBmaWxscyBAVHsqbH0KK3dpdGggdGhlIHN0cmluZydzIGxlbmd0aC4KKworVGhpcyBmdW5jdGlvbiB1c2VzIEBMaWR7bHVhX3RvbHN0cmluZ30gdG8gZ2V0IGl0cyByZXN1bHQsCitzbyBhbGwgY29udmVyc2lvbnMgYW5kIGNhdmVhdHMgb2YgdGhhdCBmdW5jdGlvbiBhcHBseSBoZXJlLgorCit9CisKK0BBUElFbnRyeXtsdWFfTnVtYmVyIGx1YUxfY2hlY2tudW1iZXIgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZyk7fAorQGFwaWl7MCwwLHZ9CisKK0NoZWNrcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBhcmd1bWVudCBAaWR7YXJnfSBpcyBhIG51bWJlcgorYW5kIHJldHVybnMgdGhpcyBudW1iZXIuCisKK30KKworQEFQSUVudHJ5eworaW50IGx1YUxfY2hlY2tvcHRpb24gKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCBsc3RbXSk7fAorQGFwaWl7MCwwLHZ9CisKK0NoZWNrcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBhcmd1bWVudCBAaWR7YXJnfSBpcyBhIHN0cmluZyBhbmQKK3NlYXJjaGVzIGZvciB0aGlzIHN0cmluZyBpbiB0aGUgYXJyYXkgQGlke2xzdH0KKyh3aGljaCBtdXN0IGJlIE5VTEwtdGVybWluYXRlZCkuCitSZXR1cm5zIHRoZSBpbmRleCBpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIHN0cmluZyB3YXMgZm91bmQuCitSYWlzZXMgYW4gZXJyb3IgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHN0cmluZyBvcgoraWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgZm91bmQuCisKK0lmIEBpZHtkZWZ9IGlzIG5vdCBAaWR7TlVMTH0sCit0aGUgZnVuY3Rpb24gdXNlcyBAaWR7ZGVmfSBhcyBhIGRlZmF1bHQgdmFsdWUgd2hlbgordGhlcmUgaXMgbm8gYXJndW1lbnQgQGlke2FyZ30gb3Igd2hlbiB0aGlzIGFyZ3VtZW50IGlzIEBuaWwuCisKK1RoaXMgaXMgYSB1c2VmdWwgZnVuY3Rpb24gZm9yIG1hcHBpbmcgc3RyaW5ncyB0byBATntDIGVudW1zfS4KKyhUaGUgdXN1YWwgY29udmVudGlvbiBpbiBMdWEgbGlicmFyaWVzIGlzCit0byB1c2Ugc3RyaW5ncyBpbnN0ZWFkIG9mIG51bWJlcnMgdG8gc2VsZWN0IG9wdGlvbnMuKQorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YUxfY2hlY2tzdGFjayAobHVhX1N0YXRlICpMLCBpbnQgc3osIGNvbnN0IGNoYXIgKm1zZyk7fAorQGFwaWl7MCwwLHZ9CisKK0dyb3dzIHRoZSBzdGFjayBzaXplIHRvIEBUe3RvcCArIHN6fSBlbGVtZW50cywKK3JhaXNpbmcgYW4gZXJyb3IgaWYgdGhlIHN0YWNrIGNhbm5vdCBncm93IHRvIHRoYXQgc2l6ZS4KK0BpZHttc2d9IGlzIGFuIGFkZGl0aW9uYWwgdGV4dCB0byBnbyBpbnRvIHRoZSBlcnJvciBtZXNzYWdlCisob3IgQGlke05VTEx9IGZvciBubyBhZGRpdGlvbmFsIHRleHQpLgorCit9CisKK0BBUElFbnRyeXtjb25zdCBjaGFyICpsdWFMX2NoZWNrc3RyaW5nIChsdWFfU3RhdGUgKkwsIGludCBhcmcpO3wKK0BhcGlpezAsMCx2fQorCitDaGVja3Mgd2hldGhlciB0aGUgZnVuY3Rpb24gYXJndW1lbnQgQGlke2FyZ30gaXMgYSBzdHJpbmcKK2FuZCByZXR1cm5zIHRoaXMgc3RyaW5nLgorCitUaGlzIGZ1bmN0aW9uIHVzZXMgQExpZHtsdWFfdG9sc3RyaW5nfSB0byBnZXQgaXRzIHJlc3VsdCwKK3NvIGFsbCBjb252ZXJzaW9ucyBhbmQgY2F2ZWF0cyBvZiB0aGF0IGZ1bmN0aW9uIGFwcGx5IGhlcmUuCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhTF9jaGVja3R5cGUgKGx1YV9TdGF0ZSAqTCwgaW50IGFyZywgaW50IHQpO3wKK0BhcGlpezAsMCx2fQorCitDaGVja3Mgd2hldGhlciB0aGUgZnVuY3Rpb24gYXJndW1lbnQgQGlke2FyZ30gaGFzIHR5cGUgQGlke3R9LgorU2VlIEBMaWR7bHVhX3R5cGV9IGZvciB0aGUgZW5jb2Rpbmcgb2YgdHlwZXMgZm9yIEBpZHt0fS4KKworfQorCitAQVBJRW50cnl7dm9pZCAqbHVhTF9jaGVja3VkYXRhIChsdWFfU3RhdGUgKkwsIGludCBhcmcsIGNvbnN0IGNoYXIgKnRuYW1lKTt8CitAYXBpaXswLDAsdn0KKworQ2hlY2tzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IEBpZHthcmd9IGlzIGEgdXNlcmRhdGEKK29mIHRoZSB0eXBlIEBpZHt0bmFtZX0gQHNlZUN7bHVhTF9uZXdtZXRhdGFibGV9IGFuZAorcmV0dXJucyB0aGUgdXNlcmRhdGEncyBtZW1vcnktYmxvY2sgYWRkcmVzcyBAc2VlQ3tsdWFfdG91c2VyZGF0YX0uCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhTF9jaGVja3ZlcnNpb24gKGx1YV9TdGF0ZSAqTCk7fAorQGFwaWl7MCwwLHZ9CisKK0NoZWNrcyB3aGV0aGVyIHRoZSBjb2RlIG1ha2luZyB0aGUgY2FsbCBhbmQgdGhlIEx1YSBsaWJyYXJ5IGJlaW5nIGNhbGxlZAorYXJlIHVzaW5nIHRoZSBzYW1lIHZlcnNpb24gb2YgTHVhIGFuZCB0aGUgc2FtZSBudW1lcmljIHR5cGVzLgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhTF9kb2ZpbGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZmlsZW5hbWUpO3wKK0BhcGlpezAsPyxtfQorCitMb2FkcyBhbmQgcnVucyB0aGUgZ2l2ZW4gZmlsZS4KK0l0IGlzIGRlZmluZWQgYXMgdGhlIGZvbGxvd2luZyBtYWNybzoKK0B2ZXJiYXRpbXsKKyhsdWFMX2xvYWRmaWxlKEwsIGZpbGVuYW1lKSB8fCBsdWFfcGNhbGwoTCwgMCwgTFVBX01VTFRSRVQsIDApKQorfQorSXQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSBhcmUgbm8gZXJyb3JzCitvciB0cnVlIGluIGNhc2Ugb2YgZXJyb3JzLgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhTF9kb3N0cmluZyAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICpzdHIpO3wKK0BhcGlpezAsPywtfQorCitMb2FkcyBhbmQgcnVucyB0aGUgZ2l2ZW4gc3RyaW5nLgorSXQgaXMgZGVmaW5lZCBhcyB0aGUgZm9sbG93aW5nIG1hY3JvOgorQHZlcmJhdGlteworKGx1YUxfbG9hZHN0cmluZyhMLCBzdHIpIHx8IGx1YV9wY2FsbChMLCAwLCBMVUFfTVVMVFJFVCwgMCkpCit9CitJdCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGFyZSBubyBlcnJvcnMKK29yIHRydWUgaW4gY2FzZSBvZiBlcnJvcnMuCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFMX2Vycm9yIChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTt8CitAYXBpaXswLDAsdn0KKworUmFpc2VzIGFuIGVycm9yLgorVGhlIGVycm9yIG1lc3NhZ2UgZm9ybWF0IGlzIGdpdmVuIGJ5IEBpZHtmbXR9CitwbHVzIGFueSBleHRyYSBhcmd1bWVudHMsCitmb2xsb3dpbmcgdGhlIHNhbWUgcnVsZXMgb2YgQExpZHtsdWFfcHVzaGZzdHJpbmd9LgorSXQgYWxzbyBhZGRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UgdGhlIGZpbGUgbmFtZSBhbmQKK3RoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQsCitpZiB0aGlzIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KKworVGhpcyBmdW5jdGlvbiBuZXZlciByZXR1cm5zLAorYnV0IGl0IGlzIGFuIGlkaW9tIHRvIHVzZSBpdCBpbiBATntDIGZ1bmN0aW9uc30KK2FzIEBUe3JldHVybiBsdWFMX2Vycm9yKEByZXB7YXJnc30pfS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YUxfZXhlY3Jlc3VsdCAobHVhX1N0YXRlICpMLCBpbnQgc3RhdCk7fAorQGFwaWl7MCwzLG19CisKK1RoaXMgZnVuY3Rpb24gcHJvZHVjZXMgdGhlIHJldHVybiB2YWx1ZXMgZm9yCitwcm9jZXNzLXJlbGF0ZWQgZnVuY3Rpb25zIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5CisoQExpZHtvcy5leGVjdXRlfSBhbmQgQExpZHtpby5jbG9zZX0pLgorCit9CisKK0BBUElFbnRyeXsKK2ludCBsdWFMX2ZpbGVyZXN1bHQgKGx1YV9TdGF0ZSAqTCwgaW50IHN0YXQsIGNvbnN0IGNoYXIgKmZuYW1lKTt8CitAYXBpaXswLDF8MyxtfQorCitUaGlzIGZ1bmN0aW9uIHByb2R1Y2VzIHRoZSByZXR1cm4gdmFsdWVzIGZvcgorZmlsZS1yZWxhdGVkIGZ1bmN0aW9ucyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeQorKEBMaWR7aW8ub3Blbn0sIEBMaWR7b3MucmVuYW1lfSwgQExpZHtmaWxlOnNlZWt9LCBldGMuKS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YUxfZ2V0bWV0YWZpZWxkIChsdWFfU3RhdGUgKkwsIGludCBvYmosIGNvbnN0IGNoYXIgKmUpO3wKK0BhcGlpezAsMHwxLG19CisKK1B1c2hlcyBvbnRvIHRoZSBzdGFjayB0aGUgZmllbGQgQGlke2V9IGZyb20gdGhlIG1ldGF0YWJsZQorb2YgdGhlIG9iamVjdCBhdCBpbmRleCBAaWR7b2JqfSBhbmQgcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgcHVzaGVkIHZhbHVlLgorSWYgdGhlIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgbWV0YXRhYmxlLAorb3IgaWYgdGhlIG1ldGF0YWJsZSBkb2VzIG5vdCBoYXZlIHRoaXMgZmllbGQsCitwdXNoZXMgbm90aGluZyBhbmQgcmV0dXJucyBAaWR7TFVBX1ROSUx9LgorCit9CisKK0BBUElFbnRyeXtpbnQgbHVhTF9nZXRtZXRhdGFibGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqdG5hbWUpO3wKK0BhcGlpezAsMSxtfQorCitQdXNoZXMgb250byB0aGUgc3RhY2sgdGhlIG1ldGF0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgQGlke3RuYW1lfQoraW4gdGhlIHJlZ2lzdHJ5IEBzZWVDe2x1YUxfbmV3bWV0YXRhYmxlfSwKK29yIEBuaWwgaWYgdGhlcmUgaXMgbm8gbWV0YXRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGF0IG5hbWUuCitSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBwdXNoZWQgdmFsdWUuCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFMX2dldHN1YnRhYmxlIChsdWFfU3RhdGUgKkwsIGludCBpZHgsIGNvbnN0IGNoYXIgKmZuYW1lKTt8CitAYXBpaXswLDEsZX0KKworRW5zdXJlcyB0aGF0IHRoZSB2YWx1ZSBAVHt0W2ZuYW1lXX0sCit3aGVyZSBAaWR7dH0gaXMgdGhlIHZhbHVlIGF0IGluZGV4IEBpZHtpZHh9LAoraXMgYSB0YWJsZSwKK2FuZCBwdXNoZXMgdGhhdCB0YWJsZSBvbnRvIHRoZSBzdGFjay4KK1JldHVybnMgdHJ1ZSBpZiBpdCBmaW5kcyBhIHByZXZpb3VzIHRhYmxlIHRoZXJlCithbmQgZmFsc2UgaWYgaXQgY3JlYXRlcyBhIG5ldyB0YWJsZS4KKworfQorCitAQVBJRW50cnl7Citjb25zdCBjaGFyICpsdWFMX2dzdWIgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcik7fAorQGFwaWl7MCwxLG19CisKK0NyZWF0ZXMgYSBjb3B5IG9mIHN0cmluZyBAaWR7c30gYnkgcmVwbGFjaW5nCithbnkgb2NjdXJyZW5jZSBvZiB0aGUgc3RyaW5nIEBpZHtwfQord2l0aCB0aGUgc3RyaW5nIEBpZHtyfS4KK1B1c2hlcyB0aGUgcmVzdWx0aW5nIHN0cmluZyBvbiB0aGUgc3RhY2sgYW5kIHJldHVybnMgaXQuCisKK30KKworQEFQSUVudHJ5e2x1YV9JbnRlZ2VyIGx1YUxfbGVuIChsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7fAorQGFwaWl7MCwwLGV9CisKK1JldHVybnMgdGhlIEBRe2xlbmd0aH0gb2YgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleAorYXMgYSBudW1iZXI7CitpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBAQ2hhcnsjfSBvcGVyYXRvciBpbiBMdWEgQHNlZXtsZW4tb3B9LgorUmFpc2VzIGFuIGVycm9yIGlmIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBpcyBub3QgYW4gaW50ZWdlci4KKyhUaGlzIGNhc2Ugb25seSBjYW4gaGFwcGVuIHRocm91Z2ggbWV0YW1ldGhvZHMuKQorCit9CisKK0BBUElFbnRyeXsKK2ludCBsdWFMX2xvYWRidWZmZXIgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3osCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTt8CitAYXBpaXswLDEsLX0KKworRXF1aXZhbGVudCB0byBATGlke2x1YUxfbG9hZGJ1ZmZlcnh9IHdpdGggQGlke21vZGV9IGVxdWFsIHRvIEBpZHtOVUxMfS4KKworfQorCisKK0BBUElFbnRyeXsKK2ludCBsdWFMX2xvYWRidWZmZXJ4IChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3osCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlKTt8CitAYXBpaXswLDEsLX0KKworTG9hZHMgYSBidWZmZXIgYXMgYSBMdWEgY2h1bmsuCitUaGlzIGZ1bmN0aW9uIHVzZXMgQExpZHtsdWFfbG9hZH0gdG8gbG9hZCB0aGUgY2h1bmsgaW4gdGhlCitidWZmZXIgcG9pbnRlZCB0byBieSBAaWR7YnVmZn0gd2l0aCBzaXplIEBpZHtzen0uCisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSByZXN1bHRzIGFzIEBMaWR7bHVhX2xvYWR9LgorQGlke25hbWV9IGlzIHRoZSBjaHVuayBuYW1lLAordXNlZCBmb3IgZGVidWcgaW5mb3JtYXRpb24gYW5kIGVycm9yIG1lc3NhZ2VzLgorVGhlIHN0cmluZyBAaWR7bW9kZX0gd29ya3MgYXMgaW4gZnVuY3Rpb24gQExpZHtsdWFfbG9hZH0uCisKK30KKworCitAQVBJRW50cnl7aW50IGx1YUxfbG9hZGZpbGUgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqZmlsZW5hbWUpO3wKK0BhcGlpezAsMSxtfQorCitFcXVpdmFsZW50IHRvIEBMaWR7bHVhTF9sb2FkZmlsZXh9IHdpdGggQGlke21vZGV9IGVxdWFsIHRvIEBpZHtOVUxMfS4KKworfQorCitAQVBJRW50cnl7aW50IGx1YUxfbG9hZGZpbGV4IChsdWFfU3RhdGUgKkwsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlKTt8CitAYXBpaXswLDEsbX0KKworTG9hZHMgYSBmaWxlIGFzIGEgTHVhIGNodW5rLgorVGhpcyBmdW5jdGlvbiB1c2VzIEBMaWR7bHVhX2xvYWR9IHRvIGxvYWQgdGhlIGNodW5rIGluIHRoZSBmaWxlCituYW1lZCBAaWR7ZmlsZW5hbWV9LgorSWYgQGlke2ZpbGVuYW1lfSBpcyBAaWR7TlVMTH0sCit0aGVuIGl0IGxvYWRzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LgorVGhlIGZpcnN0IGxpbmUgaW4gdGhlIGZpbGUgaXMgaWdub3JlZCBpZiBpdCBzdGFydHMgd2l0aCBhIEBUeyN9LgorCitUaGUgc3RyaW5nIEBpZHttb2RlfSB3b3JrcyBhcyBpbiBmdW5jdGlvbiBATGlke2x1YV9sb2FkfS4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzYW1lIHJlc3VsdHMgYXMgQExpZHtsdWFfbG9hZH0sCitidXQgaXQgaGFzIGFuIGV4dHJhIGVycm9yIGNvZGUgQGRlZmlke0xVQV9FUlJGSUxFfQorZm9yIGZpbGUtcmVsYXRlZCBlcnJvcnMKKyhlLmcuLCBpdCBjYW5ub3Qgb3BlbiBvciByZWFkIHRoZSBmaWxlKS4KKworQXMgQExpZHtsdWFfbG9hZH0sIHRoaXMgZnVuY3Rpb24gb25seSBsb2FkcyB0aGUgY2h1bms7CitpdCBkb2VzIG5vdCBydW4gaXQuCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFMX2xvYWRzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqcyk7fAorQGFwaWl7MCwxLC19CisKK0xvYWRzIGEgc3RyaW5nIGFzIGEgTHVhIGNodW5rLgorVGhpcyBmdW5jdGlvbiB1c2VzIEBMaWR7bHVhX2xvYWR9IHRvIGxvYWQgdGhlIGNodW5rIGluCit0aGUgemVyby10ZXJtaW5hdGVkIHN0cmluZyBAaWR7c30uCisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSByZXN1bHRzIGFzIEBMaWR7bHVhX2xvYWR9LgorCitBbHNvIGFzIEBMaWR7bHVhX2xvYWR9LCB0aGlzIGZ1bmN0aW9uIG9ubHkgbG9hZHMgdGhlIGNodW5rOworaXQgZG9lcyBub3QgcnVuIGl0LgorCit9CisKKworQEFQSUVudHJ5e3ZvaWQgbHVhTF9uZXdsaWIgKGx1YV9TdGF0ZSAqTCwgY29uc3QgbHVhTF9SZWcgbFtdKTt8CitAYXBpaXswLDEsbX0KKworQ3JlYXRlcyBhIG5ldyB0YWJsZSBhbmQgcmVnaXN0ZXJzIHRoZXJlCit0aGUgZnVuY3Rpb25zIGluIGxpc3QgQGlke2x9LgorCitJdCBpcyBpbXBsZW1lbnRlZCBhcyB0aGUgZm9sbG93aW5nIG1hY3JvOgorQHZlcmJhdGlteworKGx1YUxfbmV3bGlidGFibGUoTCxsKSwgbHVhTF9zZXRmdW5jcyhMLGwsMCkpCit9CitUaGUgYXJyYXkgQGlke2x9IG11c3QgYmUgdGhlIGFjdHVhbCBhcnJheSwKK25vdCBhIHBvaW50ZXIgdG8gaXQuCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhTF9uZXdsaWJ0YWJsZSAobHVhX1N0YXRlICpMLCBjb25zdCBsdWFMX1JlZyBsW10pO3wKK0BhcGlpezAsMSxtfQorCitDcmVhdGVzIGEgbmV3IHRhYmxlIHdpdGggYSBzaXplIG9wdGltaXplZAordG8gc3RvcmUgYWxsIGVudHJpZXMgaW4gdGhlIGFycmF5IEBpZHtsfQorKGJ1dCBkb2VzIG5vdCBhY3R1YWxseSBzdG9yZSB0aGVtKS4KK0l0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBATGlke2x1YUxfc2V0ZnVuY3N9CitAc2VlRntsdWFMX25ld2xpYn0uCisKK0l0IGlzIGltcGxlbWVudGVkIGFzIGEgbWFjcm8uCitUaGUgYXJyYXkgQGlke2x9IG11c3QgYmUgdGhlIGFjdHVhbCBhcnJheSwKK25vdCBhIHBvaW50ZXIgdG8gaXQuCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFMX25ld21ldGF0YWJsZSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICp0bmFtZSk7fAorQGFwaWl7MCwxLG19CisKK0lmIHRoZSByZWdpc3RyeSBhbHJlYWR5IGhhcyB0aGUga2V5IEBpZHt0bmFtZX0sCityZXR1cm5zIDAuCitPdGhlcndpc2UsCitjcmVhdGVzIGEgbmV3IHRhYmxlIHRvIGJlIHVzZWQgYXMgYSBtZXRhdGFibGUgZm9yIHVzZXJkYXRhLAorYWRkcyB0byB0aGlzIG5ldyB0YWJsZSB0aGUgcGFpciBAVHtfX25hbWUgPSB0bmFtZX0sCithZGRzIHRvIHRoZSByZWdpc3RyeSB0aGUgcGFpciBAVHtbdG5hbWVdID0gbmV3IHRhYmxlfSwKK2FuZCByZXR1cm5zIDEuCisoVGhlIGVudHJ5IEBpZHh7X19uYW1lfSBpcyB1c2VkIGJ5IHNvbWUgZXJyb3ItcmVwb3J0aW5nIGZ1bmN0aW9ucy4pCisKK0luIGJvdGggY2FzZXMgcHVzaGVzIG9udG8gdGhlIHN0YWNrIHRoZSBmaW5hbCB2YWx1ZSBhc3NvY2lhdGVkCit3aXRoIEBpZHt0bmFtZX0gaW4gdGhlIHJlZ2lzdHJ5LgorCit9CisKK0BBUElFbnRyeXtsdWFfU3RhdGUgKmx1YUxfbmV3c3RhdGUgKHZvaWQpO3wKK0BhcGlpezAsMCwtfQorCitDcmVhdGVzIGEgbmV3IEx1YSBzdGF0ZS4KK0l0IGNhbGxzIEBMaWR7bHVhX25ld3N0YXRlfSB3aXRoIGFuCithbGxvY2F0b3IgYmFzZWQgb24gdGhlIEBOe3N0YW5kYXJkIEN9IEBpZHtyZWFsbG9jfSBmdW5jdGlvbgorYW5kIHRoZW4gc2V0cyBhIHBhbmljIGZ1bmN0aW9uIEBzZWV7Qy1lcnJvcn0gdGhhdCBwcmludHMKK2FuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHN0YW5kYXJkIGVycm9yIG91dHB1dCBpbiBjYXNlIG9mIGZhdGFsCitlcnJvcnMuCisKK1JldHVybnMgdGhlIG5ldyBzdGF0ZSwKK29yIEBpZHtOVUxMfSBpZiB0aGVyZSBpcyBhIEB4e21lbW9yeSBhbGxvY2F0aW9uIGVycm9yfS4KKworfQorCitAQVBJRW50cnl7dm9pZCBsdWFMX29wZW5saWJzIChsdWFfU3RhdGUgKkwpO3wKK0BhcGlpezAsMCxlfQorCitPcGVucyBhbGwgc3RhbmRhcmQgTHVhIGxpYnJhcmllcyBpbnRvIHRoZSBnaXZlbiBzdGF0ZS4KKworfQorCitAQVBJRW50cnl7CitUIGx1YUxfb3B0IChMLCBmdW5jLCBhcmcsIGRmbHQpO3wKK0BhcGlpezAsMCwtfQorCitUaGlzIG1hY3JvIGlzIGRlZmluZWQgYXMgZm9sbG93czoKK0B2ZXJiYXRpbXsKKyhsdWFfaXNub25lb3JuaWwoTCwoYXJnKSkgPyAoZGZsdCkgOiBmdW5jKEwsKGFyZykpKQorfQorSW4gd29yZHMsIGlmIHRoZSBhcmd1bWVudCBAaWR7YXJnfSBpcyBuaWwgb3IgYWJzZW50LAordGhlIG1hY3JvIHJlc3VsdHMgaW4gdGhlIGRlZmF1bHQgQGlke2RmbHR9LgorT3RoZXJ3aXNlLCBpdCByZXN1bHRzIGluIHRoZSByZXN1bHQgb2YgY2FsbGluZyBAaWR7ZnVuY30KK3dpdGggdGhlIHN0YXRlIEBpZHtMfSBhbmQgdGhlIGFyZ3VtZW50IGluZGV4IEBpZHthcmd9IGFzCitwYXJhbWV0ZXJzLgorTm90ZSB0aGF0IGl0IGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBAaWR7ZGZsdH0gb25seSBpZiBuZWVkZWQuCisKK30KKworQEFQSUVudHJ5eworbHVhX0ludGVnZXIgbHVhTF9vcHRpbnRlZ2VyIChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1YV9JbnRlZ2VyIGQpO3wKK0BhcGlpezAsMCx2fQorCitJZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgQGlke2FyZ30gaXMgYW4gaW50ZWdlcgorKG9yIGNvbnZlcnRpYmxlIHRvIGFuIGludGVnZXIpLAorcmV0dXJucyB0aGlzIGludGVnZXIuCitJZiB0aGlzIGFyZ3VtZW50IGlzIGFic2VudCBvciBpcyBAbmlsLAorcmV0dXJucyBAaWR7ZH0uCitPdGhlcndpc2UsIHJhaXNlcyBhbiBlcnJvci4KKworfQorCitAQVBJRW50cnl7Citjb25zdCBjaGFyICpsdWFMX29wdGxzdHJpbmcgKGx1YV9TdGF0ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpsKTt8CitAYXBpaXswLDAsdn0KKworSWYgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IEBpZHthcmd9IGlzIGEgc3RyaW5nLAorcmV0dXJucyB0aGlzIHN0cmluZy4KK0lmIHRoaXMgYXJndW1lbnQgaXMgYWJzZW50IG9yIGlzIEBuaWwsCityZXR1cm5zIEBpZHtkfS4KK090aGVyd2lzZSwgcmFpc2VzIGFuIGVycm9yLgorCitJZiBAaWR7bH0gaXMgbm90IEBpZHtOVUxMfSwKK2ZpbGxzIHRoZSBwb3NpdGlvbiBAVHsqbH0gd2l0aCB0aGUgcmVzdWx0J3MgbGVuZ3RoLgorSWYgdGhlIHJlc3VsdCBpcyBAaWR7TlVMTH0KKyhvbmx5IHBvc3NpYmxlIHdoZW4gcmV0dXJuaW5nIEBpZHtkfSBhbmQgQFR7ZCA9PSBOVUxMfSksCitpdHMgbGVuZ3RoIGlzIGNvbnNpZGVyZWQgemVyby4KKworVGhpcyBmdW5jdGlvbiB1c2VzIEBMaWR7bHVhX3RvbHN0cmluZ30gdG8gZ2V0IGl0cyByZXN1bHQsCitzbyBhbGwgY29udmVyc2lvbnMgYW5kIGNhdmVhdHMgb2YgdGhhdCBmdW5jdGlvbiBhcHBseSBoZXJlLgorCit9CisKK0BBUElFbnRyeXtsdWFfTnVtYmVyIGx1YUxfb3B0bnVtYmVyIChsdWFfU3RhdGUgKkwsIGludCBhcmcsIGx1YV9OdW1iZXIgZCk7fAorQGFwaWl7MCwwLHZ9CisKK0lmIHRoZSBmdW5jdGlvbiBhcmd1bWVudCBAaWR7YXJnfSBpcyBhIG51bWJlciwKK3JldHVybnMgdGhpcyBudW1iZXIuCitJZiB0aGlzIGFyZ3VtZW50IGlzIGFic2VudCBvciBpcyBAbmlsLAorcmV0dXJucyBAaWR7ZH0uCitPdGhlcndpc2UsIHJhaXNlcyBhbiBlcnJvci4KKworfQorCitAQVBJRW50cnl7Citjb25zdCBjaGFyICpsdWFMX29wdHN0cmluZyAobHVhX1N0YXRlICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZCk7fAorQGFwaWl7MCwwLHZ9CisKK0lmIHRoZSBmdW5jdGlvbiBhcmd1bWVudCBAaWR7YXJnfSBpcyBhIHN0cmluZywKK3JldHVybnMgdGhpcyBzdHJpbmcuCitJZiB0aGlzIGFyZ3VtZW50IGlzIGFic2VudCBvciBpcyBAbmlsLAorcmV0dXJucyBAaWR7ZH0uCitPdGhlcndpc2UsIHJhaXNlcyBhbiBlcnJvci4KKworfQorCitAQVBJRW50cnl7Y2hhciAqbHVhTF9wcmVwYnVmZmVyIChsdWFMX0J1ZmZlciAqQik7fAorQGFwaWl7Pyw/LG19CisKK0VxdWl2YWxlbnQgdG8gQExpZHtsdWFMX3ByZXBidWZmc2l6ZX0KK3dpdGggdGhlIHByZWRlZmluZWQgc2l6ZSBAZGVmaWR7TFVBTF9CVUZGRVJTSVpFfS4KKworfQorCitAQVBJRW50cnl7Y2hhciAqbHVhTF9wcmVwYnVmZnNpemUgKGx1YUxfQnVmZmVyICpCLCBzaXplX3Qgc3opO3wKK0BhcGlpez8sPyxtfQorCitSZXR1cm5zIGFuIGFkZHJlc3MgdG8gYSBzcGFjZSBvZiBzaXplIEBpZHtzen0KK3doZXJlIHlvdSBjYW4gY29weSBhIHN0cmluZyB0byBiZSBhZGRlZCB0byBidWZmZXIgQGlke0J9CitAc2VlQ3tsdWFMX0J1ZmZlcn0uCitBZnRlciBjb3B5aW5nIHRoZSBzdHJpbmcgaW50byB0aGlzIHNwYWNlIHlvdSBtdXN0IGNhbGwKK0BMaWR7bHVhTF9hZGRzaXplfSB3aXRoIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgdG8gYWN0dWFsbHkgYWRkCitpdCB0byB0aGUgYnVmZmVyLgorCit9CisKK0BBUElFbnRyeXt2b2lkIGx1YUxfcHVzaHJlc3VsdCAobHVhTF9CdWZmZXIgKkIpO3wKK0BhcGlpez8sMSxtfQorCitGaW5pc2hlcyB0aGUgdXNlIG9mIGJ1ZmZlciBAaWR7Qn0gbGVhdmluZyB0aGUgZmluYWwgc3RyaW5nIG9uCit0aGUgdG9wIG9mIHRoZSBzdGFjay4KKworfQorCitAQVBJRW50cnl7dm9pZCBsdWFMX3B1c2hyZXN1bHRzaXplIChsdWFMX0J1ZmZlciAqQiwgc2l6ZV90IHN6KTt8CitAYXBpaXs/LDEsbX0KKworRXF1aXZhbGVudCB0byB0aGUgc2VxdWVuY2UgQExpZHtsdWFMX2FkZHNpemV9LCBATGlke2x1YUxfcHVzaHJlc3VsdH0uCisKK30KKworQEFQSUVudHJ5e2ludCBsdWFMX3JlZiAobHVhX1N0YXRlICpMLCBpbnQgdCk7fAorQGFwaWl7MSwwLG19CisKK0NyZWF0ZXMgYW5kIHJldHVybnMgYSBAZGVme3JlZmVyZW5jZX0sCitpbiB0aGUgdGFibGUgYXQgaW5kZXggQGlke3R9LAorZm9yIHRoZSBvYmplY3QgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgKGFuZCBwb3BzIHRoZSBvYmplY3QpLgorCitBIHJlZmVyZW5jZSBpcyBhIHVuaXF1ZSBpbnRlZ2VyIGtleS4KK0FzIGxvbmcgYXMgeW91IGRvIG5vdCBtYW51YWxseSBhZGQgaW50ZWdlciBrZXlzIGludG8gdGFibGUgQGlke3R9LAorQExpZHtsdWFMX3JlZn0gZW5zdXJlcyB0aGUgdW5pcXVlbmVzcyBvZiB0aGUga2V5IGl0IHJldHVybnMuCitZb3UgY2FuIHJldHJpZXZlIGFuIG9iamVjdCByZWZlcnJlZCBieSByZWZlcmVuY2UgQGlke3J9CitieSBjYWxsaW5nIEBUe2x1YV9yYXdnZXRpKEwsIHQsIHIpfS4KK0Z1bmN0aW9uIEBMaWR7bHVhTF91bnJlZn0gZnJlZXMgYSByZWZlcmVuY2UgYW5kIGl0cyBhc3NvY2lhdGVkIG9iamVjdC4KKworSWYgdGhlIG9iamVjdCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayBpcyBAbmlsLAorQExpZHtsdWFMX3JlZn0gcmV0dXJucyB0aGUgY29uc3RhbnQgQGRlZmlke0xVQV9SRUZOSUx9LgorVGhlIGNvbnN0YW50IEBkZWZpZHtMVUFfTk9SRUZ9IGlzIGd1YXJhbnRlZWQgdG8gYmUgZGlmZmVyZW50Citmcm9tIGFueSByZWZlcmVuY2UgcmV0dXJuZWQgYnkgQExpZHtsdWFMX3JlZn0uCisKK30KKworQEFQSUVudHJ5ewordHlwZWRlZiBzdHJ1Y3QgbHVhTF9SZWcgeworICBjb25zdCBjaGFyICpuYW1lOworICBsdWFfQ0Z1bmN0aW9uIGZ1bmM7Cit9IGx1YUxfUmVnOworfAorCitUeXBlIGZvciBhcnJheXMgb2YgZnVuY3Rpb25zIHRvIGJlIHJlZ2lzdGVyZWQgYnkKK0BMaWR7bHVhTF9zZXRmdW5jc30uCitAaWR7bmFtZX0gaXMgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIEBpZHtmdW5jfSBpcyBhIHBvaW50ZXIgdG8KK3RoZSBmdW5jdGlvbi4KK0FueSBhcnJheSBvZiBATGlke2x1YUxfUmVnfSBtdXN0IGVuZCB3aXRoIGEgc2VudGluZWwgZW50cnkKK2luIHdoaWNoIGJvdGggQGlke25hbWV9IGFuZCBAaWR7ZnVuY30gYXJlIEBpZHtOVUxMfS4KKworfQorCitAQVBJRW50cnl7Cit2b2lkIGx1YUxfcmVxdWlyZWYgKGx1YV9TdGF0ZSAqTCwgY29uc3QgY2hhciAqbW9kbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbHVhX0NGdW5jdGlvbiBvcGVuZiwgaW50IGdsYik7fAorQGFwaWl7MCwxLGV9CisKK0lmIEBUe3BhY2thZ2UubG9hZGVkW21vZG5hbWVdfSBpcyBub3QgdHJ1ZSwKK2NhbGxzIGZ1bmN0aW9uIEBpZHtvcGVuZn0gd2l0aCBzdHJpbmcgQGlke21vZG5hbWV9IGFzIGFuIGFyZ3VtZW50CithbmQgc2V0cyB0aGUgY2FsbCByZXN1bHQgdG8gQFR7cGFja2FnZS5sb2FkZWRbbW9kbmFtZV19LAorYXMgaWYgdGhhdCBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQgdGhyb3VnaCBATGlke3JlcXVpcmV9LgorCitJZiBAaWR7Z2xifSBpcyB0cnVlLAorYWxzbyBzdG9yZXMgdGhlIG1vZHVsZSBpbnRvIGdsb2JhbCBAaWR7bW9kbmFtZX0uCisKK0xlYXZlcyBhIGNvcHkgb2YgdGhlIG1vZHVsZSBvbiB0aGUgc3RhY2suCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhTF9zZXRmdW5jcyAobHVhX1N0YXRlICpMLCBjb25zdCBsdWFMX1JlZyAqbCwgaW50IG51cCk7fAorQGFwaWl7bnVwLDAsbX0KKworUmVnaXN0ZXJzIGFsbCBmdW5jdGlvbnMgaW4gdGhlIGFycmF5IEBpZHtsfQorQHNlZUN7bHVhTF9SZWd9IGludG8gdGhlIHRhYmxlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrCisoYmVsb3cgb3B0aW9uYWwgdXB2YWx1ZXMsIHNlZSBuZXh0KS4KKworV2hlbiBAaWR7bnVwfSBpcyBub3QgemVybywKK2FsbCBmdW5jdGlvbnMgYXJlIGNyZWF0ZWQgd2l0aCBAaWR7bnVwfSB1cHZhbHVlcywKK2luaXRpYWxpemVkIHdpdGggY29waWVzIG9mIHRoZSBAaWR7bnVwfSB2YWx1ZXMKK3ByZXZpb3VzbHkgcHVzaGVkIG9uIHRoZSBzdGFjaworb24gdG9wIG9mIHRoZSBsaWJyYXJ5IHRhYmxlLgorVGhlc2UgdmFsdWVzIGFyZSBwb3BwZWQgZnJvbSB0aGUgc3RhY2sgYWZ0ZXIgdGhlIHJlZ2lzdHJhdGlvbi4KKworfQorCitAQVBJRW50cnl7dm9pZCBsdWFMX3NldG1ldGF0YWJsZSAobHVhX1N0YXRlICpMLCBjb25zdCBjaGFyICp0bmFtZSk7fAorQGFwaWl7MCwwLC19CisKK1NldHMgdGhlIG1ldGF0YWJsZSBvZiB0aGUgb2JqZWN0IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCithcyB0aGUgbWV0YXRhYmxlIGFzc29jaWF0ZWQgd2l0aCBuYW1lIEBpZHt0bmFtZX0KK2luIHRoZSByZWdpc3RyeSBAc2VlQ3tsdWFMX25ld21ldGF0YWJsZX0uCisKK30KKworQEFQSUVudHJ5ewordHlwZWRlZiBzdHJ1Y3QgbHVhTF9TdHJlYW0geworICBGSUxFICpmOworICBsdWFfQ0Z1bmN0aW9uIGNsb3NlZjsKK30gbHVhTF9TdHJlYW07Cit8CisKK1RoZSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbiBmb3IgQHh7ZmlsZSBoYW5kbGVzfSwKK3doaWNoIGlzIHVzZWQgYnkgdGhlIHN0YW5kYXJkIEkvTyBsaWJyYXJ5LgorCitBIGZpbGUgaGFuZGxlIGlzIGltcGxlbWVudGVkIGFzIGEgZnVsbCB1c2VyZGF0YSwKK3dpdGggYSBtZXRhdGFibGUgY2FsbGVkIEBpZHtMVUFfRklMRUhBTkRMRX0KKyh3aGVyZSBAaWR7TFVBX0ZJTEVIQU5ETEV9IGlzIGEgbWFjcm8gd2l0aCB0aGUgYWN0dWFsIG1ldGF0YWJsZSdzIG5hbWUpLgorVGhlIG1ldGF0YWJsZSBpcyBjcmVhdGVkIGJ5IHRoZSBJL08gbGlicmFyeQorQHNlZUZ7bHVhTF9uZXdtZXRhdGFibGV9LgorCitUaGlzIHVzZXJkYXRhIG11c3Qgc3RhcnQgd2l0aCB0aGUgc3RydWN0dXJlIEBpZHtsdWFMX1N0cmVhbX07CitpdCBjYW4gY29udGFpbiBvdGhlciBkYXRhIGFmdGVyIHRoaXMgaW5pdGlhbCBzdHJ1Y3R1cmUuCitGaWVsZCBAaWR7Zn0gcG9pbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIEMgc3RyZWFtCisob3IgaXQgY2FuIGJlIEBpZHtOVUxMfSB0byBpbmRpY2F0ZSBhbiBpbmNvbXBsZXRlbHkgY3JlYXRlZCBoYW5kbGUpLgorRmllbGQgQGlke2Nsb3NlZn0gcG9pbnRzIHRvIGEgTHVhIGZ1bmN0aW9uCit0aGF0IHdpbGwgYmUgY2FsbGVkIHRvIGNsb3NlIHRoZSBzdHJlYW0KK3doZW4gdGhlIGhhbmRsZSBpcyBjbG9zZWQgb3IgY29sbGVjdGVkOwordGhpcyBmdW5jdGlvbiByZWNlaXZlcyB0aGUgZmlsZSBoYW5kbGUgYXMgaXRzIHNvbGUgYXJndW1lbnQgYW5kCittdXN0IHJldHVybiBlaXRoZXIgQHRydWUgKGluIGNhc2Ugb2Ygc3VjY2VzcykKK29yIEBuaWwgcGx1cyBhbiBlcnJvciBtZXNzYWdlIChpbiBjYXNlIG9mIGVycm9yKS4KK09uY2UgTHVhIGNhbGxzIHRoaXMgZmllbGQsCitpdCBjaGFuZ2VzIHRoZSBmaWVsZCB2YWx1ZSB0byBAaWR7TlVMTH0KK3RvIHNpZ25hbCB0aGF0IHRoZSBoYW5kbGUgaXMgY2xvc2VkLgorCit9CisKK0BBUElFbnRyeXt2b2lkICpsdWFMX3Rlc3R1ZGF0YSAobHVhX1N0YXRlICpMLCBpbnQgYXJnLCBjb25zdCBjaGFyICp0bmFtZSk7fAorQGFwaWl7MCwwLG19CisKK1RoaXMgZnVuY3Rpb24gd29ya3MgbGlrZSBATGlke2x1YUxfY2hlY2t1ZGF0YX0sCitleGNlcHQgdGhhdCwgd2hlbiB0aGUgdGVzdCBmYWlscywKK2l0IHJldHVybnMgQGlke05VTEx9IGluc3RlYWQgb2YgcmFpc2luZyBhbiBlcnJvci4KKworfQorCitAQVBJRW50cnl7Y29uc3QgY2hhciAqbHVhTF90b2xzdHJpbmcgKGx1YV9TdGF0ZSAqTCwgaW50IGlkeCwgc2l6ZV90ICpsZW4pO3wKK0BhcGlpezAsMSxlfQorCitDb252ZXJ0cyBhbnkgTHVhIHZhbHVlIGF0IHRoZSBnaXZlbiBpbmRleCB0byBhIEBOe0Mgc3RyaW5nfQoraW4gYSByZWFzb25hYmxlIGZvcm1hdC4KK1RoZSByZXN1bHRpbmcgc3RyaW5nIGlzIHB1c2hlZCBvbnRvIHRoZSBzdGFjayBhbmQgYWxzbworcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLgorSWYgQGlke2xlbn0gaXMgbm90IEBpZHtOVUxMfSwKK3RoZSBmdW5jdGlvbiBhbHNvIHNldHMgQFR7Kmxlbn0gd2l0aCB0aGUgc3RyaW5nIGxlbmd0aC4KKworSWYgdGhlIHZhbHVlIGhhcyBhIG1ldGF0YWJsZSB3aXRoIGEgQGlkeHtfX3Rvc3RyaW5nfSBmaWVsZCwKK3RoZW4gQGlke2x1YUxfdG9sc3RyaW5nfSBjYWxscyB0aGUgY29ycmVzcG9uZGluZyBtZXRhbWV0aG9kCit3aXRoIHRoZSB2YWx1ZSBhcyBhcmd1bWVudCwKK2FuZCB1c2VzIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgYXMgaXRzIHJlc3VsdC4KKworfQorCitAQVBJRW50cnl7Cit2b2lkIGx1YUxfdHJhY2ViYWNrIChsdWFfU3RhdGUgKkwsIGx1YV9TdGF0ZSAqTDEsIGNvbnN0IGNoYXIgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCk7fAorQGFwaWl7MCwxLG19CisKK0NyZWF0ZXMgYW5kIHB1c2hlcyBhIHRyYWNlYmFjayBvZiB0aGUgc3RhY2sgQGlke0wxfS4KK0lmIEBpZHttc2d9IGlzIG5vdCBAaWR7TlVMTH0gaXQgaXMgYXBwZW5kZWQKK2F0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYWNlYmFjay4KK1RoZSBAaWR7bGV2ZWx9IHBhcmFtZXRlciB0ZWxscyBhdCB3aGljaCBsZXZlbAordG8gc3RhcnQgdGhlIHRyYWNlYmFjay4KKworfQorCitAQVBJRW50cnl7Y29uc3QgY2hhciAqbHVhTF90eXBlbmFtZSAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpO3wKK0BhcGlpezAsMCwtfQorCitSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCisKK30KKworQEFQSUVudHJ5e3ZvaWQgbHVhTF91bnJlZiAobHVhX1N0YXRlICpMLCBpbnQgdCwgaW50IHJlZik7fAorQGFwaWl7MCwwLC19CisKK1JlbGVhc2VzIHJlZmVyZW5jZSBAaWR7cmVmfSBmcm9tIHRoZSB0YWJsZSBhdCBpbmRleCBAaWR7dH0KK0BzZWVDe2x1YUxfcmVmfS4KK1RoZSBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIHRhYmxlLAorc28gdGhhdCB0aGUgcmVmZXJyZWQgb2JqZWN0IGNhbiBiZSBjb2xsZWN0ZWQuCitUaGUgcmVmZXJlbmNlIEBpZHtyZWZ9IGlzIGFsc28gZnJlZWQgdG8gYmUgdXNlZCBhZ2Fpbi4KKworSWYgQGlke3JlZn0gaXMgQExpZHtMVUFfTk9SRUZ9IG9yIEBMaWR7TFVBX1JFRk5JTH0sCitATGlke2x1YUxfdW5yZWZ9IGRvZXMgbm90aGluZy4KKworfQorCitAQVBJRW50cnl7dm9pZCBsdWFMX3doZXJlIChsdWFfU3RhdGUgKkwsIGludCBsdmwpO3wKK0BhcGlpezAsMSxtfQorCitQdXNoZXMgb250byB0aGUgc3RhY2sgYSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24KK29mIHRoZSBjb250cm9sIGF0IGxldmVsIEBpZHtsdmx9IGluIHRoZSBjYWxsIHN0YWNrLgorVHlwaWNhbGx5IHRoaXMgc3RyaW5nIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKK0B2ZXJiYXRpbXsKK0ByZXB7Y2h1bmtuYW1lfTpAcmVwe2N1cnJlbnRsaW5lfToKK30KK0BOe0xldmVsIDB9IGlzIHRoZSBydW5uaW5nIGZ1bmN0aW9uLAorQE57bGV2ZWwgMX0gaXMgdGhlIGZ1bmN0aW9uIHRoYXQgY2FsbGVkIHRoZSBydW5uaW5nIGZ1bmN0aW9uLAorZXRjLgorCitUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYnVpbGQgYSBwcmVmaXggZm9yIGVycm9yIG1lc3NhZ2VzLgorCit9CisKK30KKworfQorCisKK0BDey0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS19CitAc2VjdDF7bGlicmFyaWVzfCBAdGl0bGV7U3RhbmRhcmQgTGlicmFyaWVzfQorCitUaGUgc3RhbmRhcmQgTHVhIGxpYnJhcmllcyBwcm92aWRlIHVzZWZ1bCBmdW5jdGlvbnMKK3RoYXQgYXJlIGltcGxlbWVudGVkIGRpcmVjdGx5IHRocm91Z2ggdGhlIEBOe0MgQVBJfS4KK1NvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgZXNzZW50aWFsIHNlcnZpY2VzIHRvIHRoZSBsYW5ndWFnZQorKGUuZy4sIEBMaWR7dHlwZX0gYW5kIEBMaWR7Z2V0bWV0YXRhYmxlfSk7CitvdGhlcnMgcHJvdmlkZSBhY2Nlc3MgdG8gQFF7b3V0c2lkZX0gc2VydmljZXMgKGUuZy4sIEkvTyk7CithbmQgb3RoZXJzIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIEx1YSBpdHNlbGYsCitidXQgYXJlIHF1aXRlIHVzZWZ1bCBvciBoYXZlIGNyaXRpY2FsIHBlcmZvcm1hbmNlIHJlcXVpcmVtZW50cyB0aGF0CitkZXNlcnZlIGFuIGltcGxlbWVudGF0aW9uIGluIEMgKGUuZy4sIEBMaWR7dGFibGUuc29ydH0pLgorCitBbGwgbGlicmFyaWVzIGFyZSBpbXBsZW1lbnRlZCB0aHJvdWdoIHRoZSBvZmZpY2lhbCBATntDIEFQSX0KK2FuZCBhcmUgcHJvdmlkZWQgYXMgc2VwYXJhdGUgQE57QyBtb2R1bGVzfS4KK1VubGVzcyBvdGhlcndpc2Ugbm90ZWQsCit0aGVzZSBsaWJyYXJ5IGZ1bmN0aW9ucyBkbyBub3QgYWRqdXN0IGl0cyBudW1iZXIgb2YgYXJndW1lbnRzCit0byBpdHMgZXhwZWN0ZWQgcGFyYW1ldGVycy4KK0ZvciBpbnN0YW5jZSwgYSBmdW5jdGlvbiBkb2N1bWVudGVkIGFzIEBUe2ZvbyhhcmcpfQorc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aG91dCBhbiBhcmd1bWVudC4KKworQ3VycmVudGx5LCBMdWEgaGFzIHRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgbGlicmFyaWVzOgorQGl0ZW1pemV7CisKK0BpdGVte0BsaW5re3ByZWRlZmluZWR8YmFzaWMgbGlicmFyeX07fQorCitAaXRlbXtAbGlua3tjb3JvbGlifGNvcm91dGluZSBsaWJyYXJ5fTt9CisKK0BpdGVte0BsaW5re3BhY2tsaWJ8cGFja2FnZSBsaWJyYXJ5fTt9CisKK0BpdGVte0BsaW5re3N0cmxpYnxzdHJpbmcgbWFuaXB1bGF0aW9ufTt9CisKK0BpdGVte0BsaW5re3V0Zjh8YmFzaWMgVVRGLTggc3VwcG9ydH07fQorCitAaXRlbXtAbGlua3t0YWJsaWJ8dGFibGUgbWFuaXB1bGF0aW9ufTt9CisKK0BpdGVte0BsaW5re21hdGhsaWJ8bWF0aGVtYXRpY2FsIGZ1bmN0aW9uc30gKHNpbiwgbG9nLCBldGMuKTt9CisKK0BpdGVte0BsaW5re2lvbGlifGlucHV0IGFuZCBvdXRwdXR9O30KKworQGl0ZW17QGxpbmt7b3NsaWJ8b3BlcmF0aW5nIHN5c3RlbSBmYWNpbGl0aWVzfTt9CisKK0BpdGVte0BsaW5re2RlYnVnbGlifGRlYnVnIGZhY2lsaXRpZXN9Ln0KKworfQorRXhjZXB0IGZvciB0aGUgYmFzaWMgYW5kIHRoZSBwYWNrYWdlIGxpYnJhcmllcywKK2VhY2ggbGlicmFyeSBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9ucyBhcyBmaWVsZHMgb2YgYSBnbG9iYWwgdGFibGUKK29yIGFzIG1ldGhvZHMgb2YgaXRzIG9iamVjdHMuCisKK1RvIGhhdmUgYWNjZXNzIHRvIHRoZXNlIGxpYnJhcmllcywKK3RoZSBATntDIGhvc3R9IHByb2dyYW0gc2hvdWxkIGNhbGwgdGhlIEBMaWR7bHVhTF9vcGVubGlic30gZnVuY3Rpb24sCit3aGljaCBvcGVucyBhbGwgc3RhbmRhcmQgbGlicmFyaWVzLgorQWx0ZXJuYXRpdmVseSwKK3RoZSBob3N0IHByb2dyYW0gY2FuIG9wZW4gdGhlbSBpbmRpdmlkdWFsbHkgYnkgdXNpbmcKK0BMaWR7bHVhTF9yZXF1aXJlZn0gdG8gY2FsbAorQGRlZmlke2x1YW9wZW5fYmFzZX0gKGZvciB0aGUgYmFzaWMgbGlicmFyeSksCitAZGVmaWR7bHVhb3Blbl9wYWNrYWdlfSAoZm9yIHRoZSBwYWNrYWdlIGxpYnJhcnkpLAorQGRlZmlke2x1YW9wZW5fY29yb3V0aW5lfSAoZm9yIHRoZSBjb3JvdXRpbmUgbGlicmFyeSksCitAZGVmaWR7bHVhb3Blbl9zdHJpbmd9IChmb3IgdGhlIHN0cmluZyBsaWJyYXJ5KSwKK0BkZWZpZHtsdWFvcGVuX3V0Zjh9IChmb3IgdGhlIFVURjggbGlicmFyeSksCitAZGVmaWR7bHVhb3Blbl90YWJsZX0gKGZvciB0aGUgdGFibGUgbGlicmFyeSksCitAZGVmaWR7bHVhb3Blbl9tYXRofSAoZm9yIHRoZSBtYXRoZW1hdGljYWwgbGlicmFyeSksCitAZGVmaWR7bHVhb3Blbl9pb30gKGZvciB0aGUgSS9PIGxpYnJhcnkpLAorQGRlZmlke2x1YW9wZW5fb3N9IChmb3IgdGhlIG9wZXJhdGluZyBzeXN0ZW0gbGlicmFyeSksCithbmQgQGRlZmlke2x1YW9wZW5fZGVidWd9IChmb3IgdGhlIGRlYnVnIGxpYnJhcnkpLgorVGhlc2UgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCBpbiBAZGVmaWR7bHVhbGliLmh9LgorCitAc2VjdDJ7cHJlZGVmaW5lZHwgQHRpdGxle0Jhc2ljIEZ1bmN0aW9uc30KKworVGhlIGJhc2ljIGxpYnJhcnkgcHJvdmlkZXMgY29yZSBmdW5jdGlvbnMgdG8gTHVhLgorSWYgeW91IGRvIG5vdCBpbmNsdWRlIHRoaXMgbGlicmFyeSBpbiB5b3VyIGFwcGxpY2F0aW9uLAoreW91IHNob3VsZCBjaGVjayBjYXJlZnVsbHkgd2hldGhlciB5b3UgbmVlZCB0byBwcm92aWRlCitpbXBsZW1lbnRhdGlvbnMgZm9yIHNvbWUgb2YgaXRzIGZhY2lsaXRpZXMuCisKKworQExpYkVudHJ5e2Fzc2VydCAodiBbLCBtZXNzYWdlXSl8CisKK0NhbGxzIEBMaWR7ZXJyb3J9IGlmCit0aGUgdmFsdWUgb2YgaXRzIGFyZ3VtZW50IEBpZHt2fSBpcyBmYWxzZSAoaS5lLiwgQG5pbCBvciBAZmFsc2UpOworb3RoZXJ3aXNlLCByZXR1cm5zIGFsbCBpdHMgYXJndW1lbnRzLgorSW4gY2FzZSBvZiBlcnJvciwKK0BpZHttZXNzYWdlfSBpcyB0aGUgZXJyb3Igb2JqZWN0Oword2hlbiBhYnNlbnQsIGl0IGRlZmF1bHRzIHRvIEBTdHthc3NlcnRpb24gZmFpbGVkIX0KKworfQorCitATGliRW50cnl7Y29sbGVjdGdhcmJhZ2UgKFtvcHQgWywgYXJnXV0pfAorCitUaGlzIGZ1bmN0aW9uIGlzIGEgZ2VuZXJpYyBpbnRlcmZhY2UgdG8gdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorSXQgcGVyZm9ybXMgZGlmZmVyZW50IGZ1bmN0aW9ucyBhY2NvcmRpbmcgdG8gaXRzIGZpcnN0IGFyZ3VtZW50LCBAaWR7b3B0fToKK0BkZXNjcmlwdGlvbnsKKworQGl0ZW17QFN0e2NvbGxlY3R9fAorcGVyZm9ybXMgYSBmdWxsIGdhcmJhZ2UtY29sbGVjdGlvbiBjeWNsZS4KK1RoaXMgaXMgdGhlIGRlZmF1bHQgb3B0aW9uLgorfQorCitAaXRlbXtAU3R7c3RvcH18CitzdG9wcyBhdXRvbWF0aWMgZXhlY3V0aW9uIG9mIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KK1RoZSBjb2xsZWN0b3Igd2lsbCBydW4gb25seSB3aGVuIGV4cGxpY2l0bHkgaW52b2tlZCwKK3VudGlsIGEgY2FsbCB0byByZXN0YXJ0IGl0LgorfQorCitAaXRlbXtAU3R7cmVzdGFydH18CityZXN0YXJ0cyBhdXRvbWF0aWMgZXhlY3V0aW9uIG9mIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KK30KKworQGl0ZW17QFN0e2NvdW50fXwKK3JldHVybnMgdGhlIHRvdGFsIG1lbW9yeSBpbiB1c2UgYnkgTHVhIGluIEtieXRlcy4KK1RoZSB2YWx1ZSBoYXMgYSBmcmFjdGlvbmFsIHBhcnQsCitzbyB0aGF0IGl0IG11bHRpcGxpZWQgYnkgMTAyNAorZ2l2ZXMgdGhlIGV4YWN0IG51bWJlciBvZiBieXRlcyBpbiB1c2UgYnkgTHVhCisoZXhjZXB0IGZvciBvdmVyZmxvd3MpLgorfQorCitAaXRlbXtAU3R7c3RlcH18CitwZXJmb3JtcyBhIGdhcmJhZ2UtY29sbGVjdGlvbiBzdGVwLgorVGhlIHN0ZXAgQFF7c2l6ZX0gaXMgY29udHJvbGxlZCBieSBAaWR7YXJnfS4KK1dpdGggYSB6ZXJvIHZhbHVlLAordGhlIGNvbGxlY3RvciB3aWxsIHBlcmZvcm0gb25lIGJhc2ljIChpbmRpdmlzaWJsZSkgc3RlcC4KK0ZvciBub24temVybyB2YWx1ZXMsCit0aGUgY29sbGVjdG9yIHdpbGwgcGVyZm9ybSBhcyBpZiB0aGF0IGFtb3VudCBvZiBtZW1vcnkKKyhpbiBLQnl0ZXMpIGhhZCBiZWVuIGFsbG9jYXRlZCBieSBMdWEuCitSZXR1cm5zIEB0cnVlIGlmIHRoZSBzdGVwIGZpbmlzaGVkIGEgY29sbGVjdGlvbiBjeWNsZS4KK30KKworQGl0ZW17QFN0e3NldHBhdXNlfXwKK3NldHMgQGlke2FyZ30gYXMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIEBlbXBoe3BhdXNlfSBvZgordGhlIGNvbGxlY3RvciBAc2Vle0dDfS4KK1JldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlIGZvciBAZW1waHtwYXVzZX0uCit9CisKK0BpdGVte0BTdHtpbmNyZW1lbnRhbH18CitDaGFuZ2UgdGhlIGNvbGxlY3RvciBtb2RlIHRvIGluY3JlbWVudGFsLgorVGhpcyBvcHRpb24gY2FuIGJlIGZvbGxvd2VkIGJ5IHRocmVlIG51bWJlcnM6Cit0aGUgZ2FyYmFnZS1jb2xsZWN0b3IgcGF1c2UsCit0aGUgc3RlcCBtdWx0aXBsaWVyLAorYW5kIHRoZSBzdGVwIHNpemUuCit9CisKK0BpdGVte0BTdHtnZW5lcmF0aW9uYWx9fAorQ2hhbmdlIHRoZSBjb2xsZWN0b3IgbW9kZSB0byBnZW5lcmF0aW9uYWwuCitUaGlzIG9wdGlvbiBjYW4gYmUgZm9sbG93ZWQgYnkgdHdvIG51bWJlcnM6Cit0aGUgZ2FyYmFnZS1jb2xsZWN0b3IgbWlub3IgbXVsdGlwbGllcgorYW5kIHRoZSBtYWpvciBtdWx0aXBsaWVyLgorfQorCitAaXRlbXtAU3R7aXNydW5uaW5nfXwKK3JldHVybnMgYSBib29sZWFuIHRoYXQgdGVsbHMgd2hldGhlciB0aGUgY29sbGVjdG9yIGlzIHJ1bm5pbmcKKyhpLmUuLCBub3Qgc3RvcHBlZCkuCit9CisKK30KKworfQorCitATGliRW50cnl7ZG9maWxlIChbZmlsZW5hbWVdKXwKK09wZW5zIHRoZSBuYW1lZCBmaWxlIGFuZCBleGVjdXRlcyBpdHMgY29udGVudHMgYXMgYSBMdWEgY2h1bmsuCitXaGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywKK0BpZHtkb2ZpbGV9IGV4ZWN1dGVzIHRoZSBjb250ZW50cyBvZiB0aGUgc3RhbmRhcmQgaW5wdXQgKEBpZHtzdGRpbn0pLgorUmV0dXJucyBhbGwgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjaHVuay4KK0luIGNhc2Ugb2YgZXJyb3JzLCBAaWR7ZG9maWxlfSBwcm9wYWdhdGVzIHRoZSBlcnJvcgordG8gaXRzIGNhbGxlciAodGhhdCBpcywgQGlke2RvZmlsZX0gZG9lcyBub3QgcnVuIGluIHByb3RlY3RlZCBtb2RlKS4KKworfQorCitATGliRW50cnl7ZXJyb3IgKG1lc3NhZ2UgWywgbGV2ZWxdKXwKK1Rlcm1pbmF0ZXMgdGhlIGxhc3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGNhbGxlZAorYW5kIHJldHVybnMgQGlke21lc3NhZ2V9IGFzIHRoZSBlcnJvciBvYmplY3QuCitGdW5jdGlvbiBAaWR7ZXJyb3J9IG5ldmVyIHJldHVybnMuCisKK1VzdWFsbHksIEBpZHtlcnJvcn0gYWRkcyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciBwb3NpdGlvbgorYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZSwgaWYgdGhlIG1lc3NhZ2UgaXMgYSBzdHJpbmcuCitUaGUgQGlke2xldmVsfSBhcmd1bWVudCBzcGVjaWZpZXMgaG93IHRvIGdldCB0aGUgZXJyb3IgcG9zaXRpb24uCitXaXRoIEBOe2xldmVsIDF9ICh0aGUgZGVmYXVsdCksIHRoZSBlcnJvciBwb3NpdGlvbiBpcyB3aGVyZSB0aGUKK0BpZHtlcnJvcn0gZnVuY3Rpb24gd2FzIGNhbGxlZC4KK0BOe0xldmVsIDJ9IHBvaW50cyB0aGUgZXJyb3IgdG8gd2hlcmUgdGhlIGZ1bmN0aW9uCit0aGF0IGNhbGxlZCBAaWR7ZXJyb3J9IHdhcyBjYWxsZWQ7IGFuZCBzbyBvbi4KK1Bhc3NpbmcgYSBATntsZXZlbCAwfSBhdm9pZHMgdGhlIGFkZGl0aW9uIG9mIGVycm9yIHBvc2l0aW9uIGluZm9ybWF0aW9uCit0byB0aGUgbWVzc2FnZS4KKworfQorCitATGliRW50cnl7X0d8CitBIGdsb2JhbCB2YXJpYWJsZSAobm90IGEgZnVuY3Rpb24pIHRoYXQKK2hvbGRzIHRoZSBAeHtnbG9iYWwgZW52aXJvbm1lbnR9IEBzZWV7Z2xvYmFsZW52fS4KK0x1YSBpdHNlbGYgZG9lcyBub3QgdXNlIHRoaXMgdmFyaWFibGU7CitjaGFuZ2luZyBpdHMgdmFsdWUgZG9lcyBub3QgYWZmZWN0IGFueSBlbnZpcm9ubWVudCwKK25vciB2aWNlIHZlcnNhLgorCit9CisKK0BMaWJFbnRyeXtnZXRtZXRhdGFibGUgKG9iamVjdCl8CisKK0lmIEBpZHtvYmplY3R9IGRvZXMgbm90IGhhdmUgYSBtZXRhdGFibGUsIHJldHVybnMgQG5pbC4KK090aGVyd2lzZSwKK2lmIHRoZSBvYmplY3QncyBtZXRhdGFibGUgaGFzIGEgQGlkeHtfX21ldGF0YWJsZX0gZmllbGQsCityZXR1cm5zIHRoZSBhc3NvY2lhdGVkIHZhbHVlLgorT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBtZXRhdGFibGUgb2YgdGhlIGdpdmVuIG9iamVjdC4KKworfQorCitATGliRW50cnl7aXBhaXJzICh0KXwKKworUmV0dXJucyB0aHJlZSB2YWx1ZXMgKGFuIGl0ZXJhdG9yIGZ1bmN0aW9uLCB0aGUgdGFibGUgQGlke3R9LCBhbmQgMCkKK3NvIHRoYXQgdGhlIGNvbnN0cnVjdGlvbgorQHZlcmJhdGlteworZm9yIGksdiBpbiBpcGFpcnModCkgZG8gQHJlcHtib2R5fSBlbmQKK30KK3dpbGwgaXRlcmF0ZSBvdmVyIHRoZSBrZXlARW57fXZhbHVlIHBhaXJzCisoQFR7MSx0WzFdfSksIChAVHsyLHRbMl19KSwgQGxkb3RzLAordXAgdG8gdGhlIGZpcnN0IGFic2VudCBpbmRleC4KKworfQorCitATGliRW50cnl7bG9hZCAoY2h1bmsgWywgY2h1bmtuYW1lIFssIG1vZGUgWywgZW52XV1dKXwKKworTG9hZHMgYSBjaHVuay4KKworSWYgQGlke2NodW5rfSBpcyBhIHN0cmluZywgdGhlIGNodW5rIGlzIHRoaXMgc3RyaW5nLgorSWYgQGlke2NodW5rfSBpcyBhIGZ1bmN0aW9uLAorQGlke2xvYWR9IGNhbGxzIGl0IHJlcGVhdGVkbHkgdG8gZ2V0IHRoZSBjaHVuayBwaWVjZXMuCitFYWNoIGNhbGwgdG8gQGlke2NodW5rfSBtdXN0IHJldHVybiBhIHN0cmluZyB0aGF0IGNvbmNhdGVuYXRlcword2l0aCBwcmV2aW91cyByZXN1bHRzLgorQSByZXR1cm4gb2YgYW4gZW1wdHkgc3RyaW5nLCBAbmlsLCBvciBubyB2YWx1ZSBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIGNodW5rLgorCitJZiB0aGVyZSBhcmUgbm8gc3ludGFjdGljIGVycm9ycywKK3JldHVybnMgdGhlIGNvbXBpbGVkIGNodW5rIGFzIGEgZnVuY3Rpb247CitvdGhlcndpc2UsIHJldHVybnMgQG5pbCBwbHVzIHRoZSBlcnJvciBtZXNzYWdlLgorCitJZiB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIGhhcyB1cHZhbHVlcywKK3RoZSBmaXJzdCB1cHZhbHVlIGlzIHNldCB0byB0aGUgdmFsdWUgb2YgQGlke2Vudn0sCitpZiB0aGF0IHBhcmFtZXRlciBpcyBnaXZlbiwKK29yIHRvIHRoZSB2YWx1ZSBvZiB0aGUgQHh7Z2xvYmFsIGVudmlyb25tZW50fS4KK090aGVyIHVwdmFsdWVzIGFyZSBpbml0aWFsaXplZCB3aXRoIEBuaWwuCisoV2hlbiB5b3UgbG9hZCBhIG1haW4gY2h1bmssCit0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGhhdmUgZXhhY3RseSBvbmUgdXB2YWx1ZSwKK3RoZSBAaWR7X0VOVn0gdmFyaWFibGUgQHNlZXtnbG9iYWxlbnZ9LgorSG93ZXZlciwKK3doZW4geW91IGxvYWQgYSBiaW5hcnkgY2h1bmsgY3JlYXRlZCBmcm9tIGEgZnVuY3Rpb24gQHNlZUZ7c3RyaW5nLmR1bXB9LAordGhlIHJlc3VsdGluZyBmdW5jdGlvbiBjYW4gaGF2ZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHVwdmFsdWVzLikKK0FsbCB1cHZhbHVlcyBhcmUgZnJlc2gsIHRoYXQgaXMsCit0aGV5IGFyZSBub3Qgc2hhcmVkIHdpdGggYW55IG90aGVyIGZ1bmN0aW9uLgorCitAaWR7Y2h1bmtuYW1lfSBpcyB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBjaHVuayBmb3IgZXJyb3IgbWVzc2FnZXMKK2FuZCBkZWJ1ZyBpbmZvcm1hdGlvbiBAc2Vle2RlYnVnSX0uCitXaGVuIGFic2VudCwKK2l0IGRlZmF1bHRzIHRvIEBpZHtjaHVua30sIGlmIEBpZHtjaHVua30gaXMgYSBzdHJpbmcsCitvciB0byBAU3R7PShsb2FkKX0gb3RoZXJ3aXNlLgorCitUaGUgc3RyaW5nIEBpZHttb2RlfSBjb250cm9scyB3aGV0aGVyIHRoZSBjaHVuayBjYW4gYmUgdGV4dCBvciBiaW5hcnkKKyh0aGF0IGlzLCBhIHByZWNvbXBpbGVkIGNodW5rKS4KK0l0IG1heSBiZSB0aGUgc3RyaW5nIEBTdHtifSAob25seSBAeHtiaW5hcnkgY2h1bmt9cyksCitAU3R7dH0gKG9ubHkgdGV4dCBjaHVua3MpLAorb3IgQFN0e2J0fSAoYm90aCBiaW5hcnkgYW5kIHRleHQpLgorVGhlIGRlZmF1bHQgaXMgQFN0e2J0fS4KKworTHVhIGRvZXMgbm90IGNoZWNrIHRoZSBjb25zaXN0ZW5jeSBvZiBiaW5hcnkgY2h1bmtzLgorTWFsaWNpb3VzbHkgY3JhZnRlZCBiaW5hcnkgY2h1bmtzIGNhbiBjcmFzaAordGhlIGludGVycHJldGVyLgorCit9CisKK0BMaWJFbnRyeXtsb2FkZmlsZSAoW2ZpbGVuYW1lIFssIG1vZGUgWywgZW52XV1dKXwKKworU2ltaWxhciB0byBATGlke2xvYWR9LAorYnV0IGdldHMgdGhlIGNodW5rIGZyb20gZmlsZSBAaWR7ZmlsZW5hbWV9CitvciBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwKK2lmIG5vIGZpbGUgbmFtZSBpcyBnaXZlbi4KKworfQorCitATGliRW50cnl7bmV4dCAodGFibGUgWywgaW5kZXhdKXwKKworQWxsb3dzIGEgcHJvZ3JhbSB0byB0cmF2ZXJzZSBhbGwgZmllbGRzIG9mIGEgdGFibGUuCitJdHMgZmlyc3QgYXJndW1lbnQgaXMgYSB0YWJsZSBhbmQgaXRzIHNlY29uZCBhcmd1bWVudAoraXMgYW4gaW5kZXggaW4gdGhpcyB0YWJsZS4KK0BpZHtuZXh0fSByZXR1cm5zIHRoZSBuZXh0IGluZGV4IG9mIHRoZSB0YWJsZQorYW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlLgorV2hlbiBjYWxsZWQgd2l0aCBAbmlsIGFzIGl0cyBzZWNvbmQgYXJndW1lbnQsCitAaWR7bmV4dH0gcmV0dXJucyBhbiBpbml0aWFsIGluZGV4CithbmQgaXRzIGFzc29jaWF0ZWQgdmFsdWUuCitXaGVuIGNhbGxlZCB3aXRoIHRoZSBsYXN0IGluZGV4LAorb3Igd2l0aCBAbmlsIGluIGFuIGVtcHR5IHRhYmxlLAorQGlke25leHR9IHJldHVybnMgQG5pbC4KK0lmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYWJzZW50LCB0aGVuIGl0IGlzIGludGVycHJldGVkIGFzIEBuaWwuCitJbiBwYXJ0aWN1bGFyLAoreW91IGNhbiB1c2UgQFR7bmV4dCh0KX0gdG8gY2hlY2sgd2hldGhlciBhIHRhYmxlIGlzIGVtcHR5LgorCitUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGluZGljZXMgYXJlIGVudW1lcmF0ZWQgaXMgbm90IHNwZWNpZmllZCwKK0BlbXBoe2V2ZW4gZm9yIG51bWVyaWMgaW5kaWNlc30uCisoVG8gdHJhdmVyc2UgYSB0YWJsZSBpbiBudW1lcmljYWwgb3JkZXIsCit1c2UgYSBudW1lcmljYWwgQFJ3e2Zvcn0uKQorCitUaGUgYmVoYXZpb3Igb2YgQGlke25leHR9IGlzIHVuZGVmaW5lZCBpZiwKK2R1cmluZyB0aGUgdHJhdmVyc2FsLAoreW91IGFzc2lnbiBhbnkgdmFsdWUgdG8gYSBub24tZXhpc3RlbnQgZmllbGQgaW4gdGhlIHRhYmxlLgorWW91IG1heSBob3dldmVyIG1vZGlmeSBleGlzdGluZyBmaWVsZHMuCitJbiBwYXJ0aWN1bGFyLCB5b3UgbWF5IHNldCBleGlzdGluZyBmaWVsZHMgdG8gbmlsLgorCit9CisKK0BMaWJFbnRyeXtwYWlycyAodCl8CisKK0lmIEBpZHt0fSBoYXMgYSBtZXRhbWV0aG9kIEBpZHh7X19wYWlyc30sCitjYWxscyBpdCB3aXRoIEBpZHt0fSBhcyBhcmd1bWVudCBhbmQgcmV0dXJucyB0aGUgZmlyc3QgdGhyZWUKK3Jlc3VsdHMgZnJvbSB0aGUgY2FsbC4KKworT3RoZXJ3aXNlLAorcmV0dXJucyB0aHJlZSB2YWx1ZXM6IHRoZSBATGlke25leHR9IGZ1bmN0aW9uLCB0aGUgdGFibGUgQGlke3R9LCBhbmQgQG5pbCwKK3NvIHRoYXQgdGhlIGNvbnN0cnVjdGlvbgorQHZlcmJhdGlteworZm9yIGssdiBpbiBwYWlycyh0KSBkbyBAcmVwe2JvZHl9IGVuZAorfQord2lsbCBpdGVyYXRlIG92ZXIgYWxsIGtleUBFbnt9dmFsdWUgcGFpcnMgb2YgdGFibGUgQGlke3R9LgorCitTZWUgZnVuY3Rpb24gQExpZHtuZXh0fSBmb3IgdGhlIGNhdmVhdHMgb2YgbW9kaWZ5aW5nCit0aGUgdGFibGUgZHVyaW5nIGl0cyB0cmF2ZXJzYWwuCisKK30KKworQExpYkVudHJ5e3BjYWxsIChmIFssIGFyZzEsIEBDZG90c10pfAorCitDYWxscyBmdW5jdGlvbiBAaWR7Zn0gd2l0aAordGhlIGdpdmVuIGFyZ3VtZW50cyBpbiBAZGVme3Byb3RlY3RlZCBtb2RlfS4KK1RoaXMgbWVhbnMgdGhhdCBhbnkgZXJyb3IgQE57aW5zaWRlIEBUe2Z9fSBpcyBub3QgcHJvcGFnYXRlZDsKK2luc3RlYWQsIEBpZHtwY2FsbH0gY2F0Y2hlcyB0aGUgZXJyb3IKK2FuZCByZXR1cm5zIGEgc3RhdHVzIGNvZGUuCitJdHMgZmlyc3QgcmVzdWx0IGlzIHRoZSBzdGF0dXMgY29kZSAoYSBib29sZWFuKSwKK3doaWNoIGlzIHRydWUgaWYgdGhlIGNhbGwgc3VjY2VlZHMgd2l0aG91dCBlcnJvcnMuCitJbiBzdWNoIGNhc2UsIEBpZHtwY2FsbH0gYWxzbyByZXR1cm5zIGFsbCByZXN1bHRzIGZyb20gdGhlIGNhbGwsCithZnRlciB0aGlzIGZpcnN0IHJlc3VsdC4KK0luIGNhc2Ugb2YgYW55IGVycm9yLCBAaWR7cGNhbGx9IHJldHVybnMgQGZhbHNlIHBsdXMgdGhlIGVycm9yIG1lc3NhZ2UuCisKK30KKworQExpYkVudHJ5e3ByaW50IChAQ2RvdHMpfAorUmVjZWl2ZXMgYW55IG51bWJlciBvZiBhcmd1bWVudHMKK2FuZCBwcmludHMgdGhlaXIgdmFsdWVzIHRvIEBpZHtzdGRvdXR9LAordXNpbmcgdGhlIEBMaWR7dG9zdHJpbmd9IGZ1bmN0aW9uIHRvIGNvbnZlcnQgZWFjaCBhcmd1bWVudCB0byBhIHN0cmluZy4KK0BpZHtwcmludH0gaXMgbm90IGludGVuZGVkIGZvciBmb3JtYXR0ZWQgb3V0cHV0LAorYnV0IG9ubHkgYXMgYSBxdWljayB3YXkgdG8gc2hvdyBhIHZhbHVlLAorZm9yIGluc3RhbmNlIGZvciBkZWJ1Z2dpbmcuCitGb3IgY29tcGxldGUgY29udHJvbCBvdmVyIHRoZSBvdXRwdXQsCit1c2UgQExpZHtzdHJpbmcuZm9ybWF0fSBhbmQgQExpZHtpby53cml0ZX0uCisKK30KKworQExpYkVudHJ5e3Jhd2VxdWFsICh2MSwgdjIpfAorQ2hlY2tzIHdoZXRoZXIgQGlke3YxfSBpcyBlcXVhbCB0byBAaWR7djJ9LAord2l0aG91dCBpbnZva2luZyB0aGUgQGlkeHtfX2VxfSBtZXRhbWV0aG9kLgorUmV0dXJucyBhIGJvb2xlYW4uCisKK30KKworQExpYkVudHJ5e3Jhd2dldCAodGFibGUsIGluZGV4KXwKK0dldHMgdGhlIHJlYWwgdmFsdWUgb2YgQFR7dGFibGVbaW5kZXhdfSwKK3dpdGhvdXQgaW52b2tpbmcgdGhlIEBpZHh7X19pbmRleH0gbWV0YW1ldGhvZC4KK0BpZHt0YWJsZX0gbXVzdCBiZSBhIHRhYmxlOworQGlke2luZGV4fSBtYXkgYmUgYW55IHZhbHVlLgorCit9CisKK0BMaWJFbnRyeXtyYXdsZW4gKHYpfAorUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QgQGlke3Z9LAord2hpY2ggbXVzdCBiZSBhIHRhYmxlIG9yIGEgc3RyaW5nLAord2l0aG91dCBpbnZva2luZyB0aGUgQGlkeHtfX2xlbn0gbWV0YW1ldGhvZC4KK1JldHVybnMgYW4gaW50ZWdlci4KKworfQorCitATGliRW50cnl7cmF3c2V0ICh0YWJsZSwgaW5kZXgsIHZhbHVlKXwKK1NldHMgdGhlIHJlYWwgdmFsdWUgb2YgQFR7dGFibGVbaW5kZXhdfSB0byBAaWR7dmFsdWV9LAord2l0aG91dCBpbnZva2luZyB0aGUgQGlkeHtfX25ld2luZGV4fSBtZXRhbWV0aG9kLgorQGlke3RhYmxlfSBtdXN0IGJlIGEgdGFibGUsCitAaWR7aW5kZXh9IGFueSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSBAbmlsIGFuZCBAeHtOYU59LAorYW5kIEBpZHt2YWx1ZX0gYW55IEx1YSB2YWx1ZS4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIEBpZHt0YWJsZX0uCisKK30KKworQExpYkVudHJ5e3NlbGVjdCAoaW5kZXgsIEBDZG90cyl8CisKK0lmIEBpZHtpbmRleH0gaXMgYSBudW1iZXIsCityZXR1cm5zIGFsbCBhcmd1bWVudHMgYWZ0ZXIgYXJndW1lbnQgbnVtYmVyIEBpZHtpbmRleH07CithIG5lZ2F0aXZlIG51bWJlciBpbmRleGVzIGZyb20gdGhlIGVuZCAoQG51bXstMX0gaXMgdGhlIGxhc3QgYXJndW1lbnQpLgorT3RoZXJ3aXNlLCBAaWR7aW5kZXh9IG11c3QgYmUgdGhlIHN0cmluZyBAVHsiIyJ9LAorYW5kIEBpZHtzZWxlY3R9IHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBleHRyYSBhcmd1bWVudHMgaXQgcmVjZWl2ZWQuCisKK30KKworQExpYkVudHJ5e3NldG1ldGF0YWJsZSAodGFibGUsIG1ldGF0YWJsZSl8CisKK1NldHMgdGhlIG1ldGF0YWJsZSBmb3IgdGhlIGdpdmVuIHRhYmxlLgorKFRvIGNoYW5nZSB0aGUgbWV0YXRhYmxlIG9mIG90aGVyIHR5cGVzIGZyb20gTHVhIGNvZGUsCit5b3UgbXVzdCB1c2UgdGhlIEBsaW5re2RlYnVnbGlifGRlYnVnIGxpYnJhcnl9LikKK0lmIEBpZHttZXRhdGFibGV9IGlzIEBuaWwsCityZW1vdmVzIHRoZSBtZXRhdGFibGUgb2YgdGhlIGdpdmVuIHRhYmxlLgorSWYgdGhlIG9yaWdpbmFsIG1ldGF0YWJsZSBoYXMgYSBAaWR4e19fbWV0YXRhYmxlfSBmaWVsZCwKK3JhaXNlcyBhbiBlcnJvci4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIEBpZHt0YWJsZX0uCisKK30KKworQExpYkVudHJ5e3RvbnVtYmVyIChlIFssIGJhc2VdKXwKKworV2hlbiBjYWxsZWQgd2l0aCBubyBAaWR7YmFzZX0sCitAaWR7dG9udW1iZXJ9IHRyaWVzIHRvIGNvbnZlcnQgaXRzIGFyZ3VtZW50IHRvIGEgbnVtYmVyLgorSWYgdGhlIGFyZ3VtZW50IGlzIGFscmVhZHkgYSBudW1iZXIgb3IKK2Egc3RyaW5nIGNvbnZlcnRpYmxlIHRvIGEgbnVtYmVyLAordGhlbiBAaWR7dG9udW1iZXJ9IHJldHVybnMgdGhpcyBudW1iZXI7CitvdGhlcndpc2UsIGl0IHJldHVybnMgQG5pbC4KKworVGhlIGNvbnZlcnNpb24gb2Ygc3RyaW5ncyBjYW4gcmVzdWx0IGluIGludGVnZXJzIG9yIGZsb2F0cywKK2FjY29yZGluZyB0byB0aGUgbGV4aWNhbCBjb252ZW50aW9ucyBvZiBMdWEgQHNlZXtsZXhpY2FsfS4KKyhUaGUgc3RyaW5nIG1heSBoYXZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBhbmQgYSBzaWduLikKKworV2hlbiBjYWxsZWQgd2l0aCBAaWR7YmFzZX0sCit0aGVuIEBpZHtlfSBtdXN0IGJlIGEgc3RyaW5nIHRvIGJlIGludGVycHJldGVkIGFzCithbiBpbnRlZ2VyIG51bWVyYWwgaW4gdGhhdCBiYXNlLgorVGhlIGJhc2UgbWF5IGJlIGFueSBpbnRlZ2VyIGJldHdlZW4gMiBhbmQgMzYsIGluY2x1c2l2ZS4KK0luIGJhc2VzIEBOe2Fib3ZlIDEwfSwgdGhlIGxldHRlciBAQ2hhcntBfSAoaW4gZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UpCitATntyZXByZXNlbnRzIDEwfSwgQENoYXJ7Qn0gQE57cmVwcmVzZW50cyAxMX0sIGFuZCBzbyBmb3J0aCwKK3dpdGggQENoYXJ7Wn0gcmVwcmVzZW50aW5nIDM1LgorSWYgdGhlIHN0cmluZyBAaWR7ZX0gaXMgbm90IGEgdmFsaWQgbnVtZXJhbCBpbiB0aGUgZ2l2ZW4gYmFzZSwKK3RoZSBmdW5jdGlvbiByZXR1cm5zIEBuaWwuCisKK30KKworQExpYkVudHJ5e3Rvc3RyaW5nICh2KXwKK1JlY2VpdmVzIGEgdmFsdWUgb2YgYW55IHR5cGUgYW5kCitjb252ZXJ0cyBpdCB0byBhIHN0cmluZyBpbiBhIGh1bWFuLXJlYWRhYmxlIGZvcm1hdC4KKyhGb3IgY29tcGxldGUgY29udHJvbCBvZiBob3cgbnVtYmVycyBhcmUgY29udmVydGVkLAordXNlIEBMaWR7c3RyaW5nLmZvcm1hdH0uKQorCitJZiB0aGUgbWV0YXRhYmxlIG9mIEBpZHt2fSBoYXMgYSBAaWR4e19fdG9zdHJpbmd9IGZpZWxkLAordGhlbiBAaWR7dG9zdHJpbmd9IGNhbGxzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlCit3aXRoIEBpZHt2fSBhcyBhcmd1bWVudCwKK2FuZCB1c2VzIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgYXMgaXRzIHJlc3VsdC4KKworfQorCitATGliRW50cnl7dHlwZSAodil8CitSZXR1cm5zIHRoZSB0eXBlIG9mIGl0cyBvbmx5IGFyZ3VtZW50LCBjb2RlZCBhcyBhIHN0cmluZy4KK1RoZSBwb3NzaWJsZSByZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gYXJlCitAU3R7bmlsfSAoYSBzdHJpbmcsIG5vdCB0aGUgdmFsdWUgQG5pbCksCitAU3R7bnVtYmVyfSwKK0BTdHtzdHJpbmd9LAorQFN0e2Jvb2xlYW59LAorQFN0e3RhYmxlfSwKK0BTdHtmdW5jdGlvbn0sCitAU3R7dGhyZWFkfSwKK2FuZCBAU3R7dXNlcmRhdGF9LgorCit9CisKK0BMaWJFbnRyeXtfVkVSU0lPTnwKKworQSBnbG9iYWwgdmFyaWFibGUgKG5vdCBhIGZ1bmN0aW9uKSB0aGF0Citob2xkcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBydW5uaW5nIEx1YSB2ZXJzaW9uLgorVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBpcyBAU3R7THVhIDUuNH0uCisKK30KKworQExpYkVudHJ5e3hwY2FsbCAoZiwgbXNnaCBbLCBhcmcxLCBAQ2RvdHNdKXwKKworVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIEBMaWR7cGNhbGx9LAorZXhjZXB0IHRoYXQgaXQgc2V0cyBhIG5ldyBAeHttZXNzYWdlIGhhbmRsZXJ9IEBpZHttc2dofS4KKworfQorCit9CisKK0BzZWN0Mntjb3JvbGlifCBAdGl0bGV7Q29yb3V0aW5lIE1hbmlwdWxhdGlvbn0KKworVGhpcyBsaWJyYXJ5IGNvbXByaXNlcyB0aGUgb3BlcmF0aW9ucyB0byBtYW5pcHVsYXRlIGNvcm91dGluZXMsCit3aGljaCBjb21lIGluc2lkZSB0aGUgdGFibGUgQGRlZmlke2Nvcm91dGluZX0uCitTZWUgQFNlZXtjb3JvdXRpbmV9IGZvciBhIGdlbmVyYWwgZGVzY3JpcHRpb24gb2YgY29yb3V0aW5lcy4KKworCitATGliRW50cnl7Y29yb3V0aW5lLmNyZWF0ZSAoZil8CisKK0NyZWF0ZXMgYSBuZXcgY29yb3V0aW5lLCB3aXRoIGJvZHkgQGlke2Z9LgorQGlke2Z9IG11c3QgYmUgYSBmdW5jdGlvbi4KK1JldHVybnMgdGhpcyBuZXcgY29yb3V0aW5lLAorYW4gb2JqZWN0IHdpdGggdHlwZSBAVHsidGhyZWFkIn0uCisKK30KKworQExpYkVudHJ5e2Nvcm91dGluZS5pc3lpZWxkYWJsZSAoKXwKKworUmV0dXJucyB0cnVlIHdoZW4gdGhlIHJ1bm5pbmcgY29yb3V0aW5lIGNhbiB5aWVsZC4KKworQSBydW5uaW5nIGNvcm91dGluZSBpcyB5aWVsZGFibGUgaWYgaXQgaXMgbm90IHRoZSBtYWluIHRocmVhZCBhbmQKK2l0IGlzIG5vdCBpbnNpZGUgYSBub24teWllbGRhYmxlIEBOe0MgZnVuY3Rpb259LgorCit9CisKK0BMaWJFbnRyeXtjb3JvdXRpbmUucmVzdW1lIChjbyBbLCB2YWwxLCBAQ2RvdHNdKXwKKworU3RhcnRzIG9yIGNvbnRpbnVlcyB0aGUgZXhlY3V0aW9uIG9mIGNvcm91dGluZSBAaWR7Y299LgorVGhlIGZpcnN0IHRpbWUgeW91IHJlc3VtZSBhIGNvcm91dGluZSwKK2l0IHN0YXJ0cyBydW5uaW5nIGl0cyBib2R5LgorVGhlIHZhbHVlcyBAaWR7dmFsMX0sIEBsZG90cyBhcmUgcGFzc2VkCithcyB0aGUgYXJndW1lbnRzIHRvIHRoZSBib2R5IGZ1bmN0aW9uLgorSWYgdGhlIGNvcm91dGluZSBoYXMgeWllbGRlZCwKK0BpZHtyZXN1bWV9IHJlc3RhcnRzIGl0OwordGhlIHZhbHVlcyBAaWR7dmFsMX0sIEBsZG90cyBhcmUgcGFzc2VkCithcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSB5aWVsZC4KKworSWYgdGhlIGNvcm91dGluZSBydW5zIHdpdGhvdXQgYW55IGVycm9ycywKK0BpZHtyZXN1bWV9IHJldHVybnMgQHRydWUgcGx1cyBhbnkgdmFsdWVzIHBhc3NlZCB0byBAaWR7eWllbGR9Cisod2hlbiB0aGUgY29yb3V0aW5lIHlpZWxkcykgb3IgYW55IHZhbHVlcyByZXR1cm5lZCBieSB0aGUgYm9keSBmdW5jdGlvbgorKHdoZW4gdGhlIGNvcm91dGluZSB0ZXJtaW5hdGVzKS4KK0lmIHRoZXJlIGlzIGFueSBlcnJvciwKK0BpZHtyZXN1bWV9IHJldHVybnMgQGZhbHNlIHBsdXMgdGhlIGVycm9yIG1lc3NhZ2UuCisKK30KKworQExpYkVudHJ5e2Nvcm91dGluZS5ydW5uaW5nICgpfAorCitSZXR1cm5zIHRoZSBydW5uaW5nIGNvcm91dGluZSBwbHVzIGEgYm9vbGVhbiwKK3RydWUgd2hlbiB0aGUgcnVubmluZyBjb3JvdXRpbmUgaXMgdGhlIG1haW4gb25lLgorCit9CisKK0BMaWJFbnRyeXtjb3JvdXRpbmUuc3RhdHVzIChjbyl8CisKK1JldHVybnMgdGhlIHN0YXR1cyBvZiBjb3JvdXRpbmUgQGlke2NvfSwgYXMgYSBzdHJpbmc6CitAVHsicnVubmluZyJ9LAoraWYgdGhlIGNvcm91dGluZSBpcyBydW5uaW5nICh0aGF0IGlzLCBpdCBjYWxsZWQgQGlke3N0YXR1c30pOworQFR7InN1c3BlbmRlZCJ9LCBpZiB0aGUgY29yb3V0aW5lIGlzIHN1c3BlbmRlZCBpbiBhIGNhbGwgdG8gQGlke3lpZWxkfSwKK29yIGlmIGl0IGhhcyBub3Qgc3RhcnRlZCBydW5uaW5nIHlldDsKK0BUeyJub3JtYWwifSBpZiB0aGUgY29yb3V0aW5lIGlzIGFjdGl2ZSBidXQgbm90IHJ1bm5pbmcKKyh0aGF0IGlzLCBpdCBoYXMgcmVzdW1lZCBhbm90aGVyIGNvcm91dGluZSk7CithbmQgQFR7ImRlYWQifSBpZiB0aGUgY29yb3V0aW5lIGhhcyBmaW5pc2hlZCBpdHMgYm9keSBmdW5jdGlvbiwKK29yIGlmIGl0IGhhcyBzdG9wcGVkIHdpdGggYW4gZXJyb3IuCisKK30KKworQExpYkVudHJ5e2Nvcm91dGluZS53cmFwIChmKXwKKworQ3JlYXRlcyBhIG5ldyBjb3JvdXRpbmUsIHdpdGggYm9keSBAaWR7Zn0uCitAaWR7Zn0gbXVzdCBiZSBhIGZ1bmN0aW9uLgorUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmVzdW1lcyB0aGUgY29yb3V0aW5lIGVhY2ggdGltZSBpdCBpcyBjYWxsZWQuCitBbnkgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYmVoYXZlIGFzIHRoZQorZXh0cmEgYXJndW1lbnRzIHRvIEBpZHtyZXN1bWV9LgorUmV0dXJucyB0aGUgc2FtZSB2YWx1ZXMgcmV0dXJuZWQgYnkgQGlke3Jlc3VtZX0sCitleGNlcHQgdGhlIGZpcnN0IGJvb2xlYW4uCitJbiBjYXNlIG9mIGVycm9yLCBwcm9wYWdhdGVzIHRoZSBlcnJvci4KKworfQorCitATGliRW50cnl7Y29yb3V0aW5lLnlpZWxkIChAQ2RvdHMpfAorCitTdXNwZW5kcyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjYWxsaW5nIGNvcm91dGluZS4KK0FueSBhcmd1bWVudHMgdG8gQGlke3lpZWxkfSBhcmUgcGFzc2VkIGFzIGV4dHJhIHJlc3VsdHMgdG8gQGlke3Jlc3VtZX0uCisKK30KKworfQorCitAc2VjdDJ7cGFja2xpYnwgQHRpdGxle01vZHVsZXN9CisKK1RoZSBwYWNrYWdlIGxpYnJhcnkgcHJvdmlkZXMgYmFzaWMKK2ZhY2lsaXRpZXMgZm9yIGxvYWRpbmcgbW9kdWxlcyBpbiBMdWEuCitJdCBleHBvcnRzIG9uZSBmdW5jdGlvbiBkaXJlY3RseSBpbiB0aGUgZ2xvYmFsIGVudmlyb25tZW50OgorQExpZHtyZXF1aXJlfS4KK0V2ZXJ5dGhpbmcgZWxzZSBpcyBleHBvcnRlZCBpbiBhIHRhYmxlIEBkZWZpZHtwYWNrYWdlfS4KKworCitATGliRW50cnl7cmVxdWlyZSAobW9kbmFtZSl8CisKK0xvYWRzIHRoZSBnaXZlbiBtb2R1bGUuCitUaGUgZnVuY3Rpb24gc3RhcnRzIGJ5IGxvb2tpbmcgaW50byB0aGUgQExpZHtwYWNrYWdlLmxvYWRlZH0gdGFibGUKK3RvIGRldGVybWluZSB3aGV0aGVyIEBpZHttb2RuYW1lfSBpcyBhbHJlYWR5IGxvYWRlZC4KK0lmIGl0IGlzLCB0aGVuIEBpZHtyZXF1aXJlfSByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQKK2F0IEBUe3BhY2thZ2UubG9hZGVkW21vZG5hbWVdfS4KK090aGVyd2lzZSwgaXQgdHJpZXMgdG8gZmluZCBhIEBlbXBoe2xvYWRlcn0gZm9yIHRoZSBtb2R1bGUuCisKK1RvIGZpbmQgYSBsb2FkZXIsCitAaWR7cmVxdWlyZX0gaXMgZ3VpZGVkIGJ5IHRoZSBATGlke3BhY2thZ2Uuc2VhcmNoZXJzfSBzZXF1ZW5jZS4KK0J5IGNoYW5naW5nIHRoaXMgc2VxdWVuY2UsCit3ZSBjYW4gY2hhbmdlIGhvdyBAaWR7cmVxdWlyZX0gbG9va3MgZm9yIGEgbW9kdWxlLgorVGhlIGZvbGxvd2luZyBleHBsYW5hdGlvbiBpcyBiYXNlZCBvbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCitmb3IgQExpZHtwYWNrYWdlLnNlYXJjaGVyc30uCisKK0ZpcnN0IEBpZHtyZXF1aXJlfSBxdWVyaWVzIEBUe3BhY2thZ2UucHJlbG9hZFttb2RuYW1lXX0uCitJZiBpdCBoYXMgYSB2YWx1ZSwKK3RoaXMgdmFsdWUgKHdoaWNoIG11c3QgYmUgYSBmdW5jdGlvbikgaXMgdGhlIGxvYWRlci4KK090aGVyd2lzZSBAaWR7cmVxdWlyZX0gc2VhcmNoZXMgZm9yIGEgTHVhIGxvYWRlciB1c2luZyB0aGUKK3BhdGggc3RvcmVkIGluIEBMaWR7cGFja2FnZS5wYXRofS4KK0lmIHRoYXQgYWxzbyBmYWlscywgaXQgc2VhcmNoZXMgZm9yIGEgQE57QyBsb2FkZXJ9IHVzaW5nIHRoZQorcGF0aCBzdG9yZWQgaW4gQExpZHtwYWNrYWdlLmNwYXRofS4KK0lmIHRoYXQgYWxzbyBmYWlscywKK2l0IHRyaWVzIGFuIEBlbXBoe2FsbC1pbi1vbmV9IGxvYWRlciBAc2VlRntwYWNrYWdlLnNlYXJjaGVyc30uCisKK09uY2UgYSBsb2FkZXIgaXMgZm91bmQsCitAaWR7cmVxdWlyZX0gY2FsbHMgdGhlIGxvYWRlciB3aXRoIHR3byBhcmd1bWVudHM6CitAaWR7bW9kbmFtZX0gYW5kIGFuIGV4dHJhIHZhbHVlIGRlcGVuZGVudCBvbiBob3cgaXQgZ290IHRoZSBsb2FkZXIuCisoSWYgdGhlIGxvYWRlciBjYW1lIGZyb20gYSBmaWxlLAordGhpcyBleHRyYSB2YWx1ZSBpcyB0aGUgZmlsZSBuYW1lLikKK0lmIHRoZSBsb2FkZXIgcmV0dXJucyBhbnkgbm9uLW5pbCB2YWx1ZSwKK0BpZHtyZXF1aXJlfSBhc3NpZ25zIHRoZSByZXR1cm5lZCB2YWx1ZSB0byBAVHtwYWNrYWdlLmxvYWRlZFttb2RuYW1lXX0uCitJZiB0aGUgbG9hZGVyIGRvZXMgbm90IHJldHVybiBhIG5vbi1uaWwgdmFsdWUgYW5kCitoYXMgbm90IGFzc2lnbmVkIGFueSB2YWx1ZSB0byBAVHtwYWNrYWdlLmxvYWRlZFttb2RuYW1lXX0sCit0aGVuIEBpZHtyZXF1aXJlfSBhc3NpZ25zIEBSd3t0cnVlfSB0byB0aGlzIGVudHJ5LgorSW4gYW55IGNhc2UsIEBpZHtyZXF1aXJlfSByZXR1cm5zIHRoZQorZmluYWwgdmFsdWUgb2YgQFR7cGFja2FnZS5sb2FkZWRbbW9kbmFtZV19LgorCitJZiB0aGVyZSBpcyBhbnkgZXJyb3IgbG9hZGluZyBvciBydW5uaW5nIHRoZSBtb2R1bGUsCitvciBpZiBpdCBjYW5ub3QgZmluZCBhbnkgbG9hZGVyIGZvciB0aGUgbW9kdWxlLAordGhlbiBAaWR7cmVxdWlyZX0gcmFpc2VzIGFuIGVycm9yLgorCit9CisKK0BMaWJFbnRyeXtwYWNrYWdlLmNvbmZpZ3wKKworQSBzdHJpbmcgZGVzY3JpYmluZyBzb21lIGNvbXBpbGUtdGltZSBjb25maWd1cmF0aW9ucyBmb3IgcGFja2FnZXMuCitUaGlzIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIGxpbmVzOgorQGl0ZW1pemV7CisKK0BpdGVte1RoZSBmaXJzdCBsaW5lIGlzIHRoZSBAeHtkaXJlY3Rvcnkgc2VwYXJhdG9yfSBzdHJpbmcuCitEZWZhdWx0IGlzIEBDaGFye1x9IGZvciBAeHtXaW5kb3dzfSBhbmQgQENoYXJ7L30gZm9yIGFsbCBvdGhlciBzeXN0ZW1zLn0KKworQGl0ZW17VGhlIHNlY29uZCBsaW5lIGlzIHRoZSBjaGFyYWN0ZXIgdGhhdCBzZXBhcmF0ZXMgdGVtcGxhdGVzIGluIGEgcGF0aC4KK0RlZmF1bHQgaXMgQENoYXJ7O30ufQorCitAaXRlbXtUaGUgdGhpcmQgbGluZSBpcyB0aGUgc3RyaW5nIHRoYXQgbWFya3MgdGhlCitzdWJzdGl0dXRpb24gcG9pbnRzIGluIGEgdGVtcGxhdGUuCitEZWZhdWx0IGlzIEBDaGFyez99Ln0KKworQGl0ZW17VGhlIGZvdXJ0aCBsaW5lIGlzIGEgc3RyaW5nIHRoYXQsIGluIGEgcGF0aCBpbiBAeHtXaW5kb3dzfSwKK2lzIHJlcGxhY2VkIGJ5IHRoZSBleGVjdXRhYmxlJ3MgZGlyZWN0b3J5LgorRGVmYXVsdCBpcyBAQ2hhcnshfS59CisKK0BpdGVte1RoZSBmaWZ0aCBsaW5lIGlzIGEgbWFyayB0byBpZ25vcmUgYWxsIHRleHQgYWZ0ZXIgaXQKK3doZW4gYnVpbGRpbmcgdGhlIEBpZHtsdWFvcGVuX30gZnVuY3Rpb24gbmFtZS4KK0RlZmF1bHQgaXMgQENoYXJ7LX0ufQorCit9CisKK30KKworQExpYkVudHJ5e3BhY2thZ2UuY3BhdGh8CisKK1RoZSBwYXRoIHVzZWQgYnkgQExpZHtyZXF1aXJlfSB0byBzZWFyY2ggZm9yIGEgQE57QyBsb2FkZXJ9LgorCitMdWEgaW5pdGlhbGl6ZXMgdGhlIEBOe0MgcGF0aH0gQExpZHtwYWNrYWdlLmNwYXRofSBpbiB0aGUgc2FtZSB3YXkKK2l0IGluaXRpYWxpemVzIHRoZSBMdWEgcGF0aCBATGlke3BhY2thZ2UucGF0aH0sCit1c2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQGRlZmlke0xVQV9DUEFUSF81XzR9LAorb3IgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEBkZWZpZHtMVUFfQ1BBVEh9LAorb3IgYSBkZWZhdWx0IHBhdGggZGVmaW5lZCBpbiBAaWR7bHVhY29uZi5ofS4KKworfQorCitATGliRW50cnl7cGFja2FnZS5sb2FkZWR8CisKK0EgdGFibGUgdXNlZCBieSBATGlke3JlcXVpcmV9IHRvIGNvbnRyb2wgd2hpY2gKK21vZHVsZXMgYXJlIGFscmVhZHkgbG9hZGVkLgorV2hlbiB5b3UgcmVxdWlyZSBhIG1vZHVsZSBAaWR7bW9kbmFtZX0gYW5kCitAVHtwYWNrYWdlLmxvYWRlZFttb2RuYW1lXX0gaXMgbm90IGZhbHNlLAorQExpZHtyZXF1aXJlfSBzaW1wbHkgcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkIHRoZXJlLgorCitUaGlzIHZhcmlhYmxlIGlzIG9ubHkgYSByZWZlcmVuY2UgdG8gdGhlIHJlYWwgdGFibGU7Cithc3NpZ25tZW50cyB0byB0aGlzIHZhcmlhYmxlIGRvIG5vdCBjaGFuZ2UgdGhlCit0YWJsZSB1c2VkIGJ5IEBMaWR7cmVxdWlyZX0uCisKK30KKworQExpYkVudHJ5e3BhY2thZ2UubG9hZGxpYiAobGlibmFtZSwgZnVuY25hbWUpfAorCitEeW5hbWljYWxseSBsaW5rcyB0aGUgaG9zdCBwcm9ncmFtIHdpdGggdGhlIEBOe0MgbGlicmFyeX0gQGlke2xpYm5hbWV9LgorCitJZiBAaWR7ZnVuY25hbWV9IGlzIEBTdHsqfSwKK3RoZW4gaXQgb25seSBsaW5rcyB3aXRoIHRoZSBsaWJyYXJ5LAorbWFraW5nIHRoZSBzeW1ib2xzIGV4cG9ydGVkIGJ5IHRoZSBsaWJyYXJ5CithdmFpbGFibGUgdG8gb3RoZXIgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcmllcy4KK090aGVyd2lzZSwKK2l0IGxvb2tzIGZvciBhIGZ1bmN0aW9uIEBpZHtmdW5jbmFtZX0gaW5zaWRlIHRoZSBsaWJyYXJ5CithbmQgcmV0dXJucyB0aGlzIGZ1bmN0aW9uIGFzIGEgQE57QyBmdW5jdGlvbn0uCitTbywgQGlke2Z1bmNuYW1lfSBtdXN0IGZvbGxvdyB0aGUgQExpZHtsdWFfQ0Z1bmN0aW9ufSBwcm90b3R5cGUKK0BzZWVDe2x1YV9DRnVuY3Rpb259LgorCitUaGlzIGlzIGEgbG93LWxldmVsIGZ1bmN0aW9uLgorSXQgY29tcGxldGVseSBieXBhc3NlcyB0aGUgcGFja2FnZSBhbmQgbW9kdWxlIHN5c3RlbS4KK1VubGlrZSBATGlke3JlcXVpcmV9LAoraXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgcGF0aCBzZWFyY2hpbmcgYW5kCitkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGFkZHMgZXh0ZW5zaW9ucy4KK0BpZHtsaWJuYW1lfSBtdXN0IGJlIHRoZSBjb21wbGV0ZSBmaWxlIG5hbWUgb2YgdGhlIEBOe0MgbGlicmFyeX0sCitpbmNsdWRpbmcgaWYgbmVjZXNzYXJ5IGEgcGF0aCBhbmQgYW4gZXh0ZW5zaW9uLgorQGlke2Z1bmNuYW1lfSBtdXN0IGJlIHRoZSBleGFjdCBuYW1lIGV4cG9ydGVkIGJ5IHRoZSBATntDIGxpYnJhcnl9Cisod2hpY2ggbWF5IGRlcGVuZCBvbiB0aGUgQE57QyBjb21waWxlcn0gYW5kIGxpbmtlciB1c2VkKS4KKworVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IEBOe1N0YW5kYXJkIEN9LgorQXMgc3VjaCwgaXQgaXMgb25seSBhdmFpbGFibGUgb24gc29tZSBwbGF0Zm9ybXMKKyhXaW5kb3dzLCBMaW51eCwgTWFjIE9TIFgsIFNvbGFyaXMsIEJTRCwKK3BsdXMgb3RoZXIgVW5peCBzeXN0ZW1zIHRoYXQgc3VwcG9ydCB0aGUgQGlke2RsZmNufSBzdGFuZGFyZCkuCisKK30KKworQExpYkVudHJ5e3BhY2thZ2UucGF0aHwKKworVGhlIHBhdGggdXNlZCBieSBATGlke3JlcXVpcmV9IHRvIHNlYXJjaCBmb3IgYSBMdWEgbG9hZGVyLgorCitBdCBzdGFydC11cCwgTHVhIGluaXRpYWxpemVzIHRoaXMgdmFyaWFibGUgd2l0aAordGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBAZGVmaWR7TFVBX1BBVEhfNV80fSBvcgordGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEBkZWZpZHtMVUFfUEFUSH0gb3IKK3dpdGggYSBkZWZhdWx0IHBhdGggZGVmaW5lZCBpbiBAaWR7bHVhY29uZi5ofSwKK2lmIHRob3NlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IGRlZmluZWQuCitBbnkgQFN0ezs7fSBpbiB0aGUgdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCitpcyByZXBsYWNlZCBieSB0aGUgZGVmYXVsdCBwYXRoLgorCit9CisKK0BMaWJFbnRyeXtwYWNrYWdlLnByZWxvYWR8CisKK0EgdGFibGUgdG8gc3RvcmUgbG9hZGVycyBmb3Igc3BlY2lmaWMgbW9kdWxlcworQHNlZUZ7cmVxdWlyZX0uCisKK1RoaXMgdmFyaWFibGUgaXMgb25seSBhIHJlZmVyZW5jZSB0byB0aGUgcmVhbCB0YWJsZTsKK2Fzc2lnbm1lbnRzIHRvIHRoaXMgdmFyaWFibGUgZG8gbm90IGNoYW5nZSB0aGUKK3RhYmxlIHVzZWQgYnkgQExpZHtyZXF1aXJlfS4KKworfQorCitATGliRW50cnl7cGFja2FnZS5zZWFyY2hlcnN8CisKK0EgdGFibGUgdXNlZCBieSBATGlke3JlcXVpcmV9IHRvIGNvbnRyb2wgaG93IHRvIGxvYWQgbW9kdWxlcy4KKworRWFjaCBlbnRyeSBpbiB0aGlzIHRhYmxlIGlzIGEgQGRlZntzZWFyY2hlciBmdW5jdGlvbn0uCitXaGVuIGxvb2tpbmcgZm9yIGEgbW9kdWxlLAorQExpZHtyZXF1aXJlfSBjYWxscyBlYWNoIG9mIHRoZXNlIHNlYXJjaGVycyBpbiBhc2NlbmRpbmcgb3JkZXIsCit3aXRoIHRoZSBtb2R1bGUgbmFtZSAodGhlIGFyZ3VtZW50IGdpdmVuIHRvIEBMaWR7cmVxdWlyZX0pIGFzIGl0cworc29sZSBwYXJhbWV0ZXIuCitUaGUgZnVuY3Rpb24gY2FuIHJldHVybiBhbm90aGVyIGZ1bmN0aW9uICh0aGUgbW9kdWxlIEBkZWZ7bG9hZGVyfSkKK3BsdXMgYW4gZXh0cmEgdmFsdWUgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGF0IGxvYWRlciwKK29yIGEgc3RyaW5nIGV4cGxhaW5pbmcgd2h5IGl0IGRpZCBub3QgZmluZCB0aGF0IG1vZHVsZQorKG9yIEBuaWwgaWYgaXQgaGFzIG5vdGhpbmcgdG8gc2F5KS4KKworTHVhIGluaXRpYWxpemVzIHRoaXMgdGFibGUgd2l0aCBmb3VyIHNlYXJjaGVyIGZ1bmN0aW9ucy4KKworVGhlIGZpcnN0IHNlYXJjaGVyIHNpbXBseSBsb29rcyBmb3IgYSBsb2FkZXIgaW4gdGhlCitATGlke3BhY2thZ2UucHJlbG9hZH0gdGFibGUuCisKK1RoZSBzZWNvbmQgc2VhcmNoZXIgbG9va3MgZm9yIGEgbG9hZGVyIGFzIGEgTHVhIGxpYnJhcnksCit1c2luZyB0aGUgcGF0aCBzdG9yZWQgYXQgQExpZHtwYWNrYWdlLnBhdGh9LgorVGhlIHNlYXJjaCBpcyBkb25lIGFzIGRlc2NyaWJlZCBpbiBmdW5jdGlvbiBATGlke3BhY2thZ2Uuc2VhcmNocGF0aH0uCisKK1RoZSB0aGlyZCBzZWFyY2hlciBsb29rcyBmb3IgYSBsb2FkZXIgYXMgYSBATntDIGxpYnJhcnl9LAordXNpbmcgdGhlIHBhdGggZ2l2ZW4gYnkgdGhlIHZhcmlhYmxlIEBMaWR7cGFja2FnZS5jcGF0aH0uCitBZ2FpbiwKK3RoZSBzZWFyY2ggaXMgZG9uZSBhcyBkZXNjcmliZWQgaW4gZnVuY3Rpb24gQExpZHtwYWNrYWdlLnNlYXJjaHBhdGh9LgorRm9yIGluc3RhbmNlLAoraWYgdGhlIEBOe0MgcGF0aH0gaXMgdGhlIHN0cmluZworQHZlcmJhdGlteworIi4vPy5zbzsuLz8uZGxsOy91c3IvbG9jYWwvPy9pbml0LnNvIgorfQordGhlIHNlYXJjaGVyIGZvciBtb2R1bGUgQGlke2Zvb30KK3dpbGwgdHJ5IHRvIG9wZW4gdGhlIGZpbGVzIEBUey4vZm9vLnNvfSwgQFR7Li9mb28uZGxsfSwKK2FuZCBAVHsvdXNyL2xvY2FsL2Zvby9pbml0LnNvfSwgaW4gdGhhdCBvcmRlci4KK09uY2UgaXQgZmluZHMgYSBATntDIGxpYnJhcnl9LAordGhpcyBzZWFyY2hlciBmaXJzdCB1c2VzIGEgZHluYW1pYyBsaW5rIGZhY2lsaXR5IHRvIGxpbmsgdGhlCithcHBsaWNhdGlvbiB3aXRoIHRoZSBsaWJyYXJ5LgorVGhlbiBpdCB0cmllcyB0byBmaW5kIGEgQE57QyBmdW5jdGlvbn0gaW5zaWRlIHRoZSBsaWJyYXJ5IHRvCitiZSB1c2VkIGFzIHRoZSBsb2FkZXIuCitUaGUgbmFtZSBvZiB0aGlzIEBOe0MgZnVuY3Rpb259IGlzIHRoZSBzdHJpbmcgQFN0e2x1YW9wZW5ffQorY29uY2F0ZW5hdGVkIHdpdGggYSBjb3B5IG9mIHRoZSBtb2R1bGUgbmFtZSB3aGVyZSBlYWNoIGRvdAoraXMgcmVwbGFjZWQgYnkgYW4gdW5kZXJzY29yZS4KK01vcmVvdmVyLCBpZiB0aGUgbW9kdWxlIG5hbWUgaGFzIGEgaHlwaGVuLAoraXRzIHN1ZmZpeCBhZnRlciAoYW5kIGluY2x1ZGluZykgdGhlIGZpcnN0IGh5cGhlbiBpcyByZW1vdmVkLgorRm9yIGluc3RhbmNlLCBpZiB0aGUgbW9kdWxlIG5hbWUgaXMgQGlke2EuYi5jLXYyLjF9LAordGhlIGZ1bmN0aW9uIG5hbWUgd2lsbCBiZSBAaWR7bHVhb3Blbl9hX2JfY30uCisKK1RoZSBmb3VydGggc2VhcmNoZXIgdHJpZXMgYW4gQGRlZnthbGwtaW4tb25lIGxvYWRlcn0uCitJdCBzZWFyY2hlcyB0aGUgQE57QyBwYXRofSBmb3IgYSBsaWJyYXJ5IGZvcgordGhlIHJvb3QgbmFtZSBvZiB0aGUgZ2l2ZW4gbW9kdWxlLgorRm9yIGluc3RhbmNlLCB3aGVuIHJlcXVpcmluZyBAaWR7YS5iLmN9LAoraXQgd2lsbCBzZWFyY2ggZm9yIGEgQE57QyBsaWJyYXJ5fSBmb3IgQGlke2F9LgorSWYgZm91bmQsIGl0IGxvb2tzIGludG8gaXQgZm9yIGFuIG9wZW4gZnVuY3Rpb24gZm9yCit0aGUgc3VibW9kdWxlOworaW4gb3VyIGV4YW1wbGUsIHRoYXQgd291bGQgYmUgQGlke2x1YW9wZW5fYV9iX2N9LgorV2l0aCB0aGlzIGZhY2lsaXR5LCBhIHBhY2thZ2UgY2FuIHBhY2sgc2V2ZXJhbCBATntDIHN1Ym1vZHVsZXN9CitpbnRvIG9uZSBzaW5nbGUgbGlicmFyeSwKK3dpdGggZWFjaCBzdWJtb2R1bGUga2VlcGluZyBpdHMgb3JpZ2luYWwgb3BlbiBmdW5jdGlvbi4KKworQWxsIHNlYXJjaGVycyBleGNlcHQgdGhlIGZpcnN0IG9uZSAocHJlbG9hZCkgcmV0dXJuIGFzIHRoZSBleHRyYSB2YWx1ZQordGhlIGZpbGUgbmFtZSB3aGVyZSB0aGUgbW9kdWxlIHdhcyBmb3VuZCwKK2FzIHJldHVybmVkIGJ5IEBMaWR7cGFja2FnZS5zZWFyY2hwYXRofS4KK1RoZSBmaXJzdCBzZWFyY2hlciByZXR1cm5zIG5vIGV4dHJhIHZhbHVlLgorCit9CisKK0BMaWJFbnRyeXtwYWNrYWdlLnNlYXJjaHBhdGggKG5hbWUsIHBhdGggWywgc2VwIFssIHJlcF1dKXwKKworU2VhcmNoZXMgZm9yIHRoZSBnaXZlbiBAaWR7bmFtZX0gaW4gdGhlIGdpdmVuIEBpZHtwYXRofS4KKworQSBwYXRoIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzZXF1ZW5jZSBvZgorQGVtcGh7dGVtcGxhdGVzfSBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucy4KK0ZvciBlYWNoIHRlbXBsYXRlLAordGhlIGZ1bmN0aW9uIHJlcGxhY2VzIGVhY2ggaW50ZXJyb2dhdGlvbiBtYXJrIChpZiBhbnkpCitpbiB0aGUgdGVtcGxhdGUgd2l0aCBhIGNvcHkgb2YgQGlke25hbWV9Cit3aGVyZWluIGFsbCBvY2N1cnJlbmNlcyBvZiBAaWR7c2VwfQorKGEgZG90LCBieSBkZWZhdWx0KQord2VyZSByZXBsYWNlZCBieSBAaWR7cmVwfQorKHRoZSBzeXN0ZW0ncyBkaXJlY3Rvcnkgc2VwYXJhdG9yLCBieSBkZWZhdWx0KSwKK2FuZCB0aGVuIHRyaWVzIHRvIG9wZW4gdGhlIHJlc3VsdGluZyBmaWxlIG5hbWUuCisKK0ZvciBpbnN0YW5jZSwgaWYgdGhlIHBhdGggaXMgdGhlIHN0cmluZworQHZlcmJhdGlteworIi4vPy5sdWE7Li8/LmxjOy91c3IvbG9jYWwvPy9pbml0Lmx1YSIKK30KK3RoZSBzZWFyY2ggZm9yIHRoZSBuYW1lIEBpZHtmb28uYX0KK3dpbGwgdHJ5IHRvIG9wZW4gdGhlIGZpbGVzCitAVHsuL2Zvby9hLmx1YX0sIEBUey4vZm9vL2EubGN9LCBhbmQKK0BUey91c3IvbG9jYWwvZm9vL2EvaW5pdC5sdWF9LCBpbiB0aGF0IG9yZGVyLgorCitSZXR1cm5zIHRoZSByZXN1bHRpbmcgbmFtZSBvZiB0aGUgZmlyc3QgZmlsZSB0aGF0IGl0IGNhbgorb3BlbiBpbiByZWFkIG1vZGUgKGFmdGVyIGNsb3NpbmcgdGhlIGZpbGUpLAorb3IgQG5pbCBwbHVzIGFuIGVycm9yIG1lc3NhZ2UgaWYgbm9uZSBzdWNjZWVkcy4KKyhUaGlzIGVycm9yIG1lc3NhZ2UgbGlzdHMgYWxsIGZpbGUgbmFtZXMgaXQgdHJpZWQgdG8gb3Blbi4pCisKK30KKworfQorCitAc2VjdDJ7c3RybGlifCBAdGl0bGV7U3RyaW5nIE1hbmlwdWxhdGlvbn0KKworVGhpcyBsaWJyYXJ5IHByb3ZpZGVzIGdlbmVyaWMgZnVuY3Rpb25zIGZvciBzdHJpbmcgbWFuaXB1bGF0aW9uLAorc3VjaCBhcyBmaW5kaW5nIGFuZCBleHRyYWN0aW5nIHN1YnN0cmluZ3MsIGFuZCBwYXR0ZXJuIG1hdGNoaW5nLgorV2hlbiBpbmRleGluZyBhIHN0cmluZyBpbiBMdWEsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYXQgQE57cG9zaXRpb24gMX0KKyhub3QgQE57YXQgMH0sIGFzIGluIEMpLgorSW5kaWNlcyBhcmUgYWxsb3dlZCB0byBiZSBuZWdhdGl2ZSBhbmQgYXJlIGludGVycHJldGVkIGFzIGluZGV4aW5nIGJhY2t3YXJkcywKK2Zyb20gdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorVGh1cywgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGF0IHBvc2l0aW9uIEBudW17LTF9LCBhbmQgc28gb24uCisKK1RoZSBzdHJpbmcgbGlicmFyeSBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9ucyBpbnNpZGUgdGhlIHRhYmxlCitAZGVmaWR7c3RyaW5nfS4KK0l0IGFsc28gc2V0cyBhIEB4e21ldGF0YWJsZSBmb3Igc3RyaW5nc30KK3doZXJlIHRoZSBAaWR4e19faW5kZXh9IGZpZWxkIHBvaW50cyB0byB0aGUgQGlke3N0cmluZ30gdGFibGUuCitUaGVyZWZvcmUsIHlvdSBjYW4gdXNlIHRoZSBzdHJpbmcgZnVuY3Rpb25zIGluIG9iamVjdC1vcmllbnRlZCBzdHlsZS4KK0ZvciBpbnN0YW5jZSwgQFR7c3RyaW5nLmJ5dGUocyxpKX0KK2NhbiBiZSB3cml0dGVuIGFzIEBUe3M6Ynl0ZShpKX0uCisKK1RoZSBzdHJpbmcgbGlicmFyeSBhc3N1bWVzIG9uZS1ieXRlIGNoYXJhY3RlciBlbmNvZGluZ3MuCisKKworQExpYkVudHJ5e3N0cmluZy5ieXRlIChzIFssIGkgWywgal1dKXwKK1JldHVybnMgdGhlIGludGVybmFsIG51bWVyaWMgY29kZXMgb2YgdGhlIGNoYXJhY3RlcnMgQFR7c1tpXX0sCitAVHtzW2krMV19LCBAbGRvdHMsIEBUe3Nbal19LgorVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEBpZHtpfSBATntpcyAxfTsKK3RoZSBkZWZhdWx0IHZhbHVlIGZvciBAaWR7an0gQE57aXMgQGlke2l9fS4KK1RoZXNlIGluZGljZXMgYXJlIGNvcnJlY3RlZAorZm9sbG93aW5nIHRoZSBzYW1lIHJ1bGVzIG9mIGZ1bmN0aW9uIEBMaWR7c3RyaW5nLnN1Yn0uCisKK051bWVyaWMgY29kZXMgYXJlIG5vdCBuZWNlc3NhcmlseSBwb3J0YWJsZSBhY3Jvc3MgcGxhdGZvcm1zLgorCit9CisKK0BMaWJFbnRyeXtzdHJpbmcuY2hhciAoQENkb3RzKXwKK1JlY2VpdmVzIHplcm8gb3IgbW9yZSBpbnRlZ2Vycy4KK1JldHVybnMgYSBzdHJpbmcgd2l0aCBsZW5ndGggZXF1YWwgdG8gdGhlIG51bWJlciBvZiBhcmd1bWVudHMsCitpbiB3aGljaCBlYWNoIGNoYXJhY3RlciBoYXMgdGhlIGludGVybmFsIG51bWVyaWMgY29kZSBlcXVhbAordG8gaXRzIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuCisKK051bWVyaWMgY29kZXMgYXJlIG5vdCBuZWNlc3NhcmlseSBwb3J0YWJsZSBhY3Jvc3MgcGxhdGZvcm1zLgorCit9CisKK0BMaWJFbnRyeXtzdHJpbmcuZHVtcCAoZnVuY3Rpb24gWywgc3RyaXBdKXwKKworUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uCisoYSBAZW1waHtiaW5hcnkgY2h1bmt9KQorb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLAorc28gdGhhdCBhIGxhdGVyIEBMaWR7bG9hZH0gb24gdGhpcyBzdHJpbmcgcmV0dXJucworYSBjb3B5IG9mIHRoZSBmdW5jdGlvbiAoYnV0IHdpdGggbmV3IHVwdmFsdWVzKS4KK0lmIEBpZHtzdHJpcH0gaXMgYSB0cnVlIHZhbHVlLAordGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBtYXkgbm90IGluY2x1ZGUgYWxsIGRlYnVnIGluZm9ybWF0aW9uCithYm91dCB0aGUgZnVuY3Rpb24sCit0byBzYXZlIHNwYWNlLgorCitGdW5jdGlvbnMgd2l0aCB1cHZhbHVlcyBoYXZlIG9ubHkgdGhlaXIgbnVtYmVyIG9mIHVwdmFsdWVzIHNhdmVkLgorV2hlbiAocmUpbG9hZGVkLAordGhvc2UgdXB2YWx1ZXMgcmVjZWl2ZSBmcmVzaCBpbnN0YW5jZXMgY29udGFpbmluZyBAbmlsLgorKFlvdSBjYW4gdXNlIHRoZSBkZWJ1ZyBsaWJyYXJ5IHRvIHNlcmlhbGl6ZQorYW5kIHJlbG9hZCB0aGUgdXB2YWx1ZXMgb2YgYSBmdW5jdGlvbgoraW4gYSB3YXkgYWRlcXVhdGUgdG8geW91ciBuZWVkcy4pCisKK30KKworQExpYkVudHJ5e3N0cmluZy5maW5kIChzLCBwYXR0ZXJuIFssIGluaXQgWywgcGxhaW5dXSl8CisKK0xvb2tzIGZvciB0aGUgZmlyc3QgbWF0Y2ggb2YKK0BpZHtwYXR0ZXJufSBAc2Vle3BtfSBpbiB0aGUgc3RyaW5nIEBpZHtzfS4KK0lmIGl0IGZpbmRzIGEgbWF0Y2gsIHRoZW4gQGlke2ZpbmR9IHJldHVybnMgdGhlIGluZGljZXMgQE57b2YgQFR7c319Cit3aGVyZSB0aGlzIG9jY3VycmVuY2Ugc3RhcnRzIGFuZCBlbmRzOworb3RoZXJ3aXNlLCBpdCByZXR1cm5zIEBuaWwuCitBIHRoaXJkLCBvcHRpb25hbCBudW1lcmljIGFyZ3VtZW50IEBpZHtpbml0fSBzcGVjaWZpZXMKK3doZXJlIHRvIHN0YXJ0IHRoZSBzZWFyY2g7CitpdHMgZGVmYXVsdCB2YWx1ZSBATntpcyAxfSBhbmQgY2FuIGJlIG5lZ2F0aXZlLgorQSB2YWx1ZSBvZiBAdHJ1ZSBhcyBhIGZvdXJ0aCwgb3B0aW9uYWwgYXJndW1lbnQgQGlke3BsYWlufQordHVybnMgb2ZmIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGZhY2lsaXRpZXMsCitzbyB0aGUgZnVuY3Rpb24gZG9lcyBhIHBsYWluIEBRe2ZpbmQgc3Vic3RyaW5nfSBvcGVyYXRpb24sCit3aXRoIG5vIGNoYXJhY3RlcnMgaW4gQGlke3BhdHRlcm59IGJlaW5nIGNvbnNpZGVyZWQgbWFnaWMuCitOb3RlIHRoYXQgaWYgQGlke3BsYWlufSBpcyBnaXZlbiwgdGhlbiBAaWR7aW5pdH0gbXVzdCBiZSBnaXZlbiBhcyB3ZWxsLgorCitJZiB0aGUgcGF0dGVybiBoYXMgY2FwdHVyZXMsCit0aGVuIGluIGEgc3VjY2Vzc2Z1bCBtYXRjaAordGhlIGNhcHR1cmVkIHZhbHVlcyBhcmUgYWxzbyByZXR1cm5lZCwKK2FmdGVyIHRoZSB0d28gaW5kaWNlcy4KKworfQorCitATGliRW50cnl7c3RyaW5nLmZvcm1hdCAoZm9ybWF0c3RyaW5nLCBAQ2RvdHMpfAorCitSZXR1cm5zIGEgZm9ybWF0dGVkIHZlcnNpb24gb2YgaXRzIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMKK2ZvbGxvd2luZyB0aGUgZGVzY3JpcHRpb24gZ2l2ZW4gaW4gaXRzIGZpcnN0IGFyZ3VtZW50ICh3aGljaCBtdXN0IGJlIGEgc3RyaW5nKS4KK1RoZSBmb3JtYXQgc3RyaW5nIGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgdGhlIEBBTlNJe3NwcmludGZ9LgorVGhlIG9ubHkgZGlmZmVyZW5jZXMgYXJlIHRoYXQgdGhlIG9wdGlvbnMvbW9kaWZpZXJzCitAVHsqfSwgQGlke2h9LCBAaWR7TH0sIEBpZHtsfSwgQGlke259LAorYW5kIEBpZHtwfSBhcmUgbm90IHN1cHBvcnRlZAorYW5kIHRoYXQgdGhlcmUgaXMgYW4gZXh0cmEgb3B0aW9uLCBAaWR7cX0uCisKK1RoZSBAaWR7cX0gb3B0aW9uIGZvcm1hdHMgYm9vbGVhbnMsIG5pbCwgbnVtYmVycywgYW5kIHN0cmluZ3MKK2luIGEgd2F5IHRoYXQgdGhlIHJlc3VsdCBpcyBhIHZhbGlkIGNvbnN0YW50IGluIEx1YSBzb3VyY2UgY29kZS4KK0Jvb2xlYW5zIGFuZCBuaWwgYXJlIHdyaXR0ZW4gaW4gdGhlIG9idmlvdXMgd2F5CisoQGlke3RydWV9LCBAaWR7ZmFsc2V9LCBAaWR7bmlsfSkuCitGbG9hdHMgYXJlIHdyaXR0ZW4gaW4gaGV4YWRlY2ltYWwsCit0byBwcmVzZXJ2ZSBmdWxsIHByZWNpc2lvbi4KK0Egc3RyaW5nIGlzIHdyaXR0ZW4gYmV0d2VlbiBkb3VibGUgcXVvdGVzLAordXNpbmcgZXNjYXBlIHNlcXVlbmNlcyB3aGVuIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdAoraXQgY2FuIHNhZmVseSBiZSByZWFkIGJhY2sgYnkgdGhlIEx1YSBpbnRlcnByZXRlci4KK0ZvciBpbnN0YW5jZSwgdGhlIGNhbGwKK0B2ZXJiYXRpbXsKK3N0cmluZy5mb3JtYXQoJyVxJywgJ2Egc3RyaW5nIHdpdGggInF1b3RlcyIgYW5kIFxuIG5ldyBsaW5lJykKK30KK21heSBwcm9kdWNlIHRoZSBzdHJpbmc6CitAdmVyYmF0aW17CisiYSBzdHJpbmcgd2l0aCBcInF1b3Rlc1wiIGFuZCBcCisgbmV3IGxpbmUiCit9CisKK09wdGlvbnMKK0BpZHtBfSwgQGlke2F9LCBAaWR7RX0sIEBpZHtlfSwgQGlke2Z9LAorQGlke0d9LCBhbmQgQGlke2d9IGFsbCBleHBlY3QgYSBudW1iZXIgYXMgYXJndW1lbnQuCitPcHRpb25zIEBpZHtjfSwgQGlke2R9LAorQGlke2l9LCBAaWR7b30sIEBpZHt1fSwgQGlke1h9LCBhbmQgQGlke3h9CitleHBlY3QgYW4gaW50ZWdlci4KK1doZW4gTHVhIGlzIGNvbXBpbGVkIHdpdGggYSBDODkgY29tcGlsZXIsCitvcHRpb25zIEBpZHtBfSBhbmQgQGlke2F9IChoZXhhZGVjaW1hbCBmbG9hdHMpCitkbyBub3Qgc3VwcG9ydCBhbnkgbW9kaWZpZXIgKGZsYWdzLCB3aWR0aCwgbGVuZ3RoKS4KKworT3B0aW9uIEBpZHtzfSBleHBlY3RzIGEgc3RyaW5nOworaWYgaXRzIGFyZ3VtZW50IGlzIG5vdCBhIHN0cmluZywKK2l0IGlzIGNvbnZlcnRlZCB0byBvbmUgZm9sbG93aW5nIHRoZSBzYW1lIHJ1bGVzIG9mIEBMaWR7dG9zdHJpbmd9LgorSWYgdGhlIG9wdGlvbiBoYXMgYW55IG1vZGlmaWVyIChmbGFncywgd2lkdGgsIGxlbmd0aCksCit0aGUgc3RyaW5nIGFyZ3VtZW50IHNob3VsZCBub3QgY29udGFpbiBAeHtlbWJlZGRlZCB6ZXJvc30uCisKK30KKworQExpYkVudHJ5e3N0cmluZy5nbWF0Y2ggKHMsIHBhdHRlcm4pfAorUmV0dXJucyBhbiBpdGVyYXRvciBmdW5jdGlvbiB0aGF0LAorZWFjaCB0aW1lIGl0IGlzIGNhbGxlZCwKK3JldHVybnMgdGhlIG5leHQgY2FwdHVyZXMgZnJvbSBAaWR7cGF0dGVybn0gQHNlZXtwbX0KK292ZXIgdGhlIHN0cmluZyBAaWR7c30uCitJZiBAaWR7cGF0dGVybn0gc3BlY2lmaWVzIG5vIGNhcHR1cmVzLAordGhlbiB0aGUgd2hvbGUgbWF0Y2ggaXMgcHJvZHVjZWQgaW4gZWFjaCBjYWxsLgorCitBcyBhbiBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGxvb3AKK3dpbGwgaXRlcmF0ZSBvdmVyIGFsbCB0aGUgd29yZHMgZnJvbSBzdHJpbmcgQGlke3N9LAorcHJpbnRpbmcgb25lIHBlciBsaW5lOgorQHZlcmJhdGlteworcyA9ICJoZWxsbyB3b3JsZCBmcm9tIEx1YSIKK2ZvciB3IGluIHN0cmluZy5nbWF0Y2gocywgIiVhKyIpIGRvCisgIHByaW50KHcpCitlbmQKK30KK1RoZSBuZXh0IGV4YW1wbGUgY29sbGVjdHMgYWxsIHBhaXJzIEBUe2tleT12YWx1ZX0gZnJvbSB0aGUKK2dpdmVuIHN0cmluZyBpbnRvIGEgdGFibGU6CitAdmVyYmF0aW17Cit0ID0ge30KK3MgPSAiZnJvbT13b3JsZCwgdG89THVhIgorZm9yIGssIHYgaW4gc3RyaW5nLmdtYXRjaChzLCAiKCV3Kyk9KCV3KykiKSBkbworICB0W2tdID0gdgorZW5kCit9CisKK0ZvciB0aGlzIGZ1bmN0aW9uLCBhIGNhcmV0IEBDaGFye159IGF0IHRoZSBzdGFydCBvZiBhIHBhdHRlcm4gZG9lcyBub3QKK3dvcmsgYXMgYW4gYW5jaG9yLCBhcyB0aGlzIHdvdWxkIHByZXZlbnQgdGhlIGl0ZXJhdGlvbi4KKworfQorCitATGliRW50cnl7c3RyaW5nLmdzdWIgKHMsIHBhdHRlcm4sIHJlcGwgWywgbl0pfAorUmV0dXJucyBhIGNvcHkgb2YgQGlke3N9CitpbiB3aGljaCBhbGwgKG9yIHRoZSBmaXJzdCBAaWR7bn0sIGlmIGdpdmVuKQorb2NjdXJyZW5jZXMgb2YgdGhlIEBpZHtwYXR0ZXJufSBAc2Vle3BtfSBoYXZlIGJlZW4KK3JlcGxhY2VkIGJ5IGEgcmVwbGFjZW1lbnQgc3RyaW5nIHNwZWNpZmllZCBieSBAaWR7cmVwbH0sCit3aGljaCBjYW4gYmUgYSBzdHJpbmcsIGEgdGFibGUsIG9yIGEgZnVuY3Rpb24uCitAaWR7Z3N1Yn0gYWxzbyByZXR1cm5zLCBhcyBpdHMgc2Vjb25kIHZhbHVlLAordGhlIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHRoYXQgb2NjdXJyZWQuCitUaGUgbmFtZSBAaWR7Z3N1Yn0gY29tZXMgZnJvbSBAZW1waHtHbG9iYWwgU1VCc3RpdHV0aW9ufS4KKworSWYgQGlke3JlcGx9IGlzIGEgc3RyaW5nLCB0aGVuIGl0cyB2YWx1ZSBpcyB1c2VkIGZvciByZXBsYWNlbWVudC4KK1RoZSBATntjaGFyYWN0ZXIgQFR7JX19IHdvcmtzIGFzIGFuIGVzY2FwZSBjaGFyYWN0ZXI6Cithbnkgc2VxdWVuY2UgaW4gQGlke3JlcGx9IG9mIHRoZSBmb3JtIEBUeyVAcmVwe2R9fSwKK3dpdGggQHJlcHtkfSBiZXR3ZWVuIDEgYW5kIDksCitzdGFuZHMgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgQHJlcHtkfS10aCBjYXB0dXJlZCBzdWJzdHJpbmcuCitUaGUgc2VxdWVuY2UgQFR7JTB9IHN0YW5kcyBmb3IgdGhlIHdob2xlIG1hdGNoLgorVGhlIHNlcXVlbmNlIEBUeyUlfSBzdGFuZHMgZm9yIGEgQE57c2luZ2xlIEBUeyV9fS4KKworSWYgQGlke3JlcGx9IGlzIGEgdGFibGUsIHRoZW4gdGhlIHRhYmxlIGlzIHF1ZXJpZWQgZm9yIGV2ZXJ5IG1hdGNoLAordXNpbmcgdGhlIGZpcnN0IGNhcHR1cmUgYXMgdGhlIGtleS4KKworSWYgQGlke3JlcGx9IGlzIGEgZnVuY3Rpb24sIHRoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSBhCittYXRjaCBvY2N1cnMsIHdpdGggYWxsIGNhcHR1cmVkIHN1YnN0cmluZ3MgcGFzc2VkIGFzIGFyZ3VtZW50cywKK2luIG9yZGVyLgorCitJbiBhbnkgY2FzZSwKK2lmIHRoZSBwYXR0ZXJuIHNwZWNpZmllcyBubyBjYXB0dXJlcywKK3RoZW4gaXQgYmVoYXZlcyBhcyBpZiB0aGUgd2hvbGUgcGF0dGVybiB3YXMgaW5zaWRlIGEgY2FwdHVyZS4KKworSWYgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSB0YWJsZSBxdWVyeSBvciBieSB0aGUgZnVuY3Rpb24gY2FsbAoraXMgYSBzdHJpbmcgb3IgYSBudW1iZXIsCit0aGVuIGl0IGlzIHVzZWQgYXMgdGhlIHJlcGxhY2VtZW50IHN0cmluZzsKK290aGVyd2lzZSwgaWYgaXQgaXMgQFJ3e2ZhbHNlfSBvciBAbmlsLAordGhlbiB0aGVyZSBpcyBubyByZXBsYWNlbWVudAorKHRoYXQgaXMsIHRoZSBvcmlnaW5hbCBtYXRjaCBpcyBrZXB0IGluIHRoZSBzdHJpbmcpLgorCitIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgorQHZlcmJhdGlteworeCA9IHN0cmluZy5nc3ViKCJoZWxsbyB3b3JsZCIsICIoJXcrKSIsICIlMSAlMSIpCistLT4geD0iaGVsbG8gaGVsbG8gd29ybGQgd29ybGQiCisKK3ggPSBzdHJpbmcuZ3N1YigiaGVsbG8gd29ybGQiLCAiJXcrIiwgIiUwICUwIiwgMSkKKy0tPiB4PSJoZWxsbyBoZWxsbyB3b3JsZCIKKworeCA9IHN0cmluZy5nc3ViKCJoZWxsbyB3b3JsZCBmcm9tIEx1YSIsICIoJXcrKSVzKigldyspIiwgIiUyICUxIikKKy0tPiB4PSJ3b3JsZCBoZWxsbyBMdWEgZnJvbSIKKworeCA9IHN0cmluZy5nc3ViKCJob21lID0gJEhPTUUsIHVzZXIgPSAkVVNFUiIsICIlJCgldyspIiwgb3MuZ2V0ZW52KQorLS0+IHg9ImhvbWUgPSAvaG9tZS9yb2JlcnRvLCB1c2VyID0gcm9iZXJ0byIKKworeCA9IHN0cmluZy5nc3ViKCI0KzUgPSAkcmV0dXJuIDQrNSQiLCAiJSQoLi0pJSQiLCBmdW5jdGlvbiAocykKKyAgICAgIHJldHVybiBsb2FkKHMpKCkKKyAgICBlbmQpCistLT4geD0iNCs1ID0gOSIKKworbG9jYWwgdCA9IHtuYW1lPSJsdWEiLCB2ZXJzaW9uPSI1LjQifQoreCA9IHN0cmluZy5nc3ViKCIkbmFtZS0kdmVyc2lvbi50YXIuZ3oiLCAiJSQoJXcrKSIsIHQpCistLT4geD0ibHVhLTUuNC50YXIuZ3oiCit9CisKK30KKworQExpYkVudHJ5e3N0cmluZy5sZW4gKHMpfAorUmVjZWl2ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgaXRzIGxlbmd0aC4KK1RoZSBlbXB0eSBzdHJpbmcgQFR7IiJ9IGhhcyBsZW5ndGggMC4KK0VtYmVkZGVkIHplcm9zIGFyZSBjb3VudGVkLAorc28gQFR7ImFcMDAwYmNcMDAwIn0gaGFzIGxlbmd0aCA1LgorCit9CisKK0BMaWJFbnRyeXtzdHJpbmcubG93ZXIgKHMpfAorUmVjZWl2ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgc3RyaW5nIHdpdGggYWxsCit1cHBlcmNhc2UgbGV0dGVycyBjaGFuZ2VkIHRvIGxvd2VyY2FzZS4KK0FsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSBsZWZ0IHVuY2hhbmdlZC4KK1RoZSBkZWZpbml0aW9uIG9mIHdoYXQgYW4gdXBwZXJjYXNlIGxldHRlciBpcyBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IGxvY2FsZS4KKworfQorCitATGliRW50cnl7c3RyaW5nLm1hdGNoIChzLCBwYXR0ZXJuIFssIGluaXRdKXwKK0xvb2tzIGZvciB0aGUgZmlyc3QgQGVtcGh7bWF0Y2h9IG9mCitAaWR7cGF0dGVybn0gQHNlZXtwbX0gaW4gdGhlIHN0cmluZyBAaWR7c30uCitJZiBpdCBmaW5kcyBvbmUsIHRoZW4gQGlke21hdGNofSByZXR1cm5zCit0aGUgY2FwdHVyZXMgZnJvbSB0aGUgcGF0dGVybjsKK290aGVyd2lzZSBpdCByZXR1cm5zIEBuaWwuCitJZiBAaWR7cGF0dGVybn0gc3BlY2lmaWVzIG5vIGNhcHR1cmVzLAordGhlbiB0aGUgd2hvbGUgbWF0Y2ggaXMgcmV0dXJuZWQuCitBIHRoaXJkLCBvcHRpb25hbCBudW1lcmljIGFyZ3VtZW50IEBpZHtpbml0fSBzcGVjaWZpZXMKK3doZXJlIHRvIHN0YXJ0IHRoZSBzZWFyY2g7CitpdHMgZGVmYXVsdCB2YWx1ZSBATntpcyAxfSBhbmQgY2FuIGJlIG5lZ2F0aXZlLgorCit9CisKK0BMaWJFbnRyeXtzdHJpbmcucGFjayAoZm10LCB2MSwgdjIsIEBDZG90cyl8CisKK1JldHVybnMgYSBiaW5hcnkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBAaWR7djF9LCBAaWR7djJ9LCBldGMuCitwYWNrZWQgKHRoYXQgaXMsIHNlcmlhbGl6ZWQgaW4gYmluYXJ5IGZvcm0pCithY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBzdHJpbmcgQGlke2ZtdH0gQHNlZXtwYWNrfS4KKworfQorCitATGliRW50cnl7c3RyaW5nLnBhY2tzaXplIChmbXQpfAorCitSZXR1cm5zIHRoZSBzaXplIG9mIGEgc3RyaW5nIHJlc3VsdGluZyBmcm9tIEBMaWR7c3RyaW5nLnBhY2t9Cit3aXRoIHRoZSBnaXZlbiBmb3JtYXQuCitUaGUgZm9ybWF0IHN0cmluZyBjYW5ub3QgaGF2ZSB0aGUgdmFyaWFibGUtbGVuZ3RoIG9wdGlvbnMKK0BDaGFye3N9IG9yIEBDaGFye3p9IEBzZWV7cGFja30uCisKK30KKworQExpYkVudHJ5e3N0cmluZy5yZXAgKHMsIG4gWywgc2VwXSl8CitSZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgQGlke259IGNvcGllcyBvZgordGhlIHN0cmluZyBAaWR7c30gc2VwYXJhdGVkIGJ5IHRoZSBzdHJpbmcgQGlke3NlcH0uCitUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQGlke3NlcH0gaXMgdGhlIGVtcHR5IHN0cmluZworKHRoYXQgaXMsIG5vIHNlcGFyYXRvcikuCitSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgQGlke259IGlzIG5vdCBwb3NpdGl2ZS4KKworKE5vdGUgdGhhdCBpdCBpcyB2ZXJ5IGVhc3kgdG8gZXhoYXVzdCB0aGUgbWVtb3J5IG9mIHlvdXIgbWFjaGluZQord2l0aCBhIHNpbmdsZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uKQorCit9CisKK0BMaWJFbnRyeXtzdHJpbmcucmV2ZXJzZSAocyl8CitSZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgdGhlIHN0cmluZyBAaWR7c30gcmV2ZXJzZWQuCisKK30KKworQExpYkVudHJ5e3N0cmluZy5zdWIgKHMsIGkgWywgal0pfAorUmV0dXJucyB0aGUgc3Vic3RyaW5nIG9mIEBpZHtzfSB0aGF0CitzdGFydHMgYXQgQGlke2l9ICBhbmQgY29udGludWVzIHVudGlsIEBpZHtqfTsKK0BpZHtpfSBhbmQgQGlke2p9IGNhbiBiZSBuZWdhdGl2ZS4KK0lmIEBpZHtqfSBpcyBhYnNlbnQsIHRoZW4gaXQgaXMgYXNzdW1lZCB0byBiZSBlcXVhbCB0byBAbnVtey0xfQorKHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBzdHJpbmcgbGVuZ3RoKS4KK0luIHBhcnRpY3VsYXIsCit0aGUgY2FsbCBAVHtzdHJpbmcuc3ViKHMsMSxqKX0gcmV0dXJucyBhIHByZWZpeCBvZiBAaWR7c30KK3dpdGggbGVuZ3RoIEBpZHtqfSwKK2FuZCBAVHtzdHJpbmcuc3ViKHMsIC1pKX0gKGZvciBhIHBvc2l0aXZlIEBpZHtpfSkKK3JldHVybnMgYSBzdWZmaXggb2YgQGlke3N9Cit3aXRoIGxlbmd0aCBAaWR7aX0uCisKK0lmLCBhZnRlciB0aGUgdHJhbnNsYXRpb24gb2YgbmVnYXRpdmUgaW5kaWNlcywKK0BpZHtpfSBpcyBsZXNzIHRoYW4gMSwKK2l0IGlzIGNvcnJlY3RlZCB0byAxLgorSWYgQGlke2p9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3RyaW5nIGxlbmd0aCwKK2l0IGlzIGNvcnJlY3RlZCB0byB0aGF0IGxlbmd0aC4KK0lmLCBhZnRlciB0aGVzZSBjb3JyZWN0aW9ucywKK0BpZHtpfSBpcyBncmVhdGVyIHRoYW4gQGlke2p9LAordGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVtcHR5IHN0cmluZy4KKworfQorCitATGliRW50cnl7c3RyaW5nLnVucGFjayAoZm10LCBzIFssIHBvc10pfAorCitSZXR1cm5zIHRoZSB2YWx1ZXMgcGFja2VkIGluIHN0cmluZyBAaWR7c30gQHNlZUZ7c3RyaW5nLnBhY2t9CithY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBzdHJpbmcgQGlke2ZtdH0gQHNlZXtwYWNrfS4KK0FuIG9wdGlvbmFsIEBpZHtwb3N9IG1hcmtzIHdoZXJlCit0byBzdGFydCByZWFkaW5nIGluIEBpZHtzfSAoZGVmYXVsdCBpcyAxKS4KK0FmdGVyIHRoZSByZWFkIHZhbHVlcywKK3RoaXMgZnVuY3Rpb24gYWxzbyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5yZWFkIGJ5dGUgaW4gQGlke3N9LgorCit9CisKK0BMaWJFbnRyeXtzdHJpbmcudXBwZXIgKHMpfAorUmVjZWl2ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgc3RyaW5nIHdpdGggYWxsCitsb3dlcmNhc2UgbGV0dGVycyBjaGFuZ2VkIHRvIHVwcGVyY2FzZS4KK0FsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSBsZWZ0IHVuY2hhbmdlZC4KK1RoZSBkZWZpbml0aW9uIG9mIHdoYXQgYSBsb3dlcmNhc2UgbGV0dGVyIGlzIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgorCit9CisKKworQHNlY3Qze3BtfCBAdGl0bGV7UGF0dGVybnN9CisKK1BhdHRlcm5zIGluIEx1YSBhcmUgZGVzY3JpYmVkIGJ5IHJlZ3VsYXIgc3RyaW5ncywKK3doaWNoIGFyZSBpbnRlcnByZXRlZCBhcyBwYXR0ZXJucyBieSB0aGUgcGF0dGVybi1tYXRjaGluZyBmdW5jdGlvbnMKK0BMaWR7c3RyaW5nLmZpbmR9LAorQExpZHtzdHJpbmcuZ21hdGNofSwKK0BMaWR7c3RyaW5nLmdzdWJ9LAorYW5kIEBMaWR7c3RyaW5nLm1hdGNofS4KK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIHN5bnRheCBhbmQgdGhlIG1lYW5pbmcKKyh0aGF0IGlzLCB3aGF0IHRoZXkgbWF0Y2gpIG9mIHRoZXNlIHN0cmluZ3MuCisKK0BzZWN0NHtAdGl0bGV7Q2hhcmFjdGVyIENsYXNzOn0KK0EgQGRlZntjaGFyYWN0ZXIgY2xhc3N9IGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgc2V0IG9mIGNoYXJhY3RlcnMuCitUaGUgZm9sbG93aW5nIGNvbWJpbmF0aW9ucyBhcmUgYWxsb3dlZCBpbiBkZXNjcmliaW5nIGEgY2hhcmFjdGVyIGNsYXNzOgorQGRlc2NyaXB0aW9ueworCitAaXRlbXtAcmVwe3h9fAorKHdoZXJlIEByZXB7eH0gaXMgbm90IG9uZSBvZiB0aGUgQGVtcGh4e21hZ2ljIGNoYXJhY3RlcnN9CitAVHteJCgpJS5bXSorLT99KQorcmVwcmVzZW50cyB0aGUgY2hhcmFjdGVyIEBlbXBoe3h9IGl0c2VsZi4KK30KKworQGl0ZW17QFR7Ln18IChhIGRvdCkgcmVwcmVzZW50cyBhbGwgY2hhcmFjdGVycy59CisKK0BpdGVte0BUeyVhfXwgcmVwcmVzZW50cyBhbGwgbGV0dGVycy59CisKK0BpdGVte0BUeyVjfXwgcmVwcmVzZW50cyBhbGwgY29udHJvbCBjaGFyYWN0ZXJzLn0KKworQGl0ZW17QFR7JWR9fCByZXByZXNlbnRzIGFsbCBkaWdpdHMufQorCitAaXRlbXtAVHslZ318IHJlcHJlc2VudHMgYWxsIHByaW50YWJsZSBjaGFyYWN0ZXJzIGV4Y2VwdCBzcGFjZS59CisKK0BpdGVte0BUeyVsfXwgcmVwcmVzZW50cyBhbGwgbG93ZXJjYXNlIGxldHRlcnMufQorCitAaXRlbXtAVHslcH18IHJlcHJlc2VudHMgYWxsIHB1bmN0dWF0aW9uIGNoYXJhY3RlcnMufQorCitAaXRlbXtAVHslc318IHJlcHJlc2VudHMgYWxsIHNwYWNlIGNoYXJhY3RlcnMufQorCitAaXRlbXtAVHsldX18IHJlcHJlc2VudHMgYWxsIHVwcGVyY2FzZSBsZXR0ZXJzLn0KKworQGl0ZW17QFR7JXd9fCByZXByZXNlbnRzIGFsbCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy59CisKK0BpdGVte0BUeyV4fXwgcmVwcmVzZW50cyBhbGwgaGV4YWRlY2ltYWwgZGlnaXRzLn0KKworQGl0ZW17QFR7JUByZXB7eH19fCAod2hlcmUgQHJlcHt4fSBpcyBhbnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXIpCityZXByZXNlbnRzIHRoZSBjaGFyYWN0ZXIgQHJlcHt4fS4KK1RoaXMgaXMgdGhlIHN0YW5kYXJkIHdheSB0byBlc2NhcGUgdGhlIG1hZ2ljIGNoYXJhY3RlcnMuCitBbnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXIKKyhpbmNsdWRpbmcgYWxsIHB1bmN0dWF0aW9uIGNoYXJhY3RlcnMsIGV2ZW4gdGhlIG5vbi1tYWdpY2FsKQorY2FuIGJlIHByZWNlZGVkIGJ5IGEgQENoYXJ7JX0KK3doZW4gdXNlZCB0byByZXByZXNlbnQgaXRzZWxmIGluIGEgcGF0dGVybi4KK30KKworQGl0ZW17QFR7W0ByZXB7c2V0fV19fAorcmVwcmVzZW50cyB0aGUgY2xhc3Mgd2hpY2ggaXMgdGhlIHVuaW9uIG9mIGFsbAorY2hhcmFjdGVycyBpbiBAcmVwe3NldH0uCitBIHJhbmdlIG9mIGNoYXJhY3RlcnMgY2FuIGJlIHNwZWNpZmllZCBieQorc2VwYXJhdGluZyB0aGUgZW5kIGNoYXJhY3RlcnMgb2YgdGhlIHJhbmdlLAoraW4gYXNjZW5kaW5nIG9yZGVyLCB3aXRoIGEgQENoYXJ7LX0uCitBbGwgY2xhc3NlcyBAVHslfUBlbXBoe3h9IGRlc2NyaWJlZCBhYm92ZSBjYW4gYWxzbyBiZSB1c2VkIGFzCitjb21wb25lbnRzIGluIEByZXB7c2V0fS4KK0FsbCBvdGhlciBjaGFyYWN0ZXJzIGluIEByZXB7c2V0fSByZXByZXNlbnQgdGhlbXNlbHZlcy4KK0ZvciBleGFtcGxlLCBAVHtbJXdfXX0gKG9yIEBUe1tfJXddfSkKK3JlcHJlc2VudHMgYWxsIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHBsdXMgdGhlIHVuZGVyc2NvcmUsCitAVHtbMC03XX0gcmVwcmVzZW50cyB0aGUgb2N0YWwgZGlnaXRzLAorYW5kIEBUe1swLTclbCUtXX0gcmVwcmVzZW50cyB0aGUgb2N0YWwgZGlnaXRzIHBsdXMKK3RoZSBsb3dlcmNhc2UgbGV0dGVycyBwbHVzIHRoZSBAQ2hhcnstfSBjaGFyYWN0ZXIuCisKK1lvdSBjYW4gcHV0IGEgY2xvc2luZyBzcXVhcmUgYnJhY2tldCBpbiBhIHNldAorYnkgcG9zaXRpb25pbmcgaXQgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc2V0LgorWW91IGNhbiBwdXQgYSBoeXBoZW4gaW4gYSBzZXQKK2J5IHBvc2l0aW9uaW5nIGl0IGFzIHRoZSBmaXJzdCBvciB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHNldC4KKyhZb3UgY2FuIGFsc28gdXNlIGFuIGVzY2FwZSBmb3IgYm90aCBjYXNlcy4pCisKK1RoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHJhbmdlcyBhbmQgY2xhc3NlcyBpcyBub3QgZGVmaW5lZC4KK1RoZXJlZm9yZSwgcGF0dGVybnMgbGlrZSBAVHtbJWEtel19IG9yIEBUe1thLSUlXX0KK2hhdmUgbm8gbWVhbmluZy4KK30KKworQGl0ZW17QFR7W15AcmVwe3NldH1dfXwKK3JlcHJlc2VudHMgdGhlIGNvbXBsZW1lbnQgb2YgQHJlcHtzZXR9LAord2hlcmUgQHJlcHtzZXR9IGlzIGludGVycHJldGVkIGFzIGFib3ZlLgorfQorCit9CitGb3IgYWxsIGNsYXNzZXMgcmVwcmVzZW50ZWQgYnkgc2luZ2xlIGxldHRlcnMgKEBUeyVhfSwgQFR7JWN9LCBldGMuKSwKK3RoZSBjb3JyZXNwb25kaW5nIHVwcGVyY2FzZSBsZXR0ZXIgcmVwcmVzZW50cyB0aGUgY29tcGxlbWVudCBvZiB0aGUgY2xhc3MuCitGb3IgaW5zdGFuY2UsIEBUeyVTfSByZXByZXNlbnRzIGFsbCBub24tc3BhY2UgY2hhcmFjdGVycy4KKworVGhlIGRlZmluaXRpb25zIG9mIGxldHRlciwgc3BhY2UsIGFuZCBvdGhlciBjaGFyYWN0ZXIgZ3JvdXBzCitkZXBlbmQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgorSW4gcGFydGljdWxhciwgdGhlIGNsYXNzIEBUe1thLXpdfSBtYXkgbm90IGJlIGVxdWl2YWxlbnQgdG8gQFR7JWx9LgorCit9CisKK0BzZWN0NHtAdGl0bGV7UGF0dGVybiBJdGVtOn0KK0EgQGRlZntwYXR0ZXJuIGl0ZW19IGNhbiBiZQorQGl0ZW1pemV7CisKK0BpdGVteworYSBzaW5nbGUgY2hhcmFjdGVyIGNsYXNzLAord2hpY2ggbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciBpbiB0aGUgY2xhc3M7Cit9CisKK0BpdGVteworYSBzaW5nbGUgY2hhcmFjdGVyIGNsYXNzIGZvbGxvd2VkIGJ5IEBDaGFyeyp9LAord2hpY2ggbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgcmVwZXRpdGlvbnMgb2YgY2hhcmFjdGVycyBpbiB0aGUgY2xhc3MuCitUaGVzZSByZXBldGl0aW9uIGl0ZW1zIHdpbGwgYWx3YXlzIG1hdGNoIHRoZSBsb25nZXN0IHBvc3NpYmxlIHNlcXVlbmNlOworfQorCitAaXRlbXsKK2Egc2luZ2xlIGNoYXJhY3RlciBjbGFzcyBmb2xsb3dlZCBieSBAQ2hhcnsrfSwKK3doaWNoIG1hdGNoZXMgb25lIG9yIG1vcmUgcmVwZXRpdGlvbnMgb2YgY2hhcmFjdGVycyBpbiB0aGUgY2xhc3MuCitUaGVzZSByZXBldGl0aW9uIGl0ZW1zIHdpbGwgYWx3YXlzIG1hdGNoIHRoZSBsb25nZXN0IHBvc3NpYmxlIHNlcXVlbmNlOworfQorCitAaXRlbXsKK2Egc2luZ2xlIGNoYXJhY3RlciBjbGFzcyBmb2xsb3dlZCBieSBAQ2hhcnstfSwKK3doaWNoIGFsc28gbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgcmVwZXRpdGlvbnMgb2YgY2hhcmFjdGVycyBpbiB0aGUgY2xhc3MuCitVbmxpa2UgQENoYXJ7Kn0sCit0aGVzZSByZXBldGl0aW9uIGl0ZW1zIHdpbGwgYWx3YXlzIG1hdGNoIHRoZSBzaG9ydGVzdCBwb3NzaWJsZSBzZXF1ZW5jZTsKK30KKworQGl0ZW17CithIHNpbmdsZSBjaGFyYWN0ZXIgY2xhc3MgZm9sbG93ZWQgYnkgQENoYXJ7P30sCit3aGljaCBtYXRjaGVzIHplcm8gb3Igb25lIG9jY3VycmVuY2Ugb2YgYSBjaGFyYWN0ZXIgaW4gdGhlIGNsYXNzLgorSXQgYWx3YXlzIG1hdGNoZXMgb25lIG9jY3VycmVuY2UgaWYgcG9zc2libGU7Cit9CisKK0BpdGVteworQFR7JUByZXB7bn19LCBmb3IgQHJlcHtufSBiZXR3ZWVuIDEgYW5kIDk7CitzdWNoIGl0ZW0gbWF0Y2hlcyBhIHN1YnN0cmluZyBlcXVhbCB0byB0aGUgQHJlcHtufS10aCBjYXB0dXJlZCBzdHJpbmcKKyhzZWUgYmVsb3cpOworfQorCitAaXRlbXsKK0BUeyViQHJlcHt4eX19LCB3aGVyZSBAcmVwe3h9IGFuZCBAcmVwe3l9IGFyZSB0d28gZGlzdGluY3QgY2hhcmFjdGVyczsKK3N1Y2ggaXRlbSBtYXRjaGVzIHN0cmluZ3MgdGhhdCBzdGFydCBATnt3aXRoIEByZXB7eH19LCBlbmQgQE57d2l0aCBAcmVwe3l9fSwKK2FuZCB3aGVyZSB0aGUgQHJlcHt4fSBhbmQgQHJlcHt5fSBhcmUgQGVtcGh7YmFsYW5jZWR9LgorVGhpcyBtZWFucyB0aGF0LCBpZiBvbmUgcmVhZHMgdGhlIHN0cmluZyBmcm9tIGxlZnQgdG8gcmlnaHQsCitjb3VudGluZyBATXsrMX0gZm9yIGFuIEByZXB7eH0gYW5kIEBNey0xfSBmb3IgYSBAcmVwe3l9LAordGhlIGVuZGluZyBAcmVwe3l9IGlzIHRoZSBmaXJzdCBAcmVwe3l9IHdoZXJlIHRoZSBjb3VudCByZWFjaGVzIDAuCitGb3IgaW5zdGFuY2UsIHRoZSBpdGVtIEBUeyViKCl9IG1hdGNoZXMgZXhwcmVzc2lvbnMgd2l0aAorYmFsYW5jZWQgcGFyZW50aGVzZXMuCit9CisKK0BpdGVteworQFR7JWZbQHJlcHtzZXR9XX0sIGEgQGRlZntmcm9udGllciBwYXR0ZXJufTsKK3N1Y2ggaXRlbSBtYXRjaGVzIGFuIGVtcHR5IHN0cmluZyBhdCBhbnkgcG9zaXRpb24gc3VjaCB0aGF0Cit0aGUgbmV4dCBjaGFyYWN0ZXIgYmVsb25ncyB0byBAcmVwe3NldH0KK2FuZCB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGRvZXMgbm90IGJlbG9uZyB0byBAcmVwe3NldH0uCitUaGUgc2V0IEByZXB7c2V0fSBpcyBpbnRlcnByZXRlZCBhcyBwcmV2aW91c2x5IGRlc2NyaWJlZC4KK1RoZSBiZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgdGhlIHN1YmplY3QgYXJlIGhhbmRsZWQgYXMgaWYKK3RoZXkgd2VyZSB0aGUgY2hhcmFjdGVyIEBDaGFye1wwfS4KK30KKworfQorCit9CisKK0BzZWN0NHtAdGl0bGV7UGF0dGVybjp9CitBIEBkZWZ7cGF0dGVybn0gaXMgYSBzZXF1ZW5jZSBvZiBwYXR0ZXJuIGl0ZW1zLgorQSBjYXJldCBAQ2hhcntefSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcGF0dGVybiBhbmNob3JzIHRoZSBtYXRjaCBhdCB0aGUKK2JlZ2lubmluZyBvZiB0aGUgc3ViamVjdCBzdHJpbmcuCitBIEBDaGFyeyR9IGF0IHRoZSBlbmQgb2YgYSBwYXR0ZXJuIGFuY2hvcnMgdGhlIG1hdGNoIGF0IHRoZQorZW5kIG9mIHRoZSBzdWJqZWN0IHN0cmluZy4KK0F0IG90aGVyIHBvc2l0aW9ucywKK0BDaGFye159IGFuZCBAQ2hhcnskfSBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgcmVwcmVzZW50IHRoZW1zZWx2ZXMuCisKK30KKworQHNlY3Q0e0B0aXRsZXtDYXB0dXJlczp9CitBIHBhdHRlcm4gY2FuIGNvbnRhaW4gc3ViLXBhdHRlcm5zIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzOwordGhleSBkZXNjcmliZSBAZGVme2NhcHR1cmVzfS4KK1doZW4gYSBtYXRjaCBzdWNjZWVkcywgdGhlIHN1YnN0cmluZ3Mgb2YgdGhlIHN1YmplY3Qgc3RyaW5nCit0aGF0IG1hdGNoIGNhcHR1cmVzIGFyZSBzdG9yZWQgKEBlbXBoe2NhcHR1cmVkfSkgZm9yIGZ1dHVyZSB1c2UuCitDYXB0dXJlcyBhcmUgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIGxlZnQgcGFyZW50aGVzZXMuCitGb3IgaW5zdGFuY2UsIGluIHRoZSBwYXR0ZXJuIEBUeyIoYSooLikldyglcyopKSJ9LAordGhlIHBhcnQgb2YgdGhlIHN0cmluZyBtYXRjaGluZyBAVHsiYSooLikldyglcyopIn0gaXMKK3N0b3JlZCBhcyB0aGUgZmlyc3QgY2FwdHVyZSAoYW5kIHRoZXJlZm9yZSBoYXMgQE57bnVtYmVyIDF9KTsKK3RoZSBjaGFyYWN0ZXIgbWF0Y2hpbmcgQFN0ey59IGlzIGNhcHR1cmVkIHdpdGggQE57bnVtYmVyIDJ9LAorYW5kIHRoZSBwYXJ0IG1hdGNoaW5nIEBTdHslcyp9IGhhcyBATntudW1iZXIgM30uCisKK0FzIGEgc3BlY2lhbCBjYXNlLCB0aGUgZW1wdHkgY2FwdHVyZSBAVHsoKX0gY2FwdHVyZXMKK3RoZSBjdXJyZW50IHN0cmluZyBwb3NpdGlvbiAoYSBudW1iZXIpLgorRm9yIGluc3RhbmNlLCBpZiB3ZSBhcHBseSB0aGUgcGF0dGVybiBAVHsiKClhYSgpIn0gb24gdGhlCitzdHJpbmcgQFR7ImZsYWFhcCJ9LCB0aGVyZSB3aWxsIGJlIHR3byBjYXB0dXJlczogQE57MyBhbmQgNX0uCisKK30KKworQHNlY3Q0e0B0aXRsZXtNdWx0aXBsZSBtYXRjaGVzOn0KK1RoZSBmdW5jdGlvbiBATGlke3N0cmluZy5nc3VifSBhbmQgdGhlIGl0ZXJhdG9yIEBMaWR7c3RyaW5nLmdtYXRjaH0KK21hdGNoIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZSBnaXZlbiBwYXR0ZXJuIGluIHRoZSBzdWJqZWN0LgorRm9yIHRoZXNlIGZ1bmN0aW9ucywKK2EgbmV3IG1hdGNoIGlzIGNvbnNpZGVyZWQgdmFsaWQgb25seQoraWYgaXQgZW5kcyBhdCBsZWFzdCBvbmUgYnl0ZSBhZnRlciB0aGUgcHJldmlvdXMgbWF0Y2guCitJbiBvdGhlciB3b3JkcywgdGhlIHBhdHRlcm4gbWFjaGluZSBuZXZlciBhY2NlcHRzIHRoZQorZW1wdHkgc3RyaW5nIGFzIGEgbWF0Y2ggaW1tZWRpYXRlbHkgYWZ0ZXIgYW5vdGhlciBtYXRjaC4KK0FzIGFuIGV4YW1wbGUsCitjb25zaWRlciB0aGUgcmVzdWx0cyBvZiB0aGUgZm9sbG93aW5nIGNvZGU6CitAdmVyYmF0aW17Cis+IHN0cmluZy5nc3ViKCJhYmMiLCAiKClhKigpIiwgcHJpbnQpCistLT4gMSAgIDIKKy0tPiAzICAgMworLS0+IDQgICA0Cit9CitUaGUgc2Vjb25kIGFuZCB0aGlyZCByZXN1bHRzIGNvbWUgZnJvbSBMdWEgbWF0Y2hpbmcgYW4gZW1wdHkKK3N0cmluZyBhZnRlciBAQ2hhcntifSBhbmQgYW5vdGhlciBvbmUgYWZ0ZXIgQENoYXJ7Y30uCitMdWEgZG9lcyBub3QgbWF0Y2ggYW4gZW1wdHkgc3RyaW5nIGFmdGVyIEBDaGFye2F9LAorYmVjYXVzZSBpdCB3b3VsZCBlbmQgYXQgdGhlIHNhbWUgcG9zaXRpb24gb2YgdGhlIHByZXZpb3VzIG1hdGNoLgorCit9CisKK30KKworQHNlY3Qze3BhY2t8IEB0aXRsZXtGb3JtYXQgU3RyaW5ncyBmb3IgUGFjayBhbmQgVW5wYWNrfQorCitUaGUgZmlyc3QgYXJndW1lbnQgdG8gQExpZHtzdHJpbmcucGFja30sCitATGlke3N0cmluZy5wYWNrc2l6ZX0sIGFuZCBATGlke3N0cmluZy51bnBhY2t9CitpcyBhIGZvcm1hdCBzdHJpbmcsCit3aGljaCBkZXNjcmliZXMgdGhlIGxheW91dCBvZiB0aGUgc3RydWN0dXJlIGJlaW5nIGNyZWF0ZWQgb3IgcmVhZC4KKworQSBmb3JtYXQgc3RyaW5nIGlzIGEgc2VxdWVuY2Ugb2YgY29udmVyc2lvbiBvcHRpb25zLgorVGhlIGNvbnZlcnNpb24gb3B0aW9ucyBhcmUgYXMgZm9sbG93czoKK0BkZXNjcmlwdGlvbnsKK0BpdGVte0BUezx9fHNldHMgbGl0dGxlIGVuZGlhbn0KK0BpdGVte0BUez59fHNldHMgYmlnIGVuZGlhbn0KK0BpdGVte0BUez19fHNldHMgbmF0aXZlIGVuZGlhbn0KK0BpdGVte0BUeyFbQHJlcHtufV19fHNldHMgbWF4aW11bSBhbGlnbm1lbnQgdG8gQGlke259CisoZGVmYXVsdCBpcyBuYXRpdmUgYWxpZ25tZW50KX0KK0BpdGVte0BUe2J9fGEgc2lnbmVkIGJ5dGUgKEBpZHtjaGFyfSl9CitAaXRlbXtAVHtCfXxhbiB1bnNpZ25lZCBieXRlIChAaWR7Y2hhcn0pfQorQGl0ZW17QFR7aH18YSBzaWduZWQgQGlke3Nob3J0fSAobmF0aXZlIHNpemUpfQorQGl0ZW17QFR7SH18YW4gdW5zaWduZWQgQGlke3Nob3J0fSAobmF0aXZlIHNpemUpfQorQGl0ZW17QFR7bH18YSBzaWduZWQgQGlke2xvbmd9IChuYXRpdmUgc2l6ZSl9CitAaXRlbXtAVHtMfXxhbiB1bnNpZ25lZCBAaWR7bG9uZ30gKG5hdGl2ZSBzaXplKX0KK0BpdGVte0BUe2p9fGEgQGlke2x1YV9JbnRlZ2VyfX0KK0BpdGVte0BUe0p9fGEgQGlke2x1YV9VbnNpZ25lZH19CitAaXRlbXtAVHtUfXxhIEBpZHtzaXplX3R9IChuYXRpdmUgc2l6ZSl9CitAaXRlbXtAVHtpW0ByZXB7bn1dfXxhIHNpZ25lZCBAaWR7aW50fSB3aXRoIEBpZHtufSBieXRlcworKGRlZmF1bHQgaXMgbmF0aXZlIHNpemUpfQorQGl0ZW17QFR7SVtAcmVwe259XX18YW4gdW5zaWduZWQgQGlke2ludH0gd2l0aCBAaWR7bn0gYnl0ZXMKKyhkZWZhdWx0IGlzIG5hdGl2ZSBzaXplKX0KK0BpdGVte0BUe2Z9fGEgQGlke2Zsb2F0fSAobmF0aXZlIHNpemUpfQorQGl0ZW17QFR7ZH18YSBAaWR7ZG91YmxlfSAobmF0aXZlIHNpemUpfQorQGl0ZW17QFR7bn18YSBAaWR7bHVhX051bWJlcn19CitAaXRlbXtAVHtjQHJlcHtufX18YSBmaXhlZC1zaXplZCBzdHJpbmcgd2l0aCBAaWR7bn0gYnl0ZXN9CitAaXRlbXtAVHt6fXxhIHplcm8tdGVybWluYXRlZCBzdHJpbmd9CitAaXRlbXtAVHtzW0BlbXBoe259XX18YSBzdHJpbmcgcHJlY2VkZWQgYnkgaXRzIGxlbmd0aAorY29kZWQgYXMgYW4gdW5zaWduZWQgaW50ZWdlciB3aXRoIEBpZHtufSBieXRlcworKGRlZmF1bHQgaXMgYSBAaWR7c2l6ZV90fSl9CitAaXRlbXtAVHt4fXxvbmUgYnl0ZSBvZiBwYWRkaW5nfQorQGl0ZW17QFR7WEByZXB7b3B9fXxhbiBlbXB0eSBpdGVtIHRoYXQgYWxpZ25zCithY2NvcmRpbmcgdG8gb3B0aW9uIEBpZHtvcH0KKyh3aGljaCBpcyBvdGhlcndpc2UgaWdub3JlZCl9CitAaXRlbXtAQ2hhcnsgfXwoZW1wdHkgc3BhY2UpIGlnbm9yZWR9Cit9CisoQSBAU3R7W0ByZXB7bn1dfSBtZWFucyBhbiBvcHRpb25hbCBpbnRlZ3JhbCBudW1lcmFsLikKK0V4Y2VwdCBmb3IgcGFkZGluZywgc3BhY2VzLCBhbmQgY29uZmlndXJhdGlvbnMKKyhvcHRpb25zIEBTdHt4WCA8PT4hfSksCitlYWNoIG9wdGlvbiBjb3JyZXNwb25kcyB0byBhbiBhcmd1bWVudCAoaW4gQExpZHtzdHJpbmcucGFja30pCitvciBhIHJlc3VsdCAoaW4gQExpZHtzdHJpbmcudW5wYWNrfSkuCisKK0ZvciBvcHRpb25zIEBTdHshQHJlcHtufX0sIEBTdHtzQHJlcHtufX0sIEBTdHtpQHJlcHtufX0sIGFuZCBAU3R7SUByZXB7bn19LAorQGlke259IGNhbiBiZSBhbnkgaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDE2LgorQWxsIGludGVncmFsIG9wdGlvbnMgY2hlY2sgb3ZlcmZsb3dzOworQExpZHtzdHJpbmcucGFja30gY2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGZpdHMgaW4gdGhlIGdpdmVuIHNpemU7CitATGlke3N0cmluZy51bnBhY2t9IGNoZWNrcyB3aGV0aGVyIHRoZSByZWFkIHZhbHVlIGZpdHMgaW4gYSBMdWEgaW50ZWdlci4KKworQW55IGZvcm1hdCBzdHJpbmcgc3RhcnRzIGFzIGlmIHByZWZpeGVkIGJ5IEBTdHshMT19LAordGhhdCBpcywKK3dpdGggbWF4aW11bSBhbGlnbm1lbnQgb2YgMSAobm8gYWxpZ25tZW50KQorYW5kIG5hdGl2ZSBlbmRpYW5uZXNzLgorCitBbGlnbm1lbnQgd29ya3MgYXMgZm9sbG93czoKK0ZvciBlYWNoIG9wdGlvbiwKK3RoZSBmb3JtYXQgZ2V0cyBleHRyYSBwYWRkaW5nIHVudGlsIHRoZSBkYXRhIHN0YXJ0cworYXQgYW4gb2Zmc2V0IHRoYXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUgbWluaW11bSBiZXR3ZWVuIHRoZQorb3B0aW9uIHNpemUgYW5kIHRoZSBtYXhpbXVtIGFsaWdubWVudDsKK3RoaXMgbWluaW11bSBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KK09wdGlvbnMgQFN0e2N9IGFuZCBAU3R7en0gYXJlIG5vdCBhbGlnbmVkOworb3B0aW9uIEBTdHtzfSBmb2xsb3dzIHRoZSBhbGlnbm1lbnQgb2YgaXRzIHN0YXJ0aW5nIGludGVnZXIuCisKK0FsbCBwYWRkaW5nIGlzIGZpbGxlZCB3aXRoIHplcm9zIGJ5IEBMaWR7c3RyaW5nLnBhY2t9CisoYW5kIGlnbm9yZWQgYnkgQExpZHtzdHJpbmcudW5wYWNrfSkuCisKK30KKworfQorCitAc2VjdDJ7dXRmOHwgQHRpdGxle1VURi04IFN1cHBvcnR9CisKK1RoaXMgbGlicmFyeSBwcm92aWRlcyBiYXNpYyBzdXBwb3J0IGZvciBAeHtVVEYtOH0gZW5jb2RpbmcuCitJdCBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9ucyBpbnNpZGUgdGhlIHRhYmxlIEBkZWZpZHt1dGY4fS4KK1RoaXMgbGlicmFyeSBkb2VzIG5vdCBwcm92aWRlIGFueSBzdXBwb3J0IGZvciBAeHtVbmljb2RlfSBvdGhlcgordGhhbiB0aGUgaGFuZGxpbmcgb2YgdGhlIGVuY29kaW5nLgorQW55IG9wZXJhdGlvbiB0aGF0IG5lZWRzIHRoZSBtZWFuaW5nIG9mIGEgY2hhcmFjdGVyLAorc3VjaCBhcyBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24sIGlzIG91dHNpZGUgaXRzIHNjb3BlLgorCitVbmxlc3Mgc3RhdGVkIG90aGVyd2lzZSwKK2FsbCBmdW5jdGlvbnMgdGhhdCBleHBlY3QgYSBieXRlIHBvc2l0aW9uIGFzIGEgcGFyYW1ldGVyCithc3N1bWUgdGhhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgZWl0aGVyIHRoZSBzdGFydCBvZiBhIGJ5dGUgc2VxdWVuY2UKK29yIG9uZSBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIHN1YmplY3Qgc3RyaW5nLgorQXMgaW4gdGhlIHN0cmluZyBsaWJyYXJ5LAorbmVnYXRpdmUgaW5kaWNlcyBjb3VudCBmcm9tIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKworCitATGliRW50cnl7dXRmOC5jaGFyIChAQ2RvdHMpfAorUmVjZWl2ZXMgemVybyBvciBtb3JlIGludGVnZXJzLAorY29udmVydHMgZWFjaCBvbmUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgVVRGLTggYnl0ZSBzZXF1ZW5jZQorYW5kIHJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhbGwgdGhlc2Ugc2VxdWVuY2VzLgorCit9CisKK0BMaWJFbnRyeXt1dGY4LmNoYXJwYXR0ZXJufAorVGhlIHBhdHRlcm4gKGEgc3RyaW5nLCBub3QgYSBmdW5jdGlvbikgQFN0e1tcMC1ceDdGXHhDMi1ceEY0XVtceDgwLVx4QkZdKn0KK0BzZWV7cG19LAord2hpY2ggbWF0Y2hlcyBleGFjdGx5IG9uZSBVVEYtOCBieXRlIHNlcXVlbmNlLAorYXNzdW1pbmcgdGhhdCB0aGUgc3ViamVjdCBpcyBhIHZhbGlkIFVURi04IHN0cmluZy4KKworfQorCitATGliRW50cnl7dXRmOC5jb2RlcyAocyl8CisKK1JldHVybnMgdmFsdWVzIHNvIHRoYXQgdGhlIGNvbnN0cnVjdGlvbgorQHZlcmJhdGlteworZm9yIHAsIGMgaW4gdXRmOC5jb2RlcyhzKSBkbyBAcmVwe2JvZHl9IGVuZAorfQord2lsbCBpdGVyYXRlIG92ZXIgYWxsIGNoYXJhY3RlcnMgaW4gc3RyaW5nIEBpZHtzfSwKK3dpdGggQGlke3B9IGJlaW5nIHRoZSBwb3NpdGlvbiAoaW4gYnl0ZXMpIGFuZCBAaWR7Y30gdGhlIGNvZGUgcG9pbnQKK29mIGVhY2ggY2hhcmFjdGVyLgorSXQgcmFpc2VzIGFuIGVycm9yIGlmIGl0IG1lZXRzIGFueSBpbnZhbGlkIGJ5dGUgc2VxdWVuY2UuCisKK30KKworQExpYkVudHJ5e3V0ZjguY29kZXBvaW50IChzIFssIGkgWywgal1dKXwKK1JldHVybnMgdGhlIGNvZGVwb2ludHMgKGFzIGludGVnZXJzKSBmcm9tIGFsbCBjaGFyYWN0ZXJzIGluIEBpZHtzfQordGhhdCBzdGFydCBiZXR3ZWVuIGJ5dGUgcG9zaXRpb24gQGlke2l9IGFuZCBAaWR7an0gKGJvdGggaW5jbHVkZWQpLgorVGhlIGRlZmF1bHQgZm9yIEBpZHtpfSBpcyAxIGFuZCBmb3IgQGlke2p9IGlzIEBpZHtpfS4KK0l0IHJhaXNlcyBhbiBlcnJvciBpZiBpdCBtZWV0cyBhbnkgaW52YWxpZCBieXRlIHNlcXVlbmNlLgorCit9CisKK0BMaWJFbnRyeXt1dGY4LmxlbiAocyBbLCBpIFssIGpdXSl8CitSZXR1cm5zIHRoZSBudW1iZXIgb2YgVVRGLTggY2hhcmFjdGVycyBpbiBzdHJpbmcgQGlke3N9Cit0aGF0IHN0YXJ0IGJldHdlZW4gcG9zaXRpb25zIEBpZHtpfSBhbmQgQGlke2p9IChib3RoIGluY2x1c2l2ZSkuCitUaGUgZGVmYXVsdCBmb3IgQGlke2l9IGlzIEBudW17MX0gYW5kIGZvciBAaWR7an0gaXMgQG51bXstMX0uCitJZiBpdCBmaW5kcyBhbnkgaW52YWxpZCBieXRlIHNlcXVlbmNlLAorcmV0dXJucyBhIGZhbHNlIHZhbHVlIHBsdXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBpbnZhbGlkIGJ5dGUuCisKK30KKworQExpYkVudHJ5e3V0Zjgub2Zmc2V0IChzLCBuIFssIGldKXwKK1JldHVybnMgdGhlIHBvc2l0aW9uIChpbiBieXRlcykgd2hlcmUgdGhlIGVuY29kaW5nIG9mIHRoZQorQGlke259LXRoIGNoYXJhY3RlciBvZiBAaWR7c30KKyhjb3VudGluZyBmcm9tIHBvc2l0aW9uIEBpZHtpfSkgc3RhcnRzLgorQSBuZWdhdGl2ZSBAaWR7bn0gZ2V0cyBjaGFyYWN0ZXJzIGJlZm9yZSBwb3NpdGlvbiBAaWR7aX0uCitUaGUgZGVmYXVsdCBmb3IgQGlke2l9IGlzIDEgd2hlbiBAaWR7bn0gaXMgbm9uLW5lZ2F0aXZlCithbmQgQFR7I3MgKyAxfSBvdGhlcndpc2UsCitzbyB0aGF0IEBUe3V0Zjgub2Zmc2V0KHMsIC1uKX0gZ2V0cyB0aGUgb2Zmc2V0IG9mIHRoZQorQGlke259LXRoIGNoYXJhY3RlciBmcm9tIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KK0lmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIG5laXRoZXIgaW4gdGhlIHN1YmplY3QKK25vciByaWdodCBhZnRlciBpdHMgZW5kLAordGhlIGZ1bmN0aW9uIHJldHVybnMgQG5pbC4KKworQXMgYSBzcGVjaWFsIGNhc2UsCit3aGVuIEBpZHtufSBpcyAwIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzdGFydCBvZiB0aGUgZW5jb2RpbmcKK29mIHRoZSBjaGFyYWN0ZXIgdGhhdCBjb250YWlucyB0aGUgQGlke2l9LXRoIGJ5dGUgb2YgQGlke3N9LgorCitUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBAaWR7c30gaXMgYSB2YWxpZCBVVEYtOCBzdHJpbmcuCisKK30KKworfQorCitAc2VjdDJ7dGFibGlifCBAdGl0bGV7VGFibGUgTWFuaXB1bGF0aW9ufQorCitUaGlzIGxpYnJhcnkgcHJvdmlkZXMgZ2VuZXJpYyBmdW5jdGlvbnMgZm9yIHRhYmxlIG1hbmlwdWxhdGlvbi4KK0l0IHByb3ZpZGVzIGFsbCBpdHMgZnVuY3Rpb25zIGluc2lkZSB0aGUgdGFibGUgQGRlZmlke3RhYmxlfS4KKworUmVtZW1iZXIgdGhhdCwgd2hlbmV2ZXIgYW4gb3BlcmF0aW9uIG5lZWRzIHRoZSBsZW5ndGggb2YgYSB0YWJsZSwKK2FsbCBjYXZlYXRzIGFib3V0IHRoZSBsZW5ndGggb3BlcmF0b3IgYXBwbHkgQHNlZXtsZW4tb3B9LgorQWxsIGZ1bmN0aW9ucyBpZ25vcmUgbm9uLW51bWVyaWMga2V5cworaW4gdGhlIHRhYmxlcyBnaXZlbiBhcyBhcmd1bWVudHMuCisKKworQExpYkVudHJ5e3RhYmxlLmNvbmNhdCAobGlzdCBbLCBzZXAgWywgaSBbLCBqXV1dKXwKKworR2l2ZW4gYSBsaXN0IHdoZXJlIGFsbCBlbGVtZW50cyBhcmUgc3RyaW5ncyBvciBudW1iZXJzLAorcmV0dXJucyB0aGUgc3RyaW5nIEBUe2xpc3RbaV0uLnNlcC4ubGlzdFtpKzFdIEBDZG90cyBzZXAuLmxpc3Rbal19LgorVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEBpZHtzZXB9IGlzIHRoZSBlbXB0eSBzdHJpbmcsCit0aGUgZGVmYXVsdCBmb3IgQGlke2l9IGlzIDEsCithbmQgdGhlIGRlZmF1bHQgZm9yIEBpZHtqfSBpcyBAVHsjbGlzdH0uCitJZiBAaWR7aX0gaXMgZ3JlYXRlciB0aGFuIEBpZHtqfSwgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLgorCit9CisKK0BMaWJFbnRyeXt0YWJsZS5pbnNlcnQgKGxpc3QsIFtwb3MsXSB2YWx1ZSl8CisKK0luc2VydHMgZWxlbWVudCBAaWR7dmFsdWV9IGF0IHBvc2l0aW9uIEBpZHtwb3N9IGluIEBpZHtsaXN0fSwKK3NoaWZ0aW5nIHVwIHRoZSBlbGVtZW50cworQFR7bGlzdFtwb3NdLCBsaXN0W3BvcysxXSwgQENkb3RzLCBsaXN0WyNsaXN0XX0uCitUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQGlke3Bvc30gaXMgQFR7I2xpc3QrMX0sCitzbyB0aGF0IGEgY2FsbCBAVHt0YWJsZS5pbnNlcnQodCx4KX0gaW5zZXJ0cyBAaWR7eH0gYXQgdGhlIGVuZAorb2YgbGlzdCBAaWR7dH0uCisKK30KKworQExpYkVudHJ5e3RhYmxlLm1vdmUgKGExLCBmLCBlLCB0IFssYTJdKXwKKworTW92ZXMgZWxlbWVudHMgZnJvbSB0YWJsZSBAaWR7YTF9IHRvIHRhYmxlIEBpZHthMn0sCitwZXJmb3JtaW5nIHRoZSBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcKK211bHRpcGxlIGFzc2lnbm1lbnQ6CitAVHthMlt0XSxAQ2RvdHMgPSBhMVtmXSxAQ2RvdHMsYTFbZV19LgorVGhlIGRlZmF1bHQgZm9yIEBpZHthMn0gaXMgQGlke2ExfS4KK1RoZSBkZXN0aW5hdGlvbiByYW5nZSBjYW4gb3ZlcmxhcCB3aXRoIHRoZSBzb3VyY2UgcmFuZ2UuCitUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIG1vdmVkIG11c3QgZml0IGluIGEgTHVhIGludGVnZXIuCisKK1JldHVybnMgdGhlIGRlc3RpbmF0aW9uIHRhYmxlIEBpZHthMn0uCisKK30KKworQExpYkVudHJ5e3RhYmxlLnBhY2sgKEBDZG90cyl8CisKK1JldHVybnMgYSBuZXcgdGFibGUgd2l0aCBhbGwgYXJndW1lbnRzIHN0b3JlZCBpbnRvIGtleXMgMSwgMiwgZXRjLgorYW5kIHdpdGggYSBmaWVsZCBAU3R7bn0gd2l0aCB0aGUgdG90YWwgbnVtYmVyIG9mIGFyZ3VtZW50cy4KK05vdGUgdGhhdCB0aGUgcmVzdWx0aW5nIHRhYmxlIG1heSBub3QgYmUgYSBzZXF1ZW5jZSwKK2lmIHNvbWUgYXJndW1lbnRzIGFyZSBAbmlsLgorCit9CisKK0BMaWJFbnRyeXt0YWJsZS5yZW1vdmUgKGxpc3QgWywgcG9zXSl8CisKK1JlbW92ZXMgZnJvbSBAaWR7bGlzdH0gdGhlIGVsZW1lbnQgYXQgcG9zaXRpb24gQGlke3Bvc30sCityZXR1cm5pbmcgdGhlIHZhbHVlIG9mIHRoZSByZW1vdmVkIGVsZW1lbnQuCitXaGVuIEBpZHtwb3N9IGlzIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCBAVHsjbGlzdH0sCitpdCBzaGlmdHMgZG93biB0aGUgZWxlbWVudHMKK0BUe2xpc3RbcG9zKzFdLCBsaXN0W3BvcysyXSwgQENkb3RzLCBsaXN0WyNsaXN0XX0KK2FuZCBlcmFzZXMgZWxlbWVudCBAVHtsaXN0WyNsaXN0XX07CitUaGUgaW5kZXggQGlke3Bvc30gY2FuIGFsc28gYmUgMCB3aGVuIEBUeyNsaXN0fSBpcyAwLAorb3IgQFR7I2xpc3QgKyAxfS4KKworVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEBpZHtwb3N9IGlzIEBUeyNsaXN0fSwKK3NvIHRoYXQgYSBjYWxsIEBUe3RhYmxlLnJlbW92ZShsKX0gcmVtb3ZlcyB0aGUgbGFzdCBlbGVtZW50CitvZiBsaXN0IEBpZHtsfS4KKworfQorCitATGliRW50cnl7dGFibGUuc29ydCAobGlzdCBbLCBjb21wXSl8CisKK1NvcnRzIGxpc3QgZWxlbWVudHMgaW4gYSBnaXZlbiBvcmRlciwgQGVtcGh7aW4tcGxhY2V9LAorZnJvbSBAVHtsaXN0WzFdfSB0byBAVHtsaXN0WyNsaXN0XX0uCitJZiBAaWR7Y29tcH0gaXMgZ2l2ZW4sCit0aGVuIGl0IG11c3QgYmUgYSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIHR3byBsaXN0IGVsZW1lbnRzCithbmQgcmV0dXJucyB0cnVlIHdoZW4gdGhlIGZpcnN0IGVsZW1lbnQgbXVzdCBjb21lCitiZWZvcmUgdGhlIHNlY29uZCBpbiB0aGUgZmluYWwgb3JkZXIKKyhzbyB0aGF0LCBhZnRlciB0aGUgc29ydCwKK0BUe2kgPCBqfSBpbXBsaWVzIEBUe25vdCBjb21wKGxpc3Rbal0sbGlzdFtpXSl9KS4KK0lmIEBpZHtjb21wfSBpcyBub3QgZ2l2ZW4sCit0aGVuIHRoZSBzdGFuZGFyZCBMdWEgb3BlcmF0b3IgQFR7PH0gaXMgdXNlZCBpbnN0ZWFkLgorCitOb3RlIHRoYXQgdGhlIEBpZHtjb21wfSBmdW5jdGlvbiBtdXN0IGRlZmluZQorYSBzdHJpY3QgcGFydGlhbCBvcmRlciBvdmVyIHRoZSBlbGVtZW50cyBpbiB0aGUgbGlzdDsKK3RoYXQgaXMsIGl0IG11c3QgYmUgYXN5bW1ldHJpYyBhbmQgdHJhbnNpdGl2ZS4KK090aGVyd2lzZSwgbm8gdmFsaWQgc29ydCBtYXkgYmUgcG9zc2libGUuCisKK1RoZSBzb3J0IGFsZ29yaXRobSBpcyBub3Qgc3RhYmxlOgorZWxlbWVudHMgY29uc2lkZXJlZCBlcXVhbCBieSB0aGUgZ2l2ZW4gb3JkZXIKK21heSBoYXZlIHRoZWlyIHJlbGF0aXZlIHBvc2l0aW9ucyBjaGFuZ2VkIGJ5IHRoZSBzb3J0LgorCit9CisKK0BMaWJFbnRyeXt0YWJsZS51bnBhY2sgKGxpc3QgWywgaSBbLCBqXV0pfAorCitSZXR1cm5zIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBnaXZlbiBsaXN0LgorVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvCitAdmVyYmF0aW17CityZXR1cm4gbGlzdFtpXSwgbGlzdFtpKzFdLCBAQ2RvdHMsIGxpc3Rbal0KK30KK0J5IGRlZmF1bHQsIEBpZHtpfSBATntpcyAxfSBhbmQgQGlke2p9IGlzIEBUeyNsaXN0fS4KKworfQorCit9CisKK0BzZWN0MnttYXRobGlifCBAdGl0bGV7TWF0aGVtYXRpY2FsIEZ1bmN0aW9uc30KKworVGhpcyBsaWJyYXJ5IHByb3ZpZGVzIGJhc2ljIG1hdGhlbWF0aWNhbCBmdW5jdGlvbnMuCitJdCBwcm92aWRlcyBhbGwgaXRzIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzIGluc2lkZSB0aGUgdGFibGUgQGRlZmlke21hdGh9LgorRnVuY3Rpb25zIHdpdGggdGhlIGFubm90YXRpb24gQFN0e2ludGVnZXIvZmxvYXR9IGdpdmUKK2ludGVnZXIgcmVzdWx0cyBmb3IgaW50ZWdlciBhcmd1bWVudHMKK2FuZCBmbG9hdCByZXN1bHRzIGZvciBmbG9hdCAob3IgbWl4ZWQpIGFyZ3VtZW50cy4KK1JvdW5kaW5nIGZ1bmN0aW9ucworKEBMaWR7bWF0aC5jZWlsfSwgQExpZHttYXRoLmZsb29yfSwgYW5kIEBMaWR7bWF0aC5tb2RmfSkKK3JldHVybiBhbiBpbnRlZ2VyIHdoZW4gdGhlIHJlc3VsdCBmaXRzIGluIHRoZSByYW5nZSBvZiBhbiBpbnRlZ2VyLAorb3IgYSBmbG9hdCBvdGhlcndpc2UuCisKK0BMaWJFbnRyeXttYXRoLmFicyAoeCl8CisKK1JldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIEBpZHt4fS4gKGludGVnZXIvZmxvYXQpCisKK30KKworQExpYkVudHJ5e21hdGguYWNvcyAoeCl8CisKK1JldHVybnMgdGhlIGFyYyBjb3NpbmUgb2YgQGlke3h9IChpbiByYWRpYW5zKS4KKworfQorCitATGliRW50cnl7bWF0aC5hc2luICh4KXwKKworUmV0dXJucyB0aGUgYXJjIHNpbmUgb2YgQGlke3h9IChpbiByYWRpYW5zKS4KKworfQorCitATGliRW50cnl7bWF0aC5hdGFuICh5IFssIHhdKXwKKworQGluZGV4e2F0YW4yfQorUmV0dXJucyB0aGUgYXJjIHRhbmdlbnQgb2YgQFR7eS94fSAoaW4gcmFkaWFucyksCitidXQgdXNlcyB0aGUgc2lnbnMgb2YgYm90aCBwYXJhbWV0ZXJzIHRvIGZpbmQgdGhlCitxdWFkcmFudCBvZiB0aGUgcmVzdWx0LgorKEl0IGFsc28gaGFuZGxlcyBjb3JyZWN0bHkgdGhlIGNhc2Ugb2YgQGlke3h9IGJlaW5nIHplcm8uKQorCitUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQGlke3h9IGlzIDEsCitzbyB0aGF0IHRoZSBjYWxsIEBUe21hdGguYXRhbih5KX0KK3JldHVybnMgdGhlIGFyYyB0YW5nZW50IG9mIEBpZHt5fS4KKworfQorCitATGliRW50cnl7bWF0aC5jZWlsICh4KXwKKworUmV0dXJucyB0aGUgc21hbGxlc3QgaW50ZWdyYWwgdmFsdWUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gQGlke3h9LgorCit9CisKK0BMaWJFbnRyeXttYXRoLmNvcyAoeCl8CisKK1JldHVybnMgdGhlIGNvc2luZSBvZiBAaWR7eH0gKGFzc3VtZWQgdG8gYmUgaW4gcmFkaWFucykuCisKK30KKworQExpYkVudHJ5e21hdGguZGVnICh4KXwKKworQ29udmVydHMgdGhlIGFuZ2xlIEBpZHt4fSBmcm9tIHJhZGlhbnMgdG8gZGVncmVlcy4KKworfQorCitATGliRW50cnl7bWF0aC5leHAgKHgpfAorCitSZXR1cm5zIHRoZSB2YWx1ZSBATXtlQHNwe3h9fQorKHdoZXJlIEBpZHtlfSBpcyB0aGUgYmFzZSBvZiBuYXR1cmFsIGxvZ2FyaXRobXMpLgorCit9CisKK0BMaWJFbnRyeXttYXRoLmZsb29yICh4KXwKKworUmV0dXJucyB0aGUgbGFyZ2VzdCBpbnRlZ3JhbCB2YWx1ZSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gQGlke3h9LgorCit9CisKK0BMaWJFbnRyeXttYXRoLmZtb2QgKHgsIHkpfAorCitSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgdGhlIGRpdmlzaW9uIG9mIEBpZHt4fSBieSBAaWR7eX0KK3RoYXQgcm91bmRzIHRoZSBxdW90aWVudCB0b3dhcmRzIHplcm8uIChpbnRlZ2VyL2Zsb2F0KQorCit9CisKK0BMaWJFbnRyeXttYXRoLmh1Z2V8CisKK1RoZSBmbG9hdCB2YWx1ZSBAaWR4e0hVR0VfVkFMfSwKK2EgdmFsdWUgbGFyZ2VyIHRoYW4gYW55IG90aGVyIG51bWVyaWMgdmFsdWUuCisKK30KKworQExpYkVudHJ5e21hdGgubG9nICh4IFssIGJhc2VdKXwKKworUmV0dXJucyB0aGUgbG9nYXJpdGhtIG9mIEBpZHt4fSBpbiB0aGUgZ2l2ZW4gYmFzZS4KK1RoZSBkZWZhdWx0IGZvciBAaWR7YmFzZX0gaXMgQE17ZX0KKyhzbyB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiBAaWR7eH0pLgorCit9CisKK0BMaWJFbnRyeXttYXRoLm1heCAoeCwgQENkb3RzKXwKKworUmV0dXJucyB0aGUgYXJndW1lbnQgd2l0aCB0aGUgbWF4aW11bSB2YWx1ZSwKK2FjY29yZGluZyB0byB0aGUgTHVhIG9wZXJhdG9yIEBUezx9LiAoaW50ZWdlci9mbG9hdCkKKworfQorCitATGliRW50cnl7bWF0aC5tYXhpbnRlZ2VyfAorQW4gaW50ZWdlciB3aXRoIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBhbiBpbnRlZ2VyLgorCit9CisKK0BMaWJFbnRyeXttYXRoLm1pbiAoeCwgQENkb3RzKXwKKworUmV0dXJucyB0aGUgYXJndW1lbnQgd2l0aCB0aGUgbWluaW11bSB2YWx1ZSwKK2FjY29yZGluZyB0byB0aGUgTHVhIG9wZXJhdG9yIEBUezx9LiAoaW50ZWdlci9mbG9hdCkKKworfQorCitATGliRW50cnl7bWF0aC5taW5pbnRlZ2VyfAorQW4gaW50ZWdlciB3aXRoIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBhbiBpbnRlZ2VyLgorCit9CisKK0BMaWJFbnRyeXttYXRoLm1vZGYgKHgpfAorCitSZXR1cm5zIHRoZSBpbnRlZ3JhbCBwYXJ0IG9mIEBpZHt4fSBhbmQgdGhlIGZyYWN0aW9uYWwgcGFydCBvZiBAaWR7eH0uCitJdHMgc2Vjb25kIHJlc3VsdCBpcyBhbHdheXMgYSBmbG9hdC4KKworfQorCitATGliRW50cnl7bWF0aC5waXwKKworVGhlIHZhbHVlIG9mIEBNe0BwaX0uCisKK30KKworQExpYkVudHJ5e21hdGgucmFkICh4KXwKKworQ29udmVydHMgdGhlIGFuZ2xlIEBpZHt4fSBmcm9tIGRlZ3JlZXMgdG8gcmFkaWFucy4KKworfQorCitATGliRW50cnl7bWF0aC5yYW5kb20gKFttIFssIG5dXSl8CisKK1doZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLAorcmV0dXJucyBhIHBzZXVkby1yYW5kb20gZmxvYXQgd2l0aCB1bmlmb3JtIGRpc3RyaWJ1dGlvbgoraW4gdGhlIHJhbmdlIEBDeyh9IEBNe1swLDEpfS4gIEBDe119CitXaGVuIGNhbGxlZCB3aXRoIHR3byBpbnRlZ2VycyBAaWR7bX0gYW5kIEBpZHtufSwKK0BpZHttYXRoLnJhbmRvbX0gcmV0dXJucyBhIHBzZXVkby1yYW5kb20gaW50ZWdlcgord2l0aCB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBpbiB0aGUgcmFuZ2UgQE17W20sIG5dfS4KK1RoZSBjYWxsIEBUe21hdGgucmFuZG9tKG4pfSwgZm9yIGEgcG9zaXRpdmUgQGlke259LAoraXMgZXF1aXZhbGVudCB0byBAVHttYXRoLnJhbmRvbSgxLG4pfS4KK1RoZSBjYWxsIEBUe21hdGgucmFuZG9tKDApfSBwcm9kdWNlcyBhbiBpbnRlZ2VyIHdpdGgKK2FsbCBiaXRzIChwc2V1ZG8pcmFuZG9tLgorCitMdWEgaW5pdGlhbGl6ZXMgaXRzIHBzZXVkby1yYW5kb20gZ2VuZXJhdG9yIHdpdGgKK2Egd2VhayBhdHRlbXB0IGZvciBgYHJhbmRvbW5lc3MnJywKK3NvIHRoYXQgQGlke21hdGgucmFuZG9tfSBzaG91bGQgZ2VuZXJhdGUKK2RpZmZlcmVudCBzZXF1ZW5jZXMgb2YgcmVzdWx0cyBlYWNoIHRpbWUgdGhlIHByb2dyYW0gcnVucy4KK1RvIGVuc3VyZSBhIHJlcXVpcmVkIGxldmVsIG9mIHJhbmRvbW5lc3MgdG8gdGhlIGluaXRpYWwgc3RhdGUKKyhvciBjb250cmFyaWx5LCB0byBoYXZlIGEgZGV0ZXJtaW5pc3RpYyBzZXF1ZW5jZSwKK2ZvciBpbnN0YW5jZSB3aGVuIGRlYnVnZ2luZyBhIHByb2dyYW0pLAoreW91IHNob3VsZCBjYWxsIEBMaWR7bWF0aC5yYW5kb21zZWVkfSBleHBsaWNpdGx5LgorCitUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZnVuY3Rpb24gaGF2ZSBnb29kIHN0YXRpc3RpY2FsIHF1YWxpdGllcywKK2J1dCB0aGV5IGFyZSBub3QgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlLgorKEZvciBpbnN0YW5jZSwgdGhlcmUgYXJlIG5vIGdhcmFudGllcyB0aGF0IGl0IGlzIGhhcmQKK3RvIHByZWRpY3QgZnV0dXJlIHJlc3VsdHMgYmFzZWQgb24gdGhlIG9ic2VydmF0aW9uIG9mCitzb21lIG51bWJlciBvZiBwcmV2aW91cyByZXN1bHRzLikKKworfQorCitATGliRW50cnl7bWF0aC5yYW5kb21zZWVkICh4IFssIHldKXwKKworU2V0cyBAaWR7eH0gYW5kIEBpZHt5fSBhcyB0aGUgQFF7c2VlZH0KK2ZvciB0aGUgcHNldWRvLXJhbmRvbSBnZW5lcmF0b3I6CitlcXVhbCBzZWVkcyBwcm9kdWNlIGVxdWFsIHNlcXVlbmNlcyBvZiBudW1iZXJzLgorVGhlIGRlZmF1bHQgZm9yIEBpZHt5fSBpcyB6ZXJvLgorCit9CisKK0BMaWJFbnRyeXttYXRoLnNpbiAoeCl8CisKK1JldHVybnMgdGhlIHNpbmUgb2YgQGlke3h9IChhc3N1bWVkIHRvIGJlIGluIHJhZGlhbnMpLgorCit9CisKK0BMaWJFbnRyeXttYXRoLnNxcnQgKHgpfAorCitSZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiBAaWR7eH0uCisoWW91IGNhbiBhbHNvIHVzZSB0aGUgZXhwcmVzc2lvbiBAVHt4XjAuNX0gdG8gY29tcHV0ZSB0aGlzIHZhbHVlLikKKworfQorCitATGliRW50cnl7bWF0aC50YW4gKHgpfAorCitSZXR1cm5zIHRoZSB0YW5nZW50IG9mIEBpZHt4fSAoYXNzdW1lZCB0byBiZSBpbiByYWRpYW5zKS4KKworfQorCitATGliRW50cnl7bWF0aC50b2ludGVnZXIgKHgpfAorCitJZiB0aGUgdmFsdWUgQGlke3h9IGlzIGNvbnZlcnRpYmxlIHRvIGFuIGludGVnZXIsCityZXR1cm5zIHRoYXQgaW50ZWdlci4KK090aGVyd2lzZSwgcmV0dXJucyBAbmlsLgorCit9CisKK0BMaWJFbnRyeXttYXRoLnR5cGUgKHgpfAorCitSZXR1cm5zIEBTdHtpbnRlZ2VyfSBpZiBAaWR7eH0gaXMgYW4gaW50ZWdlciwKK0BTdHtmbG9hdH0gaWYgaXQgaXMgYSBmbG9hdCwKK29yIEBuaWwgaWYgQGlke3h9IGlzIG5vdCBhIG51bWJlci4KKworfQorCitATGliRW50cnl7bWF0aC51bHQgKG0sIG4pfAorCitSZXR1cm5zIGEgYm9vbGVhbiwKK3RydWUgaWYgYW5kIG9ubHkgaWYgaW50ZWdlciBAaWR7bX0gaXMgYmVsb3cgaW50ZWdlciBAaWR7bn0gd2hlbgordGhleSBhcmUgY29tcGFyZWQgYXMgQHh7dW5zaWduZWQgaW50ZWdlcnN9LgorCit9CisKK30KKworCitAc2VjdDJ7aW9saWJ8IEB0aXRsZXtJbnB1dCBhbmQgT3V0cHV0IEZhY2lsaXRpZXN9CisKK1RoZSBJL08gbGlicmFyeSBwcm92aWRlcyB0d28gZGlmZmVyZW50IHN0eWxlcyBmb3IgZmlsZSBtYW5pcHVsYXRpb24uCitUaGUgZmlyc3Qgb25lIHVzZXMgaW1wbGljaXQgZmlsZSBoYW5kbGVzOwordGhhdCBpcywgdGhlcmUgYXJlIG9wZXJhdGlvbnMgdG8gc2V0IGEgZGVmYXVsdCBpbnB1dCBmaWxlIGFuZCBhCitkZWZhdWx0IG91dHB1dCBmaWxlLAorYW5kIGFsbCBpbnB1dC9vdXRwdXQgb3BlcmF0aW9ucyBhcmUgb3ZlciB0aGVzZSBkZWZhdWx0IGZpbGVzLgorVGhlIHNlY29uZCBzdHlsZSB1c2VzIGV4cGxpY2l0IGZpbGUgaGFuZGxlcy4KKworV2hlbiB1c2luZyBpbXBsaWNpdCBmaWxlIGhhbmRsZXMsCithbGwgb3BlcmF0aW9ucyBhcmUgc3VwcGxpZWQgYnkgdGFibGUgQGRlZmlke2lvfS4KK1doZW4gdXNpbmcgZXhwbGljaXQgZmlsZSBoYW5kbGVzLAordGhlIG9wZXJhdGlvbiBATGlke2lvLm9wZW59IHJldHVybnMgYSBmaWxlIGhhbmRsZQorYW5kIHRoZW4gYWxsIG9wZXJhdGlvbnMgYXJlIHN1cHBsaWVkIGFzIG1ldGhvZHMgb2YgdGhlIGZpbGUgaGFuZGxlLgorCitUaGUgdGFibGUgQGlke2lvfSBhbHNvIHByb3ZpZGVzCit0aHJlZSBwcmVkZWZpbmVkIGZpbGUgaGFuZGxlcyB3aXRoIHRoZWlyIHVzdWFsIG1lYW5pbmdzIGZyb20gQzoKK0BkZWZpZHtpby5zdGRpbn0sIEBkZWZpZHtpby5zdGRvdXR9LCBhbmQgQGRlZmlke2lvLnN0ZGVycn0uCitUaGUgSS9PIGxpYnJhcnkgbmV2ZXIgY2xvc2VzIHRoZXNlIGZpbGVzLgorCitVbmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwKK2FsbCBJL08gZnVuY3Rpb25zIHJldHVybiBAbmlsIG9uIGZhaWx1cmUKKyhwbHVzIGFuIGVycm9yIG1lc3NhZ2UgYXMgYSBzZWNvbmQgcmVzdWx0IGFuZAorYSBzeXN0ZW0tZGVwZW5kZW50IGVycm9yIGNvZGUgYXMgYSB0aGlyZCByZXN1bHQpCithbmQgc29tZSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSBAbmlsIG9uIHN1Y2Nlc3MuCitPbiBub24tUE9TSVggc3lzdGVtcywKK3RoZSBjb21wdXRhdGlvbiBvZiB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgZXJyb3IgY29kZQoraW4gY2FzZSBvZiBlcnJvcnMKK21heSBiZSBub3QgQHh7dGhyZWFkIHNhZmV9LAorYmVjYXVzZSB0aGV5IHJlbHkgb24gdGhlIGdsb2JhbCBDIHZhcmlhYmxlIEBpZHtlcnJub30uCisKK0BMaWJFbnRyeXtpby5jbG9zZSAoW2ZpbGVdKXwKKworRXF1aXZhbGVudCB0byBAVHtmaWxlOmNsb3NlKCl9LgorV2l0aG91dCBhIEBpZHtmaWxlfSwgY2xvc2VzIHRoZSBkZWZhdWx0IG91dHB1dCBmaWxlLgorCit9CisKK0BMaWJFbnRyeXtpby5mbHVzaCAoKXwKKworRXF1aXZhbGVudCB0byBAVHtpby5vdXRwdXQoKTpmbHVzaCgpfS4KKworfQorCitATGliRW50cnl7aW8uaW5wdXQgKFtmaWxlXSl8CisKK1doZW4gY2FsbGVkIHdpdGggYSBmaWxlIG5hbWUsIGl0IG9wZW5zIHRoZSBuYW1lZCBmaWxlIChpbiB0ZXh0IG1vZGUpLAorYW5kIHNldHMgaXRzIGhhbmRsZSBhcyB0aGUgZGVmYXVsdCBpbnB1dCBmaWxlLgorV2hlbiBjYWxsZWQgd2l0aCBhIGZpbGUgaGFuZGxlLAoraXQgc2ltcGx5IHNldHMgdGhpcyBmaWxlIGhhbmRsZSBhcyB0aGUgZGVmYXVsdCBpbnB1dCBmaWxlLgorV2hlbiBjYWxsZWQgd2l0aG91dCBwYXJhbWV0ZXJzLAoraXQgcmV0dXJucyB0aGUgY3VycmVudCBkZWZhdWx0IGlucHV0IGZpbGUuCisKK0luIGNhc2Ugb2YgZXJyb3JzIHRoaXMgZnVuY3Rpb24gcmFpc2VzIHRoZSBlcnJvciwKK2luc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yIGNvZGUuCisKK30KKworQExpYkVudHJ5e2lvLmxpbmVzIChbZmlsZW5hbWUsIEBDZG90c10pfAorCitPcGVucyB0aGUgZ2l2ZW4gZmlsZSBuYW1lIGluIHJlYWQgbW9kZQorYW5kIHJldHVybnMgYW4gaXRlcmF0b3IgZnVuY3Rpb24gdGhhdAord29ya3MgbGlrZSBAVHtmaWxlOmxpbmVzKEBDZG90cyl9IG92ZXIgdGhlIG9wZW5lZCBmaWxlLgorV2hlbiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gZGV0ZWN0cyB0aGUgZW5kIG9mIGZpbGUsCitpdCByZXR1cm5zIG5vIHZhbHVlcyAodG8gZmluaXNoIHRoZSBsb29wKSBhbmQgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGZpbGUuCisKK1RoZSBjYWxsIEBUe2lvLmxpbmVzKCl9ICh3aXRoIG5vIGZpbGUgbmFtZSkgaXMgZXF1aXZhbGVudAordG8gQFR7aW8uaW5wdXQoKTpsaW5lcygibCIpfTsKK3RoYXQgaXMsIGl0IGl0ZXJhdGVzIG92ZXIgdGhlIGxpbmVzIG9mIHRoZSBkZWZhdWx0IGlucHV0IGZpbGUuCitJbiB0aGlzIGNhc2UsIHRoZSBpdGVyYXRvciBkb2VzIG5vdCBjbG9zZSB0aGUgZmlsZSB3aGVuIHRoZSBsb29wIGVuZHMuCisKK0luIGNhc2Ugb2YgZXJyb3JzIHRoaXMgZnVuY3Rpb24gcmFpc2VzIHRoZSBlcnJvciwKK2luc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yIGNvZGUuCisKK30KKworQExpYkVudHJ5e2lvLm9wZW4gKGZpbGVuYW1lIFssIG1vZGVdKXwKKworVGhpcyBmdW5jdGlvbiBvcGVucyBhIGZpbGUsCitpbiB0aGUgbW9kZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBAaWR7bW9kZX0uCitJbiBjYXNlIG9mIHN1Y2Nlc3MsCitpdCByZXR1cm5zIGEgbmV3IGZpbGUgaGFuZGxlLgorCitUaGUgQGlke21vZGV9IHN0cmluZyBjYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6CitAZGVzY3JpcHRpb257CitAaXRlbXtAU3R7cn18IHJlYWQgbW9kZSAodGhlIGRlZmF1bHQpO30KK0BpdGVte0BTdHt3fXwgd3JpdGUgbW9kZTt9CitAaXRlbXtAU3R7YX18IGFwcGVuZCBtb2RlO30KK0BpdGVte0BTdHtyK318IHVwZGF0ZSBtb2RlLCBhbGwgcHJldmlvdXMgZGF0YSBpcyBwcmVzZXJ2ZWQ7fQorQGl0ZW17QFN0e3crfXwgdXBkYXRlIG1vZGUsIGFsbCBwcmV2aW91cyBkYXRhIGlzIGVyYXNlZDt9CitAaXRlbXtAU3R7YSt9fCBhcHBlbmQgdXBkYXRlIG1vZGUsIHByZXZpb3VzIGRhdGEgaXMgcHJlc2VydmVkLAorICB3cml0aW5nIGlzIG9ubHkgYWxsb3dlZCBhdCB0aGUgZW5kIG9mIGZpbGUufQorfQorVGhlIEBpZHttb2RlfSBzdHJpbmcgY2FuIGFsc28gaGF2ZSBhIEBDaGFye2J9IGF0IHRoZSBlbmQsCit3aGljaCBpcyBuZWVkZWQgaW4gc29tZSBzeXN0ZW1zIHRvIG9wZW4gdGhlIGZpbGUgaW4gYmluYXJ5IG1vZGUuCisKK30KKworQExpYkVudHJ5e2lvLm91dHB1dCAoW2ZpbGVdKXwKKworU2ltaWxhciB0byBATGlke2lvLmlucHV0fSwgYnV0IG9wZXJhdGVzIG92ZXIgdGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUuCisKK30KKworQExpYkVudHJ5e2lvLnBvcGVuIChwcm9nIFssIG1vZGVdKXwKKworVGhpcyBmdW5jdGlvbiBpcyBzeXN0ZW0gZGVwZW5kZW50IGFuZCBpcyBub3QgYXZhaWxhYmxlCitvbiBhbGwgcGxhdGZvcm1zLgorCitTdGFydHMgcHJvZ3JhbSBAaWR7cHJvZ30gaW4gYSBzZXBhcmF0ZWQgcHJvY2VzcyBhbmQgcmV0dXJucworYSBmaWxlIGhhbmRsZSB0aGF0IHlvdSBjYW4gdXNlIHRvIHJlYWQgZGF0YSBmcm9tIHRoaXMgcHJvZ3JhbQorKGlmIEBpZHttb2RlfSBpcyBAVHsiciJ9LCB0aGUgZGVmYXVsdCkKK29yIHRvIHdyaXRlIGRhdGEgdG8gdGhpcyBwcm9ncmFtCisoaWYgQGlke21vZGV9IGlzIEBUeyJ3In0pLgorCit9CisKK0BMaWJFbnRyeXtpby5yZWFkIChAQ2RvdHMpfAorCitFcXVpdmFsZW50IHRvIEBUe2lvLmlucHV0KCk6cmVhZChAQ2RvdHMpfS4KKworfQorCitATGliRW50cnl7aW8udG1wZmlsZSAoKXwKKworSW4gY2FzZSBvZiBzdWNjZXNzLAorcmV0dXJucyBhIGhhbmRsZSBmb3IgYSB0ZW1wb3JhcnkgZmlsZS4KK1RoaXMgZmlsZSBpcyBvcGVuZWQgaW4gdXBkYXRlIG1vZGUKK2FuZCBpdCBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiB0aGUgcHJvZ3JhbSBlbmRzLgorCit9CisKK0BMaWJFbnRyeXtpby50eXBlIChvYmopfAorCitDaGVja3Mgd2hldGhlciBAaWR7b2JqfSBpcyBhIHZhbGlkIGZpbGUgaGFuZGxlLgorUmV0dXJucyB0aGUgc3RyaW5nIEBUeyJmaWxlIn0gaWYgQGlke29ian0gaXMgYW4gb3BlbiBmaWxlIGhhbmRsZSwKK0BUeyJjbG9zZWQgZmlsZSJ9IGlmIEBpZHtvYmp9IGlzIGEgY2xvc2VkIGZpbGUgaGFuZGxlLAorb3IgQG5pbCBpZiBAaWR7b2JqfSBpcyBub3QgYSBmaWxlIGhhbmRsZS4KKworfQorCitATGliRW50cnl7aW8ud3JpdGUgKEBDZG90cyl8CisKK0VxdWl2YWxlbnQgdG8gQFR7aW8ub3V0cHV0KCk6d3JpdGUoQENkb3RzKX0uCisKKworfQorCitATGliRW50cnl7ZmlsZTpjbG9zZSAoKXwKKworQ2xvc2VzIEBpZHtmaWxlfS4KK05vdGUgdGhhdCBmaWxlcyBhcmUgYXV0b21hdGljYWxseSBjbG9zZWQgd2hlbgordGhlaXIgaGFuZGxlcyBhcmUgZ2FyYmFnZSBjb2xsZWN0ZWQsCitidXQgdGhhdCB0YWtlcyBhbiB1bnByZWRpY3RhYmxlIGFtb3VudCBvZiB0aW1lIHRvIGhhcHBlbi4KKworV2hlbiBjbG9zaW5nIGEgZmlsZSBoYW5kbGUgY3JlYXRlZCB3aXRoIEBMaWR7aW8ucG9wZW59LAorQExpZHtmaWxlOmNsb3NlfSByZXR1cm5zIHRoZSBzYW1lIHZhbHVlcworcmV0dXJuZWQgYnkgQExpZHtvcy5leGVjdXRlfS4KKworfQorCitATGliRW50cnl7ZmlsZTpmbHVzaCAoKXwKKworU2F2ZXMgYW55IHdyaXR0ZW4gZGF0YSB0byBAaWR7ZmlsZX0uCisKK30KKworQExpYkVudHJ5e2ZpbGU6bGluZXMgKEBDZG90cyl8CisKK1JldHVybnMgYW4gaXRlcmF0b3IgZnVuY3Rpb24gdGhhdCwKK2VhY2ggdGltZSBpdCBpcyBjYWxsZWQsCityZWFkcyB0aGUgZmlsZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGZvcm1hdHMuCitXaGVuIG5vIGZvcm1hdCBpcyBnaXZlbiwKK3VzZXMgQFN0e2x9IGFzIGEgZGVmYXVsdC4KK0FzIGFuIGV4YW1wbGUsIHRoZSBjb25zdHJ1Y3Rpb24KK0B2ZXJiYXRpbXsKK2ZvciBjIGluIGZpbGU6bGluZXMoMSkgZG8gQHJlcHtib2R5fSBlbmQKK30KK3dpbGwgaXRlcmF0ZSBvdmVyIGFsbCBjaGFyYWN0ZXJzIG9mIHRoZSBmaWxlLAorc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCitVbmxpa2UgQExpZHtpby5saW5lc30sIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2xvc2UgdGhlIGZpbGUKK3doZW4gdGhlIGxvb3AgZW5kcy4KKworSW4gY2FzZSBvZiBlcnJvcnMgdGhpcyBmdW5jdGlvbiByYWlzZXMgdGhlIGVycm9yLAoraW5zdGVhZCBvZiByZXR1cm5pbmcgYW4gZXJyb3IgY29kZS4KKworfQorCitATGliRW50cnl7ZmlsZTpyZWFkIChAQ2RvdHMpfAorCitSZWFkcyB0aGUgZmlsZSBAaWR7ZmlsZX0sCithY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGZvcm1hdHMsIHdoaWNoIHNwZWNpZnkgd2hhdCB0byByZWFkLgorRm9yIGVhY2ggZm9ybWF0LAordGhlIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgb3IgYSBudW1iZXIgd2l0aCB0aGUgY2hhcmFjdGVycyByZWFkLAorb3IgQG5pbCBpZiBpdCBjYW5ub3QgcmVhZCBkYXRhIHdpdGggdGhlIHNwZWNpZmllZCBmb3JtYXQuCisoSW4gdGhpcyBsYXR0ZXIgY2FzZSwKK3RoZSBmdW5jdGlvbiBkb2VzIG5vdCByZWFkIHN1YnNlcXVlbnQgZm9ybWF0cy4pCitXaGVuIGNhbGxlZCB3aXRob3V0IHBhcmFtZXRlcnMsCitpdCB1c2VzIGEgZGVmYXVsdCBmb3JtYXQgdGhhdCByZWFkcyB0aGUgbmV4dCBsaW5lCisoc2VlIGJlbG93KS4KKworVGhlIGF2YWlsYWJsZSBmb3JtYXRzIGFyZQorQGRlc2NyaXB0aW9ueworCitAaXRlbXtAU3R7bn18CityZWFkcyBhIG51bWVyYWwgYW5kIHJldHVybnMgaXQgYXMgYSBmbG9hdCBvciBhbiBpbnRlZ2VyLAorZm9sbG93aW5nIHRoZSBsZXhpY2FsIGNvbnZlbnRpb25zIG9mIEx1YS4KKyhUaGUgbnVtZXJhbCBtYXkgaGF2ZSBsZWFkaW5nIHNwYWNlcyBhbmQgYSBzaWduLikKK1RoaXMgZm9ybWF0IGFsd2F5cyByZWFkcyB0aGUgbG9uZ2VzdCBpbnB1dCBzZXF1ZW5jZSB0aGF0CitpcyBhIHZhbGlkIHByZWZpeCBmb3IgYSBudW1lcmFsOworaWYgdGhhdCBwcmVmaXggZG9lcyBub3QgZm9ybSBhIHZhbGlkIG51bWVyYWwKKyhlLmcuLCBhbiBlbXB0eSBzdHJpbmcsIEBTdHsweH0sIG9yIEBTdHszLjRlLX0pLAoraXQgaXMgZGlzY2FyZGVkIGFuZCB0aGUgZm9ybWF0IHJldHVybnMgQG5pbC4KK30KKworQGl0ZW17QFN0e2F9fAorcmVhZHMgdGhlIHdob2xlIGZpbGUsIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorT24gZW5kIG9mIGZpbGUsIGl0IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZy4KK30KKworQGl0ZW17QFN0e2x9fAorcmVhZHMgdGhlIG5leHQgbGluZSBza2lwcGluZyB0aGUgZW5kIG9mIGxpbmUsCityZXR1cm5pbmcgQG5pbCBvbiBlbmQgb2YgZmlsZS4KK1RoaXMgaXMgdGhlIGRlZmF1bHQgZm9ybWF0LgorfQorCitAaXRlbXtAU3R7TH18CityZWFkcyB0aGUgbmV4dCBsaW5lIGtlZXBpbmcgdGhlIGVuZC1vZi1saW5lIGNoYXJhY3RlciAoaWYgcHJlc2VudCksCityZXR1cm5pbmcgQG5pbCBvbiBlbmQgb2YgZmlsZS4KK30KKworQGl0ZW17QGVtcGh7bnVtYmVyfXwKK3JlYWRzIGEgc3RyaW5nIHdpdGggdXAgdG8gdGhpcyBudW1iZXIgb2YgYnl0ZXMsCityZXR1cm5pbmcgQG5pbCBvbiBlbmQgb2YgZmlsZS4KK0lmIEBpZHtudW1iZXJ9IGlzIHplcm8sCitpdCByZWFkcyBub3RoaW5nIGFuZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZywKK29yIEBuaWwgb24gZW5kIG9mIGZpbGUuCit9CisKK30KK1RoZSBmb3JtYXRzIEBTdHtsfSBhbmQgQFN0e0x9IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIHRleHQgZmlsZXMuCisKK30KKworQExpYkVudHJ5e2ZpbGU6c2VlayAoW3doZW5jZSBbLCBvZmZzZXRdXSl8CisKK1NldHMgYW5kIGdldHMgdGhlIGZpbGUgcG9zaXRpb24sCittZWFzdXJlZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUsCit0byB0aGUgcG9zaXRpb24gZ2l2ZW4gYnkgQGlke29mZnNldH0gcGx1cyBhIGJhc2UKK3NwZWNpZmllZCBieSB0aGUgc3RyaW5nIEBpZHt3aGVuY2V9LCBhcyBmb2xsb3dzOgorQGRlc2NyaXB0aW9ueworQGl0ZW17QFN0e3NldH18IGJhc2UgaXMgcG9zaXRpb24gMCAoYmVnaW5uaW5nIG9mIHRoZSBmaWxlKTt9CitAaXRlbXtAU3R7Y3VyfXwgYmFzZSBpcyBjdXJyZW50IHBvc2l0aW9uO30KK0BpdGVte0BTdHtlbmR9fCBiYXNlIGlzIGVuZCBvZiBmaWxlO30KK30KK0luIGNhc2Ugb2Ygc3VjY2VzcywgQGlke3NlZWt9IHJldHVybnMgdGhlIGZpbmFsIGZpbGUgcG9zaXRpb24sCittZWFzdXJlZCBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCitJZiBAaWR7c2Vla30gZmFpbHMsIGl0IHJldHVybnMgQG5pbCwKK3BsdXMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisKK1RoZSBkZWZhdWx0IHZhbHVlIGZvciBAaWR7d2hlbmNlfSBpcyBAVHsiY3VyIn0sCithbmQgZm9yIEBpZHtvZmZzZXR9IGlzIDAuCitUaGVyZWZvcmUsIHRoZSBjYWxsIEBUe2ZpbGU6c2VlaygpfSByZXR1cm5zIHRoZSBjdXJyZW50CitmaWxlIHBvc2l0aW9uLCB3aXRob3V0IGNoYW5naW5nIGl0OwordGhlIGNhbGwgQFR7ZmlsZTpzZWVrKCJzZXQiKX0gc2V0cyB0aGUgcG9zaXRpb24gdG8gdGhlCitiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKGFuZCByZXR1cm5zIDApOworYW5kIHRoZSBjYWxsIEBUe2ZpbGU6c2VlaygiZW5kIil9IHNldHMgdGhlIHBvc2l0aW9uIHRvIHRoZQorZW5kIG9mIHRoZSBmaWxlLCBhbmQgcmV0dXJucyBpdHMgc2l6ZS4KKworfQorCitATGliRW50cnl7ZmlsZTpzZXR2YnVmIChtb2RlIFssIHNpemVdKXwKKworU2V0cyB0aGUgYnVmZmVyaW5nIG1vZGUgZm9yIGFuIG91dHB1dCBmaWxlLgorVGhlcmUgYXJlIHRocmVlIGF2YWlsYWJsZSBtb2RlczoKK0BkZXNjcmlwdGlvbnsKKworQGl0ZW17QFN0e25vfXwKK25vIGJ1ZmZlcmluZzsgdGhlIHJlc3VsdCBvZiBhbnkgb3V0cHV0IG9wZXJhdGlvbiBhcHBlYXJzIGltbWVkaWF0ZWx5LgorfQorCitAaXRlbXtAU3R7ZnVsbH18CitmdWxsIGJ1ZmZlcmluZzsgb3V0cHV0IG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb25seQord2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwgb3Igd2hlbgoreW91IGV4cGxpY2l0bHkgQFR7Zmx1c2h9IHRoZSBmaWxlIEBzZWVGe2lvLmZsdXNofS4KK30KKworQGl0ZW17QFN0e2xpbmV9fAorbGluZSBidWZmZXJpbmc7IG91dHB1dCBpcyBidWZmZXJlZCB1bnRpbCBhIG5ld2xpbmUgaXMgb3V0cHV0CitvciB0aGVyZSBpcyBhbnkgaW5wdXQgZnJvbSBzb21lIHNwZWNpYWwgZmlsZXMKKyhzdWNoIGFzIGEgdGVybWluYWwgZGV2aWNlKS4KK30KKworfQorRm9yIHRoZSBsYXN0IHR3byBjYXNlcywgQGlke3NpemV9CitzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgaW4gYnl0ZXMuCitUaGUgZGVmYXVsdCBpcyBhbiBhcHByb3ByaWF0ZSBzaXplLgorCit9CisKK0BMaWJFbnRyeXtmaWxlOndyaXRlIChAQ2RvdHMpfAorCitXcml0ZXMgdGhlIHZhbHVlIG9mIGVhY2ggb2YgaXRzIGFyZ3VtZW50cyB0byBAaWR7ZmlsZX0uCitUaGUgYXJndW1lbnRzIG11c3QgYmUgc3RyaW5ncyBvciBudW1iZXJzLgorCitJbiBjYXNlIG9mIHN1Y2Nlc3MsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBAaWR7ZmlsZX0uCitPdGhlcndpc2UgaXQgcmV0dXJucyBAbmlsIHBsdXMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisKK30KKworfQorCitAc2VjdDJ7b3NsaWJ8IEB0aXRsZXtPcGVyYXRpbmcgU3lzdGVtIEZhY2lsaXRpZXN9CisKK1RoaXMgbGlicmFyeSBpcyBpbXBsZW1lbnRlZCB0aHJvdWdoIHRhYmxlIEBkZWZpZHtvc30uCisKKworQExpYkVudHJ5e29zLmNsb2NrICgpfAorCitSZXR1cm5zIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGFtb3VudCBpbiBzZWNvbmRzIG9mIENQVSB0aW1lCit1c2VkIGJ5IHRoZSBwcm9ncmFtLgorCit9CisKK0BMaWJFbnRyeXtvcy5kYXRlIChbZm9ybWF0IFssIHRpbWVdXSl8CisKK1JldHVybnMgYSBzdHJpbmcgb3IgYSB0YWJsZSBjb250YWluaW5nIGRhdGUgYW5kIHRpbWUsCitmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzdHJpbmcgQGlke2Zvcm1hdH0uCisKK0lmIHRoZSBAaWR7dGltZX0gYXJndW1lbnQgaXMgcHJlc2VudCwKK3RoaXMgaXMgdGhlIHRpbWUgdG8gYmUgZm9ybWF0dGVkCisoc2VlIHRoZSBATGlke29zLnRpbWV9IGZ1bmN0aW9uIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgdmFsdWUpLgorT3RoZXJ3aXNlLCBAaWR7ZGF0ZX0gZm9ybWF0cyB0aGUgY3VycmVudCB0aW1lLgorCitJZiBAaWR7Zm9ybWF0fSBzdGFydHMgd2l0aCBAQ2hhcnshfSwKK3RoZW4gdGhlIGRhdGUgaXMgZm9ybWF0dGVkIGluIENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lLgorQWZ0ZXIgdGhpcyBvcHRpb25hbCBjaGFyYWN0ZXIsCitpZiBAaWR7Zm9ybWF0fSBpcyB0aGUgc3RyaW5nIEBTdHsqdH0sCit0aGVuIEBpZHtkYXRlfSByZXR1cm5zIGEgdGFibGUgd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczoKK0BpZHt5ZWFyfSwgQGlke21vbnRofSAoMUBFbnt9MTIpLCBAaWR7ZGF5fSAoMUBFbnt9MzEpLAorQGlke2hvdXJ9ICgwQEVue30yMyksIEBpZHttaW59ICgwQEVue301OSksCitAaWR7c2VjfSAoMEBFbnt9NjEsIGR1ZSB0byBsZWFwIHNlY29uZHMpLAorQGlke3dkYXl9ICh3ZWVrZGF5LCAxQEVue303LCBTdW5kYXkgQE57aXMgMX0pLAorQGlke3lkYXl9IChkYXkgb2YgdGhlIHllYXIsIDFARW57fTM2NiksCithbmQgQGlke2lzZHN0fSAoZGF5bGlnaHQgc2F2aW5nIGZsYWcsIGEgYm9vbGVhbikuCitUaGlzIGxhc3QgZmllbGQgbWF5IGJlIGFic2VudAoraWYgdGhlIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuCisKK0lmIEBpZHtmb3JtYXR9IGlzIG5vdCBAU3R7KnR9LAordGhlbiBAaWR7ZGF0ZX0gcmV0dXJucyB0aGUgZGF0ZSBhcyBhIHN0cmluZywKK2Zvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgcnVsZXMgYXMgdGhlIEBBTlNJe3N0cmZ0aW1lfS4KKworV2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsCitAaWR7ZGF0ZX0gcmV0dXJucyBhIHJlYXNvbmFibGUgZGF0ZSBhbmQgdGltZSByZXByZXNlbnRhdGlvbiB0aGF0IGRlcGVuZHMgb24KK3RoZSBob3N0IHN5c3RlbSBhbmQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgorKE1vcmUgc3BlY2lmaWNhbGx5LCBAVHtvcy5kYXRlKCl9IGlzIGVxdWl2YWxlbnQgdG8gQFR7b3MuZGF0ZSgiJWMiKX0uKQorCitPbiBub24tUE9TSVggc3lzdGVtcywKK3RoaXMgZnVuY3Rpb24gbWF5IGJlIG5vdCBAeHt0aHJlYWQgc2FmZX0KK2JlY2F1c2Ugb2YgaXRzIHJlbGlhbmNlIG9uIEBDSWR7Z210aW1lfSBhbmQgQENJZHtsb2NhbHRpbWV9LgorCit9CisKK0BMaWJFbnRyeXtvcy5kaWZmdGltZSAodDIsIHQxKXwKKworUmV0dXJucyB0aGUgZGlmZmVyZW5jZSwgaW4gc2Vjb25kcywKK2Zyb20gdGltZSBAaWR7dDF9IHRvIHRpbWUgQGlke3QyfQorKHdoZXJlIHRoZSB0aW1lcyBhcmUgdmFsdWVzIHJldHVybmVkIGJ5IEBMaWR7b3MudGltZX0pLgorSW4gQHh7UE9TSVh9LCBAeHtXaW5kb3dzfSwgYW5kIHNvbWUgb3RoZXIgc3lzdGVtcywKK3RoaXMgdmFsdWUgaXMgZXhhY3RseSBAaWR7dDJ9QE17LX1AaWR7dDF9LgorCit9CisKK0BMaWJFbnRyeXtvcy5leGVjdXRlIChbY29tbWFuZF0pfAorCitUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIEBBTlNJe3N5c3RlbX0uCitJdCBwYXNzZXMgQGlke2NvbW1hbmR9IHRvIGJlIGV4ZWN1dGVkIGJ5IGFuIG9wZXJhdGluZyBzeXN0ZW0gc2hlbGwuCitJdHMgZmlyc3QgcmVzdWx0IGlzIEB0cnVlCitpZiB0aGUgY29tbWFuZCB0ZXJtaW5hdGVkIHN1Y2Nlc3NmdWxseSwKK29yIEBuaWwgb3RoZXJ3aXNlLgorQWZ0ZXIgdGhpcyBmaXJzdCByZXN1bHQKK3RoZSBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIHBsdXMgYSBudW1iZXIsCithcyBmb2xsb3dzOgorQGRlc2NyaXB0aW9ueworCitAaXRlbXtAU3R7ZXhpdH18Cit0aGUgY29tbWFuZCB0ZXJtaW5hdGVkIG5vcm1hbGx5OwordGhlIGZvbGxvd2luZyBudW1iZXIgaXMgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjb21tYW5kLgorfQorCitAaXRlbXtAU3R7c2lnbmFsfXwKK3RoZSBjb21tYW5kIHdhcyB0ZXJtaW5hdGVkIGJ5IGEgc2lnbmFsOwordGhlIGZvbGxvd2luZyBudW1iZXIgaXMgdGhlIHNpZ25hbCB0aGF0IHRlcm1pbmF0ZWQgdGhlIGNvbW1hbmQuCit9CisKK30KKworV2hlbiBjYWxsZWQgd2l0aG91dCBhIEBpZHtjb21tYW5kfSwKK0BpZHtvcy5leGVjdXRlfSByZXR1cm5zIGEgYm9vbGVhbiB0aGF0IGlzIHRydWUgaWYgYSBzaGVsbCBpcyBhdmFpbGFibGUuCisKK30KKworQExpYkVudHJ5e29zLmV4aXQgKFtjb2RlIFssIGNsb3NlXV0pfAorCitDYWxscyB0aGUgQEFOU0l7ZXhpdH0gdG8gdGVybWluYXRlIHRoZSBob3N0IHByb2dyYW0uCitJZiBAaWR7Y29kZX0gaXMgQFJ3e3RydWV9LAordGhlIHJldHVybmVkIHN0YXR1cyBpcyBAaWR4e0VYSVRfU1VDQ0VTU307CitpZiBAaWR7Y29kZX0gaXMgQFJ3e2ZhbHNlfSwKK3RoZSByZXR1cm5lZCBzdGF0dXMgaXMgQGlkeHtFWElUX0ZBSUxVUkV9OworaWYgQGlke2NvZGV9IGlzIGEgbnVtYmVyLAordGhlIHJldHVybmVkIHN0YXR1cyBpcyB0aGlzIG51bWJlci4KK1RoZSBkZWZhdWx0IHZhbHVlIGZvciBAaWR7Y29kZX0gaXMgQFJ3e3RydWV9LgorCitJZiB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IEBpZHtjbG9zZX0gaXMgdHJ1ZSwKK2Nsb3NlcyB0aGUgTHVhIHN0YXRlIGJlZm9yZSBleGl0aW5nLgorCit9CisKK0BMaWJFbnRyeXtvcy5nZXRlbnYgKHZhcm5hbWUpfAorCitSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvY2VzcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBAaWR7dmFybmFtZX0sCitvciBAbmlsIGlmIHRoZSB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZC4KKworfQorCitATGliRW50cnl7b3MucmVtb3ZlIChmaWxlbmFtZSl8CisKK0RlbGV0ZXMgdGhlIGZpbGUgKG9yIGVtcHR5IGRpcmVjdG9yeSwgb24gQHh7UE9TSVh9IHN5c3RlbXMpCit3aXRoIHRoZSBnaXZlbiBuYW1lLgorSWYgdGhpcyBmdW5jdGlvbiBmYWlscywgaXQgcmV0dXJucyBAbmlsLAorcGx1cyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvciBhbmQgdGhlIGVycm9yIGNvZGUuCitPdGhlcndpc2UsIGl0IHJldHVybnMgdHJ1ZS4KKworfQorCitATGliRW50cnl7b3MucmVuYW1lIChvbGRuYW1lLCBuZXduYW1lKXwKKworUmVuYW1lcyB0aGUgZmlsZSBvciBkaXJlY3RvcnkgbmFtZWQgQGlke29sZG5hbWV9IHRvIEBpZHtuZXduYW1lfS4KK0lmIHRoaXMgZnVuY3Rpb24gZmFpbHMsIGl0IHJldHVybnMgQG5pbCwKK3BsdXMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IgYW5kIHRoZSBlcnJvciBjb2RlLgorT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRydWUuCisKK30KKworQExpYkVudHJ5e29zLnNldGxvY2FsZSAobG9jYWxlIFssIGNhdGVnb3J5XSl8CisKK1NldHMgdGhlIGN1cnJlbnQgbG9jYWxlIG9mIHRoZSBwcm9ncmFtLgorQGlke2xvY2FsZX0gaXMgYSBzeXN0ZW0tZGVwZW5kZW50IHN0cmluZyBzcGVjaWZ5aW5nIGEgbG9jYWxlOworQGlke2NhdGVnb3J5fSBpcyBhbiBvcHRpb25hbCBzdHJpbmcgZGVzY3JpYmluZyB3aGljaCBjYXRlZ29yeSB0byBjaGFuZ2U6CitAVHsiYWxsIn0sIEBUeyJjb2xsYXRlIn0sIEBUeyJjdHlwZSJ9LAorQFR7Im1vbmV0YXJ5In0sIEBUeyJudW1lcmljIn0sIG9yIEBUeyJ0aW1lIn07Cit0aGUgZGVmYXVsdCBjYXRlZ29yeSBpcyBAVHsiYWxsIn0uCitUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbmV3IGxvY2FsZSwKK29yIEBuaWwgaWYgdGhlIHJlcXVlc3QgY2Fubm90IGJlIGhvbm9yZWQuCisKK0lmIEBpZHtsb2NhbGV9IGlzIHRoZSBlbXB0eSBzdHJpbmcsCit0aGUgY3VycmVudCBsb2NhbGUgaXMgc2V0IHRvIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgbmF0aXZlIGxvY2FsZS4KK0lmIEBpZHtsb2NhbGV9IGlzIHRoZSBzdHJpbmcgQFN0e0N9LAordGhlIGN1cnJlbnQgbG9jYWxlIGlzIHNldCB0byB0aGUgc3RhbmRhcmQgQyBsb2NhbGUuCisKK1doZW4gY2FsbGVkIHdpdGggQG5pbCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsCit0aGlzIGZ1bmN0aW9uIG9ubHkgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBsb2NhbGUKK2ZvciB0aGUgZ2l2ZW4gY2F0ZWdvcnkuCisKK1RoaXMgZnVuY3Rpb24gbWF5IGJlIG5vdCBAeHt0aHJlYWQgc2FmZX0KK2JlY2F1c2Ugb2YgaXRzIHJlbGlhbmNlIG9uIEBDSWR7c2V0bG9jYWxlfS4KKworfQorCitATGliRW50cnl7b3MudGltZSAoW3RhYmxlXSl8CisKK1JldHVybnMgdGhlIGN1cnJlbnQgdGltZSB3aGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywKK29yIGEgdGltZSByZXByZXNlbnRpbmcgdGhlIGxvY2FsIGRhdGUgYW5kIHRpbWUgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiB0YWJsZS4KK1RoaXMgdGFibGUgbXVzdCBoYXZlIGZpZWxkcyBAaWR7eWVhcn0sIEBpZHttb250aH0sIGFuZCBAaWR7ZGF5fSwKK2FuZCBtYXkgaGF2ZSBmaWVsZHMKK0BpZHtob3VyfSAoZGVmYXVsdCBpcyAxMiksCitAaWR7bWlufSAoZGVmYXVsdCBpcyAwKSwKK0BpZHtzZWN9IChkZWZhdWx0IGlzIDApLAorYW5kIEBpZHtpc2RzdH0gKGRlZmF1bHQgaXMgQG5pbCkuCitPdGhlciBmaWVsZHMgYXJlIGlnbm9yZWQuCitGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBmaWVsZHMsIHNlZSB0aGUgQExpZHtvcy5kYXRlfSBmdW5jdGlvbi4KKworV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLAordGhlIHZhbHVlcyBpbiB0aGVzZSBmaWVsZHMgZG8gbm90IG5lZWQgdG8gYmUgaW5zaWRlIHRoZWlyIHZhbGlkIHJhbmdlcy4KK0ZvciBpbnN0YW5jZSwgaWYgQGlke3NlY30gaXMgLTEwLAoraXQgbWVhbnMgMTAgc2Vjb25kcyBiZWZvcmUgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5IHRoZSBvdGhlciBmaWVsZHM7CitpZiBAaWR7aG91cn0gaXMgMTAwMCwKK2l0IG1lYW5zIDEwMDAgaG91cnMgYWZ0ZXIgdGhlIHRpbWUgc3BlY2lmaWVkIGJ5IHRoZSBvdGhlciBmaWVsZHMuCisKK1RoZSByZXR1cm5lZCB2YWx1ZSBpcyBhIG51bWJlciwgd2hvc2UgbWVhbmluZyBkZXBlbmRzIG9uIHlvdXIgc3lzdGVtLgorSW4gQHh7UE9TSVh9LCBAeHtXaW5kb3dzfSwgYW5kIHNvbWUgb3RoZXIgc3lzdGVtcywKK3RoaXMgbnVtYmVyIGNvdW50cyB0aGUgbnVtYmVyCitvZiBzZWNvbmRzIHNpbmNlIHNvbWUgZ2l2ZW4gc3RhcnQgdGltZSAodGhlIEBRe2Vwb2NofSkuCitJbiBvdGhlciBzeXN0ZW1zLCB0aGUgbWVhbmluZyBpcyBub3Qgc3BlY2lmaWVkLAorYW5kIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgQGlke3RpbWV9IGNhbiBiZSB1c2VkIG9ubHkgYXMgYW4gYXJndW1lbnQgdG8KK0BMaWR7b3MuZGF0ZX0gYW5kIEBMaWR7b3MuZGlmZnRpbWV9LgorCitXaGVuIGNhbGxlZCB3aXRoIGEgdGFibGUsCitAaWR7b3MudGltZX0gYWxzbyBub3JtYWxpemVzIGFsbCB0aGUgZmllbGRzCitkb2N1bWVudGVkIGluIHRoZSBATGlke29zLmRhdGV9IGZ1bmN0aW9uLAorc28gdGhhdCB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSB0aW1lIGFzIGJlZm9yZSB0aGUgY2FsbAorYnV0IHdpdGggdmFsdWVzIGluc2lkZSB0aGVpciB2YWxpZCByYW5nZXMuCisKK30KKworQExpYkVudHJ5e29zLnRtcG5hbWUgKCl8CisKK1JldHVybnMgYSBzdHJpbmcgd2l0aCBhIGZpbGUgbmFtZSB0aGF0IGNhbgorYmUgdXNlZCBmb3IgYSB0ZW1wb3JhcnkgZmlsZS4KK1RoZSBmaWxlIG11c3QgYmUgZXhwbGljaXRseSBvcGVuZWQgYmVmb3JlIGl0cyB1c2UKK2FuZCBleHBsaWNpdGx5IHJlbW92ZWQgd2hlbiBubyBsb25nZXIgbmVlZGVkLgorCitJbiBAeHtQT1NJWH0gc3lzdGVtcywKK3RoaXMgZnVuY3Rpb24gYWxzbyBjcmVhdGVzIGEgZmlsZSB3aXRoIHRoYXQgbmFtZSwKK3RvIGF2b2lkIHNlY3VyaXR5IHJpc2tzLgorKFNvbWVvbmUgZWxzZSBtaWdodCBjcmVhdGUgdGhlIGZpbGUgd2l0aCB3cm9uZyBwZXJtaXNzaW9ucworaW4gdGhlIHRpbWUgYmV0d2VlbiBnZXR0aW5nIHRoZSBuYW1lIGFuZCBjcmVhdGluZyB0aGUgZmlsZS4pCitZb3Ugc3RpbGwgaGF2ZSB0byBvcGVuIHRoZSBmaWxlIHRvIHVzZSBpdAorYW5kIHRvIHJlbW92ZSBpdCAoZXZlbiBpZiB5b3UgZG8gbm90IHVzZSBpdCkuCisKK1doZW4gcG9zc2libGUsCit5b3UgbWF5IHByZWZlciB0byB1c2UgQExpZHtpby50bXBmaWxlfSwKK3doaWNoIGF1dG9tYXRpY2FsbHkgcmVtb3ZlcyB0aGUgZmlsZSB3aGVuIHRoZSBwcm9ncmFtIGVuZHMuCisKK30KKworfQorCitAc2VjdDJ7ZGVidWdsaWJ8IEB0aXRsZXtUaGUgRGVidWcgTGlicmFyeX0KKworVGhpcyBsaWJyYXJ5IHByb3ZpZGVzCit0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgQGxpbmt7ZGVidWdJfGRlYnVnIGludGVyZmFjZX0gdG8gTHVhIHByb2dyYW1zLgorWW91IHNob3VsZCBleGVydCBjYXJlIHdoZW4gdXNpbmcgdGhpcyBsaWJyYXJ5LgorU2V2ZXJhbCBvZiBpdHMgZnVuY3Rpb25zCit2aW9sYXRlIGJhc2ljIGFzc3VtcHRpb25zIGFib3V0IEx1YSBjb2RlCisoZS5nLiwgdGhhdCB2YXJpYWJsZXMgbG9jYWwgdG8gYSBmdW5jdGlvbgorY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gb3V0c2lkZTsKK3RoYXQgdXNlcmRhdGEgbWV0YXRhYmxlcyBjYW5ub3QgYmUgY2hhbmdlZCBieSBMdWEgY29kZTsKK3RoYXQgTHVhIHByb2dyYW1zIGRvIG5vdCBjcmFzaCkKK2FuZCB0aGVyZWZvcmUgY2FuIGNvbXByb21pc2Ugb3RoZXJ3aXNlIHNlY3VyZSBjb2RlLgorTW9yZW92ZXIsIHNvbWUgZnVuY3Rpb25zIGluIHRoaXMgbGlicmFyeSBtYXkgYmUgc2xvdy4KKworQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGxpYnJhcnkgYXJlIHByb3ZpZGVkCitpbnNpZGUgdGhlIEBkZWZpZHtkZWJ1Z30gdGFibGUuCitBbGwgZnVuY3Rpb25zIHRoYXQgb3BlcmF0ZSBvdmVyIGEgdGhyZWFkCitoYXZlIGFuIG9wdGlvbmFsIGZpcnN0IGFyZ3VtZW50IHdoaWNoIGlzIHRoZQordGhyZWFkIHRvIG9wZXJhdGUgb3Zlci4KK1RoZSBkZWZhdWx0IGlzIGFsd2F5cyB0aGUgY3VycmVudCB0aHJlYWQuCisKKworQExpYkVudHJ5e2RlYnVnLmRlYnVnICgpfAorCitFbnRlcnMgYW4gaW50ZXJhY3RpdmUgbW9kZSB3aXRoIHRoZSB1c2VyLAorcnVubmluZyBlYWNoIHN0cmluZyB0aGF0IHRoZSB1c2VyIGVudGVycy4KK1VzaW5nIHNpbXBsZSBjb21tYW5kcyBhbmQgb3RoZXIgZGVidWcgZmFjaWxpdGllcywKK3RoZSB1c2VyIGNhbiBpbnNwZWN0IGdsb2JhbCBhbmQgbG9jYWwgdmFyaWFibGVzLAorY2hhbmdlIHRoZWlyIHZhbHVlcywgZXZhbHVhdGUgZXhwcmVzc2lvbnMsIGFuZCBzbyBvbi4KK0EgbGluZSBjb250YWluaW5nIG9ubHkgdGhlIHdvcmQgQGlke2NvbnR9IGZpbmlzaGVzIHRoaXMgZnVuY3Rpb24sCitzbyB0aGF0IHRoZSBjYWxsZXIgY29udGludWVzIGl0cyBleGVjdXRpb24uCisKK05vdGUgdGhhdCBjb21tYW5kcyBmb3IgQGlke2RlYnVnLmRlYnVnfSBhcmUgbm90IGxleGljYWxseSBuZXN0ZWQKK3dpdGhpbiBhbnkgZnVuY3Rpb24gYW5kIHNvIGhhdmUgbm8gZGlyZWN0IGFjY2VzcyB0byBsb2NhbCB2YXJpYWJsZXMuCisKK30KKworQExpYkVudHJ5e2RlYnVnLmdldGhvb2sgKFt0aHJlYWRdKXwKKworUmV0dXJucyB0aGUgY3VycmVudCBob29rIHNldHRpbmdzIG9mIHRoZSB0aHJlYWQsIGFzIHRocmVlIHZhbHVlczoKK3RoZSBjdXJyZW50IGhvb2sgZnVuY3Rpb24sIHRoZSBjdXJyZW50IGhvb2sgbWFzaywKK2FuZCB0aGUgY3VycmVudCBob29rIGNvdW50CisoYXMgc2V0IGJ5IHRoZSBATGlke2RlYnVnLnNldGhvb2t9IGZ1bmN0aW9uKS4KKworfQorCitATGliRW50cnl7ZGVidWcuZ2V0aW5mbyAoW3RocmVhZCxdIGYgWywgd2hhdF0pfAorCitSZXR1cm5zIGEgdGFibGUgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uLgorWW91IGNhbiBnaXZlIHRoZSBmdW5jdGlvbiBkaXJlY3RseQorb3IgeW91IGNhbiBnaXZlIGEgbnVtYmVyIGFzIHRoZSB2YWx1ZSBvZiBAaWR7Zn0sCit3aGljaCBtZWFucyB0aGUgZnVuY3Rpb24gcnVubmluZyBhdCBsZXZlbCBAaWR7Zn0gb2YgdGhlIGNhbGwgc3RhY2sKK29mIHRoZSBnaXZlbiB0aHJlYWQ6CitATntsZXZlbCAwfSBpcyB0aGUgY3VycmVudCBmdW5jdGlvbiAoQGlke2dldGluZm99IGl0c2VsZik7CitATntsZXZlbCAxfSBpcyB0aGUgZnVuY3Rpb24gdGhhdCBjYWxsZWQgQGlke2dldGluZm99CisoZXhjZXB0IGZvciB0YWlsIGNhbGxzLCB3aGljaCBkbyBub3QgY291bnQgb24gdGhlIHN0YWNrKTsKK2FuZCBzbyBvbi4KK0lmIEBpZHtmfSBpcyBhIG51bWJlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBmdW5jdGlvbnMsCit0aGVuIEBpZHtnZXRpbmZvfSByZXR1cm5zIEBuaWwuCisKK1RoZSByZXR1cm5lZCB0YWJsZSBjYW4gY29udGFpbiBhbGwgdGhlIGZpZWxkcyByZXR1cm5lZCBieSBATGlke2x1YV9nZXRpbmZvfSwKK3dpdGggdGhlIHN0cmluZyBAaWR7d2hhdH0gZGVzY3JpYmluZyB3aGljaCBmaWVsZHMgdG8gZmlsbCBpbi4KK1RoZSBkZWZhdWx0IGZvciBAaWR7d2hhdH0gaXMgdG8gZ2V0IGFsbCBpbmZvcm1hdGlvbiBhdmFpbGFibGUsCitleGNlcHQgdGhlIHRhYmxlIG9mIHZhbGlkIGxpbmVzLgorSWYgcHJlc2VudCwKK3RoZSBvcHRpb24gQENoYXJ7Zn0KK2FkZHMgYSBmaWVsZCBuYW1lZCBAaWR7ZnVuY30gd2l0aCB0aGUgZnVuY3Rpb24gaXRzZWxmLgorSWYgcHJlc2VudCwKK3RoZSBvcHRpb24gQENoYXJ7TH0KK2FkZHMgYSBmaWVsZCBuYW1lZCBAaWR7YWN0aXZlbGluZXN9IHdpdGggdGhlIHRhYmxlIG9mCit2YWxpZCBsaW5lcy4KKworRm9yIGluc3RhbmNlLCB0aGUgZXhwcmVzc2lvbiBAVHtkZWJ1Zy5nZXRpbmZvKDEsIm4iKS5uYW1lfSByZXR1cm5zCithIG5hbWUgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLAoraWYgYSByZWFzb25hYmxlIG5hbWUgY2FuIGJlIGZvdW5kLAorYW5kIHRoZSBleHByZXNzaW9uIEBUe2RlYnVnLmdldGluZm8ocHJpbnQpfQorcmV0dXJucyBhIHRhYmxlIHdpdGggYWxsIGF2YWlsYWJsZSBpbmZvcm1hdGlvbgorYWJvdXQgdGhlIEBMaWR7cHJpbnR9IGZ1bmN0aW9uLgorCit9CisKK0BMaWJFbnRyeXtkZWJ1Zy5nZXRsb2NhbCAoW3RocmVhZCxdIGYsIGxvY2FsKXwKKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuYW1lIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlCit3aXRoIGluZGV4IEBpZHtsb2NhbH0gb2YgdGhlIGZ1bmN0aW9uIGF0IGxldmVsIEBpZHtmfSBvZiB0aGUgc3RhY2suCitUaGlzIGZ1bmN0aW9uIGFjY2Vzc2VzIG5vdCBvbmx5IGV4cGxpY2l0IGxvY2FsIHZhcmlhYmxlcywKK2J1dCBhbHNvIHBhcmFtZXRlcnMsIHRlbXBvcmFyaWVzLCBldGMuCisKK1RoZSBmaXJzdCBwYXJhbWV0ZXIgb3IgbG9jYWwgdmFyaWFibGUgaGFzIEBOe2luZGV4IDF9LCBhbmQgc28gb24sCitmb2xsb3dpbmcgdGhlIG9yZGVyIHRoYXQgdGhleSBhcmUgZGVjbGFyZWQgaW4gdGhlIGNvZGUsCitjb3VudGluZyBvbmx5IHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgYWN0aXZlCitpbiB0aGUgY3VycmVudCBzY29wZSBvZiB0aGUgZnVuY3Rpb24uCitOZWdhdGl2ZSBpbmRpY2VzIHJlZmVyIHRvIHZhcmFyZyBwYXJhbWV0ZXJzOworQG51bXstMX0gaXMgdGhlIGZpcnN0IHZhcmFyZyBwYXJhbWV0ZXIuCitUaGUgZnVuY3Rpb24gcmV0dXJucyBAbmlsIGlmIHRoZXJlIGlzIG5vIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIGluZGV4LAorYW5kIHJhaXNlcyBhbiBlcnJvciB3aGVuIGNhbGxlZCB3aXRoIGEgbGV2ZWwgb3V0IG9mIHJhbmdlLgorKFlvdSBjYW4gY2FsbCBATGlke2RlYnVnLmdldGluZm99IHRvIGNoZWNrIHdoZXRoZXIgdGhlIGxldmVsIGlzIHZhbGlkLikKKworVmFyaWFibGUgbmFtZXMgc3RhcnRpbmcgd2l0aCBAQ2hhcnsofSAob3BlbiBwYXJlbnRoZXNpcykgQEN7KX0KK3JlcHJlc2VudCB2YXJpYWJsZXMgd2l0aCBubyBrbm93biBuYW1lcworKGludGVybmFsIHZhcmlhYmxlcyBzdWNoIGFzIGxvb3AgY29udHJvbCB2YXJpYWJsZXMsCithbmQgdmFyaWFibGVzIGZyb20gY2h1bmtzIHNhdmVkIHdpdGhvdXQgZGVidWcgaW5mb3JtYXRpb24pLgorCitUaGUgcGFyYW1ldGVyIEBpZHtmfSBtYXkgYWxzbyBiZSBhIGZ1bmN0aW9uLgorSW4gdGhhdCBjYXNlLCBAaWR7Z2V0bG9jYWx9IHJldHVybnMgb25seSB0aGUgbmFtZSBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzLgorCit9CisKK0BMaWJFbnRyeXtkZWJ1Zy5nZXRtZXRhdGFibGUgKHZhbHVlKXwKKworUmV0dXJucyB0aGUgbWV0YXRhYmxlIG9mIHRoZSBnaXZlbiBAaWR7dmFsdWV9CitvciBAbmlsIGlmIGl0IGRvZXMgbm90IGhhdmUgYSBtZXRhdGFibGUuCisKK30KKworQExpYkVudHJ5e2RlYnVnLmdldHJlZ2lzdHJ5ICgpfAorCitSZXR1cm5zIHRoZSByZWdpc3RyeSB0YWJsZSBAc2Vle3JlZ2lzdHJ5fS4KKworfQorCitATGliRW50cnl7ZGVidWcuZ2V0dXB2YWx1ZSAoZiwgdXApfAorCitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5hbWUgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgdXB2YWx1ZQord2l0aCBpbmRleCBAaWR7dXB9IG9mIHRoZSBmdW5jdGlvbiBAaWR7Zn0uCitUaGUgZnVuY3Rpb24gcmV0dXJucyBAbmlsIGlmIHRoZXJlIGlzIG5vIHVwdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gaW5kZXguCisKK1ZhcmlhYmxlIG5hbWVzIHN0YXJ0aW5nIHdpdGggQENoYXJ7KH0gKG9wZW4gcGFyZW50aGVzaXMpIEBDeyl9CityZXByZXNlbnQgdmFyaWFibGVzIHdpdGggbm8ga25vd24gbmFtZXMKKyh2YXJpYWJsZXMgZnJvbSBjaHVua3Mgc2F2ZWQgd2l0aG91dCBkZWJ1ZyBpbmZvcm1hdGlvbikuCisKK30KKworQExpYkVudHJ5e2RlYnVnLmdldHVzZXJ2YWx1ZSAodSwgbil8CisKK1JldHVybnMgdGhlIEBpZHtufS10aCB1c2VyIHZhbHVlIGFzc29jaWF0ZWQKK3RvIHRoZSB1c2VyZGF0YSBAaWR7dX0gcGx1cyBhIGJvb2xlYW4sCitAZmFsc2UgaWYgdGhlIHVzZXJkYXRhIGRvZXMgbm90IGhhdmUgdGhhdCB2YWx1ZS4KKworfQorCitATGliRW50cnl7ZGVidWcuc2V0aG9vayAoW3RocmVhZCxdIGhvb2ssIG1hc2sgWywgY291bnRdKXwKKworU2V0cyB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXMgYSBob29rLgorVGhlIHN0cmluZyBAaWR7bWFza30gYW5kIHRoZSBudW1iZXIgQGlke2NvdW50fSBkZXNjcmliZQord2hlbiB0aGUgaG9vayB3aWxsIGJlIGNhbGxlZC4KK1RoZSBzdHJpbmcgbWFzayBtYXkgaGF2ZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzLAord2l0aCB0aGUgZ2l2ZW4gbWVhbmluZzoKK0BkZXNjcmlwdGlvbnsKK0BpdGVte0BDaGFye2N9fCB0aGUgaG9vayBpcyBjYWxsZWQgZXZlcnkgdGltZSBMdWEgY2FsbHMgYSBmdW5jdGlvbjt9CitAaXRlbXtAQ2hhcntyfXwgdGhlIGhvb2sgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgTHVhIHJldHVybnMgZnJvbSBhIGZ1bmN0aW9uO30KK0BpdGVte0BDaGFye2x9fCB0aGUgaG9vayBpcyBjYWxsZWQgZXZlcnkgdGltZSBMdWEgZW50ZXJzIGEgbmV3IGxpbmUgb2YgY29kZS59Cit9CitNb3Jlb3ZlciwKK3dpdGggYSBAaWR7Y291bnR9IGRpZmZlcmVudCBmcm9tIHplcm8sCit0aGUgaG9vayBpcyBjYWxsZWQgYWxzbyBhZnRlciBldmVyeSBAaWR7Y291bnR9IGluc3RydWN0aW9ucy4KKworV2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsCitATGlke2RlYnVnLnNldGhvb2t9IHR1cm5zIG9mZiB0aGUgaG9vay4KKworV2hlbiB0aGUgaG9vayBpcyBjYWxsZWQsIGl0cyBmaXJzdCBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcKK2Rlc2NyaWJpbmcgdGhlIGV2ZW50IHRoYXQgaGFzIHRyaWdnZXJlZCBpdHMgY2FsbDoKK0BUeyJjYWxsIn0gKG9yIEBUeyJ0YWlsIGNhbGwifSksCitAVHsicmV0dXJuIn0sCitAVHsibGluZSJ9LCBhbmQgQFR7ImNvdW50In0uCitGb3IgbGluZSBldmVudHMsCit0aGUgaG9vayBhbHNvIGdldHMgdGhlIG5ldyBsaW5lIG51bWJlciBhcyBpdHMgc2Vjb25kIHBhcmFtZXRlci4KK0luc2lkZSBhIGhvb2ssCit5b3UgY2FuIGNhbGwgQGlke2dldGluZm99IHdpdGggQE57bGV2ZWwgMn0gdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK3RoZSBydW5uaW5nIGZ1bmN0aW9uCisoQE57bGV2ZWwgMH0gaXMgdGhlIEBpZHtnZXRpbmZvfSBmdW5jdGlvbiwKK2FuZCBATntsZXZlbCAxfSBpcyB0aGUgaG9vayBmdW5jdGlvbikuCisKK30KKworQExpYkVudHJ5e2RlYnVnLnNldGxvY2FsIChbdGhyZWFkLF0gbGV2ZWwsIGxvY2FsLCB2YWx1ZSl8CisKK1RoaXMgZnVuY3Rpb24gYXNzaWducyB0aGUgdmFsdWUgQGlke3ZhbHVlfSB0byB0aGUgbG9jYWwgdmFyaWFibGUKK3dpdGggaW5kZXggQGlke2xvY2FsfSBvZiB0aGUgZnVuY3Rpb24gYXQgbGV2ZWwgQGlke2xldmVsfSBvZiB0aGUgc3RhY2suCitUaGUgZnVuY3Rpb24gcmV0dXJucyBAbmlsIGlmIHRoZXJlIGlzIG5vIGxvY2FsCit2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBpbmRleCwKK2FuZCByYWlzZXMgYW4gZXJyb3Igd2hlbiBjYWxsZWQgd2l0aCBhIEBpZHtsZXZlbH0gb3V0IG9mIHJhbmdlLgorKFlvdSBjYW4gY2FsbCBAaWR7Z2V0aW5mb30gdG8gY2hlY2sgd2hldGhlciB0aGUgbGV2ZWwgaXMgdmFsaWQuKQorT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZS4KKworU2VlIEBMaWR7ZGVidWcuZ2V0bG9jYWx9IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Cit2YXJpYWJsZSBpbmRpY2VzIGFuZCBuYW1lcy4KKworfQorCitATGliRW50cnl7ZGVidWcuc2V0bWV0YXRhYmxlICh2YWx1ZSwgdGFibGUpfAorCitTZXRzIHRoZSBtZXRhdGFibGUgZm9yIHRoZSBnaXZlbiBAaWR7dmFsdWV9IHRvIHRoZSBnaXZlbiBAaWR7dGFibGV9Cisod2hpY2ggY2FuIGJlIEBuaWwpLgorUmV0dXJucyBAaWR7dmFsdWV9LgorCit9CisKK0BMaWJFbnRyeXtkZWJ1Zy5zZXR1cHZhbHVlIChmLCB1cCwgdmFsdWUpfAorCitUaGlzIGZ1bmN0aW9uIGFzc2lnbnMgdGhlIHZhbHVlIEBpZHt2YWx1ZX0gdG8gdGhlIHVwdmFsdWUKK3dpdGggaW5kZXggQGlke3VwfSBvZiB0aGUgZnVuY3Rpb24gQGlke2Z9LgorVGhlIGZ1bmN0aW9uIHJldHVybnMgQG5pbCBpZiB0aGVyZSBpcyBubyB1cHZhbHVlCit3aXRoIHRoZSBnaXZlbiBpbmRleC4KK090aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdXB2YWx1ZS4KKworfQorCitATGliRW50cnl7ZGVidWcuc2V0dXNlcnZhbHVlICh1ZGF0YSwgdmFsdWUsIG4pfAorCitTZXRzIHRoZSBnaXZlbiBAaWR7dmFsdWV9IGFzCit0aGUgQGlke259LXRoIHVzZXIgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gQGlke3VkYXRhfS4KK0BpZHt1ZGF0YX0gbXVzdCBiZSBhIGZ1bGwgdXNlcmRhdGEuCisKK1JldHVybnMgQGlke3VkYXRhfSwKK29yIEBuaWwgaWYgdGhlIHVzZXJkYXRhIGRvZXMgbm90IGhhdmUgdGhhdCB2YWx1ZS4KKworfQorCitATGliRW50cnl7ZGVidWcudHJhY2ViYWNrIChbdGhyZWFkLF0gW21lc3NhZ2UgWywgbGV2ZWxdXSl8CisKK0lmIEBpZHttZXNzYWdlfSBpcyBwcmVzZW50IGJ1dCBpcyBuZWl0aGVyIGEgc3RyaW5nIG5vciBAbmlsLAordGhpcyBmdW5jdGlvbiByZXR1cm5zIEBpZHttZXNzYWdlfSB3aXRob3V0IGZ1cnRoZXIgcHJvY2Vzc2luZy4KK090aGVyd2lzZSwKK2l0IHJldHVybnMgYSBzdHJpbmcgd2l0aCBhIHRyYWNlYmFjayBvZiB0aGUgY2FsbCBzdGFjay4KK1RoZSBvcHRpb25hbCBAaWR7bWVzc2FnZX0gc3RyaW5nIGlzIGFwcGVuZGVkCithdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0cmFjZWJhY2suCitBbiBvcHRpb25hbCBAaWR7bGV2ZWx9IG51bWJlciB0ZWxscyBhdCB3aGljaCBsZXZlbAordG8gc3RhcnQgdGhlIHRyYWNlYmFjaworKGRlZmF1bHQgaXMgMSwgdGhlIGZ1bmN0aW9uIGNhbGxpbmcgQGlke3RyYWNlYmFja30pLgorCit9CisKK0BMaWJFbnRyeXtkZWJ1Zy51cHZhbHVlaWQgKGYsIG4pfAorCitSZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIgKGFzIGEgbGlnaHQgdXNlcmRhdGEpCitmb3IgdGhlIHVwdmFsdWUgbnVtYmVyZWQgQGlke259Citmcm9tIHRoZSBnaXZlbiBmdW5jdGlvbi4KKworVGhlc2UgdW5pcXVlIGlkZW50aWZpZXJzIGFsbG93IGEgcHJvZ3JhbSB0byBjaGVjayB3aGV0aGVyIGRpZmZlcmVudAorY2xvc3VyZXMgc2hhcmUgdXB2YWx1ZXMuCitMdWEgY2xvc3VyZXMgdGhhdCBzaGFyZSBhbiB1cHZhbHVlCisodGhhdCBpcywgdGhhdCBhY2Nlc3MgYSBzYW1lIGV4dGVybmFsIGxvY2FsIHZhcmlhYmxlKQord2lsbCByZXR1cm4gaWRlbnRpY2FsIGlkcyBmb3IgdGhvc2UgdXB2YWx1ZSBpbmRpY2VzLgorCit9CisKK0BMaWJFbnRyeXtkZWJ1Zy51cHZhbHVlam9pbiAoZjEsIG4xLCBmMiwgbjIpfAorCitNYWtlIHRoZSBAaWR7bjF9LXRoIHVwdmFsdWUgb2YgdGhlIEx1YSBjbG9zdXJlIEBpZHtmMX0KK3JlZmVyIHRvIHRoZSBAaWR7bjJ9LXRoIHVwdmFsdWUgb2YgdGhlIEx1YSBjbG9zdXJlIEBpZHtmMn0uCisKK30KKworfQorCit9CisKKworQEN7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLX0KK0BzZWN0MXtsdWEtc2F8IEB0aXRsZXtMdWEgU3RhbmRhbG9uZX0KKworQWx0aG91Z2ggTHVhIGhhcyBiZWVuIGRlc2lnbmVkIGFzIGFuIGV4dGVuc2lvbiBsYW5ndWFnZSwKK3RvIGJlIGVtYmVkZGVkIGluIGEgaG9zdCBATntDIHByb2dyYW19LAoraXQgaXMgYWxzbyBmcmVxdWVudGx5IHVzZWQgYXMgYSBzdGFuZGFsb25lIGxhbmd1YWdlLgorQW4gaW50ZXJwcmV0ZXIgZm9yIEx1YSBhcyBhIHN0YW5kYWxvbmUgbGFuZ3VhZ2UsCitjYWxsZWQgc2ltcGx5IEBpZHtsdWF9LAoraXMgcHJvdmlkZWQgd2l0aCB0aGUgc3RhbmRhcmQgZGlzdHJpYnV0aW9uLgorVGhlIEB4e3N0YW5kYWxvbmUgaW50ZXJwcmV0ZXJ9IGluY2x1ZGVzCithbGwgc3RhbmRhcmQgbGlicmFyaWVzLCBpbmNsdWRpbmcgdGhlIGRlYnVnIGxpYnJhcnkuCitJdHMgdXNhZ2UgaXM6CitAdmVyYmF0aW17CitsdWEgW29wdGlvbnNdIFtzY3JpcHQgW2FyZ3NdXQorfQorVGhlIG9wdGlvbnMgYXJlOgorQGRlc2NyaXB0aW9ueworQGl0ZW17QFR7LWUgQHJlcHtzdGF0fX18IGV4ZWN1dGVzIHN0cmluZyBAcmVwe3N0YXR9O30KK0BpdGVte0BUey1sIEByZXB7bW9kfX18IEBRe3JlcXVpcmVzfSBAcmVwe21vZH0gYW5kIGFzc2lnbnMgdGhlCisgIHJlc3VsdCB0byBnbG9iYWwgQHJlcHttb2R9O30KK0BpdGVte0BUey1pfXwgZW50ZXJzIGludGVyYWN0aXZlIG1vZGUgYWZ0ZXIgcnVubmluZyBAcmVwe3NjcmlwdH07fQorQGl0ZW17QFR7LXZ9fCBwcmludHMgdmVyc2lvbiBpbmZvcm1hdGlvbjt9CitAaXRlbXtAVHstRX18IGlnbm9yZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzO30KK0BpdGVte0BUey0tfXwgc3RvcHMgaGFuZGxpbmcgb3B0aW9uczt9CitAaXRlbXtAVHstfXwgZXhlY3V0ZXMgQGlke3N0ZGlufSBhcyBhIGZpbGUgYW5kIHN0b3BzIGhhbmRsaW5nIG9wdGlvbnMufQorfQorQWZ0ZXIgaGFuZGxpbmcgaXRzIG9wdGlvbnMsIEBpZHtsdWF9IHJ1bnMgdGhlIGdpdmVuIEBlbXBoe3NjcmlwdH0uCitXaGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywKK0BpZHtsdWF9IGJlaGF2ZXMgYXMgQFR7bHVhIC12IC1pfQord2hlbiB0aGUgc3RhbmRhcmQgaW5wdXQgKEBpZHtzdGRpbn0pIGlzIGEgdGVybWluYWwsCithbmQgYXMgQFR7bHVhIC19IG90aGVyd2lzZS4KKworV2hlbiBjYWxsZWQgd2l0aG91dCBvcHRpb24gQFR7LUV9LAordGhlIGludGVycHJldGVyIGNoZWNrcyBmb3IgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgQGRlZmlke0xVQV9JTklUXzVfNH0KKyhvciBAZGVmaWR7TFVBX0lOSVR9IGlmIHRoZSB2ZXJzaW9uZWQgbmFtZSBpcyBub3QgZGVmaW5lZCkKK2JlZm9yZSBydW5uaW5nIGFueSBhcmd1bWVudC4KK0lmIHRoZSB2YXJpYWJsZSBjb250ZW50IGhhcyB0aGUgZm9ybWF0IEBUe0BBdEByZXB7ZmlsZW5hbWV9fSwKK3RoZW4gQGlke2x1YX0gZXhlY3V0ZXMgdGhlIGZpbGUuCitPdGhlcndpc2UsIEBpZHtsdWF9IGV4ZWN1dGVzIHRoZSBzdHJpbmcgaXRzZWxmLgorCitXaGVuIGNhbGxlZCB3aXRoIG9wdGlvbiBAVHstRX0sCitiZXNpZGVzIGlnbm9yaW5nIEBpZHtMVUFfSU5JVH0sCitMdWEgYWxzbyBpZ25vcmVzCit0aGUgdmFsdWVzIG9mIEBpZHtMVUFfUEFUSH0gYW5kIEBpZHtMVUFfQ1BBVEh9LAorc2V0dGluZyB0aGUgdmFsdWVzIG9mCitATGlke3BhY2thZ2UucGF0aH0gYW5kIEBMaWR7cGFja2FnZS5jcGF0aH0KK3dpdGggdGhlIGRlZmF1bHQgcGF0aHMgZGVmaW5lZCBpbiBAaWR7bHVhY29uZi5ofS4KKworQWxsIG9wdGlvbnMgYXJlIGhhbmRsZWQgaW4gb3JkZXIsIGV4Y2VwdCBAVHstaX0gYW5kIEBUey1FfS4KK0ZvciBpbnN0YW5jZSwgYW4gaW52b2NhdGlvbiBsaWtlCitAdmVyYmF0aW17CiskIGx1YSAtZSdhPTEnIC1lICdwcmludChhKScgc2NyaXB0Lmx1YQorfQord2lsbCBmaXJzdCBzZXQgQGlke2F9IHRvIDEsIHRoZW4gcHJpbnQgdGhlIHZhbHVlIG9mIEBpZHthfSwKK2FuZCBmaW5hbGx5IHJ1biB0aGUgZmlsZSBAaWR7c2NyaXB0Lmx1YX0gd2l0aCBubyBhcmd1bWVudHMuCisoSGVyZSBAVHskfSBpcyB0aGUgc2hlbGwgcHJvbXB0LiBZb3VyIHByb21wdCBtYXkgYmUgZGlmZmVyZW50LikKKworQmVmb3JlIHJ1bm5pbmcgYW55IGNvZGUsCitAaWR7bHVhfSBjb2xsZWN0cyBhbGwgY29tbWFuZC1saW5lIGFyZ3VtZW50cworaW4gYSBnbG9iYWwgdGFibGUgY2FsbGVkIEBpZHthcmd9LgorVGhlIHNjcmlwdCBuYW1lIGdvZXMgdG8gaW5kZXggMCwKK3RoZSBmaXJzdCBhcmd1bWVudCBhZnRlciB0aGUgc2NyaXB0IG5hbWUgZ29lcyB0byBpbmRleCAxLAorYW5kIHNvIG9uLgorQW55IGFyZ3VtZW50cyBiZWZvcmUgdGhlIHNjcmlwdCBuYW1lCisodGhhdCBpcywgdGhlIGludGVycHJldGVyIG5hbWUgcGx1cyBpdHMgb3B0aW9ucykKK2dvIHRvIG5lZ2F0aXZlIGluZGljZXMuCitGb3IgaW5zdGFuY2UsIGluIHRoZSBjYWxsCitAdmVyYmF0aW17CiskIGx1YSAtbGEgYi5sdWEgdDEgdDIKK30KK3RoZSB0YWJsZSBpcyBsaWtlIHRoaXM6CitAdmVyYmF0aW17CithcmcgPSB7IFstMl0gPSAibHVhIiwgWy0xXSA9ICItbGEiLAorICAgICAgICBbMF0gPSAiYi5sdWEiLAorICAgICAgICBbMV0gPSAidDEiLCBbMl0gPSAidDIiIH0KK30KK0lmIHRoZXJlIGlzIG5vIHNjcmlwdCBpbiB0aGUgY2FsbCwKK3RoZSBpbnRlcnByZXRlciBuYW1lIGdvZXMgdG8gaW5kZXggMCwKK2ZvbGxvd2VkIGJ5IHRoZSBvdGhlciBhcmd1bWVudHMuCitGb3IgaW5zdGFuY2UsIHRoZSBjYWxsCitAdmVyYmF0aW17CiskIGx1YSAtZSAicHJpbnQoYXJnWzFdKSIKK30KK3dpbGwgcHJpbnQgQFN0ey1lfS4KK0lmIHRoZXJlIGlzIGEgc2NyaXB0LAordGhlIHNjcmlwdCBpcyBjYWxsZWQgd2l0aCBwYXJhbWV0ZXJzCitAVHthcmdbMV19LCBAQ2RvdHMsIEBUe2FyZ1sjYXJnXX0uCisoTGlrZSBhbGwgY2h1bmtzIGluIEx1YSwKK3RoZSBzY3JpcHQgaXMgY29tcGlsZWQgYXMgYSB2YXJhcmcgZnVuY3Rpb24uKQorCitJbiBpbnRlcmFjdGl2ZSBtb2RlLAorTHVhIHJlcGVhdGVkbHkgcHJvbXB0cyBhbmQgd2FpdHMgZm9yIGEgbGluZS4KK0FmdGVyIHJlYWRpbmcgYSBsaW5lLAorTHVhIGZpcnN0IHRyeSB0byBpbnRlcnByZXQgdGhlIGxpbmUgYXMgYW4gZXhwcmVzc2lvbi4KK0lmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgaXRzIHZhbHVlLgorT3RoZXJ3aXNlLCBpdCBpbnRlcnByZXRzIHRoZSBsaW5lIGFzIGEgc3RhdGVtZW50LgorSWYgeW91IHdyaXRlIGFuIGluY29tcGxldGUgc3RhdGVtZW50LAordGhlIGludGVycHJldGVyIHdhaXRzIGZvciBpdHMgY29tcGxldGlvbgorYnkgaXNzdWluZyBhIGRpZmZlcmVudCBwcm9tcHQuCisKK0lmIHRoZSBnbG9iYWwgdmFyaWFibGUgQGRlZmlke19QUk9NUFR9IGNvbnRhaW5zIGEgc3RyaW5nLAordGhlbiBpdHMgdmFsdWUgaXMgdXNlZCBhcyB0aGUgcHJvbXB0LgorU2ltaWxhcmx5LCBpZiB0aGUgZ2xvYmFsIHZhcmlhYmxlIEBkZWZpZHtfUFJPTVBUMn0gY29udGFpbnMgYSBzdHJpbmcsCitpdHMgdmFsdWUgaXMgdXNlZCBhcyB0aGUgc2Vjb25kYXJ5IHByb21wdAorKGlzc3VlZCBkdXJpbmcgaW5jb21wbGV0ZSBzdGF0ZW1lbnRzKS4KKworSW4gY2FzZSBvZiB1bnByb3RlY3RlZCBlcnJvcnMgaW4gdGhlIHNjcmlwdCwKK3RoZSBpbnRlcnByZXRlciByZXBvcnRzIHRoZSBlcnJvciB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtLgorSWYgdGhlIGVycm9yIG9iamVjdCBpcyBub3QgYSBzdHJpbmcgYnV0CitoYXMgYSBtZXRhbWV0aG9kIEBpZHh7X190b3N0cmluZ30sCit0aGUgaW50ZXJwcmV0ZXIgY2FsbHMgdGhpcyBtZXRhbWV0aG9kIHRvIHByb2R1Y2UgdGhlIGZpbmFsIG1lc3NhZ2UuCitPdGhlcndpc2UsIHRoZSBpbnRlcnByZXRlciBjb252ZXJ0cyB0aGUgZXJyb3Igb2JqZWN0IHRvIGEgc3RyaW5nCithbmQgYWRkcyBhIHN0YWNrIHRyYWNlYmFjayB0byBpdC4KKworV2hlbiBmaW5pc2hpbmcgbm9ybWFsbHksCit0aGUgaW50ZXJwcmV0ZXIgY2xvc2VzIGl0cyBtYWluIEx1YSBzdGF0ZQorQHNlZUZ7bHVhX2Nsb3NlfS4KK1RoZSBzY3JpcHQgY2FuIGF2b2lkIHRoaXMgc3RlcCBieQorY2FsbGluZyBATGlke29zLmV4aXR9IHRvIHRlcm1pbmF0ZS4KKworVG8gYWxsb3cgdGhlIHVzZSBvZiBMdWEgYXMgYQorc2NyaXB0IGludGVycHJldGVyIGluIFVuaXggc3lzdGVtcywKK3RoZSBzdGFuZGFsb25lIGludGVycHJldGVyIHNraXBzCit0aGUgZmlyc3QgbGluZSBvZiBhIGNodW5rIGlmIGl0IHN0YXJ0cyB3aXRoIEBUeyN9LgorVGhlcmVmb3JlLCBMdWEgc2NyaXB0cyBjYW4gYmUgbWFkZSBpbnRvIGV4ZWN1dGFibGUgcHJvZ3JhbXMKK2J5IHVzaW5nIEBUe2NobW9kICt4fSBhbmQgQE57dGhlIEBUeyMhfX0gZm9ybSwKK2FzIGluCitAdmVyYmF0aW17CisjIS91c3IvbG9jYWwvYmluL2x1YQorfQorKE9mIGNvdXJzZSwKK3RoZSBsb2NhdGlvbiBvZiB0aGUgTHVhIGludGVycHJldGVyIG1heSBiZSBkaWZmZXJlbnQgaW4geW91ciBtYWNoaW5lLgorSWYgQGlke2x1YX0gaXMgaW4geW91ciBAaWR7UEFUSH0sCit0aGVuCitAdmVyYmF0aW17CisjIS91c3IvYmluL2VudiBsdWEKK30KK2lzIGEgbW9yZSBwb3J0YWJsZSBzb2x1dGlvbi4pCisKK30KKworCitAc2VjdDF7aW5jb21wYXR8IEB0aXRsZXtJbmNvbXBhdGliaWxpdGllcyB3aXRoIHRoZSBQcmV2aW91cyBWZXJzaW9ufQorCitIZXJlIHdlIGxpc3QgdGhlIGluY29tcGF0aWJpbGl0aWVzIHRoYXQgeW91IG1heSBmaW5kIHdoZW4gbW92aW5nIGEgcHJvZ3JhbQorZnJvbSBATntMdWEgNS4zfSB0byBATntMdWEgNS40fS4KK1lvdSBjYW4gYXZvaWQgc29tZSBpbmNvbXBhdGliaWxpdGllcyBieSBjb21waWxpbmcgTHVhIHdpdGgKK2FwcHJvcHJpYXRlIG9wdGlvbnMgKHNlZSBmaWxlIEBpZHtsdWFjb25mLmh9KS4KK0hvd2V2ZXIsCithbGwgdGhlc2UgY29tcGF0aWJpbGl0eSBvcHRpb25zIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorCitMdWEgdmVyc2lvbnMgY2FuIGFsd2F5cyBjaGFuZ2UgdGhlIEMgQVBJIGluIHdheXMgdGhhdAorZG8gbm90IGltcGx5IHNvdXJjZS1jb2RlIGNoYW5nZXMgaW4gYSBwcm9ncmFtLAorc3VjaCBhcyB0aGUgbnVtZXJpYyB2YWx1ZXMgZm9yIGNvbnN0YW50cworb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBhcyBtYWNyb3MuCitUaGVyZWZvcmUsCit5b3Ugc2hvdWxkIG5vdCBhc3N1bWUgdGhhdCBiaW5hcmllcyBhcmUgY29tcGF0aWJsZSBiZXR3ZWVuCitkaWZmZXJlbnQgTHVhIHZlcnNpb25zLgorQWx3YXlzIHJlY29tcGlsZSBjbGllbnRzIG9mIHRoZSBMdWEgQVBJIHdoZW4KK3VzaW5nIGEgbmV3IHZlcnNpb24uCisKK1NpbWlsYXJseSwgTHVhIHZlcnNpb25zIGNhbiBhbHdheXMgY2hhbmdlIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgorb2YgcHJlY29tcGlsZWQgY2h1bmtzOworcHJlY29tcGlsZWQgY2h1bmtzIGFyZSBub3QgY29tcGF0aWJsZSBiZXR3ZWVuIGRpZmZlcmVudCBMdWEgdmVyc2lvbnMuCisKK1RoZSBzdGFuZGFyZCBwYXRocyBpbiB0aGUgb2ZmaWNpYWwgZGlzdHJpYnV0aW9uIG1heQorY2hhbmdlIGJldHdlZW4gdmVyc2lvbnMuCisKK0BzZWN0MntAdGl0bGV7Q2hhbmdlcyBpbiB0aGUgTGFuZ3VhZ2V9CitAaXRlbWl6ZXsKKworQGl0ZW17CitUaGUgY29lcmNpb24gb2Ygc3RyaW5ncyB0byBudW1iZXJzIGluCithcml0aG1ldGljIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMKK2hhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY29yZSBsYW5ndWFnZS4KK1RoZSBzdHJpbmcgbGlicmFyeSBkb2VzIGEgc2ltaWxhciBqb2IKK2ZvciBhcml0aG1ldGljIChidXQgbm90IGZvciBiaXR3aXNlKSBvcGVyYXRpb25zCit1c2luZyB0aGUgc3RyaW5nIG1ldGFtZXRob2RzLgorSG93ZXZlciwgdW5saWtlIGluIHByZXZpb3VzIHZlcnNpb25zLAordGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBwcmVzZXJ2ZXMgdGhlIGltcGxpY2l0IHR5cGUgb2YgdGhlIG51bWVyYWwKK2luIHRoZSBzdHJpbmcuCitGb3IgaW5zdGFuY2UsIHRoZSByZXN1bHQgb2YgQFR7IjEiICsgIjIifSBub3cgaXMgYW4gaW50ZWdlciwKK25vdCBhIGZsb2F0LgorfQorCit9CisKK30KKworQHNlY3Qye0B0aXRsZXtDaGFuZ2VzIGluIHRoZSBMaWJyYXJpZXN9CitAaXRlbWl6ZXsKKworQGl0ZW17CitUaGUgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIEBMaWR7bWF0aC5yYW5kb219Citub3cgc3RhcnRzIHdpdGggYSBzb21ld2hhdCByYW5kb20gc2VlZC4KK01vcmVvdmVyLCBpdCB1c2VzIGEgZGlmZmVyZW50IGFsZ29yaXRobS4KK30KKworfQorCit9CisKK0BzZWN0MntAdGl0bGV7Q2hhbmdlcyBpbiB0aGUgQVBJfQorCitAaXRlbWl6ZXsKKworQGl0ZW17CitGdWxsIHVzZXJkYXRhIG5vdyBoYXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBhc3NvY2lhdGVkIHVzZXIgdmFsdWVzLgorVGhlcmVmb3JlLCB0aGUgZnVuY3Rpb25zIEBpZHtsdWFfbmV3dXNlcmRhdGF9LAorQGlke2x1YV9zZXR1c2VydmFsdWV9LCBhbmQgQGlke2x1YV9nZXR1c2VydmFsdWV9IHdlcmUKK3JlcGxhY2VkIGJ5IEBMaWR7bHVhX25ld3VzZXJkYXRhdXZ9LAorQExpZHtsdWFfc2V0aXVzZXJ2YWx1ZX0sIGFuZCBATGlke2x1YV9nZXRpdXNlcnZhbHVlfSwKK3doaWNoIGhhdmUgYW4gZXh0cmEgYXJndW1lbnQuCisKKyhGb3IgY29tcGF0aWJpbGl0eSwgdGhlIG9sZCBuYW1lcyBzdGlsbCB3b3JrIGFzIG1hY3JvcyBhc3N1bWluZworb25lIHNpbmdsZSB1c2VyIHZhbHVlLikKK30KKworQGl0ZW17CitUaGUgZnVuY3Rpb24gQExpZHtsdWFfcmVzdW1lfSBoYXMgYW4gZXh0cmEgcGFyYW1ldGVyLgorVGhpcyBvdXQgcGFyYW1ldGVyIHJldHVybnMgdGhlIG51bWJlciBvZiB2YWx1ZXMgb24KK3RoZSB0b3Agb2YgdGhlIHN0YWNrIHRoYXQgd2VyZSB5aWVsZGVkIG9yIHJldHVybmVkIGJ5IHRoZSBjb3JvdXRpbmUuCisoSW4gb2xkZXIgdmVyc2lvbnMsCit0aG9zZSB2YWx1ZXMgd2VyZSB0aGUgZW50aXJlIHN0YWNrLikKK30KKworQGl0ZW17CitUaGUgZnVuY3Rpb24gQExpZHtsdWFfdmVyc2lvbn0gcmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIsCitpbnN0ZWFkIG9mIGFuIGFkZHJlc3Mgb2YgdGhlIHZlcnNpb24gbnVtYmVyLgorKFRoZSBMdWEgY29yZSBzaG91bGQgd29yayBjb3JyZWN0bHkgd2l0aCBsaWJyYXJpZXMgdXNpbmcgdGhlaXIKK293biBzdGF0aWMgY29waWVzIG9mIHRoZSBzYW1lIGNvcmUsCitzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgdXNpbmcgdGhlIHNhbWUKK2FkZHJlc3Mgc3BhY2UuKQorfQorCit9CisKK30KKworfQorCisKK0BDe1s9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT19CisKK0BzZWN0MXtCTkZ8IEB0aXRsZXtUaGUgQ29tcGxldGUgU3ludGF4IG9mIEx1YX0KKworSGVyZSBpcyB0aGUgY29tcGxldGUgc3ludGF4IG9mIEx1YSBpbiBleHRlbmRlZCBCTkYuCitBcyB1c3VhbCBpbiBleHRlbmRlZCBCTkYsCitAYm5mTnRlcnt7QX19IG1lYW5zIDAgb3IgbW9yZSBAYm5mTnRlcntBfXMsCithbmQgQGJuZk50ZXJ7W0FdfSBtZWFucyBhbiBvcHRpb25hbCBAYm5mTnRlcntBfS4KKyhGb3Igb3BlcmF0b3IgcHJlY2VkZW5jZXMsIHNlZSBAU2Vle3ByZWN9OworZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHRlcm1pbmFscworQGJuZk50ZXJ7TmFtZX0sIEBibmZOdGVye051bWVyYWx9LAorYW5kIEBibmZOdGVye0xpdGVyYWxTdHJpbmd9LCBzZWUgQFNlZXtsZXhpY2FsfS4pCitAaW5kZXh7Z3JhbW1hcn0KKworQFByb2R1Y3sKKworQHByb2R1Y25hbWV7Y2h1bmt9QHByb2R1Y2JvZHl7YmxvY2t9CisKK0Bwcm9kdWNuYW1le2Jsb2NrfUBwcm9kdWNib2R5e0BibmZyZXB7c3RhdH0gQGJuZm9wdHtyZXRzdGF0fX0KKworQHByb2R1Y25hbWV7c3RhdH1AcHJvZHVjYm9keXsKKwlAYm5mdGVyezt9CitAT3JOTAl2YXJsaXN0IEBibmZ0ZXJ7PX0gZXhwbGlzdAorQE9yTkwJZnVuY3Rpb25jYWxsCitAT3JOTAlsYWJlbAorQE9yTkwgICBAUnd7YnJlYWt9CitAT3JOTCAgIEBSd3tnb3RvfSBOYW1lCitAT3JOTAlAUnd7ZG99IGJsb2NrIEBSd3tlbmR9CitAT3JOTAlAUnd7d2hpbGV9IGV4cCBAUnd7ZG99IGJsb2NrIEBSd3tlbmR9CitAT3JOTAlAUnd7cmVwZWF0fSBibG9jayBAUnd7dW50aWx9IGV4cAorQE9yTkwJQFJ3e2lmfSBleHAgQFJ3e3RoZW59IGJsb2NrCisJQGJuZnJlcHtAUnd7ZWxzZWlmfSBleHAgQFJ3e3RoZW59IGJsb2NrfQorCUBibmZvcHR7QFJ3e2Vsc2V9IGJsb2NrfSBAUnd7ZW5kfQorQE9yTkwJQFJ3e2Zvcn0gQGJuZk50ZXJ7TmFtZX0gQGJuZnRlcns9fSBleHAgQGJuZnRlcnssfSBleHAgQGJuZm9wdHtAYm5mdGVyeyx9IGV4cH0KKwlAUnd7ZG99IGJsb2NrIEBSd3tlbmR9CitAT3JOTCAgIEBSd3tmb3J9IG5hbWVsaXN0IEBSd3tpbn0gZXhwbGlzdCBAUnd7ZG99IGJsb2NrIEBSd3tlbmR9CitAT3JOTAlAUnd7ZnVuY3Rpb259IGZ1bmNuYW1lIGZ1bmNib2R5CitAT3JOTAlAUnd7bG9jYWx9IEBSd3tmdW5jdGlvbn0gQGJuZk50ZXJ7TmFtZX0gZnVuY2JvZHkKK0BPck5MCUBSd3tsb2NhbH0gbmFtZWxpc3QgQGJuZm9wdHtAYm5mdGVyez19IGV4cGxpc3R9Cit9CisKK0Bwcm9kdWNuYW1le3JldHN0YXR9QHByb2R1Y2JvZHl7QFJ3e3JldHVybn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGJuZm9wdHtleHBsaXN0fSBAYm5mb3B0e0BibmZ0ZXJ7O319fQorCitAcHJvZHVjbmFtZXtsYWJlbH1AcHJvZHVjYm9keXtAYm5mdGVyezo6fSBOYW1lIEBibmZ0ZXJ7Ojp9fQorCitAcHJvZHVjbmFtZXtmdW5jbmFtZX1AcHJvZHVjYm9keXtAYm5mTnRlcntOYW1lfSBAYm5mcmVwe0BibmZ0ZXJ7Ln0gQGJuZk50ZXJ7TmFtZX19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAYm5mb3B0e0BibmZ0ZXJ7On0gQGJuZk50ZXJ7TmFtZX19fQorCitAcHJvZHVjbmFtZXt2YXJsaXN0fUBwcm9kdWNib2R5e3ZhciBAYm5mcmVwe0BibmZ0ZXJ7LH0gdmFyfX0KKworQHByb2R1Y25hbWV7dmFyfUBwcm9kdWNib2R5eworCUBibmZOdGVye05hbWV9CitAT3IJcHJlZml4ZXhwIEBibmZ0ZXJ7W30gZXhwIEBibmZ0ZXJ7XX0KK0BPcglwcmVmaXhleHAgQGJuZnRlcnsufSBAYm5mTnRlcntOYW1lfQorfQorCitAcHJvZHVjbmFtZXtuYW1lbGlzdH1AcHJvZHVjYm9keXtAYm5mTnRlcntOYW1lfSBAYm5mcmVwe0BibmZ0ZXJ7LH0gQGJuZk50ZXJ7TmFtZX19fQorCisKK0Bwcm9kdWNuYW1le2V4cGxpc3R9QHByb2R1Y2JvZHl7ZXhwIEBibmZyZXB7QGJuZnRlcnssfSBleHB9fQorCitAcHJvZHVjbmFtZXtleHB9QHByb2R1Y2JvZHl7CisJQFJ3e25pbH0KK0BPcglAUnd7ZmFsc2V9CitAT3IJQFJ3e3RydWV9CitAT3IJQGJuZk50ZXJ7TnVtZXJhbH0KK0BPcglAYm5mTnRlcntMaXRlcmFsU3RyaW5nfQorQE9yCUBibmZ0ZXJ7Li4ufQorQE9yCWZ1bmN0aW9uZGVmCitAT3JOTAlwcmVmaXhleHAKK0BPcgl0YWJsZWNvbnN0cnVjdG9yCitAT3IJZXhwIGJpbm9wIGV4cAorQE9yCXVub3AgZXhwCit9CisKK0Bwcm9kdWNuYW1le3ByZWZpeGV4cH1AcHJvZHVjYm9keXt2YXIgQE9yIGZ1bmN0aW9uY2FsbCBAT3IgQGJuZnRlcnsofSBleHAgQGJuZnRlcnspfX0KKworQHByb2R1Y25hbWV7ZnVuY3Rpb25jYWxsfUBwcm9kdWNib2R5eworCXByZWZpeGV4cCBhcmdzCitAT3IJcHJlZml4ZXhwIEBibmZ0ZXJ7On0gQGJuZk50ZXJ7TmFtZX0gYXJncworfQorCitAcHJvZHVjbmFtZXthcmdzfUBwcm9kdWNib2R5eworCUBibmZ0ZXJ7KH0gQGJuZm9wdHtleHBsaXN0fSBAYm5mdGVyeyl9CitAT3IJdGFibGVjb25zdHJ1Y3RvcgorQE9yCUBibmZOdGVye0xpdGVyYWxTdHJpbmd9Cit9CisKK0Bwcm9kdWNuYW1le2Z1bmN0aW9uZGVmfUBwcm9kdWNib2R5e0BSd3tmdW5jdGlvbn0gZnVuY2JvZHl9CisKK0Bwcm9kdWNuYW1le2Z1bmNib2R5fUBwcm9kdWNib2R5e0BibmZ0ZXJ7KH0gQGJuZm9wdHtwYXJsaXN0fSBAYm5mdGVyeyl9IGJsb2NrIEBSd3tlbmR9fQorCitAcHJvZHVjbmFtZXtwYXJsaXN0fUBwcm9kdWNib2R5e25hbWVsaXN0IEBibmZvcHR7QGJuZnRlcnssfSBAYm5mdGVyey4uLn19CisgIEBPciBAYm5mdGVyey4uLn19CisKK0Bwcm9kdWNuYW1le3RhYmxlY29uc3RydWN0b3J9QHByb2R1Y2JvZHl7QGJuZnRlcntAT3Blbn0gQGJuZm9wdHtmaWVsZGxpc3R9IEBibmZ0ZXJ7QENsb3NlfX0KKworQHByb2R1Y25hbWV7ZmllbGRsaXN0fUBwcm9kdWNib2R5e2ZpZWxkIEBibmZyZXB7ZmllbGRzZXAgZmllbGR9IEBibmZvcHR7ZmllbGRzZXB9fQorCitAcHJvZHVjbmFtZXtmaWVsZH1AcHJvZHVjYm9keXtAYm5mdGVye1t9IGV4cCBAYm5mdGVye119IEBibmZ0ZXJ7PX0gZXhwIEBPciBAYm5mTnRlcntOYW1lfSBAYm5mdGVyez19IGV4cCBAT3IgZXhwfQorCitAcHJvZHVjbmFtZXtmaWVsZHNlcH1AcHJvZHVjYm9keXtAYm5mdGVyeyx9IEBPciBAYm5mdGVyezt9fQorCitAcHJvZHVjbmFtZXtiaW5vcH1AcHJvZHVjYm9keXsKKyAgQGJuZnRlcnsrfSBAT3IgQGJuZnRlcnstfSBAT3IgQGJuZnRlcnsqfSBAT3IgQGJuZnRlcnsvfSBAT3IgQGJuZnRlcnsvL30KKyAgICBAT3IgQGJuZnRlcntefSBAT3IgQGJuZnRlcnslfQorICAgICAgICBAT3JOTAorICBAYm5mdGVyeyZ9IEBPciBAYm5mdGVye359IEBPciBAYm5mdGVye3x9IEBPciBAYm5mdGVyez4+fSBAT3IgQGJuZnRlcns8PH0KKyAgICBAT3IgQGJuZnRlcnsuLn0KKyAgICAgICAgQE9yTkwKKyAgQGJuZnRlcns8fSBAT3IgQGJuZnRlcns8PX0gQE9yIEBibmZ0ZXJ7Pn0gQE9yIEBibmZ0ZXJ7Pj19CisgICAgQE9yIEBibmZ0ZXJ7PT19IEBPciBAYm5mdGVye349fQorICAgICAgICBAT3JOTAorICBAUnd7YW5kfSBAT3IgQFJ3e29yfX0KKworQHByb2R1Y25hbWV7dW5vcH1AcHJvZHVjYm9keXtAYm5mdGVyey19IEBPciBAUnd7bm90fSBAT3IgQGJuZnRlcnsjfSBAT3IKKyAgQGJuZnRlcnt+fX0KKworfQorCit9CisKK0BDe109PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT19CisKK30KK0BDeyldLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLX0KZGlmZiAtLWdpdCBhL3Rlc3Rlcy9hbGwubHVhIGIvdGVzdGVzL2FsbC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2ZlMjE2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9hbGwubHVhCkBAIC0wLDAgKzEsMjk0IEBACisjIS4uL2x1YQorLS0gJElkOiBhbGwubHVhLHYgMS4xMDAgMjAxOC8wMy8wOSAxNDoyMzo0OCByb2JlcnRvIEV4cCAkCistLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZQorCisKK2xvY2FsIHZlcnNpb24gPSAiTHVhIDUuNCIKK2lmIF9WRVJTSU9OIH49IHZlcnNpb24gdGhlbgorICBpby5zdGRlcnI6d3JpdGUoIlxuVGhpcyB0ZXN0IHN1aXRlIGlzIGZvciAiLCB2ZXJzaW9uLCAiLCBub3QgZm9yICIsIF9WRVJTSU9OLAorICAgICJcbkV4aXRpbmcgdGVzdHNcbiIpCisgIHJldHVybgorZW5kCisKKworX0cuQVJHID0gYXJnICAgLS0gc2F2ZSBhcmcgZm9yIG90aGVyIHRlc3RzCisKKworLS0gbmV4dCB2YXJpYWJsZXMgY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHNvbWUgdGVzdHMKKy0tIHRydWUgbWVhbnMgbm8gdGVzdCAoc28gYW4gdW5kZWZpbmVkIHZhcmlhYmxlIGRvZXMgbm90IHNraXAgYSB0ZXN0KQorLS0gZGVmYXVsdHMgYXJlIGZvciBMaW51eDsgdGVzdCBldmVyeXRoaW5nLgorLS0gTWFrZSB0cnVlIHRvIGF2b2lkIGxvbmcgb3IgbWVtb3J5IGNvbnN1bWluZyB0ZXN0cworX3NvZnQgPSByYXdnZXQoX0csICJfc29mdCIpIG9yIGZhbHNlCistLSBNYWtlIHRydWUgdG8gYXZvaWQgbm9uLXBvcnRhYmxlIHRlc3RzCitfcG9ydCA9IHJhd2dldChfRywgIl9wb3J0Iikgb3IgZmFsc2UKKy0tIE1ha2UgdHJ1ZSB0byBhdm9pZCBtZXNzYWdlcyBhYm91dCB0ZXN0cyBub3QgcGVyZm9ybWVkCitfbm9tc2cgPSByYXdnZXQoX0csICJfbm9tc2ciKSBvciBmYWxzZQorCisKK2xvY2FsIHVzZXJ0ZXN0cyA9IHJhd2dldChfRywgIl9VIikKKworaWYgdXNlcnRlc3RzIHRoZW4KKyAgLS0gdGVzdHMgZm9yIHNpc3NpZXMgOykgIEF2b2lkIHByb2JsZW1zCisgIF9zb2Z0ID0gdHJ1ZQorICBfcG9ydCA9IHRydWUKKyAgX25vbXNnID0gdHJ1ZQorZW5kCisKKy0tIHRlc3RzIHNob3VsZCByZXF1aXJlIGRlYnVnIHdoZW4gbmVlZGVkCitkZWJ1ZyA9IG5pbAorCityZXF1aXJlImJ3Y29lcmNpb24iCisKKworaWYgdXNlcnRlc3RzIHRoZW4KKyAgVCA9IG5pbCAgICAtLSBubyAiaW50ZXJuYWwiIHRlc3RzIGZvciB1c2VyIHRlc3RzCitlbHNlCisgIFQgPSByYXdnZXQoX0csICJUIikgIC0tIGF2b2lkIHByb2JsZW1zIHdpdGggJ3N0cmljdCcgbW9kdWxlCitlbmQKKworbWF0aC5yYW5kb21zZWVkKDApCisKKy0tWz1bCisgIGV4YW1wbGUgb2YgYSBsb25nIFtjb21tZW50XSwKKyAgW1tzcGFubmluZyBzZXZlcmFsIFtsaW5lc11dXQorCitdPV0KKworcHJpbnQoImN1cnJlbnQgcGF0aDpcbioqKioiIC4uIHBhY2thZ2UucGF0aCAuLiAiKioqKlxuIikKKworCitsb2NhbCBpbml0Y2xvY2sgPSBvcy5jbG9jaygpCitsb2NhbCBsYXN0Y2xvY2sgPSBpbml0Y2xvY2sKK2xvY2FsIHdhbGx0aW1lID0gb3MudGltZSgpCisKK2xvY2FsIGNvbGxlY3RnYXJiYWdlID0gY29sbGVjdGdhcmJhZ2UKKworZG8gICAtLSAoCisKKy0tIHRyYWNrIG1lc3NhZ2VzIGZvciB0ZXN0cyBub3QgcGVyZm9ybWVkCitsb2NhbCBtc2dzID0ge30KK2Z1bmN0aW9uIE1lc3NhZ2UgKG0pCisgIGlmIG5vdCBfbm9tc2cgdGhlbgorICAgIHByaW50KG0pCisgICAgbXNnc1sjbXNncysxXSA9IHN0cmluZy5zdWIobSwgMywgLTMpCisgIGVuZAorZW5kCisKK2Fzc2VydChvcy5zZXRsb2NhbGUiQyIpCisKK2xvY2FsIFQscHJpbnQsZm9ybWF0LHdyaXRlLGFzc2VydCx0eXBlLHVucGFjayxmbG9vciA9CisgICAgICBULHByaW50LHN0cmluZy5mb3JtYXQsaW8ud3JpdGUsYXNzZXJ0LHR5cGUsdGFibGUudW5wYWNrLG1hdGguZmxvb3IKKworLS0gdXNlIEsgZm9yIDEwMDAgYW5kIE0gZm9yIDEwMDAwMDAgKG5vdCAyXjEwIC0tIDJeMjApCitsb2NhbCBmdW5jdGlvbiBGIChtKQorICBsb2NhbCBmdW5jdGlvbiByb3VuZCAobSkKKyAgICBtID0gbSArIDAuMDQ5OTkKKyAgICByZXR1cm4gZm9ybWF0KCIlLjFmIiwgbSkgICAgICAtLSBrZWVwIG9uZSBkZWNpbWFsIGRpZ2l0CisgIGVuZAorICBpZiBtIDwgMTAwMCB0aGVuIHJldHVybiBtCisgIGVsc2UKKyAgICBtID0gbSAvIDEwMDAKKyAgICBpZiBtIDwgMTAwMCB0aGVuIHJldHVybiByb3VuZChtKS4uIksiCisgICAgZWxzZQorICAgICAgcmV0dXJuIHJvdW5kKG0vMTAwMCkuLiJNIgorICAgIGVuZAorICBlbmQKK2VuZAorCitsb2NhbCBzaG93bWVtCitpZiBub3QgVCB0aGVuCisgIGxvY2FsIG1heCA9IDAKKyAgc2hvd21lbSA9IGZ1bmN0aW9uICgpCisgICAgbG9jYWwgbSA9IGNvbGxlY3RnYXJiYWdlKCJjb3VudCIpICogMTAyNAorICAgIG1heCA9IChtID4gbWF4KSBhbmQgbSBvciBtYXgKKyAgICBwcmludChmb3JtYXQoIiAgICAtLS0tIHRvdGFsIG1lbW9yeTogJXMsIG1heCBtZW1vcnk6ICVzIC0tLS1cbiIsCisgICAgICAgICAgRihtKSwgRihtYXgpKSkKKyAgZW5kCitlbHNlCisgIHNob3dtZW0gPSBmdW5jdGlvbiAoKQorICAgIFQuY2hlY2ttZW1vcnkoKQorICAgIGxvY2FsIHRvdGFsLCBudW1ibG9ja3MsIG1heG1lbSA9IFQudG90YWxtZW0oKQorICAgIGxvY2FsIGNvdW50ID0gY29sbGVjdGdhcmJhZ2UoImNvdW50IikKKyAgICBwcmludChmb3JtYXQoCisgICAgICAiXG4gICAgLS0tLSB0b3RhbCBtZW1vcnk6ICVzICglLjBmSyksIG1heCB1c2U6ICVzLCAgYmxvY2tzOiAlZFxuIiwKKyAgICAgIEYodG90YWwpLCBjb3VudCwgRihtYXhtZW0pLCBudW1ibG9ja3MpKQorICAgIHByaW50KGZvcm1hdCgiXHQoc3RyaW5nczogICVkLCB0YWJsZXM6ICVkLCBmdW5jdGlvbnM6ICVkLCAiLi4KKyAgICAgICAgICAgICAgICAgIlxuXHR1ZGF0YTogJWQsIHRocmVhZHM6ICVkKSIsCisgICAgICAgICAgICAgICAgIFQudG90YWxtZW0ic3RyaW5nIiwgVC50b3RhbG1lbSJ0YWJsZSIsIFQudG90YWxtZW0iZnVuY3Rpb24iLAorICAgICAgICAgICAgICAgICBULnRvdGFsbWVtInVzZXJkYXRhIiwgVC50b3RhbG1lbSJ0aHJlYWQiKSkKKyAgZW5kCitlbmQKKworCistLQorLS0gcmVkZWZpbmUgZG9maWxlIHRvIHJ1biBmaWxlcyB0aHJvdWdoIGR1bXAvdW5kdW1wCistLQorbG9jYWwgZnVuY3Rpb24gcmVwb3J0IChuKSBwcmludCgiXG4qKioqKiBGSUxFICciLi5uLi4iJyoqKioqIikgZW5kCitsb2NhbCBvbGRkb2ZpbGUgPSBkb2ZpbGUKK2xvY2FsIGRvZmlsZSA9IGZ1bmN0aW9uIChuLCBzdHJpcCkKKyAgc2hvd21lbSgpCisgIGxvY2FsIGMgPSBvcy5jbG9jaygpCisgIHByaW50KHN0cmluZy5mb3JtYXQoInRpbWU6ICVnICgrJWcpIiwgYyAtIGluaXRjbG9jaywgYyAtIGxhc3RjbG9jaykpCisgIGxhc3RjbG9jayA9IGMKKyAgcmVwb3J0KG4pCisgIGxvY2FsIGYgPSBhc3NlcnQobG9hZGZpbGUobikpCisgIGxvY2FsIGIgPSBzdHJpbmcuZHVtcChmLCBzdHJpcCkKKyAgZiA9IGFzc2VydChsb2FkKGIpKQorICByZXR1cm4gZigpCitlbmQKKworZG9maWxlKCdtYWluLmx1YScpCisKK2RvCisgIGxvY2FsIG5leHQsIHNldG1ldGF0YWJsZSwgc3RkZXJyID0gbmV4dCwgc2V0bWV0YXRhYmxlLCBpby5zdGRlcnIKKyAgLS0gdHJhY2sgY29sbGVjdGlvbnMKKyAgbG9jYWwgbXQgPSB7fQorICAtLSBlYWNoIHRpbWUgYSB0YWJsZSBpcyBjb2xsZWN0ZWQsIHJlbWFyayBpdCBmb3IgZmluYWxpemF0aW9uCisgIC0tIG9uIG5leHQgY3ljbGUKKyAgbXQuX19nYyA9IGZ1bmN0aW9uIChvKQorICAgICBzdGRlcnI6d3JpdGUnLicgICAgLS0gbWFyayBwcm9ncmVzcworICAgICBsb2NhbCBuID0gc2V0bWV0YXRhYmxlKG8sIG10KSAgIC0tIHJlbWFyayBpdAorICAgZW5kCisgICBsb2NhbCBuID0gc2V0bWV0YXRhYmxlKHt9LCBtdCkgICAgLS0gY3JlYXRlIG9iamVjdAorZW5kCisKK3JlcG9ydCJnYy5sdWEiCitsb2NhbCBmID0gYXNzZXJ0KGxvYWRmaWxlKCdnYy5sdWEnKSkKK2YoKQorCitkb2ZpbGUoJ2RiLmx1YScpCithc3NlcnQoZG9maWxlKCdjYWxscy5sdWEnKSA9PSBkZWVwIGFuZCBkZWVwKQorb2xkZG9maWxlKCdzdHJpbmdzLmx1YScpCitvbGRkb2ZpbGUoJ2xpdGVyYWxzLmx1YScpCitkb2ZpbGUoJ3RwYWNrLmx1YScpCithc3NlcnQoZG9maWxlKCdhdHRyaWIubHVhJykgPT0gMjcpCisKK2Fzc2VydChkb2ZpbGUoJ2xvY2Fscy5sdWEnKSA9PSA1KQorZG9maWxlKCdjb25zdHJ1Y3RzLmx1YScpCitkb2ZpbGUoJ2NvZGUubHVhJywgdHJ1ZSkKK2lmIG5vdCBfRy5fc29mdCB0aGVuCisgIHJlcG9ydCgnYmlnLmx1YScpCisgIGxvY2FsIGYgPSBjb3JvdXRpbmUud3JhcChhc3NlcnQobG9hZGZpbGUoJ2JpZy5sdWEnKSkpCisgIGFzc2VydChmKCkgPT0gJ2InKQorICBhc3NlcnQoZigpID09ICdhJykKK2VuZAorZG9maWxlKCduZXh0dmFyLmx1YScpCitkb2ZpbGUoJ3BtLmx1YScpCitkb2ZpbGUoJ3V0ZjgubHVhJykKK2RvZmlsZSgnYXBpLmx1YScpCithc3NlcnQoZG9maWxlKCdldmVudHMubHVhJykgPT0gMTIpCitkb2ZpbGUoJ3ZhcmFyZy5sdWEnKQorZG9maWxlKCdjbG9zdXJlLmx1YScpCitkb2ZpbGUoJ2Nvcm91dGluZS5sdWEnKQorZG9maWxlKCdnb3RvLmx1YScsIHRydWUpCitkb2ZpbGUoJ2Vycm9ycy5sdWEnKQorZG9maWxlKCdtYXRoLmx1YScpCitkb2ZpbGUoJ3NvcnQubHVhJywgdHJ1ZSkKK2RvZmlsZSgnYml0d2lzZS5sdWEnKQorYXNzZXJ0KGRvZmlsZSgndmVyeWJpZy5sdWEnLCB0cnVlKSA9PSAxMCk7IGNvbGxlY3RnYXJiYWdlKCkKK2RvZmlsZSgnZmlsZXMubHVhJykKKworaWYgI21zZ3MgPiAwIHRoZW4KKyAgcHJpbnQoIlxudGVzdHMgbm90IHBlcmZvcm1lZDoiKQorICBmb3IgaT0xLCNtc2dzIGRvCisgICAgcHJpbnQobXNnc1tpXSkKKyAgZW5kCisgIHByaW50KCkKK2VuZAorCistLSBubyB0ZXN0IG1vZHVsZSBzaG91bGQgZGVmaW5lICdkZWJ1ZycKK2Fzc2VydChkZWJ1ZyA9PSBuaWwpCisKK2xvY2FsIGRlYnVnID0gcmVxdWlyZSAiZGVidWciCisKK3ByaW50KHN0cmluZy5mb3JtYXQoIiVkLWJpdCBpbnRlZ2VycywgJWQtYml0IGZsb2F0cyIsCisgICAgICAgIHN0cmluZy5wYWNrc2l6ZSgiaiIpICogOCwgc3RyaW5nLnBhY2tzaXplKCJuIikgKiA4KSkKKworZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoYSkgYXNzZXJ0KHR5cGUoYSkgPT0gJ3N0cmluZycpIGVuZCwgImNyIikKKworLS0gdG8gc3Vydml2ZSBvdXRzaWRlIGJsb2NrCitfRy5zaG93bWVtID0gc2hvd21lbQorCitlbmQgICAtLSkKKworbG9jYWwgX0csIHNob3dtZW0sIHByaW50LCBmb3JtYXQsIGNsb2NrLCB0aW1lLCBkaWZmdGltZSwgYXNzZXJ0LCBvcGVuID0KKyAgICAgIF9HLCBzaG93bWVtLCBwcmludCwgc3RyaW5nLmZvcm1hdCwgb3MuY2xvY2ssIG9zLnRpbWUsIG9zLmRpZmZ0aW1lLAorICAgICAgYXNzZXJ0LCBpby5vcGVuCisKKy0tIGZpbGUgd2l0aCB0aW1lIG9mIGxhc3QgcGVyZm9ybWVkIHRlc3QKK2xvY2FsIGZuYW1lID0gVCBhbmQgInRpbWUtZGVidWcudHh0IiBvciAidGltZS50eHQiCitsb2NhbCBsYXN0dGltZQorCitpZiBub3QgdXNlcnRlc3RzIHRoZW4KKyAgLS0gb3BlbiBmaWxlIHdpdGggdGltZSBvZiBsYXN0IHBlcmZvcm1lZCB0ZXN0CisgIGxvY2FsIGYgPSBpby5vcGVuKGZuYW1lKQorICBpZiBmIHRoZW4KKyAgICBsYXN0dGltZSA9IGFzc2VydCh0b251bWJlcihmOnJlYWQnYScpKQorICAgIGY6Y2xvc2UoKTsKKyAgZWxzZSAgIC0tIG5vIHN1Y2ggZmlsZTsgYXNzdW1lIGl0IGlzIHJlY29yZGluZyB0aW1lIGZvciBmaXJzdCB0aW1lCisgICAgbGFzdHRpbWUgPSBuaWwKKyAgZW5kCitlbmQKKworLS0gZXJhc2UgKGFsbW9zdCkgYWxsIGdsb2JhbHMKK3ByaW50KCdjbGVhbmluZyBhbGwhISEhJykKK2ZvciBuIGluIHBhaXJzKF9HKSBkbworICBpZiBub3QgKHtfX19HbG9iID0gMSwgdG9zdHJpbmcgPSAxfSlbbl0gdGhlbgorICAgIF9HW25dID0gdW5kZWYKKyAgZW5kCitlbmQKKworCitjb2xsZWN0Z2FyYmFnZSgpCitjb2xsZWN0Z2FyYmFnZSgpCitjb2xsZWN0Z2FyYmFnZSgpCitjb2xsZWN0Z2FyYmFnZSgpCitjb2xsZWN0Z2FyYmFnZSgpCitjb2xsZWN0Z2FyYmFnZSgpO3Nob3dtZW0oKQorCitsb2NhbCBjbG9ja3RpbWUgPSBjbG9jaygpIC0gaW5pdGNsb2NrCit3YWxsdGltZSA9IGRpZmZ0aW1lKHRpbWUoKSwgd2FsbHRpbWUpCisKK3ByaW50KGZvcm1hdCgiXG5cbnRvdGFsIHRpbWU6ICUuMmZzICh3YWxsIHRpbWU6ICVncylcbiIsIGNsb2NrdGltZSwgd2FsbHRpbWUpKQorCitpZiBub3QgdXNlcnRlc3RzIHRoZW4KKyAgbGFzdHRpbWUgPSBsYXN0dGltZSBvciBjbG9ja3RpbWUgICAgLS0gaWYgbm8gbGFzdCB0aW1lLCBpZ25vcmUgZGlmZmVyZW5jZQorICAtLSBjaGVjayB3aGV0aGVyIGN1cnJlbnQgdGVzdCB0aW1lIGRpZmZlcnMgbW9yZSB0aGFuIDUlIGZyb20gbGFzdCB0aW1lCisgIGxvY2FsIGRpZmYgPSAoY2xvY2t0aW1lIC0gbGFzdHRpbWUpIC8gbGFzdHRpbWUKKyAgbG9jYWwgdG9sZXJhbmNlID0gMC4wNSAgICAtLSA1JQorICBpZiAoZGlmZiA+PSB0b2xlcmFuY2Ugb3IgZGlmZiA8PSAtdG9sZXJhbmNlKSB0aGVuCisgICAgcHJpbnQoZm9ybWF0KCJXQVJOSU5HOiB0aW1lIGRpZmZlcmVuY2UgZnJvbSBwcmV2aW91cyB0ZXN0OiAlKy4xZiUlIiwKKyAgICAgICAgICAgICAgICAgIGRpZmYgKiAxMDApKQorICBlbmQKKyAgYXNzZXJ0KG9wZW4oZm5hbWUsICJ3IikpOndyaXRlKGNsb2NrdGltZSk6Y2xvc2UoKQorZW5kCisKK3ByaW50KCJmaW5hbCBPSyAhISEiKQorCisKKworLS1bWworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChDKSAxOTk0LTIwMTYgTHVhLm9yZywgUFVDLVJpby4KKyoKKyogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqCisqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorKgorKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorXV0KKwpkaWZmIC0tZ2l0IGEvdGVzdGVzL2FwaS5sdWEgYi90ZXN0ZXMvYXBpLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzZhNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGVzL2FwaS5sdWEKQEAgLTAsMCArMSwxMjY0IEBACistLSAkSWQ6IGFwaS5sdWEsdiAxLjE1NSAyMDE4LzAzLzA5IDE0OjIzOjQ4IHJvYmVydG8gRXhwICQKKy0tIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGZpbGUgYWxsLmx1YQorCitpZiBUPT1uaWwgdGhlbgorICAoTWVzc2FnZSBvciBwcmludCkoJ1xuID4+PiB0ZXN0QyBub3QgYWN0aXZlOiBza2lwcGluZyBBUEkgdGVzdHMgPDw8XG4nKQorICByZXR1cm4KK2VuZAorCitsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUgImRlYnVnIgorCitsb2NhbCBwYWNrID0gdGFibGUucGFjaworCisKK2Z1bmN0aW9uIHRjaGVjayAodDEsIHQyKQorICBhc3NlcnQodDEubiA9PSAodDIubiBvciAjdDIpICsgMSkKKyAgZm9yIGkgPSAyLCB0MS5uIGRvIGFzc2VydCh0MVtpXSA9PSB0MltpIC0gMV0pIGVuZAorZW5kCisKKworbG9jYWwgZnVuY3Rpb24gY2hlY2tlcnIgKG1zZywgZiwgLi4uKQorICBsb2NhbCBzdGF0LCBlcnIgPSBwY2FsbChmLCAuLi4pCisgIGFzc2VydChub3Qgc3RhdCBhbmQgc3RyaW5nLmZpbmQoZXJyLCBtc2cpKQorZW5kCisKKworcHJpbnQoJ3Rlc3RpbmcgQyBBUEknKQorCithID0gVC50ZXN0QygicHVzaHZhbHVlIFI7IHJldHVybiAxIikKK2Fzc2VydChhID09IGRlYnVnLmdldHJlZ2lzdHJ5KCkpCisKKworLS0gYWJzaW5kZXgKK2Fzc2VydChULnRlc3RDKCJzZXR0b3AgMTA7IGFic2luZGV4IC0xOyByZXR1cm4gMSIpID09IDEwKQorYXNzZXJ0KFQudGVzdEMoInNldHRvcCA1OyBhYnNpbmRleCAtNTsgcmV0dXJuIDEiKSA9PSAxKQorYXNzZXJ0KFQudGVzdEMoInNldHRvcCAxMDsgYWJzaW5kZXggMTsgcmV0dXJuIDEiKSA9PSAxKQorYXNzZXJ0KFQudGVzdEMoInNldHRvcCAxMDsgYWJzaW5kZXggUjsgcmV0dXJuIDEiKSA8IC0xMCkKKworLS0gdGVzdGluZyBhbGlnbm1lbnQKK2EgPSBULmQycygxMjQ1ODk1NDMyMTEyMy4wKQorYXNzZXJ0KGEgPT0gc3RyaW5nLnBhY2soImQiLCAxMjQ1ODk1NDMyMTEyMy4wKSkKK2Fzc2VydChULnMyZChhKSA9PSAxMjQ1ODk1NDMyMTEyMy4wKQorCithLGIsYyA9IFQudGVzdEMoInB1c2hudW0gMTsgcHVzaG51bSAyOyBwdXNobnVtIDM7IHJldHVybiAyIikKK2Fzc2VydChhID09IDIgYW5kIGIgPT0gMyBhbmQgbm90IGMpCisKK2YgPSBULm1ha2VDZnVuYygicHVzaG51bSAxOyBwdXNobnVtIDI7IHB1c2hudW0gMzsgcmV0dXJuIDIiKQorYSxiLGMgPSBmKCkKK2Fzc2VydChhID09IDIgYW5kIGIgPT0gMyBhbmQgbm90IGMpCisKKy0tIHRlc3QgdGhhdCBhbGwgdHJ1ZXMgYXJlIGVxdWFsCithLGIsYyA9IFQudGVzdEMoInB1c2hib29sIDE7IHB1c2hib29sIDI7IHB1c2hib29sIDA7IHJldHVybiAzIikKK2Fzc2VydChhID09IGIgYW5kIGEgPT0gdHJ1ZSBhbmQgYyA9PSBmYWxzZSkKK2EsYixjID0gVC50ZXN0QyJwdXNoYm9vbCAwOyBwdXNoYm9vbCAxMDsgcHVzaG5pbDtcCisgICAgICAgICAgICAgICAgICAgICAgdG9ib29sIC0zOyB0b2Jvb2wgLTM7IHRvYm9vbCAtMzsgcmV0dXJuIDMiCithc3NlcnQoYT09ZmFsc2UgYW5kIGI9PXRydWUgYW5kIGM9PWZhbHNlKQorCisKK2EsYixjID0gVC50ZXN0QygiZ2V0dG9wOyByZXR1cm4gMiIsIDEwLCAyMCwgMzAsIDQwKQorYXNzZXJ0KGEgPT0gNDAgYW5kIGIgPT0gNSBhbmQgbm90IGMpCisKK3QgPSBwYWNrKFQudGVzdEMoInNldHRvcCA1OyByZXR1cm4gKiIsIDIsIDMpKQordGNoZWNrKHQsIHtuPTQsMiwzfSkKKwordCA9IHBhY2soVC50ZXN0Qygic2V0dG9wIDA7IHNldHRvcCAxNTsgcmV0dXJuIDEwIiwgMywgMSwgMjMpKQorYXNzZXJ0KHQubiA9PSAxMCBhbmQgdFsxXSA9PSBuaWwgYW5kIHRbMTBdID09IG5pbCkKKwordCA9IHBhY2soVC50ZXN0QygicmVtb3ZlIC0yOyByZXR1cm4gKiIsIDIsIDMsIDQpKQordGNoZWNrKHQsIHtuPTIsMiw0fSkKKwordCA9IHBhY2soVC50ZXN0QygiaW5zZXJ0IC0xOyByZXR1cm4gKiIsIDIsIDMpKQordGNoZWNrKHQsIHtuPTIsMiwzfSkKKwordCA9IHBhY2soVC50ZXN0QygiaW5zZXJ0IDM7IHJldHVybiAqIiwgMiwgMywgNCwgNSkpCit0Y2hlY2sodCwge249NCwyLDUsMyw0fSkKKwordCA9IHBhY2soVC50ZXN0QygicmVwbGFjZSAyOyByZXR1cm4gKiIsIDIsIDMsIDQsIDUpKQordGNoZWNrKHQsIHtuPTMsNSwzLDR9KQorCit0ID0gcGFjayhULnRlc3RDKCJyZXBsYWNlIC0yOyByZXR1cm4gKiIsIDIsIDMsIDQsIDUpKQordGNoZWNrKHQsIHtuPTMsMiwzLDV9KQorCit0ID0gcGFjayhULnRlc3RDKCJyZW1vdmUgMzsgcmV0dXJuICoiLCAyLCAzLCA0LCA1KSkKK3RjaGVjayh0LCB7bj0zLDIsNCw1fSkKKwordCA9IHBhY2soVC50ZXN0QygiY29weSAzIDQ7IHJldHVybiAqIiwgMiwgMywgNCwgNSkpCit0Y2hlY2sodCwge249NCwyLDMsMyw1fSkKKwordCA9IHBhY2soVC50ZXN0QygiY29weSAtMyAtMTsgcmV0dXJuICoiLCAyLCAzLCA0LCA1KSkKK3RjaGVjayh0LCB7bj00LDIsMyw0LDN9KQorCitkbyAgIC0tIHRlc3RpbmcgJ3JvdGF0ZScKKyAgbG9jYWwgdCA9IHsxMCwgMjAsIDMwLCA0MCwgNTAsIDYwfQorICBmb3IgaSA9IC02LCA2IGRvCisgICAgbG9jYWwgcyA9IHN0cmluZy5mb3JtYXQoInJvdGF0ZSAyICVkOyByZXR1cm4gNyIsIGkpCisgICAgbG9jYWwgdDEgPSBwYWNrKFQudGVzdEMocywgMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCkpCisgICAgdGNoZWNrKHQxLCB0KQorICAgIHRhYmxlLmluc2VydCh0LCAxLCB0YWJsZS5yZW1vdmUodCkpCisgIGVuZAorCisgIHQgPSBwYWNrKFQudGVzdEMoInJvdGF0ZSAtMiAxOyByZXR1cm4gKiIsIDEwLCAyMCwgMzAsIDQwKSkKKyAgdGNoZWNrKHQsIHsxMCwgMjAsIDQwLCAzMH0pCisgIHQgPSBwYWNrKFQudGVzdEMoInJvdGF0ZSAtMiAtMTsgcmV0dXJuICoiLCAxMCwgMjAsIDMwLCA0MCkpCisgIHRjaGVjayh0LCB7MTAsIDIwLCA0MCwgMzB9KQorCisgIC0tIHNvbWUgY29ybmVyIGNhc2VzCisgIHQgPSBwYWNrKFQudGVzdEMoInJvdGF0ZSAtMSAwOyByZXR1cm4gKiIsIDEwLCAyMCwgMzAsIDQwKSkKKyAgdGNoZWNrKHQsIHsxMCwgMjAsIDMwLCA0MH0pCisgIHQgPSBwYWNrKFQudGVzdEMoInJvdGF0ZSAtMSAxOyByZXR1cm4gKiIsIDEwLCAyMCwgMzAsIDQwKSkKKyAgdGNoZWNrKHQsIHsxMCwgMjAsIDMwLCA0MH0pCisgIHQgPSBwYWNrKFQudGVzdEMoInJvdGF0ZSA1IC0xOyByZXR1cm4gKiIsIDEwLCAyMCwgMzAsIDQwKSkKKyAgdGNoZWNrKHQsIHsxMCwgMjAsIDMwLCA0MH0pCitlbmQKKworLS0gdGVzdGluZyBtZXNzYWdlIGhhbmRsZXJzCitkbworICBsb2NhbCBmID0gVC5tYWtlQ2Z1bmNbWworICAgIGdldGdsb2JhbCBlcnJvcgorICAgIHB1c2hzdHJpbmcgYm9sYQorICAgIHBjYWxsIDEgMSAxICAgIyBjYWxsICdlcnJvcicgd2l0aCBnaXZlbiBoYW5kbGVyCisgICAgcHVzaHN0YXR1cworICAgIHJldHVybiAyICAgICAjIHJldHVybiBlcnJvciBtZXNzYWdlIGFuZCBzdGF0dXMKKyAgXV0KKworICBsb2NhbCBtc2csIHN0ID0gZihzdHJpbmcudXBwZXIpICAgLS0gZnVuY3Rpb24gaGFuZGxlcgorICBhc3NlcnQoc3QgPT0gIkVSUlJVTiIgYW5kIG1zZyA9PSAiQk9MQSIpCisgIGxvY2FsIG1zZywgc3QgPSBmKHN0cmluZy5sZW4pICAgICAtLSBmdW5jdGlvbiBoYW5kbGVyCisgIGFzc2VydChzdCA9PSAiRVJSUlVOIiBhbmQgbXNnID09IDQpCisKK2VuZAorCit0ID0gcGFjayhULnRlc3RDKCJpbnNlcnQgMzsgcHVzaHZhbHVlIDM7IHJlbW92ZSAzOyBwdXNodmFsdWUgMjsgcmVtb3ZlIDI7IFwKKyAgICAgICAgICAgICAgICAgIGluc2VydCAyOyBwdXNodmFsdWUgMTsgcmVtb3ZlIDE7IGluc2VydCAxOyBcCisgICAgICBpbnNlcnQgLTI7IHB1c2h2YWx1ZSAtMjsgcmVtb3ZlIC0zOyByZXR1cm4gKiIsCisgICAgICAyLCAzLCA0LCA1LCAxMCwgNDAsIDkwKSkKK3RjaGVjayh0LCB7bj03LDIsMyw0LDUsMTAsNDAsOTB9KQorCit0ID0gcGFjayhULnRlc3RDKCJjb25jYXQgNTsgcmV0dXJuICoiLCAiYWxvIiwgMiwgMywgImpvYW8iLCAxMikpCit0Y2hlY2sodCwge249MSwiYWxvMjNqb2FvMTIifSkKKworLS0gdGVzdGluZyBNVUxUUkVUCit0ID0gcGFjayhULnRlc3RDKCJjYWxsIDIsLTE7IHJldHVybiAqIiwKKyAgICAgZnVuY3Rpb24gKGEsYikgcmV0dXJuIDEsMiwzLDQsYSxiIGVuZCwgImFsbyIsICJqb2FvIikpCit0Y2hlY2sodCwge249NiwxLDIsMyw0LCJhbG8iLCAiam9hbyJ9KQorCitkbyAgLS0gdGVzdCByZXR1cm5pbmcgbW9yZSByZXN1bHRzIHRoYW4gZml0IGluIHRoZSBjYWxsZXIgc3RhY2sKKyAgbG9jYWwgYSA9IHt9CisgIGZvciBpPTEsMTAwMCBkbyBhW2ldID0gdHJ1ZSBlbmQ7IGFbOTk5XSA9IDEwCisgIGxvY2FsIGIgPSBULnRlc3RDKFtbcGNhbGwgMSAtMSAwOyBwb3AgMTsgdG9zdHJpbmcgLTE7IHJldHVybiAxXV0sCisgICAgICAgICAgICAgICAgICAgIHRhYmxlLnVucGFjaywgYSkKKyAgYXNzZXJ0KGIgPT0gIjEwIikKK2VuZAorCisKKy0tIHRlc3RpbmcgZ2xvYmFscworX0cuYSA9IDE0OyBfRy5iID0gImEzMSIKK2xvY2FsIGEgPSB7VC50ZXN0Q1tbCisgIGdldGdsb2JhbCBhOworICBnZXRnbG9iYWwgYjsKKyAgZ2V0Z2xvYmFsIGI7CisgIHNldGdsb2JhbCBhOworICByZXR1cm4gKgorXV19Cithc3NlcnQoYVsyXSA9PSAxNCBhbmQgYVszXSA9PSAiYTMxIiBhbmQgYVs0XSA9PSBuaWwgYW5kIF9HLmEgPT0gImEzMSIpCisKKworLS0gdGVzdGluZyBhcml0aAorYXNzZXJ0KFQudGVzdEMoInB1c2hudW0gMTA7IHB1c2hudW0gMjA7IGFyaXRoIC87IHJldHVybiAxIikgPT0gMC41KQorYXNzZXJ0KFQudGVzdEMoInB1c2hudW0gMTA7IHB1c2hudW0gMjA7IGFyaXRoIC07IHJldHVybiAxIikgPT0gLTEwKQorYXNzZXJ0KFQudGVzdEMoInB1c2hudW0gMTA7IHB1c2hudW0gLTIwOyBhcml0aCAqOyByZXR1cm4gMSIpID09IC0yMDApCithc3NlcnQoVC50ZXN0QygicHVzaG51bSAxMDsgcHVzaG51bSAzOyBhcml0aCBeOyByZXR1cm4gMSIpID09IDEwMDApCithc3NlcnQoVC50ZXN0QygicHVzaG51bSAxMDsgcHVzaHN0cmluZyAyMDsgYXJpdGggLzsgcmV0dXJuIDEiKSA9PSAwLjUpCithc3NlcnQoVC50ZXN0QygicHVzaHN0cmluZyAxMDsgcHVzaG51bSAyMDsgYXJpdGggLTsgcmV0dXJuIDEiKSA9PSAtMTApCithc3NlcnQoVC50ZXN0QygicHVzaHN0cmluZyAxMDsgcHVzaHN0cmluZyAtMjA7IGFyaXRoICo7IHJldHVybiAxIikgPT0gLTIwMCkKK2Fzc2VydChULnRlc3RDKCJwdXNoc3RyaW5nIDEwOyBwdXNoc3RyaW5nIDM7IGFyaXRoIF47IHJldHVybiAxIikgPT0gMTAwMCkKK2Fzc2VydChULnRlc3RDKCJhcml0aCAvOyByZXR1cm4gMSIsIDIsIDApID09IDEwLjAvMCkKK2EgPSBULnRlc3RDKCJwdXNobnVtIDEwOyBwdXNoaW50IDM7IGFyaXRoIFxcOyByZXR1cm4gMSIpCithc3NlcnQoYSA9PSAzLjAgYW5kIG1hdGgudHlwZShhKSA9PSAiZmxvYXQiKQorYSA9IFQudGVzdEMoInB1c2hpbnQgMTA7IHB1c2hpbnQgMzsgYXJpdGggXFw7IHJldHVybiAxIikKK2Fzc2VydChhID09IDMgYW5kIG1hdGgudHlwZShhKSA9PSAiaW50ZWdlciIpCithID0gYXNzZXJ0KFQudGVzdEMoInB1c2hpbnQgMTA7IHB1c2hpbnQgMzsgYXJpdGggKzsgcmV0dXJuIDEiKSkKK2Fzc2VydChhID09IDEzIGFuZCBtYXRoLnR5cGUoYSkgPT0gImludGVnZXIiKQorYSA9IGFzc2VydChULnRlc3RDKCJwdXNobnVtIDEwOyBwdXNoaW50IDM7IGFyaXRoICs7IHJldHVybiAxIikpCithc3NlcnQoYSA9PSAxMyBhbmQgbWF0aC50eXBlKGEpID09ICJmbG9hdCIpCithLGIsYyA9IFQudGVzdEMoW1twdXNobnVtIDE7CisgICAgICAgICAgICAgICAgICBwdXNoc3RyaW5nIDEwOyBhcml0aCBfOworICAgICAgICAgICAgICAgICAgcHVzaHN0cmluZyA1OyByZXR1cm4gM11dKQorYXNzZXJ0KGEgPT0gMSBhbmQgYiA9PSAtMTAgYW5kIGMgPT0gIjUiKQorbXQgPSB7X19hZGQgPSBmdW5jdGlvbiAoYSxiKSByZXR1cm4gc2V0bWV0YXRhYmxlKHthWzFdICsgYlsxXX0sIG10KSBlbmQsCisgICAgICBfX21vZCA9IGZ1bmN0aW9uIChhLGIpIHJldHVybiBzZXRtZXRhdGFibGUoe2FbMV0gJSBiWzFdfSwgbXQpIGVuZCwKKyAgICAgIF9fdW5tID0gZnVuY3Rpb24gKGEpIHJldHVybiBzZXRtZXRhdGFibGUoe2FbMV0qIDJ9LCBtdCkgZW5kfQorYSxiLGMgPSBzZXRtZXRhdGFibGUoezR9LCBtdCksCisgICAgICAgIHNldG1ldGF0YWJsZSh7OH0sIG10KSwKKyAgICAgICAgc2V0bWV0YXRhYmxlKHstM30sIG10KQoreCx5LHogPSBULnRlc3RDKCJhcml0aCArOyByZXR1cm4gMiIsIDEwLCBhLCBiKQorYXNzZXJ0KHggPT0gMTAgYW5kIHlbMV0gPT0gMTIgYW5kIHogPT0gbmlsKQorYXNzZXJ0KFQudGVzdEMoImFyaXRoICU7IHJldHVybiAxIiwgYSwgYylbMV0gPT0gNCUtMykKK2Fzc2VydChULnRlc3RDKCJhcml0aCBfOyBhcml0aCArOyBhcml0aCAlOyByZXR1cm4gMSIsIGIsIGEsIGMpWzFdID09CisgICAgICAgICAgICAgICA4ICUgKDQgKyAoLTMpKjIpKQorCistLSBlcnJvcnMgaW4gYXJpdGhtZXRpYworY2hlY2tlcnIoImRpdmlkZSBieSB6ZXJvIiwgVC50ZXN0QywgImFyaXRoIFxcIiwgMTAsIDApCitjaGVja2VycigiJSUwIiwgVC50ZXN0QywgImFyaXRoICUiLCAxMCwgMCkKKworCistLSB0ZXN0aW5nIGxlc3N0aGFuIGFuZCBsZXNzZXF1YWwKK2Fzc2VydChULnRlc3RDKCJjb21wYXJlIExUIDIgNSwgcmV0dXJuIDEiLCAzLCAyLCAyLCA0LCAyLCAyKSkKK2Fzc2VydChULnRlc3RDKCJjb21wYXJlIExFIDIgNSwgcmV0dXJuIDEiLCAzLCAyLCAyLCA0LCAyLCAyKSkKK2Fzc2VydChub3QgVC50ZXN0QygiY29tcGFyZSBMVCAzIDQsIHJldHVybiAxIiwgMywgMiwgMiwgNCwgMiwgMikpCithc3NlcnQoVC50ZXN0QygiY29tcGFyZSBMRSAzIDQsIHJldHVybiAxIiwgMywgMiwgMiwgNCwgMiwgMikpCithc3NlcnQoVC50ZXN0QygiY29tcGFyZSBMVCA1IDIsIHJldHVybiAxIiwgNCwgMiwgMiwgMywgMiwgMikpCithc3NlcnQobm90IFQudGVzdEMoImNvbXBhcmUgTFQgMiAtMywgcmV0dXJuIDEiLCAiNCIsICIyIiwgIjIiLCAiMyIsICIyIiwgIjIiKSkKK2Fzc2VydChub3QgVC50ZXN0QygiY29tcGFyZSBMVCAtMyAyLCByZXR1cm4gMSIsICIzIiwgIjIiLCAiMiIsICI0IiwgIjIiLCAiMiIpKQorCistLSBub24tdmFsaWQgaW5kaWNlcyBwcm9kdWNlIGZhbHNlCithc3NlcnQobm90IFQudGVzdEMoImNvbXBhcmUgTFQgMSA0LCByZXR1cm4gMSIpKQorYXNzZXJ0KG5vdCBULnRlc3RDKCJjb21wYXJlIExFIDkgMSwgcmV0dXJuIDEiKSkKK2Fzc2VydChub3QgVC50ZXN0QygiY29tcGFyZSBFUSA5IDksIHJldHVybiAxIikpCisKK2xvY2FsIGIgPSB7X19sdCA9IGZ1bmN0aW9uIChhLGIpIHJldHVybiBhWzFdIDwgYlsxXSBlbmR9Citsb2NhbCBhMSxhMyxhNCA9IHNldG1ldGF0YWJsZSh7MX0sIGIpLAorICAgICAgICAgICAgICAgICBzZXRtZXRhdGFibGUoezN9LCBiKSwKKyAgICAgICAgICAgICAgICAgc2V0bWV0YXRhYmxlKHs0fSwgYikKK2Fzc2VydChULnRlc3RDKCJjb21wYXJlIExUIDIgNSwgcmV0dXJuIDEiLCBhMywgMiwgMiwgYTQsIDIsIDIpKQorYXNzZXJ0KFQudGVzdEMoImNvbXBhcmUgTEUgMiA1LCByZXR1cm4gMSIsIGEzLCAyLCAyLCBhNCwgMiwgMikpCithc3NlcnQoVC50ZXN0QygiY29tcGFyZSBMVCA1IC02LCByZXR1cm4gMSIsIGE0LCAyLCAyLCBhMywgMiwgMikpCithLGIgPSBULnRlc3RDKCJjb21wYXJlIExUIDUgLTYsIHJldHVybiAyIiwgYTEsIDIsIDIsIGEzLCAyLCAyMCkKK2Fzc2VydChhID09IDIwIGFuZCBiID09IGZhbHNlKQorYSxiID0gVC50ZXN0QygiY29tcGFyZSBMRSA1IC02LCByZXR1cm4gMiIsIGExLCAyLCAyLCBhMywgMiwgMjApCithc3NlcnQoYSA9PSAyMCBhbmQgYiA9PSBmYWxzZSkKK2EsYiA9IFQudGVzdEMoImNvbXBhcmUgTEUgNSAtNiwgcmV0dXJuIDIiLCBhMSwgMiwgMiwgYTEsIDIsIDIwKQorYXNzZXJ0KGEgPT0gMjAgYW5kIGIgPT0gdHJ1ZSkKKworLS0gdGVzdGluZyBsZW5ndGgKK2xvY2FsIHQgPSBzZXRtZXRhdGFibGUoe3ggPSAyMH0sIHtfX2xlbiA9IGZ1bmN0aW9uICh0KSByZXR1cm4gdC54IGVuZH0pCithLGIsYyA9IFQudGVzdEMoW1sKKyAgIGxlbiAyOworICAgTGxlbiAyOworICAgb2Jqc2l6ZSAyOworICAgcmV0dXJuIDMKK11dLCB0KQorYXNzZXJ0KGEgPT0gMjAgYW5kIGIgPT0gMjAgYW5kIGMgPT0gMCkKKwordC54ID0gIjIzNCI7IHRbMV0gPSAyMAorYSxiLGMgPSBULnRlc3RDKFtbCisgICBsZW4gMjsKKyAgIExsZW4gMjsKKyAgIG9ianNpemUgMjsKKyAgIHJldHVybiAzCitdXSwgdCkKK2Fzc2VydChhID09ICIyMzQiIGFuZCBiID09IDIzNCBhbmQgYyA9PSAxKQorCit0LnggPSBwcmludDsgdFsxXSA9IDIwCithLGMgPSBULnRlc3RDKFtbCisgICBsZW4gMjsKKyAgIG9ianNpemUgMjsKKyAgIHJldHVybiAyCitdXSwgdCkKK2Fzc2VydChhID09IHByaW50IGFuZCBjID09IDEpCisKKworLS0gdGVzdGluZyBfX2NvbmNhdAorCithID0gc2V0bWV0YXRhYmxlKHt4PSJ1In0sIHtfX2NvbmNhdCA9IGZ1bmN0aW9uIChhLGIpIHJldHVybiBhLnguLicuJy4uYi54IGVuZH0pCit4LHkgPSBULnRlc3RDKFtbCisgIHB1c2hudW0gNQorICBwdXNodmFsdWUgMjsKKyAgcHVzaHZhbHVlIDI7CisgIGNvbmNhdCAyOworICBwdXNodmFsdWUgLTI7CisgIHJldHVybiAyOworXV0sIGEsIGEpCithc3NlcnQoeCA9PSBhLi5hIGFuZCB5ID09IDUpCisKKy0tIGNvbmNhdCB3aXRoIDAgZWxlbWVudHMKK2Fzc2VydChULnRlc3RDKCJjb25jYXQgMDsgcmV0dXJuIDEiKSA9PSAiIikKKworLS0gY29uY2F0IHdpdGggMSBlbGVtZW50Cithc3NlcnQoVC50ZXN0QygiY29uY2F0IDE7IHJldHVybiAxIiwgInh1eHUiKSA9PSAieHV4dSIpCisKKworCistLSB0ZXN0aW5nIGx1YV9pcworCitmdW5jdGlvbiBCKHgpIHJldHVybiB4IGFuZCAxIG9yIDAgZW5kCisKK2Z1bmN0aW9uIGNvdW50ICh4LCBuKQorICBuID0gbiBvciAyCisgIGxvY2FsIHByb2cgPSBbWworICAgIGlzbnVtYmVyICVkOworICAgIGlzc3RyaW5nICVkOworICAgIGlzZnVuY3Rpb24gJWQ7CisgICAgaXNjZnVuY3Rpb24gJWQ7CisgICAgaXN0YWJsZSAlZDsKKyAgICBpc3VzZXJkYXRhICVkOworICAgIGlzbmlsICVkOworICAgIGlzbnVsbCAlZDsKKyAgICByZXR1cm4gOAorICBdXQorICBwcm9nID0gc3RyaW5nLmZvcm1hdChwcm9nLCBuLCBuLCBuLCBuLCBuLCBuLCBuLCBuKQorICBsb2NhbCBhLGIsYyxkLGUsZixnLGggPSBULnRlc3RDKHByb2csIHgpCisgIHJldHVybiBCKGEpK0IoYikrQihjKStCKGQpK0IoZSkrQihmKStCKGcpKygxMDAqQihoKSkKK2VuZAorCithc3NlcnQoY291bnQoMykgPT0gMikKK2Fzc2VydChjb3VudCgnYWxvJykgPT0gMSkKK2Fzc2VydChjb3VudCgnMzInKSA9PSAyKQorYXNzZXJ0KGNvdW50KHt9KSA9PSAxKQorYXNzZXJ0KGNvdW50KHByaW50KSA9PSAyKQorYXNzZXJ0KGNvdW50KGZ1bmN0aW9uICgpIGVuZCkgPT0gMSkKK2Fzc2VydChjb3VudChuaWwpID09IDEpCithc3NlcnQoY291bnQoaW8uc3RkaW4pID09IDEpCithc3NlcnQoY291bnQobmlsLCAxNSkgPT0gMTAwKQorCisKKy0tIHRlc3RpbmcgbHVhX3RvLi4uCisKK2Z1bmN0aW9uIHRvIChzLCB4LCBuKQorICBuID0gbiBvciAyCisgIHJldHVybiBULnRlc3RDKHN0cmluZy5mb3JtYXQoIiVzICVkOyByZXR1cm4gMSIsIHMsIG4pLCB4KQorZW5kCisKK2xvY2FsIGhmdW5jID0gc3RyaW5nLmdtYXRjaCgiIiwgIiIpICAgIC0tIGEgImhlYXZ5IEMgZnVuY3Rpb24iICh3aXRoIHVwdmFsdWVzKQorYXNzZXJ0KGRlYnVnLmdldHVwdmFsdWUoaGZ1bmMsIDEpKQorYXNzZXJ0KHRvKCJ0b3N0cmluZyIsIHt9KSA9PSBuaWwpCithc3NlcnQodG8oInRvc3RyaW5nIiwgImFsbyIpID09ICJhbG8iKQorYXNzZXJ0KHRvKCJ0b3N0cmluZyIsIDEyKSA9PSAiMTIiKQorYXNzZXJ0KHRvKCJ0b3N0cmluZyIsIDEyLCAzKSA9PSBuaWwpCithc3NlcnQodG8oIm9ianNpemUiLCB7fSkgPT0gMCkKK2Fzc2VydCh0bygib2Jqc2l6ZSIsIHsxLDIsM30pID09IDMpCithc3NlcnQodG8oIm9ianNpemUiLCAiYWxvXDBcMGEiKSA9PSA2KQorYXNzZXJ0KHRvKCJvYmpzaXplIiwgVC5uZXd1c2VyZGF0YSgwKSkgPT0gMCkKK2Fzc2VydCh0bygib2Jqc2l6ZSIsIFQubmV3dXNlcmRhdGEoMTAxKSkgPT0gMTAxKQorYXNzZXJ0KHRvKCJvYmpzaXplIiwgMTI0KSA9PSAwKQorYXNzZXJ0KHRvKCJvYmpzaXplIiwgdHJ1ZSkgPT0gMCkKK2Fzc2VydCh0bygidG9udW1iZXIiLCB7fSkgPT0gMCkKK2Fzc2VydCh0bygidG9udW1iZXIiLCAiMTIiKSA9PSAxMikKK2Fzc2VydCh0bygidG9udW1iZXIiLCAiczIiKSA9PSAwKQorYXNzZXJ0KHRvKCJ0b251bWJlciIsIDEsIDIwKSA9PSAwKQorYXNzZXJ0KHRvKCJ0b3BvaW50ZXIiLCAxMCkgPT0gMCkKK2Fzc2VydCh0bygidG9wb2ludGVyIiwgdHJ1ZSkgPT0gMCkKK2Fzc2VydCh0bygidG9wb2ludGVyIiwgVC5wdXNodXNlcmRhdGEoMjApKSA9PSAyMCkKK2Fzc2VydCh0bygidG9wb2ludGVyIiwgaW8ucmVhZCkgfj0gMCkgICAgICAgICAgIC0tIGxpZ2h0IEMgZnVuY3Rpb24KK2Fzc2VydCh0bygidG9wb2ludGVyIiwgaGZ1bmMpIH49IDApICAgICAgICAtLSAiaGVhdnkiIEMgZnVuY3Rpb24KK2Fzc2VydCh0bygidG9wb2ludGVyIiwgZnVuY3Rpb24gKCkgZW5kKSB+PSAwKSAgIC0tIEx1YSBmdW5jdGlvbgorYXNzZXJ0KHRvKCJ0b3BvaW50ZXIiLCBpby5zdGRpbikgfj0gMCkgICAtLSBmdWxsIHVzZXJkYXRhCithc3NlcnQodG8oImZ1bmMybnVtIiwgMjApID09IDApCithc3NlcnQodG8oImZ1bmMybnVtIiwgVC5wdXNodXNlcmRhdGEoMTApKSA9PSAwKQorYXNzZXJ0KHRvKCJmdW5jMm51bSIsIGlvLnJlYWQpIH49IDApICAgICAtLSBsaWdodCBDIGZ1bmN0aW9uCithc3NlcnQodG8oImZ1bmMybnVtIiwgaGZ1bmMpIH49IDApICAtLSAiaGVhdnkiIEMgZnVuY3Rpb24gKHdpdGggdXB2YWx1ZSkKK2EgPSB0bygidG9jZnVuY3Rpb24iLCBtYXRoLmRlZykKK2Fzc2VydChhKDMpID09IG1hdGguZGVnKDMpIGFuZCBhID09IG1hdGguZGVnKQorCisKK3ByaW50KCJ0ZXN0aW5nIHBhbmljIGZ1bmN0aW9uIikKK2RvCisgIC0tIHRyaXZpYWwgZXJyb3IKKyAgYXNzZXJ0KFQuY2hlY2twYW5pYygicHVzaHN0cmluZyBoaTsgZXJyb3IiKSA9PSAiaGkiKQorCisgIC0tIHVzaW5nIHRoZSBzdGFjayBpbnNpZGUgcGFuaWMKKyAgYXNzZXJ0KFQuY2hlY2twYW5pYygicHVzaHN0cmluZyBoaTsgZXJyb3I7IiwKKyAgICBbW2NoZWNrc3RhY2sgNSBYWAorICAgICAgcHVzaHN0cmluZyAnIGFsbycKKyAgICAgIHB1c2hzdHJpbmcgJyBtdW5kbycKKyAgICAgIGNvbmNhdCAzXV0pID09ICJoaSBhbG8gbXVuZG8iKQorCisgIC0tICJhcmdlcnJvciIgd2l0aG91dCBmcmFtZXMKKyAgYXNzZXJ0KFQuY2hlY2twYW5pYygibG9hZHN0cmluZyA0IikgPT0KKyAgICAgICJiYWQgYXJndW1lbnQgIzQgKHN0cmluZyBleHBlY3RlZCwgZ290IG5vIHZhbHVlKSIpCisgIAorCisgIC0tIG1lbW9yeSBlcnJvcgorICBULnRvdGFsbWVtKFQudG90YWxtZW0oKSsxMDAwMCkgICAtLSBzZXQgbG93IG1lbW9yeSBsaW1pdCAoKzEwaykKKyAgYXNzZXJ0KFQuY2hlY2twYW5pYygibmV3dXNlcmRhdGEgMjAwMDAiKSA9PSAibm90IGVub3VnaCBtZW1vcnkiKQorICBULnRvdGFsbWVtKDApICAgICAgICAgIC0tIHJlc3RvcmUgaGlnaCBsaW1pdAorCisgIC0tIHN0YWNrIGVycm9yCisgIGlmIG5vdCBfc29mdCB0aGVuCisgICAgbG9jYWwgbXNnID0gVC5jaGVja3BhbmljW1sKKyAgICAgIHB1c2hzdHJpbmcgImZ1bmN0aW9uIGYoKSBmKCkgZW5kIgorICAgICAgbG9hZHN0cmluZyAtMTsgY2FsbCAwIDAKKyAgICAgIGdldGdsb2JhbCBmOyBjYWxsIDAgMAorICAgIF1dCisgICAgYXNzZXJ0KHN0cmluZy5maW5kKG1zZywgInN0YWNrIG92ZXJmbG93IikpCisgIGVuZAorCitlbmQKKworLS0gdGVzdGluZyBkZWVwIEMgc3RhY2sKK2lmIG5vdCBfc29mdCB0aGVuCisgIHByaW50KCJ0ZXN0aW5nIHN0YWNrIG92ZXJmbG93IikKKyAgY29sbGVjdGdhcmJhZ2UoInN0b3AiKQorICBjaGVja2VycigiWFhYWCIsIFQudGVzdEMsICJjaGVja3N0YWNrIDEwMDAwMjMgWFhYWCIpICAgLS0gdG9vIGRlZXAKKyAgLS0gdG9vIGRlZXAgKHdpdGggbm8gbWVzc2FnZSkKKyAgY2hlY2tlcnIoIl5zdGFjayBvdmVyZmxvdyQiLCBULnRlc3RDLCAiY2hlY2tzdGFjayAxMDAwMDIzICcnIikKKyAgbG9jYWwgcyA9IHN0cmluZy5yZXAoInB1c2huaWw7Y2hlY2tzdGFjayAxIFhYOyIsIDEwMDAwMDApCisgIGNoZWNrZXJyKCJvdmVyZmxvdyIsIFQudGVzdEMsIHMpCisgIGNvbGxlY3RnYXJiYWdlKCJyZXN0YXJ0IikKKyAgcHJpbnQnKycKK2VuZAorCitsb2NhbCBsaW0gPSBfc29mdCBhbmQgNTAwIG9yIDEyMDAwCitsb2NhbCBwcm9nID0geyJjaGVja3N0YWNrICIgLi4gKGxpbSAqIDIgKyAxMDApIC4uICJtc2ciLCAibmV3dGFibGUifQorZm9yIGkgPSAxLGxpbSBkbworICBwcm9nWyNwcm9nICsgMV0gPSAicHVzaG51bSAiIC4uIGkKKyAgcHJvZ1sjcHJvZyArIDFdID0gInB1c2hudW0gIiAuLiBpICogMTAKK2VuZAorCitwcm9nWyNwcm9nICsgMV0gPSAicmF3Z2V0aSBSIDIiICAgLS0gZ2V0IGdsb2JhbCB0YWJsZSBpbiByZWdpc3RyeQorcHJvZ1sjcHJvZyArIDFdID0gImluc2VydCAiIC4uIC0oMipsaW0gKyAyKQorCitmb3IgaSA9IDEsbGltIGRvCisgIHByb2dbI3Byb2cgKyAxXSA9ICJzZXR0YWJsZSAiIC4uIC0oMioobGltIC0gaSArIDEpICsgMSkKK2VuZAorCitwcm9nWyNwcm9nICsgMV0gPSAicmV0dXJuIDIiCisKK3Byb2cgPSB0YWJsZS5jb25jYXQocHJvZywgIjsiKQorbG9jYWwgZywgdCA9IFQudGVzdEMocHJvZykKK2Fzc2VydChnID09IF9HKQorZm9yIGkgPSAxLGxpbSBkbyBhc3NlcnQodFtpXSA9PSBpKjEwKTsgdFtpXSA9IHVuZGVmIGVuZAorYXNzZXJ0KG5leHQodCkgPT0gbmlsKQorcHJvZywgZywgdCA9IG5pbAorCistLSB0ZXN0aW5nIGVycm9ycworCithID0gVC50ZXN0QyhbWworICBsb2Fkc3RyaW5nIDI7IHBjYWxsIDAgMSAwOworICBwdXNodmFsdWUgMzsgaW5zZXJ0IC0yOyBwY2FsbCAxIDEgMDsKKyAgcGNhbGwgMCAwIDA7CisgIHJldHVybiAxCitdXSwgIng9MTUwIiwgZnVuY3Rpb24gKGEpIGFzc2VydChhPT1uaWwpOyByZXR1cm4gMyBlbmQpCisKK2Fzc2VydCh0eXBlKGEpID09ICdzdHJpbmcnIGFuZCB4ID09IDE1MCkKKworZnVuY3Rpb24gY2hlY2szKHAsIC4uLikKKyAgbG9jYWwgYXJnID0gey4uLn0KKyAgYXNzZXJ0KCNhcmcgPT0gMykKKyAgYXNzZXJ0KHN0cmluZy5maW5kKGFyZ1szXSwgcCkpCitlbmQKK2NoZWNrMygiOjE6IiwgVC50ZXN0QygibG9hZHN0cmluZyAyOyByZXR1cm4gKiIsICJ4PSIpKQorY2hlY2szKCIlLiIsIFQudGVzdEMoImxvYWRmaWxlIDI7IHJldHVybiAqIiwgIi4iKSkKK2NoZWNrMygieHh4eCIsIFQudGVzdEMoImxvYWRmaWxlIDI7IHJldHVybiAqIiwgInh4eHgiKSkKKworLS0gdGVzdCBlcnJvcnMgaW4gbm9uIHByb3RlY3RlZCB0aHJlYWRzCitmdW5jdGlvbiBjaGVja2Vycm5vcHJvIChjb2RlLCBtc2cpCisgIGxvY2FsIHRoID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoKSBlbmQpICAtLSBjcmVhdGUgbmV3IHRocmVhZAorICBsb2NhbCBzdHQsIGVyciA9IHBjYWxsKFQudGVzdEMsIHRoLCBjb2RlKSAgIC0tIHJ1biBjb2RlIHRoZXJlCisgIGFzc2VydChub3Qgc3R0IGFuZCBzdHJpbmcuZmluZChlcnIsIG1zZykpCitlbmQKKworaWYgbm90IF9zb2Z0IHRoZW4KKyAgY2hlY2tlcnJub3BybygicHVzaG51bSAzOyBjYWxsIDAgMCIsICJhdHRlbXB0IHRvIGNhbGwiKQorICBwcmludCJ0ZXN0aW5nIHN0YWNrIG92ZXJmbG93IGluIHVucHJvdGVjdGVkIHRocmVhZCIKKyAgZnVuY3Rpb24gZiAoKSBmKCkgZW5kCisgIGNoZWNrZXJybm9wcm8oImdldGdsb2JhbCAnZic7IGNhbGwgMCAwOyIsICJzdGFjayBvdmVyZmxvdyIpCitlbmQKK3ByaW50IisiCisKKworLS0gdGVzdGluZyB0YWJsZSBhY2Nlc3MKKworZG8gICAtLSBnZXRwL3NldHAKKyAgbG9jYWwgYSA9IHt9CisgIFQudGVzdEMoInJhd3NldHAgMiAxIiwgYSwgMjApCisgIGFzc2VydChhW1QucHVzaHVzZXJkYXRhKDEpXSA9PSAyMCkKKyAgYXNzZXJ0KFQudGVzdEMoInJhd2dldHAgMiAxOyByZXR1cm4gMSIsIGEpID09IDIwKQorZW5kCisKK2EgPSB7eD0wLCB5PTEyfQoreCwgeSA9IFQudGVzdEMoImdldHRhYmxlIDI7IHB1c2h2YWx1ZSA0OyBnZXR0YWJsZSAyOyByZXR1cm4gMiIsCisgICAgICAgICAgICAgICAgYSwgMywgInkiLCA0LCAieCIpCithc3NlcnQoeCA9PSAwIGFuZCB5ID09IDEyKQorVC50ZXN0Qygic2V0dGFibGUgLTUiLCBhLCAzLCA0LCAieCIsIDE1KQorYXNzZXJ0KGEueCA9PSAxNSkKK2FbYV0gPSBwcmludAoreCA9IFQudGVzdEMoImdldHRhYmxlIDI7IHJldHVybiAxIiwgYSkgIC0tIHRhYmxlIGFuZCBrZXkgYXJlIHRoZSBzYW1lIG9iamVjdCEKK2Fzc2VydCh4ID09IHByaW50KQorVC50ZXN0Qygic2V0dGFibGUgMiIsIGEsICJ4IikgICAgLS0gdGFibGUgYW5kIGtleSBhcmUgdGhlIHNhbWUgb2JqZWN0IQorYXNzZXJ0KGFbYV0gPT0gIngiKQorCitiID0gc2V0bWV0YXRhYmxlKHtwID0gYX0sIHt9KQorZ2V0bWV0YXRhYmxlKGIpLl9faW5kZXggPSBmdW5jdGlvbiAodCwgaSkgcmV0dXJuIHQucFtpXSBlbmQKK2ssIHggPSBULnRlc3RDKCJnZXR0YWJsZSAzLCByZXR1cm4gMiIsIDQsIGIsIDIwLCAzNSwgIngiKQorYXNzZXJ0KHggPT0gMTUgYW5kIGsgPT0gMzUpCitrID0gVC50ZXN0QygiZ2V0ZmllbGQgMiB5LCByZXR1cm4gMSIsIGIpCithc3NlcnQoayA9PSAxMikKK2dldG1ldGF0YWJsZShiKS5fX2luZGV4ID0gZnVuY3Rpb24gKHQsIGkpIHJldHVybiBhW2ldIGVuZAorZ2V0bWV0YXRhYmxlKGIpLl9fbmV3aW5kZXggPSBmdW5jdGlvbiAodCwgaSx2ICkgYVtpXSA9IHYgZW5kCit5ID0gVC50ZXN0QygiaW5zZXJ0IDI7IGdldHRhYmxlIC01OyByZXR1cm4gMSIsIDIsIDMsIDQsICJ5IiwgYikKK2Fzc2VydCh5ID09IDEyKQorayA9IFQudGVzdEMoInNldHRhYmxlIC01LCByZXR1cm4gMSIsIGIsIDMsIDQsICJ4IiwgMTYpCithc3NlcnQoYS54ID09IDE2IGFuZCBrID09IDQpCithW2JdID0gJ3h1eHUnCit5ID0gVC50ZXN0QygiZ2V0dGFibGUgMiwgcmV0dXJuIDEiLCBiKQorYXNzZXJ0KHkgPT0gJ3h1eHUnKQorVC50ZXN0Qygic2V0dGFibGUgMiIsIGIsIDE5KQorYXNzZXJ0KGFbYl0gPT0gMTkpCisKKy0tCitkbyAgIC0tIHRlc3RpbmcgZ2V0ZmllbGQvc2V0ZmllbGQgd2l0aCBsb25nIGtleXMKKyAgbG9jYWwgdCA9IHtfMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5ID0gMzJ9CisgIGxvY2FsIGEgPSBULnRlc3RDKFtbCisgICAgZ2V0ZmllbGQgMiBfMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CisgICAgcmV0dXJuIDEKKyAgXV0sIHQpCisgIGFzc2VydChhID09IDMyKQorICBsb2NhbCBhID0gVC50ZXN0QyhbWworICAgIHB1c2hudW0gMzMKKyAgICBzZXRnbG9iYWwgXzAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorICBdXSkKKyAgYXNzZXJ0KF8wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkgPT0gMzMpCisgIF8wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkgPSBuaWwKK2VuZAorCistLSB0ZXN0aW5nIG5leHQKK2EgPSB7fQordCA9IHBhY2soVC50ZXN0QygibmV4dDsgcmV0dXJuICoiLCBhLCBuaWwpKQordGNoZWNrKHQsIHtuPTEsYX0pCithID0ge2E9M30KK3QgPSBwYWNrKFQudGVzdEMoIm5leHQ7IHJldHVybiAqIiwgYSwgbmlsKSkKK3RjaGVjayh0LCB7bj0zLGEsJ2EnLDN9KQordCA9IHBhY2soVC50ZXN0QygibmV4dDsgcG9wIDE7IG5leHQ7IHJldHVybiAqIiwgYSwgbmlsKSkKK3RjaGVjayh0LCB7bj0xLGF9KQorCisKKworLS0gdGVzdGluZyB1cHZhbHVlcworCitkbworICBsb2NhbCBBID0gVC50ZXN0Q1tbIHB1c2hudW0gMTA7IHB1c2hudW0gMjA7IHB1c2hjY2xvc3VyZSAyOyByZXR1cm4gMV1dCisgIHQsIGIsIGMgPSBBKFtbcHVzaHZhbHVlIFUwOyBwdXNodmFsdWUgVTE7IHB1c2h2YWx1ZSBVMjsgcmV0dXJuIDNdXSkKKyAgYXNzZXJ0KGIgPT0gMTAgYW5kIGMgPT0gMjAgYW5kIHR5cGUodCkgPT0gJ3RhYmxlJykKKyAgYSwgYiA9IEEoW1t0b3N0cmluZyBVMzsgdG9udW1iZXIgVTQ7IHJldHVybiAyXV0pCisgIGFzc2VydChhID09IG5pbCBhbmQgYiA9PSAwKQorICBBKFtbcHVzaG51bSAxMDA7IHB1c2hudW0gMjAwOyByZXBsYWNlIFUyOyByZXBsYWNlIFUxXV0pCisgIGIsIGMgPSBBKFtbcHVzaHZhbHVlIFUxOyBwdXNodmFsdWUgVTI7IHJldHVybiAyXV0pCisgIGFzc2VydChiID09IDEwMCBhbmQgYyA9PSAyMDApCisgIEEoW1tyZXBsYWNlIFUyOyByZXBsYWNlIFUxXV0sIHt4PTF9LCB7eD0yfSkKKyAgYiwgYyA9IEEoW1twdXNodmFsdWUgVTE7IHB1c2h2YWx1ZSBVMjsgcmV0dXJuIDJdXSkKKyAgYXNzZXJ0KGIueCA9PSAxIGFuZCBjLnggPT0gMikKKyAgVC5jaGVja21lbW9yeSgpCitlbmQKKworCistLSB0ZXN0aW5nIGFic2VudCB1cHZhbHVlcyBmcm9tIEMtZnVuY3Rpb24gcG9pbnRlcnMKK2Fzc2VydChULnRlc3RDW1tpc251bGwgVTE7IHJldHVybiAxXV0gPT0gdHJ1ZSkKK2Fzc2VydChULnRlc3RDW1tpc251bGwgVTEwMDsgcmV0dXJuIDFdXSA9PSB0cnVlKQorYXNzZXJ0KFQudGVzdENbW3B1c2h2YWx1ZSBVMTsgcmV0dXJuIDFdXSA9PSBuaWwpCisKK2xvY2FsIGYgPSBULnRlc3RDW1sgcHVzaG51bSAxMDsgcHVzaG51bSAyMDsgcHVzaGNjbG9zdXJlIDI7IHJldHVybiAxXV0KK2Fzc2VydChULnVwdmFsdWUoZiwgMSkgPT0gMTAgYW5kCisgICAgICAgVC51cHZhbHVlKGYsIDIpID09IDIwIGFuZAorICAgICAgIFQudXB2YWx1ZShmLCAzKSA9PSBuaWwpCitULnVwdmFsdWUoZiwgMiwgInh1eHUiKQorYXNzZXJ0KFQudXB2YWx1ZShmLCAyKSA9PSAieHV4dSIpCisKKworLS0gbGFyZ2UgY2xvc3VyZXMKK2RvCisgIGxvY2FsIEEgPSAiY2hlY2tzdGFjayAzMDAgbXNnOyIgLi4KKyAgICAgICAgICAgIHN0cmluZy5yZXAoInB1c2hudW0gMTA7IiwgMjU1KSAuLgorICAgICAgICAgICAgInB1c2hjY2xvc3VyZSAyNTU7IHJldHVybiAxIgorICBBID0gVC50ZXN0QyhBKQorICBmb3IgaT0xLDI1NSBkbworICAgIGFzc2VydChBKCgicHVzaHZhbHVlIFUlZDsgcmV0dXJuIDEiKTpmb3JtYXQoaSkpID09IDEwKQorICBlbmQKKyAgYXNzZXJ0KEEoImlzbnVsbCBVMjU2OyByZXR1cm4gMSIpKQorICBhc3NlcnQobm90IEEoImlzbmlsIFUyNTY7IHJldHVybiAxIikpCitlbmQKKworCisKKy0tIHRlc3RpbmcgZ2V0L3NldHVzZXJ2YWx1ZQorLS0gYnVnIGluIDUuMS4yCitjaGVja2VycigiZ290IG51bWJlciIsIGRlYnVnLnNldHVzZXJ2YWx1ZSwgMywge30pCitjaGVja2VycigiZ290IG5pbCIsIGRlYnVnLnNldHVzZXJ2YWx1ZSwgbmlsLCB7fSkKK2NoZWNrZXJyKCJnb3QgbGlnaHQgdXNlcmRhdGEiLCBkZWJ1Zy5zZXR1c2VydmFsdWUsIFQucHVzaHVzZXJkYXRhKDEpLCB7fSkKKworLS0gdGVzdGluZyBtdWx0aXBsZSB1c2VyIHZhbHVlcworbG9jYWwgYiA9IFQubmV3dXNlcmRhdGEoMCwgMTApCitmb3IgaSA9IDEsIDEwIGRvCisgIGxvY2FsIHYsIHAgPSBkZWJ1Zy5nZXR1c2VydmFsdWUoYiwgaSkKKyAgYXNzZXJ0KHYgPT0gbmlsIGFuZCBwKQorZW5kCitkbyAgIC0tIGluZGljZXMgb3V0IG9mIHJhbmdlCisgIGxvY2FsIHYsIHAgPSBkZWJ1Zy5nZXR1c2VydmFsdWUoYiwgLTIpCisgIGFzc2VydCh2ID09IG5pbCBhbmQgbm90IHApCisgIGxvY2FsIHYsIHAgPSBkZWJ1Zy5nZXR1c2VydmFsdWUoYiwgMTEpCisgIGFzc2VydCh2ID09IG5pbCBhbmQgbm90IHApCitlbmQKK2xvY2FsIHQgPSB7dHJ1ZSwgZmFsc2UsIDQuNTYsIHByaW50LCB7fSwgYiwgIlhZWiJ9Citmb3IgaywgdiBpbiBpcGFpcnModCkgZG8KKyAgZGVidWcuc2V0dXNlcnZhbHVlKGIsIHYsIGspCitlbmQKK2ZvciBrLCB2IGluIGlwYWlycyh0KSBkbworICBsb2NhbCB2MSwgcCA9IGRlYnVnLmdldHVzZXJ2YWx1ZShiLCBrKQorICBhc3NlcnQodjEgPT0gdiBhbmQgcCkKK2VuZAorCithc3NlcnQoZGVidWcuZ2V0dXNlcnZhbHVlKDQpID09IG5pbCkKKworZGVidWcuc2V0dXNlcnZhbHVlKGIsIGZ1bmN0aW9uICgpIHJldHVybiAxMCBlbmQsIDEwKQorY29sbGVjdGdhcmJhZ2UoKSAgIC0tIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY29sbGVjdGVkCithc3NlcnQoZGVidWcuZ2V0dXNlcnZhbHVlKGIsIDEwKSgpID09IDEwKQorCitkZWJ1Zy5zZXR1c2VydmFsdWUoYiwgMTM0KQorY29sbGVjdGdhcmJhZ2UoKSAgIC0tIG51bWJlciBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBmb3IgY29sbGVjdG9yCithc3NlcnQoZGVidWcuZ2V0dXNlcnZhbHVlKGIpID09IDEzNCkKKworCistLSB0ZXN0IGJhcnJpZXIgZm9yIHVzZXJ2YWx1ZXMKK2RvCisgIGxvY2FsIG9sZG1vZGUgPSBjb2xsZWN0Z2FyYmFnZSgiaW5jcmVtZW50YWwiKQorICBULmdjc3RhdGUoImF0b21pYyIpCisgIGFzc2VydChULmdjY29sb3IoYikgPT0gImJsYWNrIikKKyAgZGVidWcuc2V0dXNlcnZhbHVlKGIsIHt4ID0gMTAwfSkKKyAgVC5nY3N0YXRlKCJwYXVzZSIpICAtLSBjb21wbGV0ZSBjb2xsZWN0aW9uCisgIGFzc2VydChkZWJ1Zy5nZXR1c2VydmFsdWUoYikueCA9PSAxMDApICAtLSB1dmFsdWUgc2hvdWxkIGJlIHRoZXJlCisgIGNvbGxlY3RnYXJiYWdlKG9sZG1vZGUpCitlbmQKKworLS0gbG9uZyBjaGFpbiBvZiB1c2VyZGF0YQorZm9yIGkgPSAxLCAxMDAwIGRvCisgIGxvY2FsIGJiID0gVC5uZXd1c2VyZGF0YSgwLCAxKQorICBkZWJ1Zy5zZXR1c2VydmFsdWUoYmIsIGIpCisgIGIgPSBiYgorZW5kCitjb2xsZWN0Z2FyYmFnZSgpICAgICAtLSBub3RoaW5nIHNob3VsZCBub3QgYmUgY29sbGVjdGVkCitmb3IgaSA9IDEsIDEwMDAgZG8KKyAgYiA9IGRlYnVnLmdldHVzZXJ2YWx1ZShiKQorZW5kCithc3NlcnQoZGVidWcuZ2V0dXNlcnZhbHVlKGIpLnggPT0gMTAwKQorYiA9IG5pbAorCisKKy0tIHRlc3RpbmcgbG9ja3MgKHJlZnMpCisKKy0tIHJldXNlIG9mIHJlZmVyZW5jZXMKK2xvY2FsIGkgPSBULnJlZnt9CitULnVucmVmKGkpCithc3NlcnQoVC5yZWZ7fSA9PSBpKQorCitBcnIgPSB7fQorTGltID0gMTAwCitmb3IgaT0xLExpbSBkbyAgIC0tIGxvY2sgbWFueSBvYmplY3RzCisgIEFycltpXSA9IFQucmVmKHt9KQorZW5kCisKK2Fzc2VydChULnJlZihuaWwpID09IC0xIGFuZCBULmdldHJlZigtMSkgPT0gbmlsKQorVC51bnJlZigtMSk7IFQudW5yZWYoLTEpCisKK2ZvciBpPTEsTGltIGRvICAgLS0gdW5sb2NrIGFsbCB0aGVtCisgIFQudW5yZWYoQXJyW2ldKQorZW5kCisKK2Z1bmN0aW9uIHByaW50bG9ja3MgKCkKKyAgbG9jYWwgZiA9IFQubWFrZUNmdW5jKCJnZXR0YWJsZSBSOyByZXR1cm4gMSIpCisgIGxvY2FsIG4gPSBmKCJuIikKKyAgcHJpbnQoIm4iLCBuKQorICBmb3IgaT0wLG4gZG8KKyAgICBwcmludChpLCBmKGkpKQorICBlbmQKK2VuZAorCisKK2ZvciBpPTEsTGltIGRvICAgLS0gbG9jayBtYW55IG9iamVjdHMKKyAgQXJyW2ldID0gVC5yZWYoe30pCitlbmQKKworZm9yIGk9MSxMaW0sMiBkbyAgIC0tIHVubG9jayBoYWxmIG9mIHRoZW0KKyAgVC51bnJlZihBcnJbaV0pCitlbmQKKworYXNzZXJ0KHR5cGUoVC5nZXRyZWYoQXJyWzJdKSkgPT0gJ3RhYmxlJykKKworCithc3NlcnQoVC5nZXRyZWYoLTEpID09IG5pbCkKKworCithID0gVC5yZWYoe30pCisKK2NvbGxlY3RnYXJiYWdlKCkKKworYXNzZXJ0KHR5cGUoVC5nZXRyZWYoYSkpID09ICd0YWJsZScpCisKKworLS0gY29sZWN0IGluIGNsIHRoZSBgdmFsJyBvZiBhbGwgY29sbGVjdGVkIHVzZXJkYXRhCit0dCA9IHt9CitjbCA9IHtuPTB9CitBID0gbmlsOyBCID0gbmlsCitsb2NhbCBGCitGID0gZnVuY3Rpb24gKHgpCisgIGxvY2FsIHVkdmFsID0gVC51ZGF0YXZhbCh4KQorICB0YWJsZS5pbnNlcnQoY2wsIHVkdmFsKQorICBsb2NhbCBkID0gVC5uZXd1c2VyZGF0YSgxMDApICAgLS0gY3JlYXRlIGdhcmJhZ2UKKyAgZCA9IG5pbAorICBhc3NlcnQoZGVidWcuZ2V0bWV0YXRhYmxlKHgpLl9fZ2MgPT0gRikKKyAgYXNzZXJ0KGxvYWQoInRhYmxlLmluc2VydCh7fSwge30pIikpKCkgICAtLSBjcmVhdGUgbW9yZSBnYXJiYWdlCisgIGNvbGxlY3RnYXJiYWdlKCkgICAtLSBmb3JjZSBhIEdDIGR1cmluZyBHQworICBhc3NlcnQoZGVidWcuZ2V0bWV0YXRhYmxlKHgpLl9fZ2MgPT0gRikgIC0tIHByZXZpb3VzIEdDIGRpZCBub3QgbWVzcyB0aGlzPworICBsb2NhbCBkdW1teSA9IHt9ICAgIC0tIGNyZWF0ZSBtb3JlIGdhcmJhZ2UgZHVyaW5nIEdDCisgIGlmIEEgfj0gbmlsIHRoZW4KKyAgICBhc3NlcnQodHlwZShBKSA9PSAidXNlcmRhdGEiKQorICAgIGFzc2VydChULnVkYXRhdmFsKEEpID09IEIpCisgICAgZGVidWcuZ2V0bWV0YXRhYmxlKEEpICAgIC0tIGp1c3QgYWNlc3MgaXQKKyAgZW5kCisgIEEgPSB4ICAgLS0gcmVzc3VjaXRhIHVzZXJkYXRhCisgIEIgPSB1ZHZhbAorICByZXR1cm4gMSwyLDMKK2VuZAordHQuX19nYyA9IEYKKworLS0gdGVzdCB3aGV0aGVyIHVkYXRlIGNvbGxlY3Rpb24gZnJlZXMgbWVtb3J5IGluIHRoZSByaWdodCB0aW1lCitkbworICBjb2xsZWN0Z2FyYmFnZSgpOworICBjb2xsZWN0Z2FyYmFnZSgpOworICBsb2NhbCB4ID0gY29sbGVjdGdhcmJhZ2UoImNvdW50Iik7CisgIGxvY2FsIGEgPSBULm5ld3VzZXJkYXRhKDUwMDEpCisgIGFzc2VydChULnRlc3RDKCJvYmpzaXplIDI7IHJldHVybiAxIiwgYSkgPT0gNTAwMSkKKyAgYXNzZXJ0KGNvbGxlY3RnYXJiYWdlKCJjb3VudCIpID49IHgrNCkKKyAgYSA9IG5pbAorICBjb2xsZWN0Z2FyYmFnZSgpOworICBhc3NlcnQoY29sbGVjdGdhcmJhZ2UoImNvdW50IikgPD0geCsxKQorICAtLSB1ZGF0YSB3aXRob3V0IGZpbmFsaXplcgorICB4ID0gY29sbGVjdGdhcmJhZ2UoImNvdW50IikKKyAgY29sbGVjdGdhcmJhZ2UoInN0b3AiKQorICBmb3IgaT0xLDEwMDAgZG8gVC5uZXd1c2VyZGF0YSgwKSBlbmQKKyAgYXNzZXJ0KGNvbGxlY3RnYXJiYWdlKCJjb3VudCIpID4geCsxMCkKKyAgY29sbGVjdGdhcmJhZ2UoKQorICBhc3NlcnQoY29sbGVjdGdhcmJhZ2UoImNvdW50IikgPD0geCsxKQorICAtLSB1ZGF0YSB3aXRoIGZpbmFsaXplcgorICBjb2xsZWN0Z2FyYmFnZSgpCisgIHggPSBjb2xsZWN0Z2FyYmFnZSgiY291bnQiKQorICBjb2xsZWN0Z2FyYmFnZSgic3RvcCIpCisgIGEgPSB7X19nYyA9IGZ1bmN0aW9uICgpIGVuZH0KKyAgZm9yIGk9MSwxMDAwIGRvIGRlYnVnLnNldG1ldGF0YWJsZShULm5ld3VzZXJkYXRhKDApLCBhKSBlbmQKKyAgYXNzZXJ0KGNvbGxlY3RnYXJiYWdlKCJjb3VudCIpID49IHgrMTApCisgIGNvbGxlY3RnYXJiYWdlKCkgIC0tIHRoaXMgY29sbGVjdGlvbiBvbmx5IGNhbGxzIFRNLCB3aXRob3V0IGZyZWVpbmcgbWVtb3J5CisgIGFzc2VydChjb2xsZWN0Z2FyYmFnZSgiY291bnQiKSA+PSB4KzEwKQorICBjb2xsZWN0Z2FyYmFnZSgpICAtLSBub3cgZnJlZXMgbWVtb3J5CisgIGFzc2VydChjb2xsZWN0Z2FyYmFnZSgiY291bnQiKSA8PSB4KzEpCisgIGNvbGxlY3RnYXJiYWdlKCJyZXN0YXJ0IikKK2VuZAorCisKK2NvbGxlY3RnYXJiYWdlKCJzdG9wIikKKworLS0gY3JlYXRlIDMgdXNlcmRhdGFzIHdpdGggdGFnIGB0dCcKK2EgPSBULm5ld3VzZXJkYXRhKDApOyBkZWJ1Zy5zZXRtZXRhdGFibGUoYSwgdHQpOyBuYSA9IFQudWRhdGF2YWwoYSkKK2IgPSBULm5ld3VzZXJkYXRhKDApOyBkZWJ1Zy5zZXRtZXRhdGFibGUoYiwgdHQpOyBuYiA9IFQudWRhdGF2YWwoYikKK2MgPSBULm5ld3VzZXJkYXRhKDApOyBkZWJ1Zy5zZXRtZXRhdGFibGUoYywgdHQpOyBuYyA9IFQudWRhdGF2YWwoYykKKworLS0gY3JlYXRlIHVzZXJkYXRhIHdpdGhvdXQgbWV0YSB0YWJsZQoreCA9IFQubmV3dXNlcmRhdGEoNCkKK3kgPSBULm5ld3VzZXJkYXRhKDApCisKK2NoZWNrZXJyKCJGSUxFJSogZXhwZWN0ZWQsIGdvdCB1c2VyZGF0YSIsIGlvLmlucHV0LCBhKQorY2hlY2tlcnIoIkZJTEUlKiBleHBlY3RlZCwgZ290IHVzZXJkYXRhIiwgaW8uaW5wdXQsIHgpCisKK2Fzc2VydChkZWJ1Zy5nZXRtZXRhdGFibGUoeCkgPT0gbmlsIGFuZCBkZWJ1Zy5nZXRtZXRhdGFibGUoeSkgPT0gbmlsKQorCitkPVQucmVmKGEpOworZT1ULnJlZihiKTsKK2Y9VC5yZWYoYyk7Cit0ID0ge1QuZ2V0cmVmKGQpLCBULmdldHJlZihlKSwgVC5nZXRyZWYoZil9Cithc3NlcnQodFsxXSA9PSBhIGFuZCB0WzJdID09IGIgYW5kIHRbM10gPT0gYykKKwordD1uaWw7IGE9bmlsOyBjPW5pbDsKK1QudW5yZWYoZSk7IFQudW5yZWYoZikKKworY29sbGVjdGdhcmJhZ2UoKQorCistLSBjaGVjayB0aGF0IHVucmVmIG9iamVjdHMgaGF2ZSBiZWVuIGNvbGxlY3RlZAorYXNzZXJ0KCNjbCA9PSAxIGFuZCBjbFsxXSA9PSBuYykKKworeCA9IFQuZ2V0cmVmKGQpCithc3NlcnQodHlwZSh4KSA9PSAndXNlcmRhdGEnIGFuZCBkZWJ1Zy5nZXRtZXRhdGFibGUoeCkgPT0gdHQpCit4ID1uaWwKK3R0LmIgPSBiICAtLSBjcmVhdGUgY3ljbGUKK3R0PW5pbCAgICAtLSBmcmVlcyB0dCBmb3IgR0MKK0EgPSBuaWwKK2IgPSBuaWwKK1QudW5yZWYoZCk7CituNSA9IFQubmV3dXNlcmRhdGEoMCkKK2RlYnVnLnNldG1ldGF0YWJsZShuNSwge19fZ2M9Rn0pCituNSA9IFQudWRhdGF2YWwobjUpCitjb2xsZWN0Z2FyYmFnZSgpCithc3NlcnQoI2NsID09IDQpCistLSBjaGVjayBvcmRlciBvZiBjb2xsZWN0aW9uCithc3NlcnQoY2xbMl0gPT0gbjUgYW5kIGNsWzNdID09IG5iIGFuZCBjbFs0XSA9PSBuYSkKKworY29sbGVjdGdhcmJhZ2UicmVzdGFydCIKKworCithLCBuYSA9IHt9LCB7fQorZm9yIGk9MzAsMSwtMSBkbworICBhW2ldID0gVC5uZXd1c2VyZGF0YSgwKQorICBkZWJ1Zy5zZXRtZXRhdGFibGUoYVtpXSwge19fZ2M9Rn0pCisgIG5hW2ldID0gVC51ZGF0YXZhbChhW2ldKQorZW5kCitjbCA9IHt9CithID0gbmlsOyBjb2xsZWN0Z2FyYmFnZSgpCithc3NlcnQoI2NsID09IDMwKQorZm9yIGk9MSwzMCBkbyBhc3NlcnQoY2xbaV0gPT0gbmFbaV0pIGVuZAorbmEgPSBuaWwKKworCitmb3IgaT0yLExpbSwyIGRvICAgLS0gdW5sb2NrIHRoZSBvdGhlciBoYWxmCisgIFQudW5yZWYoQXJyW2ldKQorZW5kCisKK3ggPSBULm5ld3VzZXJkYXRhKDQxKTsgZGVidWcuc2V0bWV0YXRhYmxlKHgsIHtfX2djPUZ9KQorYXNzZXJ0KFQudGVzdEMoIm9ianNpemUgMjsgcmV0dXJuIDEiLCB4KSA9PSA0MSkKK2NsID0ge30KK2EgPSB7W3hdID0gMX0KK3ggPSBULnVkYXRhdmFsKHgpCitjb2xsZWN0Z2FyYmFnZSgpCistLSBvbGQgYHgnIGNhbm5vdCBiZSBjb2xsZWN0ZWQgKGBhJyBzdGlsbCB1c2VzIGl0KQorYXNzZXJ0KCNjbCA9PSAwKQorZm9yIG4gaW4gcGFpcnMoYSkgZG8gYVtuXSA9IHVuZGVmIGVuZAorY29sbGVjdGdhcmJhZ2UoKQorYXNzZXJ0KCNjbCA9PSAxIGFuZCBjbFsxXSA9PSB4KSAgIC0tIG9sZCBgeCcgbXVzdCBiZSBjb2xsZWN0ZWQKKworLS0gdGVzdGluZyBsdWFfZXF1YWwKK2Fzc2VydChULnRlc3RDKCJjb21wYXJlIEVRIDIgNDsgcmV0dXJuIDEiLCBwcmludCwgMSwgcHJpbnQsIDIwKSkKK2Fzc2VydChULnRlc3RDKCJjb21wYXJlIEVRIDMgMjsgcmV0dXJuIDEiLCAnYWxvJywgImFsbyIpKQorYXNzZXJ0KFQudGVzdEMoImNvbXBhcmUgRVEgMiAzOyByZXR1cm4gMSIsIG5pbCwgbmlsKSkKK2Fzc2VydChub3QgVC50ZXN0QygiY29tcGFyZSBFUSAyIDM7IHJldHVybiAxIiwge30sIHt9KSkKK2Fzc2VydChub3QgVC50ZXN0QygiY29tcGFyZSBFUSAyIDM7IHJldHVybiAxIikpCithc3NlcnQobm90IFQudGVzdEMoImNvbXBhcmUgRVEgMiAzOyByZXR1cm4gMSIsIDMpKQorCistLSB0ZXN0aW5nIGx1YV9lcXVhbCB3aXRoIGZhbGxiYWNrcworZG8KKyAgbG9jYWwgbWFwID0ge30KKyAgbG9jYWwgdCA9IHtfX2VxID0gZnVuY3Rpb24gKGEsYikgcmV0dXJuIG1hcFthXSA9PSBtYXBbYl0gZW5kfQorICBsb2NhbCBmdW5jdGlvbiBmKHgpCisgICAgbG9jYWwgdSA9IFQubmV3dXNlcmRhdGEoMCkKKyAgICBkZWJ1Zy5zZXRtZXRhdGFibGUodSwgdCkKKyAgICBtYXBbdV0gPSB4CisgICAgcmV0dXJuIHUKKyAgZW5kCisgIGFzc2VydChmKDEwKSA9PSBmKDEwKSkKKyAgYXNzZXJ0KGYoMTApIH49IGYoMTEpKQorICBhc3NlcnQoVC50ZXN0QygiY29tcGFyZSBFUSAyIDM7IHJldHVybiAxIiwgZigxMCksIGYoMTApKSkKKyAgYXNzZXJ0KG5vdCBULnRlc3RDKCJjb21wYXJlIEVRIDIgMzsgcmV0dXJuIDEiLCBmKDEwKSwgZigyMCkpKQorICB0Ll9fZXEgPSBuaWwKKyAgYXNzZXJ0KGYoMTApIH49IGYoMTApKQorZW5kCisKK3ByaW50JysnCisKKworCistLSB0ZXN0aW5nIGNoYW5naW5nIGhvb2tzIGR1cmluZyBob29rcworX0cudCA9IHt9CitULnNldGhvb2soW1sKKyAgIyBzZXQgYSBsaW5lIGhvb2sgYWZ0ZXIgMyBjb3VudCBob29rcworICBzZXRob29rIDQgMCAnCisgICAgZ2V0Z2xvYmFsIHQ7CisgICAgcHVzaHZhbHVlIC0zOyBhcHBlbmQgLTIKKyAgICBwdXNodmFsdWUgLTI7IGFwcGVuZCAtMgorICAnXV0sICJjIiwgMykKK2xvY2FsIGEgPSAxICAgLS0gY291bnRpbmcKK2EgPSAxICAgLS0gY291bnRpbmcKK2EgPSAxICAgLS0gY291bnQgaG9vayAoc2V0IGxpbmUgaG9vaykKK2EgPSAxICAgLS0gbGluZSBob29rCithID0gMSAgIC0tIGxpbmUgaG9vaworZGVidWcuc2V0aG9vaygpCit0ID0gX0cudAorYXNzZXJ0KHRbMV0gPT0gImxpbmUiKQorbGluZSA9IHRbMl0KK2Fzc2VydCh0WzNdID09ICJsaW5lIiBhbmQgdFs0XSA9PSBsaW5lICsgMSkKK2Fzc2VydCh0WzVdID09ICJsaW5lIiBhbmQgdFs2XSA9PSBsaW5lICsgMikKK2Fzc2VydCh0WzddID09IG5pbCkKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkbyAgIC0tIHRlc3RpbmcgZXJyb3JzIGR1cmluZyBHQworICBjb2xsZWN0Z2FyYmFnZSgic3RvcCIpCisgIGxvY2FsIGEgPSB7fQorICBmb3IgaT0xLDIwIGRvCisgICAgYVtpXSA9IFQubmV3dXNlcmRhdGEoaSkgICAtLSBjcmVhdGVzIHNldmVyYWwgdWRhdGEKKyAgZW5kCisgIGZvciBpPTEsMjAsMiBkbyAgIC0tIG1hcmsgaGFsZiBvZiB0aGVtIHRvIHJhaXNlIGVycm9ycyBkdXJpbmcgR0MKKyAgICBkZWJ1Zy5zZXRtZXRhdGFibGUoYVtpXSwge19fZ2MgPSBmdW5jdGlvbiAoeCkgZXJyb3IoImVycm9yIGluc2lkZSBnYyIpIGVuZH0pCisgIGVuZAorICBmb3IgaT0yLDIwLDIgZG8gICAtLSBtYXJrIHRoZSBvdGhlciBoYWxmIHRvIGNvdW50IGFuZCB0byBjcmVhdGUgbW9yZSBnYXJiYWdlCisgICAgZGVidWcuc2V0bWV0YXRhYmxlKGFbaV0sIHtfX2djID0gZnVuY3Rpb24gKHgpIGxvYWQoIkE9QSsxIikoKSBlbmR9KQorICBlbmQKKyAgX0cuQSA9IDAKKyAgYSA9IDAKKyAgd2hpbGUgMSBkbworICAgIGxvY2FsIHN0YXQsIG1zZyA9IHBjYWxsKGNvbGxlY3RnYXJiYWdlKQorICAgIGlmIHN0YXQgdGhlbgorICAgICAgYnJlYWsgICAtLSBzdG9wIHdoZW4gbm8gbW9yZSBlcnJvcnMKKyAgICBlbHNlCisgICAgICBhID0gYSArIDEKKyAgICAgIGFzc2VydChzdHJpbmcuZmluZChtc2csICJfX2djIikpCisgICAgZW5kCisgIGVuZAorICBhc3NlcnQoYSA9PSAxMCkgIC0tIG51bWJlciBvZiBlcnJvcnMKKworICBhc3NlcnQoQSA9PSAxMCkgIC0tIG51bWJlciBvZiBub3JtYWwgY29sbGVjdGlvbnMKKyAgY29sbGVjdGdhcmJhZ2UoInJlc3RhcnQiKQorZW5kCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSB0ZXN0IGZvciB1c2VyZGF0YSB2YWxzCitkbworICBsb2NhbCBhID0ge307IGxvY2FsIGxpbSA9IDMwCisgIGZvciBpPTAsbGltIGRvIGFbaV0gPSBULnB1c2h1c2VyZGF0YShpKSBlbmQKKyAgZm9yIGk9MCxsaW0gZG8gYXNzZXJ0KFQudWRhdGF2YWwoYVtpXSkgPT0gaSkgZW5kCisgIGZvciBpPTAsbGltIGRvIGFzc2VydChULnB1c2h1c2VyZGF0YShpKSA9PSBhW2ldKSBlbmQKKyAgZm9yIGk9MCxsaW0gZG8gYVthW2ldXSA9IGkgZW5kCisgIGZvciBpPTAsbGltIGRvIGFbVC5wdXNodXNlcmRhdGEoaSldID0gaSBlbmQKKyAgYXNzZXJ0KHR5cGUodG9zdHJpbmcoYVsxXSkpID09ICJzdHJpbmciKQorZW5kCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gdGVzdGluZyBtdWx0aXBsZSBzdGF0ZXMKK1QuY2xvc2VzdGF0ZShULm5ld3N0YXRlKCkpOworTDEgPSBULm5ld3N0YXRlKCkKK2Fzc2VydChMMSkKKworYXNzZXJ0KFQuZG9yZW1vdGUoTDEsICJYPSdhJzsgcmV0dXJuICdhJyIpID09ICdhJykKKworCithc3NlcnQoI3BhY2soVC5kb3JlbW90ZShMMSwgImZ1bmN0aW9uIGYgKCkgcmV0dXJuICdhbG8nLCAzIGVuZDsgZigpIikpID09IDApCisKK2EsIGIgPSBULmRvcmVtb3RlKEwxLCAicmV0dXJuIGYoKSIpCithc3NlcnQoYSA9PSAnYWxvJyBhbmQgYiA9PSAnMycpCisKK1QuZG9yZW1vdGUoTDEsICJfRVJST1JNRVNTQUdFID0gbmlsIikKKy0tIGVycm9yOiBgc2luJyBpcyBub3QgZGVmaW5lZAorYSwgXywgYiA9IFQuZG9yZW1vdGUoTDEsICJyZXR1cm4gc2luKDEpIikKK2Fzc2VydChhID09IG5pbCBhbmQgYiA9PSAyKSAgIC0tIDIgPT0gcnVuLXRpbWUgZXJyb3IKKworLS0gZXJyb3I6IHN5bnRheCBlcnJvcgorYSwgYiwgYyA9IFQuZG9yZW1vdGUoTDEsICJyZXR1cm4gYSsiKQorYXNzZXJ0KGEgPT0gbmlsIGFuZCBjID09IDMgYW5kIHR5cGUoYikgPT0gInN0cmluZyIpICAgLS0gMyA9PSBzeW50YXggZXJyb3IKKworVC5sb2FkbGliKEwxKQorYSwgYiwgYyA9IFQuZG9yZW1vdGUoTDEsIFtbCisgIHN0cmluZyA9IHJlcXVpcmUnc3RyaW5nJworICBhID0gcmVxdWlyZSdfRyc7IGFzc2VydChhID09IF9HIGFuZCByZXF1aXJlKCJfRyIpID09IGEpCisgIGlvID0gcmVxdWlyZSdpbyc7IGFzc2VydCh0eXBlKGlvLnJlYWQpID09ICJmdW5jdGlvbiIpCisgIGFzc2VydChyZXF1aXJlKCJpbyIpID09IGlvKQorICBhID0gcmVxdWlyZSd0YWJsZSc7IGFzc2VydCh0eXBlKGEuaW5zZXJ0KSA9PSAiZnVuY3Rpb24iKQorICBhID0gcmVxdWlyZSdkZWJ1Zyc7IGFzc2VydCh0eXBlKGEuZ2V0bG9jYWwpID09ICJmdW5jdGlvbiIpCisgIGEgPSByZXF1aXJlJ21hdGgnOyBhc3NlcnQodHlwZShhLnNpbikgPT0gImZ1bmN0aW9uIikKKyAgcmV0dXJuIHN0cmluZy5zdWIoJ29raW5hbWEnLCAxLCAyKQorXV0pCithc3NlcnQoYSA9PSAib2siKQorCitULmNsb3Nlc3RhdGUoTDEpOworCisKK0wxID0gVC5uZXdzdGF0ZSgpCitULmxvYWRsaWIoTDEpCitULmRvcmVtb3RlKEwxLCAiYSA9IHt9IikKK1QudGVzdEMoTDEsIFtbZ2V0Z2xvYmFsICJhIjsgcHVzaHN0cmluZyAieCI7IHB1c2hpbnQgMTsKKyAgICAgICAgICAgICBzZXR0YWJsZSAtM11dKQorYXNzZXJ0KFQuZG9yZW1vdGUoTDEsICJyZXR1cm4gYS54IikgPT0gIjEiKQorCitULmNsb3Nlc3RhdGUoTDEpCisKK0wxID0gbmlsCisKK3ByaW50KCcrJykKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gdGVzdGluZyBtZW1vcnkgbGltaXRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwcmludCgibWVtb3J5LWFsbG9jYXRpb24gZXJyb3JzIikKKworY2hlY2tlcnIoImJsb2NrIHRvbyBiaWciLCBULm5ld3VzZXJkYXRhLCBtYXRoLm1heGludGVnZXIpCitjb2xsZWN0Z2FyYmFnZSgpCitsb2NhbCBmID0gbG9hZCJsb2NhbCBhPXt9OyBmb3IgaT0xLDEwMDAwMCBkbyBhW2ldPWkgZW5kIgorVC5hbGxvY2NvdW50KDEwKQorY2hlY2tlcnIoIm5vdCBlbm91Z2ggbWVtb3J5IiwgZikKK1QuYWxsb2Njb3VudCgpICAgICAgICAgIC0tIHJlbW92ZSBsaW1pdAorCistLSB0ZXN0IG1lbW9yeSBlcnJvcnM7IGluY3JlYXNlIGxpbWl0IGZvciBudW1iZXIgb2YgYWxsb2NhdGlvbnMgb25lCistLSBieSBvbmUsIHNvIHRoYXQgd2UgZ2V0IG1lbW9yeSBlcnJvcnMgaW4gYWxsIGFsbG9jYXRpb25zIG9mIGEgZ2l2ZW4KKy0tIHRhc2ssIHVudGlsIHRoZXJlIGlzIGVub3VnaCBhbGxvY2F0aW9ucyB0byBjb21wbGV0ZSB0aGUgdGFzayB3aXRob3V0CistLSBlcnJvcnMuCisKK2Z1bmN0aW9uIHRlc3RhbWVtIChzLCBmKQorICBjb2xsZWN0Z2FyYmFnZSgpOyBjb2xsZWN0Z2FyYmFnZSgpCisgIGxvY2FsIE0gPSAwCisgIGxvY2FsIGEsYiA9IG5pbAorICB3aGlsZSB0cnVlIGRvCisgICAgVC5hbGxvY2NvdW50KE0pCisgICAgYSwgYiA9IHBjYWxsKGYpCisgICAgVC5hbGxvY2NvdW50KCkgIC0tIHJlbW92ZSBsaW1pdAorICAgIGlmIGEgYW5kIGIgdGhlbiBicmVhayBlbmQgICAgICAgLS0gc3RvcCB3aGVuIG5vIG1vcmUgZXJyb3JzCisgICAgaWYgbm90IGEgYW5kIG5vdCAgICAtLSBgcmVhbCcgZXJyb3I/CisgICAgICAoc3RyaW5nLmZpbmQoYiwgIm1lbW9yeSIpIG9yIHN0cmluZy5maW5kKGIsICJvdmVyZmxvdyIpKSB0aGVuCisgICAgICBlcnJvcihiLCAwKSAgIC0tIHByb3BhZ2F0ZSBpdAorICAgIGVuZAorICAgIE0gPSBNICsgMSAgIC0tIGluY3JlYXNlIGFsbG9jYXRpb24gbGltaXQKKyAgZW5kCisgIHByaW50KHN0cmluZy5mb3JtYXQoImxpbWl0IGZvciAlczogJWQgYWxsb2NhdGlvbnMiLCBzLCBNKSkKKyAgcmV0dXJuIGIKK2VuZAorCisKKy0tIGRvaW5nIG5vdGhpbmcKK2IgPSB0ZXN0YW1lbSgiZG9pbmcgbm90aGluZyIsIGZ1bmN0aW9uICgpIHJldHVybiAxMCBlbmQpCithc3NlcnQoYiA9PSAxMCkKKworLS0gdGVzdGluZyBtZW1vcnkgZXJyb3JzIHdoZW4gY3JlYXRpbmcgYSBuZXcgc3RhdGUKKworYiA9IHRlc3RhbWVtKCJzdGF0ZSBjcmVhdGlvbiIsIFQubmV3c3RhdGUpCitULmNsb3Nlc3RhdGUoYik7ICAtLSBjbG9zZSBuZXcgc3RhdGUKKwordGVzdGFtZW0oImVtcHR5LXRhYmxlIGNyZWF0aW9uIiwgZnVuY3Rpb24gKCkKKyAgcmV0dXJuIHt9CitlbmQpCisKK3Rlc3RhbWVtKCJzdHJpbmcgY3JlYXRpb24iLCBmdW5jdGlvbiAoKQorICByZXR1cm4gIlhYWCIgLi4gIllZWSIKK2VuZCkKKwordGVzdGFtZW0oImNvcm91dGluZSBjcmVhdGlvbiIsIGZ1bmN0aW9uKCkKKyAgICAgICAgICAgcmV0dXJuIGNvcm91dGluZS5jcmVhdGUocHJpbnQpCitlbmQpCisKKworLS0gdGVzdGluZyB0aHJlYWRzCisKKy0tIGdldCBtYWluIHRocmVhZCBmcm9tIHJlZ2lzdHJ5IChhdCBpbmRleCBMVUFfUklEWF9NQUlOVEhSRUFEID09IDEpCittdCA9IFQudGVzdEMoInJhd2dldGkgUiAxOyByZXR1cm4gMSIpCithc3NlcnQodHlwZShtdCkgPT0gInRocmVhZCIgYW5kIGNvcm91dGluZS5ydW5uaW5nKCkgPT0gbXQpCisKKworCitmdW5jdGlvbiBleHBhbmQgKG4scykKKyAgaWYgbj09MCB0aGVuIHJldHVybiAiIiBlbmQKKyAgbG9jYWwgZSA9IHN0cmluZy5yZXAoIj0iLCBuKQorICByZXR1cm4gc3RyaW5nLmZvcm1hdCgiVC5kb29ubmV3c3RhY2soWyVzWyAlcztcbiBjb2xsZWN0Z2FyYmFnZSgpOyAlc10lc10pXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwgcywgZXhwYW5kKG4tMSxzKSwgZSkKK2VuZAorCitHPTA7IGNvbGxlY3RnYXJiYWdlKCk7IGEgPWNvbGxlY3RnYXJiYWdlKCJjb3VudCIpCitsb2FkKGV4cGFuZCgyMCwiRz1HKzEiKSkoKQorYXNzZXJ0KEc9PTIwKTsgY29sbGVjdGdhcmJhZ2UoKTsgIC0tIGFzc2VydChnY2luZm8oKSA8PSBhKzEpCisKK3Rlc3RhbWVtKCJydW5uaW5nIGNvZGUgb24gbmV3IHRocmVhZCIsIGZ1bmN0aW9uICgpCisgIHJldHVybiBULmRvb25uZXdzdGFjaygieD0xIikgPT0gMCAgLS0gdHJ5IHRvIGNyZWF0ZSB0aHJlYWQKK2VuZCkKKworCistLSB0ZXN0aW5nIG1lbW9yeSB4IGNvbXBpbGVyCisKK3Rlc3RhbWVtKCJsb2Fkc3RyaW5nIiwgZnVuY3Rpb24gKCkKKyAgcmV0dXJuIGxvYWQoIng9MSIpICAtLSB0cnkgdG8gZG8gbG9hZCBhIHN0cmluZworZW5kKQorCisKK2xvY2FsIHRlc3Rwcm9nID0gW1sKK2xvY2FsIGZ1bmN0aW9uIGZvbyAoKSByZXR1cm4gZW5kCitsb2NhbCB0ID0geyJ4In0KK2EgPSAiYWFhIgorZm9yIGkgPSAxLCAjdCBkbyBhPWEuLnRbaV0gZW5kCityZXR1cm4gdHJ1ZQorXV0KKworLS0gdGVzdGluZyBtZW1vcnkgeCBkb2ZpbGUKK19HLmEgPSBuaWwKK2xvY2FsIHQgPW9zLnRtcG5hbWUoKQorbG9jYWwgZiA9IGFzc2VydChpby5vcGVuKHQsICJ3IikpCitmOndyaXRlKHRlc3Rwcm9nKQorZjpjbG9zZSgpCit0ZXN0YW1lbSgiZG9maWxlIiwgZnVuY3Rpb24gKCkKKyAgbG9jYWwgYSA9IGxvYWRmaWxlKHQpCisgIHJldHVybiBhIGFuZCBhKCkKK2VuZCkKK2Fzc2VydChvcy5yZW1vdmUodCkpCithc3NlcnQoX0cuYSA9PSAiYWFheCIpCisKKworLS0gb3RoZXIgZ2VuZXJpYyB0ZXN0cworCit0ZXN0YW1lbSgiZ3N1YiIsIGZ1bmN0aW9uICgpCisgIGxvY2FsIGEsIGIgPSBzdHJpbmcuZ3N1YigiYWxvIGFsbyIsICIoYSkiLCBmdW5jdGlvbiAoeCkgcmV0dXJuIHguLidiJyBlbmQpCisgIHJldHVybiAoYSA9PSAnYWJsbyBhYmxvJykKK2VuZCkKKwordGVzdGFtZW0oImR1bXAvdW5kdW1wIiwgZnVuY3Rpb24gKCkKKyAgbG9jYWwgYSA9IGxvYWQodGVzdHByb2cpCisgIGxvY2FsIGIgPSBhIGFuZCBzdHJpbmcuZHVtcChhKQorICBhID0gYiBhbmQgbG9hZChiKQorICByZXR1cm4gYSBhbmQgYSgpCitlbmQpCisKK2xvY2FsIHQgPSBvcy50bXBuYW1lKCkKK3Rlc3RhbWVtKCJmaWxlIGNyZWF0aW9uIiwgZnVuY3Rpb24gKCkKKyAgbG9jYWwgZiA9IGFzc2VydChpby5vcGVuKHQsICd3JykpCisgIGFzc2VydCAobm90IGlvLm9wZW4ibm9tZW5hb2V4aXN0ZW50ZSIpCisgIGlvLmNsb3NlKGYpOworICByZXR1cm4gbm90IGxvYWRmaWxlJ25vbWVuYW9leGlzdGVudGUnCitlbmQpCithc3NlcnQob3MucmVtb3ZlKHQpKQorCit0ZXN0YW1lbSgidGFibGUgY3JlYXRpb24iLCBmdW5jdGlvbiAoKQorICBsb2NhbCBhLCBsaW0gPSB7fSwgMTAKKyAgZm9yIGk9MSxsaW0gZG8gYVtpXSA9IGk7IGFbaS4uJ2EnXSA9IHt9IGVuZAorICByZXR1cm4gKHR5cGUoYVtsaW0uLidhJ10pID09ICd0YWJsZScgYW5kIGFbbGltXSA9PSBsaW0pCitlbmQpCisKK3Rlc3RhbWVtKCJjb25zdHJ1Y3RvcnMiLCBmdW5jdGlvbiAoKQorICBsb2NhbCBhID0gezEwLCAyMCwgMzAsIDQwLCA1MDsgYT0xLCBiPTIsIGM9MywgZD00LCBlPTV9CisgIHJldHVybiAodHlwZShhKSA9PSAndGFibGUnIGFuZCBhLmUgPT0gNSkKK2VuZCkKKworbG9jYWwgYSA9IDEKK2Nsb3NlID0gbmlsCit0ZXN0YW1lbSgiY2xvc3VyZSBjcmVhdGlvbiIsIGZ1bmN0aW9uICgpCisgIGZ1bmN0aW9uIGNsb3NlIChiKQorICAgcmV0dXJuIGZ1bmN0aW9uICh4KSByZXR1cm4gYiArIHggZW5kCisgIGVuZAorICByZXR1cm4gKGNsb3NlKDIpKDQpID09IDYpCitlbmQpCisKK3Rlc3RhbWVtKCJ1c2luZyBjb3JvdXRpbmVzIiwgZnVuY3Rpb24gKCkKKyAgbG9jYWwgYSA9IGNvcm91dGluZS53cmFwKGZ1bmN0aW9uICgpCisgICAgICAgICAgICAgIGNvcm91dGluZS55aWVsZChzdHJpbmcucmVwKCJhIiwgMTApKQorICAgICAgICAgICAgICByZXR1cm4ge30KKyAgICAgICAgICAgIGVuZCkKKyAgYXNzZXJ0KHN0cmluZy5sZW4oYSgpKSA9PSAxMCkKKyAgcmV0dXJuIGEoKQorZW5kKQorCitkbyAgIC0tIGF1eGlsaWFyeSBidWZmZXIKKyAgbG9jYWwgbGltID0gMTAwCisgIGxvY2FsIGEgPSB7fTsgZm9yIGkgPSAxLCBsaW0gZG8gYVtpXSA9ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIgZW5kCisgIHRlc3RhbWVtKCJhdXhpbGlhcnkgYnVmZmVyIiwgZnVuY3Rpb24gKCkKKyAgICByZXR1cm4gKCN0YWJsZS5jb25jYXQoYSwgIiwiKSA9PSAyMCpsaW0gKyBsaW0gLSAxKQorICBlbmQpCitlbmQKKwordGVzdGFtZW0oImdyb3dpbmcgc3RhY2siLCBmdW5jdGlvbiAoKQorICBsb2NhbCBmdW5jdGlvbiBmb28gKG4pCisgICAgaWYgbiA9PSAwIHRoZW4gcmV0dXJuIDEgZWxzZSByZXR1cm4gMSArIGZvbyhuIC0gMSkgZW5kCisgIGVuZAorICByZXR1cm4gZm9vKDEwMCkKK2VuZCkKKworZG8gICAtLSB0ZXN0aW5nIGZhaWxpbmcgaW4gJ2x1YV9jaGVja3N0YWNrJworICBsb2NhbCByZXMgPSBULnRlc3RDKFtbcmF3Y2hlY2tzdGFjayA1MDAwMDA7IHJldHVybiAxXV0pCisgIGFzc2VydChyZXMgPT0gZmFsc2UpCisgIGxvY2FsIEwgPSBULm5ld3N0YXRlKCkKKyAgVC5hbGxvY2NvdW50KDApICAgLS0gd2lsbCBiZSB1bmFibGUgdG8gcmVhbGxvY2F0ZSB0aGUgc3RhY2sKKyAgcmVzID0gVC50ZXN0QyhMLCBbW3Jhd2NoZWNrc3RhY2sgNTAwMDsgcmV0dXJuIDFdXSkKKyAgVC5hbGxvY2NvdW50KCkKKyAgVC5jbG9zZXN0YXRlKEwpCisgIGFzc2VydChyZXMgPT0gZmFsc2UpCitlbmQKKworZG8gICAtLSBjbG9zaW5nIHN0YXRlIHdpdGggbm8gZXh0cmEgbWVtb3J5CisgIGxvY2FsIEwgPSBULm5ld3N0YXRlKCkKKyAgVC5hbGxvY2NvdW50KDApCisgIFQuY2xvc2VzdGF0ZShMKQorICBULmFsbG9jY291bnQoKQorZW5kCisgIAorZG8gICAtLSBnYXJiYWdlIGNvbGxlY3Rpb24gd2l0aCBubyBleHRyYSBtZW1vcnkKKyAgbG9jYWwgTCA9IFQubmV3c3RhdGUoKSAKKyAgVC5sb2FkbGliKEwpCisgIGxvY2FsIHJlcyA9IChULmRvcmVtb3RlKEwsIFtbCisgICAgX0VOViA9IHJlcXVpcmUiX0ciCisgICAgbG9jYWwgVCA9IHJlcXVpcmUiVCIKKyAgICBsb2NhbCBhID0ge30KKyAgICBmb3IgaSA9IDEsIDEwMDAgZG8gYVtpXSA9ICdpJyAuLiBpIGVuZCAgICAtLSBncm93IHN0cmluZyB0YWJsZQorICAgIGxvY2FsIHN0c2l6ZSwgc3R1c2UgPSBULnF1ZXJ5c3RyKCkKKyAgICBhc3NlcnQoc3R1c2UgPiAxMDAwKQorICAgIGxvY2FsIGZ1bmN0aW9uIGZvbyAobikKKyAgICAgIGlmIG4gPiAwIHRoZW4gZm9vKG4gLSAxKSBlbmQKKyAgICBlbmQKKyAgICBmb28oMTgwKSAgICAtLSBncm93IHN0YWNrCisgICAgbG9jYWwgXywgc3Rrc2l6ZSA9IFQuc3RhY2tsZXZlbCgpCisgICAgYXNzZXJ0KHN0a3NpemUgPiAxODApCisgICAgYSA9IG5pbAorICAgIFQuYWxsb2Njb3VudCgwKQorICAgIGNvbGxlY3RnYXJiYWdlKCkKKyAgICBULmFsbG9jY291bnQoKQorICAgIC0tIHN0YWNrIGFuZCBzdHJpbmcgdGFibGUgY291bGQgbm90IGJlIHJlYWxsb2NhdGVkLAorICAgIC0tIHNvIHRoZXkga2VwdCB0aGVpciBzaXplcyAod2l0aG91dCBlcnJvcnMpCisgICAgYXNzZXJ0KHNlbGVjdCgyLCBULnN0YWNrbGV2ZWwoKSkgPT0gc3Rrc2l6ZSkKKyAgICBhc3NlcnQoVC5xdWVyeXN0cigpID09IHN0c2l6ZSkKKyAgICByZXR1cm4gJ29rJworICBdXSkpCisgIGFzc2VydChyZXMgPT0gJ29rJykKKyAgVC5jbG9zZXN0YXRlKEwpCitlbmQKKworcHJpbnQnKycKKworLS0gdGVzdGluZyBzb21lIGF1eGxpYiBmdW5jdGlvbnMKK2xvY2FsIGZ1bmN0aW9uIGdzdWIgKGEsIGIsIGMpCisgIGEsIGIgPSBULnRlc3RDKCJnc3ViIDIgMyA0OyBnZXR0b3A7IHJldHVybiAyIiwgYSwgYiwgYykKKyAgYXNzZXJ0KGIgPT0gNSkKKyAgcmV0dXJuIGEKK2VuZAorCithc3NlcnQoZ3N1YigiYWxvLmFsby51aHVoLiIsICIuIiwgIi8vIikgPT0gImFsby8vYWxvLy91aHVoLy8iKQorYXNzZXJ0KGdzdWIoImFsby5hbG8udWh1aC4iLCAiYWxvIiwgIi8vIikgPT0gIi8vLi8vLnVodWguIikKK2Fzc2VydChnc3ViKCIiLCAiYWxvIiwgIi8vIikgPT0gIiIpCithc3NlcnQoZ3N1YigiLi4uIiwgIi4iLCAiLy4iKSA9PSAiLy4vLi8uIikKK2Fzc2VydChnc3ViKCIuLi4iLCAiLi4uIiwgIiIpID09ICIiKQorCisKKy0tIHRlc3RpbmcgbHVhTF9uZXdtZXRhdGFibGUKK2xvY2FsIG10X3h1eHUsIHJlcywgdG9wID0gVC50ZXN0QygibmV3bWV0YXRhYmxlIHh1eHU7IGdldHRvcDsgcmV0dXJuIDMiKQorYXNzZXJ0KHR5cGUobXRfeHV4dSkgPT0gInRhYmxlIiBhbmQgcmVzIGFuZCB0b3AgPT0gMykKK2xvY2FsIGQsIHJlcywgdG9wID0gVC50ZXN0QygibmV3bWV0YXRhYmxlIHh1eHU7IGdldHRvcDsgcmV0dXJuIDMiKQorYXNzZXJ0KG10X3h1eHUgPT0gZCBhbmQgbm90IHJlcyBhbmQgdG9wID09IDMpCitkLCByZXMsIHRvcCA9IFQudGVzdEMoIm5ld21ldGF0YWJsZSB4dXh1MTsgZ2V0dG9wOyByZXR1cm4gMyIpCithc3NlcnQobXRfeHV4dSB+PSBkIGFuZCByZXMgYW5kIHRvcCA9PSAzKQorCit4ID0gVC5uZXd1c2VyZGF0YSgwKTsKK3kgPSBULm5ld3VzZXJkYXRhKDApOworVC50ZXN0QygicHVzaHN0cmluZyB4dXh1OyBnZXR0YWJsZSBSOyBzZXRtZXRhdGFibGUgMiIsIHgpCithc3NlcnQoZ2V0bWV0YXRhYmxlKHgpID09IG10X3h1eHUpCisKKy0tIHRlc3RpbmcgbHVhTF90ZXN0dWRhdGEKKy0tIGNvcnJlY3QgbWV0YXRhYmxlCitsb2NhbCByZXMxLCByZXMyLCB0b3AgPSBULnRlc3RDKFtbdGVzdHVkYXRhIC0xIHh1eHUKKyAgIAkgCQkJICB0ZXN0dWRhdGEgMiB4dXh1CisJCQkJICBnZXR0b3AKKwkJCQkgIHJldHVybiAzXV0sIHgpCithc3NlcnQocmVzMSBhbmQgcmVzMiBhbmQgdG9wID09IDQpCisKKy0tIHdyb25nIG1ldGF0YWJsZQorcmVzMSwgcmVzMiwgdG9wID0gVC50ZXN0QyhbW3Rlc3R1ZGF0YSAtMSB4dXh1MQorCQkJICAgIHRlc3R1ZGF0YSAyIHh1eHUxCisJCQkgICAgZ2V0dG9wCisJCQkgICAgcmV0dXJuIDNdXSwgeCkKK2Fzc2VydChub3QgcmVzMSBhbmQgbm90IHJlczIgYW5kIHRvcCA9PSA0KQorCistLSBub24tZXhpc3RlbnQgdHlwZQorcmVzMSwgcmVzMiwgdG9wID0gVC50ZXN0QyhbW3Rlc3R1ZGF0YSAtMSB4dXh1MgorCQkJICAgIHRlc3R1ZGF0YSAyIHh1eHUyCisJCQkgICAgZ2V0dG9wCisJCQkgICAgcmV0dXJuIDNdXSwgeCkKK2Fzc2VydChub3QgcmVzMSBhbmQgbm90IHJlczIgYW5kIHRvcCA9PSA0KQorCistLSB1c2VyZGF0YSBoYXMgbm8gbWV0YXRhYmxlCityZXMxLCByZXMyLCB0b3AgPSBULnRlc3RDKFtbdGVzdHVkYXRhIC0xIHh1eHUKKwkJCSAgICB0ZXN0dWRhdGEgMiB4dXh1CisJCQkgICAgZ2V0dG9wCisJCQkgICAgcmV0dXJuIDNdXSwgeSkKK2Fzc2VydChub3QgcmVzMSBhbmQgbm90IHJlczIgYW5kIHRvcCA9PSA0KQorCistLSBlcmFzZSBtZXRhdGFibGVzCitkbworICBsb2NhbCByID0gZGVidWcuZ2V0cmVnaXN0cnkoKQorICBhc3NlcnQoci54dXh1ID09IG10X3h1eHUgYW5kIHIueHV4dTEgPT0gZCkKKyAgci54dXh1ID0gbmlsOyByLnh1eHUxID0gbmlsCitlbmQKKworcHJpbnQnT0snCisKZGlmZiAtLWdpdCBhL3Rlc3Rlcy9hdHRyaWIubHVhIGIvdGVzdGVzL2F0dHJpYi5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhMDhhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9hdHRyaWIubHVhCkBAIC0wLDAgKzEsNDg3IEBACistLSAkSWQ6IGF0dHJpYi5sdWEsdiAxLjY5IDIwMTgvMDMvMTIgMTM6NTE6MDIgcm9iZXJ0byBFeHAgJAorLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCisKK3ByaW50ICJ0ZXN0aW5nIHJlcXVpcmUiCisKK2Fzc2VydChyZXF1aXJlInN0cmluZyIgPT0gc3RyaW5nKQorYXNzZXJ0KHJlcXVpcmUibWF0aCIgPT0gbWF0aCkKK2Fzc2VydChyZXF1aXJlInRhYmxlIiA9PSB0YWJsZSkKK2Fzc2VydChyZXF1aXJlImlvIiA9PSBpbykKK2Fzc2VydChyZXF1aXJlIm9zIiA9PSBvcykKK2Fzc2VydChyZXF1aXJlImNvcm91dGluZSIgPT0gY29yb3V0aW5lKQorCithc3NlcnQodHlwZShwYWNrYWdlLnBhdGgpID09ICJzdHJpbmciKQorYXNzZXJ0KHR5cGUocGFja2FnZS5jcGF0aCkgPT0gInN0cmluZyIpCithc3NlcnQodHlwZShwYWNrYWdlLmxvYWRlZCkgPT0gInRhYmxlIikKK2Fzc2VydCh0eXBlKHBhY2thZ2UucHJlbG9hZCkgPT0gInRhYmxlIikKKworYXNzZXJ0KHR5cGUocGFja2FnZS5jb25maWcpID09ICJzdHJpbmciKQorcHJpbnQoInBhY2thZ2UgY29uZmlnOiAiLi5zdHJpbmcuZ3N1YihwYWNrYWdlLmNvbmZpZywgIlxuIiwgInwiKSkKKworZG8KKyAgLS0gY3JlYXRlIGEgcGF0aCB3aXRoICdtYXgnIHRlbXBsYXRlcywKKyAgLS0gZWFjaCB3aXRoIDEtMTAgcmVwZXRpdGlvbnMgb2YgJz8nCisgIGxvY2FsIG1heCA9IF9zb2Z0IGFuZCAxMDAgb3IgMjAwMAorICBsb2NhbCB0ID0ge30KKyAgZm9yIGkgPSAxLG1heCBkbyB0W2ldID0gc3RyaW5nLnJlcCgiPyIsIGklMTAgKyAxKSBlbmQKKyAgdFsjdCArIDFdID0gIjsiICAgIC0tIGVtcHR5IHRlbXBsYXRlCisgIGxvY2FsIHBhdGggPSB0YWJsZS5jb25jYXQodCwgIjsiKQorICAtLSB1c2UgdGhhdCBwYXRoIGluIGEgc2VhcmNoCisgIGxvY2FsIHMsIGVyciA9IHBhY2thZ2Uuc2VhcmNocGF0aCgieHV4dSIsIHBhdGgpCisgIC0tIHNlYXJjaCBmYWlsczsgY2hlY2sgdGhhdCBtZXNzYWdlIGhhcyBhbiBvY2N1cmVuY2Ugb2YKKyAgLS0gJz8/Pz8/Pz8/Pz8nIHdpdGggPyByZXBsYWNlZCBieSB4dXh1IGFuZCBhdCBsZWFzdCAnbWF4JyBsaW5lcworICBhc3NlcnQobm90IHMgYW5kCisgICAgICAgICBzdHJpbmcuZmluZChlcnIsIHN0cmluZy5yZXAoInh1eHUiLCAxMCkpIGFuZAorICAgICAgICAgI3N0cmluZy5nc3ViKGVyciwgIlteXG5dIiwgIiIpID49IG1heCkKKyAgLS0gcGF0aCB3aXRoIG9uZSB2ZXJ5IGxvbmcgdGVtcGxhdGUKKyAgbG9jYWwgcGF0aCA9IHN0cmluZy5yZXAoIj8iLCBtYXgpCisgIGxvY2FsIHMsIGVyciA9IHBhY2thZ2Uuc2VhcmNocGF0aCgieHV4dSIsIHBhdGgpCisgIGFzc2VydChub3QgcyBhbmQgc3RyaW5nLmZpbmQoZXJyLCBzdHJpbmcucmVwKCd4dXh1JywgbWF4KSkpCitlbmQKKworZG8KKyAgbG9jYWwgb2xkcGF0aCA9IHBhY2thZ2UucGF0aAorICBwYWNrYWdlLnBhdGggPSB7fQorICBsb2NhbCBzLCBlcnIgPSBwY2FsbChyZXF1aXJlLCAibm8tc3VjaC1maWxlIikKKyAgYXNzZXJ0KG5vdCBzIGFuZCBzdHJpbmcuZmluZChlcnIsICJwYWNrYWdlLnBhdGgiKSkKKyAgcGFja2FnZS5wYXRoID0gb2xkcGF0aAorZW5kCisKK3ByaW50KCcrJykKKworCistLSBUaGUgbmV4dCB0ZXN0cyBmb3IgJ3JlcXVpcmUnIGFzc3VtZSBzb21lIHNwZWNpZmljIGRpcmVjdG9yaWVzIGFuZAorLS0gbGlicmFyaWVzLgorCitpZiBub3QgX3BvcnQgdGhlbiAtLVsKKworbG9jYWwgZGlyc2VwID0gc3RyaW5nLm1hdGNoKHBhY2thZ2UuY29uZmlnLCAiXihbXlxuXSspXG4iKQorCistLSBhdXhpbGlhcnkgZGlyZWN0b3J5IHdpdGggQyBtb2R1bGVzIGFuZCB0ZW1wb3JhcnkgZmlsZXMKK2xvY2FsIERJUiA9ICJsaWJzIiAuLiBkaXJzZXAKKworLS0gcHJlcGVuZCBESVIgdG8gYSBuYW1lIGFuZCBjb3JyZWN0IGRpcmVjdG9yeSBzZXBhcmF0b3JzCitsb2NhbCBmdW5jdGlvbiBEICh4KQorICB4ID0gc3RyaW5nLmdzdWIoeCwgIi8iLCBkaXJzZXApCisgIHJldHVybiBESVIgLi4geAorZW5kCisKKy0tIHByZXBlbmQgRElSIGFuZCBwb3NwZW5kIHByb3BlciBDIGxpYi4gZXh0ZW5zaW9uIHRvIGEgbmFtZQorbG9jYWwgZnVuY3Rpb24gREMgKHgpCisgIGxvY2FsIGV4dCA9IChkaXJzZXAgPT0gJ1xcJykgYW5kICIuZGxsIiBvciAiLnNvIgorICByZXR1cm4gRCh4IC4uIGV4dCkKK2VuZAorCisKK2xvY2FsIGZ1bmN0aW9uIGNyZWF0ZWZpbGVzIChmaWxlcywgcHJlZXh0cmFzLCBwb3NleHRyYXMpCisgIGZvciBuLGMgaW4gcGFpcnMoZmlsZXMpIGRvCisgICAgaW8ub3V0cHV0KEQobikpCisgICAgaW8ud3JpdGUoc3RyaW5nLmZvcm1hdChwcmVleHRyYXMsIG4pKQorICAgIGlvLndyaXRlKGMpCisgICAgaW8ud3JpdGUoc3RyaW5nLmZvcm1hdChwb3NleHRyYXMsIG4pKQorICAgIGlvLmNsb3NlKGlvLm91dHB1dCgpKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiByZW1vdmVmaWxlcyAoZmlsZXMpCisgIGZvciBuIGluIHBhaXJzKGZpbGVzKSBkbworICAgIG9zLnJlbW92ZShEKG4pKQorICBlbmQKK2VuZAorCitsb2NhbCBmaWxlcyA9IHsKKyAgWyJuYW1lcy5sdWEiXSA9ICJkbyByZXR1cm4gey4uLn0gZW5kXG4iLAorICBbImVyci5sdWEiXSA9ICJCID0gMTU7IGEgPSBhICsgMTsiLAorICBbInN5bmVyci5sdWEiXSA9ICJCID0iLAorICBbIkEubHVhIl0gPSAiIiwKKyAgWyJCLmx1YSJdID0gImFzc2VydCguLi49PSdCJyk7cmVxdWlyZSAnQSciLAorICBbIkEubGMiXSA9ICIiLAorICBbIkEiXSA9ICIiLAorICBbIkwiXSA9ICIiLAorICBbIlhYeFgiXSA9ICIiLAorICBbIkMubHVhIl0gPSAicGFja2FnZS5sb2FkZWRbLi4uXSA9IDI1OyByZXF1aXJlJ0MnIiwKK30KKworQUEgPSBuaWwKK2xvY2FsIGV4dHJhcyA9IFtbCitOQU1FID0gJyVzJworUkVRVUlSRUQgPSAuLi4KK3JldHVybiBBQV1dCisKK2NyZWF0ZWZpbGVzKGZpbGVzLCAiIiwgZXh0cmFzKQorCistLSB0ZXN0aW5nIGV4cGxpY2l0ICJkaXIiIHNlcGFyYXRvciBpbiAnc2VhcmNocGF0aCcKK2Fzc2VydChwYWNrYWdlLnNlYXJjaHBhdGgoIkMubHVhIiwgRCI/IiwgIiIsICIiKSA9PSBEIkMubHVhIikKK2Fzc2VydChwYWNrYWdlLnNlYXJjaHBhdGgoIkMubHVhIiwgRCI/IiwgIi4iLCAiLiIpID09IEQiQy5sdWEiKQorYXNzZXJ0KHBhY2thZ2Uuc2VhcmNocGF0aCgiLS14LSIsIEQiPyIsICItIiwgIlgiKSA9PSBEIlhYeFgiKQorYXNzZXJ0KHBhY2thZ2Uuc2VhcmNocGF0aCgiLS0teFgiLCBEIj8iLCAiLS0tIiwgIlhYIikgPT0gRCJYWHhYIikKK2Fzc2VydChwYWNrYWdlLnNlYXJjaHBhdGgoRCJDLmx1YSIsICI/IiwgZGlyc2VwKSA9PSBEIkMubHVhIikKK2Fzc2VydChwYWNrYWdlLnNlYXJjaHBhdGgoIi5cXEMubHVhIiwgRCI/IiwgIlxcIikgPT0gRCIuL0MubHVhIikKKworbG9jYWwgb2xkcGF0aCA9IHBhY2thZ2UucGF0aAorCitwYWNrYWdlLnBhdGggPSBzdHJpbmcuZ3N1YigiRC8/Lmx1YTtELz8ubGM7RC8/O0QvPz94PztEL0wiLCAiRC8iLCBESVIpCisKK2xvY2FsIHRyeSA9IGZ1bmN0aW9uIChwLCBuLCByKQorICBOQU1FID0gbmlsCisgIGxvY2FsIHJyID0gcmVxdWlyZShwKQorICBhc3NlcnQoTkFNRSA9PSBuKQorICBhc3NlcnQoUkVRVUlSRUQgPT0gcCkKKyAgYXNzZXJ0KHJyID09IHIpCitlbmQKKworYSA9IHJlcXVpcmUibmFtZXMiCithc3NlcnQoYVsxXSA9PSAibmFtZXMiIGFuZCBhWzJdID09IEQibmFtZXMubHVhIikKKworX0cuYSA9IG5pbAorbG9jYWwgc3QsIG1zZyA9IHBjYWxsKHJlcXVpcmUsICJlcnIiKQorYXNzZXJ0KG5vdCBzdCBhbmQgc3RyaW5nLmZpbmQobXNnLCAiYXJpdGhtZXRpYyIpIGFuZCBCID09IDE1KQorc3QsIG1zZyA9IHBjYWxsKHJlcXVpcmUsICJzeW5lcnIiKQorYXNzZXJ0KG5vdCBzdCBhbmQgc3RyaW5nLmZpbmQobXNnLCAiZXJyb3IgbG9hZGluZyBtb2R1bGUiKSkKKworYXNzZXJ0KHBhY2thZ2Uuc2VhcmNocGF0aCgiQyIsIHBhY2thZ2UucGF0aCkgPT0gRCJDLmx1YSIpCithc3NlcnQocmVxdWlyZSJDIiA9PSAyNSkKK2Fzc2VydChyZXF1aXJlIkMiID09IDI1KQorQUEgPSBuaWwKK3RyeSgnQicsICdCLmx1YScsIHRydWUpCithc3NlcnQocGFja2FnZS5sb2FkZWQuQikKK2Fzc2VydChyZXF1aXJlIkIiID09IHRydWUpCithc3NlcnQocGFja2FnZS5sb2FkZWQuQSkKK2Fzc2VydChyZXF1aXJlIkMiID09IDI1KQorcGFja2FnZS5sb2FkZWQuQSA9IG5pbAordHJ5KCdCJywgbmlsLCB0cnVlKSAgIC0tIHNob3VsZCBub3QgcmVsb2FkIHBhY2thZ2UKK3RyeSgnQScsICdBLmx1YScsIHRydWUpCitwYWNrYWdlLmxvYWRlZC5BID0gbmlsCitvcy5yZW1vdmUoRCdBLmx1YScpCitBQSA9IHt9Cit0cnkoJ0EnLCAnQS5sYycsIEFBKSAgLS0gbm93IG11c3QgZmluZCBzZWNvbmQgb3B0aW9uCithc3NlcnQocGFja2FnZS5zZWFyY2hwYXRoKCJBIiwgcGFja2FnZS5wYXRoKSA9PSBEIkEubGMiKQorYXNzZXJ0KHJlcXVpcmUoIkEiKSA9PSBBQSkKK0FBID0gZmFsc2UKK3RyeSgnSycsICdMJywgZmFsc2UpICAgICAtLSBkZWZhdWx0IG9wdGlvbgordHJ5KCdLJywgJ0wnLCBmYWxzZSkgICAgIC0tIGRlZmF1bHQgb3B0aW9uIChzaG91bGQgcmVsb2FkIGl0KQorYXNzZXJ0KHJhd2dldChfRywgIl9SRVFVSVJFRE5BTUUiKSA9PSBuaWwpCisKK0FBID0gIngiCit0cnkoIlgiLCAiWFh4WCIsIEFBKQorCisKK3JlbW92ZWZpbGVzKGZpbGVzKQorCisKKy0tIHRlc3RpbmcgcmVxdWlyZSBvZiBzdWItcGFja2FnZXMKKworbG9jYWwgX0cgPSBfRworCitwYWNrYWdlLnBhdGggPSBzdHJpbmcuZ3N1YigiRC8/Lmx1YTtELz8vaW5pdC5sdWEiLCAiRC8iLCBESVIpCisKK2ZpbGVzID0geworICBbIlAxL2luaXQubHVhIl0gPSAiQUEgPSAxMCIsCisgIFsiUDEveHV4dS5sdWEiXSA9ICJBQSA9IDIwIiwKK30KKworY3JlYXRlZmlsZXMoZmlsZXMsICJfRU5WID0ge31cbiIsICJcbnJldHVybiBfRU5WXG4iKQorQUEgPSAwCisKK2xvY2FsIG0gPSBhc3NlcnQocmVxdWlyZSJQMSIpCithc3NlcnQoQUEgPT0gMCBhbmQgbS5BQSA9PSAxMCkKK2Fzc2VydChyZXF1aXJlIlAxIiA9PSBtKQorYXNzZXJ0KHJlcXVpcmUiUDEiID09IG0pCisKK2Fzc2VydChwYWNrYWdlLnNlYXJjaHBhdGgoIlAxLnh1eHUiLCBwYWNrYWdlLnBhdGgpID09IEQiUDEveHV4dS5sdWEiKQorbS54dXh1ID0gYXNzZXJ0KHJlcXVpcmUiUDEueHV4dSIpCithc3NlcnQoQUEgPT0gMCBhbmQgbS54dXh1LkFBID09IDIwKQorYXNzZXJ0KHJlcXVpcmUiUDEueHV4dSIgPT0gbS54dXh1KQorYXNzZXJ0KHJlcXVpcmUiUDEueHV4dSIgPT0gbS54dXh1KQorYXNzZXJ0KHJlcXVpcmUiUDEiID09IG0gYW5kIG0uQUEgPT0gMTApCisKKworcmVtb3ZlZmlsZXMoZmlsZXMpCisKKworcGFja2FnZS5wYXRoID0gIiIKK2Fzc2VydChub3QgcGNhbGwocmVxdWlyZSwgImZpbGVfZG9lc19ub3RfZXhpc3QiKSkKK3BhY2thZ2UucGF0aCA9ICI/P1wwPyIKK2Fzc2VydChub3QgcGNhbGwocmVxdWlyZSwgImZpbGVfZG9lc19ub3RfZXhpc3QxIikpCisKK3BhY2thZ2UucGF0aCA9IG9sZHBhdGgKKworLS0gY2hlY2sgJ3JlcXVpcmUnIGVycm9yIG1lc3NhZ2UKK2xvY2FsIGZuYW1lID0gImZpbGVfZG9lc19ub3RfZXhpc3QyIgorbG9jYWwgbSwgZXJyID0gcGNhbGwocmVxdWlyZSwgZm5hbWUpCitmb3IgdCBpbiBzdHJpbmcuZ21hdGNoKHBhY2thZ2UucGF0aC4uIjsiLi5wYWNrYWdlLmNwYXRoLCAiW147XSsiKSBkbworICB0ID0gc3RyaW5nLmdzdWIodCwgIj8iLCBmbmFtZSkKKyAgYXNzZXJ0KHN0cmluZy5maW5kKGVyciwgdCwgMSwgdHJ1ZSkpCitlbmQKKworZG8gIC0tIHRlc3RpbmcgJ3BhY2thZ2Uuc2VhcmNoZXJzJyBub3QgYmVpbmcgYSB0YWJsZQorICBsb2NhbCBzZWFyY2hlcnMgPSBwYWNrYWdlLnNlYXJjaGVycworICBwYWNrYWdlLnNlYXJjaGVycyA9IDMKKyAgbG9jYWwgc3QsIG1zZyA9IHBjYWxsKHJlcXVpcmUsICdhJykKKyAgYXNzZXJ0KG5vdCBzdCBhbmQgc3RyaW5nLmZpbmQobXNnLCAibXVzdCBiZSBhIHRhYmxlIikpCisgIHBhY2thZ2Uuc2VhcmNoZXJzID0gc2VhcmNoZXJzCitlbmQKKworbG9jYWwgZnVuY3Rpb24gaW1wb3J0KC4uLikKKyAgbG9jYWwgZiA9IHsuLi59CisgIHJldHVybiBmdW5jdGlvbiAobSkKKyAgICBmb3IgaT0xLCAjZiBkbyBtW2ZbaV1dID0gX0dbZltpXV0gZW5kCisgIGVuZAorZW5kCisKKy0tIGNhbm5vdCBjaGFuZ2UgZW52aXJvbm1lbnQgb2YgYSBDIGZ1bmN0aW9uCithc3NlcnQobm90IHBjYWxsKG1vZHVsZSwgJ1hVWFUnKSkKKworCisKKy0tIHRlc3RpbmcgcmVxdWlyZSBvZiBDIGxpYnJhcmllcworCisKK2xvY2FsIHAgPSAiIiAgIC0tIE9uIE1hYyBPUyBYLCByZWRlZmluZSB0aGlzIHRvICJfIgorCistLSBjaGVjayB3aGV0aGVyIGxvYWRsaWIgd29ya3MgaW4gdGhpcyBzeXN0ZW0KK2xvY2FsIHN0LCBlcnIsIHdoZW4gPSBwYWNrYWdlLmxvYWRsaWIoREMibGliMSIsICIqIikKK2lmIG5vdCBzdCB0aGVuCisgIGxvY2FsIGYsIGVyciwgd2hlbiA9IHBhY2thZ2UubG9hZGxpYigiZG9ub3RleGlzdCIsIHAuLiJ4dXh1IikKKyAgYXNzZXJ0KG5vdCBmIGFuZCB0eXBlKGVycikgPT0gInN0cmluZyIgYW5kIHdoZW4gPT0gImFic2VudCIpCisgIDsoTWVzc2FnZSBvciBwcmludCkoJ1xuID4+PiBjYW5ub3QgbG9hZCBkeW5hbWljIGxpYnJhcnkgPDw8XG4nKQorICBwcmludChlcnIsIHdoZW4pCitlbHNlCisgIC0tIHRlc3RzIGZvciBsb2FkbGliCisgIGxvY2FsIGYgPSBhc3NlcnQocGFja2FnZS5sb2FkbGliKERDImxpYjEiLCBwLi4ib25lZnVuY3Rpb24iKSkKKyAgbG9jYWwgYSwgYiA9IGYoMTUsIDI1KQorICBhc3NlcnQoYSA9PSAyNSBhbmQgYiA9PSAxNSkKKworICBmID0gYXNzZXJ0KHBhY2thZ2UubG9hZGxpYihEQyJsaWIxIiwgcC4uImFub3RoZXJmdW5jIikpCisgIGFzc2VydChmKDEwLCAyMCkgPT0gIjEwJTIwXG4iKQorCisgIC0tIGNoZWNrIGVycm9yIG1lc3NhZ2VzCisgIGxvY2FsIGYsIGVyciwgd2hlbiA9IHBhY2thZ2UubG9hZGxpYihEQyJsaWIxIiwgcC4uInh1eHUiKQorICBhc3NlcnQobm90IGYgYW5kIHR5cGUoZXJyKSA9PSAic3RyaW5nIiBhbmQgd2hlbiA9PSAiaW5pdCIpCisgIGYsIGVyciwgd2hlbiA9IHBhY2thZ2UubG9hZGxpYigiZG9ub3RleGlzdCIsIHAuLiJ4dXh1IikKKyAgYXNzZXJ0KG5vdCBmIGFuZCB0eXBlKGVycikgPT0gInN0cmluZyIgYW5kIHdoZW4gPT0gIm9wZW4iKQorCisgIC0tIHN5bWJvbHMgZnJvbSAnbGliMScgbXVzdCBiZSB2aXNpYmxlIHRvIG90aGVyIGxpYnJhcmllcworICBmID0gYXNzZXJ0KHBhY2thZ2UubG9hZGxpYihEQyJsaWIxMSIsIHAuLiJsdWFvcGVuX2xpYjExIikpCisgIGFzc2VydChmKCkgPT0gImV4cG9ydGVkIikKKworICAtLSB0ZXN0IEMgbW9kdWxlcyB3aXRoIHByZWZpeGVzIGluIG5hbWVzCisgIHBhY2thZ2UuY3BhdGggPSBEQyI/IgorICBsb2NhbCBsaWIyID0gcmVxdWlyZSJsaWIyLXYyIgorICAtLSBjaGVjayBjb3JyZWN0IGFjY2VzcyB0byBnbG9iYWwgZW52aXJvbm1lbnQgYW5kIGNvcnJlY3QKKyAgLS0gcGFyYW1ldGVycworICBhc3NlcnQoX0VOVi54ID09ICJsaWIyLXYyIiBhbmQgX0VOVi55ID09IERDImxpYjItdjIiKQorICBhc3NlcnQobGliMi5pZCgieCIpID09ICJ4IikKKworICAtLSB0ZXN0IEMgc3VibW9kdWxlcworICBsb2NhbCBmcyA9IHJlcXVpcmUibGliMS5zdWIiCisgIGFzc2VydChfRU5WLnggPT0gImxpYjEuc3ViIiBhbmQgX0VOVi55ID09IERDImxpYjEiKQorICBhc3NlcnQoZnMuaWQoNDUpID09IDQ1KQorZW5kCisKK19FTlYgPSBfRworCisKKy0tIHRlc3RpbmcgcHJlbG9hZAorCitkbworICBsb2NhbCBwID0gcGFja2FnZQorICBwYWNrYWdlID0ge30KKyAgcC5wcmVsb2FkLnBsID0gZnVuY3Rpb24gKC4uLikKKyAgICBsb2NhbCBfRU5WID0gey4uLn0KKyAgICBmdW5jdGlvbiB4dXh1ICh4KSByZXR1cm4geCsyMCBlbmQKKyAgICByZXR1cm4gX0VOVgorICBlbmQKKworICBsb2NhbCBwbCA9IHJlcXVpcmUicGwiCisgIGFzc2VydChyZXF1aXJlInBsIiA9PSBwbCkKKyAgYXNzZXJ0KHBsLnh1eHUoMTApID09IDMwKQorICBhc3NlcnQocGxbMV0gPT0gInBsIiBhbmQgcGxbMl0gPT0gbmlsKQorCisgIHBhY2thZ2UgPSBwCisgIGFzc2VydCh0eXBlKHBhY2thZ2UucGF0aCkgPT0gInN0cmluZyIpCitlbmQKKworcHJpbnQoJysnKQorCitlbmQgIC0tXQorCitwcmludCgidGVzdGluZyBhc3NpZ25tZW50cywgbG9naWNhbCBvcGVyYXRvcnMsIGFuZCBjb25zdHJ1Y3RvcnMiKQorCitsb2NhbCByZXMsIHJlczIgPSAyNworCithLCBiID0gMSwgMiszCithc3NlcnQoYT09MSBhbmQgYj09NSkKK2E9e30KK2Z1bmN0aW9uIGYoKSByZXR1cm4gMTAsIDExLCAxMiBlbmQKK2EueCwgYiwgYVsxXSA9IDEsIDIsIGYoKQorYXNzZXJ0KGEueD09MSBhbmQgYj09MiBhbmQgYVsxXT09MTApCithW2YoKV0sIGIsIGFbZigpKzNdID0gZigpLCBhLCAneCcKK2Fzc2VydChhWzEwXSA9PSAxMCBhbmQgYiA9PSBhIGFuZCBhWzEzXSA9PSAneCcpCisKK2RvCisgIGxvY2FsIGYgPSBmdW5jdGlvbiAobikgbG9jYWwgeCA9IHt9OyBmb3IgaT0xLG4gZG8geFtpXT1pIGVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUudW5wYWNrKHgpIGVuZDsKKyAgbG9jYWwgYSxiLGMKKyAgYSxiID0gMCwgZigxKQorICBhc3NlcnQoYSA9PSAwIGFuZCBiID09IDEpCisgIEEsYiA9IDAsIGYoMSkKKyAgYXNzZXJ0KEEgPT0gMCBhbmQgYiA9PSAxKQorICBhLGIsYyA9IDAsNSxmKDQpCisgIGFzc2VydChhPT0wIGFuZCBiPT01IGFuZCBjPT0xKQorICBhLGIsYyA9IDAsNSxmKDApCisgIGFzc2VydChhPT0wIGFuZCBiPT01IGFuZCBjPT1uaWwpCitlbmQKKworYSwgYiwgYywgZCA9IDEgYW5kIG5pbCwgMSBvciBuaWwsICgxIGFuZCAobmlsIG9yIDEpKSwgNgorYXNzZXJ0KG5vdCBhIGFuZCBiIGFuZCBjIGFuZCBkPT02KQorCitkID0gMjAKK2EsIGIsIGMsIGQgPSBmKCkKK2Fzc2VydChhPT0xMCBhbmQgYj09MTEgYW5kIGM9PTEyIGFuZCBkPT1uaWwpCithLGIgPSBmKCksIDEsIDIsIDMsIGYoKQorYXNzZXJ0KGE9PTEwIGFuZCBiPT0xKQorCithc3NlcnQoYTxiID09IGZhbHNlIGFuZCBhPmIgPT0gdHJ1ZSkKK2Fzc2VydCgoMTAgYW5kIDIpID09IDIpCithc3NlcnQoKDEwIG9yIDIpID09IDEwKQorYXNzZXJ0KCgxMCBvciBhc3NlcnQobmlsKSkgPT0gMTApCithc3NlcnQobm90IChuaWwgYW5kIGFzc2VydChuaWwpKSkKK2Fzc2VydCgobmlsIG9yICJhbG8iKSA9PSAiYWxvIikKK2Fzc2VydCgobmlsIGFuZCAxMCkgPT0gbmlsKQorYXNzZXJ0KChmYWxzZSBhbmQgMTApID09IGZhbHNlKQorYXNzZXJ0KCh0cnVlIG9yIDEwKSA9PSB0cnVlKQorYXNzZXJ0KChmYWxzZSBvciAxMCkgPT0gMTApCithc3NlcnQoZmFsc2Ugfj0gbmlsKQorYXNzZXJ0KG5pbCB+PSBmYWxzZSkKK2Fzc2VydChub3QgbmlsID09IHRydWUpCithc3NlcnQobm90IG5vdCBuaWwgPT0gZmFsc2UpCithc3NlcnQobm90IG5vdCAxID09IHRydWUpCithc3NlcnQobm90IG5vdCBhID09IHRydWUpCithc3NlcnQobm90IG5vdCAoNiBvciBuaWwpID09IHRydWUpCithc3NlcnQobm90IG5vdCAobmlsIGFuZCA1NikgPT0gZmFsc2UpCithc3NlcnQobm90IG5vdCAobmlsIGFuZCB0cnVlKSA9PSBmYWxzZSkKK2Fzc2VydChub3QgMTAgPT0gZmFsc2UpCithc3NlcnQobm90IHt9ID09IGZhbHNlKQorYXNzZXJ0KG5vdCAwLjUgPT0gZmFsc2UpCithc3NlcnQobm90ICJ4IiA9PSBmYWxzZSkKKworYXNzZXJ0KHt9IH49IHt9KQorcHJpbnQoJysnKQorCithID0ge30KK2FbdHJ1ZV0gPSAyMAorYVtmYWxzZV0gPSAxMAorYXNzZXJ0KGFbMTwyXSA9PSAyMCBhbmQgYVsxPjJdID09IDEwKQorCitmdW5jdGlvbiBmKGEpIHJldHVybiBhIGVuZAorCitsb2NhbCBhID0ge30KK2ZvciBpPTMwMDAsLTMwMDAsLTEgZG8gYVtpICsgMC4wXSA9IGk7IGVuZAorYVsxMGUzMF0gPSAiYWxvIjsgYVt0cnVlXSA9IDEwOyBhW2ZhbHNlXSA9IDIwCithc3NlcnQoYVsxMGUzMF0gPT0gJ2FsbycgYW5kIGFbbm90IDFdID09IDIwIGFuZCBhWzEwPDIwXSA9PSAxMCkKK2ZvciBpPTMwMDAsLTMwMDAsLTEgZG8gYXNzZXJ0KGFbaV0gPT0gaSk7IGVuZAorYVtwcmludF0gPSBhc3NlcnQKK2FbZl0gPSBwcmludAorYVthXSA9IGEKK2Fzc2VydChhW2FdW2FdW2FdW2FdW3ByaW50XSA9PSBhc3NlcnQpCithW3ByaW50XShhW2FbZl1dID09IGFbcHJpbnRdKQorYXNzZXJ0KG5vdCBwY2FsbChmdW5jdGlvbiAoKSBsb2NhbCBhID0ge307IGFbbmlsXSA9IDEwIGVuZCkpCithc3NlcnQobm90IHBjYWxsKGZ1bmN0aW9uICgpIGxvY2FsIGEgPSB7W25pbF0gPSAxMH0gZW5kKSkKK2Fzc2VydChhW25pbF0gPT0gdW5kZWYpCithID0gbmlsCisKK2EgPSB7MTAsOSw4LDcsNiw1LDQsMywyOyBbLTNdPSdhJywgW2ZdPXByaW50LCBhPSdhJywgYj0nYWInfQorYSwgYS54LCBhLnkgPSBhLCBhWy0zXQorYXNzZXJ0KGFbMV09PTEwIGFuZCBhWy0zXT09YS5hIGFuZCBhW2ZdPT1wcmludCBhbmQgYS54PT0nYScgYW5kIG5vdCBhLnkpCithWzFdLCBmKGEpWzJdLCBiLCBjID0ge1snYWxvJ109YXNzZXJ0fSwgMTAsIGFbMV0sIGFbZl0sIDYsIDEwLCAyMywgZihhKSwgMgorYVsxXS5hbG8oYVsyXT09MTAgYW5kIGI9PTEwIGFuZCBjPT1wcmludCkKKworYS5hVmVyeUxvbmdOYW1lMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5ID0gMTAKK2xvY2FsIGZ1bmN0aW9uIGZvbyAoKQorICByZXR1cm4gYS5hVmVyeUxvbmdOYW1lMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CitlbmQKK2Fzc2VydChmb28oKSA9PSAxMCBhbmQKK2EuYVZlcnlMb25nTmFtZTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSA9PQorMTApCisKKworCistLSB0ZXN0IG9mIGxhcmdlIGZsb2F0L2ludGVnZXIgaW5kaWNlcyAKKworLS0gY29tcHV0ZSBtYXhpbXVtIGludGVnZXIgd2hlcmUgYWxsIGJpdHMgZml0IGluIGEgZmxvYXQKK2xvY2FsIG1heGludCA9IG1hdGgubWF4aW50ZWdlcgorCistLSB0cmltIChpZiBuZWVkZWQpIHRvIGZpdCBpbiBhIGZsb2F0Cit3aGlsZSBtYXhpbnQgfj0gKG1heGludCArIDAuMCkgb3IgKG1heGludCAtIDEpIH49IChtYXhpbnQgLSAxLjApIGRvCisgIG1heGludCA9IG1heGludCAvLyAyCitlbmQKKworbWF4aW50RiA9IG1heGludCArIDAuMCAgIC0tIGZsb2F0IHZlcnNpb24KKworYXNzZXJ0KG1heGludEYgPT0gbWF4aW50IGFuZCBtYXRoLnR5cGUobWF4aW50RikgPT0gImZsb2F0IiBhbmQKKyAgICAgICBtYXhpbnRGID49IDIuMF4xNCkKKworLS0gZmxvYXRzIGFuZCBpbnRlZ2VycyBtdXN0IGluZGV4IHRoZSBzYW1lIHBsYWNlcworYVttYXhpbnRGXSA9IDEwOyBhW21heGludEYgLSAxLjBdID0gMTE7CithWy1tYXhpbnRGXSA9IDEyOyBhWy1tYXhpbnRGICsgMS4wXSA9IDEzOworCithc3NlcnQoYVttYXhpbnRdID09IDEwIGFuZCBhW21heGludCAtIDFdID09IDExIGFuZAorICAgICAgIGFbLW1heGludF0gPT0gMTIgYW5kIGFbLW1heGludCArIDFdID09IDEzKQorCithW21heGludF0gPSAyMAorYVstbWF4aW50XSA9IDIyCisKK2Fzc2VydChhW21heGludEZdID09IDIwIGFuZCBhW21heGludEYgLSAxLjBdID09IDExIGFuZAorICAgICAgIGFbLW1heGludEZdID09IDIyIGFuZCBhWy1tYXhpbnRGICsgMS4wXSA9PSAxMykKKworYSA9IG5pbAorCisKKy0tIHRlc3QgY29uZmxpY3RzIGluIG11bHRpcGxlIGFzc2lnbm1lbnQKK2RvCisgIGxvY2FsIGEsaSxqLGIKKyAgYSA9IHsnYScsICdiJ307IGk9MTsgaj0yOyBiPWEKKyAgaSwgYVtpXSwgYSwgaiwgYVtqXSwgYVtpK2pdID0gaiwgaSwgaSwgYiwgaiwgaQorICBhc3NlcnQoaSA9PSAyIGFuZCBiWzFdID09IDEgYW5kIGEgPT0gMSBhbmQgaiA9PSBiIGFuZCBiWzJdID09IDIgYW5kCisgICAgICAgICBiWzNdID09IDEpCisgIGEgPSB7fQorICBsb2NhbCBmdW5jdGlvbiBmb28gKCkgICAgLS0gYXNzaWdpbmluZyB0byB1cHZhbHVlcworICAgIGIsIGEueCwgYSA9IGEsIDEwLCAyMAorICBlbmQKKyAgZm9vKCkKKyAgYXNzZXJ0KGEgPT0gMjAgYW5kIGIueCA9PSAxMCkKK2VuZAorCistLSByZXBlYXQgdGVzdCB3aXRoIHVwdmFsdWVzCitkbworICBsb2NhbCBhLGksaixiCisgIGEgPSB7J2EnLCAnYid9OyBpPTE7IGo9MjsgYj1hCisgIGxvY2FsIGZ1bmN0aW9uIGZvbyAoKQorICAgIGksIGFbaV0sIGEsIGosIGFbal0sIGFbaStqXSA9IGosIGksIGksIGIsIGosIGkKKyAgZW5kCisgIGZvbygpCisgIGFzc2VydChpID09IDIgYW5kIGJbMV0gPT0gMSBhbmQgYSA9PSAxIGFuZCBqID09IGIgYW5kIGJbMl0gPT0gMiBhbmQKKyAgICAgICAgIGJbM10gPT0gMSkKKyAgbG9jYWwgdCA9IHt9CisgIChmdW5jdGlvbiAoYSkgdFthXSwgYSA9IDEwLCAyMCAgZW5kKSgxKTsKKyAgYXNzZXJ0KHRbMV0gPT0gMTApCitlbmQKKworLS0gYnVnIGluIDUuMiBiZXRhCitsb2NhbCBmdW5jdGlvbiBmb28gKCkKKyAgbG9jYWwgYQorICByZXR1cm4gZnVuY3Rpb24gKCkKKyAgICBsb2NhbCBiCisgICAgYSwgYiA9IDMsIDE0ICAgIC0tIGxvY2FsIGFuZCB1cHZhbHVlIGhhdmUgc2FtZSBpbmRleAorICAgIHJldHVybiBhLCBiCisgIGVuZAorZW5kCisKK2xvY2FsIGEsIGIgPSBmb28oKSgpCithc3NlcnQoYSA9PSAzIGFuZCBiID09IDE0KQorCitwcmludCgnT0snKQorCityZXR1cm4gcmVzCisKZGlmZiAtLWdpdCBhL3Rlc3Rlcy9iaWcubHVhIGIvdGVzdGVzL2JpZy5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlZTFlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9iaWcubHVhCkBAIC0wLDAgKzEsODIgQEAKKy0tICRJZDogYmlnLmx1YSx2IDEuMzUgMjAxOC8wMy8wOSAxNDoyMzo0OCByb2JlcnRvIEV4cCAkCistLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBmaWxlIGFsbC5sdWEKKworaWYgX3NvZnQgdGhlbgorICByZXR1cm4gJ2EnCitlbmQKKworcHJpbnQgInRlc3RpbmcgbGFyZ2UgdGFibGVzIgorCitsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUiZGVidWciIAorCitsb2NhbCBsaW0gPSAyXjE4ICsgMTAwMAorbG9jYWwgcHJvZyA9IHsgImxvY2FsIHkgPSB7MCIgfQorZm9yIGkgPSAxLCBsaW0gZG8gcHJvZ1sjcHJvZyArIDFdID0gaSAgZW5kCitwcm9nWyNwcm9nICsgMV0gPSAifVxuIgorcHJvZ1sjcHJvZyArIDFdID0gIlggPSB5XG4iCitwcm9nWyNwcm9nICsgMV0gPSAoImFzc2VydChYWyVkXSA9PSAlZCkiKTpmb3JtYXQobGltIC0gMSwgbGltIC0gMikKK3Byb2dbI3Byb2cgKyAxXSA9ICJyZXR1cm4gMCIKK3Byb2cgPSB0YWJsZS5jb25jYXQocHJvZywgIjsiKQorCitsb2NhbCBlbnYgPSB7c3RyaW5nID0gc3RyaW5nLCBhc3NlcnQgPSBhc3NlcnR9Citsb2NhbCBmID0gYXNzZXJ0KGxvYWQocHJvZywgbmlsLCBuaWwsIGVudikpCisKK2YoKQorYXNzZXJ0KGVudi5YW2xpbV0gPT0gbGltIC0gMSBhbmQgZW52LlhbbGltICsgMV0gPT0gbGltKQorZm9yIGsgaW4gcGFpcnMoZW52KSBkbyBlbnZba10gPSB1bmRlZiBlbmQKKworLS0geWllbGRzIGR1cmluZyBhY2Nlc3NlcyBsYXJnZXIgdGhhbiBLIChpbiBSSykKK3NldG1ldGF0YWJsZShlbnYsIHsKKyAgX19pbmRleCA9IGZ1bmN0aW9uICh0LCBuKSBjb3JvdXRpbmUueWllbGQoJ2cnKTsgcmV0dXJuIF9HW25dIGVuZCwKKyAgX19uZXdpbmRleCA9IGZ1bmN0aW9uICh0LCBuLCB2KSBjb3JvdXRpbmUueWllbGQoJ3MnKTsgX0dbbl0gPSB2IGVuZCwKK30pCisKK1ggPSBuaWwKK2NvID0gY29yb3V0aW5lLndyYXAoZikKK2Fzc2VydChjbygpID09ICdzJykKK2Fzc2VydChjbygpID09ICdnJykKK2Fzc2VydChjbygpID09ICdnJykKK2Fzc2VydChjbygpID09IDApCisKK2Fzc2VydChYW2xpbV0gPT0gbGltIC0gMSBhbmQgWFtsaW0gKyAxXSA9PSBsaW0pCisKKy0tIGVycm9ycyBpbiBhY2Nlc3NlcyBsYXJnZXIgdGhhbiBLIChpbiBSSykKK2dldG1ldGF0YWJsZShlbnYpLl9faW5kZXggPSBmdW5jdGlvbiAoKSBlbmQKK2dldG1ldGF0YWJsZShlbnYpLl9fbmV3aW5kZXggPSBmdW5jdGlvbiAoKSBlbmQKK2xvY2FsIGUsIG0gPSBwY2FsbChmKQorYXNzZXJ0KG5vdCBlIGFuZCBtOmZpbmQoImdsb2JhbCAnWCciKSkKKworLS0gZXJyb3JzIGluIG1ldGFtZXRob2RzIAorZ2V0bWV0YXRhYmxlKGVudikuX19uZXdpbmRleCA9IGZ1bmN0aW9uICgpIGVycm9yKCJoaSIpIGVuZAorbG9jYWwgZSwgbSA9IHhwY2FsbChmLCBkZWJ1Zy50cmFjZWJhY2spCithc3NlcnQobm90IGUgYW5kIG06ZmluZCgiJ25ld2luZGV4JyIpKQorCitmLCBYID0gbmlsCisKK2Nvcm91dGluZS55aWVsZCdiJworCitpZiAyXjMyID09IDAgdGhlbiAgIC0tIChzbWFsbCBpbnRlZ2VycykgeyAgIAorCitwcmludCAidGVzdGluZyBzdHJpbmcgbGVuZ3RoIG92ZXJmbG93IgorCitsb2NhbCByZXBzdHJpbmdzID0gMTkyICAgICAgICAgIC0tIG51bWJlciBvZiBzdHJpbmdzIHRvIGJlIGNvbmNhdGVuYXRlZAorbG9jYWwgc3NpemUgPSBtYXRoLmNlaWwoMi4wXjMyIC8gcmVwc3RyaW5ncykgKyAxICAgLS0gc2l6ZSBvZiBlYWNoIHN0cmluZworCithc3NlcnQocmVwc3RyaW5ncyAqIHNzaXplID4gMi4wXjMyKSAgLS0gaXQgc2hvdWxkIGJlIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZQorCitsb2NhbCBsb25ncyA9IHN0cmluZy5yZXAoIlwwIiwgc3NpemUpICAgLS0gY3JlYXRlIG9uZSBsb25nIHN0cmluZworCistLSBjcmVhdGUgZnVuY3Rpb24gdG8gY29uY2F0ZW50YXRlICdyZXBzdHJpbmdzJyBjb3BpZXMgb2YgaXRzIGFyZ3VtZW50Citsb2NhbCByZXAgPSBhc3NlcnQobG9hZCgKKyAgImxvY2FsIGEgPSAuLi47IHJldHVybiAiIC4uIHN0cmluZy5yZXAoImEiLCByZXBzdHJpbmdzLCAiLi4iKSkpCisKK2xvY2FsIGEsIGIgPSBwY2FsbChyZXAsIGxvbmdzKSAgIC0tIGNhbGwgdGhhdCBmdW5jdGlvbgorCistLSBpdCBzaG91bGQgZmFpbCB3aXRob3V0IGNyZWF0aW5nIHN0cmluZyAocmVzdWx0IHdvdWxkIGJlIHRvbyBsYXJnZSkKK2Fzc2VydChub3QgYSBhbmQgc3RyaW5nLmZpbmQoYiwgIm92ZXJmbG93IikpCisKK2VuZCAgIC0tIH0KKworcHJpbnQnT0snCisKK3JldHVybiAnYScKZGlmZiAtLWdpdCBhL3Rlc3Rlcy9iaXR3aXNlLmx1YSBiL3Rlc3Rlcy9iaXR3aXNlLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZTcwNzlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGVzL2JpdHdpc2UubHVhCkBAIC0wLDAgKzEsMzQ2IEBACistLSAkSWQ6IGJpdHdpc2UubHVhLHYgMS4yNyAyMDE4LzAyLzIxIDE3OjQ5OjM5IHJvYmVydG8gRXhwICQKKy0tIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGZpbGUgYWxsLmx1YQorCitwcmludCgidGVzdGluZyBiaXR3aXNlIG9wZXJhdGlvbnMiKQorCityZXF1aXJlICJid2NvZXJjaW9uIgorCitsb2NhbCBudW1iaXRzID0gc3RyaW5nLnBhY2tzaXplKCdqJykgKiA4CisKK2Fzc2VydCh+MCA9PSAtMSkKKworYXNzZXJ0KCgxIDw8IChudW1iaXRzIC0gMSkpID09IG1hdGgubWluaW50ZWdlcikKKworLS0gYmFzaWMgdGVzdHMgZm9yIGJpdHdpc2Ugb3BlcmF0b3JzOworLS0gdXNlIHZhcmlhYmxlcyB0byBhdm9pZCBjb25zdGFudCBmb2xkaW5nCitsb2NhbCBhLCBiLCBjLCBkCithID0gMHhGRkZGRkZGRkZGRkZGRkZGCithc3NlcnQoYSA9PSAtMSBhbmQgYSAmIC0xID09IGEgYW5kIGEgJiAzNSA9PSAzNSkKK2EgPSAweEYwRjBGMEYwRjBGMEYwRjAKK2Fzc2VydChhIHwgLTEgPT0gLTEpCithc3NlcnQoYSB+IGEgPT0gMCBhbmQgYSB+IDAgPT0gYSBhbmQgYSB+IH5hID09IC0xKQorYXNzZXJ0KGEgPj4gNCA9PSB+YSkKK2EgPSAweEYwOyBiID0gMHhDQzsgYyA9IDB4QUE7IGQgPSAweEZECithc3NlcnQoYSB8IGIgfiBjICYgZCA9PSAweEY0KQorCithID0gMHhGMC4wOyBiID0gMHhDQy4wOyBjID0gIjB4QUEuMCI7IGQgPSAiMHhGRC4wIgorYXNzZXJ0KGEgfCBiIH4gYyAmIGQgPT0gMHhGNCkKKworYSA9IDB4RjAwMDAwMDA7IGIgPSAweENDMDAwMDAwOworYyA9IDB4QUEwMDAwMDA7IGQgPSAweEZEMDAwMDAwCithc3NlcnQoYSB8IGIgfiBjICYgZCA9PSAweEY0MDAwMDAwKQorYXNzZXJ0KH5+YSA9PSBhIGFuZCB+YSA9PSAtMSB+IGEgYW5kIC1kID09IH5kICsgMSkKKworYSA9IGEgPDwgMzIKK2IgPSBiIDw8IDMyCitjID0gYyA8PCAzMgorZCA9IGQgPDwgMzIKK2Fzc2VydChhIHwgYiB+IGMgJiBkID09IDB4RjQwMDAwMDAgPDwgMzIpCithc3NlcnQofn5hID09IGEgYW5kIH5hID09IC0xIH4gYSBhbmQgLWQgPT0gfmQgKyAxKQorCithc3NlcnQoLTEgPj4gMSA9PSAoMSA8PCAobnVtYml0cyAtIDEpKSAtIDEgYW5kIDEgPDwgMzEgPT0gMHg4MDAwMDAwMCkKK2Fzc2VydCgtMSA+PiAobnVtYml0cyAtIDEpID09IDEpCithc3NlcnQoLTEgPj4gbnVtYml0cyA9PSAwIGFuZAorICAgICAgIC0xID4+IC1udW1iaXRzID09IDAgYW5kCisgICAgICAgLTEgPDwgbnVtYml0cyA9PSAwIGFuZAorICAgICAgIC0xIDw8IC1udW1iaXRzID09IDApCisKK2Fzc2VydCgoMl4zMCAtIDEpIDw8IDJeMzAgPT0gMCkKK2Fzc2VydCgoMl4zMCAtIDEpID4+IDJeMzAgPT0gMCkKKworYXNzZXJ0KDEgPj4gLTMgPT0gMSA8PCAzIGFuZCAxMDAwID4+IDUgPT0gMTAwMCA8PCAtNSkKKworCistLSBjb2VyY2lvbiBmcm9tIHN0cmluZ3MgdG8gaW50ZWdlcnMKK2Fzc2VydCgiMHhmZmZmZmZmZmZmZmZmZmZmIiB8IDAgPT0gLTEpCithc3NlcnQoIjB4ZmZmZmZmZmZmZmZmZmZmZSIgJiAiLTEiID09IC0yKQorYXNzZXJ0KCIgXHQtMHhmZmZmZmZmZmZmZmZmZmZlXG5cdCIgJiAiLTEiID09IDIpCithc3NlcnQoIiAgIFxuICAtNDUgIFx0ICIgPj4gIiAgLTIgICIgPT0gLTQ1ICogNCkKK2Fzc2VydCgiMTIzNC4wIiA8PCAiNS4wIiA9PSAxMjM0ICogMzIpCithc3NlcnQoIjB4ZmZmZi4wIiB+ICIweEFBQUEiID09IDB4NTU1NSkKK2Fzc2VydCh+IjB4MC4wMDBwNCIgPT0gLTEpCisKK2Fzc2VydCgiNyIgLi4gMyA8PCAxID09IDE0NikKK2Fzc2VydCgxMCA+PiAxIC4uICI5IiA9PSAwKQorYXNzZXJ0KDEwIHwgMSAuLiAiOSIgPT0gMjcpCisKK2RvCisgIGxvY2FsIHN0LCBtc2cgPSBwY2FsbChmdW5jdGlvbiAoKSByZXR1cm4gNCAmICJhIiBlbmQpCisgIGFzc2VydChzdHJpbmcuZmluZChtc2csICInYmFuZCciKSkKKworICBsb2NhbCBzdCwgbXNnID0gcGNhbGwoZnVuY3Rpb24gKCkgcmV0dXJuIH4iYSIgZW5kKQorICBhc3NlcnQoc3RyaW5nLmZpbmQobXNnLCAiJ2Jub3QnIikpCitlbmQKKworCistLSBvdXQgb2YgcmFuZ2UgbnVtYmVyCithc3NlcnQobm90IHBjYWxsKGZ1bmN0aW9uICgpIHJldHVybiAiMHhmZmZmZmZmZmZmZmZmZmZmLjAiIHwgMCBlbmQpKQorCistLSBlbWJlZGRlZCB6ZXJvcworYXNzZXJ0KG5vdCBwY2FsbChmdW5jdGlvbiAoKSByZXR1cm4gIjB4ZmZmZmZmZmZmZmZmZmZmZlwwIiB8IDAgZW5kKSkKKworcHJpbnQnKycKKworCitwYWNrYWdlLnByZWxvYWQuYml0MzIgPSBmdW5jdGlvbiAoKSAgICAgLS17CisKKy0tIG5vIGJ1aWx0LWluICdiaXQzMicgbGlicmFyeTogaW1wbGVtZW50IGl0IHVzaW5nIGJpdHdpc2Ugb3BlcmF0b3JzCisKK2xvY2FsIGJpdCA9IHt9CisKK2Z1bmN0aW9uIGJpdC5ibm90IChhKQorICByZXR1cm4gfmEgJiAweEZGRkZGRkZGCitlbmQKKworCistLQorLS0gaW4gYWxsIHZhcmFyZyBmdW5jdGlvbnMsIGF2b2lkIGNyZWF0aW5nICdhcmcnIHRhYmxlIHdoZW4gdGhlcmUgYXJlCistLSBvbmx5IDIgKG9yIGxlc3MpIHBhcmFtZXRlcnMsIGFzIDIgcGFyYW1ldGVycyBpcyB0aGUgY29tbW9uIGNhc2UKKy0tCisKK2Z1bmN0aW9uIGJpdC5iYW5kICh4LCB5LCB6LCAuLi4pCisgIGlmIG5vdCB6IHRoZW4KKyAgICByZXR1cm4gKCh4IG9yIC0xKSAmICh5IG9yIC0xKSkgJiAweEZGRkZGRkZGCisgIGVsc2UKKyAgICBsb2NhbCBhcmcgPSB7Li4ufQorICAgIGxvY2FsIHJlcyA9IHggJiB5ICYgegorICAgIGZvciBpID0gMSwgI2FyZyBkbyByZXMgPSByZXMgJiBhcmdbaV0gZW5kCisgICAgcmV0dXJuIHJlcyAmIDB4RkZGRkZGRkYKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gYml0LmJvciAoeCwgeSwgeiwgLi4uKQorICBpZiBub3QgeiB0aGVuCisgICAgcmV0dXJuICgoeCBvciAwKSB8ICh5IG9yIDApKSAmIDB4RkZGRkZGRkYKKyAgZWxzZQorICAgIGxvY2FsIGFyZyA9IHsuLi59CisgICAgbG9jYWwgcmVzID0geCB8IHkgfCB6CisgICAgZm9yIGkgPSAxLCAjYXJnIGRvIHJlcyA9IHJlcyB8IGFyZ1tpXSBlbmQKKyAgICByZXR1cm4gcmVzICYgMHhGRkZGRkZGRgorICBlbmQKK2VuZAorCitmdW5jdGlvbiBiaXQuYnhvciAoeCwgeSwgeiwgLi4uKQorICBpZiBub3QgeiB0aGVuCisgICAgcmV0dXJuICgoeCBvciAwKSB+ICh5IG9yIDApKSAmIDB4RkZGRkZGRkYKKyAgZWxzZQorICAgIGxvY2FsIGFyZyA9IHsuLi59CisgICAgbG9jYWwgcmVzID0geCB+IHkgfiB6CisgICAgZm9yIGkgPSAxLCAjYXJnIGRvIHJlcyA9IHJlcyB+IGFyZ1tpXSBlbmQKKyAgICByZXR1cm4gcmVzICYgMHhGRkZGRkZGRgorICBlbmQKK2VuZAorCitmdW5jdGlvbiBiaXQuYnRlc3QgKC4uLikKKyAgcmV0dXJuIGJpdC5iYW5kKC4uLikgfj0gMAorZW5kCisKK2Z1bmN0aW9uIGJpdC5sc2hpZnQgKGEsIGIpCisgIHJldHVybiAoKGEgJiAweEZGRkZGRkZGKSA8PCBiKSAmIDB4RkZGRkZGRkYKK2VuZAorCitmdW5jdGlvbiBiaXQucnNoaWZ0IChhLCBiKQorICByZXR1cm4gKChhICYgMHhGRkZGRkZGRikgPj4gYikgJiAweEZGRkZGRkZGCitlbmQKKworZnVuY3Rpb24gYml0LmFyc2hpZnQgKGEsIGIpCisgIGEgPSBhICYgMHhGRkZGRkZGRgorICBpZiBiIDw9IDAgb3IgKGEgJiAweDgwMDAwMDAwKSA9PSAwIHRoZW4KKyAgICByZXR1cm4gKGEgPj4gYikgJiAweEZGRkZGRkZGCisgIGVsc2UKKyAgICByZXR1cm4gKChhID4+IGIpIHwgfigweEZGRkZGRkZGID4+IGIpKSAmIDB4RkZGRkZGRkYKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gYml0Lmxyb3RhdGUgKGEgLGIpCisgIGIgPSBiICYgMzEKKyAgYSA9IGEgJiAweEZGRkZGRkZGCisgIGEgPSAoYSA8PCBiKSB8IChhID4+ICgzMiAtIGIpKQorICByZXR1cm4gYSAmIDB4RkZGRkZGRkYKK2VuZAorCitmdW5jdGlvbiBiaXQucnJvdGF0ZSAoYSwgYikKKyAgcmV0dXJuIGJpdC5scm90YXRlKGEsIC1iKQorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIGNoZWNrZmllbGQgKGYsIHcpCisgIHcgPSB3IG9yIDEKKyAgYXNzZXJ0KGYgPj0gMCwgImZpZWxkIGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgIGFzc2VydCh3ID4gMCwgIndpZHRoIG11c3QgYmUgcG9zaXRpdmUiKQorICBhc3NlcnQoZiArIHcgPD0gMzIsICJ0cnlpbmcgdG8gYWNjZXNzIG5vbi1leGlzdGVudCBiaXRzIikKKyAgcmV0dXJuIGYsIH4oLTEgPDwgdykKK2VuZAorCitmdW5jdGlvbiBiaXQuZXh0cmFjdCAoYSwgZiwgdykKKyAgbG9jYWwgZiwgbWFzayA9IGNoZWNrZmllbGQoZiwgdykKKyAgcmV0dXJuIChhID4+IGYpICYgbWFzaworZW5kCisKK2Z1bmN0aW9uIGJpdC5yZXBsYWNlIChhLCB2LCBmLCB3KQorICBsb2NhbCBmLCBtYXNrID0gY2hlY2tmaWVsZChmLCB3KQorICB2ID0gdiAmIG1hc2sKKyAgYSA9IChhICYgfihtYXNrIDw8IGYpKSB8ICh2IDw8IGYpCisgIHJldHVybiBhICYgMHhGRkZGRkZGRgorZW5kCisKK3JldHVybiBiaXQKKworZW5kICAtLX0KKworCitwcmludCgidGVzdGluZyBiaXR3aXNlIGxpYnJhcnkiKQorCitsb2NhbCBiaXQzMiA9IHJlcXVpcmUnYml0MzInCisKK2Fzc2VydChiaXQzMi5iYW5kKCkgPT0gYml0MzIuYm5vdCgwKSkKK2Fzc2VydChiaXQzMi5idGVzdCgpID09IHRydWUpCithc3NlcnQoYml0MzIuYm9yKCkgPT0gMCkKK2Fzc2VydChiaXQzMi5ieG9yKCkgPT0gMCkKKworYXNzZXJ0KGJpdDMyLmJhbmQoKSA9PSBiaXQzMi5iYW5kKDB4ZmZmZmZmZmYpKQorYXNzZXJ0KGJpdDMyLmJhbmQoMSwyKSA9PSAwKQorCisKKy0tIG91dC1vZi1yYW5nZSBudW1iZXJzCithc3NlcnQoYml0MzIuYmFuZCgtMSkgPT0gMHhmZmZmZmZmZikKK2Fzc2VydChiaXQzMi5iYW5kKCgxIDw8IDMzKSAtIDEpID09IDB4ZmZmZmZmZmYpCithc3NlcnQoYml0MzIuYmFuZCgtKDEgPDwgMzMpIC0gMSkgPT0gMHhmZmZmZmZmZikKK2Fzc2VydChiaXQzMi5iYW5kKCgxIDw8IDMzKSArIDEpID09IDEpCithc3NlcnQoYml0MzIuYmFuZCgtKDEgPDwgMzMpICsgMSkgPT0gMSkKK2Fzc2VydChiaXQzMi5iYW5kKC0oMSA8PCA0MCkpID09IDApCithc3NlcnQoYml0MzIuYmFuZCgxIDw8IDQwKSA9PSAwKQorYXNzZXJ0KGJpdDMyLmJhbmQoLSgxIDw8IDQwKSAtIDIpID09IDB4ZmZmZmZmZmUpCithc3NlcnQoYml0MzIuYmFuZCgoMSA8PCA0MCkgLSA0KSA9PSAweGZmZmZmZmZjKQorCithc3NlcnQoYml0MzIubHJvdGF0ZSgwLCAtMSkgPT0gMCkKK2Fzc2VydChiaXQzMi5scm90YXRlKDAsIDcpID09IDApCithc3NlcnQoYml0MzIubHJvdGF0ZSgweDEyMzQ1Njc4LCAwKSA9PSAweDEyMzQ1Njc4KQorYXNzZXJ0KGJpdDMyLmxyb3RhdGUoMHgxMjM0NTY3OCwgMzIpID09IDB4MTIzNDU2NzgpCithc3NlcnQoYml0MzIubHJvdGF0ZSgweDEyMzQ1Njc4LCA0KSA9PSAweDIzNDU2NzgxKQorYXNzZXJ0KGJpdDMyLnJyb3RhdGUoMHgxMjM0NTY3OCwgLTQpID09IDB4MjM0NTY3ODEpCithc3NlcnQoYml0MzIubHJvdGF0ZSgweDEyMzQ1Njc4LCAtOCkgPT0gMHg3ODEyMzQ1NikKK2Fzc2VydChiaXQzMi5ycm90YXRlKDB4MTIzNDU2NzgsIDgpID09IDB4NzgxMjM0NTYpCithc3NlcnQoYml0MzIubHJvdGF0ZSgweGFhYWFhYWFhLCAyKSA9PSAweGFhYWFhYWFhKQorYXNzZXJ0KGJpdDMyLmxyb3RhdGUoMHhhYWFhYWFhYSwgLTIpID09IDB4YWFhYWFhYWEpCitmb3IgaSA9IC01MCwgNTAgZG8KKyAgYXNzZXJ0KGJpdDMyLmxyb3RhdGUoMHg4OWFiY2RlZiwgaSkgPT0gYml0MzIubHJvdGF0ZSgweDg5YWJjZGVmLCBpJTMyKSkKK2VuZAorCithc3NlcnQoYml0MzIubHNoaWZ0KDB4MTIzNDU2NzgsIDQpID09IDB4MjM0NTY3ODApCithc3NlcnQoYml0MzIubHNoaWZ0KDB4MTIzNDU2NzgsIDgpID09IDB4MzQ1Njc4MDApCithc3NlcnQoYml0MzIubHNoaWZ0KDB4MTIzNDU2NzgsIC00KSA9PSAweDAxMjM0NTY3KQorYXNzZXJ0KGJpdDMyLmxzaGlmdCgweDEyMzQ1Njc4LCAtOCkgPT0gMHgwMDEyMzQ1NikKK2Fzc2VydChiaXQzMi5sc2hpZnQoMHgxMjM0NTY3OCwgMzIpID09IDApCithc3NlcnQoYml0MzIubHNoaWZ0KDB4MTIzNDU2NzgsIC0zMikgPT0gMCkKK2Fzc2VydChiaXQzMi5yc2hpZnQoMHgxMjM0NTY3OCwgNCkgPT0gMHgwMTIzNDU2NykKK2Fzc2VydChiaXQzMi5yc2hpZnQoMHgxMjM0NTY3OCwgOCkgPT0gMHgwMDEyMzQ1NikKK2Fzc2VydChiaXQzMi5yc2hpZnQoMHgxMjM0NTY3OCwgMzIpID09IDApCithc3NlcnQoYml0MzIucnNoaWZ0KDB4MTIzNDU2NzgsIC0zMikgPT0gMCkKK2Fzc2VydChiaXQzMi5hcnNoaWZ0KDB4MTIzNDU2NzgsIDApID09IDB4MTIzNDU2NzgpCithc3NlcnQoYml0MzIuYXJzaGlmdCgweDEyMzQ1Njc4LCAxKSA9PSAweDEyMzQ1Njc4IC8vIDIpCithc3NlcnQoYml0MzIuYXJzaGlmdCgweDEyMzQ1Njc4LCAtMSkgPT0gMHgxMjM0NTY3OCAqIDIpCithc3NlcnQoYml0MzIuYXJzaGlmdCgtMSwgMSkgPT0gMHhmZmZmZmZmZikKK2Fzc2VydChiaXQzMi5hcnNoaWZ0KC0xLCAyNCkgPT0gMHhmZmZmZmZmZikKK2Fzc2VydChiaXQzMi5hcnNoaWZ0KC0xLCAzMikgPT0gMHhmZmZmZmZmZikKK2Fzc2VydChiaXQzMi5hcnNoaWZ0KC0xLCAtMSkgPT0gYml0MzIuYmFuZCgtMSAqIDIsIDB4ZmZmZmZmZmYpKQorCithc3NlcnQoMHgxMjM0NTY3OCA8PCA0ID09IDB4MTIzNDU2NzgwKQorYXNzZXJ0KDB4MTIzNDU2NzggPDwgOCA9PSAweDEyMzQ1Njc4MDApCithc3NlcnQoMHgxMjM0NTY3OCA8PCAtNCA9PSAweDAxMjM0NTY3KQorYXNzZXJ0KDB4MTIzNDU2NzggPDwgLTggPT0gMHgwMDEyMzQ1NikKK2Fzc2VydCgweDEyMzQ1Njc4IDw8IDMyID09IDB4MTIzNDU2NzgwMDAwMDAwMCkKK2Fzc2VydCgweDEyMzQ1Njc4IDw8IC0zMiA9PSAwKQorYXNzZXJ0KDB4MTIzNDU2NzggPj4gNCA9PSAweDAxMjM0NTY3KQorYXNzZXJ0KDB4MTIzNDU2NzggPj4gOCA9PSAweDAwMTIzNDU2KQorYXNzZXJ0KDB4MTIzNDU2NzggPj4gMzIgPT0gMCkKK2Fzc2VydCgweDEyMzQ1Njc4ID4+IC0zMiA9PSAweDEyMzQ1Njc4MDAwMDAwMDApCisKK3ByaW50KCIrIikKKy0tIHNvbWUgc3BlY2lhbCBjYXNlcworbG9jYWwgYyA9IHswLCAxLCAyLCAzLCAxMCwgMHg4MDAwMDAwMCwgMHhhYWFhYWFhYSwgMHg1NTU1NTU1NSwKKyAgICAgICAgICAgMHhmZmZmZmZmZiwgMHg3ZmZmZmZmZn0KKworZm9yIF8sIGIgaW4gcGFpcnMoYykgZG8KKyAgYXNzZXJ0KGJpdDMyLmJhbmQoYikgPT0gYikKKyAgYXNzZXJ0KGJpdDMyLmJhbmQoYiwgYikgPT0gYikKKyAgYXNzZXJ0KGJpdDMyLmJhbmQoYiwgYiwgYiwgYikgPT0gYikKKyAgYXNzZXJ0KGJpdDMyLmJ0ZXN0KGIsIGIpID09IChiIH49IDApKQorICBhc3NlcnQoYml0MzIuYmFuZChiLCBiLCBiKSA9PSBiKQorICBhc3NlcnQoYml0MzIuYmFuZChiLCBiLCBiLCB+YikgPT0gMCkKKyAgYXNzZXJ0KGJpdDMyLmJ0ZXN0KGIsIGIsIGIpID09IChiIH49IDApKQorICBhc3NlcnQoYml0MzIuYmFuZChiLCBiaXQzMi5ibm90KGIpKSA9PSAwKQorICBhc3NlcnQoYml0MzIuYm9yKGIsIGJpdDMyLmJub3QoYikpID09IGJpdDMyLmJub3QoMCkpCisgIGFzc2VydChiaXQzMi5ib3IoYikgPT0gYikKKyAgYXNzZXJ0KGJpdDMyLmJvcihiLCBiKSA9PSBiKQorICBhc3NlcnQoYml0MzIuYm9yKGIsIGIsIGIpID09IGIpCisgIGFzc2VydChiaXQzMi5ib3IoYiwgYiwgMCwgfmIpID09IDB4ZmZmZmZmZmYpCisgIGFzc2VydChiaXQzMi5ieG9yKGIpID09IGIpCisgIGFzc2VydChiaXQzMi5ieG9yKGIsIGIpID09IDApCisgIGFzc2VydChiaXQzMi5ieG9yKGIsIGIsIGIpID09IGIpCisgIGFzc2VydChiaXQzMi5ieG9yKGIsIGIsIGIsIGIpID09IDApCisgIGFzc2VydChiaXQzMi5ieG9yKGIsIDApID09IGIpCisgIGFzc2VydChiaXQzMi5ibm90KGIpIH49IGIpCisgIGFzc2VydChiaXQzMi5ibm90KGJpdDMyLmJub3QoYikpID09IGIpCisgIGFzc2VydChiaXQzMi5ibm90KGIpID09ICgxIDw8IDMyKSAtIDEgLSBiKQorICBhc3NlcnQoYml0MzIubHJvdGF0ZShiLCAzMikgPT0gYikKKyAgYXNzZXJ0KGJpdDMyLnJyb3RhdGUoYiwgMzIpID09IGIpCisgIGFzc2VydChiaXQzMi5sc2hpZnQoYml0MzIubHNoaWZ0KGIsIC00KSwgNCkgPT0gYml0MzIuYmFuZChiLCBiaXQzMi5ibm90KDB4ZikpKQorICBhc3NlcnQoYml0MzIucnNoaWZ0KGJpdDMyLnJzaGlmdChiLCA0KSwgLTQpID09IGJpdDMyLmJhbmQoYiwgYml0MzIuYm5vdCgweGYpKSkKK2VuZAorCistLSBmb3IgdGhpcyB0ZXN0LCB1c2UgYXQgbW9zdCAyNCBiaXRzIChtYW50aXNzYSBvZiBhIHNpbmdsZSBmbG9hdCkKK2MgPSB7MCwgMSwgMiwgMywgMTAsIDB4ODAwMDAwLCAweGFhYWFhYSwgMHg1NTU1NTUsIDB4ZmZmZmZmLCAweDdmZmZmZn0KK2ZvciBfLCBiIGluIHBhaXJzKGMpIGRvCisgIGZvciBpID0gLTQwLCA0MCBkbworICAgIGxvY2FsIHggPSBiaXQzMi5sc2hpZnQoYiwgaSkKKyAgICBsb2NhbCB5ID0gbWF0aC5mbG9vcihtYXRoLmZtb2QoYiAqIDIuMF5pLCAyLjBeMzIpKQorICAgIGFzc2VydChtYXRoLmZtb2QoeCAtIHksIDIuMF4zMikgPT0gMCkKKyAgZW5kCitlbmQKKworYXNzZXJ0KG5vdCBwY2FsbChiaXQzMi5iYW5kLCB7fSkpCithc3NlcnQobm90IHBjYWxsKGJpdDMyLmJub3QsICJhIikpCithc3NlcnQobm90IHBjYWxsKGJpdDMyLmxzaGlmdCwgNDUpKQorYXNzZXJ0KG5vdCBwY2FsbChiaXQzMi5sc2hpZnQsIDQ1LCBwcmludCkpCithc3NlcnQobm90IHBjYWxsKGJpdDMyLnJzaGlmdCwgNDUsIHByaW50KSkKKworcHJpbnQoIisiKQorCisKKy0tIHRlc3RpbmcgZXh0cmFjdC9yZXBsYWNlCisKK2Fzc2VydChiaXQzMi5leHRyYWN0KDB4MTIzNDU2NzgsIDAsIDQpID09IDgpCithc3NlcnQoYml0MzIuZXh0cmFjdCgweDEyMzQ1Njc4LCA0LCA0KSA9PSA3KQorYXNzZXJ0KGJpdDMyLmV4dHJhY3QoMHhhMDAwMTExMSwgMjgsIDQpID09IDB4YSkKK2Fzc2VydChiaXQzMi5leHRyYWN0KDB4YTAwMDExMTEsIDMxLCAxKSA9PSAxKQorYXNzZXJ0KGJpdDMyLmV4dHJhY3QoMHg1MDAwMDExMSwgMzEsIDEpID09IDApCithc3NlcnQoYml0MzIuZXh0cmFjdCgweGYyMzQ1Njc5LCAwLCAzMikgPT0gMHhmMjM0NTY3OSkKKworYXNzZXJ0KG5vdCBwY2FsbChiaXQzMi5leHRyYWN0LCAwLCAtMSkpCithc3NlcnQobm90IHBjYWxsKGJpdDMyLmV4dHJhY3QsIDAsIDMyKSkKK2Fzc2VydChub3QgcGNhbGwoYml0MzIuZXh0cmFjdCwgMCwgMCwgMzMpKQorYXNzZXJ0KG5vdCBwY2FsbChiaXQzMi5leHRyYWN0LCAwLCAzMSwgMikpCisKK2Fzc2VydChiaXQzMi5yZXBsYWNlKDB4MTIzNDU2NzgsIDUsIDI4LCA0KSA9PSAweDUyMzQ1Njc4KQorYXNzZXJ0KGJpdDMyLnJlcGxhY2UoMHgxMjM0NTY3OCwgMHg4NzY1NDMyMSwgMCwgMzIpID09IDB4ODc2NTQzMjEpCithc3NlcnQoYml0MzIucmVwbGFjZSgwLCAxLCAyKSA9PSAyXjIpCithc3NlcnQoYml0MzIucmVwbGFjZSgwLCAtMSwgNCkgPT0gMl40KQorYXNzZXJ0KGJpdDMyLnJlcGxhY2UoLTEsIDAsIDMxKSA9PSAoMSA8PCAzMSkgLSAxKQorYXNzZXJ0KGJpdDMyLnJlcGxhY2UoLTEsIDAsIDEsIDIpID09ICgxIDw8IDMyKSAtIDcpCisKKworLS0gdGVzdGluZyBjb252ZXJzaW9uIG9mIGZsb2F0cworCithc3NlcnQoYml0MzIuYm9yKDMuMCkgPT0gMykKK2Fzc2VydChiaXQzMi5ib3IoLTQuMCkgPT0gMHhmZmZmZmZmYykKKworLS0gbGFyZ2UgZmxvYXRzIGFuZCBsYXJnZS1lbm91Z2ggaW50ZWdlcnM/CitpZiAyLjBeNTAgPCAyLjBeNTAgKyAxLjAgYW5kIDIuMF41MCA8ICgtMSA+PiAxKSB0aGVuCisgIGFzc2VydChiaXQzMi5ib3IoMi4wXjMyIC0gNS4wKSA9PSAweGZmZmZmZmZiKQorICBhc3NlcnQoYml0MzIuYm9yKC0yLjBeMzIgLSA2LjApID09IDB4ZmZmZmZmZmEpCisgIGFzc2VydChiaXQzMi5ib3IoMi4wXjQ4IC0gNS4wKSA9PSAweGZmZmZmZmZiKQorICBhc3NlcnQoYml0MzIuYm9yKC0yLjBeNDggLSA2LjApID09IDB4ZmZmZmZmZmEpCitlbmQKKworcHJpbnQnT0snCisKZGlmZiAtLWdpdCBhL3Rlc3Rlcy9id2NvZXJjaW9uLmx1YSBiL3Rlc3Rlcy9id2NvZXJjaW9uLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDczNWFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGVzL2J3Y29lcmNpb24ubHVhCkBAIC0wLDAgKzEsNzggQEAKK2xvY2FsIHRvbnVtYmVyLCB0b2ludGVnZXIgPSB0b251bWJlciwgbWF0aC50b2ludGVnZXIKK2xvY2FsIHR5cGUsIGdldG1ldGF0YWJsZSwgcmF3Z2V0LCBlcnJvciA9IHR5cGUsIGdldG1ldGF0YWJsZSwgcmF3Z2V0LCBlcnJvcgorbG9jYWwgc3Ryc3ViID0gc3RyaW5nLnN1YgorCitsb2NhbCBwcmludCA9IHByaW50CisKK19FTlYgPSBuaWwKKworLS0gVHJ5IHRvIGNvbnZlcnQgYSB2YWx1ZSB0byBhbiBpbnRlZ2VyLCB3aXRob3V0IGFzc3VtaW5nIGFueSBjb2VyY2lvbi4KK2xvY2FsIGZ1bmN0aW9uIHRvaW50ICh4KQorICB4ID0gdG9udW1iZXIoeCkgICAtLSBoYW5kbGUgbnVtZXJpY2FsIHN0cmluZ3MKKyAgaWYgbm90IHggdGhlbgorICAgIHJldHVybiBmYWxzZSAgICAtLSBub3QgY29lcmNpYmxlIHRvIGEgbnVtYmVyCisgIGVuZAorICByZXR1cm4gdG9pbnRlZ2VyKHgpCitlbmQKKworCistLSBJZiBvcGVyYXRpb24gZmFpbHMsIG1heWJlIHNlY29uZCBvcGVyYW5kIGhhcyBhIG1ldGFtZXRob2QgdGhhdCBzaG91bGQKKy0tIGhhdmUgYmVlbiBjYWxsZWQgaWYgbm90IGZvciB0aGlzIHN0cmluZyBtZXRhbWV0aG9kLCBzbyB0cnkgdG8KKy0tIGNhbGwgaXQuCitsb2NhbCBmdW5jdGlvbiB0cnltdCAoeCwgeSwgbXRuYW1lKQorICBpZiB0eXBlKHkpIH49ICJzdHJpbmciIHRoZW4gICAgLS0gYXZvaWQgcmVjYWxsaW5nIG9yaWdpbmFsIG1ldGFtZXRob2QKKyAgICBsb2NhbCBtdCA9IGdldG1ldGF0YWJsZSh5KQorICAgIGxvY2FsIG1tID0gbXQgYW5kIHJhd2dldChtdCwgbXRuYW1lKQorICAgIGlmIG1tIHRoZW4KKyAgICAgIHJldHVybiBtbSh4LCB5KQorICAgIGVuZAorICBlbmQKKyAgLS0gaWYgYW55IHRlc3QgZmFpbHMsIHRoZXJlIGlzIG5vIG90aGVyIG1ldGFtZXRob2QgdG8gYmUgY2FsbGVkCisgIGVycm9yKCJhdHRlbXB0IHRvICciIC4uIHN0cnN1YihtdG5hbWUsIDMpIC4uCisgICAgICAgICInIGEgIiAuLiB0eXBlKHgpIC4uICIgd2l0aCBhICIgLi4gdHlwZSh5KSwgNCkKK2VuZAorCisKK2xvY2FsIGZ1bmN0aW9uIGNoZWNrYXJncyAoeCwgeSwgbXRuYW1lKQorICBsb2NhbCB4aSA9IHRvaW50KHgpCisgIGxvY2FsIHlpID0gdG9pbnQoeSkKKyAgaWYgeGkgYW5kIHlpIHRoZW4KKyAgICByZXR1cm4geGksIHlpCisgIGVsc2UKKyAgICByZXR1cm4gdHJ5bXQoeCwgeSwgbXRuYW1lKSwgbmlsCisgIGVuZAorZW5kCisKKworbG9jYWwgc210ID0gZ2V0bWV0YXRhYmxlKCIiKQorCitzbXQuX19iYW5kID0gZnVuY3Rpb24gKHgsIHkpCisgIGxvY2FsIHgsIHkgPSBjaGVja2FyZ3MoeCwgeSwgIl9fYmFuZCIpCisgIHJldHVybiB5IGFuZCB4ICYgeSBvciB4CitlbmQKKworc210Ll9fYm9yID0gZnVuY3Rpb24gKHgsIHkpCisgIGxvY2FsIHgsIHkgPSBjaGVja2FyZ3MoeCwgeSwgIl9fYm9yIikKKyAgcmV0dXJuIHkgYW5kIHggfCB5IG9yIHgKK2VuZAorCitzbXQuX19ieG9yID0gZnVuY3Rpb24gKHgsIHkpCisgIGxvY2FsIHgsIHkgPSBjaGVja2FyZ3MoeCwgeSwgIl9fYnhvciIpCisgIHJldHVybiB5IGFuZCB4IH4geSBvciB4CitlbmQKKworc210Ll9fc2hsID0gZnVuY3Rpb24gKHgsIHkpCisgIGxvY2FsIHgsIHkgPSBjaGVja2FyZ3MoeCwgeSwgIl9fc2hsIikKKyAgcmV0dXJuIHkgYW5kIHggPDwgeSBvciB4CitlbmQKKworc210Ll9fc2hyID0gZnVuY3Rpb24gKHgsIHkpCisgIGxvY2FsIHgsIHkgPSBjaGVja2FyZ3MoeCwgeSwgIl9fc2hyIikKKyAgcmV0dXJuIHkgYW5kIHggPj4geSBvciB4CitlbmQKKworc210Ll9fYm5vdCA9IGZ1bmN0aW9uICh4KQorICBsb2NhbCB4LCB5ID0gY2hlY2thcmdzKHgsIHgsICJfX2Jub3QiKQorICByZXR1cm4geSBhbmQgfnggb3IgeAorZW5kCisKZGlmZiAtLWdpdCBhL3Rlc3Rlcy9jYWxscy5sdWEgYi90ZXN0ZXMvY2FsbHMubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZDlkNmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0ZXMvY2FsbHMubHVhCkBAIC0wLDAgKzEsNDM1IEBACistLSAkSWQ6IGNhbGxzLmx1YSx2IDEuNjYgMjAxOC8wMi8wOSAxNjozNToyMSByb2JlcnRvIEV4cCAkCistLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBmaWxlIGFsbC5sdWEKKworcHJpbnQoInRlc3RpbmcgZnVuY3Rpb25zIGFuZCBjYWxscyIpCisKK2xvY2FsIGRlYnVnID0gcmVxdWlyZSAiZGVidWciCisKKy0tIGdldCB0aGUgb3Bwb3J0dW5pdHkgdG8gdGVzdCAndHlwZScgdG9vIDspCisKK2Fzc2VydCh0eXBlKDE8MikgPT0gJ2Jvb2xlYW4nKQorYXNzZXJ0KHR5cGUodHJ1ZSkgPT0gJ2Jvb2xlYW4nIGFuZCB0eXBlKGZhbHNlKSA9PSAnYm9vbGVhbicpCithc3NlcnQodHlwZShuaWwpID09ICduaWwnCisgICBhbmQgdHlwZSgtMykgPT0gJ251bWJlcicKKyAgIGFuZCB0eXBlJ3gnID09ICdzdHJpbmcnCisgICBhbmQgdHlwZXt9ID09ICd0YWJsZScKKyAgIGFuZCB0eXBlKHR5cGUpID09ICdmdW5jdGlvbicpCisKK2Fzc2VydCh0eXBlKGFzc2VydCkgPT0gdHlwZShwcmludCkpCitmdW5jdGlvbiBmICh4KSByZXR1cm4gYTp4ICh4KSBlbmQKK2Fzc2VydCh0eXBlKGYpID09ICdmdW5jdGlvbicpCithc3NlcnQobm90IHBjYWxsKHR5cGUpKQorCisKK2RvICAgIC0tIHRlc3QgZXJyb3IgaW4gJ3ByaW50JyB0b28uLi4KKyAgbG9jYWwgdG9zdHJpbmcgPSBfRU5WLnRvc3RyaW5nCisKKyAgX0VOVi50b3N0cmluZyA9IG5pbAorICBsb2NhbCBzdCwgbXNnID0gcGNhbGwocHJpbnQsIDEpCisgIGFzc2VydChzdCA9PSBmYWxzZSBhbmQgc3RyaW5nLmZpbmQobXNnLCAiYXR0ZW1wdCB0byBjYWxsIGEgbmlsIHZhbHVlIikpCisKKyAgX0VOVi50b3N0cmluZyA9IGZ1bmN0aW9uICgpIHJldHVybiB7fSBlbmQKKyAgbG9jYWwgc3QsIG1zZyA9IHBjYWxsKHByaW50LCAxKQorICBhc3NlcnQoc3QgPT0gZmFsc2UgYW5kIHN0cmluZy5maW5kKG1zZywgIm11c3QgcmV0dXJuIGEgc3RyaW5nIikpCisgIAorICBfRU5WLnRvc3RyaW5nID0gdG9zdHJpbmcKK2VuZAorCisKKy0tIHRlc3RpbmcgbG9jYWwtZnVuY3Rpb24gcmVjdXJzaW9uCitmYWN0ID0gZmFsc2UKK2RvCisgIGxvY2FsIHJlcyA9IDEKKyAgbG9jYWwgZnVuY3Rpb24gZmFjdCAobikKKyAgICBpZiBuPT0wIHRoZW4gcmV0dXJuIHJlcworICAgIGVsc2UgcmV0dXJuIG4qZmFjdChuLTEpCisgICAgZW5kCisgIGVuZAorICBhc3NlcnQoZmFjdCg1KSA9PSAxMjApCitlbmQKK2Fzc2VydChmYWN0ID09IGZhbHNlKQorCistLSB0ZXN0aW5nIGRlY2xhcmF0aW9ucworYSA9IHtpID0gMTB9CitzZWxmID0gMjAKK2Z1bmN0aW9uIGE6eCAoeCkgcmV0dXJuIHgrc2VsZi5pIGVuZAorZnVuY3Rpb24gYS55ICh4KSByZXR1cm4geCtzZWxmIGVuZAorCithc3NlcnQoYTp4KDEpKzEwID09IGEueSgxKSkKKworYS50ID0ge2k9LTEwMH0KK2FbInQiXS54ID0gZnVuY3Rpb24gKHNlbGYsIGEsYikgcmV0dXJuIHNlbGYuaSthK2IgZW5kCisKK2Fzc2VydChhLnQ6eCgyLDMpID09IC05NSkKKworZG8KKyAgbG9jYWwgYSA9IHt4PTB9CisgIGZ1bmN0aW9uIGE6YWRkICh4KSBzZWxmLngsIGEueSA9IHNlbGYueCt4LCAyMDsgcmV0dXJuIHNlbGYgZW5kCisgIGFzc2VydChhOmFkZCgxMCk6YWRkKDIwKTphZGQoMzApLnggPT0gNjAgYW5kIGEueSA9PSAyMCkKK2VuZAorCitsb2NhbCBhID0ge2I9e2M9e319fQorCitmdW5jdGlvbiBhLmIuYy5mMSAoeCkgcmV0dXJuIHgrMSBlbmQKK2Z1bmN0aW9uIGEuYi5jOmYyICh4LHkpIHNlbGZbeF0gPSB5IGVuZAorYXNzZXJ0KGEuYi5jLmYxKDQpID09IDUpCithLmIuYzpmMignaycsIDEyKTsgYXNzZXJ0KGEuYi5jLmsgPT0gMTIpCisKK3ByaW50KCcrJykKKwordCA9IG5pbCAgIC0tICdkZWNsYXJlJyB0CitmdW5jdGlvbiBmKGEsYixjKSBsb2NhbCBkID0gJ2EnOyB0PXthLGIsYyxkfSBlbmQKKworZiggICAgICAtLSB0aGlzIGxpbmUgY2hhbmdlIG11c3QgYmUgdmFsaWQKKyAgMSwyKQorYXNzZXJ0KHRbMV0gPT0gMSBhbmQgdFsyXSA9PSAyIGFuZCB0WzNdID09IG5pbCBhbmQgdFs0XSA9PSAnYScpCitmKDEsMiwgICAtLSB0aGlzIG9uZSB0b28KKyAgICAgIDMsNCkKK2Fzc2VydCh0WzFdID09IDEgYW5kIHRbMl0gPT0gMiBhbmQgdFszXSA9PSAzIGFuZCB0WzRdID09ICdhJykKKworZnVuY3Rpb24gZmF0KHgpCisgIGlmIHggPD0gMSB0aGVuIHJldHVybiAxCisgIGVsc2UgcmV0dXJuIHgqbG9hZCgicmV0dXJuIGZhdCgiIC4uIHgtMSAuLiAiKSIsICIiKSgpCisgIGVuZAorZW5kCisKK2Fzc2VydChsb2FkICJsb2FkICdhc3NlcnQoZmF0KDYpPT03MjApJyAoKSAiKSgpCithID0gbG9hZCgncmV0dXJuIGZhdCg1KSwgMycpCithLGIgPSBhKCkKK2Fzc2VydChhID09IDEyMCBhbmQgYiA9PSAzKQorcHJpbnQoJysnKQorCitmdW5jdGlvbiBlcnJfb25fbiAobikKKyAgaWYgbj09MCB0aGVuIGVycm9yKCk7IGV4aXQoMSk7CisgIGVsc2UgZXJyX29uX24gKG4tMSk7IGV4aXQoMSk7CisgIGVuZAorZW5kCisKK2RvCisgIGZ1bmN0aW9uIGR1bW15IChuKQorICAgIGlmIG4gPiAwIHRoZW4KKyAgICAgIGFzc2VydChub3QgcGNhbGwoZXJyX29uX24sIG4pKQorICAgICAgZHVtbXkobi0xKQorICAgIGVuZAorICBlbmQKK2VuZAorCitkdW1teSgxMCkKKworZnVuY3Rpb24gZGVlcCAobikKKyAgaWYgbj4wIHRoZW4gZGVlcChuLTEpIGVuZAorZW5kCitkZWVwKDEwKQorZGVlcCgxODApCisKKy0tIHRlc3RpbmcgdGFpbCBjYWxscworZnVuY3Rpb24gZGVlcCAobikgaWYgbj4wIHRoZW4gcmV0dXJuIGRlZXAobi0xKSBlbHNlIHJldHVybiAxMDEgZW5kIGVuZAorYXNzZXJ0KGRlZXAoMzAwMDApID09IDEwMSkKK2EgPSB7fQorZnVuY3Rpb24gYTpkZWVwIChuKSBpZiBuPjAgdGhlbiByZXR1cm4gc2VsZjpkZWVwKG4tMSkgZWxzZSByZXR1cm4gMTAxIGVuZCBlbmQKK2Fzc2VydChhOmRlZXAoMzAwMDApID09IDEwMSkKKworZG8gICAtLSB0YWlsIGNhbGxzIHggdmFyYXJncworICBsb2NhbCBmdW5jdGlvbiBmb28gKHgsIC4uLikgbG9jYWwgYSA9IHsuLi59OyByZXR1cm4geCwgYVsxXSwgYVsyXSBlbmQKKworICBsb2NhbCBmdW5jdGlvbiBmb28xICh4KSByZXR1cm4gZm9vKDEwLCB4LCB4ICsgMSkgZW5kCisKKyAgbG9jYWwgYSwgYiwgYyA9IGZvbzEoLTIpCisgIGFzc2VydChhID09IDEwIGFuZCBiID09IC0yIGFuZCBjID09IC0xKQorCisgIC0tIHRhaWwgY2FsbHMgeCBtZXRhbWV0aG9kcworICBsb2NhbCB0ID0gc2V0bWV0YXRhYmxlKHt9LCB7X19jYWxsID0gZm9vfSkKKyAgbG9jYWwgZnVuY3Rpb24gZm9vMiAoeCkgcmV0dXJuIHQoMTAsIHgpIGVuZAorICBhLCBiLCBjID0gZm9vMigxMDApCisgIGFzc2VydChhID09IHQgYW5kIGIgPT0gMTAgYW5kIGMgPT0gMTAwKQorCisgIGEsIGIgPSAoZnVuY3Rpb24gKCkgcmV0dXJuIGZvbygpIGVuZCkoKQorICBhc3NlcnQoYSA9PSBuaWwgYW5kIGIgPT0gbmlsKQorCisgIGxvY2FsIFgsIFksIEEKKyAgbG9jYWwgZnVuY3Rpb24gZm9vICh4LCB5LCAuLi4pIFggPSB4OyBZID0geTsgQSA9IHsuLi59IGVuZAorICBsb2NhbCBmdW5jdGlvbiBmb28xICguLi4pIHJldHVybiBmb28oLi4uKSBlbmQKKworICBsb2NhbCBhLCBiLCBjID0gZm9vMSgpCisgIGFzc2VydChYID09IG5pbCBhbmQgWSA9PSBuaWwgYW5kICNBID09IDApCisKKyAgYSwgYiwgYyA9IGZvbzEoMTApCisgIGFzc2VydChYID09IDEwIGFuZCBZID09IG5pbCBhbmQgI0EgPT0gMCkKKworICBhLCBiLCBjID0gZm9vMSgxMCwgMjApCisgIGFzc2VydChYID09IDEwIGFuZCBZID09IDIwIGFuZCAjQSA9PSAwKQorCisgIGEsIGIsIGMgPSBmb28xKDEwLCAyMCwgMzApCisgIGFzc2VydChYID09IDEwIGFuZCBZID09IDIwIGFuZCAjQSA9PSAxIGFuZCBBWzFdID09IDMwKQorZW5kCisKK3ByaW50KCcrJykKKworCithID0gbmlsCisoZnVuY3Rpb24gKHgpIGE9eCBlbmQpKDIzKQorYXNzZXJ0KGEgPT0gMjMgYW5kIChmdW5jdGlvbiAoeCkgcmV0dXJuIHgqMiBlbmQpKDIwKSA9PSA0MCkKKworCistLSB0ZXN0aW5nIGNsb3N1cmVzCisKKy0tIGZpeGVkLXBvaW50IG9wZXJhdG9yCitaID0gZnVuY3Rpb24gKGxlKQorICAgICAgbG9jYWwgZnVuY3Rpb24gYSAoZikKKyAgICAgICAgcmV0dXJuIGxlKGZ1bmN0aW9uICh4KSByZXR1cm4gZihmKSh4KSBlbmQpCisgICAgICBlbmQKKyAgICAgIHJldHVybiBhKGEpCisgICAgZW5kCisKKworLS0gbm9uLXJlY3Vyc2l2ZSBmYWN0b3JpYWwKKworRiA9IGZ1bmN0aW9uIChmKQorICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuKQorICAgICAgICAgICAgICAgaWYgbiA9PSAwIHRoZW4gcmV0dXJuIDEKKyAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIG4qZihuLTEpIGVuZAorICAgICAgICAgICAgIGVuZAorICAgIGVuZAorCitmYXQgPSBaKEYpCisKK2Fzc2VydChmYXQoMCkgPT0gMSBhbmQgZmF0KDQpID09IDI0IGFuZCBaKEYpKDUpPT01KlooRikoNCkpCisKK2xvY2FsIGZ1bmN0aW9uIGcgKHopCisgIGxvY2FsIGZ1bmN0aW9uIGYgKGEsYixjLGQpCisgICAgcmV0dXJuIGZ1bmN0aW9uICh4LHkpIHJldHVybiBhK2IrYytkK2EreCt5K3ogZW5kCisgIGVuZAorICByZXR1cm4gZih6LHorMSx6KzIseiszKQorZW5kCisKK2YgPSBnKDEwKQorYXNzZXJ0KGYoOSwgMTYpID09IDEwKzExKzEyKzEzKzEwKzkrMTYrMTApCisKK1osIEYsIGYgPSBuaWwKK3ByaW50KCcrJykKKworLS0gdGVzdGluZyBtdWx0aXBsZSByZXR1cm5zCisKK2Z1bmN0aW9uIHVubHBhY2sgKHQsIGkpCisgIGkgPSBpIG9yIDEKKyAgaWYgKGkgPD0gI3QpIHRoZW4KKyAgICByZXR1cm4gdFtpXSwgdW5scGFjayh0LCBpKzEpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIGVxdWFsdGFiICh0MSwgdDIpCisgIGFzc2VydCgjdDEgPT0gI3QyKQorICBmb3IgaSA9IDEsICN0MSBkbworICAgIGFzc2VydCh0MVtpXSA9PSB0MltpXSkKKyAgZW5kCitlbmQKKworbG9jYWwgcGFjayA9IGZ1bmN0aW9uICguLi4pIHJldHVybiAodGFibGUucGFjayguLi4pKSBlbmQKKworZnVuY3Rpb24gZigpIHJldHVybiAxLDIsMzAsNCBlbmQKK2Z1bmN0aW9uIHJldDIgKGEsYikgcmV0dXJuIGEsYiBlbmQKKworbG9jYWwgYSxiLGMsZCA9IHVubHBhY2t7MSwyLDN9Cithc3NlcnQoYT09MSBhbmQgYj09MiBhbmQgYz09MyBhbmQgZD09bmlsKQorYSA9IHsxLDIsMyw0LGZhbHNlLDEwLCdhbG8nLGZhbHNlLGFzc2VydH0KK2VxdWFsdGFiKHBhY2sodW5scGFjayhhKSksIGEpCitlcXVhbHRhYihwYWNrKHVubHBhY2soYSksIC0xKSwgezEsLTF9KQorYSxiLGMsZCA9IHJldDIoZigpKSwgcmV0MihmKCkpCithc3NlcnQoYT09MSBhbmQgYj09MSBhbmQgYz09MiBhbmQgZD09bmlsKQorYSxiLGMsZCA9IHVubHBhY2socGFjayhyZXQyKGYoKSksIHJldDIoZigpKSkpCithc3NlcnQoYT09MSBhbmQgYj09MSBhbmQgYz09MiBhbmQgZD09bmlsKQorYSxiLGMsZCA9IHVubHBhY2socGFjayhyZXQyKGYoKSksIChyZXQyKGYoKSkpKSkKK2Fzc2VydChhPT0xIGFuZCBiPT0xIGFuZCBjPT1uaWwgYW5kIGQ9PW5pbCkKKworYSA9IHJldDJ7IHVubHBhY2t7MSwyLDN9LCB1bmxwYWNrezMsMiwxfSwgdW5scGFja3siYSIsICJiIn19Cithc3NlcnQoYVsxXSA9PSAxIGFuZCBhWzJdID09IDMgYW5kIGFbM10gPT0gImEiIGFuZCBhWzRdID09ICJiIikKKworCistLSB0ZXN0aW5nIGNhbGxzIHdpdGggJ2luY29ycmVjdCcgYXJndW1lbnRzCityYXdnZXQoe30sICJ4IiwgMSkKK3Jhd3NldCh7fSwgIngiLCAxLCAyKQorYXNzZXJ0KG1hdGguc2luKDEsMikgPT0gbWF0aC5zaW4oMSkpCit0YWJsZS5zb3J0KHsxMCw5LDgsNCwxOSwyMywwLDB9LCBmdW5jdGlvbiAoYSxiKSByZXR1cm4gYTxiIGVuZCwgImV4dHJhIGFyZyIpCisKKworLS0gdGVzdCBmb3IgZ2VuZXJpYyBsb2FkCitsb2NhbCB4ID0gIi0tIGEgY29tbWVudFwwXDBcMFxuICB4ID0gMTAgKyBcbjIzOyBcCisgICAgIGxvY2FsIGEgPSBmdW5jdGlvbiAoKSB4ID0gJ2hpJyBlbmQ7IFwKKyAgICAgcmV0dXJuICdcMCciCitmdW5jdGlvbiByZWFkMSAoeCkKKyAgbG9jYWwgaSA9IDAKKyAgcmV0dXJuIGZ1bmN0aW9uICgpCisgICAgY29sbGVjdGdhcmJhZ2UoKQorICAgIGk9aSsxCisgICAgcmV0dXJuIHN0cmluZy5zdWIoeCwgaSwgaSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gY2Fubm90bG9hZCAobXNnLCBhLGIpCisgIGFzc2VydChub3QgYSBhbmQgc3RyaW5nLmZpbmQoYiwgbXNnKSkKK2VuZAorCithID0gYXNzZXJ0KGxvYWQocmVhZDEoeCksICJtb2RuYW1lIiwgInQiLCBfRykpCithc3NlcnQoYSgpID09ICJcMCIgYW5kIF9HLnggPT0gMzMpCithc3NlcnQoZGVidWcuZ2V0aW5mbyhhKS5zb3VyY2UgPT0gIm1vZG5hbWUiKQorLS0gY2Fubm90IHJlYWQgdGV4dCBpbiBiaW5hcnkgbW9kZQorY2Fubm90bG9hZCgiYXR0ZW1wdCB0byBsb2FkIGEgdGV4dCBjaHVuayIsIGxvYWQocmVhZDEoeCksICJtb2RuYW1lIiwgImIiLCB7fSkpCitjYW5ub3Rsb2FkKCJhdHRlbXB0IHRvIGxvYWQgYSB0ZXh0IGNodW5rIiwgbG9hZCh4LCAibW9kbmFtZSIsICJiIikpCisKK2EgPSBhc3NlcnQobG9hZChmdW5jdGlvbiAoKSByZXR1cm4gbmlsIGVuZCkpCithKCkgIC0tIGVtcHR5IGNodW5rCisKK2Fzc2VydChub3QgbG9hZChmdW5jdGlvbiAoKSByZXR1cm4gdHJ1ZSBlbmQpKQorCisKKy0tIHNtYWxsIGJ1ZworbG9jYWwgdCA9IHtuaWwsICJyZXR1cm4gIiwgIjMifQorZiwgbXNnID0gbG9hZChmdW5jdGlvbiAoKSByZXR1cm4gdGFibGUucmVtb3ZlKHQsIDEpIGVuZCkKK2Fzc2VydChmKCkgPT0gbmlsKSAgIC0tIHNob3VsZCByZWFkIHRoZSBlbXB0eSBjaHVuaworCistLSBhbm90aGVyIHNtYWxsIGJ1ZyAoaW4gNS4yLjEpCitmID0gbG9hZChzdHJpbmcuZHVtcChmdW5jdGlvbiAoKSByZXR1cm4gMSBlbmQpLCBuaWwsICJiIiwge30pCithc3NlcnQodHlwZShmKSA9PSAiZnVuY3Rpb24iIGFuZCBmKCkgPT0gMSkKKworCit4ID0gc3RyaW5nLmR1bXAobG9hZCgieCA9IDE7IHJldHVybiB4IikpCithID0gYXNzZXJ0KGxvYWQocmVhZDEoeCksIG5pbCwgImIiKSkKK2Fzc2VydChhKCkgPT0gMSBhbmQgX0cueCA9PSAxKQorY2Fubm90bG9hZCgiYXR0ZW1wdCB0byBsb2FkIGEgYmluYXJ5IGNodW5rIiwgbG9hZChyZWFkMSh4KSwgbmlsLCAidCIpKQorY2Fubm90bG9hZCgiYXR0ZW1wdCB0byBsb2FkIGEgYmluYXJ5IGNodW5rIiwgbG9hZCh4LCBuaWwsICJ0IikpCisKK2Fzc2VydChub3QgcGNhbGwoc3RyaW5nLmR1bXAsIHByaW50KSkgIC0tIG5vIGR1bXAgb2YgQyBmdW5jdGlvbnMKKworY2Fubm90bG9hZCgidW5leHBlY3RlZCBzeW1ib2wiLCBsb2FkKHJlYWQxKCIqYSA9IDEyMyIpKSkKK2Nhbm5vdGxvYWQoInVuZXhwZWN0ZWQgc3ltYm9sIiwgbG9hZCgiKmEgPSAxMjMiKSkKK2Nhbm5vdGxvYWQoImhoaSIsIGxvYWQoZnVuY3Rpb24gKCkgZXJyb3IoImhoaSIpIGVuZCkpCisKKy0tIGFueSB2YWx1ZSBpcyB2YWxpZCBmb3IgX0VOVgorYXNzZXJ0KGxvYWQoInJldHVybiBfRU5WIiwgbmlsLCBuaWwsIDEyMykoKSA9PSAxMjMpCisKKworLS0gbG9hZCB3aGVuIF9FTlYgaXMgbm90IGZpcnN0IHVwdmFsdWUKK2xvY2FsIHg7IFhYID0gMTIzCitsb2NhbCBmdW5jdGlvbiBoICgpCisgIGxvY2FsIHk9eCAgIC0tIHVzZSAneCcsIHNvIHRoYXQgaXQgYmVjb21lcyAxc3QgdXB2YWx1ZQorICByZXR1cm4gWFggICAtLSBnbG9iYWwgbmFtZQorZW5kCitsb2NhbCBkID0gc3RyaW5nLmR1bXAoaCkKK3ggPSBsb2FkKGQsICIiLCAiYiIpCithc3NlcnQoZGVidWcuZ2V0dXB2YWx1ZSh4LCAyKSA9PSAnX0VOVicpCitkZWJ1Zy5zZXR1cHZhbHVlKHgsIDIsIF9HKQorYXNzZXJ0KHgoKSA9PSAxMjMpCisKK2Fzc2VydChhc3NlcnQobG9hZCgicmV0dXJuIFhYICsgLi4uIiwgbmlsLCBuaWwsIHtYWCA9IDEzfSkpKDQpID09IDE3KQorCisKKy0tIHRlc3QgZ2VuZXJpYyBsb2FkIHdpdGggbmVzdGVkIGZ1bmN0aW9ucworeCA9IFtbCisgIHJldHVybiBmdW5jdGlvbiAoeCkKKyAgICByZXR1cm4gZnVuY3Rpb24gKHkpCisgICAgIHJldHVybiBmdW5jdGlvbiAoeikKKyAgICAgICByZXR1cm4geCt5K3oKKyAgICAgZW5kCisgICBlbmQKKyAgZW5kCitdXQorCithID0gYXNzZXJ0KGxvYWQocmVhZDEoeCkpKQorYXNzZXJ0KGEoKSgyKSgzKSgxMCkgPT0gMTUpCisKKworLS0gdGVzdCBmb3IgZHVtcC91bmR1bXAgd2l0aCB1cHZhbHVlcworbG9jYWwgYSwgYiA9IDIwLCAzMAoreCA9IGxvYWQoc3RyaW5nLmR1bXAoZnVuY3Rpb24gKHgpCisgIGlmIHggPT0gInNldCIgdGhlbiBhID0gMTArYjsgYiA9IGIrMSBlbHNlCisgIHJldHVybiBhCisgIGVuZAorZW5kKSwgIiIsICJiIiwgbmlsKQorYXNzZXJ0KHgoKSA9PSBuaWwpCithc3NlcnQoZGVidWcuc2V0dXB2YWx1ZSh4LCAxLCAiaGkiKSA9PSAiYSIpCithc3NlcnQoeCgpID09ICJoaSIpCithc3NlcnQoZGVidWcuc2V0dXB2YWx1ZSh4LCAyLCAxMykgPT0gImIiKQorYXNzZXJ0KG5vdCBkZWJ1Zy5zZXR1cHZhbHVlKHgsIDMsIDEwKSkgICAtLSBvbmx5IDIgdXB2YWx1ZXMKK3goInNldCIpCithc3NlcnQoeCgpID09IDIzKQoreCgic2V0IikKK2Fzc2VydCh4KCkgPT0gMjQpCisKKy0tIHRlc3QgZm9yIGR1bXAvdW5kdW1wIHdpdGggbWFueSB1cHZhbHVlcworZG8KKyAgbG9jYWwgbnVwID0gMjAwICAgIC0tIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcworICBsb2NhbCBwcm9nID0geyJsb2NhbCBhMSJ9CisgIGZvciBpID0gMiwgbnVwIGRvIHByb2dbI3Byb2cgKyAxXSA9ICIsIGEiIC4uIGkgZW5kCisgIHByb2dbI3Byb2cgKyAxXSA9ICIgPSAxIgorICBmb3IgaSA9IDIsIG51cCBkbyBwcm9nWyNwcm9nICsgMV0gPSAiLCAiIC4uIGkgZW5kCisgIGxvY2FsIHN1bSA9IDEKKyAgcHJvZ1sjcHJvZyArIDFdID0gIjsgcmV0dXJuIGZ1bmN0aW9uICgpIHJldHVybiBhMSIKKyAgZm9yIGkgPSAyLCBudXAgZG8gcHJvZ1sjcHJvZyArIDFdID0gIiArIGEiIC4uIGk7IHN1bSA9IHN1bSArIGkgZW5kCisgIHByb2dbI3Byb2cgKyAxXSA9ICIgZW5kIgorICBwcm9nID0gdGFibGUuY29uY2F0KHByb2cpCisgIGxvY2FsIGYgPSBhc3NlcnQobG9hZChwcm9nKSkoKQorICBhc3NlcnQoZigpID09IHN1bSkKKworICBmID0gbG9hZChzdHJpbmcuZHVtcChmKSkgICAtLSBtYWluIGNodW5rIG5vdyBoYXMgbWFueSB1cHZhbHVlcworICBsb2NhbCBhID0gMTAKKyAgbG9jYWwgaCA9IGZ1bmN0aW9uICgpIHJldHVybiBhIGVuZAorICBmb3IgaSA9IDEsIG51cCBkbworICAgIGRlYnVnLnVwdmFsdWVqb2luKGYsIGksIGgsIDEpCisgIGVuZAorICBhc3NlcnQoZigpID09IDEwICogbnVwKQorZW5kCisKKy0tIHRlc3QgZm9yIGxvbmcgbWV0aG9kIG5hbWVzCitkbworICBsb2NhbCB0ID0ge3ggPSAxfQorICBmdW5jdGlvbiB0Ol8wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkgKCkKKyAgICByZXR1cm4gc2VsZi54CisgIGVuZAorICBhc3NlcnQodDpfMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5KCkgPT0gMSkKK2VuZAorCisKKy0tIHRlc3QgZm9yIGJ1ZyBpbiBwYXJhbWV0ZXIgYWRqdXN0bWVudAorYXNzZXJ0KChmdW5jdGlvbiAoKSByZXR1cm4gbmlsIGVuZCkoNCkgPT0gbmlsKQorYXNzZXJ0KChmdW5jdGlvbiAoKSBsb2NhbCBhOyByZXR1cm4gYSBlbmQpKDQpID09IG5pbCkKK2Fzc2VydCgoZnVuY3Rpb24gKGEpIHJldHVybiBhIGVuZCkoKSA9PSBuaWwpCisKKworcHJpbnQoInRlc3RpbmcgYmluYXJ5IGNodW5rcyIpCitkbworICBsb2NhbCBoZWFkZXIgPSBzdHJpbmcucGFjaygiYzRCQmM2QkJCQkJqIiwKKyAgICAiXDI3THVhIiwgICAgICAgICAgICAgICAgLS0gc2lnbmF0dXJlCisgICAgNSoxNiArIDQsICAgICAgICAgICAgICAgIC0tIHZlcnNpb24gNS40CisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC0tIGZvcm1hdAorICAgICJceDE5XHg5M1xyXG5ceDFhXG4iLCAgICAtLSBkYXRhCisgICAgc3RyaW5nLnBhY2tzaXplKCJpIiksICAgIC0tIHNpemVvZihpbnQpCisgICAgc3RyaW5nLnBhY2tzaXplKCJUIiksICAgIC0tIHNpemVvZihzaXplX3QpCisgICAgNCwgICAgICAgICAgICAgICAgICAgICAgIC0tIHNpemUgb2YgaW5zdHJ1Y3Rpb24KKyAgICBzdHJpbmcucGFja3NpemUoImoiKSwgICAgLS0gc2l6ZW9mKGx1YSBpbnRlZ2VyKQorICAgIHN0cmluZy5wYWNrc2l6ZSgibiIpLCAgICAtLSBzaXplb2YobHVhIG51bWJlcikKKyAgICAweDU2NzggICAgICAgICAgICAgICAgICAgLS0gTFVBQ19JTlQKKyAgICAtLSBMVUFDX05VTSBtYXkgbm90IGhhdmUgYSB1bmlxdWUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIChwYWRkaW5nLi4uKQorICApCisgIGxvY2FsIGMgPSBzdHJpbmcuZHVtcChmdW5jdGlvbiAoKSBsb2NhbCBhID0gMTsgbG9jYWwgYiA9IDM7IHJldHVybiBhK2IqMyBlbmQpCisKKyAgYXNzZXJ0KHN0cmluZy5zdWIoYywgMSwgI2hlYWRlcikgPT0gaGVhZGVyKQorCisgIC0tIGNvcnJ1cHRlZCBoZWFkZXIKKyAgZm9yIGkgPSAxLCAjaGVhZGVyIGRvCisgICAgbG9jYWwgcyA9IHN0cmluZy5zdWIoYywgMSwgaSAtIDEpIC4uCisgICAgICAgICAgICAgIHN0cmluZy5jaGFyKHN0cmluZy5ieXRlKHN0cmluZy5zdWIoYywgaSwgaSkpICsgMSkgLi4KKyAgICAgICAgICAgICAgc3RyaW5nLnN1YihjLCBpICsgMSwgLTEpCisgICAgYXNzZXJ0KCNzID09ICNjKQorICAgIGFzc2VydChub3QgbG9hZChzKSkKKyAgZW5kCisKKyAgLS0gbG9hZGluZyB0cnVuY2F0ZWQgYmluYXJ5IGNodW5rcworICBmb3IgaSA9IDEsICNjIC0gMSBkbworICAgIGxvY2FsIHN0LCBtc2cgPSBsb2FkKHN0cmluZy5zdWIoYywgMSwgaSkpCisgICAgYXNzZXJ0KG5vdCBzdCBhbmQgc3RyaW5nLmZpbmQobXNnLCAidHJ1bmNhdGVkIikpCisgIGVuZAorICBhc3NlcnQoYXNzZXJ0KGxvYWQoYykpKCkgPT0gMTApCitlbmQKKworcHJpbnQoJ09LJykKK3JldHVybiBkZWVwCmRpZmYgLS1naXQgYS90ZXN0ZXMvY2xvc3VyZS5sdWEgYi90ZXN0ZXMvY2xvc3VyZS5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkYTNjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9jbG9zdXJlLmx1YQpAQCAtMCwwICsxLDI3MSBAQAorLS0gJElkOiBjbG9zdXJlLmx1YSx2IDEuNjIgMjAxOC8wMy8xMiAxNDoxOTozNiByb2JlcnRvIEV4cCAkCistLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBmaWxlIGFsbC5sdWEKKworcHJpbnQgInRlc3RpbmcgY2xvc3VyZXMiCisKK2xvY2FsIEEsQiA9IDAse2c9MTB9CitmdW5jdGlvbiBmKHgpCisgIGxvY2FsIGEgPSB7fQorICBmb3IgaT0xLDEwMDAgZG8KKyAgICBsb2NhbCB5ID0gMAorICAgIGRvCisgICAgICBhW2ldID0gZnVuY3Rpb24gKCkgQi5nID0gQi5nKzE7IHkgPSB5K3g7IHJldHVybiB5K0EgZW5kCisgICAgZW5kCisgIGVuZAorICBsb2NhbCBkdW1teSA9IGZ1bmN0aW9uICgpIHJldHVybiBhW0FdIGVuZAorICBjb2xsZWN0Z2FyYmFnZSgpCisgIEEgPSAxOyBhc3NlcnQoZHVtbXkoKSA9PSBhWzFdKTsgQSA9IDA7CisgIGFzc2VydChhWzFdKCkgPT0geCkKKyAgYXNzZXJ0KGFbM10oKSA9PSB4KQorICBjb2xsZWN0Z2FyYmFnZSgpCisgIGFzc2VydChCLmcgPT0gMTIpCisgIHJldHVybiBhCitlbmQKKworbG9jYWwgYSA9IGYoMTApCistLSBmb3JjZSBhIEdDIGluIHRoaXMgbGV2ZWwKK2xvY2FsIHggPSB7WzFdID0ge319ICAgLS0gdG8gZGV0ZWN0IGEgR0MKK3NldG1ldGF0YWJsZSh4LCB7X19tb2RlID0gJ2t2J30pCit3aGlsZSB4WzFdIGRvICAgLS0gcmVwZWF0IHVudGlsIEdDCisgIGxvY2FsIGEgPSBBLi5BLi5BLi5BICAtLSBjcmVhdGUgZ2FyYmFnZQorICBBID0gQSsxCitlbmQKK2Fzc2VydChhWzFdKCkgPT0gMjArQSkKK2Fzc2VydChhWzFdKCkgPT0gMzArQSkKK2Fzc2VydChhWzJdKCkgPT0gMTArQSkKK2NvbGxlY3RnYXJiYWdlKCkKK2Fzc2VydChhWzJdKCkgPT0gMjArQSkKK2Fzc2VydChhWzJdKCkgPT0gMzArQSkKK2Fzc2VydChhWzNdKCkgPT0gMjArQSkKK2Fzc2VydChhWzhdKCkgPT0gMTArQSkKK2Fzc2VydChnZXRtZXRhdGFibGUoeCkuX19tb2RlID09ICdrdicpCithc3NlcnQoQi5nID09IDE5KQorCisKKy0tIHRlc3RpbmcgZXF1YWxpdHkKK2EgPSB7fQorY29sbGVjdGdhcmJhZ2Uic3RvcCIKK2ZvciBpID0gMSwgNSBkbyAgYVtpXSA9IGZ1bmN0aW9uICh4KSByZXR1cm4geCArIGEgKyBfRU5WIGVuZCAgZW5kCitjb2xsZWN0Z2FyYmFnZSJyZXN0YXJ0IgorYXNzZXJ0KGFbM10gPT0gYVs0XSBhbmQgYVs0XSA9PSBhWzVdKQorCitmb3IgaSA9IDEsIDUgZG8gIGFbaV0gPSBmdW5jdGlvbiAoeCkgcmV0dXJuIGkgKyBhICsgX0VOViBlbmQgIGVuZAorYXNzZXJ0KGFbM10gfj0gYVs0XSBhbmQgYVs0XSB+PSBhWzVdKQorCitsb2NhbCBmdW5jdGlvbiBmKCkKKyAgcmV0dXJuIGZ1bmN0aW9uICh4KSAgcmV0dXJuIG1hdGguc2luKF9FTlZbeF0pICBlbmQKK2VuZAorYXNzZXJ0KGYoKSA9PSBmKCkpCisKKworLS0gdGVzdGluZyBjbG9zdXJlcyB3aXRoICdmb3InIGNvbnRyb2wgdmFyaWFibGUKK2EgPSB7fQorZm9yIGk9MSwxMCBkbworICBhW2ldID0ge3NldCA9IGZ1bmN0aW9uKHgpIGk9eCBlbmQsIGdldCA9IGZ1bmN0aW9uICgpIHJldHVybiBpIGVuZH0KKyAgaWYgaSA9PSAzIHRoZW4gYnJlYWsgZW5kCitlbmQKK2Fzc2VydChhWzRdID09IHVuZGVmKQorYVsxXS5zZXQoMTApCithc3NlcnQoYVsyXS5nZXQoKSA9PSAyKQorYVsyXS5zZXQoJ2EnKQorYXNzZXJ0KGFbM10uZ2V0KCkgPT0gMykKK2Fzc2VydChhWzJdLmdldCgpID09ICdhJykKKworYSA9IHt9Citsb2NhbCB0ID0geyJhIiwgImIifQorZm9yIGkgPSAxLCAjdCBkbworICBsb2NhbCBrID0gdFtpXQorICBhW2ldID0ge3NldCA9IGZ1bmN0aW9uKHgsIHkpIGk9eDsgaz15IGVuZCwKKyAgICAgICAgICBnZXQgPSBmdW5jdGlvbiAoKSByZXR1cm4gaSwgayBlbmR9CisgIGlmIGkgPT0gMiB0aGVuIGJyZWFrIGVuZAorZW5kCithWzFdLnNldCgxMCwgMjApCitsb2NhbCByLHMgPSBhWzJdLmdldCgpCithc3NlcnQociA9PSAyIGFuZCBzID09ICdiJykKK3IscyA9IGFbMV0uZ2V0KCkKK2Fzc2VydChyID09IDEwIGFuZCBzID09IDIwKQorYVsyXS5zZXQoJ2EnLCAnYicpCityLHMgPSBhWzJdLmdldCgpCithc3NlcnQociA9PSAiYSIgYW5kIHMgPT0gImIiKQorCisKKy0tIHRlc3RpbmcgY2xvc3VyZXMgd2l0aCAnZm9yJyBjb250cm9sIHZhcmlhYmxlIHggYnJlYWsKK2ZvciBpPTEsMyBkbworICBmID0gZnVuY3Rpb24gKCkgcmV0dXJuIGkgZW5kCisgIGJyZWFrCitlbmQKK2Fzc2VydChmKCkgPT0gMSkKKworZm9yIGsgPSAxLCAjdCBkbworICBsb2NhbCB2ID0gdFtrXQorICBmID0gZnVuY3Rpb24gKCkgcmV0dXJuIGssIHYgZW5kCisgIGJyZWFrCitlbmQKK2Fzc2VydCgoe2YoKX0pWzFdID09IDEpCithc3NlcnQoKHtmKCl9KVsyXSA9PSAiYSIpCisKKworLS0gdGVzdGluZyBjbG9zdXJlIHggYnJlYWsgeCByZXR1cm4geCBlcnJvcnMKKworbG9jYWwgYgorZnVuY3Rpb24gZih4KQorICBsb2NhbCBmaXJzdCA9IDEKKyAgd2hpbGUgMSBkbworICAgIGlmIHggPT0gMyBhbmQgbm90IGZpcnN0IHRoZW4gcmV0dXJuIGVuZAorICAgIGxvY2FsIGEgPSAneHV4dScKKyAgICBiID0gZnVuY3Rpb24gKG9wLCB5KQorICAgICAgICAgIGlmIG9wID09ICdzZXQnIHRoZW4KKyAgICAgICAgICAgIGEgPSB4K3kKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gYQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICBpZiB4ID09IDEgdGhlbiBkbyBicmVhayBlbmQKKyAgICBlbHNlaWYgeCA9PSAyIHRoZW4gcmV0dXJuCisgICAgZWxzZSBpZiB4IH49IDMgdGhlbiBlcnJvcigpIGVuZAorICAgIGVuZAorICAgIGZpcnN0ID0gbmlsCisgIGVuZAorZW5kCisKK2ZvciBpPTEsMyBkbworICBmKGkpCisgIGFzc2VydChiKCdnZXQnKSA9PSAneHV4dScpCisgIGIoJ3NldCcsIDEwKTsgYXNzZXJ0KGIoJ2dldCcpID09IDEwK2kpCisgIGIgPSBuaWwKK2VuZAorCitwY2FsbChmLCA0KTsKK2Fzc2VydChiKCdnZXQnKSA9PSAneHV4dScpCitiKCdzZXQnLCAxMCk7IGFzc2VydChiKCdnZXQnKSA9PSAxNCkKKworCitsb2NhbCB3CistLSB0ZXN0aW5nIG11bHRpLWxldmVsIGNsb3N1cmUKK2Z1bmN0aW9uIGYoeCkKKyAgcmV0dXJuIGZ1bmN0aW9uICh5KQorICAgIHJldHVybiBmdW5jdGlvbiAoeikgcmV0dXJuIHcreCt5K3ogZW5kCisgIGVuZAorZW5kCisKK3kgPSBmKDEwKQordyA9IDEuMzQ1Cithc3NlcnQoeSgyMCkoMzApID09IDYwK3cpCisKKworLS0gdGVzdGluZyBjbG9zdXJlcyB4IGJyZWFrCitkbworICBsb2NhbCBYLCBZCisgIGxvY2FsIGEgPSBtYXRoLnNpbigwKQorCisgIHdoaWxlIGEgZG8KKyAgICBsb2NhbCBiID0gMTAKKyAgICBYID0gZnVuY3Rpb24gKCkgcmV0dXJuIGIgZW5kICAgLS0gY2xvc3VyZSB3aXRoIHVwdmFsdWUKKyAgICBpZiBhIHRoZW4gYnJlYWsgZW5kCisgIGVuZAorICAKKyAgZG8KKyAgICBsb2NhbCBiID0gMjAKKyAgICBZID0gZnVuY3Rpb24gKCkgcmV0dXJuIGIgZW5kICAgLS0gY2xvc3VyZSB3aXRoIHVwdmFsdWUKKyAgZW5kCisKKyAgLS0gdXB2YWx1ZXMgbXVzdCBiZSBkaWZmZXJlbnQKKyAgYXNzZXJ0KFgoKSA9PSAxMCBhbmQgWSgpID09IDIwKQorZW5kCisKKyAgCistLSB0ZXN0aW5nIGNsb3N1cmVzIHggcmVwZWF0LXVudGlsCisKK2xvY2FsIGEgPSB7fQorbG9jYWwgaSA9IDEKK3JlcGVhdAorICBsb2NhbCB4ID0gaQorICBhW2ldID0gZnVuY3Rpb24gKCkgaSA9IHgrMTsgcmV0dXJuIHggZW5kCit1bnRpbCBpID4gMTAgb3IgYVtpXSgpIH49IHgKK2Fzc2VydChpID09IDExIGFuZCBhWzFdKCkgPT0gMSBhbmQgYVszXSgpID09IDMgYW5kIGkgPT0gNCkKKworCistLSB0ZXN0aW5nIGNsb3N1cmVzIGNyZWF0ZWQgaW4gJ3RoZW4nIGFuZCAnZWxzZScgcGFydHMgb2YgJ2lmJ3MKK2EgPSB7fQorZm9yIGkgPSAxLCAxMCBkbworICBpZiBpICUgMyA9PSAwIHRoZW4KKyAgICBsb2NhbCB5ID0gMAorICAgIGFbaV0gPSBmdW5jdGlvbiAoeCkgbG9jYWwgdCA9IHk7IHkgPSB4OyByZXR1cm4gdCBlbmQKKyAgZWxzZWlmIGkgJSAzID09IDEgdGhlbgorICAgIGdvdG8gTDEKKyAgICBlcnJvcidub3QgaGVyZScKKyAgOjpMMTo6CisgICAgbG9jYWwgeSA9IDEKKyAgICBhW2ldID0gZnVuY3Rpb24gKHgpIGxvY2FsIHQgPSB5OyB5ID0geDsgcmV0dXJuIHQgZW5kCisgIGVsc2VpZiBpICUgMyA9PSAyIHRoZW4KKyAgICBsb2NhbCB0CisgICAgZ290byBsNAorICAgIDo6bDRhOjogYVtpXSA9IHQ7IGdvdG8gbDRiCisgICAgZXJyb3IoInNob3VsZCBuZXZlciBiZSBoZXJlISIpCisgICAgOjpsNDo6CisgICAgbG9jYWwgeSA9IDIKKyAgICB0ID0gZnVuY3Rpb24gKHgpIGxvY2FsIHQgPSB5OyB5ID0geDsgcmV0dXJuIHQgZW5kCisgICAgZ290byBsNGEKKyAgICBlcnJvcigic2hvdWxkIG5ldmVyIGJlIGhlcmUhIikKKyAgICA6Omw0Yjo6CisgIGVuZAorZW5kCisKK2ZvciBpID0gMSwgMTAgZG8KKyAgYXNzZXJ0KGFbaV0oaSAqIDEwKSA9PSBpICUgMyBhbmQgYVtpXSgpID09IGkgKiAxMCkKK2VuZAorCitwcmludCcrJworCisKKy0tIHRlc3QgZm9yIGNvcnJlY3RseSBjbG9zaW5nIHVwdmFsdWVzIGluIHRhaWwgY2FsbHMgb2YgdmFyYXJnIGZ1bmN0aW9ucworbG9jYWwgZnVuY3Rpb24gdCAoKQorICBsb2NhbCBmdW5jdGlvbiBjKGEsYikgYXNzZXJ0KGE9PSJ0ZXN0IiBhbmQgYj09Ik9LIikgZW5kCisgIGxvY2FsIGZ1bmN0aW9uIHYoZiwgLi4uKSBjKCJ0ZXN0IiwgZigpIH49IDEgYW5kICJGQUlMRUQiIG9yICJPSyIpIGVuZAorICBsb2NhbCB4ID0gMQorICByZXR1cm4gdihmdW5jdGlvbigpIHJldHVybiB4IGVuZCkKK2VuZAordCgpCisKKworLS0gdGVzdCBmb3IgZGVidWcgbWFuaXB1bGF0aW9uIG9mIHVwdmFsdWVzCitsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUnZGVidWcnCisKK2RvCisgIGxvY2FsIGEgLCBiLCBjID0gMywgNSwgNworICBmb28xID0gZnVuY3Rpb24gKCkgcmV0dXJuIGErYiBlbmQ7CisgIGZvbzIgPSBmdW5jdGlvbiAoKSByZXR1cm4gYithIGVuZDsKKyAgZG8KKyAgICBsb2NhbCBhID0gMTAKKyAgICBmb28zID0gZnVuY3Rpb24gKCkgcmV0dXJuIGErYiBlbmQ7CisgIGVuZAorZW5kCisKK2Fzc2VydChkZWJ1Zy51cHZhbHVlaWQoZm9vMSwgMSkpCithc3NlcnQoZGVidWcudXB2YWx1ZWlkKGZvbzEsIDIpKQorYXNzZXJ0KG5vdCBwY2FsbChkZWJ1Zy51cHZhbHVlaWQsIGZvbzEsIDMpKQorYXNzZXJ0KGRlYnVnLnVwdmFsdWVpZChmb28xLCAxKSA9PSBkZWJ1Zy51cHZhbHVlaWQoZm9vMiwgMikpCithc3NlcnQoZGVidWcudXB2YWx1ZWlkKGZvbzEsIDIpID09IGRlYnVnLnVwdmFsdWVpZChmb28yLCAxKSkKK2Fzc2VydChkZWJ1Zy51cHZhbHVlaWQoZm9vMywgMSkpCithc3NlcnQoZGVidWcudXB2YWx1ZWlkKGZvbzEsIDEpIH49IGRlYnVnLnVwdmFsdWVpZChmb28zLCAxKSkKK2Fzc2VydChkZWJ1Zy51cHZhbHVlaWQoZm9vMSwgMikgPT0gZGVidWcudXB2YWx1ZWlkKGZvbzMsIDIpKQorCithc3NlcnQoZGVidWcudXB2YWx1ZWlkKHN0cmluZy5nbWF0Y2goIngiLCAieCIpLCAxKSB+PSBuaWwpCisKK2Fzc2VydChmb28xKCkgPT0gMyArIDUgYW5kIGZvbzIoKSA9PSA1ICsgMykKK2RlYnVnLnVwdmFsdWVqb2luKGZvbzEsIDIsIGZvbzIsIDIpCithc3NlcnQoZm9vMSgpID09IDMgKyAzIGFuZCBmb28yKCkgPT0gNSArIDMpCithc3NlcnQoZm9vMygpID09IDEwICsgNSkKK2RlYnVnLnVwdmFsdWVqb2luKGZvbzMsIDIsIGZvbzIsIDEpCithc3NlcnQoZm9vMygpID09IDEwICsgNSkKK2RlYnVnLnVwdmFsdWVqb2luKGZvbzMsIDIsIGZvbzIsIDIpCithc3NlcnQoZm9vMygpID09IDEwICsgMykKKworYXNzZXJ0KG5vdCBwY2FsbChkZWJ1Zy51cHZhbHVlam9pbiwgZm9vMSwgMywgZm9vMiwgMSkpCithc3NlcnQobm90IHBjYWxsKGRlYnVnLnVwdmFsdWVqb2luLCBmb28xLCAxLCBmb28yLCAzKSkKK2Fzc2VydChub3QgcGNhbGwoZGVidWcudXB2YWx1ZWpvaW4sIGZvbzEsIDAsIGZvbzIsIDEpKQorYXNzZXJ0KG5vdCBwY2FsbChkZWJ1Zy51cHZhbHVlam9pbiwgcHJpbnQsIDEsIGZvbzIsIDEpKQorYXNzZXJ0KG5vdCBwY2FsbChkZWJ1Zy51cHZhbHVlam9pbiwge30sIDEsIGZvbzIsIDEpKQorYXNzZXJ0KG5vdCBwY2FsbChkZWJ1Zy51cHZhbHVlam9pbiwgZm9vMSwgMSwgcHJpbnQsIDEpKQorCitwcmludCdPSycKZGlmZiAtLWdpdCBhL3Rlc3Rlcy9jb2RlLmx1YSBiL3Rlc3Rlcy9jb2RlLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzljNjJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGVzL2NvZGUubHVhCkBAIC0wLDAgKzEsMzQ3IEBACistLSAkSWQ6IGNvZGUubHVhLHYgMS41NSAyMDE4LzAzLzEyIDE0OjE5OjM2IHJvYmVydG8gRXhwICQKKy0tIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGZpbGUgYWxsLmx1YQorCitpZiBUPT1uaWwgdGhlbgorICAoTWVzc2FnZSBvciBwcmludCkoJ1xuID4+PiB0ZXN0QyBub3QgYWN0aXZlOiBza2lwcGluZyBvcGNvZGUgdGVzdHMgPDw8XG4nKQorICByZXR1cm4KK2VuZAorcHJpbnQgInRlc3RpbmcgY29kZSBnZW5lcmF0aW9uIGFuZCBvcHRpbWl6YXRpb25zIgorCisKKy0tIHRoaXMgY29kZSBnYXZlIGFuIGVycm9yIGZvciB0aGUgY29kZSBjaGVja2VyCitkbworICBsb2NhbCBmdW5jdGlvbiBmIChhKQorICBmb3Igayx2LHcgaW4gYSBkbyBlbmQKKyAgZW5kCitlbmQKKworCistLSB0ZXN0aW5nIHJldXNlIGluIGNvbnN0YW50IHRhYmxlCitsb2NhbCBmdW5jdGlvbiBjaGVja0tsaXN0IChmdW5jLCBsaXN0KQorICBsb2NhbCBrID0gVC5saXN0ayhmdW5jKQorICBhc3NlcnQoI2sgPT0gI2xpc3QpCisgIGZvciBpID0gMSwgI2sgZG8KKyAgICBhc3NlcnQoa1tpXSA9PSBsaXN0W2ldIGFuZCBtYXRoLnR5cGUoa1tpXSkgPT0gbWF0aC50eXBlKGxpc3RbaV0pKQorICBlbmQKK2VuZAorCitsb2NhbCBmdW5jdGlvbiBmb28gKCkKKyAgbG9jYWwgYQorICBhID0gMzsKKyAgYSA9IDA7IGEgPSAwLjA7IGEgPSAtNyArIDcKKyAgYSA9IDMuNzgvNDsgYSA9IDMuNzgvNAorICBhID0gLTMuNzgvNDsgYSA9IDMuNzgvNDsgYSA9IC0zLjc4LzQKKyAgYSA9IC0zLjc5LzQ7IGEgPSAwLjA7IGEgPSAtMDsKKyAgYSA9IDM7IGEgPSAzLjA7IGEgPSAzOyBhID0gMy4wCitlbmQKKworY2hlY2tLbGlzdChmb28sIHszLjc4LzQsIC0zLjc4LzQsIC0zLjc5LzR9KQorCisKKy0tIHRlc3Rpbmcgb3Bjb2RlcworCitmdW5jdGlvbiBjaGVjayAoZiwgLi4uKQorICBsb2NhbCBhcmcgPSB7Li4ufQorICBsb2NhbCBjID0gVC5saXN0Y29kZShmKQorICBmb3IgaT0xLCAjYXJnIGRvCisgICAgbG9jYWwgb3Bjb2RlID0gc3RyaW5nLm1hdGNoKGNbaV0sICIldSV3KyIpCisgICAgLS0gcHJpbnQoYXJnW2ldLCBvcGNvZGUpCisgICAgYXNzZXJ0KGFyZ1tpXSA9PSBvcGNvZGUpCisgIGVuZAorICBhc3NlcnQoY1sjYXJnKzJdID09IHVuZGVmKQorZW5kCisKKworZnVuY3Rpb24gY2hlY2tlcXVhbCAoYSwgYikKKyAgYSA9IFQubGlzdGNvZGUoYSkKKyAgYiA9IFQubGlzdGNvZGUoYikKKyAgZm9yIGkgPSAxLCAjYSBkbworICAgIGFbaV0gPSBzdHJpbmcuZ3N1YihhW2ldLCAnJWIoKScsICcnKSAgIC0tIHJlbW92ZSBsaW5lIG51bWJlcgorICAgIGJbaV0gPSBzdHJpbmcuZ3N1YihiW2ldLCAnJWIoKScsICcnKSAgIC0tIHJlbW92ZSBsaW5lIG51bWJlcgorICAgIGFzc2VydChhW2ldID09IGJbaV0pCisgIGVuZAorZW5kCisKKworLS0gc29tZSBiYXNpYyBpbnN0cnVjdGlvbnMKK2NoZWNrKGZ1bmN0aW9uICgpCisgIChmdW5jdGlvbiAoKSBlbmQpe2YoKX0KK2VuZCwgJ0NMT1NVUkUnLCAnTkVXVEFCTEUnLCAnR0VUVEFCVVAnLCAnQ0FMTCcsICdTRVRMSVNUJywgJ0NBTEwnLCAnUkVUVVJOJykKKworCistLSBzZXF1ZW5jZSBvZiBMT0FETklMcworY2hlY2soZnVuY3Rpb24gKCkKKyAgbG9jYWwgYSxiLGMKKyAgbG9jYWwgZDsgbG9jYWwgZTsKKyAgbG9jYWwgZixnLGg7CisgIGQgPSBuaWw7IGQ9bmlsOyBiPW5pbDsgYT1uaWw7IGM9bmlsOworZW5kLCAnTE9BRE5JTCcsICdSRVRVUk4wJykKKworY2hlY2soZnVuY3Rpb24gKCkKKyAgbG9jYWwgYSxiLGMsZCA9IDEsMSwxLDEKKyAgZD1uaWw7Yz1uaWw7Yj1uaWw7YT1uaWwKK2VuZCwgJ0xPQURJJywgJ0xPQURJJywgJ0xPQURJJywgJ0xPQURJJywgJ0xPQUROSUwnLCAnUkVUVVJOMCcpCisKK2RvCisgIGxvY2FsIGEsYixjLGQgPSAxLDEsMSwxCisgIGQ9bmlsO2M9bmlsO2I9bmlsO2E9bmlsCisgIGFzc2VydChhID09IG5pbCBhbmQgYiA9PSBuaWwgYW5kIGMgPT0gbmlsIGFuZCBkID09IG5pbCkKK2VuZAorCisKKy0tIHNpbmdsZSByZXR1cm4KK2NoZWNrIChmdW5jdGlvbiAoYSxiLGMpIHJldHVybiBhIGVuZCwgJ1JFVFVSTjEnKQorCisKKy0tIGluZmluaXRlIGxvb3BzCitjaGVjayhmdW5jdGlvbiAoKSB3aGlsZSB0cnVlIGRvIGxvY2FsIGEgPSAtMSBlbmQgZW5kLAorJ0xPQURJJywgJ0pNUCcsICdSRVRVUk4wJykKKworY2hlY2soZnVuY3Rpb24gKCkgd2hpbGUgMSBkbyBsb2NhbCBhID0gLTEgZW5kIGVuZCwKKydMT0FESScsICdKTVAnLCAnUkVUVVJOMCcpCisKK2NoZWNrKGZ1bmN0aW9uICgpIHJlcGVhdCBsb2NhbCB4ID0gMSB1bnRpbCB0cnVlIGVuZCwKKydMT0FESScsICdSRVRVUk4wJykKKworCistLSBjb25jYXQgb3B0aW1pemF0aW9uCitjaGVjayhmdW5jdGlvbiAoYSxiLGMsZCkgcmV0dXJuIGEuLmIuLmMuLmQgZW5kLAorICAnTU9WRScsICdNT1ZFJywgJ01PVkUnLCAnTU9WRScsICdDT05DQVQnLCAnUkVUVVJOMScpCisKKy0tIG5vdAorY2hlY2soZnVuY3Rpb24gKCkgcmV0dXJuIG5vdCBub3QgbmlsIGVuZCwgJ0xPQURCT09MJywgJ1JFVFVSTjEnKQorY2hlY2soZnVuY3Rpb24gKCkgcmV0dXJuIG5vdCBub3QgZmFsc2UgZW5kLCAnTE9BREJPT0wnLCAnUkVUVVJOMScpCitjaGVjayhmdW5jdGlvbiAoKSByZXR1cm4gbm90IG5vdCB0cnVlIGVuZCwgJ0xPQURCT09MJywgJ1JFVFVSTjEnKQorY2hlY2soZnVuY3Rpb24gKCkgcmV0dXJuIG5vdCBub3QgMSBlbmQsICdMT0FEQk9PTCcsICdSRVRVUk4xJykKKworLS0gZGlyZWN0IGFjY2VzcyB0byBsb2NhbHMKK2NoZWNrKGZ1bmN0aW9uICgpCisgIGxvY2FsIGEsYixjLGQKKyAgYSA9IGIqYQorICBjLngsIGFbYl0gPSAtKChhICsgZC9iIC0gYVtiXSkgXiBhLngpLCBiCitlbmQsCisgICdMT0FETklMJywKKyAgJ01VTCcsCisgICdESVYnLCAnQUREJywgJ0dFVFRBQkxFJywgJ1NVQicsICdHRVRGSUVMRCcsICdQT1cnLAorICAgICdVTk0nLCAnU0VUVEFCTEUnLCAnU0VURklFTEQnLCAnUkVUVVJOMCcpCisKKworLS0gZGlyZWN0IGFjY2VzcyB0byBjb25zdGFudHMKK2NoZWNrKGZ1bmN0aW9uICgpCisgIGxvY2FsIGEsYgorICBhLnggPSAzLjIKKyAgYS54ID0gYgorICBhW2JdID0gJ3gnCitlbmQsCisgICdMT0FETklMJywgJ1NFVEZJRUxEJywgJ1NFVEZJRUxEJywgJ1NFVFRBQkxFJywgJ1JFVFVSTjAnKQorCistLSAiZ2V0L3NldCB0YWJsZSIgd2l0aCBudW1lcmljIGluZGljZXMKK2NoZWNrKGZ1bmN0aW9uIChhKQorICBhWzFdID0gYVsxMDBdCisgIGFbMjU1XSA9IGFbMjU2XQorICBhWzI1Nl0gPSA1CitlbmQsCisgICdHRVRJJywgJ1NFVEknLAorICAnTE9BREknLCAnR0VUVEFCTEUnLCAnU0VUSScsCisgICdMT0FESScsICdTRVRUQUJMRScsICAnUkVUVVJOMCcpCisKK2NoZWNrKGZ1bmN0aW9uICgpCisgIGxvY2FsIGEsYgorICBhID0gYSAtIGEKKyAgYiA9IGEvYQorICBiID0gNS00CitlbmQsCisgICdMT0FETklMJywgJ1NVQicsICdESVYnLCAnTE9BREknLCAnUkVUVVJOMCcpCisKK2NoZWNrKGZ1bmN0aW9uICgpCisgIGxvY2FsIGEsYgorICBhW3RydWVdID0gZmFsc2UKK2VuZCwKKyAgJ0xPQUROSUwnLCAnTE9BREJPT0wnLCAnU0VUVEFCTEUnLCAnUkVUVVJOMCcpCisKKworLS0gZXF1YWxpdGllcworY2hlY2soZnVuY3Rpb24gKGEpIGlmIGEgPT0gMSB0aGVuIHJldHVybiAyIGVuZCBlbmQsCisgICdFUUknLCAnSk1QJywgJ0xPQURJJywgJ1JFVFVSTjEnKQorCitjaGVjayhmdW5jdGlvbiAoYSkgaWYgLTQuMCA9PSBhIHRoZW4gcmV0dXJuIDIgZW5kIGVuZCwKKyAgJ0VRSScsICdKTVAnLCAnTE9BREknLCAnUkVUVVJOMScpCisKK2NoZWNrKGZ1bmN0aW9uIChhKSBpZiBhID09ICJoaSIgdGhlbiByZXR1cm4gMiBlbmQgZW5kLAorICAnRVFLJywgJ0pNUCcsICdMT0FESScsICdSRVRVUk4xJykKKworY2hlY2soZnVuY3Rpb24gKGEpIGlmIGEgPT0gMTAwMDAgdGhlbiByZXR1cm4gMiBlbmQgZW5kLAorICAnRVFLJywgJ0pNUCcsICdMT0FESScsICdSRVRVUk4xJykgICAtLSBudW1iZXIgdG9vIGxhcmdlCisKK2NoZWNrKGZ1bmN0aW9uIChhKSBpZiAtMTAwMDAgPT0gYSB0aGVuIHJldHVybiAyIGVuZCBlbmQsCisgICdFUUsnLCAnSk1QJywgJ0xPQURJJywgJ1JFVFVSTjEnKSAgIC0tIG51bWJlciB0b28gbGFyZ2UKKworLS0gY29tcGFyaXNvbnMKKworY2hlY2soZnVuY3Rpb24gKGEpIGlmIC0xMCA8PSBhIHRoZW4gcmV0dXJuIDIgZW5kIGVuZCwKKyAgJ0dFSScsICdKTVAnLCAnTE9BREknLCAnUkVUVVJOMScpCisKK2NoZWNrKGZ1bmN0aW9uIChhKSBpZiAxMjguMCA+IGEgdGhlbiByZXR1cm4gMiBlbmQgZW5kLAorICAnTFRJJywgJ0pNUCcsICdMT0FESScsICdSRVRVUk4xJykKKworY2hlY2soZnVuY3Rpb24gKGEpIGlmIC0xMjcuMCA8IGEgdGhlbiByZXR1cm4gMiBlbmQgZW5kLAorICAnR1RJJywgJ0pNUCcsICdMT0FESScsICdSRVRVUk4xJykKKworY2hlY2soZnVuY3Rpb24gKGEpIGlmIDEwIDwgYSB0aGVuIHJldHVybiAyIGVuZCBlbmQsCisgICdHVEknLCAnSk1QJywgJ0xPQURJJywgJ1JFVFVSTjEnKQorCitjaGVjayhmdW5jdGlvbiAoYSkgaWYgMTI5IDwgYSB0aGVuIHJldHVybiAyIGVuZCBlbmQsCisgICdMT0FESScsICdMVCcsICdKTVAnLCAnTE9BREknLCAnUkVUVVJOMScpCisKK2NoZWNrKGZ1bmN0aW9uIChhKSBpZiBhID49IDIzLjAgdGhlbiByZXR1cm4gMiBlbmQgZW5kLAorICAnR0VJJywgJ0pNUCcsICdMT0FESScsICdSRVRVUk4xJykKKworY2hlY2soZnVuY3Rpb24gKGEpIGlmIGEgPj0gMjMuMSB0aGVuIHJldHVybiAyIGVuZCBlbmQsCisgICdMT0FESycsICdMRScsICdKTVAnLCAnTE9BREknLCAnUkVUVVJOMScpCisKK2NoZWNrKGZ1bmN0aW9uIChhKSBpZiBhID4gMjMwMC4wIHRoZW4gcmV0dXJuIDIgZW5kIGVuZCwKKyAgJ0xPQURGJywgJ0xUJywgJ0pNUCcsICdMT0FESScsICdSRVRVUk4xJykKKworCistLSBjb25zdGFudCBmb2xkaW5nCitsb2NhbCBmdW5jdGlvbiBjaGVja0sgKGZ1bmMsIHZhbCkKKyAgY2hlY2soZnVuYywgJ0xPQURLJywgJ1JFVFVSTjEnKQorICBsb2NhbCBrID0gVC5saXN0ayhmdW5jKQorICBhc3NlcnQoI2sgPT0gMSBhbmQga1sxXSA9PSB2YWwgYW5kIG1hdGgudHlwZShrWzFdKSA9PSBtYXRoLnR5cGUodmFsKSkKKyAgYXNzZXJ0KGZ1bmMoKSA9PSB2YWwpCitlbmQKKworbG9jYWwgZnVuY3Rpb24gY2hlY2tJIChmdW5jLCB2YWwpCisgIGNoZWNrKGZ1bmMsICdMT0FESScsICdSRVRVUk4xJykKKyAgYXNzZXJ0KCNULmxpc3RrKGZ1bmMpID09IDApCisgIGFzc2VydChmdW5jKCkgPT0gdmFsKQorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIGNoZWNrRiAoZnVuYywgdmFsKQorICBjaGVjayhmdW5jLCAnTE9BREYnLCAnUkVUVVJOMScpCisgIGFzc2VydCgjVC5saXN0ayhmdW5jKSA9PSAwKQorICBhc3NlcnQoZnVuYygpID09IHZhbCkKK2VuZAorCitjaGVja0YoZnVuY3Rpb24gKCkgcmV0dXJuIDAuMCBlbmQsIDAuMCkKK2NoZWNrSShmdW5jdGlvbiAoKSByZXR1cm4gMCBlbmQsIDApCitjaGVja0koZnVuY3Rpb24gKCkgcmV0dXJuIC0wLy8xIGVuZCwgMCkKK2NoZWNrSyhmdW5jdGlvbiAoKSByZXR1cm4gM14tMSBlbmQsIDEvMykKK2NoZWNrSyhmdW5jdGlvbiAoKSByZXR1cm4gKDEgKyAxKV4oNTAgKyA1MCkgZW5kLCAyXjEwMCkKK2NoZWNrSyhmdW5jdGlvbiAoKSByZXR1cm4gKC0yKV4oMzEgLSAyKSBlbmQsIC0weDIwMDAwMDAwICsgMC4wKQorY2hlY2tGKGZ1bmN0aW9uICgpIHJldHVybiAoLTNeMCArIDUpIC8vIDMuMCBlbmQsIDEuMCkKK2NoZWNrSShmdW5jdGlvbiAoKSByZXR1cm4gLTMgJSA1IGVuZCwgMikKK2NoZWNrRihmdW5jdGlvbiAoKSByZXR1cm4gLSgoMi4wXjggKyAtKC0xKSkgJSA4KS8yICogNCAtIDMgZW5kLCAtNS4wKQorY2hlY2tGKGZ1bmN0aW9uICgpIHJldHVybiAtKCgyXjggKyAtKC0xKSkgJSA4KS8vMiAqIDQgLSAzIGVuZCwgLTcuMCkKK2NoZWNrSShmdW5jdGlvbiAoKSByZXR1cm4gMHhGMC4wIHwgMHhDQy4wIH4gMHhBQSAmIDB4RkQgZW5kLCAweEY0KQorY2hlY2tJKGZ1bmN0aW9uICgpIHJldHVybiB+KH4weEZGMCB8IDB4RkYwKSBlbmQsIDApCitjaGVja0koZnVuY3Rpb24gKCkgcmV0dXJuIH5+LTEwMjQuMCBlbmQsIC0xMDI0KQorY2hlY2tJKGZ1bmN0aW9uICgpIHJldHVybiAoKDEwMCA8PCA2KSA8PCAtNCkgPj4gMiBlbmQsIDEwMCkKKworLS0gYm9yZGVycyBhcm91bmQgTUFYQVJHX3NCeCAoKCgoMSA8PCAxNykgLSAxKSA+PiAxKSA9PSA2NTUzNSkKK2xvY2FsIHNieCA9ICgoMSA8PCAiMTciKSAtIDEpID4+IDEgICAtLSBhdm9pZCBmb2xkaW5nCitjaGVja0koZnVuY3Rpb24gKCkgcmV0dXJuIDY1NTM1IGVuZCwgc2J4KQorY2hlY2tJKGZ1bmN0aW9uICgpIHJldHVybiAtNjU1MzUgZW5kLCAtc2J4KQorY2hlY2tJKGZ1bmN0aW9uICgpIHJldHVybiA2NTUzNiBlbmQsIHNieCArIDEpCitjaGVja0soZnVuY3Rpb24gKCkgcmV0dXJuIDY1NTM3IGVuZCwgc2J4ICsgMikKK2NoZWNrSyhmdW5jdGlvbiAoKSByZXR1cm4gLTY1NTM2IGVuZCwgLShzYnggKyAxKSkKKworY2hlY2tGKGZ1bmN0aW9uICgpIHJldHVybiA2NTUzNS4wIGVuZCwgc2J4ICsgMC4wKQorY2hlY2tGKGZ1bmN0aW9uICgpIHJldHVybiAtNjU1MzUuMCBlbmQsIC1zYnggKyAwLjApCitjaGVja0YoZnVuY3Rpb24gKCkgcmV0dXJuIDY1NTM2LjAgZW5kLCAoc2J4ICsgMS4wKSkKK2NoZWNrSyhmdW5jdGlvbiAoKSByZXR1cm4gNjU1MzcuMCBlbmQsIChzYnggKyAyLjApKQorY2hlY2tLKGZ1bmN0aW9uICgpIHJldHVybiAtNjU1MzYuMCBlbmQsIC0oc2J4ICsgMS4wKSkKKworCistLSBpbW1lZGlhdGUgb3BlcmFuZHMKK2NoZWNrKGZ1bmN0aW9uICh4KSByZXR1cm4geCArIDEgZW5kLCAnQURESScsICdSRVRVUk4xJykKK2NoZWNrKGZ1bmN0aW9uICh4KSByZXR1cm4gMTI4ICsgeCBlbmQsICdBRERJJywgJ1JFVFVSTjEnKQorY2hlY2soZnVuY3Rpb24gKHgpIHJldHVybiB4ICogLTEyNyBlbmQsICdNVUxJJywgJ1JFVFVSTjEnKQorY2hlY2soZnVuY3Rpb24gKHgpIHJldHVybiAyMCAqIHggZW5kLCAnTVVMSScsICdSRVRVUk4xJykKK2NoZWNrKGZ1bmN0aW9uICh4KSByZXR1cm4geCBeIC0yIGVuZCwgJ1BPV0knLCAnUkVUVVJOMScpCitjaGVjayhmdW5jdGlvbiAoeCkgcmV0dXJuIHggLyA0MCBlbmQsICdESVZJJywgJ1JFVFVSTjEnKQorY2hlY2soZnVuY3Rpb24gKHgpIHJldHVybiB4IC8vIDEgZW5kLCAnSURJVkknLCAnUkVUVVJOMScpCitjaGVjayhmdW5jdGlvbiAoeCkgcmV0dXJuIHggJSAoMTAwIC0gMTApIGVuZCwgJ01PREknLCAnUkVUVVJOMScpCitjaGVjayhmdW5jdGlvbiAoeCkgcmV0dXJuIDEgPDwgeCBlbmQsICdTSExJJywgJ1JFVFVSTjEnKQorY2hlY2soZnVuY3Rpb24gKHgpIHJldHVybiB4IDw8IDIgZW5kLCAnU0hSSScsICdSRVRVUk4xJykKK2NoZWNrKGZ1bmN0aW9uICh4KSByZXR1cm4geCA+PiAyIGVuZCwgJ1NIUkknLCAnUkVUVVJOMScpCitjaGVjayhmdW5jdGlvbiAoeCkgcmV0dXJuIHggJiAxIGVuZCwgJ0JBTkRLJywgJ1JFVFVSTjEnKQorY2hlY2soZnVuY3Rpb24gKHgpIHJldHVybiAxMCB8IHggZW5kLCAnQk9SSycsICdSRVRVUk4xJykKK2NoZWNrKGZ1bmN0aW9uICh4KSByZXR1cm4gLTEwIH4geCBlbmQsICdCWE9SSycsICdSRVRVUk4xJykKKworLS0gbm8gZm9sZGluZ3MgKGFuZCBpbW1lZGlhdGUgb3BlcmFuZHMpCitjaGVjayhmdW5jdGlvbiAoKSByZXR1cm4gLTAuMCBlbmQsICdMT0FERicsICdVTk0nLCAnUkVUVVJOMScpCitjaGVjayhmdW5jdGlvbiAoKSByZXR1cm4gMy8wIGVuZCwgJ0xPQURJJywgJ0RJVkknLCAnUkVUVVJOMScpCitjaGVjayhmdW5jdGlvbiAoKSByZXR1cm4gMCUwIGVuZCwgJ0xPQURJJywgJ01PREknLCAnUkVUVVJOMScpCitjaGVjayhmdW5jdGlvbiAoKSByZXR1cm4gLTQvLzAgZW5kLCAnTE9BREknLCAnSURJVkknLCAnUkVUVVJOMScpCitjaGVjayhmdW5jdGlvbiAoeCkgcmV0dXJuIHggPj4gMi4wIGVuZCwgJ0xPQURGJywgJ1NIUicsICdSRVRVUk4xJykKK2NoZWNrKGZ1bmN0aW9uICh4KSByZXR1cm4geCAmIDIuMCBlbmQsICdMT0FERicsICdCQU5EJywgJ1JFVFVSTjEnKQorCistLSBiYXNpYyAnZm9yJyBsb29wcworY2hlY2soZnVuY3Rpb24gKCkgZm9yIGkgPSAtMTAsIDEwLjUgZG8gZW5kIGVuZCwKKydMT0FESScsICdMT0FESycsICdMT0FESScsICdGT1JQUkVQMScsICdGT1JMT09QMScsICdSRVRVUk4wJykKK2NoZWNrKGZ1bmN0aW9uICgpIGZvciBpID0gMHhmZmZmZmZmLCAxMC4wLCAxIGRvIGVuZCBlbmQsCisnTE9BREsnLCAnTE9BREYnLCAnTE9BREknLCAnRk9SUFJFUDEnLCAnRk9STE9PUDEnLCAnUkVUVVJOMCcpCisKKy0tIGJ1ZyBpbiBjb25zdGFudCBmb2xkaW5nIGZvciA1LjEKK2NoZWNrKGZ1bmN0aW9uICgpIHJldHVybiAtbmlsIGVuZCwgJ0xPQUROSUwnLCAnVU5NJywgJ1JFVFVSTjEnKQorCisKK2NoZWNrKGZ1bmN0aW9uICgpCisgIGxvY2FsIGEsYixjCisgIGJbY10sIGEgPSBjLCBiCisgIGJbYV0sIGEgPSBjLCBiCisgIGEsIGIgPSBjLCBhCisgIGEgPSBhCitlbmQsIAorICAnTE9BRE5JTCcsCisgICdNT1ZFJywgJ01PVkUnLCAnU0VUVEFCTEUnLAorICAnTU9WRScsICdNT1ZFJywgJ01PVkUnLCAnU0VUVEFCTEUnLAorICAnTU9WRScsICdNT1ZFJywgJ01PVkUnLAorICAtLSBubyBjb2RlIGZvciBhID0gYQorICAnUkVUVVJOMCcpCisKKworLS0geCA9PSBuaWwgLCB4IH49IG5pbAorLS0gY2hlY2tlcXVhbChmdW5jdGlvbiAoYikgaWYgKGE9PW5pbCkgdGhlbiBhPTEgZW5kOyBpZiBhfj1uaWwgdGhlbiBhPTEgZW5kIGVuZCwKKy0tICAgICAgICAgICAgZnVuY3Rpb24gKCkgaWYgKGE9PTkpIHRoZW4gYT0xIGVuZDsgaWYgYX49OSB0aGVuIGE9MSBlbmQgZW5kKQorCistLSBjaGVjayhmdW5jdGlvbiAoKSBpZiBhPT1uaWwgdGhlbiBhPSdhJyBlbmQgZW5kLAorLS0gJ0dFVFRBQlVQJywgJ0VRJywgJ0pNUCcsICdTRVRUQUJVUCcsICdSRVRVUk4nKQorCitkbyAgIC0tIHRlc3RzIGZvciB0YWJsZSBhY2Nlc3MgaW4gdXB2YWx1ZXMKKyAgbG9jYWwgdAorICBjaGVjayhmdW5jdGlvbiAoKSB0LnggPSB0LnkgZW5kLCAnR0VUVEFCVVAnLCAnU0VUVEFCVVAnKQorICBjaGVjayhmdW5jdGlvbiAoYSkgdFthKCldID0gdFthKCldIGVuZCwKKyAgJ01PVkUnLCAnQ0FMTCcsICdHRVRVUFZBTCcsICdNT1ZFJywgJ0NBTEwnLAorICAnR0VUVVBWQUwnLCAnR0VUVEFCTEUnLCAnU0VUVEFCTEUnKQorZW5kCisKKy0tIGRlIG1vcmdhbgorY2hlY2tlcXVhbChmdW5jdGlvbiAoKSBsb2NhbCBhOyBpZiBub3QgKGEgb3IgYikgdGhlbiBiPWEgZW5kIGVuZCwKKyAgICAgICAgICAgZnVuY3Rpb24gKCkgbG9jYWwgYTsgaWYgKG5vdCBhIGFuZCBub3QgYikgdGhlbiBiPWEgZW5kIGVuZCkKKworY2hlY2tlcXVhbChmdW5jdGlvbiAobCkgbG9jYWwgYTsgcmV0dXJuIDAgPD0gYSBhbmQgYSA8PSBsIGVuZCwKKyAgICAgICAgICAgZnVuY3Rpb24gKGwpIGxvY2FsIGE7IHJldHVybiBub3QgKG5vdChhID49IDApIG9yIG5vdChhIDw9IGwpKSBlbmQpCisKKworLS0gaWYtZ290byBvcHRpbWl6YXRpb25zCitjaGVjayhmdW5jdGlvbiAoYSwgYiwgYywgZCwgZSkKKyAgICAgICAgaWYgYSA9PSBiIHRoZW4gZ290byBsMTsKKyAgICAgICAgZWxzZWlmIGEgPT0gYyB0aGVuIGdvdG8gbDI7CisgICAgICAgIGVsc2VpZiBhID09IGQgdGhlbiBnb3RvIGwyOworICAgICAgICBlbHNlIGlmIGEgPT0gZSB0aGVuIGdvdG8gbDM7CisgICAgICAgICAgICAgZWxzZSBnb3RvIGwzCisgICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICA6OmwxOjogOjpsMjo6IDo6bDM6OiA6Omw0OjogCitlbmQsICdFUScsICdKTVAnLCAnRVEnLCAnSk1QJywgJ0VRJywgJ0pNUCcsICdFUScsICdKTVAnLCAnSk1QJywKKydDTE9TRScsICdDTE9TRScsICdDTE9TRScsICdDTE9TRScsICdSRVRVUk4wJykKKworY2hlY2tlcXVhbCgKK2Z1bmN0aW9uIChhKSB3aGlsZSBhIDwgMTAgZG8gYSA9IGEgKyAxIGVuZCBlbmQsCitmdW5jdGlvbiAoYSkgd2hpbGUgdHJ1ZSBkbyBpZiBub3QoYSA8IDEwKSB0aGVuIGJyZWFrIGVuZDsgYSA9IGEgKyAxOyBlbmQgZW5kCispCisKK3ByaW50ICdPSycKKwpkaWZmIC0tZ2l0IGEvdGVzdGVzL2NvbnN0cnVjdHMubHVhIGIvdGVzdGVzL2NvbnN0cnVjdHMubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTZjNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0ZXMvY29uc3RydWN0cy5sdWEKQEAgLTAsMCArMSwzMDIgQEAKKy0tICRJZDogY29uc3RydWN0cy5sdWEsdiAxLjQzIDIwMTgvMDIvMjEgMTc6NDE6MDcgcm9iZXJ0byBFeHAgJAorLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCisKKzs7cHJpbnQgInRlc3Rpbmcgc3ludGF4Ijs7CisKK2xvY2FsIGRlYnVnID0gcmVxdWlyZSAiZGVidWciCisKKworbG9jYWwgZnVuY3Rpb24gY2hlY2tsb2FkIChzLCBtc2cpCisgIGFzc2VydChzdHJpbmcuZmluZChzZWxlY3QoMiwgbG9hZChzKSksIG1zZykpCitlbmQKKworLS0gdGVzdGluZyBzZW1pY29sbG9ucworZG8gOzs7IGVuZAorOyBkbyA7IGEgPSAzOyBhc3NlcnQoYSA9PSAzKSBlbmQ7Cis7CisKKworLS0gaW52YWxpZCBvcGVyYXRpb25zIHNob3VsZCBub3QgcmFpc2UgZXJyb3JzIHdoZW4gbm90IGV4ZWN1dGVkCitpZiBmYWxzZSB0aGVuIGEgPSAzIC8vIDA7IGEgPSAwICUgMCBlbmQKKworCistLSB0ZXN0aW5nIHByaW9yaXRpZXMKKworYXNzZXJ0KDJeM14yID09IDJeKDNeMikpOworYXNzZXJ0KDJeMyo0ID09ICgyXjMpKjQpOworYXNzZXJ0KDIuMF4tMiA9PSAxLzQgYW5kIC0yXi0gLTIgPT0gLSAtIC00KTsKK2Fzc2VydChub3QgbmlsIGFuZCAyIGFuZCBub3QoMj4zIG9yIDM8MikpOworYXNzZXJ0KC0zLTEtNSA9PSAwKzAtOSk7Cithc3NlcnQoLTJeMiA9PSAtNCBhbmQgKC0yKV4yID09IDQgYW5kIDIqMi0zLTEgPT0gMCk7Cithc3NlcnQoLTMlNSA9PSAyIGFuZCAtMys1ID09IDIpCithc3NlcnQoMioxKzMvMyA9PSAzIGFuZCAxKzIgLi4gMyoxID09ICIzMyIpOworYXNzZXJ0KG5vdCgyKzEgPiAzKjEpIGFuZCAiYSIuLiJiIiA+ICJhIik7CisKK2Fzc2VydCgweEYwIHwgMHhDQyB+IDB4QUEgJiAweEZEID09IDB4RjQpCithc3NlcnQoMHhGRCAmIDB4QUEgfiAweENDIHwgMHhGMCA9PSAweEY0KQorYXNzZXJ0KDB4RjAgJiAweDBGICsgMSA9PSAweDEwKQorCithc3NlcnQoM140Ly8yXjMvLzUgPT0gMikKKworYXNzZXJ0KC0zKzQqNS8vMl4zXjIvLzkrNCUxMC8zID09ICgtMykrKCgoNCo1KS8vKDJeKDNeMikpKS8vOSkrKCg0JTEwKS8zKSkKKworYXNzZXJ0KG5vdCAoKHRydWUgb3IgZmFsc2UpIGFuZCBuaWwpKQorYXNzZXJ0KCAgICAgIHRydWUgb3IgZmFsc2UgIGFuZCBuaWwpCisKKy0tIG9sZCBidWcKK2Fzc2VydCgoKCgxIG9yIGZhbHNlKSBhbmQgdHJ1ZSkgb3IgZmFsc2UpID09IHRydWUpCithc3NlcnQoKCgobmlsIGFuZCB0cnVlKSBvciBmYWxzZSkgYW5kIHRydWUpID09IGZhbHNlKQorCitsb2NhbCBhLGIgPSAxLG5pbDsKK2Fzc2VydCgtKDEgb3IgMikgPT0gLTEgYW5kICgxIGFuZCAyKSsoLTEuMjUgb3IgLTQpID09IDAuNzUpOworeCA9ICgoYiBvciBhKSsxID09IDIgYW5kICgxMCBvciBhKSsxID09IDExKTsgYXNzZXJ0KHgpOworeCA9ICgoKDI8Mykgb3IgMSkgPT0gdHJ1ZSBhbmQgKDI8MyBhbmQgNCkgPT0gNCk7IGFzc2VydCh4KTsKKworeCx5PTEsMjsKK2Fzc2VydCgoeD55KSBhbmQgeCBvciB5ID09IDIpOworeCx5PTIsMTsKK2Fzc2VydCgoeD55KSBhbmQgeCBvciB5ID09IDIpOworCithc3NlcnQoMTIzNDU2Nzg5MCA9PSB0b251bWJlcignMTIzNDU2Nzg5MCcpIGFuZCAxMjM0NTY3ODkwKzEgPT0gMTIzNDU2Nzg5MSkKKworCistLSBzaWxseSBsb29wcworcmVwZWF0IHVudGlsIDE7IHJlcGVhdCB1bnRpbCB0cnVlOword2hpbGUgZmFsc2UgZG8gZW5kOyB3aGlsZSBuaWwgZG8gZW5kOworCitkbyAgLS0gdGVzdCBvbGQgYnVnIChmaXJzdCBuYW1lIGNvdWxkIG5vdCBiZSBhbiBgdXB2YWx1ZScpCisgbG9jYWwgYTsgZnVuY3Rpb24gZih4KSB4PXthPTF9OyB4PXt4PTF9OyB4PXtHPTF9IGVuZAorZW5kCisKK2Z1bmN0aW9uIGYgKGkpCisgIGlmIHR5cGUoaSkgfj0gJ251bWJlcicgdGhlbiByZXR1cm4gaSwnam9qbyc7IGVuZDsKKyAgaWYgaSA+IDAgdGhlbiByZXR1cm4gaSwgZihpLTEpOyBlbmQ7CitlbmQKKworeCA9IHtmKDMpLCBmKDUpLCBmKDEwKTt9OworYXNzZXJ0KHhbMV0gPT0gMyBhbmQgeFsyXSA9PSA1IGFuZCB4WzNdID09IDEwIGFuZCB4WzRdID09IDkgYW5kIHhbMTJdID09IDEpOworYXNzZXJ0KHhbbmlsXSA9PSBuaWwpCit4ID0ge2YnYWxvJywgZid4aXhpJywgbmlsfTsKK2Fzc2VydCh4WzFdID09ICdhbG8nIGFuZCB4WzJdID09ICd4aXhpJyBhbmQgeFszXSA9PSBuaWwpOworeCA9IHtmJ2FsbycuLid4aXhpJ307Cithc3NlcnQoeFsxXSA9PSAnYWxveGl4aScpCit4ID0ge2Z7fX0KK2Fzc2VydCh4WzJdID09ICdqb2pvJyBhbmQgdHlwZSh4WzFdKSA9PSAndGFibGUnKQorCisKK2xvY2FsIGYgPSBmdW5jdGlvbiAoaSkKKyAgaWYgaSA8IDEwIHRoZW4gcmV0dXJuICdhJzsKKyAgZWxzZWlmIGkgPCAyMCB0aGVuIHJldHVybiAnYic7CisgIGVsc2VpZiBpIDwgMzAgdGhlbiByZXR1cm4gJ2MnOworICBlbmQ7CitlbmQKKworYXNzZXJ0KGYoMykgPT0gJ2EnIGFuZCBmKDEyKSA9PSAnYicgYW5kIGYoMjYpID09ICdjJyBhbmQgZigxMDApID09IG5pbCkKKworZm9yIGk9MSwxMDAwIGRvIGJyZWFrOyBlbmQ7CituPTEwMDsKK2k9MzsKK3QgPSB7fTsKK2E9bmlsCit3aGlsZSBub3QgYSBkbworICBhPTA7IGZvciBpPTEsbiBkbyBmb3IgaT1pLDEsLTEgZG8gYT1hKzE7IHRbaV09MTsgZW5kOyBlbmQ7CitlbmQKK2Fzc2VydChhID09IG4qKG4rMSkvMiBhbmQgaT09Myk7Cithc3NlcnQodFsxXSBhbmQgdFtuXSBhbmQgbm90IHRbMF0gYW5kIG5vdCB0W24rMV0pCisKK2Z1bmN0aW9uIGYoYikKKyAgbG9jYWwgeCA9IDE7CisgIHJlcGVhdAorICAgIGxvY2FsIGE7CisgICAgaWYgYj09MSB0aGVuIGxvY2FsIGI9MTsgeD0xMDsgYnJlYWsKKyAgICBlbHNlaWYgYj09MiB0aGVuIHg9MjA7IGJyZWFrOworICAgIGVsc2VpZiBiPT0zIHRoZW4geD0zMDsKKyAgICBlbHNlIGxvY2FsIGEsYixjLGQ9bWF0aC5zaW4oMSk7IHg9eCsxOworICAgIGVuZAorICB1bnRpbCB4Pj0xMjsKKyAgcmV0dXJuIHg7CitlbmQ7CisKK2Fzc2VydChmKDEpID09IDEwIGFuZCBmKDIpID09IDIwIGFuZCBmKDMpID09IDMwIGFuZCBmKDQpPT0xMikKKworCitsb2NhbCBmID0gZnVuY3Rpb24gKGkpCisgIGlmIGkgPCAxMCB0aGVuIHJldHVybiAnYScKKyAgZWxzZWlmIGkgPCAyMCB0aGVuIHJldHVybiAnYicKKyAgZWxzZWlmIGkgPCAzMCB0aGVuIHJldHVybiAnYycKKyAgZWxzZSByZXR1cm4gOAorICBlbmQKK2VuZAorCithc3NlcnQoZigzKSA9PSAnYScgYW5kIGYoMTIpID09ICdiJyBhbmQgZigyNikgPT0gJ2MnIGFuZCBmKDEwMCkgPT0gOCkKKworbG9jYWwgYSwgYiA9IG5pbCwgMjMKK3ggPSB7ZigxMDApKjIrMyBvciBhLCBhIG9yIGIrMn0KK2Fzc2VydCh4WzFdID09IDE5IGFuZCB4WzJdID09IDI1KQoreCA9IHtmPTIrMyBvciBhLCBhID0gYisyfQorYXNzZXJ0KHguZiA9PSA1IGFuZCB4LmEgPT0gMjUpCisKK2E9e3k9MX0KK3ggPSB7YS55fQorYXNzZXJ0KHhbMV0gPT0gMSkKKworZnVuY3Rpb24gZihpKQorICB3aGlsZSAxIGRvCisgICAgaWYgaT4wIHRoZW4gaT1pLTE7CisgICAgZWxzZSByZXR1cm47IGVuZDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBnKGkpCisgIHdoaWxlIDEgZG8KKyAgICBpZiBpPjAgdGhlbiBpPWktMQorICAgIGVsc2UgcmV0dXJuIGVuZAorICBlbmQKK2VuZAorCitmKDEwKTsgZygxMCk7CisKK2RvCisgIGZ1bmN0aW9uIGYgKCkgcmV0dXJuIDEsMiwzOyBlbmQKKyAgbG9jYWwgYSwgYiwgYyA9IGYoKTsKKyAgYXNzZXJ0KGE9PTEgYW5kIGI9PTIgYW5kIGM9PTMpCisgIGEsIGIsIGMgPSAoZigpKTsKKyAgYXNzZXJ0KGE9PTEgYW5kIGI9PW5pbCBhbmQgYz09bmlsKQorZW5kCisKK2xvY2FsIGEsYiA9IDMgYW5kIGYoKTsKK2Fzc2VydChhPT0xIGFuZCBiPT1uaWwpCisKK2Z1bmN0aW9uIGcoKSBmKCk7IHJldHVybjsgZW5kOworYXNzZXJ0KGcoKSA9PSBuaWwpCitmdW5jdGlvbiBnKCkgcmV0dXJuIG5pbCBvciBmKCkgZW5kCithLGIgPSBnKCkKK2Fzc2VydChhPT0xIGFuZCBiPT1uaWwpCisKK3ByaW50JysnOworCisKK2YgPSBbWworcmV0dXJuIGZ1bmN0aW9uICggYSAsIGIgLCBjICwgZCAsIGUgKQorICBsb2NhbCB4ID0gYSA+PSBiIG9yIGMgb3IgKCBkIGFuZCBlICkgb3IgbmlsCisgIHJldHVybiB4CitlbmQgLCB7IGEgPSAxICwgYiA9IDIgPj0gMSAsIH0gb3IgeyAxIH07CitdXQorZiA9IHN0cmluZy5nc3ViKGYsICIlcysiLCAiXG4iKTsgICAtLSBmb3JjZSBhIFNFVExJTkUgYmV0d2VlbiBvcGNvZGVzCitmLGEgPSBsb2FkKGYpKCk7Cithc3NlcnQoYS5hID09IDEgYW5kIGEuYikKKworZnVuY3Rpb24gZyAoYSxiLGMsZCxlKQorICBpZiBub3QgKGE+PWIgb3IgYyBvciBkIGFuZCBlIG9yIG5pbCkgdGhlbiByZXR1cm4gMDsgZWxzZSByZXR1cm4gMTsgZW5kOworZW5kCisKK2Z1bmN0aW9uIGggKGEsYixjLGQsZSkKKyAgd2hpbGUgKGE+PWIgb3IgYyBvciAoZCBhbmQgZSkgb3IgbmlsKSBkbyByZXR1cm4gMTsgZW5kOworICByZXR1cm4gMDsKK2VuZDsKKworYXNzZXJ0KGYoMiwxKSA9PSB0cnVlIGFuZCBnKDIsMSkgPT0gMSBhbmQgaCgyLDEpID09IDEpCithc3NlcnQoZigxLDIsJ2EnKSA9PSAnYScgYW5kIGcoMSwyLCdhJykgPT0gMSBhbmQgaCgxLDIsJ2EnKSA9PSAxKQorYXNzZXJ0KGYoMSwyLCdhJykKK349ICAgICAgICAgIC0tIGZvcmNlIFNFVExJTkUgYmVmb3JlIG5pbAorbmlsLCAiIikKK2Fzc2VydChmKDEsMiwnYScpID09ICdhJyBhbmQgZygxLDIsJ2EnKSA9PSAxIGFuZCBoKDEsMiwnYScpID09IDEpCithc3NlcnQoZigxLDIsbmlsLDEsJ3gnKSA9PSAneCcgYW5kIGcoMSwyLG5pbCwxLCd4JykgPT0gMSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCgxLDIsbmlsLDEsJ3gnKSA9PSAxKQorYXNzZXJ0KGYoMSwyLG5pbCxuaWwsJ3gnKSA9PSBuaWwgYW5kIGcoMSwyLG5pbCxuaWwsJ3gnKSA9PSAwIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgoMSwyLG5pbCxuaWwsJ3gnKSA9PSAwKQorYXNzZXJ0KGYoMSwyLG5pbCwxLG5pbCkgPT0gbmlsIGFuZCBnKDEsMixuaWwsMSxuaWwpID09IDAgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgoMSwyLG5pbCwxLG5pbCkgPT0gMCkKKworYXNzZXJ0KDEgYW5kIDI8MyA9PSB0cnVlIGFuZCAyPDMgYW5kICdhJzwnYicgPT0gdHJ1ZSkKK3ggPSAyPDMgYW5kIG5vdCAzOyBhc3NlcnQoeD09ZmFsc2UpCit4ID0gMjwxIG9yICgyPjEgYW5kICdhJyk7IGFzc2VydCh4PT0nYScpCisKKworZG8KKyAgbG9jYWwgYTsgaWYgbmlsIHRoZW4gYT0xOyBlbHNlIGE9MjsgZW5kOyAgICAtLSB0aGlzIG5pbCBjb21lcyBhcyBQVVNITklMIDIKKyAgYXNzZXJ0KGE9PTIpCitlbmQKKworZnVuY3Rpb24gRihhKQorICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAibiIpLm5hbWUgPT0gJ0YnKQorICByZXR1cm4gYSwyLDMKK2VuZAorCithLGIgPSBGKDEpfj1uaWw7IGFzc2VydChhID09IHRydWUgYW5kIGIgPT0gbmlsKTsKK2EsYiA9IEYobmlsKT09bmlsOyBhc3NlcnQoYSA9PSB0cnVlIGFuZCBiID09IG5pbCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tIHNvbWV0aW1lcyB3aWxsIGJlIDAsIHNvbWV0aW1lcyB3aWxsIG5vdC4uLgorX0VOVi5HTE9CMSA9IG1hdGguZmxvb3Iob3MudGltZSgpKSAlIDIKKworLS0gYmFzaWMgZXhwcmVzc2lvbnMgd2l0aCB0aGVpciByZXNwZWN0aXZlIHZhbHVlcworbG9jYWwgYmFzaWNjYXNlcyA9IHsKKyAgeyJuaWwiLCBuaWx9LAorICB7ImZhbHNlIiwgZmFsc2V9LAorICB7InRydWUiLCB0cnVlfSwKKyAgeyIxMCIsIDEwfSwKKyAgeyIoMD09X0VOVi5HTE9CMSkiLCAwID09IF9FTlYuR0xPQjF9LAorfQorCitwcmludCgndGVzdGluZyBzaG9ydC1jaXJjdWl0IG9wdGltaXphdGlvbnMgKCcgLi4gX0VOVi5HTE9CMSAuLiAnKScpCisKKworLS0gb3BlcmF0b3JzIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSB2YWx1ZXMKK2xvY2FsIGJpbm9wcyA9IHsKKyAgeyIgYW5kICIsIGZ1bmN0aW9uIChhLGIpIGlmIG5vdCBhIHRoZW4gcmV0dXJuIGEgZWxzZSByZXR1cm4gYiBlbmQgZW5kfSwKKyAgeyIgb3IgIiwgZnVuY3Rpb24gKGEsYikgaWYgYSB0aGVuIHJldHVybiBhIGVsc2UgcmV0dXJuIGIgZW5kIGVuZH0sCit9CisKK2xvY2FsIGNhc2VzID0ge30KKworLS0gY3JlYXRlcyBhbGwgY29tYmluYXRpb25zIG9mICcoY2FzZXNbaV0gb3AgY2FzZXNbbi1pXSknIHBsdXMKKy0tICdub3QoY2FzZXNbaV0gb3AgY2FzZXNbbi1pXSknIChzeW50YXggKyB2YWx1ZSkKK2xvY2FsIGZ1bmN0aW9uIGNyZWF0ZWNhc2VzIChuKQorICBsb2NhbCByZXMgPSB7fQorICBmb3IgaSA9IDEsIG4gLSAxIGRvCisgICAgZm9yIF8sIHYxIGluIGlwYWlycyhjYXNlc1tpXSkgZG8KKyAgICAgIGZvciBfLCB2MiBpbiBpcGFpcnMoY2FzZXNbbiAtIGldKSBkbworICAgICAgICBmb3IgXywgb3AgaW4gaXBhaXJzKGJpbm9wcykgZG8KKyAgICAgICAgICAgIGxvY2FsIHQgPSB7CisgICAgICAgICAgICAgICIoIiAuLiB2MVsxXSAuLiBvcFsxXSAuLiB2MlsxXSAuLiAiKSIsCisgICAgICAgICAgICAgIG9wWzJdKHYxWzJdLCB2MlsyXSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc1sjcmVzICsgMV0gPSB0CisgICAgICAgICAgICByZXNbI3JlcyArIDFdID0geyJub3QiIC4uIHRbMV0sIG5vdCB0WzJdfQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIHJlcworZW5kCisKKy0tIGRvIG5vdCBkbyB0b28gbWFueSBjb21iaW5hdGlvbnMgZm9yIHNvZnQgdGVzdHMKK2xvY2FsIGxldmVsID0gX3NvZnQgYW5kIDMgb3IgNAorCitjYXNlc1sxXSA9IGJhc2ljY2FzZXMKK2ZvciBpID0gMiwgbGV2ZWwgZG8gY2FzZXNbaV0gPSBjcmVhdGVjYXNlcyhpKSBlbmQKK3ByaW50KCIrIikKKworbG9jYWwgcHJvZyA9IFtbaWYgJXMgdGhlbiBJWCA9IHRydWUgZW5kOyByZXR1cm4gJXNdXQorCitsb2NhbCBpID0gMAorZm9yIG4gPSAxLCBsZXZlbCBkbworICBmb3IgXywgdiBpbiBwYWlycyhjYXNlc1tuXSkgZG8KKyAgICBsb2NhbCBzID0gdlsxXQorICAgIGxvY2FsIHAgPSBsb2FkKHN0cmluZy5mb3JtYXQocHJvZywgcywgcyksICIiKQorICAgIElYID0gZmFsc2UKKyAgICBhc3NlcnQocCgpID09IHZbMl0gYW5kIElYID09IG5vdCBub3QgdlsyXSkKKyAgICBpID0gaSArIDEKKyAgICBpZiBpICUgNjAwMDAgPT0gMCB0aGVuIHByaW50KCcrJykgZW5kCisgIGVuZAorZW5kCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gdGVzdGluZyBzb21lIHN5bnRheCBlcnJvcnMgKGNob3NlbiB0aHJvdWdoICdnY292JykKK2NoZWNrbG9hZCgiZm9yIHggZG8iLCAiZXhwZWN0ZWQiKQorY2hlY2tsb2FkKCJ4OmNhbGwiLCAiZXhwZWN0ZWQiKQorCitwcmludCdPSycKZGlmZiAtLWdpdCBhL3Rlc3Rlcy9jb3JvdXRpbmUubHVhIGIvdGVzdGVzL2Nvcm91dGluZS5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwODczMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9jb3JvdXRpbmUubHVhCkBAIC0wLDAgKzEsOTE4IEBACistLSAkSWQ6IGNvcm91dGluZS5sdWEsdiAxLjQ4IDIwMTgvMDMvMTIgMTQ6MTk6MzYgcm9iZXJ0byBFeHAgJAorLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCisKK3ByaW50ICJ0ZXN0aW5nIGNvcm91dGluZXMiCisKK2xvY2FsIGRlYnVnID0gcmVxdWlyZSdkZWJ1ZycKKworbG9jYWwgZgorCitsb2NhbCBtYWluLCBpc21haW4gPSBjb3JvdXRpbmUucnVubmluZygpCithc3NlcnQodHlwZShtYWluKSA9PSAidGhyZWFkIiBhbmQgaXNtYWluKQorYXNzZXJ0KG5vdCBjb3JvdXRpbmUucmVzdW1lKG1haW4pKQorYXNzZXJ0KG5vdCBjb3JvdXRpbmUuaXN5aWVsZGFibGUoKSkKK2Fzc2VydChub3QgcGNhbGwoY29yb3V0aW5lLnlpZWxkKSkKKworCistLSB0cml2aWFsIGVycm9ycworYXNzZXJ0KG5vdCBwY2FsbChjb3JvdXRpbmUucmVzdW1lLCAwKSkKK2Fzc2VydChub3QgcGNhbGwoY29yb3V0aW5lLnN0YXR1cywgMCkpCisKKworLS0gdGVzdHMgZm9yIG11bHRpcGxlIHlpZWxkL3Jlc3VtZSBhcmd1bWVudHMKKworbG9jYWwgZnVuY3Rpb24gZXF0YWIgKHQxLCB0MikKKyAgYXNzZXJ0KCN0MSA9PSAjdDIpCisgIGZvciBpID0gMSwgI3QxIGRvCisgICAgbG9jYWwgdiA9IHQxW2ldCisgICAgYXNzZXJ0KHQyW2ldID09IHYpCisgIGVuZAorZW5kCisKK19HLnggPSBuaWwgICAtLSBkZWNsYXJlIHgKK2Z1bmN0aW9uIGZvbyAoYSwgLi4uKQorICBsb2NhbCB4LCB5ID0gY29yb3V0aW5lLnJ1bm5pbmcoKQorICBhc3NlcnQoeCA9PSBmIGFuZCB5ID09IGZhbHNlKQorICAtLSBuZXh0IGNhbGwgc2hvdWxkIG5vdCBjb3JydXB0IGNvcm91dGluZSAoYnV0IG11c3QgZmFpbCwKKyAgLS0gYXMgaXQgYXR0ZW1wdHMgdG8gcmVzdW1lIHRoZSBydW5uaW5nIGNvcm91dGluZSkKKyAgYXNzZXJ0KGNvcm91dGluZS5yZXN1bWUoZikgPT0gZmFsc2UpCisgIGFzc2VydChjb3JvdXRpbmUuc3RhdHVzKGYpID09ICJydW5uaW5nIikKKyAgbG9jYWwgYXJnID0gey4uLn0KKyAgYXNzZXJ0KGNvcm91dGluZS5pc3lpZWxkYWJsZSgpKQorICBmb3IgaT0xLCNhcmcgZG8KKyAgICBfRy54ID0ge2Nvcm91dGluZS55aWVsZCh0YWJsZS51bnBhY2soYXJnW2ldKSl9CisgIGVuZAorICByZXR1cm4gdGFibGUudW5wYWNrKGEpCitlbmQKKworZiA9IGNvcm91dGluZS5jcmVhdGUoZm9vKQorYXNzZXJ0KHR5cGUoZikgPT0gInRocmVhZCIgYW5kIGNvcm91dGluZS5zdGF0dXMoZikgPT0gInN1c3BlbmRlZCIpCithc3NlcnQoc3RyaW5nLmZpbmQodG9zdHJpbmcoZiksICJ0aHJlYWQiKSkKK2xvY2FsIHMsYSxiLGMsZAorcyxhLGIsYyxkID0gY29yb3V0aW5lLnJlc3VtZShmLCB7MSwyLDN9LCB7fSwgezF9LCB7J2EnLCAnYicsICdjJ30pCithc3NlcnQocyBhbmQgYSA9PSBuaWwgYW5kIGNvcm91dGluZS5zdGF0dXMoZikgPT0gInN1c3BlbmRlZCIpCitzLGEsYixjLGQgPSBjb3JvdXRpbmUucmVzdW1lKGYpCitlcXRhYihfRy54LCB7fSkKK2Fzc2VydChzIGFuZCBhID09IDEgYW5kIGIgPT0gbmlsKQorcyxhLGIsYyxkID0gY29yb3V0aW5lLnJlc3VtZShmLCAxLCAyLCAzKQorZXF0YWIoX0cueCwgezEsIDIsIDN9KQorYXNzZXJ0KHMgYW5kIGEgPT0gJ2EnIGFuZCBiID09ICdiJyBhbmQgYyA9PSAnYycgYW5kIGQgPT0gbmlsKQorcyxhLGIsYyxkID0gY29yb3V0aW5lLnJlc3VtZShmLCAieHV4dSIpCitlcXRhYihfRy54LCB7Inh1eHUifSkKK2Fzc2VydChzIGFuZCBhID09IDEgYW5kIGIgPT0gMiBhbmQgYyA9PSAzIGFuZCBkID09IG5pbCkKK2Fzc2VydChjb3JvdXRpbmUuc3RhdHVzKGYpID09ICJkZWFkIikKK3MsIGEgPSBjb3JvdXRpbmUucmVzdW1lKGYsICJ4dXh1IikKK2Fzc2VydChub3QgcyBhbmQgc3RyaW5nLmZpbmQoYSwgImRlYWQiKSBhbmQgY29yb3V0aW5lLnN0YXR1cyhmKSA9PSAiZGVhZCIpCisKKworLS0geWllbGRzIGluIHRhaWwgY2FsbHMKK2xvY2FsIGZ1bmN0aW9uIGZvbyAoaSkgcmV0dXJuIGNvcm91dGluZS55aWVsZChpKSBlbmQKK2YgPSBjb3JvdXRpbmUud3JhcChmdW5jdGlvbiAoKQorICBmb3IgaT0xLDEwIGRvCisgICAgYXNzZXJ0KGZvbyhpKSA9PSBfRy54KQorICBlbmQKKyAgcmV0dXJuICdhJworZW5kKQorZm9yIGk9MSwxMCBkbyBfRy54ID0gaTsgYXNzZXJ0KGYoaSkgPT0gaSkgZW5kCitfRy54ID0gJ3h1eHUnOyBhc3NlcnQoZigneHV4dScpID09ICdhJykKKworLS0gcmVjdXJzaXZlCitmdW5jdGlvbiBwZiAobiwgaSkKKyAgY29yb3V0aW5lLnlpZWxkKG4pCisgIHBmKG4qaSwgaSsxKQorZW5kCisKK2YgPSBjb3JvdXRpbmUud3JhcChwZikKK2xvY2FsIHM9MQorZm9yIGk9MSwxMCBkbworICBhc3NlcnQoZigxLCAxKSA9PSBzKQorICBzID0gcyppCitlbmQKKworLS0gc2lldmUKK2Z1bmN0aW9uIGdlbiAobikKKyAgcmV0dXJuIGNvcm91dGluZS53cmFwKGZ1bmN0aW9uICgpCisgICAgZm9yIGk9MixuIGRvIGNvcm91dGluZS55aWVsZChpKSBlbmQKKyAgZW5kKQorZW5kCisKKworZnVuY3Rpb24gZmlsdGVyIChwLCBnKQorICByZXR1cm4gY29yb3V0aW5lLndyYXAoZnVuY3Rpb24gKCkKKyAgICB3aGlsZSAxIGRvCisgICAgICBsb2NhbCBuID0gZygpCisgICAgICBpZiBuID09IG5pbCB0aGVuIHJldHVybiBlbmQKKyAgICAgIGlmIG1hdGguZm1vZChuLCBwKSB+PSAwIHRoZW4gY29yb3V0aW5lLnlpZWxkKG4pIGVuZAorICAgIGVuZAorICBlbmQpCitlbmQKKworbG9jYWwgeCA9IGdlbigxMDApCitsb2NhbCBhID0ge30KK3doaWxlIDEgZG8KKyAgbG9jYWwgbiA9IHgoKQorICBpZiBuID09IG5pbCB0aGVuIGJyZWFrIGVuZAorICB0YWJsZS5pbnNlcnQoYSwgbikKKyAgeCA9IGZpbHRlcihuLCB4KQorZW5kCisKK2Fzc2VydCgjYSA9PSAyNSBhbmQgYVsjYV0gPT0gOTcpCit4LCBhID0gbmlsCisKKy0tIHlpZWxkaW5nIGFjcm9zcyBDIGJvdW5kYXJpZXMKKworY28gPSBjb3JvdXRpbmUud3JhcChmdW5jdGlvbigpCisgICAgICAgYXNzZXJ0KG5vdCBwY2FsbCh0YWJsZS5zb3J0LHsxLDIsM30sIGNvcm91dGluZS55aWVsZCkpCisgICAgICAgYXNzZXJ0KGNvcm91dGluZS5pc3lpZWxkYWJsZSgpKQorICAgICAgIGNvcm91dGluZS55aWVsZCgyMCkKKyAgICAgICByZXR1cm4gMzAKKyAgICAgZW5kKQorCithc3NlcnQoY28oKSA9PSAyMCkKK2Fzc2VydChjbygpID09IDMwKQorCisKK2xvY2FsIGYgPSBmdW5jdGlvbiAocywgaSkgcmV0dXJuIGNvcm91dGluZS55aWVsZChpKSBlbmQKKworbG9jYWwgZjEgPSBjb3JvdXRpbmUud3JhcChmdW5jdGlvbiAoKQorICAgICAgICAgICAgIHJldHVybiB4cGNhbGwocGNhbGwsIGZ1bmN0aW9uICguLi4pIHJldHVybiAuLi4gZW5kLAorICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkKKyAgICAgICAgICAgICAgICAgbG9jYWwgcyA9IDAKKyAgICAgICAgICAgICAgICAgZm9yIGkgaW4gZiwgbmlsLCAxIGRvIHBjYWxsKGZ1bmN0aW9uICgpIHMgPSBzICsgaSBlbmQpIGVuZAorICAgICAgICAgICAgICAgICBlcnJvcih7c30pCisgICAgICAgICAgICAgICBlbmQpCisgICAgICAgICAgIGVuZCkKKworZjEoKQorZm9yIGkgPSAxLCAxMCBkbyBhc3NlcnQoZjEoaSkgPT0gaSkgZW5kCitsb2NhbCByMSwgcjIsIHYgPSBmMShuaWwpCithc3NlcnQocjEgYW5kIG5vdCByMiBhbmQgdlsxXSA9PSAgKDEwICsgMSkqMTAvMikKKworCitmdW5jdGlvbiBmIChhLCBiKSBhID0gY29yb3V0aW5lLnlpZWxkKGEpOyAgZXJyb3J7YSArIGJ9IGVuZAorZnVuY3Rpb24gZyh4KSByZXR1cm4geFsxXSoyIGVuZAorCitjbyA9IGNvcm91dGluZS53cmFwKGZ1bmN0aW9uICgpCisgICAgICAgY29yb3V0aW5lLnlpZWxkKHhwY2FsbChmLCBnLCAxMCwgMjApKQorICAgICBlbmQpCisKK2Fzc2VydChjbygpID09IDEwKQorciwgbXNnID0gY28oMTAwKQorYXNzZXJ0KG5vdCByIGFuZCBtc2cgPT0gMjQwKQorCisKKy0tIHVueWllbGRhYmxlIEMgY2FsbAorZG8KKyAgbG9jYWwgZnVuY3Rpb24gZiAoYykKKyAgICAgICAgICBhc3NlcnQobm90IGNvcm91dGluZS5pc3lpZWxkYWJsZSgpKQorICAgICAgICAgIHJldHVybiBjIC4uIGMKKyAgICAgICAgZW5kCisKKyAgbG9jYWwgY28gPSBjb3JvdXRpbmUud3JhcChmdW5jdGlvbiAoYykKKyAgICAgICAgICAgICAgIGFzc2VydChjb3JvdXRpbmUuaXN5aWVsZGFibGUoKSkKKyAgICAgICAgICAgICAgIGxvY2FsIHMgPSBzdHJpbmcuZ3N1YigiYSIsICIuIiwgZikKKyAgICAgICAgICAgICAgIHJldHVybiBzCisgICAgICAgICAgICAgZW5kKQorICBhc3NlcnQoY28oKSA9PSAiYWEiKQorZW5kCisKKworCitkbyAgIC0tIHRlc3Rpbmcgc2luZ2xlIHRyYWNlIG9mIGNvcm91dGluZXMKKyAgbG9jYWwgWAorICBsb2NhbCBjbyA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKCkKKyAgICBjb3JvdXRpbmUueWllbGQoMTApCisgICAgcmV0dXJuIDIwOworICBlbmQpCisgIGxvY2FsIHRyYWNlID0ge30KKyAgbG9jYWwgZnVuY3Rpb24gZG90cmFjZSAoZXZlbnQpCisgICAgdHJhY2VbI3RyYWNlICsgMV0gPSBldmVudAorICBlbmQKKyAgZGVidWcuc2V0aG9vayhjbywgZG90cmFjZSwgImNsciIpCisgIHJlcGVhdCB1bnRpbCBub3QgY29yb3V0aW5lLnJlc3VtZShjbykKKyAgbG9jYWwgY29ycmVjdHRyYWNlID0geyJjYWxsIiwgImxpbmUiLCAiY2FsbCIsICJyZXR1cm4iLCAibGluZSIsICJyZXR1cm4ifQorICBhc3NlcnQoI3RyYWNlID09ICNjb3JyZWN0dHJhY2UpCisgIGZvciBrLCB2IGluIHBhaXJzKHRyYWNlKSBkbworICAgIGFzc2VydCh2ID09IGNvcnJlY3R0cmFjZVtrXSkKKyAgZW5kCitlbmQKKworLS0gZXJyb3JzIGluIGNvcm91dGluZXMKK2Z1bmN0aW9uIGZvbyAoKQorICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5jdXJyZW50bGluZSA9PSBkZWJ1Zy5nZXRpbmZvKGZvbykubGluZWRlZmluZWQgKyAxKQorICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyKS5jdXJyZW50bGluZSA9PSBkZWJ1Zy5nZXRpbmZvKGdvbykubGluZWRlZmluZWQpCisgIGNvcm91dGluZS55aWVsZCgzKQorICBlcnJvcihmb28pCitlbmQKKworZnVuY3Rpb24gZ29vKCkgZm9vKCkgZW5kCit4ID0gY29yb3V0aW5lLndyYXAoZ29vKQorYXNzZXJ0KHgoKSA9PSAzKQorbG9jYWwgYSxiID0gcGNhbGwoeCkKK2Fzc2VydChub3QgYSBhbmQgYiA9PSBmb28pCisKK3ggPSBjb3JvdXRpbmUuY3JlYXRlKGdvbykKK2EsYiA9IGNvcm91dGluZS5yZXN1bWUoeCkKK2Fzc2VydChhIGFuZCBiID09IDMpCithLGIgPSBjb3JvdXRpbmUucmVzdW1lKHgpCithc3NlcnQobm90IGEgYW5kIGIgPT0gZm9vIGFuZCBjb3JvdXRpbmUuc3RhdHVzKHgpID09ICJkZWFkIikKK2EsYiA9IGNvcm91dGluZS5yZXN1bWUoeCkKK2Fzc2VydChub3QgYSBhbmQgc3RyaW5nLmZpbmQoYiwgImRlYWQiKSBhbmQgY29yb3V0aW5lLnN0YXR1cyh4KSA9PSAiZGVhZCIpCisKKworLS0gY28tcm91dGluZXMgeCBmb3IgbG9vcAorZnVuY3Rpb24gYWxsIChhLCBuLCBrKQorICBpZiBrID09IDAgdGhlbiBjb3JvdXRpbmUueWllbGQoYSkKKyAgZWxzZQorICAgIGZvciBpPTEsbiBkbworICAgICAgYVtrXSA9IGkKKyAgICAgIGFsbChhLCBuLCBrLTEpCisgICAgZW5kCisgIGVuZAorZW5kCisKK2xvY2FsIGEgPSAwCitmb3IgdCBpbiBjb3JvdXRpbmUud3JhcChmdW5jdGlvbiAoKSBhbGwoe30sIDUsIDQpIGVuZCkgZG8KKyAgYSA9IGErMQorZW5kCithc3NlcnQoYSA9PSA1XjQpCisKKworLS0gYWNjZXNzIHRvIGxvY2FscyBvZiBjb2xsZWN0ZWQgY29ycm91dGluZXMKK2xvY2FsIEMgPSB7fTsgc2V0bWV0YXRhYmxlKEMsIHtfX21vZGUgPSAia3YifSkKK2xvY2FsIHggPSBjb3JvdXRpbmUud3JhcCAoZnVuY3Rpb24gKCkKKyAgICAgICAgICAgIGxvY2FsIGEgPSAxMAorICAgICAgICAgICAgbG9jYWwgZnVuY3Rpb24gZiAoKSBhID0gYSsxMDsgcmV0dXJuIGEgZW5kCisgICAgICAgICAgICB3aGlsZSB0cnVlIGRvCisgICAgICAgICAgICAgIGEgPSBhKzEKKyAgICAgICAgICAgICAgY29yb3V0aW5lLnlpZWxkKGYpCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQpCisKK0NbMV0gPSB4OworCitsb2NhbCBmID0geCgpCithc3NlcnQoZigpID09IDIxIGFuZCB4KCkoKSA9PSAzMiBhbmQgeCgpID09IGYpCit4ID0gbmlsCitjb2xsZWN0Z2FyYmFnZSgpCithc3NlcnQoQ1sxXSA9PSB1bmRlZikKK2Fzc2VydChmKCkgPT0gNDMgYW5kIGYoKSA9PSA1MykKKworCistLSBvbGQgYnVnOiBhdHRlbXB0IHRvIHJlc3VtZSBpdHNlbGYKKworZnVuY3Rpb24gY29fZnVuYyAoY3VycmVudF9jbykKKyAgYXNzZXJ0KGNvcm91dGluZS5ydW5uaW5nKCkgPT0gY3VycmVudF9jbykKKyAgYXNzZXJ0KGNvcm91dGluZS5yZXN1bWUoY3VycmVudF9jbykgPT0gZmFsc2UpCisgIGNvcm91dGluZS55aWVsZCgxMCwgMjApCisgIGFzc2VydChjb3JvdXRpbmUucmVzdW1lKGN1cnJlbnRfY28pID09IGZhbHNlKQorICBjb3JvdXRpbmUueWllbGQoMjMpCisgIHJldHVybiAxMAorZW5kCisKK2xvY2FsIGNvID0gY29yb3V0aW5lLmNyZWF0ZShjb19mdW5jKQorbG9jYWwgYSxiLGMgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCBjbykKK2Fzc2VydChhID09IHRydWUgYW5kIGIgPT0gMTAgYW5kIGMgPT0gMjApCithLGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCBjbykKK2Fzc2VydChhID09IHRydWUgYW5kIGIgPT0gMjMpCithLGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCBjbykKK2Fzc2VydChhID09IHRydWUgYW5kIGIgPT0gMTApCithc3NlcnQoY29yb3V0aW5lLnJlc3VtZShjbywgY28pID09IGZhbHNlKQorYXNzZXJ0KGNvcm91dGluZS5yZXN1bWUoY28sIGNvKSA9PSBmYWxzZSkKKworCistLSBvdGhlciBvbGQgYnVnIHdoZW4gYXR0ZW1wdGluZyB0byByZXN1bWUgaXRzZWxmCistLSAodHJpZ2dlciBDLWNvZGUgYXNzZXJ0aW9ucykKK2RvCisgIGxvY2FsIEEgPSBjb3JvdXRpbmUucnVubmluZygpCisgIGxvY2FsIEIgPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uKCkgcmV0dXJuIGNvcm91dGluZS5yZXN1bWUoQSkgZW5kKQorICBsb2NhbCBzdCwgcmVzID0gY29yb3V0aW5lLnJlc3VtZShCKQorICBhc3NlcnQoc3QgPT0gdHJ1ZSBhbmQgcmVzID09IGZhbHNlKQorCisgIEEgPSBjb3JvdXRpbmUud3JhcChmdW5jdGlvbigpIHJldHVybiBwY2FsbChBLCAxKSBlbmQpCisgIHN0LCByZXMgPSBBKCkKKyAgYXNzZXJ0KG5vdCBzdCBhbmQgc3RyaW5nLmZpbmQocmVzLCAibm9uJS1zdXNwZW5kZWQiKSkKK2VuZAorCisKKy0tIGF0dGVtcHQgdG8gcmVzdW1lICdub3JtYWwnIGNvcm91dGluZQorbG9jYWwgY28xLCBjbzIKK2NvMSA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKCkgcmV0dXJuIGNvMigpIGVuZCkKK2NvMiA9IGNvcm91dGluZS53cmFwKGZ1bmN0aW9uICgpCisgICAgICAgIGFzc2VydChjb3JvdXRpbmUuc3RhdHVzKGNvMSkgPT0gJ25vcm1hbCcpCisgICAgICAgIGFzc2VydChub3QgY29yb3V0aW5lLnJlc3VtZShjbzEpKQorICAgICAgICBjb3JvdXRpbmUueWllbGQoMykKKyAgICAgIGVuZCkKKworYSxiID0gY29yb3V0aW5lLnJlc3VtZShjbzEpCithc3NlcnQoYSBhbmQgYiA9PSAzKQorYXNzZXJ0KGNvcm91dGluZS5zdGF0dXMoY28xKSA9PSAnZGVhZCcpCisKKy0tIGluZmluaXRlIHJlY3Vyc2lvbiBvZiBjb3JvdXRpbmVzCithID0gZnVuY3Rpb24oYSkgY29yb3V0aW5lLndyYXAoYSkoYSkgZW5kCithc3NlcnQobm90IHBjYWxsKGEsIGEpKQorYSA9IG5pbAorCisKKy0tIGFjY2VzcyB0byBsb2NhbHMgb2YgZXJyb25lb3VzIGNvcm91dGluZXMKK2xvY2FsIHggPSBjb3JvdXRpbmUuY3JlYXRlIChmdW5jdGlvbiAoKQorICAgICAgICAgICAgbG9jYWwgYSA9IDEwCisgICAgICAgICAgICBfRy5mID0gZnVuY3Rpb24gKCkgYT1hKzE7IHJldHVybiBhIGVuZAorICAgICAgICAgICAgZXJyb3IoJ3gnKQorICAgICAgICAgIGVuZCkKKworYXNzZXJ0KG5vdCBjb3JvdXRpbmUucmVzdW1lKHgpKQorLS0gb3ZlcndyaXRlIHByZXZpb3VzIHBvc2l0aW9uIG9mIGxvY2FsIGBhJworYXNzZXJ0KG5vdCBjb3JvdXRpbmUucmVzdW1lKHgsIDEsIDEsIDEsIDEsIDEsIDEsIDEpKQorYXNzZXJ0KF9HLmYoKSA9PSAxMSkKK2Fzc2VydChfRy5mKCkgPT0gMTIpCisKKworaWYgbm90IFQgdGhlbgorICAoTWVzc2FnZSBvciBwcmludCkoJ1xuID4+PiB0ZXN0QyBub3QgYWN0aXZlOiBza2lwcGluZyB5aWVsZC9ob29rIHRlc3RzIDw8PFxuJykKK2Vsc2UKKyAgcHJpbnQgInRlc3RpbmcgeWllbGRzIGluc2lkZSBob29rcyIKKworICBsb2NhbCB0dXJuCisgIAorICBmdW5jdGlvbiBmYWN0ICh0LCB4KQorICAgIGFzc2VydCh0dXJuID09IHQpCisgICAgaWYgeCA9PSAwIHRoZW4gcmV0dXJuIDEKKyAgICBlbHNlIHJldHVybiB4KmZhY3QodCwgeC0xKQorICAgIGVuZAorICBlbmQKKworICBsb2NhbCBBLCBCID0gMCwgMAorCisgIGxvY2FsIHggPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICgpCisgICAgVC5zZXRob29rKCJ5aWVsZCAwIiwgIiIsIDIpCisgICAgQSA9IGZhY3QoIkEiLCA2KQorICBlbmQpCisKKyAgbG9jYWwgeSA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKCkKKyAgICBULnNldGhvb2soInlpZWxkIDAiLCAiIiwgMykKKyAgICBCID0gZmFjdCgiQiIsIDcpCisgIGVuZCkKKworICB3aGlsZSBBPT0wIG9yIEI9PTAgZG8gICAgLS0gQSB+PSAwIHdoZW4gJ3gnIGZpbmlzaGVzIChzaW1pbGFyIGZvciAnQicsJ3knKQorICAgIGlmIEE9PTAgdGhlbiB0dXJuID0gIkEiOyBhc3NlcnQoVC5yZXN1bWUoeCkpIGVuZAorICAgIGlmIEI9PTAgdGhlbiB0dXJuID0gIkIiOyBhc3NlcnQoVC5yZXN1bWUoeSkpIGVuZAorICBlbmQKKworICBhc3NlcnQoQiAvLyBBID09IDcpICAgIC0tIGZhY3QoNykgLy8gZmFjdCg2KQorCisgIGxvY2FsIGxpbmUgPSBkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgKyAyICAgIC0tIGdldCBsaW5lIG51bWJlcgorICBsb2NhbCBmdW5jdGlvbiBmb28gKCkKKyAgICBsb2NhbCB4ID0gMTAgICAgLS08PCB0aGlzIGxpbmUgaXMgJ2xpbmUnCisgICAgeCA9IHggKyAxMAorICAgIF9HLlhYID0geAorICBlbmQKKworICAtLSB0ZXN0aW5nIHlpZWxkcyBpbiBsaW5lIGhvb2sKKyAgbG9jYWwgY28gPSBjb3JvdXRpbmUud3JhcChmdW5jdGlvbiAoKQorICAgIFQuc2V0aG9vaygic2V0Z2xvYmFsIFg7IHlpZWxkIDAiLCAibCIsIDApOyBmb28oKTsgcmV0dXJuIDEwIGVuZCkKKworICBfRy5YWCA9IG5pbDsKKyAgX0cuWCA9IG5pbDsgY28oKTsgYXNzZXJ0KF9HLlggPT0gbGluZSkKKyAgX0cuWCA9IG5pbDsgY28oKTsgYXNzZXJ0KF9HLlggPT0gbGluZSArIDEpCisgIF9HLlggPSBuaWw7IGNvKCk7IGFzc2VydChfRy5YID09IGxpbmUgKyAyIGFuZCBfRy5YWCA9PSBuaWwpCisgIF9HLlggPSBuaWw7IGNvKCk7IGFzc2VydChfRy5YID09IGxpbmUgKyAzIGFuZCBfRy5YWCA9PSAyMCkKKyAgYXNzZXJ0KGNvKCkgPT0gMTApCisKKyAgLS0gdGVzdGluZyB5aWVsZHMgaW4gY291bnQgaG9vaworICBjbyA9IGNvcm91dGluZS53cmFwKGZ1bmN0aW9uICgpCisgICAgVC5zZXRob29rKCJ5aWVsZCAwIiwgIiIsIDEpOyBmb28oKTsgcmV0dXJuIDEwIGVuZCkKKworICBfRy5YWCA9IG5pbDsKKyAgbG9jYWwgYyA9IDAKKyAgcmVwZWF0IGMgPSBjICsgMTsgbG9jYWwgYSA9IGNvKCkgdW50aWwgYSA9PSAxMAorICBhc3NlcnQoX0cuWFggPT0gMjAgYW5kIGMgPj0gNSkKKworICBjbyA9IGNvcm91dGluZS53cmFwKGZ1bmN0aW9uICgpCisgICAgVC5zZXRob29rKCJ5aWVsZCAwIiwgIiIsIDIpOyBmb28oKTsgcmV0dXJuIDEwIGVuZCkKKworICBfRy5YWCA9IG5pbDsKKyAgbG9jYWwgYyA9IDAKKyAgcmVwZWF0IGMgPSBjICsgMTsgbG9jYWwgYSA9IGNvKCkgdW50aWwgYSA9PSAxMAorICBhc3NlcnQoX0cuWFggPT0gMjAgYW5kIGMgPj0gNSkKKyAgX0cuWCA9IG5pbDsgX0cuWFggPSBuaWwKKworICBkbworICAgIC0tIHRlc3RpbmcgZGVidWcgbGlicmFyeSBvbiBhIGNvcm91dGluZSBzdXNwZW5kZWQgaW5zaWRlIGEgaG9vaworICAgIC0tIChidWcgaW4gNS4yLzUuMykKKyAgICBjID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoYSwgLi4uKQorICAgICAgVC5zZXRob29rKCJ5aWVsZCAwIiwgImwiKSAgIC0tIHdpbGwgeWllbGQgb24gbmV4dCB0d28gbGluZXMKKyAgICAgIGFzc2VydChhID09IDEwKQorICAgICAgcmV0dXJuIC4uLgorICAgIGVuZCkKKworICAgIGFzc2VydChjb3JvdXRpbmUucmVzdW1lKGMsIDEsIDIsIDMpKSAgIC0tIHN0YXJ0IGNvcm91dGluZQorICAgIGxvY2FsIG4sdiA9IGRlYnVnLmdldGxvY2FsKGMsIDAsIDEpICAgIC0tIGNoZWNrIGl0cyBsb2NhbAorICAgIGFzc2VydChuID09ICJhIiBhbmQgdiA9PSAxKQorICAgIGFzc2VydChkZWJ1Zy5zZXRsb2NhbChjLCAwLCAxLCAxMCkpICAgICAtLSB0ZXN0ICdzZXRsb2NhbCcKKyAgICBsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbyhjLCAwKSAgICAgICAgLS0gdGVzdCAnZ2V0aW5mbycKKyAgICBhc3NlcnQodC5jdXJyZW50bGluZSA9PSB0LmxpbmVkZWZpbmVkICsgMSkKKyAgICBhc3NlcnQobm90IGRlYnVnLmdldGluZm8oYywgMSkpICAgICAgLS0gbm8gb3RoZXIgbGV2ZWwKKyAgICBhc3NlcnQoY29yb3V0aW5lLnJlc3VtZShjKSkgICAgICAgICAgLS0gcnVuIG5leHQgbGluZQorICAgIHYgPSB7Y29yb3V0aW5lLnJlc3VtZShjKX0gICAgICAgICAtLSBmaW5pc2ggY29yb3V0aW5lCisgICAgYXNzZXJ0KHZbMV0gPT0gdHJ1ZSBhbmQgdlsyXSA9PSAyIGFuZCB2WzNdID09IDMgYW5kIHZbNF0gPT0gdW5kZWYpCisgICAgYXNzZXJ0KG5vdCBjb3JvdXRpbmUucmVzdW1lKGMpKQorICBlbmQKKworICBkbworICAgIC0tIHRlc3RpbmcgZGVidWcgbGlicmFyeSBvbiBsYXN0IGZ1bmN0aW9uIGluIGEgc3VzcGVuZGVkIGNvcm91dGluZQorICAgIC0tIChidWcgaW4gNS4yLzUuMykKKyAgICBsb2NhbCBjID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoKSBULnRlc3RDKCJ5aWVsZCAxIiwgMTAsIDIwKSBlbmQpCisgICAgbG9jYWwgYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoYykKKyAgICBhc3NlcnQoYSBhbmQgYiA9PSAyMCkKKyAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbyhjLCAwKS5saW5lZGVmaW5lZCA9PSAtMSkKKyAgICBhLCBiID0gZGVidWcuZ2V0bG9jYWwoYywgMCwgMikKKyAgICBhc3NlcnQoYiA9PSAxMCkKKyAgZW5kCisKKworICBwcmludCAidGVzdGluZyBjb3JvdXRpbmUgQVBJIgorICAKKyAgLS0gcmV1c2luZyBhIHRocmVhZAorICBhc3NlcnQoVC50ZXN0QyhbWworICAgIG5ld3RocmVhZCAgICAgICMgY3JlYXRlIHRocmVhZAorICAgIHB1c2h2YWx1ZSAyICAgICMgcHVzaCBib2R5CisgICAgcHVzaHN0cmluZyAnYSBhIGEnICAjIHB1c2ggYXJndW1lbnQKKyAgICB4bW92ZSAwIDMgMiAgICMgbW92ZSB2YWx1ZXMgdG8gbmV3IHRocmVhZAorICAgIHJlc3VtZSAtMSwgMSAgICAjIGNhbGwgaXQgZmlyc3QgdGltZQorICAgIHB1c2hzdGF0dXMKKyAgICB4bW92ZSAzIDAgMCAgICMgbW92ZSByZXN1bHRzIGJhY2sgdG8gc3RhY2sKKyAgICBzZXRnbG9iYWwgWCAgICAjIHJlc3VsdAorICAgIHNldGdsb2JhbCBZICAgICMgc3RhdHVzCisgICAgcHVzaHZhbHVlIDIgICAgICMgcHVzaCBib2R5ICh0byBjYWxsIGl0IGFnYWluKQorICAgIHB1c2hzdHJpbmcgJ2IgYiBiJworICAgIHhtb3ZlIDAgMyAyCisgICAgcmVzdW1lIC0xLCAxICAgICMgY2FsbCBpdCBhZ2FpbgorICAgIHB1c2hzdGF0dXMKKyAgICB4bW92ZSAzIDAgMAorICAgIHJldHVybiAxICAgICAgICAjIHJldHVybiByZXN1bHQKKyAgXV0sIGZ1bmN0aW9uICguLi4pIHJldHVybiAuLi4gZW5kKSA9PSAnYiBiIGInKQorCisgIGFzc2VydChYID09ICdhIGEgYScgYW5kIFkgPT0gJ09LJykKKworCisgIC0tIHJlc3VtaW5nIHJ1bm5pbmcgY29yb3V0aW5lCisgIEMgPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICgpCisgICAgICAgIHJldHVybiBULnRlc3RDKFtbCisgICAgICAgICAgICAgICAgIHB1c2hudW0gMTA7CisgICAgICAgICAgICAgICAgIHB1c2hudW0gMjA7CisgICAgICAgICAgICAgICAgIHJlc3VtZSAtMyAyOworICAgICAgICAgICAgICAgICBwdXNoc3RhdHVzCisgICAgICAgICAgICAgICAgIGdldHRvcDsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDNdXSwgQykKKyAgICAgIGVuZCkKKyAgbG9jYWwgYSwgYiwgYywgZCA9IGNvcm91dGluZS5yZXN1bWUoQykKKyAgYXNzZXJ0KGEgPT0gdHJ1ZSBhbmQgc3RyaW5nLmZpbmQoYiwgIm5vbiUtc3VzcGVuZGVkIikgYW5kCisgICAgICAgICBjID09ICJFUlJSVU4iIGFuZCBkID09IDQpCisKKyAgYSwgYiwgYywgZCA9IFQudGVzdEMoW1sKKyAgICByYXdnZXRpIFIgMSAgICAjIGdldCBtYWluIHRocmVhZAorICAgIHB1c2hudW0gMTA7CisgICAgcHVzaG51bSAyMDsKKyAgICByZXN1bWUgLTMgMjsKKyAgICBwdXNoc3RhdHVzCisgICAgZ2V0dG9wOworICAgIHJldHVybiA0XV0pCisgIGFzc2VydChhID09IGNvcm91dGluZS5ydW5uaW5nKCkgYW5kIHN0cmluZy5maW5kKGIsICJub24lLXN1c3BlbmRlZCIpIGFuZAorICAgICAgICAgYyA9PSAiRVJSUlVOIiBhbmQgZCA9PSA0KQorCisKKyAgLS0gdXNpbmcgYSBtYWluIHRocmVhZCBhcyBhIGNvcm91dGluZQorICBsb2NhbCBzdGF0ZSA9IFQubmV3c3RhdGUoKQorICBULmxvYWRsaWIoc3RhdGUpCisKKyAgYXNzZXJ0KFQuZG9yZW1vdGUoc3RhdGUsIFtbCisgICAgY29yb3V0aW5lID0gcmVxdWlyZSdjb3JvdXRpbmUnOworICAgIFggPSBmdW5jdGlvbiAoeCkgY29yb3V0aW5lLnlpZWxkKHgsICdCQicpOyByZXR1cm4gJ0NDJyBlbmQ7CisgICAgcmV0dXJuICdvayddXSkpCisKKyAgdCA9IHRhYmxlLnBhY2soVC50ZXN0QyhzdGF0ZSwgW1sKKyAgICByYXdnZXRpIFIgMSAgICAgIyBnZXQgbWFpbiB0aHJlYWQKKyAgICBwdXNoc3RyaW5nICdYWCcKKyAgICBnZXRnbG9iYWwgWCAgICAjIGdldCBmdW5jdGlvbiBmb3IgYm9keQorICAgIHB1c2hzdHJpbmcgQUEgICAgICAjIGFyZworICAgIHJlc3VtZSAxIDEgICAgICAjICdyZXN1bWUnIHNoYWRvd3MgcHJldmlvdXMgc3RhY2shCisgICAgZ2V0dG9wCisgICAgc2V0Z2xvYmFsIFQgICAgIyB0b3AKKyAgICBzZXRnbG9iYWwgQiAgICAjIHNlY29uZCB5aWVsZGVkIHZhbHVlCisgICAgc2V0Z2xvYmFsIEEgICAgIyBmaXN0IHlpZWxkZWQgdmFsdWUKKyAgICByYXdnZXRpIFIgMSAgICAgIyBnZXQgbWFpbiB0aHJlYWQKKyAgICBwdXNobnVtIDUgICAgICAgIyBhcmcgKG5vaXNlKQorICAgIHJlc3VtZSAxIDEgICAgICAjIGFmdGVyIGNvcm91dGluZSBlbmRzLCBwcmV2aW91cyBzdGFjayBpcyBiYWNrCisgICAgcHVzaHN0YXR1cworICAgIHJldHVybiAqCisgIF1dKSkKKyAgYXNzZXJ0KHQubiA9PSA0IGFuZCB0WzJdID09ICdYWCcgYW5kIHRbM10gPT0gJ0NDJyBhbmQgdFs0XSA9PSAnT0snKQorICBhc3NlcnQoVC5kb3JlbW90ZShzdGF0ZSwgInJldHVybiBUIikgPT0gJzInKQorICBhc3NlcnQoVC5kb3JlbW90ZShzdGF0ZSwgInJldHVybiBBIikgPT0gJ0FBJykKKyAgYXNzZXJ0KFQuZG9yZW1vdGUoc3RhdGUsICJyZXR1cm4gQiIpID09ICdCQicpCisKKyAgVC5jbG9zZXN0YXRlKHN0YXRlKQorCisgIHByaW50JysnCisKK2VuZAorCisKKy0tIGxlYXZpbmcgYSBwZW5kaW5nIGNvcm91dGluZSBvcGVuCitfWCA9IGNvcm91dGluZS53cmFwKGZ1bmN0aW9uICgpCisgICAgICBsb2NhbCBhID0gMTAKKyAgICAgIGxvY2FsIHggPSBmdW5jdGlvbiAoKSBhID0gYSsxIGVuZAorICAgICAgY29yb3V0aW5lLnlpZWxkKCkKKyAgICBlbmQpCisKK19YKCkKKworCitpZiBub3QgX3NvZnQgdGhlbgorICAtLSBidWcgKHN0YWNrIG92ZXJmbG93KQorICBsb2NhbCBqID0gMl45CisgIGxvY2FsIGxpbSA9IDEwMDAwMDAgICAgLS0gKEMgc3RhY2sgbGltaXQ7IGFzc3VtZSAzMi1iaXQgbWFjaGluZSkKKyAgbG9jYWwgdCA9IHtsaW0gLSAxMCwgbGltIC0gNSwgbGltIC0gMSwgbGltLCBsaW0gKyAxfQorICBmb3IgaSA9IDEsICN0IGRvCisgICAgbG9jYWwgaiA9IHRbaV0KKyAgICBjbyA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24oKQorICAgICAgICAgICBsb2NhbCB0ID0ge30KKyAgICAgICAgICAgZm9yIGkgPSAxLCBqIGRvIHRbaV0gPSBpIGVuZAorICAgICAgICAgICByZXR1cm4gdGFibGUudW5wYWNrKHQpCisgICAgICAgICBlbmQpCisgICAgbG9jYWwgciwgbXNnID0gY29yb3V0aW5lLnJlc3VtZShjbykKKyAgICBhc3NlcnQobm90IHIpCisgIGVuZAorICBjbyA9IG5pbAorZW5kCisKKworYXNzZXJ0KGNvcm91dGluZS5ydW5uaW5nKCkgPT0gbWFpbikKKworcHJpbnQiKyIKKworCitwcmludCJ0ZXN0aW5nIHlpZWxkcyBpbnNpZGUgbWV0YW1ldGhvZHMiCisKK2xvY2FsIGZ1bmN0aW9uIHZhbCh4KQorICBpZiB0eXBlKHgpID09ICJ0YWJsZSIgdGhlbiByZXR1cm4geC54IGVsc2UgcmV0dXJuIHggZW5kCitlbmQKKworbG9jYWwgbXQgPSB7CisgIF9fZXEgPSBmdW5jdGlvbihhLGIpIGNvcm91dGluZS55aWVsZChuaWwsICJlcSIpOyByZXR1cm4gdmFsKGEpID09IHZhbChiKSBlbmQsCisgIF9fbHQgPSBmdW5jdGlvbihhLGIpIGNvcm91dGluZS55aWVsZChuaWwsICJsdCIpOyByZXR1cm4gdmFsKGEpIDwgdmFsKGIpIGVuZCwKKyAgX19sZSA9IGZ1bmN0aW9uKGEsYikgY29yb3V0aW5lLnlpZWxkKG5pbCwgImxlIik7IHJldHVybiBhIC0gYiA8PSAwIGVuZCwKKyAgX19hZGQgPSBmdW5jdGlvbihhLGIpIGNvcm91dGluZS55aWVsZChuaWwsICJhZGQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwoYSkgKyB2YWwoYikgZW5kLAorICBfX3N1YiA9IGZ1bmN0aW9uKGEsYikgY29yb3V0aW5lLnlpZWxkKG5pbCwgInN1YiIpOyByZXR1cm4gdmFsKGEpIC0gdmFsKGIpIGVuZCwKKyAgX19tdWwgPSBmdW5jdGlvbihhLGIpIGNvcm91dGluZS55aWVsZChuaWwsICJtdWwiKTsgcmV0dXJuIHZhbChhKSAqIHZhbChiKSBlbmQsCisgIF9fZGl2ID0gZnVuY3Rpb24oYSxiKSBjb3JvdXRpbmUueWllbGQobmlsLCAiZGl2Iik7IHJldHVybiB2YWwoYSkgLyB2YWwoYikgZW5kLAorICBfX2lkaXYgPSBmdW5jdGlvbihhLGIpIGNvcm91dGluZS55aWVsZChuaWwsICJpZGl2Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbChhKSAvLyB2YWwoYikgZW5kLAorICBfX3BvdyA9IGZ1bmN0aW9uKGEsYikgY29yb3V0aW5lLnlpZWxkKG5pbCwgInBvdyIpOyByZXR1cm4gdmFsKGEpIF4gdmFsKGIpIGVuZCwKKyAgX19tb2QgPSBmdW5jdGlvbihhLGIpIGNvcm91dGluZS55aWVsZChuaWwsICJtb2QiKTsgcmV0dXJuIHZhbChhKSAlIHZhbChiKSBlbmQsCisgIF9fdW5tID0gZnVuY3Rpb24oYSxiKSBjb3JvdXRpbmUueWllbGQobmlsLCAidW5tIik7IHJldHVybiAtdmFsKGEpIGVuZCwKKyAgX19ibm90ID0gZnVuY3Rpb24oYSxiKSBjb3JvdXRpbmUueWllbGQobmlsLCAiYm5vdCIpOyByZXR1cm4gfnZhbChhKSBlbmQsCisgIF9fc2hsID0gZnVuY3Rpb24oYSxiKSBjb3JvdXRpbmUueWllbGQobmlsLCAic2hsIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsKGEpIDw8IHZhbChiKSBlbmQsCisgIF9fc2hyID0gZnVuY3Rpb24oYSxiKSBjb3JvdXRpbmUueWllbGQobmlsLCAic2hyIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsKGEpID4+IHZhbChiKSBlbmQsCisgIF9fYmFuZCA9IGZ1bmN0aW9uKGEsYikKKyAgICAgICAgICAgICBjb3JvdXRpbmUueWllbGQobmlsLCAiYmFuZCIpCisgICAgICAgICAgICAgcmV0dXJuIHZhbChhKSAmIHZhbChiKQorICAgICAgICAgICBlbmQsCisgIF9fYm9yID0gZnVuY3Rpb24oYSxiKSBjb3JvdXRpbmUueWllbGQobmlsLCAiYm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsKGEpIHwgdmFsKGIpIGVuZCwKKyAgX19ieG9yID0gZnVuY3Rpb24oYSxiKSBjb3JvdXRpbmUueWllbGQobmlsLCAiYnhvciIpOworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwoYSkgfiB2YWwoYikgZW5kLAorCisgIF9fY29uY2F0ID0gZnVuY3Rpb24oYSxiKQorICAgICAgICAgICAgICAgY29yb3V0aW5lLnlpZWxkKG5pbCwgImNvbmNhdCIpOworICAgICAgICAgICAgICAgcmV0dXJuIHZhbChhKSAuLiB2YWwoYikKKyAgICAgICAgICAgICBlbmQsCisgIF9faW5kZXggPSBmdW5jdGlvbiAodCxrKSBjb3JvdXRpbmUueWllbGQobmlsLCAiaWR4Iik7IHJldHVybiB0Lmtba10gZW5kLAorICBfX25ld2luZGV4ID0gZnVuY3Rpb24gKHQsayx2KSBjb3JvdXRpbmUueWllbGQobmlsLCAibmlkeCIpOyB0Lmtba10gPSB2IGVuZCwKK30KKworCitsb2NhbCBmdW5jdGlvbiBuZXcgKHgpCisgIHJldHVybiBzZXRtZXRhdGFibGUoe3ggPSB4LCBrID0ge319LCBtdCkKK2VuZAorCisKK2xvY2FsIGEgPSBuZXcoMTApCitsb2NhbCBiID0gbmV3KDEyKQorbG9jYWwgYyA9IG5ldyJoZWxsbyIKKworbG9jYWwgZnVuY3Rpb24gcnVuIChmLCB0KQorICBsb2NhbCBpID0gMQorICBsb2NhbCBjID0gY29yb3V0aW5lLndyYXAoZikKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGxvY2FsIHJlcywgc3RhdCA9IGMoKQorICAgIGlmIHJlcyB0aGVuIGFzc2VydCh0W2ldID09IHVuZGVmKTsgcmV0dXJuIHJlcywgdCBlbmQKKyAgICBhc3NlcnQoc3RhdCA9PSB0W2ldKQorICAgIGkgPSBpICsgMQorICBlbmQKK2VuZAorCisKK2Fzc2VydChydW4oZnVuY3Rpb24gKCkgaWYgKGE+PWIpIHRoZW4gcmV0dXJuICc+PScgZWxzZSByZXR1cm4gJzwnIGVuZCBlbmQsCisgICAgICAgeyJsZSIsICJzdWIifSkgPT0gIjwiKQorLS0gJzw9JyB1c2luZyAnPCcKK210Ll9fbGUgPSBuaWwKK2Fzc2VydChydW4oZnVuY3Rpb24gKCkgaWYgKGE8PWIpIHRoZW4gcmV0dXJuICc8PScgZWxzZSByZXR1cm4gJz4nIGVuZCBlbmQsCisgICAgICAgeyJsdCJ9KSA9PSAiPD0iKQorYXNzZXJ0KHJ1bihmdW5jdGlvbiAoKSBpZiAoYT09YikgdGhlbiByZXR1cm4gJz09JyBlbHNlIHJldHVybiAnfj0nIGVuZCBlbmQsCisgICAgICAgeyJlcSJ9KSA9PSAifj0iKQorCithc3NlcnQocnVuKGZ1bmN0aW9uICgpIHJldHVybiBhICYgYiArIGEgZW5kLCB7ImFkZCIsICJiYW5kIn0pID09IDIpCisKK2Fzc2VydChydW4oZnVuY3Rpb24gKCkgcmV0dXJuIDEgKyBhIGVuZCwgeyJhZGQifSkgPT0gMTEpCithc3NlcnQocnVuKGZ1bmN0aW9uICgpIHJldHVybiBhIC0gMjUgZW5kLCB7InN1YiJ9KSA9PSAtMTUpCithc3NlcnQocnVuKGZ1bmN0aW9uICgpIHJldHVybiAyICogYSBlbmQsIHsibXVsIn0pID09IDIwKQorYXNzZXJ0KHJ1bihmdW5jdGlvbiAoKSByZXR1cm4gYSBeIDIgZW5kLCB7InBvdyJ9KSA9PSAxMDApCithc3NlcnQocnVuKGZ1bmN0aW9uICgpIHJldHVybiBhIC8gMiBlbmQsIHsiZGl2In0pID09IDUpCithc3NlcnQocnVuKGZ1bmN0aW9uICgpIHJldHVybiBhICUgNiBlbmQsIHsibW9kIn0pID09IDQpCithc3NlcnQocnVuKGZ1bmN0aW9uICgpIHJldHVybiBhIC8vIDMgZW5kLCB7ImlkaXYifSkgPT0gMykKKworYXNzZXJ0KHJ1bihmdW5jdGlvbiAoKSByZXR1cm4gYSArIGIgZW5kLCB7ImFkZCJ9KSA9PSAyMikKK2Fzc2VydChydW4oZnVuY3Rpb24gKCkgcmV0dXJuIGEgLSBiIGVuZCwgeyJzdWIifSkgPT0gLTIpCithc3NlcnQocnVuKGZ1bmN0aW9uICgpIHJldHVybiBhICogYiBlbmQsIHsibXVsIn0pID09IDEyMCkKK2Fzc2VydChydW4oZnVuY3Rpb24gKCkgcmV0dXJuIGEgXiBiIGVuZCwgeyJwb3cifSkgPT0gMTBeMTIpCithc3NlcnQocnVuKGZ1bmN0aW9uICgpIHJldHVybiBhIC8gYiBlbmQsIHsiZGl2In0pID09IDEwLzEyKQorYXNzZXJ0KHJ1bihmdW5jdGlvbiAoKSByZXR1cm4gYSAlIGIgZW5kLCB7Im1vZCJ9KSA9PSAxMCkKK2Fzc2VydChydW4oZnVuY3Rpb24gKCkgcmV0dXJuIGEgLy8gYiBlbmQsIHsiaWRpdiJ9KSA9PSAwKQorCisKK2Fzc2VydChydW4oZnVuY3Rpb24gKCkgcmV0dXJuIGEgJSBiIGVuZCwgeyJtb2QifSkgPT0gMTApCisKK2Fzc2VydChydW4oZnVuY3Rpb24gKCkgcmV0dXJuIH5hICYgYiBlbmQsIHsiYm5vdCIsICJiYW5kIn0pID09IH4xMCAmIDEyKQorYXNzZXJ0KHJ1bihmdW5jdGlvbiAoKSByZXR1cm4gYSB8IGIgZW5kLCB7ImJvciJ9KSA9PSAxMCB8IDEyKQorYXNzZXJ0KHJ1bihmdW5jdGlvbiAoKSByZXR1cm4gYSB+IGIgZW5kLCB7ImJ4b3IifSkgPT0gMTAgfiAxMikKK2Fzc2VydChydW4oZnVuY3Rpb24gKCkgcmV0dXJuIGEgPDwgYiBlbmQsIHsic2hsIn0pID09IDEwIDw8IDEyKQorYXNzZXJ0KHJ1bihmdW5jdGlvbiAoKSByZXR1cm4gYSA+PiBiIGVuZCwgeyJzaHIifSkgPT0gMTAgPj4gMTIpCisKK2Fzc2VydChydW4oZnVuY3Rpb24gKCkgcmV0dXJuIDEwICYgYiBlbmQsIHsiYmFuZCJ9KSA9PSAxMCAmIDEyKQorYXNzZXJ0KHJ1bihmdW5jdGlvbiAoKSByZXR1cm4gYSB8IDIgZW5kLCB7ImJvciJ9KSA9PSAxMCB8IDIpCithc3NlcnQocnVuKGZ1bmN0aW9uICgpIHJldHVybiBhIH4gMiBlbmQsIHsiYnhvciJ9KSA9PSAxMCB+IDIpCisKK2Fzc2VydChydW4oZnVuY3Rpb24gKCkgcmV0dXJuIGEuLmIgZW5kLCB7ImNvbmNhdCJ9KSA9PSAiMTAxMiIpCisKK2Fzc2VydChydW4oZnVuY3Rpb24oKSByZXR1cm4gYSAuLiBiIC4uIGMgLi4gYSBlbmQsCisgICAgICAgeyJjb25jYXQiLCAiY29uY2F0IiwgImNvbmNhdCJ9KSA9PSAiMTAxMmhlbGxvMTAiKQorCithc3NlcnQocnVuKGZ1bmN0aW9uKCkgcmV0dXJuICJhIiAuLiAiYiIgLi4gYSAuLiAiYyIgLi4gYyAuLiBiIC4uICJ4IiBlbmQsCisgICAgICAgeyJjb25jYXQiLCAiY29uY2F0IiwgImNvbmNhdCJ9KSA9PSAiYWIxMGNoZWxsbzEyeCIpCisKKworZG8gICAtLSBhIGZldyBtb3JlIHRlc3RzIGZvciBjb21wYXJzaW9uIG9wZXJhdG9ycworICBsb2NhbCBtdDEgPSB7CisgICAgX19sZSA9IGZ1bmN0aW9uIChhLGIpCisgICAgICBjb3JvdXRpbmUueWllbGQoMTApCisgICAgICByZXR1cm4gKHZhbChhKSA8PSB2YWwoYikpCisgICAgZW5kLAorICAgIF9fbHQgPSBmdW5jdGlvbiAoYSxiKQorICAgICAgY29yb3V0aW5lLnlpZWxkKDEwKQorICAgICAgcmV0dXJuIHZhbChhKSA8IHZhbChiKQorICAgIGVuZCwKKyAgfQorICBsb2NhbCBtdDIgPSB7IF9fbHQgPSBtdDEuX19sdCB9ICAgLS0gbm8gX19sZQorCisgIGxvY2FsIGZ1bmN0aW9uIHJ1biAoZikKKyAgICBsb2NhbCBjbyA9IGNvcm91dGluZS53cmFwKGYpCisgICAgbG9jYWwgcmVzCisgICAgcmVwZWF0CisgICAgICByZXMgPSBjbygpCisgICAgdW50aWwgcmVzIH49IDEwCisgICAgcmV0dXJuIHJlcworICBlbmQKKyAgCisgIGxvY2FsIGZ1bmN0aW9uIHRlc3QgKCkKKyAgICBsb2NhbCBhMSA9IHNldG1ldGF0YWJsZSh7eD0xfSwgbXQxKQorICAgIGxvY2FsIGEyID0gc2V0bWV0YXRhYmxlKHt4PTJ9LCBtdDIpCisgICAgYXNzZXJ0KGExIDwgYTIpCisgICAgYXNzZXJ0KGExIDw9IGEyKQorICAgIGFzc2VydCgxIDwgYTIpCisgICAgYXNzZXJ0KDEgPD0gYTIpCisgICAgYXNzZXJ0KDIgPiBhMSkKKyAgICBhc3NlcnQoMiA+PSBhMikKKyAgICByZXR1cm4gdHJ1ZQorICBlbmQKKyAgCisgIHJ1bih0ZXN0KQorCitlbmQKKworYXNzZXJ0KHJ1bihmdW5jdGlvbiAoKQorICAgICAgICAgICAgIGEuQkIgPSBwcmludAorICAgICAgICAgICAgIHJldHVybiBhLkJCCisgICAgICAgICAgIGVuZCwgeyJuaWR4IiwgImlkeCJ9KSA9PSBwcmludCkKKworLS0gZ2V0dXB0YWJsZSAmIHNldHVwdGFibGUKK2RvIGxvY2FsIF9FTlYgPSBfRU5WCisgIGYgPSBmdW5jdGlvbiAoKSBBQUEgPSBCQkIgKyAxOyByZXR1cm4gQUFBIGVuZAorZW5kCitnID0gbmV3KDEwKTsgZy5rLkJCQiA9IDEwOworZGVidWcuc2V0dXB2YWx1ZShmLCAxLCBnKQorYXNzZXJ0KHJ1bihmLCB7ImlkeCIsICJuaWR4IiwgImlkeCJ9KSA9PSAxMSkKK2Fzc2VydChnLmsuQUFBID09IDExKQorCitwcmludCIrIgorCitwcmludCJ0ZXN0aW5nIHlpZWxkcyBpbnNpZGUgJ2ZvcicgaXRlcmF0b3JzIgorCitsb2NhbCBmID0gZnVuY3Rpb24gKHMsIGkpCisgICAgICBpZiBpJTIgPT0gMCB0aGVuIGNvcm91dGluZS55aWVsZChuaWwsICJmb3IiKSBlbmQKKyAgICAgIGlmIGkgPCBzIHRoZW4gcmV0dXJuIGkgKyAxIGVuZAorICAgIGVuZAorCithc3NlcnQocnVuKGZ1bmN0aW9uICgpCisgICAgICAgICAgICAgbG9jYWwgcyA9IDAKKyAgICAgICAgICAgICBmb3IgaSBpbiBmLCA0LCAwIGRvIHMgPSBzICsgaSBlbmQKKyAgICAgICAgICAgICByZXR1cm4gcworICAgICAgICAgICBlbmQsIHsiZm9yIiwgImZvciIsICJmb3IifSkgPT0gMTApCisKKworCistLSB0ZXN0cyBmb3IgY29yb3V0aW5lIEFQSQoraWYgVD09bmlsIHRoZW4KKyAgKE1lc3NhZ2Ugb3IgcHJpbnQpKCdcbiA+Pj4gdGVzdEMgbm90IGFjdGl2ZTogc2tpcHBpbmcgY29yb3V0aW5lIEFQSSB0ZXN0cyA8PDxcbicpCisgIHJldHVybgorZW5kCisKK3ByaW50KCd0ZXN0aW5nIGNvcm91dGluZSBBUEknKQorCitsb2NhbCBmdW5jdGlvbiBhcGljbyAoLi4uKQorICBsb2NhbCB4ID0gey4uLn0KKyAgcmV0dXJuIGNvcm91dGluZS53cmFwKGZ1bmN0aW9uICgpCisgICAgcmV0dXJuIFQudGVzdEModGFibGUudW5wYWNrKHgpKQorICBlbmQpCitlbmQKKworbG9jYWwgYSA9IHthcGljbygKK1tbCisgIHB1c2hzdHJpbmcgZXJyb3Jjb2RlCisgIHBjYWxsayAxIDAgMjsKKyAgaW52YWxpZCBjb21tYW5kIChzaG91bGQgbm90IGFycml2ZSBoZXJlKQorXV0sCitbW3JldHVybiAqXV0sCisic3RhY2ttYXJrIiwKK2Vycm9yCispKCl9Cithc3NlcnQoI2EgPT0gNCBhbmQKKyAgICAgICBhWzNdID09ICJzdGFja21hcmsiIGFuZAorICAgICAgIGFbNF0gPT0gImVycm9yY29kZSIgYW5kCisgICAgICAgX0cuc3RhdHVzID09ICJFUlJSVU4iIGFuZAorICAgICAgIF9HLmN0eCA9PSAyKSAgICAgICAtLSAnY3R4JyB0byBwY2FsbGsKKworbG9jYWwgY28gPSBhcGljbygKKyAgInB1c2h2YWx1ZSAyOyBwdXNobnVtIDEwOyBwY2FsbGsgMSAyIDM7IGludmFsaWQgY29tbWFuZDsiLAorICBjb3JvdXRpbmUueWllbGQsCisgICJnZXRnbG9iYWwgc3RhdHVzOyBnZXRnbG9iYWwgY3R4OyBwdXNodmFsdWUgMjsgcHVzaHN0cmluZyBhOyBwY2FsbGsgMSAwIDQ7IGludmFsaWQgY29tbWFuZCIsCisgICJnZXRnbG9iYWwgc3RhdHVzOyBnZXRnbG9iYWwgY3R4OyByZXR1cm4gKiIpCisKK2Fzc2VydChjbygpID09IDEwKQorYXNzZXJ0KGNvKDIwLCAzMCkgPT0gJ2EnKQorYSA9IHtjbygpfQorYXNzZXJ0KCNhID09IDEwIGFuZAorICAgICAgIGFbMl0gPT0gY29yb3V0aW5lLnlpZWxkIGFuZAorICAgICAgIGFbNV0gPT0gMjAgYW5kIGFbNl0gPT0gMzAgYW5kCisgICAgICAgYVs3XSA9PSAiWUlFTEQiIGFuZCBhWzhdID09IDMgYW5kCisgICAgICAgYVs5XSA9PSAiWUlFTEQiIGFuZCBhWzEwXSA9PSA0KQorYXNzZXJ0KG5vdCBwY2FsbChjbykpICAgLS0gY29yb3V0aW5lIGlzIGRlYWQgbm93CisKKworZiA9IFQubWFrZUNmdW5jKCJwdXNobnVtIDM7IHB1c2hudW0gNTsgeWllbGQgMTsiKQorY28gPSBjb3JvdXRpbmUud3JhcChmdW5jdGlvbiAoKQorICBhc3NlcnQoZigpID09IDIzKTsgYXNzZXJ0KGYoKSA9PSAyMyk7IHJldHVybiAxMAorZW5kKQorYXNzZXJ0KGNvKDIzLDE2KSA9PSA1KQorYXNzZXJ0KGNvKDIzLDE2KSA9PSA1KQorYXNzZXJ0KGNvKDIzLDE2KSA9PSAxMCkKKworCistLSB0ZXN0aW5nIGNvcm91dGluZXMgd2l0aCBDIGJvZGllcworZiA9IFQubWFrZUNmdW5jKFtbCisgICAgICAgIHB1c2hudW0gMTAyCisJeWllbGRrCTEgVTIKKwljYW5ub3QgYmUgaGVyZSEKK11dLAorW1sgICAgICAjIGNvbnRpbnVhdGlvbgorCXB1c2h2YWx1ZSBVMyAgICMgYWNjZXNzaW5nIHVwdmFsdWVzIGluc2lkZSBhIGNvbnRpbnVhdGlvbgorICAgICAgICBwdXNodmFsdWUgVTQKKwlyZXR1cm4gKgorXV0sIDIzLCAiaHV1IikKKworeCA9IGNvcm91dGluZS53cmFwKGYpCithc3NlcnQoeCgpID09IDEwMikKK2VxdGFiKHt4KCl9LCB7MjMsICJodXUifSkKKworCitmID0gVC5tYWtlQ2Z1bmNbW3B1c2hzdHJpbmcgJ2EnOyBwdXNobnVtIDEwMjsgeWllbGQgMjsgXV0KKworYSwgYiwgYywgZCA9IFQudGVzdEMoW1tuZXd0aHJlYWQ7IHB1c2h2YWx1ZSAyOyB4bW92ZSAwIDMgMTsgcmVzdW1lIDMgMDsKKyAgICAgICAgICAgICAgICAgICAgICAgcHVzaHN0YXR1czsgeG1vdmUgMyAwIDA7ICByZXN1bWUgMyAwOyBwdXNoc3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsgXV0sIGYpCisKK2Fzc2VydChhID09ICdZSUVMRCcgYW5kIGIgPT0gJ2EnIGFuZCBjID09IDEwMiBhbmQgZCA9PSAnT0snKQorCisKKy0tIHRlc3RpbmcgY2hhaW4gb2Ygc3VzcGVuZGFibGUgQyBjYWxscworCitsb2NhbCBjb3VudCA9IDMgICAtLSBudW1iZXIgb2YgbGV2ZWxzCisKK2YgPSBULm1ha2VDZnVuYyhbWworICByZW1vdmUgMTsgICAgICAgICAgICAgIyByZW1vdmUgYXJndW1lbnQKKyAgcHVzaHZhbHVlIFUzOyAgICAgICAgICMgZ2V0IHNlbGVjdGlvbiBmdW5jdGlvbgorICBjYWxsIDAgMTsgICAgICAgICAgICAgIyBjYWxsIGl0ICAocmVzdWx0IGlzICdmJyBvciAneWllbGQnKQorICBwdXNoc3RyaW5nIGhlbGxvICAgICAgIyBzaW5nbGUgYXJndW1lbnQgZm9yIHNlbGVjdGVkIGZ1bmN0aW9uCisgIHB1c2h1cHZhbHVlaW5kZXggMjsgICAjIGluZGV4IG9mIGNvbnRpbnVhdGlvbiBwcm9ncmFtCisgIGNhbGxrIDEgLTEgLjsJCSMgY2FsbCBzZWxlY3RlZCBmdW5jdGlvbgorICBlcnJvcmVycm9yCQkjIHNob3VsZCBuZXZlciBhcnJpdmUgaGVyZQorXV0sCitbWworICAjIGNvbnRpbnVhdGlvbiBwcm9ncmFtCisgIHB1c2hudW0gMzQJIyByZXR1cm4gdmFsdWUKKyAgcmV0dXJuICogICAgICMgcmV0dXJuIGFsbCByZXN1bHRzCitdXSwKK2Z1bmN0aW9uICgpICAgICAtLSBzZWxlY3Rpb24gZnVuY3Rpb24KKyAgY291bnQgPSBjb3VudCAtIDEKKyAgaWYgY291bnQgPT0gMCB0aGVuIHJldHVybiBjb3JvdXRpbmUueWllbGQKKyAgZWxzZSByZXR1cm4gZgorICBlbmQKK2VuZAorKQorCitjbyA9IGNvcm91dGluZS53cmFwKGZ1bmN0aW9uICgpIHJldHVybiBmKG5pbCkgZW5kKQorYXNzZXJ0KGNvKCkgPT0gImhlbGxvIikgICAtLSBhcmd1bWVudCB0byAneWllbGQnCithID0ge2NvKCl9CistLSB0aHJlZSAnMzQncyAob25lIGZyb20gZWFjaCBwZW5kaW5nIEMgY2FsbCkKK2Fzc2VydCgjYSA9PSAzIGFuZCBhWzFdID09IGFbMl0gYW5kIGFbMl0gPT0gYVszXSBhbmQgYVszXSA9PSAzNCkKKworCistLSB0ZXN0aW5nIHlpZWxkcyB3aXRoIGNvbnRpbnVhdGlvbnMKKworY28gPSBjb3JvdXRpbmUud3JhcChmdW5jdGlvbiAoLi4uKSByZXR1cm4KKyAgICAgICBULnRlc3RDKFtbICMgaW5pdGlhbCBmdW5jdGlvbgorICAgICAgICAgIHlpZWxkayAxIDIKKyAgICAgICAgICBjYW5ub3QgYmUgaGVyZSEKKyAgICAgICBdXSwKKyAgICAgICBbWyAgIyAxc3QgY29udGludWF0aW9uCisgICAgICAgICB5aWVsZGsgMCAzIAorICAgICAgICAgY2Fubm90IGJlIGhlcmUhCisgICAgICAgXV0sCisgICAgICAgW1sgICMgMm5kIGNvbnRpbnVhdGlvbgorICAgICAgICAgeWllbGRrIDAgNCAKKyAgICAgICAgIGNhbm5vdCBiZSBoZXJlIQorICAgICAgIF1dLAorICAgICAgIFtbICAjIDN0aCBjb250aW51YXRpb24KKyAgICAgICAgICBwdXNodmFsdWUgNiAgICMgZnVuY3Rpb24gd2hpY2ggaXMgbGFzdCBhcmcuIHRvICd0ZXN0QycgaGVyZQorICAgICAgICAgIHB1c2hudW0gMTA7IHB1c2hudW0gMjA7CisgICAgICAgICAgcGNhbGwgMiAwIDAgICAjIGNhbGwgc2hvdWxkIHRocm93IGFuIGVycm9yIGFuZCByZXR1cm4gdG8gbmV4dCBsaW5lCisgICAgICAgICAgcG9wIDEJCSMgcmVtb3ZlIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgICBwdXNodmFsdWUgNgorICAgICAgICAgIGdldGdsb2JhbCBzdGF0dXM7IGdldGdsb2JhbCBjdHgKKyAgICAgICAgICBwY2FsbGsgMiAyIDUgICMgY2FsbCBzaG91bGQgdGhyb3cgYW4gZXJyb3IgYW5kIGp1bXAgdG8gY29udGludWF0aW9uCisgICAgICAgICAgY2Fubm90IGJlIGhlcmUhCisgICAgICAgXV0sCisgICAgICAgW1sgICMgNHRoIChhbmQgbGFzdCkgY29udGludWF0aW9uCisgICAgICAgICByZXR1cm4gKgorICAgICAgIF1dLAorICAgICAgIC0tIGZ1bmN0aW9uIGNhbGxlZCBieSAzdGggY29udGludWF0aW9uCisgICAgICAgZnVuY3Rpb24gKGEsYikgeD1hOyB5PWI7IGVycm9yKCJlcnJtc2ciKSBlbmQsCisgICAgICAgLi4uCispCitlbmQpCisKK2xvY2FsIGEgPSB7Y28oMyw0LDYpfQorYXNzZXJ0KGFbMV0gPT0gNiBhbmQgYVsyXSA9PSB1bmRlZikKK2EgPSB7Y28oKX07IGFzc2VydChhWzFdID09IHVuZGVmIGFuZCBfRy5zdGF0dXMgPT0gIllJRUxEIiBhbmQgX0cuY3R4ID09IDIpCithID0ge2NvKCl9OyBhc3NlcnQoYVsxXSA9PSB1bmRlZiBhbmQgX0cuc3RhdHVzID09ICJZSUVMRCIgYW5kIF9HLmN0eCA9PSAzKQorYSA9IHtjbyg3LDgpfTsKKy0tIG9yaWdpbmFsIGFyZ3VtZW50cworYXNzZXJ0KHR5cGUoYVsxXSkgPT0gJ3N0cmluZycgYW5kIHR5cGUoYVsyXSkgPT0gJ3N0cmluZycgYW5kCisgICAgIHR5cGUoYVszXSkgPT0gJ3N0cmluZycgYW5kIHR5cGUoYVs0XSkgPT0gJ3N0cmluZycgYW5kCisgICAgIHR5cGUoYVs1XSkgPT0gJ3N0cmluZycgYW5kIHR5cGUoYVs2XSkgPT0gJ2Z1bmN0aW9uJykKKy0tIGFyZ3VtZW50cyBsZWZ0IGZyb20gZmlzdCByZXN1bWUKK2Fzc2VydChhWzddID09IDMgYW5kIGFbOF0gPT0gNCkKKy0tIGFyZ3VtZW50cyB0byBsYXN0IHJlc3VtZQorYXNzZXJ0KGFbOV0gPT0gNyBhbmQgYVsxMF0gPT0gOCkKKy0tIGVycm9yIG1lc3NhZ2UgYW5kIG5vdGhpbmcgbW9yZQorYXNzZXJ0KGFbMTFdOmZpbmQoImVycm1zZyIpIGFuZCAjYSA9PSAxMSkKKy0tIGNoZWNrIGFyZ3VtZW50cyB0byBwY2FsbGsKK2Fzc2VydCh4ID09ICJZSUVMRCIgYW5kIHkgPT0gNCkKKworYXNzZXJ0KG5vdCBwY2FsbChjbykpICAgLS0gY29yb3V0aW5lIHNob3VsZCBiZSBkZWFkCisKKworLS0gYnVnIGluIG5DY2FsbHMKK2xvY2FsIGNvID0gY29yb3V0aW5lLndyYXAoZnVuY3Rpb24gKCkKKyAgbG9jYWwgYSA9IHtwY2FsbChwY2FsbCxwY2FsbCxwY2FsbCxwY2FsbCxwY2FsbCxwY2FsbCxwY2FsbCxlcnJvciwiaGkiKX0KKyAgcmV0dXJuIHBjYWxsKGFzc2VydCwgdGFibGUudW5wYWNrKGEpKQorZW5kKQorCitsb2NhbCBhID0ge2NvKCl9Cithc3NlcnQoYVsxMF0gPT0gImhpIikKKworcHJpbnQnT0snCmRpZmYgLS1naXQgYS90ZXN0ZXMvZGIubHVhIGIvdGVzdGVzL2RiLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQxY2RhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGVzL2RiLmx1YQpAQCAtMCwwICsxLDk0OCBAQAorLS0gJElkOiBkYi5sdWEsdiAxLjkwIDIwMTgvMDQvMDIgMTc6NTU6NTggcm9iZXJ0byBFeHAgJAorLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCisKKy0tIHRlc3RpbmcgZGVidWcgbGlicmFyeQorCitsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUgImRlYnVnIgorCitsb2NhbCBmdW5jdGlvbiBkb3N0cmluZyhzKSByZXR1cm4gYXNzZXJ0KGxvYWQocykpKCkgZW5kCisKK3ByaW50InRlc3RpbmcgZGVidWcgbGlicmFyeSBhbmQgZGVidWcgaW5mb3JtYXRpb24iCisKK2RvCitsb2NhbCBhPTEKK2VuZAorCithc3NlcnQobm90IGRlYnVnLmdldGhvb2soKSkKKworbG9jYWwgdGVzdGxpbmUgPSAxOSAgICAgICAgIC0tIGxpbmUgd2hlcmUgJ3Rlc3QnIGlzIGRlZmluZWQKK2Z1bmN0aW9uIHRlc3QgKHMsIGwsIHApICAgICAtLSB0aGlzIG11c3QgYmUgbGluZSAxOQorICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gYXZvaWQgZ2MgZHVyaW5nIHRyYWNlCisgIGxvY2FsIGZ1bmN0aW9uIGYgKGV2ZW50LCBsaW5lKQorICAgIGFzc2VydChldmVudCA9PSAnbGluZScpCisgICAgbG9jYWwgbCA9IHRhYmxlLnJlbW92ZShsLCAxKQorICAgIGlmIHAgdGhlbiBwcmludChsLCBsaW5lKSBlbmQKKyAgICBhc3NlcnQobCA9PSBsaW5lLCAid3JvbmcgdHJhY2UhISIpCisgIGVuZAorICBkZWJ1Zy5zZXRob29rKGYsImwiKTsgbG9hZChzKSgpOyBkZWJ1Zy5zZXRob29rKCkKKyAgYXNzZXJ0KCNsID09IDApCitlbmQKKworCitkbworICBhc3NlcnQobm90IHBjYWxsKGRlYnVnLmdldGluZm8sIHByaW50LCAiWCIpKSAgIC0tIGludmFsaWQgb3B0aW9uCisgIGFzc2VydChub3QgZGVidWcuZ2V0aW5mbygxMDAwKSkgICAtLSBvdXQgb2YgcmFuZ2UgbGV2ZWwKKyAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRpbmZvKC0xKSkgICAgIC0tIG91dCBvZiByYW5nZSBsZXZlbAorICBsb2NhbCBhID0gZGVidWcuZ2V0aW5mbyhwcmludCkKKyAgYXNzZXJ0KGEud2hhdCA9PSAiQyIgYW5kIGEuc2hvcnRfc3JjID09ICJbQ10iKQorICBhID0gZGVidWcuZ2V0aW5mbyhwcmludCwgIkwiKQorICBhc3NlcnQoYS5hY3RpdmVsaW5lcyA9PSBuaWwpCisgIGxvY2FsIGIgPSBkZWJ1Zy5nZXRpbmZvKHRlc3QsICJTZkwiKQorICBhc3NlcnQoYi5uYW1lID09IG5pbCBhbmQgYi53aGF0ID09ICJMdWEiIGFuZCBiLmxpbmVkZWZpbmVkID09IHRlc3RsaW5lIGFuZAorICAgICAgICAgYi5sYXN0bGluZWRlZmluZWQgPT0gYi5saW5lZGVmaW5lZCArIDEwIGFuZAorICAgICAgICAgYi5mdW5jID09IHRlc3QgYW5kIG5vdCBzdHJpbmcuZmluZChiLnNob3J0X3NyYywgIiVbIikpCisgIGFzc2VydChiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWQgKyAxXSBhbmQKKyAgICAgICAgIGIuYWN0aXZlbGluZXNbYi5sYXN0bGluZWRlZmluZWRdKQorICBhc3NlcnQobm90IGIuYWN0aXZlbGluZXNbYi5saW5lZGVmaW5lZF0gYW5kCisgICAgICAgICBub3QgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZCArIDFdKQorZW5kCisKKworLS0gdGVzdCBmaWxlIGFuZCBzdHJpbmcgbmFtZXMgdHJ1bmNhdGlvbgorYSA9ICJmdW5jdGlvbiBmICgpIGVuZCIKK2xvY2FsIGZ1bmN0aW9uIGRvc3RyaW5nIChzLCB4KSByZXR1cm4gbG9hZChzLCB4KSgpIGVuZAorZG9zdHJpbmcoYSkKK2Fzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSBzdHJpbmcuZm9ybWF0KCdbc3RyaW5nICIlcyJdJywgYSkpCitkb3N0cmluZyhhLi5zdHJpbmcuZm9ybWF0KCI7ICVzXG49MSIsIHN0cmluZy5yZXAoJ3AnLCA0MDApKSkKK2Fzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgJ14lW3N0cmluZyBbXlxuXSolLiUuJS4iJV0kJykpCitkb3N0cmluZyhhLi5zdHJpbmcuZm9ybWF0KCI7ICVzPTEiLCBzdHJpbmcucmVwKCdwJywgNDAwKSkpCithc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICdeJVtzdHJpbmcgW15cbl0qJS4lLiUuIiVdJCcpKQorZG9zdHJpbmcoIlxuIi4uYSkKK2Fzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAnW3N0cmluZyAiLi4uIl0nKQorZG9zdHJpbmcoYSwgIiIpCithc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gJ1tzdHJpbmcgIiJdJykKK2Rvc3RyaW5nKGEsICJAeHV4dSIpCithc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQorZG9zdHJpbmcoYSwgIkAiLi5zdHJpbmcucmVwKCdwJywgMTAwMCkuLid0JykKK2Fzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgIl4lLiUuJS5wKnQkIikpCitkb3N0cmluZyhhLCAiPXh1eHUiKQorYXNzZXJ0KGRlYnVnLmdldGluZm8oZikuc2hvcnRfc3JjID09ICJ4dXh1IikKK2Rvc3RyaW5nKGEsIHN0cmluZy5mb3JtYXQoIj0lcyIsIHN0cmluZy5yZXAoJ3gnLCA1MDApKSkKK2Fzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgIl54KiQiKSkKK2Rvc3RyaW5nKGEsICI9IikKK2Fzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAiIikKK2EgPSBuaWw7IGYgPSBuaWw7CisKKworcmVwZWF0CisgIGxvY2FsIGcgPSB7eCA9IGZ1bmN0aW9uICgpCisgICAgbG9jYWwgYSA9IGRlYnVnLmdldGluZm8oMikKKyAgICBhc3NlcnQoYS5uYW1lID09ICdmJyBhbmQgYS5uYW1ld2hhdCA9PSAnbG9jYWwnKQorICAgIGEgPSBkZWJ1Zy5nZXRpbmZvKDEpCisgICAgYXNzZXJ0KGEubmFtZSA9PSAneCcgYW5kIGEubmFtZXdoYXQgPT0gJ2ZpZWxkJykKKyAgICByZXR1cm4gJ3hpeGknCisgIGVuZH0KKyAgbG9jYWwgZiA9IGZ1bmN0aW9uICgpIHJldHVybiAxKzEgYW5kIChub3QgMSBvciBnLngoKSkgZW5kCisgIGFzc2VydChmKCkgPT0gJ3hpeGknKQorICBnID0gZGVidWcuZ2V0aW5mbyhmKQorICBhc3NlcnQoZy53aGF0ID09ICJMdWEiIGFuZCBnLmZ1bmMgPT0gZiBhbmQgZy5uYW1ld2hhdCA9PSAiIiBhbmQgbm90IGcubmFtZSkKKworICBmdW5jdGlvbiBmICh4LCBuYW1lKSAgIC0tIGxvY2FsIQorICAgIG5hbWUgPSBuYW1lIG9yICdmJworICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDEpCisgICAgYXNzZXJ0KGEubmFtZSA9PSBuYW1lIGFuZCBhLm5hbWV3aGF0ID09ICdsb2NhbCcpCisgICAgcmV0dXJuIHgKKyAgZW5kCisKKyAgLS0gYnJlYWtzIGluIGRpZmZlcmVudCBjb25kaXRpb25zCisgIGlmIDM+NCB0aGVuIGJyZWFrIGVuZDsgZigpCisgIGlmIDM8NCB0aGVuIGE9MSBlbHNlIGJyZWFrIGVuZDsgZigpCisgIHdoaWxlIDEgZG8gbG9jYWwgeD0xMDsgYnJlYWsgZW5kOyBmKCkKKyAgbG9jYWwgYiA9IDEKKyAgaWYgMz40IHRoZW4gcmV0dXJuIG1hdGguc2luKDEpIGVuZDsgZigpCisgIGEgPSAzPDQ7IGYoKQorICBhID0gMzw0IG9yIDE7IGYoKQorICByZXBlYXQgbG9jYWwgeD0yMDsgaWYgND4zIHRoZW4gZigpIGVsc2UgYnJlYWsgZW5kOyBmKCkgdW50aWwgMQorICBnID0ge30KKyAgZihnKS54ID0gZigyKSBhbmQgZigxMCkrZig5KQorICBhc3NlcnQoZy54ID09IGYoMTkpKQorICBmdW5jdGlvbiBnKHgpIGlmIG5vdCB4IHRoZW4gcmV0dXJuIDMgZW5kIHJldHVybiAoeCgnYScsICd4JykpIGVuZAorICBhc3NlcnQoZyhmKSA9PSAnYScpCit1bnRpbCAxCisKK3Rlc3QoW1tpZgorbWF0aC5zaW4oMSkKK3RoZW4KKyAgYT0xCitlbHNlCisgIGE9MgorZW5kCitdXSwgezIsMyw0LDd9KQorCit0ZXN0KFtbLS0KK2lmIG5pbCB0aGVuCisgIGE9MQorZWxzZQorICBhPTIKK2VuZAorXV0sIHsyLDUsNn0pCisKK3Rlc3QoW1thPTEKK3JlcGVhdAorICBhPWErMQordW50aWwgYT09MworXV0sIHsxLDMsNCwzLDR9KQorCit0ZXN0KFtbIGRvCisgIHJldHVybgorZW5kCitdXSwgezJ9KQorCit0ZXN0KFtbbG9jYWwgYQorYT0xCit3aGlsZSBhPD0zIGRvCisgIGE9YSsxCitlbmQKK11dLCB7MSwyLDMsNCwzLDQsMyw0LDMsNX0pCisKK3Rlc3QoW1t3aGlsZSBtYXRoLnNpbigxKSBkbworICBpZiBtYXRoLnNpbigxKQorICB0aGVuIGJyZWFrCisgIGVuZAorZW5kCithPTFdXSwgezEsMiwzLDZ9KQorCit0ZXN0KFtbZm9yIGk9MSwzIGRvCisgIGE9aQorZW5kCitdXSwgezEsMiwxLDIsMSwyLDEsM30pCisKK3Rlc3QoW1tmb3IgaSx2IGluIHBhaXJzeydhJywnYid9IGRvCisgIGE9dG9zdHJpbmcoaSkgLi4gdgorZW5kCitdXSwgezEsMiwxLDIsMSwzfSkKKwordGVzdChbW2ZvciBpPTEsNCBkbyBhPTEgZW5kXV0sIHsxLDEsMSwxLDF9KQorCisKK2RvICAgLS0gdGVzdGluZyBsaW5lIGluZm8vdHJhY2Ugd2l0aCBsYXJnZSBnYXBzIGluIHNvdXJjZQorCisgIGxvY2FsIGEgPSB7MSwgMiwgMywgMTAsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwKKyAgICAgICAgICAgICAyNTUsIDI1NiwgMjU3LCA1MDAsIDEwMDB9CisgIGxvY2FsIHMgPSBbWworICAgICBsb2NhbCBiID0gezEwfQorICAgICBhID0gYlsxXSBYICsgWSBiWzFdCisgICAgIGIgPSA0CisgIF1dCisgIGZvciBfLCBpIGluIGlwYWlycyhhKSBkbworICAgIGxvY2FsIHN1YnMgPSB7WCA9IHN0cmluZy5yZXAoIlxuIiwgaSl9CisgICAgZm9yIF8sIGogaW4gaXBhaXJzKGEpIGRvCisgICAgICBzdWJzLlkgPSBzdHJpbmcucmVwKCJcbiIsIGopCisgICAgICBsb2NhbCBzID0gc3RyaW5nLmdzdWIocywgIltYWV0iLCBzdWJzKQorICAgICAgdGVzdChzLCB7MSwgMiArIGksIDIgKyBpICsgaiwgMiArIGksIDIgKyBpICsgaiwgMyArIGkgKyBqfSkKKyAgICBlbmQKKyAgZW5kCitlbmQKKworcHJpbnQnKycKKworLS0gaW52YWxpZCBsZXZlbHMgaW4gW2dzXWV0bG9jYWwKK2Fzc2VydChub3QgcGNhbGwoZGVidWcuZ2V0bG9jYWwsIDIwLCAxKSkKK2Fzc2VydChub3QgcGNhbGwoZGVidWcuc2V0bG9jYWwsIC0xLCAxLCAxMCkpCisKKworLS0gcGFyYW1ldGVyIG5hbWVzCitsb2NhbCBmdW5jdGlvbiBmb28gKGEsYiwuLi4pIGxvY2FsIGQsIGUgZW5kCitsb2NhbCBjbyA9IGNvcm91dGluZS5jcmVhdGUoZm9vKQorCithc3NlcnQoZGVidWcuZ2V0bG9jYWwoZm9vLCAxKSA9PSAnYScpCithc3NlcnQoZGVidWcuZ2V0bG9jYWwoZm9vLCAyKSA9PSAnYicpCithc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGZvbywgMykpCithc3NlcnQoZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMSkgPT0gJ2EnKQorYXNzZXJ0KGRlYnVnLmdldGxvY2FsKGNvLCBmb28sIDIpID09ICdiJykKK2Fzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMykpCisKK2Fzc2VydChub3QgZGVidWcuZ2V0bG9jYWwocHJpbnQsIDEpKQorCisKK2xvY2FsIGZ1bmN0aW9uIGZvbyAoKSByZXR1cm4gKGRlYnVnLmdldGxvY2FsKDEsIC0xKSkgZW5kCithc3NlcnQobm90IGZvbygxMCkpCisKKworLS0gdmFyYXJncworbG9jYWwgZnVuY3Rpb24gZm9vIChhLCAuLi4pCisgIGxvY2FsIHQgPSB0YWJsZS5wYWNrKC4uLikKKyAgZm9yIGkgPSAxLCB0Lm4gZG8KKyAgICBsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMSwgLWkpCisgICAgYXNzZXJ0KG4gPT0gIigqdmFyYXJnKSIgYW5kIHYgPT0gdFtpXSkKKyAgZW5kCisgIGFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoMSwgLSh0Lm4gKyAxKSkpCisgIGFzc2VydChub3QgZGVidWcuc2V0bG9jYWwoMSwgLSh0Lm4gKyAxKSwgMzApKQorICBpZiB0Lm4gPiAwIHRoZW4KKyAgICAoZnVuY3Rpb24gKHgpCisgICAgICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgLTEsIHgpID09ICIoKnZhcmFyZykiKQorICAgICAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIC10Lm4sIHgpID09ICIoKnZhcmFyZykiKQorICAgICBlbmQpKDQzMCkKKyAgICAgYXNzZXJ0KC4uLiA9PSA0MzApCisgIGVuZAorZW5kCisKK2ZvbygpCitmb28ocHJpbnQpCitmb28oMjAwLCAzLCA0KQorbG9jYWwgYSA9IHt9Citmb3IgaSA9IDEsIChfc29mdCBhbmQgMTAwIG9yIDEwMDApIGRvIGFbaV0gPSBpIGVuZAorZm9vKHRhYmxlLnVucGFjayhhKSkKK2EgPSBuaWwKKworCisKK2RvICAgLS0gdGVzdCBob29rIHByZXNlbmNlIGluIGRlYnVnIGluZm8KKyAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCisgIGxvY2FsIGNvdW50ID0gMAorICBsb2NhbCBmdW5jdGlvbiBmICgpCisgICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSkubmFtZXdoYXQgPT0gImhvb2siKQorICAgIGxvY2FsIHNuZGxpbmUgPSBzdHJpbmcubWF0Y2goZGVidWcudHJhY2ViYWNrKCksICJcbiguLSlcbiIpCisgICAgYXNzZXJ0KHN0cmluZy5maW5kKHNuZGxpbmUsICJob29rIikpCisgICAgY291bnQgPSBjb3VudCArIDEKKyAgZW5kCisgIGRlYnVnLnNldGhvb2soZiwgImwiKQorICBsb2NhbCBhID0gMAorICBfRU5WLmEgPSBhCisgIGEgPSAxCisgIGRlYnVnLnNldGhvb2soKQorICBhc3NlcnQoY291bnQgPT0gNCkKK2VuZAorCisKK2EgPSB7fTsgTCA9IG5pbAorbG9jYWwgZ2xvYiA9IDEKK2xvY2FsIG9sZGdsb2IgPSBnbG9iCitkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlLGwpCisgIGNvbGxlY3RnYXJiYWdlKCkgICAtLSBmb3JjZSBHQyBkdXJpbmcgYSBob29rCisgIGxvY2FsIGYsIG0sIGMgPSBkZWJ1Zy5nZXRob29rKCkKKyAgYXNzZXJ0KG0gPT0gJ2NybCcgYW5kIGMgPT0gMCkKKyAgaWYgZSA9PSAibGluZSIgdGhlbgorICAgIGlmIGdsb2Igfj0gb2xkZ2xvYiB0aGVuCisgICAgICBMID0gbC0xICAgLS0gZ2V0IHRoZSBmaXJzdCBsaW5lIHdoZXJlICJnbG9iIiBoYXMgY2hhbmdlZAorICAgICAgb2xkZ2xvYiA9IGdsb2IKKyAgICBlbmQKKyAgZWxzZWlmIGUgPT0gImNhbGwiIHRoZW4KKyAgICAgIGxvY2FsIGYgPSBkZWJ1Zy5nZXRpbmZvKDIsICJmIikuZnVuYworICAgICAgYVtmXSA9IDEKKyAgZWxzZSBhc3NlcnQoZSA9PSAicmV0dXJuIikKKyAgZW5kCitlbmQsICJjcmwiKQorCisKK2Z1bmN0aW9uIGYoYSxiKQorICBjb2xsZWN0Z2FyYmFnZSgpCisgIGxvY2FsIF8sIHggPSBkZWJ1Zy5nZXRsb2NhbCgxLCAxKQorICBsb2NhbCBfLCB5ID0gZGVidWcuZ2V0bG9jYWwoMSwgMikKKyAgYXNzZXJ0KHggPT0gYSBhbmQgeSA9PSBiKQorICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgMywgInBlcmEiKSA9PSAiQUEiLi4iQUEiKQorICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgNCwgIm1h5+MiKSA9PSAiQiIpCisgIHggPSBkZWJ1Zy5nZXRpbmZvKDIpCisgIGFzc2VydCh4LmZ1bmMgPT0gZyBhbmQgeC53aGF0ID09ICJMdWEiIGFuZCB4Lm5hbWUgPT0gJ2cnIGFuZAorICAgICAgICAgeC5udXBzID09IDIgYW5kIHN0cmluZy5maW5kKHguc291cmNlLCAiXkAuKmRiJS5sdWEkIikpCisgIGdsb2IgPSBnbG9iKzEKKyAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzEpCisgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsyKQorZW5kCisKK2Z1bmN0aW9uIGZvbygpCisgIGdsb2IgPSBnbG9iKzEKKyAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzEpCitlbmQ7IGZvbygpICAtLSBzZXQgTAorLS0gY2hlY2sgbGluZSBjb3VudGluZyBpbnNpZGUgc3RyaW5ncyBhbmQgZW1wdHkgbGluZXMKKworXyA9ICdhbG9cCithbG8nIC4uIFtbCisKK11dCistLVtbCitdXQorYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzExKSAgLS0gY2hlY2sgY291bnQgb2YgbGluZXMKKworCitmdW5jdGlvbiBnICguLi4pCisgIGxvY2FsIGFyZyA9IHsuLi59CisgIGRvIGxvY2FsIGEsYixjOyBhPW1hdGguc2luKDQwKTsgZW5kCisgIGxvY2FsIGZlaWphbworICBsb2NhbCBBQUFBLEIgPSAieHV4dSIsICJtYW3jbyIKKyAgZihBQUFBLEIpCisgIGFzc2VydChBQUFBID09ICJwZXJhIiBhbmQgQiA9PSAibWHn4yIpCisgIGRvCisgICAgIGxvY2FsIEIgPSAxMworICAgICBsb2NhbCB4LHkgPSBkZWJ1Zy5nZXRsb2NhbCgxLDUpCisgICAgIGFzc2VydCh4ID09ICdCJyBhbmQgeSA9PSAxMykKKyAgZW5kCitlbmQKKworZygpCisKKworYXNzZXJ0KGFbZl0gYW5kIGFbZ10gYW5kIGFbYXNzZXJ0XSBhbmQgYVtkZWJ1Zy5nZXRsb2NhbF0gYW5kIG5vdCBhW3ByaW50XSkKKworCistLSB0ZXN0cyBmb3IgbWFuaXB1bGF0aW5nIG5vbi1yZWdpc3RlcmVkIGxvY2FscyAoQyBhbmQgTHVhIHRlbXBvcmFyaWVzKQorCitsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMCwgMSkKK2Fzc2VydCh2ID09IDAgYW5kIG4gPT0gIigqdGVtcG9yYXJ5KSIpCitsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMCwgMikKK2Fzc2VydCh2ID09IDIgYW5kIG4gPT0gIigqdGVtcG9yYXJ5KSIpCithc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDAsIDMpKQorYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgwLCAwKSkKKworZnVuY3Rpb24gZigpCisgIGFzc2VydChzZWxlY3QoMiwgZGVidWcuZ2V0bG9jYWwoMiwzKSkgPT0gMSkKKyAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgyLDQpKQorICBkZWJ1Zy5zZXRsb2NhbCgyLCAzLCAxMCkKKyAgcmV0dXJuIDIwCitlbmQKKworZnVuY3Rpb24gZyhhLGIpIHJldHVybiAoYSsxKSArIGYoKSBlbmQKKworYXNzZXJ0KGcoMCwwKSA9PSAzMCkKKyAKKworZGVidWcuc2V0aG9vayhuaWwpOworYXNzZXJ0KGRlYnVnLmdldGhvb2soKSA9PSBuaWwpCisKKworLS0gbWluaW1hbCB0ZXN0cyBmb3Igc2V0dXNlcnZhbHVlL2dldHVzZXJ2YWx1ZQorZG8KKyAgYXNzZXJ0KGRlYnVnLnNldHVzZXJ2YWx1ZShpby5zdGRpbiwgMTApID09IG5pbCkKKyAgbG9jYWwgYSwgYiA9IGRlYnVnLmdldHVzZXJ2YWx1ZShpby5zdGRpbiwgMTApCisgIGFzc2VydChhID09IG5pbCBhbmQgbm90IGIpCitlbmQKKworLS0gdGVzdGluZyBpdGVyYWN0aW9uIGJldHdlZW4gbXVsdGlwbGUgdmFsdWVzIHggaG9va3MKK2RvCisgIGxvY2FsIGZ1bmN0aW9uIGYoLi4uKSByZXR1cm4gMywgLi4uIGVuZAorICBsb2NhbCBjb3VudCA9IDAKKyAgbG9jYWwgYSA9IHt9CisgIGZvciBpID0gMSwgMTAwIGRvIGFbaV0gPSBpIGVuZAorICBkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uICgpIGNvdW50ID0gY291bnQgKyAxIGVuZCwgIiIsIDEpCisgIGxvY2FsIHQgPSB7dGFibGUudW5wYWNrKGEpfQorICBhc3NlcnQoI3QgPT0gMTAwKQorICB0ID0ge3RhYmxlLnVucGFjayhhLCAxLCAzKX0KKyAgYXNzZXJ0KCN0ID09IDMpCisgIHQgPSB7Zih0YWJsZS51bnBhY2soYSwgMSwgMzApKX0KKyAgYXNzZXJ0KCN0ID09IDMxKQorZW5kCisKKworLS0gdGVzdGluZyBhY2Nlc3MgdG8gZnVuY3Rpb24gYXJndW1lbnRzCisKK2xvY2FsIGZ1bmN0aW9uIGNvbGxlY3Rsb2NhbHMgKGxldmVsKQorICBsb2NhbCB0YWIgPSB7fQorICBmb3IgaSA9IDEsIG1hdGguaHVnZSBkbworICAgIGxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbChsZXZlbCArIDEsIGkpCisgICAgaWYgbm90IChuIGFuZCBzdHJpbmcuZmluZChuLCAiXlthLXpBLVowLTlfXSskIikpIHRoZW4KKyAgICAgICBicmVhayAgIC0tIGNvbnNpZGVyIG9ubHkgcmVhbCB2YXJpYWJsZXMKKyAgICBlbmQKKyAgICB0YWJbbl0gPSB2CisgIGVuZAorICByZXR1cm4gdGFiCitlbmQKKworCitYID0gbmlsCithID0ge30KK2Z1bmN0aW9uIGE6ZiAoYSwgYiwgLi4uKSBsb2NhbCBhcmcgPSB7Li4ufTsgbG9jYWwgYyA9IDEzIGVuZAorZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkKKyAgYXNzZXJ0KGUgPT0gImNhbGwiKQorICBkb3N0cmluZygiWFggPSAxMiIpICAtLSB0ZXN0IGRvc3RyaW5nIGluc2lkZSBob29rcworICAtLSB0ZXN0aW5nIGVycm9ycyBpbnNpZGUgaG9va3MKKyAgYXNzZXJ0KG5vdCBwY2FsbChsb2FkKCJhPSdqb2FvJysxIikpKQorICBkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlLCBsKSAKKyAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyLCAibCIpLmN1cnJlbnRsaW5lID09IGwpCisgICAgbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKKyAgICBhc3NlcnQoZSA9PSAibGluZSIpCisgICAgYXNzZXJ0KG0gPT0gJ2wnIGFuZCBjID09IDApCisgICAgZGVidWcuc2V0aG9vayhuaWwpICAtLSBob29rIGlzIGNhbGxlZCBvbmx5IG9uY2UKKyAgICBhc3NlcnQobm90IFgpICAgICAgIC0tIGNoZWNrIHRoYXQKKyAgICBYID0gY29sbGVjdGxvY2FscygyKQorICBlbmQsICJsIikKK2VuZCwgImMiKQorCithOmYoMSwyLDMsNCw1KQorYXNzZXJ0KFguc2VsZiA9PSBhIGFuZCBYLmEgPT0gMSAgIGFuZCBYLmIgPT0gMiBhbmQgWC5jID09IG5pbCkKK2Fzc2VydChYWCA9PSAxMikKK2Fzc2VydChkZWJ1Zy5nZXRob29rKCkgPT0gbmlsKQorCisKKy0tIHRlc3RpbmcgYWNjZXNzIHRvIGxvY2FsIHZhcmlhYmxlcyBpbiByZXR1cm4gaG9vayAoYnVnIGluIDUuMikKK2RvCisgIGxvY2FsIFggPSBmYWxzZQorCisgIGxvY2FsIGZ1bmN0aW9uIGZvbyAoYSwgYiwgLi4uKQorICAgIGRvIGxvY2FsIHgseSx6IGVuZAorICAgIGxvY2FsIGMsIGQgPSAxMCwgMjAKKyAgICByZXR1cm4KKyAgZW5kCisKKyAgbG9jYWwgZnVuY3Rpb24gYXV4ICgpCisgICAgaWYgZGVidWcuZ2V0aW5mbygyKS5uYW1lID09ICJmb28iIHRoZW4KKyAgICAgIFggPSB0cnVlICAgLS0gdG8gc2lnbmFsIHRoYXQgaXQgZm91bmQgJ2ZvbycKKyAgICAgIGxvY2FsIHRhYiA9IHthID0gMTAwLCBiID0gMjAwLCBjID0gMTAsIGQgPSAyMH0KKyAgICAgIGZvciBuLCB2IGluIHBhaXJzKGNvbGxlY3Rsb2NhbHMoMikpIGRvCisgICAgICAgIGFzc2VydCh0YWJbbl0gPT0gdikKKyAgICAgICAgdGFiW25dID0gdW5kZWYKKyAgICAgIGVuZAorICAgICAgYXNzZXJ0KG5leHQodGFiKSA9PSBuaWwpICAgIC0tICd0YWInIG11c3QgYmUgZW1wdHkKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVidWcuc2V0aG9vayhhdXgsICJyIik7IGZvbygxMDAsIDIwMCk7IGRlYnVnLnNldGhvb2soKQorICBhc3NlcnQoWCkKKworZW5kCisKKworbG9jYWwgZnVuY3Rpb24gZXFzZXEgKHQxLCB0MikKKyAgYXNzZXJ0KCN0MSA9PSAjdDIpCisgIGZvciBpID0gMSwgI3QxIGRvCisgICAgYXNzZXJ0KHQxW2ldID09IHQyW2ldKQorICBlbmQKK2VuZAorCisKK2RvICBwcmludCgidGVzdGluZyBpbnNwZWN0aW9uIG9mIHBhcmFtZXRlcnMvcmV0dXJuZWQgdmFsdWVzIikKKyAgbG9jYWwgb24gPSBmYWxzZQorICBsb2NhbCBpbnAsIG91dAorCisgIGxvY2FsIGZ1bmN0aW9uIGhvb2sgKGV2ZW50KQorICAgIGlmIG5vdCBvbiB0aGVuIHJldHVybiBlbmQKKyAgICBsb2NhbCBhciA9IGRlYnVnLmdldGluZm8oMiwgInJ1UyIpCisgICAgbG9jYWwgdCA9IHt9CisgICAgZm9yIGkgPSBhci5mdHJhbnNmZXIsIGFyLmZ0cmFuc2ZlciArIGFyLm50cmFuc2ZlciAtIDEgZG8KKyAgICAgIGxvY2FsIF8sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgyLCBpKQorICAgICAgdFsjdCArIDFdID0gdiAKKyAgICBlbmQKKyAgICBpZiBldmVudCA9PSAicmV0dXJuIiB0aGVuCisgICAgICBvdXQgPSB0CisgICAgZWxzZQorICAgICAgaW5wID0gdAorICAgIGVuZAorICBlbmQKKworICBkZWJ1Zy5zZXRob29rKGhvb2ssICJjciIpCisKKyAgb24gPSB0cnVlOyBtYXRoLnNpbigzKTsgb24gPSBmYWxzZQorICBlcXNlcShpbnAsIHszfSk7IGVxc2VxKG91dCwge21hdGguc2luKDMpfSkKKworICBvbiA9IHRydWU7IHNlbGVjdCgyLCAxMCwgMjAsIDMwLCA0MCk7IG9uID0gZmFsc2UKKyAgZXFzZXEoaW5wLCB7MiwgMTAsIDIwLCAzMCwgNDB9KTsgZXFzZXEob3V0LCB7MjAsIDMwLCA0MH0pCisKKyAgbG9jYWwgZnVuY3Rpb24gZm9vIChhLCAuLi4pIHJldHVybiAuLi4gZW5kCisgIGxvY2FsIGZ1bmN0aW9uIGZvbzEgKCkgb24gPSBub3Qgb247IHJldHVybiBmb28oMjAsIDEwLCAwKSBlbmQKKyAgZm9vMSgpOyBvbiA9IGZhbHNlCisgIGVxc2VxKGlucCwgezIwfSk7IGVxc2VxKG91dCwgezEwLCAwfSkKKworICBkZWJ1Zy5zZXRob29rKCkKK2VuZAorCisKKworLS0gdGVzdGluZyB1cHZhbHVlIGFjY2VzcworbG9jYWwgZnVuY3Rpb24gZ2V0dXB2YWx1ZXMgKGYpCisgIGxvY2FsIHQgPSB7fQorICBsb2NhbCBpID0gMQorICB3aGlsZSB0cnVlIGRvCisgICAgbG9jYWwgbmFtZSwgdmFsdWUgPSBkZWJ1Zy5nZXR1cHZhbHVlKGYsIGkpCisgICAgaWYgbm90IG5hbWUgdGhlbiBicmVhayBlbmQKKyAgICBhc3NlcnQobm90IHRbbmFtZV0pCisgICAgdFtuYW1lXSA9IHZhbHVlCisgICAgaSA9IGkgKyAxCisgIGVuZAorICByZXR1cm4gdAorZW5kCisKK2xvY2FsIGEsYixjID0gMSwyLDMKK2xvY2FsIGZ1bmN0aW9uIGZvbzEgKGEpIGIgPSBhOyByZXR1cm4gYyBlbmQKK2xvY2FsIGZ1bmN0aW9uIGZvbzIgKHgpIGEgPSB4OyByZXR1cm4gYytiIGVuZAorYXNzZXJ0KG5vdCBkZWJ1Zy5nZXR1cHZhbHVlKGZvbzEsIDMpKQorYXNzZXJ0KG5vdCBkZWJ1Zy5nZXR1cHZhbHVlKGZvbzEsIDApKQorYXNzZXJ0KG5vdCBkZWJ1Zy5zZXR1cHZhbHVlKGZvbzEsIDMsICJ4dXh1IikpCitsb2NhbCB0ID0gZ2V0dXB2YWx1ZXMoZm9vMSkKK2Fzc2VydCh0LmEgPT0gbmlsIGFuZCB0LmIgPT0gMiBhbmQgdC5jID09IDMpCit0ID0gZ2V0dXB2YWx1ZXMoZm9vMikKK2Fzc2VydCh0LmEgPT0gMSBhbmQgdC5iID09IDIgYW5kIHQuYyA9PSAzKQorYXNzZXJ0KGRlYnVnLnNldHVwdmFsdWUoZm9vMSwgMSwgInh1eHUiKSA9PSAiYiIpCithc3NlcnQoKHtkZWJ1Zy5nZXR1cHZhbHVlKGZvbzIsIDMpfSlbMl0gPT0gInh1eHUiKQorLS0gdXB2YWx1ZXMgb2YgQyBmdW5jdGlvbnMgYXJlIGFsbHdheXMgImNhbGxlZCIgIiIgKHRoZSBlbXB0eSBzdHJpbmcpCithc3NlcnQoZGVidWcuZ2V0dXB2YWx1ZShzdHJpbmcuZ21hdGNoKCJ4IiwgIngiKSwgMSkgPT0gIiIpICAKKworCistLSB0ZXN0aW5nIGNvdW50IGhvb2tzCitsb2NhbCBhPTAKK2RlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIGE9YSsxIGVuZCwgIiIsIDEpCithPTA7IGZvciBpPTEsMTAwMCBkbyBlbmQ7IGFzc2VydCgxMDAwIDwgYSBhbmQgYSA8IDEwMTIpCitkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKSBhPWErMSBlbmQsICIiLCA0KQorYT0wOyBmb3IgaT0xLDEwMDAgZG8gZW5kOyBhc3NlcnQoMjUwIDwgYSBhbmQgYSA8IDI1NSkKK2xvY2FsIGYsbSxjID0gZGVidWcuZ2V0aG9vaygpCithc3NlcnQobSA9PSAiIiBhbmQgYyA9PSA0KQorZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgYT1hKzEgZW5kLCAiIiwgNDAwMCkKK2E9MDsgZm9yIGk9MSwxMDAwIGRvIGVuZDsgYXNzZXJ0KGEgPT0gMCkKKworZG8KKyAgZGVidWcuc2V0aG9vayhwcmludCwgIiIsIDJeMjQgLSAxKSAgIC0tIGNvdW50IHVwcGVyYm91bmQKKyAgbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKKyAgYXNzZXJ0KCh7ZGVidWcuZ2V0aG9vaygpfSlbM10gPT0gMl4yNCAtIDEpCitlbmQKKworZGVidWcuc2V0aG9vaygpCisKKworLS0gdGVzdHMgZm9yIHRhaWwgY2FsbHMKK2xvY2FsIGZ1bmN0aW9uIGYgKHgpCisgIGlmIHggdGhlbgorICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJTIikud2hhdCA9PSAiTHVhIikKKyAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAidCIpLmlzdGFpbGNhbGwgPT0gdHJ1ZSkKKyAgICBsb2NhbCB0YWlsID0gZGVidWcuZ2V0aW5mbygyKQorICAgIGFzc2VydCh0YWlsLmZ1bmMgPT0gZzEgYW5kIHRhaWwuaXN0YWlsY2FsbCA9PSB0cnVlKQorICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDMsICJTIikud2hhdCA9PSAibWFpbiIpCisgICAgcHJpbnQiKyIKKyAgICBlbmQKK2VuZAorCitmdW5jdGlvbiBnKHgpIHJldHVybiBmKHgpIGVuZAorCitmdW5jdGlvbiBnMSh4KSBnKHgpIGVuZAorCitsb2NhbCBmdW5jdGlvbiBoICh4KSBsb2NhbCBmPWcxOyByZXR1cm4gZih4KSBlbmQKKworaCh0cnVlKQorCitsb2NhbCBiID0ge30KK2RlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIHRhYmxlLmluc2VydChiLCBlKSBlbmQsICJjciIpCitoKGZhbHNlKQorZGVidWcuc2V0aG9vaygpCitsb2NhbCByZXMgPSB7InJldHVybiIsICAgLS0gZmlyc3QgcmV0dXJuIChmcm9tIHNldGhvb2spCisgICJjYWxsIiwgInRhaWwgY2FsbCIsICJjYWxsIiwgInRhaWwgY2FsbCIsCisgICJyZXR1cm4iLCAicmV0dXJuIiwKKyAgImNhbGwiLCAgICAtLSBsYXN0IGNhbGwgKHRvIHNldGhvb2spCit9Citmb3IgaSA9IDEsICNyZXMgZG8gYXNzZXJ0KHJlc1tpXSA9PSB0YWJsZS5yZW1vdmUoYiwgMSkpIGVuZAorCitiID0gMAorZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkKKyAgICAgICAgICAgICAgICBpZiBlID09ICJ0YWlsIGNhbGwiIHRoZW4KKyAgICAgICAgICAgICAgICAgIGIgPSBiICsgMQorICAgICAgICAgICAgICAgICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMiwgInQiKS5pc3RhaWxjYWxsID09IHRydWUpCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMiwgInQiKS5pc3RhaWxjYWxsID09IGZhbHNlKQorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICBlbmQsICJjIikKK2goZmFsc2UpCitkZWJ1Zy5zZXRob29rKCkKK2Fzc2VydChiID09IDIpICAgLS0gdHdvIHRhaWwgY2FsbHMKKworbGltID0gX3NvZnQgYW5kIDMwMDAgb3IgMzAwMDAKK2xvY2FsIGZ1bmN0aW9uIGZvbyAoeCkKKyAgaWYgeD09MCB0aGVuCisgICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMikud2hhdCA9PSAibWFpbiIpCisgICAgbG9jYWwgaW5mbyA9IGRlYnVnLmdldGluZm8oMSkKKyAgICBhc3NlcnQoaW5mby5pc3RhaWxjYWxsID09IHRydWUgYW5kIGluZm8uZnVuYyA9PSBmb28pCisgIGVsc2UgcmV0dXJuIGZvbyh4LTEpCisgIGVuZAorZW5kCisKK2ZvbyhsaW0pCisKKworcHJpbnQiKyIKKworCistLSB0ZXN0aW5nIGxvY2FsIGZ1bmN0aW9uIGluZm9ybWF0aW9uCitjbyA9IGxvYWRbWworICBsb2NhbCBBID0gZnVuY3Rpb24gKCkKKyAgICByZXR1cm4geAorICBlbmQKKyAgcmV0dXJuCitdXQorCitsb2NhbCBhID0gMAorLS0gJ0EnIHNob3VsZCBiZSB2aXNpYmxlIHRvIGRlYnVnZ2VyIG9ubHkgYWZ0ZXIgaXRzIGNvbXBsZXRlIGRlZmluaXRpb24KK2RlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUsIGwpCisgIGlmIGwgPT0gMyB0aGVuIGEgPSBhICsgMTsgYXNzZXJ0KGRlYnVnLmdldGxvY2FsKDIsIDEpID09ICIoKnRlbXBvcmFyeSkiKQorICBlbHNlaWYgbCA9PSA0IHRoZW4gYSA9IGEgKyAxOyBhc3NlcnQoZGVidWcuZ2V0bG9jYWwoMiwgMSkgPT0gIkEiKQorICBlbmQKK2VuZCwgImwiKQorY28oKSAgLS0gcnVuIGxvY2FsIGZ1bmN0aW9uIGRlZmluaXRpb24KK2RlYnVnLnNldGhvb2soKSAgLS0gdHVybiBvZmYgaG9vaworYXNzZXJ0KGEgPT0gMikgICAtLSBlbnN1cmUgYWxsIHR3byBsaW5lcyB3aGVyZSBob29rZWQKKworLS0gdGVzdGluZyB0cmFjZWJhY2sKKworYXNzZXJ0KGRlYnVnLnRyYWNlYmFjayhwcmludCkgPT0gcHJpbnQpCithc3NlcnQoZGVidWcudHJhY2ViYWNrKHByaW50LCA0KSA9PSBwcmludCkKK2Fzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soImhpIiwgNCksICJeaGlcbiIpKQorYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiKSwgIl5oaVxuIikpCithc3NlcnQobm90IHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiKSwgIidkZWJ1Zy50cmFjZWJhY2snIikpCithc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIsIDApLCAiJ2RlYnVnLnRyYWNlYmFjayciKSkKK2Fzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soKSwgIl5zdGFjayB0cmFjZWJhY2s6XG4iKSkKKworZG8gIC0tIEMtZnVuY3Rpb24gbmFtZXMgaW4gdHJhY2ViYWNrCisgIGxvY2FsIHN0LCBtc2cgPSAoZnVuY3Rpb24gKCkgcmV0dXJuIHBjYWxsIGVuZCkoKShkZWJ1Zy50cmFjZWJhY2spCisgIGFzc2VydChzdCA9PSB0cnVlIGFuZCBzdHJpbmcuZmluZChtc2csICJwY2FsbCIpKQorZW5kCisKKworLS0gdGVzdGluZyBucGFyYW1zLCBudXBzIGUgaXN2YXJhcmcKK2xvY2FsIHQgPSBkZWJ1Zy5nZXRpbmZvKHByaW50LCAidSIpCithc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMCBhbmQgdC5udXBzID09IDApCisKK3QgPSBkZWJ1Zy5nZXRpbmZvKGZ1bmN0aW9uIChhLGIsYykgZW5kLCAidSIpCithc3NlcnQodC5pc3ZhcmFyZyA9PSBmYWxzZSBhbmQgdC5ucGFyYW1zID09IDMgYW5kIHQubnVwcyA9PSAwKQorCit0ID0gZGVidWcuZ2V0aW5mbyhmdW5jdGlvbiAoYSxiLC4uLikgcmV0dXJuIHRbYV0gZW5kLCAidSIpCithc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMiBhbmQgdC5udXBzID09IDEpCisKK3QgPSBkZWJ1Zy5nZXRpbmZvKDEpICAgLS0gbWFpbgorYXNzZXJ0KHQuaXN2YXJhcmcgPT0gdHJ1ZSBhbmQgdC5ucGFyYW1zID09IDAgYW5kIHQubnVwcyA9PSAxIGFuZAorICAgICAgIGRlYnVnLmdldHVwdmFsdWUodC5mdW5jLCAxKSA9PSAiX0VOViIpCisKKworCisKKy0tIHRlc3RpbmcgZGVidWdnaW5nIG9mIGNvcm91dGluZXMKKworbG9jYWwgZnVuY3Rpb24gY2hlY2t0cmFjZWJhY2sgKGNvLCBwLCBsZXZlbCkKKyAgbG9jYWwgdGIgPSBkZWJ1Zy50cmFjZWJhY2soY28sIG5pbCwgbGV2ZWwpCisgIGxvY2FsIGkgPSAwCisgIGZvciBsIGluIHN0cmluZy5nbWF0Y2godGIsICJbXlxuXStcbj8iKSBkbworICAgIGFzc2VydChpID09IDAgb3Igc3RyaW5nLmZpbmQobCwgcFtpXSkpCisgICAgaSA9IGkrMQorICBlbmQKKyAgYXNzZXJ0KHBbaV0gPT0gdW5kZWYpCitlbmQKKworCitsb2NhbCBmdW5jdGlvbiBmIChuKQorICBpZiBuID4gMCB0aGVuIGYobi0xKQorICBlbHNlIGNvcm91dGluZS55aWVsZCgpIGVuZAorZW5kCisKK2xvY2FsIGNvID0gY29yb3V0aW5lLmNyZWF0ZShmKQorY29yb3V0aW5lLnJlc3VtZShjbywgMykKK2NoZWNrdHJhY2ViYWNrKGNvLCB7InlpZWxkIiwgImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSJ9KQorY2hlY2t0cmFjZWJhY2soY28sIHsiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIn0sIDEpCitjaGVja3RyYWNlYmFjayhjbywgeyJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSJ9LCAyKQorY2hlY2t0cmFjZWJhY2soY28sIHsiZGIubHVhIn0sIDQpCitjaGVja3RyYWNlYmFjayhjbywge30sIDQwKQorCisKK2NvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoeCkKKyAgICAgICBsb2NhbCBhID0gMQorICAgICAgIGNvcm91dGluZS55aWVsZChkZWJ1Zy5nZXRpbmZvKDEsICJsIikpCisgICAgICAgY29yb3V0aW5lLnlpZWxkKGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSkKKyAgICAgICByZXR1cm4gYQorICAgICBlbmQpCisKK2xvY2FsIHRyID0ge30KK2xvY2FsIGZvbyA9IGZ1bmN0aW9uIChlLCBsKSBpZiBsIHRoZW4gdGFibGUuaW5zZXJ0KHRyLCBsKSBlbmQgZW5kCitkZWJ1Zy5zZXRob29rKGNvLCBmb28sICJsY3IiKQorCitsb2NhbCBfLCBsID0gY29yb3V0aW5lLnJlc3VtZShjbywgMTApCitsb2NhbCB4ID0gZGVidWcuZ2V0aW5mbyhjbywgMSwgImxmTFMiKQorYXNzZXJ0KHguY3VycmVudGxpbmUgPT0gbC5jdXJyZW50bGluZSBhbmQgeC5hY3RpdmVsaW5lc1t4LmN1cnJlbnRsaW5lXSkKK2Fzc2VydCh0eXBlKHguZnVuYykgPT0gImZ1bmN0aW9uIikKK2ZvciBpPXgubGluZWRlZmluZWQgKyAxLCB4Lmxhc3RsaW5lZGVmaW5lZCBkbworICBhc3NlcnQoeC5hY3RpdmVsaW5lc1tpXSkKKyAgeC5hY3RpdmVsaW5lc1tpXSA9IHVuZGVmCitlbmQKK2Fzc2VydChuZXh0KHguYWN0aXZlbGluZXMpID09IG5pbCkgICAtLSBubyAnZXh0cmEnIGVsZW1lbnRzCithc3NlcnQobm90IGRlYnVnLmdldGluZm8oY28sIDIpKQorbG9jYWwgYSxiID0gZGVidWcuZ2V0bG9jYWwoY28sIDEsIDEpCithc3NlcnQoYSA9PSAieCIgYW5kIGIgPT0gMTApCithLGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMikKK2Fzc2VydChhID09ICJhIiBhbmQgYiA9PSAxKQorZGVidWcuc2V0bG9jYWwoY28sIDEsIDIsICJoaSIpCithc3NlcnQoZGVidWcuZ2V0aG9vayhjbykgPT0gZm9vKQorYXNzZXJ0KCN0ciA9PSAyIGFuZAorICAgICAgIHRyWzFdID09IGwuY3VycmVudGxpbmUtMSBhbmQgdHJbMl0gPT0gbC5jdXJyZW50bGluZSkKKworYSxiLGMgPSBwY2FsbChjb3JvdXRpbmUucmVzdW1lLCBjbykKK2Fzc2VydChhIGFuZCBiIGFuZCBjID09IGwuY3VycmVudGxpbmUrMSkKK2NoZWNrdHJhY2ViYWNrKGNvLCB7InlpZWxkIiwgImluIGZ1bmN0aW9uIDwifSkKKworYSxiID0gY29yb3V0aW5lLnJlc3VtZShjbykKK2Fzc2VydChhIGFuZCBiID09ICJoaSIpCithc3NlcnQoI3RyID09IDQgYW5kIHRyWzRdID09IGwuY3VycmVudGxpbmUrMikKK2Fzc2VydChkZWJ1Zy5nZXRob29rKGNvKSA9PSBmb28pCithc3NlcnQobm90IGRlYnVnLmdldGhvb2soKSkKK2NoZWNrdHJhY2ViYWNrKGNvLCB7fSkKKworCistLSBjaGVjayBnZXQvc2V0bG9jYWwgaW4gY29yb3V0aW5lcworY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICh4KQorICBsb2NhbCBhLCBiID0gY29yb3V0aW5lLnlpZWxkKHgpCisgIGFzc2VydChhID09IDEwMCBhbmQgYiA9PSBuaWwpCisgIHJldHVybiB4CitlbmQpCithLCBiID0gY29yb3V0aW5lLnJlc3VtZShjbywgMTApCithc3NlcnQoYSBhbmQgYiA9PSAxMCkKK2EsIGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMSkKK2Fzc2VydChhID09ICJ4IiBhbmQgYiA9PSAxMCkKK2Fzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoY28sIDEsIDUpKQorYXNzZXJ0KGRlYnVnLnNldGxvY2FsKGNvLCAxLCAxLCAzMCkgPT0gIngiKQorYXNzZXJ0KG5vdCBkZWJ1Zy5zZXRsb2NhbChjbywgMSwgNSwgNDApKQorYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28sIDEwMCkKK2Fzc2VydChhIGFuZCBiID09IDMwKQorCisKKy0tIGNoZWNrIHRyYWNlYmFjayBvZiBzdXNwZW5kZWQgKG9yIGRlYWQgd2l0aCBlcnJvcikgY29yb3V0aW5lcworCitmdW5jdGlvbiBmKGkpIGlmIGk9PTAgdGhlbiBlcnJvcihpKSBlbHNlIGNvcm91dGluZS55aWVsZCgpOyBmKGktMSkgZW5kIGVuZAorCitjbyA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKHgpIGYoeCkgZW5kKQorYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28sIDMpCit0ID0geyInY29yb3V0aW5lLnlpZWxkJyIsICInZiciLCAiaW4gZnVuY3Rpb24gPCJ9Cit3aGlsZSBjb3JvdXRpbmUuc3RhdHVzKGNvKSA9PSAic3VzcGVuZGVkIiBkbworICBjaGVja3RyYWNlYmFjayhjbywgdCkKKyAgYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28pCisgIHRhYmxlLmluc2VydCh0LCAyLCAiJ2YnIikgICAtLSBvbmUgbW9yZSByZWN1cnNpdmUgY2FsbCB0byAnZicKK2VuZAordFsxXSA9ICInZXJyb3InIgorY2hlY2t0cmFjZWJhY2soY28sIHQpCisKKworLS0gdGVzdCBhY2Vzc2luZyBsaW5lIG51bWJlcnMgb2YgYSBjb3JvdXRpbmUgZnJvbSBhIHJlc3VtZSBpbnNpZGUKKy0tIGEgQyBmdW5jdGlvbiAodGhpcyBpcyBhIGtub3duIGJ1ZyBpbiBMdWEgNS4wKQorCitsb2NhbCBmdW5jdGlvbiBnKHgpCisgICAgY29yb3V0aW5lLnlpZWxkKHgpCitlbmQKKworbG9jYWwgZnVuY3Rpb24gZiAoaSkKKyAgZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoKSBlbmQsICJsIikKKyAgZm9yIGo9MSwxMDAwIGRvCisgICAgZyhpK2opCisgIGVuZAorZW5kCisKK2xvY2FsIGNvID0gY29yb3V0aW5lLndyYXAoZikKK2NvKDEwKQorcGNhbGwoY28pCitwY2FsbChjbykKKworCithc3NlcnQodHlwZShkZWJ1Zy5nZXRyZWdpc3RyeSgpKSA9PSAidGFibGUiKQorCisKKy0tIHRlc3QgdGFnbWV0aG9kIGluZm9ybWF0aW9uCitsb2NhbCBhID0ge30KK2xvY2FsIGZ1bmN0aW9uIGYgKHQpCisgIGxvY2FsIGluZm8gPSBkZWJ1Zy5nZXRpbmZvKDEpOworICBhc3NlcnQoaW5mby5uYW1ld2hhdCA9PSAibWV0YW1ldGhvZCIpCisgIGEub3AgPSBpbmZvLm5hbWUKKyAgcmV0dXJuIGluZm8ubmFtZQorZW5kCitzZXRtZXRhdGFibGUoYSwgeworICBfX2luZGV4ID0gZjsgX19hZGQgPSBmOyBfX2RpdiA9IGY7IF9fbW9kID0gZjsgX19jb25jYXQgPSBmOyBfX3BvdyA9IGY7CisgIF9fbXVsID0gZjsgX19pZGl2ID0gZjsgX191bm0gPSBmOyBfX2xlbiA9IGY7IF9fc3ViID0gZjsKKyAgX19zaGwgPSBmOyBfX3NociA9IGY7IF9fYm9yID0gZjsgX19ieG9yID0gZjsKKyAgX19lcSA9IGY7IF9fbGUgPSBmOyBfX2x0ID0gZjsgX191bm0gPSBmOyBfX2xlbiA9IGY7IF9fYmFuZCA9IGY7CisgIF9fYm5vdCA9IGY7Cit9KQorCitsb2NhbCBiID0gc2V0bWV0YXRhYmxlKHt9LCBnZXRtZXRhdGFibGUoYSkpCisKK2Fzc2VydChhWzNdID09ICJpbmRleCIgYW5kIGFeMyA9PSAicG93IiBhbmQgYS4uYSA9PSAiY29uY2F0IikKK2Fzc2VydChhLzMgPT0gImRpdiIgYW5kIDMlYSA9PSAibW9kIikKK2Fzc2VydChhKzMgPT0gImFkZCIgYW5kIDMtYSA9PSAic3ViIiBhbmQgYSozID09ICJtdWwiIGFuZAorICAgICAgIC1hID09ICJ1bm0iIGFuZCAjYSA9PSAibGVuIiBhbmQgYSYzID09ICJiYW5kIikKK2Fzc2VydChhfDMgPT0gImJvciIgYW5kIDN+YSA9PSAiYnhvciIgYW5kIGE8PDMgPT0gInNoaWZ0IiBhbmQKKyAgICAgICBhPj4xID09ICJzaGlmdCIpCithc3NlcnQgKGE9PWIgYW5kIGEub3AgPT0gImVxIikKK2Fzc2VydCAoYT49YiBhbmQgYS5vcCA9PSAib3JkZXIiKQorYXNzZXJ0IChhPmIgYW5kIGEub3AgPT0gIm9yZGVyIikKK2Fzc2VydCh+YSA9PSAiYm5vdCIpCisKK2RvICAgLS0gdGVzdGluZyBmb3ItaXRlcmF0b3IgbmFtZQorICBsb2NhbCBmdW5jdGlvbiBmKCkKKyAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5uYW1lID09ICJmb3IgaXRlcmF0b3IiKQorICBlbmQKKworICBmb3IgaSBpbiBmIGRvIGVuZAorZW5kCisKKworZG8gICAtLSB0ZXN0aW5nIGRlYnVnIGluZm8gZm9yIGZpbmFsaXplcnMKKyAgbG9jYWwgbmFtZSA9IG5pbAorCisgIC0tIGNyZWF0ZSBhIHBpZWNlIG9mIGdhcmJhZ2Ugd2l0aCBhIGZpbmFsaXplcgorICBzZXRtZXRhdGFibGUoe30sIHtfX2djID0gZnVuY3Rpb24gKCkKKyAgICBsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbygyKSAgIC0tIGdldCBjYWxsZWUgaW5mb3JtYXRpb24KKyAgICBhc3NlcnQodC5uYW1ld2hhdCA9PSAibWV0YW1ldGhvZCIpCisgICAgbmFtZSA9IHQubmFtZQorICBlbmR9KQorCisgIC0tIHJlcGVhdCB1bnRpbCBwcmV2aW91cyBmaW5hbGl6ZXIgcnVucyAoc2V0dGluZyAnbmFtZScpCisgIHJlcGVhdCBsb2NhbCBhID0ge30gdW50aWwgbmFtZQorICBhc3NlcnQobmFtZSA9PSAiX19nYyIpCitlbmQKKworCitkbworICBwcmludCgidGVzdGluZyB0cmFjZWJhY2sgc2l6ZXMiKQorCisgIGxvY2FsIGZ1bmN0aW9uIGNvdW50bGluZXMgKHMpCisgICAgcmV0dXJuIHNlbGVjdCgyLCBzdHJpbmcuZ3N1YihzLCAiXG4iLCAiIikpCisgIGVuZAorCisgIGxvY2FsIGZ1bmN0aW9uIGRlZXAgKGx2bCwgbikKKyAgICBpZiBsdmwgPT0gMCB0aGVuCisgICAgICByZXR1cm4gKGRlYnVnLnRyYWNlYmFjaygibWVzc2FnZSIsIG4pKQorICAgIGVsc2UKKyAgICAgIHJldHVybiAoZGVlcChsdmwtMSwgbikpCisgICAgZW5kCisgIGVuZAorCisgIGxvY2FsIGZ1bmN0aW9uIGNoZWNrZGVlcCAodG90YWwsIHN0YXJ0KQorICAgIGxvY2FsIHMgPSBkZWVwKHRvdGFsLCBzdGFydCkKKyAgICBsb2NhbCByZXN0ID0gc3RyaW5nLm1hdGNoKHMsICJebWVzc2FnZVxuc3RhY2sgdHJhY2ViYWNrOlxuKC4qKSQiKQorICAgIGxvY2FsIGNsID0gY291bnRsaW5lcyhyZXN0KQorICAgIC0tIGF0IG1vc3QgMTAgbGluZXMgaW4gZmlyc3QgcGFydCwgMTEgaW4gc2Vjb25kLCBwbHVzICcuLi4nCisgICAgYXNzZXJ0KGNsIDw9IDEwICsgMTEgKyAxKQorICAgIGxvY2FsIGJyayA9IHN0cmluZy5maW5kKHJlc3QsICIlLiUuJS4iKQorICAgIGlmIGJyayB0aGVuICAgLS0gZG9lcyBtZXNzYWdlIGhhdmUgJy4uLic/CisgICAgICBsb2NhbCByZXN0MSA9IHN0cmluZy5zdWIocmVzdCwgMSwgYnJrKQorICAgICAgbG9jYWwgcmVzdDIgPSBzdHJpbmcuc3ViKHJlc3QsIGJyaywgI3Jlc3QpCisgICAgICBhc3NlcnQoY291bnRsaW5lcyhyZXN0MSkgPT0gMTAgYW5kIGNvdW50bGluZXMocmVzdDIpID09IDExKQorICAgIGVsc2UKKyAgICAgIGFzc2VydChjbCA9PSB0b3RhbCAtIHN0YXJ0ICsgMikKKyAgICBlbmQKKyAgZW5kCisKKyAgZm9yIGQgPSAxLCA1MSwgMTAgZG8KKyAgICBmb3IgbCA9IDEsIGQgZG8KKyAgICAgIC0tIHVzZSBjb3JvdXRpbmVzIHRvIGVuc3VyZSBjb21wbGV0ZSBjb250cm9sIG9mIHRoZSBzdGFjaworICAgICAgY29yb3V0aW5lLndyYXAoY2hlY2tkZWVwKShkLCBsKQorICAgIGVuZAorICBlbmQKKworZW5kCisKKworcHJpbnQoInRlc3RpbmcgZGVidWcgZnVuY3Rpb25zIG9uIGNodW5rIHdpdGhvdXQgZGVidWcgaW5mbyIpCitwcm9nID0gW1stLSBwcm9ncmFtIHRvIGJlIGxvYWRlZCB3aXRob3V0IGRlYnVnIGluZm9ybWF0aW9uCitsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUnZGVidWcnCitsb2NhbCBhID0gMTIgIC0tIGEgbG9jYWwgdmFyaWFibGUKKworbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKDEsIDEpCithc3NlcnQobiA9PSAiKCp0ZW1wb3JhcnkpIiBhbmQgdiA9PSBkZWJ1ZykgICAtLSB1bmtvd24gbmFtZSBidXQga25vd24gdmFsdWUKK24sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAyKQorYXNzZXJ0KG4gPT0gIigqdGVtcG9yYXJ5KSIgYW5kIHYgPT0gMTIpICAgLS0gdW5rb3duIG5hbWUgYnV0IGtub3duIHZhbHVlCisKKy0tIGEgZnVuY3Rpb24gd2l0aCBhbiB1cHZhbHVlCitsb2NhbCBmID0gZnVuY3Rpb24gKCkgbG9jYWwgeDsgcmV0dXJuIGEgZW5kCituLCB2ID0gZGVidWcuZ2V0dXB2YWx1ZShmLCAxKQorYXNzZXJ0KG4gPT0gIigqbm8gbmFtZSkiIGFuZCB2ID09IDEyKQorYXNzZXJ0KGRlYnVnLnNldHVwdmFsdWUoZiwgMSwgMTMpID09ICIoKm5vIG5hbWUpIikKK2Fzc2VydChhID09IDEzKQorCitsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbyhmKQorYXNzZXJ0KHQubmFtZSA9PSBuaWwgYW5kIHQubGluZWRlZmluZWQgPiAwIGFuZAorICAgICAgIHQubGFzdGxpbmVkZWZpbmVkID09IHQubGluZWRlZmluZWQgYW5kCisgICAgICAgdC5zaG9ydF9zcmMgPT0gIj8iKQorYXNzZXJ0KGRlYnVnLmdldGluZm8oMSkuY3VycmVudGxpbmUgPT0gLTEpCisKK3QgPSBkZWJ1Zy5nZXRpbmZvKGYsICJMIikuYWN0aXZlbGluZXMKK2Fzc2VydChuZXh0KHQpID09IG5pbCkgICAgLS0gYWN0aXZlIGxpbmVzIGFyZSBlbXB0eQorCistLSBkdW1wL2xvYWQgYSBmdW5jdGlvbiB3aXRob3V0IGRlYnVnIGluZm8KK2YgPSBsb2FkKHN0cmluZy5kdW1wKGYpKQorCit0ID0gZGVidWcuZ2V0aW5mbyhmKQorYXNzZXJ0KHQubmFtZSA9PSBuaWwgYW5kIHQubGluZWRlZmluZWQgPiAwIGFuZAorICAgICAgIHQubGFzdGxpbmVkZWZpbmVkID09IHQubGluZWRlZmluZWQgYW5kCisgICAgICAgdC5zaG9ydF9zcmMgPT0gIj8iKQorYXNzZXJ0KGRlYnVnLmdldGluZm8oMSkuY3VycmVudGxpbmUgPT0gLTEpCisKK3JldHVybiBhCitdXQorCisKKy0tIGxvYWQgJ3Byb2cnIHdpdGhvdXQgZGVidWcgaW5mbworbG9jYWwgZiA9IGFzc2VydChsb2FkKHN0cmluZy5kdW1wKGxvYWQocHJvZyksIHRydWUpKSkKKworYXNzZXJ0KGYoKSA9PSAxMykKKworZG8gICAtLSB0ZXN0cyBmb3IgJ3NvdXJjZScgaW4gYmluYXJ5IGR1bXBzCisgIGxvY2FsIHByb2cgPSBbWworICAgIHJldHVybiBmdW5jdGlvbiAoeCkKKyAgICAgIHJldHVybiBmdW5jdGlvbiAoeSkgCisgICAgICAgIHJldHVybiB4ICsgeQorICAgICAgZW5kCisgICAgZW5kCisgIF1dCisgIGxvY2FsIG5hbWUgPSBzdHJpbmcucmVwKCJ4IiwgMTAwMCkKKyAgbG9jYWwgcCA9IGFzc2VydChsb2FkKHByb2csIG5hbWUpKQorICAtLSBsb2FkICdwJyBhcyBhIGJpbmFyeSBjaHVuayB3aXRoIGRlYnVnIGluZm9ybWF0aW9uCisgIGxvY2FsIGMgPSBzdHJpbmcuZHVtcChwKQorICBhc3NlcnQoI2MgPiAxMDAwIGFuZCAjYyA8IDIwMDApICAgLS0gbm8gcmVwZXRpdGlvbiBvZiAnc291cmNlJyBpbiBkdW1wCisgIGxvY2FsIGYgPSBhc3NlcnQobG9hZChjKSkKKyAgbG9jYWwgZyA9IGYoKQorICBsb2NhbCBoID0gZygzKQorICBhc3NlcnQoaCg1KSA9PSA4KQorICBhc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zb3VyY2UgPT0gbmFtZSBhbmQgICAtLSBhbGwgZnVuY3Rpb25zIGhhdmUgJ3NvdXJjZScKKyAgICAgICAgIGRlYnVnLmdldGluZm8oZykuc291cmNlID09IG5hbWUgYW5kIAorICAgICAgICAgZGVidWcuZ2V0aW5mbyhoKS5zb3VyY2UgPT0gbmFtZSkKKyAgLS0gYWdhaW4sIHdpdGhvdXQgZGVidWcgaW5mbworICBsb2NhbCBjID0gc3RyaW5nLmR1bXAocCwgdHJ1ZSkKKyAgYXNzZXJ0KCNjIDwgNTAwKSAgIC0tIG5vICdzb3VyY2UnIGluIGR1bXAKKyAgbG9jYWwgZiA9IGFzc2VydChsb2FkKGMpKQorICBsb2NhbCBnID0gZigpCisgIGxvY2FsIGggPSBnKDMwKQorICBhc3NlcnQoaCg1MCkgPT0gODApCisgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNvdXJjZSA9PSAnPT8nIGFuZCAgIC0tIG5vIGZ1bmN0aW9uIGhhcyAnc291cmNlJworICAgICAgICAgZGVidWcuZ2V0aW5mbyhnKS5zb3VyY2UgPT0gJz0/JyBhbmQgCisgICAgICAgICBkZWJ1Zy5nZXRpbmZvKGgpLnNvdXJjZSA9PSAnPT8nKQorZW5kCisKK3ByaW50Ik9LIgorCmRpZmYgLS1naXQgYS90ZXN0ZXMvZXJyb3JzLmx1YSBiL3Rlc3Rlcy9lcnJvcnMubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTdiNzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0ZXMvZXJyb3JzLmx1YQpAQCAtMCwwICsxLDU1NCBAQAorLS0gJElkOiBlcnJvcnMubHVhLHYgMS45NyAyMDE3LzExLzI4IDE1OjMxOjU2IHJvYmVydG8gRXhwICQKKy0tIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGZpbGUgYWxsLmx1YQorCitwcmludCgidGVzdGluZyBlcnJvcnMiKQorCitsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUiZGVidWciCisKKy0tIGF2b2lkIHByb2JsZW1zIHdpdGggJ3N0cmljdCcgbW9kdWxlICh3aGljaCBtYXkgZ2VuZXJhdGUgb3RoZXIgZXJyb3IgbWVzc2FnZXMpCitsb2NhbCBtdCA9IGdldG1ldGF0YWJsZShfRykgb3Ige30KK2xvY2FsIG9sZG1tID0gbXQuX19pbmRleAorbXQuX19pbmRleCA9IG5pbAorCitsb2NhbCBmdW5jdGlvbiBjaGVja2VyciAobXNnLCBmLCAuLi4pCisgIGxvY2FsIHN0LCBlcnIgPSBwY2FsbChmLCAuLi4pCisgIGFzc2VydChub3Qgc3QgYW5kIHN0cmluZy5maW5kKGVyciwgbXNnKSkKK2VuZAorCisKK2xvY2FsIGZ1bmN0aW9uIGRvaXQgKHMpCisgIGxvY2FsIGYsIG1zZyA9IGxvYWQocykKKyAgaWYgZiA9PSBuaWwgdGhlbiByZXR1cm4gbXNnIGVuZAorICBsb2NhbCBjb25kLCBtc2cgPSBwY2FsbChmKQorICByZXR1cm4gKG5vdCBjb25kKSBhbmQgbXNnCitlbmQKKworCitsb2NhbCBmdW5jdGlvbiBjaGVja21lc3NhZ2UgKHByb2csIG1zZykKKyAgbG9jYWwgbSA9IGRvaXQocHJvZykKKyAgYXNzZXJ0KHN0cmluZy5maW5kKG0sIG1zZywgMSwgdHJ1ZSkpCitlbmQKKworbG9jYWwgZnVuY3Rpb24gY2hlY2tzeW50YXggKHByb2csIGV4dHJhLCB0b2tlbiwgbGluZSkKKyAgbG9jYWwgbXNnID0gZG9pdChwcm9nKQorICBpZiBub3Qgc3RyaW5nLmZpbmQodG9rZW4sICJePCVhIikgYW5kIG5vdCBzdHJpbmcuZmluZCh0b2tlbiwgIl5jaGFyJSgiKQorICAgIHRoZW4gdG9rZW4gPSAiJyIuLnRva2VuLi4iJyIgZW5kCisgIHRva2VuID0gc3RyaW5nLmdzdWIodG9rZW4sICIoJXApIiwgIiUlJTEiKQorICBsb2NhbCBwdCA9IHN0cmluZy5mb3JtYXQoW1teJSVbc3RyaW5nICIuKiIlJV06JWQ6IC4tIG5lYXIgJXMkXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCB0b2tlbikKKyAgYXNzZXJ0KHN0cmluZy5maW5kKG1zZywgcHQpKQorICBhc3NlcnQoc3RyaW5nLmZpbmQobXNnLCBtc2csIDEsIHRydWUpKQorZW5kCisKKworLS0gdGVzdCBlcnJvciBtZXNzYWdlIHdpdGggbm8gZXh0cmEgaW5mbworYXNzZXJ0KGRvaXQoImVycm9yKCdoaScsIDApIikgPT0gJ2hpJykKKworLS0gdGVzdCBlcnJvciBtZXNzYWdlIHdpdGggbm8gaW5mbworYXNzZXJ0KGRvaXQoImVycm9yKCkiKSA9PSBuaWwpCisKKworLS0gdGVzdCBjb21tb24gZXJyb3JzL2Vycm9ycyB0aGF0IGNyYXNoZWQgaW4gdGhlIHBhc3QKK2Fzc2VydChkb2l0KCJ0YWJsZS51bnBhY2soe30sIDEsIG49Ml4zMCkiKSkKK2Fzc2VydChkb2l0KCJhPW1hdGguc2luKCkiKSkKK2Fzc2VydChub3QgZG9pdCgidG9zdHJpbmcoMSkiKSBhbmQgZG9pdCgidG9zdHJpbmcoKSIpKQorYXNzZXJ0KGRvaXQidG9udW1iZXIoKSIpCithc3NlcnQoZG9pdCJyZXBlYXQgdW50aWwgMTsgYSIpCithc3NlcnQoZG9pdCJyZXR1cm47OyIpCithc3NlcnQoZG9pdCJhc3NlcnQoZmFsc2UpIikKK2Fzc2VydChkb2l0ImFzc2VydChuaWwpIikKK2Fzc2VydChkb2l0KCJmdW5jdGlvbiBhICguLi4gLCAuLi4pIGVuZCIpKQorYXNzZXJ0KGRvaXQoImZ1bmN0aW9uIGEgKCwgLi4uKSBlbmQiKSkKK2Fzc2VydChkb2l0KCJsb2NhbCB0PXt9OyB0ID0gdFsjdF0gKyAxIikpCisKK2NoZWNrc3ludGF4KFtbCisgIGxvY2FsIGEgPSB7NAorCitdXSwgIid9JyBleHBlY3RlZCAodG8gY2xvc2UgJ3snIGF0IGxpbmUgMSkiLCAiPGVvZj4iLCAzKQorCisKK2lmIG5vdCBUIHRoZW4KKyAgKE1lc3NhZ2Ugb3IgcHJpbnQpCisgICAgKCdcbiA+Pj4gdGVzdEMgbm90IGFjdGl2ZTogc2tpcHBpbmcgbWVtb3J5IG1lc3NhZ2UgdGVzdCA8PDxcbicpCitlbHNlCisgIHByaW50ICJ0ZXN0aW5nIG1lbW9yeSBlcnJvciBtZXNzYWdlIgorICBsb2NhbCBhID0ge30KKyAgZm9yIGkgPSAxLCAxMDAwMCBkbyBhW2ldID0gdHJ1ZSBlbmQgICAtLSBwcmVhbGxvY2F0ZSBhcnJheQorICBjb2xsZWN0Z2FyYmFnZSgpCisgIFQudG90YWxtZW0oVC50b3RhbG1lbSgpICsgMTAwMDApCisgIC0tIGZvcmNlIGEgbWVtb3J5IGVycm9yIChieSBhIHNtYWxsIG1hcmdpbikKKyAgbG9jYWwgc3QsIG1zZyA9IHBjYWxsKGZ1bmN0aW9uKCkKKyAgICBmb3IgaSA9IDEsIDEwMDAwMCBkbyBhW2ldID0gdG9zdHJpbmcoaSkgZW5kCisgIGVuZCkKKyAgVC50b3RhbG1lbSgwKQorICBhc3NlcnQobm90IHN0IGFuZCBtc2cgPT0gIm5vdCBlbm91Z2giIC4uICIgbWVtb3J5IikKK2VuZAorCisKKy0tIHRlc3RzIGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMKKworY2hlY2ttZXNzYWdlKCJhID0ge30gKyAxIiwgImFyaXRobWV0aWMiKQorY2hlY2ttZXNzYWdlKCJhID0ge30gfCAxIiwgImJpdHdpc2Ugb3BlcmF0aW9uIikKK2NoZWNrbWVzc2FnZSgiYSA9IHt9IDwgMSIsICJhdHRlbXB0IHRvIGNvbXBhcmUiKQorY2hlY2ttZXNzYWdlKCJhID0ge30gPD0gMSIsICJhdHRlbXB0IHRvIGNvbXBhcmUiKQorCitjaGVja21lc3NhZ2UoImE9MTsgYmJiYj0yOyBhPW1hdGguc2luKDMpK2JiYmIoMykiLCAiZ2xvYmFsICdiYmJiJyIpCitjaGVja21lc3NhZ2UoImE9e307IGRvIGxvY2FsIGE9MSBlbmQgYTpiYmJiKDMpIiwgIm1ldGhvZCAnYmJiYiciKQorY2hlY2ttZXNzYWdlKCJsb2NhbCBhPXt9OyBhLmJiYmIoMykiLCAiZmllbGQgJ2JiYmInIikKK2Fzc2VydChub3Qgc3RyaW5nLmZpbmQoZG9pdCJhPXsxM307IGxvY2FsIGJiYmI9MTsgYVtiYmJiXSgzKSIsICInYmJiYiciKSkKK2NoZWNrbWVzc2FnZSgiYT17MTN9OyBsb2NhbCBiYmJiPTE7IGFbYmJiYl0oMykiLCAibnVtYmVyIikKK2NoZWNrbWVzc2FnZSgiYT0oMSkuLnt9IiwgImEgdGFibGUgdmFsdWUiKQorCitjaGVja21lc3NhZ2UoImEgPSAjcHJpbnQiLCAibGVuZ3RoIG9mIGEgZnVuY3Rpb24gdmFsdWUiKQorY2hlY2ttZXNzYWdlKCJhID0gIzMiLCAibGVuZ3RoIG9mIGEgbnVtYmVyIHZhbHVlIikKKworYWFhID0gbmlsCitjaGVja21lc3NhZ2UoImFhYS5iYmI6ZGRkKDkpIiwgImdsb2JhbCAnYWFhJyIpCitjaGVja21lc3NhZ2UoImxvY2FsIGFhYT17YmJiPTF9OyBhYWEuYmJiOmRkZCg5KSIsICJmaWVsZCAnYmJiJyIpCitjaGVja21lc3NhZ2UoImxvY2FsIGFhYT17YmJiPXt9fTsgYWFhLmJiYjpkZGQoOSkiLCAibWV0aG9kICdkZGQnIikKK2NoZWNrbWVzc2FnZSgibG9jYWwgYSxiLGM7IChmdW5jdGlvbiAoKSBhID0gYisxLjEgZW5kKSgpIiwgInVwdmFsdWUgJ2InIikKK2Fzc2VydChub3QgZG9pdCJsb2NhbCBhYWE9e2JiYj17ZGRkPW5leHR9fTsgYWFhLmJiYjpkZGQobmlsKSIpCisKKy0tIHVwdmFsdWVzIGJlaW5nIGluZGV4ZWQgZG8gbm90IGdvIHRvIHRoZSBzdGFjaworY2hlY2ttZXNzYWdlKCJsb2NhbCBhLGIsY2M7IChmdW5jdGlvbiAoKSBhID0gY2NbMV0gZW5kKSgpIiwgInVwdmFsdWUgJ2NjJyIpCitjaGVja21lc3NhZ2UoImxvY2FsIGEsYixjYzsgKGZ1bmN0aW9uICgpIGEueCA9IDEgZW5kKSgpIiwgInVwdmFsdWUgJ2EnIikKKworY2hlY2ttZXNzYWdlKCJsb2NhbCBfRU5WID0ge3g9e319OyBhID0gYSArIDEiLCAiZ2xvYmFsICdhJyIpCisKK2NoZWNrbWVzc2FnZSgiYj0xOyBsb2NhbCBhYWE9e307IHg9YWFhK2IiLCAibG9jYWwgJ2FhYSciKQorY2hlY2ttZXNzYWdlKCJhYWE9e307IHg9My4zL2FhYSIsICJnbG9iYWwgJ2FhYSciKQorY2hlY2ttZXNzYWdlKCJhYWE9MjsgYj1uaWw7eD1hYWEqYiIsICJnbG9iYWwgJ2InIikKK2NoZWNrbWVzc2FnZSgiYWFhPXt9OyB4PS1hYWEiLCAiZ2xvYmFsICdhYWEnIikKKworLS0gc2hvcnQgY2lyY3VpdAorY2hlY2ttZXNzYWdlKCJhPTE7IGxvY2FsIGEsYmJiYj0yLDM7IGEgPSBtYXRoLnNpbigxKSBhbmQgYmJiYigzKSIsCisgICAgICAgImxvY2FsICdiYmJiJyIpCitjaGVja21lc3NhZ2UoImE9MTsgbG9jYWwgYSxiYmJiPTIsMzsgYSA9IGJiYmIoMSkgb3IgYSgzKSIsICJsb2NhbCAnYmJiYiciKQorY2hlY2ttZXNzYWdlKCJsb2NhbCBhLGIsYyxmID0gMSwxLDE7IGYoKGEgYW5kIGIpIG9yIGMpIiwgImxvY2FsICdmJyIpCitjaGVja21lc3NhZ2UoImxvY2FsIGEsYixjID0gMSwxLDE7ICgoYSBhbmQgYikgb3IgYykoKSIsICJjYWxsIGEgbnVtYmVyIHZhbHVlIikKK2Fzc2VydChub3Qgc3RyaW5nLmZpbmQoZG9pdCJhYWE9e307IHg9KGFhYSBvciBhYWEpKyhhYWEgYW5kIGFhYSkiLCAiJ2FhYSciKSkKK2Fzc2VydChub3Qgc3RyaW5nLmZpbmQoZG9pdCJhYWE9e307IChhYWEgb3IgYWFhKSgpIiwgIidhYWEnIikpCisKK2NoZWNrbWVzc2FnZSgicHJpbnQocHJpbnQgPCAxMCkiLCAiZnVuY3Rpb24gd2l0aCBudW1iZXIiKQorY2hlY2ttZXNzYWdlKCJwcmludChwcmludCA8IHByaW50KSIsICJ0d28gZnVuY3Rpb24gdmFsdWVzIikKK2NoZWNrbWVzc2FnZSgicHJpbnQoJzEwJyA8IDEwKSIsICJzdHJpbmcgd2l0aCBudW1iZXIiKQorY2hlY2ttZXNzYWdlKCJwcmludCgxMCA8ICcyMycpIiwgIm51bWJlciB3aXRoIHN0cmluZyIpCisKKy0tIGZsb2F0LT5pbnRlZ2VyIGNvbnZlcnNpb25zCitjaGVja21lc3NhZ2UoImxvY2FsIGEgPSAyLjBeMTAwOyB4ID0gYSA8PCAyIiwgImxvY2FsIGEiKQorY2hlY2ttZXNzYWdlKCJsb2NhbCBhID0gMSA+PiAyLjBeMTAwIiwgImhhcyBubyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIikKK2NoZWNrbWVzc2FnZSgibG9jYWwgYSA9IDEwLjEgPDwgMi4wXjEwMCIsICJoYXMgbm8gaW50ZWdlciByZXByZXNlbnRhdGlvbiIpCitjaGVja21lc3NhZ2UoImxvY2FsIGEgPSAyLjBeMTAwICYgMSIsICJoYXMgbm8gaW50ZWdlciByZXByZXNlbnRhdGlvbiIpCitjaGVja21lc3NhZ2UoImxvY2FsIGEgPSAyLjBeMTAwICYgMWUxMDAiLCAiaGFzIG5vIGludGVnZXIgcmVwcmVzZW50YXRpb24iKQorY2hlY2ttZXNzYWdlKCJsb2NhbCBhID0gMi4wIHwgMWU0MCIsICJoYXMgbm8gaW50ZWdlciByZXByZXNlbnRhdGlvbiIpCitjaGVja21lc3NhZ2UoImxvY2FsIGEgPSAyZTEwMCB+IDEiLCAiaGFzIG5vIGludGVnZXIgcmVwcmVzZW50YXRpb24iKQorY2hlY2ttZXNzYWdlKCJzdHJpbmcuc3ViKCdhJywgMi4wXjEwMCkiLCAiaGFzIG5vIGludGVnZXIgcmVwcmVzZW50YXRpb24iKQorY2hlY2ttZXNzYWdlKCJzdHJpbmcucmVwKCdhJywgMy4zKSIsICJoYXMgbm8gaW50ZWdlciByZXByZXNlbnRhdGlvbiIpCitjaGVja21lc3NhZ2UoInJldHVybiA2ZTQwICYgNyIsICJoYXMgbm8gaW50ZWdlciByZXByZXNlbnRhdGlvbiIpCitjaGVja21lc3NhZ2UoInJldHVybiAzNCA8PCA3ZTMwIiwgImhhcyBubyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIikKK2NoZWNrbWVzc2FnZSgicmV0dXJuIH4tM2U0MCIsICJoYXMgbm8gaW50ZWdlciByZXByZXNlbnRhdGlvbiIpCitjaGVja21lc3NhZ2UoInJldHVybiB+LTMuMDA5IiwgImhhcyBubyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIikKK2NoZWNrbWVzc2FnZSgicmV0dXJuIDMuMDA5ICYgMSIsICJoYXMgbm8gaW50ZWdlciByZXByZXNlbnRhdGlvbiIpCitjaGVja21lc3NhZ2UoInJldHVybiAzNCA+PiB7fSIsICJ0YWJsZSB2YWx1ZSIpCitjaGVja21lc3NhZ2UoImEgPSAyNCAvLyAwIiwgImRpdmlkZSBieSB6ZXJvIikKK2NoZWNrbWVzc2FnZSgiYSA9IDEgJSAwIiwgIiduJTAnIikKKworCistLSBwYXNzaW5nIGxpZ2h0IHVzZXJkYXRhIGluc3RlYWQgb2YgZnVsbCB1c2VyZGF0YQorX0cuRCA9IGRlYnVnCitjaGVja21lc3NhZ2UoW1sKKyAgLS0gY3JlYXRlIGxpZ2h0IHVkYXRhCisgIGxvY2FsIHggPSBELnVwdmFsdWVpZChmdW5jdGlvbiAoKSByZXR1cm4gZGVidWcgZW5kLCAxKQorICBELnNldHVzZXJ2YWx1ZSh4LCB7fSkKK11dLCAibGlnaHQgdXNlcmRhdGEiKQorX0cuRCA9IG5pbAorCitkbyAgIC0tIG5hbWVkIG9iamVjdHMgKGZpZWxkICdfX25hbWUnKQorICBjaGVja21lc3NhZ2UoIm1hdGguc2luKGlvLmlucHV0KCkpIiwgIihudW1iZXIgZXhwZWN0ZWQsIGdvdCBGSUxFKikiKQorICBfRy5YWCA9IHNldG1ldGF0YWJsZSh7fSwge19fbmFtZSA9ICJNeSBUeXBlIn0pCisgIGFzc2VydChzdHJpbmcuZmluZCh0b3N0cmluZyhYWCksICJeTXkgVHlwZSIpKQorICBjaGVja21lc3NhZ2UoImlvLmlucHV0KFhYKSIsICIoRklMRSogZXhwZWN0ZWQsIGdvdCBNeSBUeXBlKSIpCisgIGNoZWNrbWVzc2FnZSgicmV0dXJuIFhYICsgMSIsICJvbiBhIE15IFR5cGUgdmFsdWUiKQorICBjaGVja21lc3NhZ2UoInJldHVybiB+aW8uc3RkaW4iLCAib24gYSBGSUxFKiB2YWx1ZSIpCisgIGNoZWNrbWVzc2FnZSgicmV0dXJuIFhYIDwgWFgiLCAidHdvIE15IFR5cGUgdmFsdWVzIikKKyAgY2hlY2ttZXNzYWdlKCJyZXR1cm4ge30gPCBYWCIsICJ0YWJsZSB3aXRoIE15IFR5cGUiKQorICBjaGVja21lc3NhZ2UoInJldHVybiBYWCA8IGlvLnN0ZGluIiwgIk15IFR5cGUgd2l0aCBGSUxFKiIpCisgIF9HLlhYID0gbmlsCitlbmQKKworLS0gZ2xvYmFsIGZ1bmN0aW9ucworY2hlY2ttZXNzYWdlKCIoaW8ud3JpdGUgb3IgcHJpbnQpe30iLCAiaW8ud3JpdGUiKQorY2hlY2ttZXNzYWdlKCIoY29sbGVjdGdhcmJhZ2Ugb3IgcHJpbnQpe30iLCAiY29sbGVjdGdhcmJhZ2UiKQorCistLSBlcnJvcnMgaW4gZnVuY3Rpb25zIHdpdGhvdXQgZGVidWcgaW5mbworZG8KKyAgbG9jYWwgZiA9IGZ1bmN0aW9uIChhKSByZXR1cm4gYSArIDEgZW5kCisgIGYgPSBhc3NlcnQobG9hZChzdHJpbmcuZHVtcChmLCB0cnVlKSkpCisgIGFzc2VydChmKDMpID09IDQpCisgIGNoZWNrZXJyKCJeJT86JS0xOiIsIGYsIHt9KQorCisgIC0tIGNvZGUgd2l0aCBhIG1vdmUgdG8gYSBsb2NhbCB2YXIgKCdPUF9NT1YgQSBCJyB3aXRoIEE8QikKKyAgZiA9IGZ1bmN0aW9uICgpIGxvY2FsIGE7IGEgPSB7fTsgcmV0dXJuIGEgKyAyIGVuZAorICAtLSBubyBkZWJ1ZyBpbmZvIChzbyB0aGF0ICdhJyBpcyB1bmtub3duKQorICBmID0gYXNzZXJ0KGxvYWQoc3RyaW5nLmR1bXAoZiwgdHJ1ZSkpKQorICAtLSBzeW1ib2xpYyBleGVjdXRpb24gc2hvdWxkIG5vdCBnZXQgbG9zdAorICBjaGVja2VycigiXiU/OiUtMTouKnRhYmxlIHZhbHVlIiwgZikKK2VuZAorCisKKy0tIHRlc3RzIGZvciBmaWVsZCBhY2Nlc3NlcyBhZnRlciBSSyBsaW1pdAorbG9jYWwgdCA9IHt9Citmb3IgaSA9IDEsIDEwMDAgZG8KKyAgdFtpXSA9ICJhID0geCIgLi4gaQorZW5kCitsb2NhbCBzID0gdGFibGUuY29uY2F0KHQsICI7ICIpCit0ID0gbmlsCitjaGVja21lc3NhZ2Uocy4uIjsgYSA9IGJiYiArIDEiLCAiZ2xvYmFsICdiYmInIikKK2NoZWNrbWVzc2FnZSgibG9jYWwgX0VOVj1fRU5WOyIuLnMuLiI7IGEgPSBiYmIgKyAxIiwgImdsb2JhbCAnYmJiJyIpCitjaGVja21lc3NhZ2Uocy4uIjsgbG9jYWwgdCA9IHt9OyBhID0gdC5iYmIgKyAxIiwgImZpZWxkICdiYmInIikKK2NoZWNrbWVzc2FnZShzLi4iOyBsb2NhbCB0ID0ge307IHQ6YmJiKCkiLCAibWV0aG9kICdiYmInIikKKworY2hlY2ttZXNzYWdlKFtbYWFhPTkKK3JlcGVhdCB1bnRpbCAzPT0zCitsb2NhbCB4PW1hdGguc2luKG1hdGguY29zKDMpKQoraWYgbWF0aC5zaW4oMSkgPT0geCB0aGVuIHJldHVybiBtYXRoLnNpbigxKSBlbmQgICAtLSB0YWlsIGNhbGwKK2xvY2FsIGEsYiA9IDEsIHsKKyAge3g9J2EnLi4nYicuLidjJywgeT0nYicsIHo9eH0sCisgIHsxLDIsMyw0LDV9IG9yIDMrMzw9MyszLAorICAzKzE+MysxLAorICB7ZCA9IHggYW5kIGFhYVt4IG9yIHldfX0KK11dLCAiZ2xvYmFsICdhYWEnIikKKworY2hlY2ttZXNzYWdlKFtbCitsb2NhbCB4LHkgPSB7fSwxCitpZiBtYXRoLnNpbigxKSA9PSAwIHRoZW4gcmV0dXJuIDMgZW5kICAgIC0tIHJldHVybgoreC5hKCldXSwgImZpZWxkICdhJyIpCisKK2NoZWNrbWVzc2FnZShbWworcHJlZml4ID0gbmlsCitpbnNlcnQgPSBuaWwKK3doaWxlIDEgZG8KKyAgbG9jYWwgYQorICBpZiBuaWwgdGhlbiBicmVhayBlbmQKKyAgaW5zZXJ0KHByZWZpeCwgYSkKK2VuZF1dLCAiZ2xvYmFsICdpbnNlcnQnIikKKworY2hlY2ttZXNzYWdlKFtbICAtLSB0YWlsIGNhbGwKKyAgcmV0dXJuIG1hdGguc2luKCJhIikKK11dLCAiJ3NpbiciKQorCitjaGVja21lc3NhZ2UoW1tjb2xsZWN0Z2FyYmFnZSgibm9vcHRpb24iKV1dLCAiaW52YWxpZCBvcHRpb24iKQorCitjaGVja21lc3NhZ2UoW1t4ID0gcHJpbnQgLi4gImEiXV0sICJjb25jYXRlbmF0ZSIpCitjaGVja21lc3NhZ2UoW1t4ID0gImEiIC4uIGZhbHNlXV0sICJjb25jYXRlbmF0ZSIpCitjaGVja21lc3NhZ2UoW1t4ID0ge30gLi4gMl1dLCAiY29uY2F0ZW5hdGUiKQorCitjaGVja21lc3NhZ2UoImdldG1ldGF0YWJsZShpby5zdGRpbikuX19nYygpIiwgIm5vIHZhbHVlIikKKworY2hlY2ttZXNzYWdlKFtbCitsb2NhbCBWYXIKK2xvY2FsIGZ1bmN0aW9uIG1haW4oKQorICBOb1N1Y2hOYW1lIChmdW5jdGlvbigpIFZhcj0wIGVuZCkKK2VuZAorbWFpbigpCitdXSwgImdsb2JhbCAnTm9TdWNoTmFtZSciKQorcHJpbnQnKycKKworYSA9IHt9OyBzZXRtZXRhdGFibGUoYSwge19faW5kZXggPSBzdHJpbmd9KQorY2hlY2ttZXNzYWdlKCJhOnN1YigpIiwgImJhZCBzZWxmIikKK2NoZWNrbWVzc2FnZSgic3RyaW5nLnN1YignYScsIHt9KSIsICIjMiIpCitjaGVja21lc3NhZ2UoIignYScpOnN1Ynt9IiwgIiMxIikKKworY2hlY2ttZXNzYWdlKCJ0YWJsZS5zb3J0KHsxLDIsM30sIHRhYmxlLnNvcnQpIiwgIid0YWJsZS5zb3J0JyIpCitjaGVja21lc3NhZ2UoInN0cmluZy5nc3ViKCdzJywgJ3MnLCBzZXRtZXRhdGFibGUpIiwgIidzZXRtZXRhdGFibGUnIikKKworLS0gdGVzdHMgZm9yIGVycm9ycyBpbiBjb3JvdXRpbmVzCisKK2xvY2FsIGZ1bmN0aW9uIGYgKG4pCisgIGxvY2FsIGMgPSBjb3JvdXRpbmUuY3JlYXRlKGYpCisgIGxvY2FsIGEsYiA9IGNvcm91dGluZS5yZXN1bWUoYykKKyAgcmV0dXJuIGIKK2VuZAorYXNzZXJ0KHN0cmluZy5maW5kKGYoKSwgIkMgc3RhY2sgb3ZlcmZsb3ciKSkKKworY2hlY2ttZXNzYWdlKCJjb3JvdXRpbmUueWllbGQoKSIsICJvdXRzaWRlIGEgY29yb3V0aW5lIikKKworZiA9IGNvcm91dGluZS53cmFwKGZ1bmN0aW9uICgpIHRhYmxlLnNvcnQoezEsMiwzfSwgY29yb3V0aW5lLnlpZWxkKSBlbmQpCitjaGVja2VycigieWllbGQgYWNyb3NzIiwgZikKKworCistLSB0ZXN0aW5nIHNpemUgb2YgJ3NvdXJjZScgaW5mbzsgc2l6ZSBvZiBidWZmZXIgZm9yIHRoYXQgaW5mbyBpcworLS0gTFVBX0lEU0laRSwgZGVjbGFyZWQgYXMgNjAgaW4gbHVhY29uZi4gR2V0IG9uZSBwb3NpdGlvbiBmb3IgJ1wwJy4KK2lkc2l6ZSA9IDYwIC0gMQorbG9jYWwgZnVuY3Rpb24gY2hlY2tzaXplIChzb3VyY2UpCisgIC0tIHN5bnRheCBlcnJvcgorICBsb2NhbCBfLCBtc2cgPSBsb2FkKCJ4Iiwgc291cmNlKQorICBtc2cgPSBzdHJpbmcubWF0Y2gobXNnLCAiXihbXjpdKik6IikgICAtLSBnZXQgc291cmNlICgxc3QgcGFydCBiZWZvcmUgJzonKQorICBhc3NlcnQobXNnOmxlbigpIDw9IGlkc2l6ZSkKK2VuZAorCitmb3IgaSA9IDYwIC0gMTAsIDYwICsgMTAgZG8gICAtLSBjaGVjayBib3JkZXIgY2FzZXMgYXJvdW5kIDYwCisgIGNoZWNrc2l6ZSgiQCIgLi4gc3RyaW5nLnJlcCgieCIsIGkpKSAgIC0tIGZpbGUgbmFtZXMKKyAgY2hlY2tzaXplKHN0cmluZy5yZXAoIngiLCBpIC0gMTApKSAgICAgLS0gc3RyaW5nIHNvdXJjZXMKKyAgY2hlY2tzaXplKCI9IiAuLiBzdHJpbmcucmVwKCJ4IiwgaSkpICAgLS0gZXhhY3Qgc291cmNlcworZW5kCisKKworLS0gdGVzdGluZyBsaW5lIGVycm9yCisKK2xvY2FsIGZ1bmN0aW9uIGxpbmVlcnJvciAocywgbCkKKyAgbG9jYWwgZXJyLG1zZyA9IHBjYWxsKGxvYWQocykpCisgIGxvY2FsIGxpbmUgPSBzdHJpbmcubWF0Y2gobXNnLCAiOiglZCspOiIpCisgIGFzc2VydCgobGluZSBhbmQgbGluZSswKSA9PSBsKQorZW5kCisKK2xpbmVlcnJvcigibG9jYWwgYVxuIGZvciBpPTEsJ2EnIGRvIFxuIHByaW50KGkpIFxuIGVuZCIsIDIpCitsaW5lZXJyb3IoIlxuIGxvY2FsIGEgXG4gZm9yIGssdiBpbiAzIFxuIGRvIFxuIHByaW50KGspIFxuIGVuZCIsIDMpCitsaW5lZXJyb3IoIlxuXG4gZm9yIGssdiBpbiBcbiAzIFxuIGRvIFxuIHByaW50KGspIFxuIGVuZCIsIDQpCitsaW5lZXJyb3IoImZ1bmN0aW9uIGEueC55ICgpXG5hPWErMVxuZW5kIiwgMSkKKworbGluZWVycm9yKCJhID0gXG5hXG4rXG57fSIsIDMpCitsaW5lZXJyb3IoImEgPSBcbjNcbitcbihcbjRcbi9cbnByaW50KSIsIDYpCitsaW5lZXJyb3IoImEgPSBcbnByaW50XG4rXG4oXG40XG4vXG43KSIsIDMpCisKK2xpbmVlcnJvcigiYVxuPVxuLVxuXG5wcmludFxuOyIsIDMpCisKK2xpbmVlcnJvcihbWworYQorKAorMjMpCitdXSwgMSkKKworbGluZWVycm9yKFtbCitsb2NhbCBhID0ge3ggPSAxM30KK2EKKy4KK3gKKygKKzIzCispCitdXSwgMikKKworbGluZWVycm9yKFtbCitsb2NhbCBhID0ge3ggPSAxM30KK2EKKy4KK3gKKygKKzIzICsgYQorKQorXV0sIDYpCisKK2xvY2FsIHAgPSBbWworICBmdW5jdGlvbiBnKCkgZigpIGVuZAorICBmdW5jdGlvbiBmKHgpIGVycm9yKCdhJywgWCkgZW5kCitnKCkKK11dCitYPTM7bGluZWVycm9yKChwKSwgMykKK1g9MDtsaW5lZXJyb3IoKHApLCBuaWwpCitYPTE7bGluZWVycm9yKChwKSwgMikKK1g9MjtsaW5lZXJyb3IoKHApLCAxKQorCisKK2lmIG5vdCBfc29mdCB0aGVuCisgIC0tIHNldmVyYWwgdGVzdHMgdGhhdCBleGF1c3QgdGhlIEx1YSBzdGFjaworICBjb2xsZWN0Z2FyYmFnZSgpCisgIHByaW50InRlc3Rpbmcgc3RhY2sgb3ZlcmZsb3ciCisgIEMgPSAwCisgIGxvY2FsIGwgPSBkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmU7IGZ1bmN0aW9uIHkgKCkgQz1DKzE7IHkoKSBlbmQKKworICBsb2NhbCBmdW5jdGlvbiBjaGVja3N0YWNrbWVzc2FnZSAobSkKKyAgICByZXR1cm4gKHN0cmluZy5maW5kKG0sICJzdGFjayBvdmVyZmxvdyIpKQorICBlbmQKKyAgLS0gcmVwZWF0ZWQgc3RhY2sgb3ZlcmZsb3dzICh0byBjaGVjayBzdGFjayByZWNvdmVyeSkKKyAgYXNzZXJ0KGNoZWNrc3RhY2ttZXNzYWdlKGRvaXQoJ3koKScpKSkKKyAgcHJpbnQoJysnKQorICBhc3NlcnQoY2hlY2tzdGFja21lc3NhZ2UoZG9pdCgneSgpJykpKQorICBwcmludCgnKycpCisgIGFzc2VydChjaGVja3N0YWNrbWVzc2FnZShkb2l0KCd5KCknKSkpCisgIHByaW50KCcrJykKKworCisgIC0tIGVycm9yIGxpbmVzIGluIHN0YWNrIG92ZXJmbG93CisgIEMgPSAwCisgIGxvY2FsIGwxCisgIGxvY2FsIGZ1bmN0aW9uIGcoeCkKKyAgICBsMSA9IGRlYnVnLmdldGluZm8oeCwgImwiKS5jdXJyZW50bGluZTsgeSgpCisgIGVuZAorICBsb2NhbCBfLCBzdGFja21zZyA9IHhwY2FsbChnLCBkZWJ1Zy50cmFjZWJhY2ssIDEpCisgIHByaW50KCcrJykKKyAgbG9jYWwgc3RhY2sgPSB7fQorICBmb3IgbGluZSBpbiBzdHJpbmcuZ21hdGNoKHN0YWNrbXNnLCAiW15cbl0qIikgZG8KKyAgICBsb2NhbCBjdXJyID0gc3RyaW5nLm1hdGNoKGxpbmUsICI6KCVkKyk6IikKKyAgICBpZiBjdXJyIHRoZW4gdGFibGUuaW5zZXJ0KHN0YWNrLCB0b251bWJlcihjdXJyKSkgZW5kCisgIGVuZAorICBsb2NhbCBpPTEKKyAgd2hpbGUgc3RhY2tbaV0gfj0gbDEgZG8KKyAgICBhc3NlcnQoc3RhY2tbaV0gPT0gbCkKKyAgICBpID0gaSsxCisgIGVuZAorICBhc3NlcnQoaSA+IDE1KQorCisKKyAgLS0gZXJyb3IgaW4gZXJyb3IgaGFuZGxpbmcKKyAgbG9jYWwgcmVzLCBtc2cgPSB4cGNhbGwoZXJyb3IsIGVycm9yKQorICBhc3NlcnQobm90IHJlcyBhbmQgdHlwZShtc2cpID09ICdzdHJpbmcnKQorICBwcmludCgnKycpCisKKyAgbG9jYWwgZnVuY3Rpb24gZiAoeCkKKyAgICBpZiB4PT0wIHRoZW4gZXJyb3IoJ2FcbicpCisgICAgZWxzZQorICAgICAgbG9jYWwgYXV4ID0gZnVuY3Rpb24gKCkgcmV0dXJuIGYoeC0xKSBlbmQKKyAgICAgIGxvY2FsIGEsYiA9IHhwY2FsbChhdXgsIGF1eCkKKyAgICAgIHJldHVybiBhLGIKKyAgICBlbmQKKyAgZW5kCisgIGYoMykKKworICBsb2NhbCBmdW5jdGlvbiBsb29wICh4LHkseikgcmV0dXJuIDEgKyBsb29wKHgsIHksIHopIGVuZAorIAorICBsb2NhbCByZXMsIG1zZyA9IHhwY2FsbChsb29wLCBmdW5jdGlvbiAobSkKKyAgICBhc3NlcnQoc3RyaW5nLmZpbmQobSwgInN0YWNrIG92ZXJmbG93IikpCisgICAgY2hlY2tlcnIoImVycm9yIGhhbmRsaW5nIiwgbG9vcCkKKyAgICBhc3NlcnQobWF0aC5zaW4oMCkgPT0gMCkKKyAgICByZXR1cm4gMTUKKyAgZW5kKQorICBhc3NlcnQobXNnID09IDE1KQorCisgIGxvY2FsIGYgPSBmdW5jdGlvbiAoKQorICAgIGZvciBpID0gOTk5OTAwLCAxMDAwMDAwLCAxIGRvIHRhYmxlLnVucGFjayh7fSwgMSwgaSkgZW5kCisgIGVuZAorICBjaGVja2VycigidG9vIG1hbnkgcmVzdWx0cyIsIGYpCisKK2VuZAorCisKK2RvCisgIC0tIG5vbiBzdHJpbmcgbWVzc2FnZXMKKyAgbG9jYWwgdCA9IHt9CisgIGxvY2FsIHJlcywgbXNnID0gcGNhbGwoZnVuY3Rpb24gKCkgZXJyb3IodCkgZW5kKQorICBhc3NlcnQobm90IHJlcyBhbmQgbXNnID09IHQpCisKKyAgcmVzLCBtc2cgPSBwY2FsbChmdW5jdGlvbiAoKSBlcnJvcihuaWwpIGVuZCkKKyAgYXNzZXJ0KG5vdCByZXMgYW5kIG1zZyA9PSBuaWwpCisKKyAgbG9jYWwgZnVuY3Rpb24gZigpIGVycm9ye21zZz0neCd9IGVuZAorICByZXMsIG1zZyA9IHhwY2FsbChmLCBmdW5jdGlvbiAocikgcmV0dXJuIHttc2c9ci5tc2cuLid5J30gZW5kKQorICBhc3NlcnQobXNnLm1zZyA9PSAneHknKQorCisgIC0tICdhc3NlcnQnIHdpdGggZXh0cmEgYXJndW1lbnRzCisgIHJlcywgbXNnID0gcGNhbGwoYXNzZXJ0LCBmYWxzZSwgIlgiLCB0KQorICBhc3NlcnQobm90IHJlcyBhbmQgbXNnID09ICJYIikKKyAKKyAgLS0gJ2Fzc2VydCcgd2l0aCBubyBtZXNzYWdlCisgIHJlcywgbXNnID0gcGNhbGwoZnVuY3Rpb24gKCkgYXNzZXJ0KGZhbHNlKSBlbmQpCisgIGxvY2FsIGxpbmUgPSBzdHJpbmcubWF0Y2gobXNnLCAiJXcrJS5sdWE6KCVkKyk6IGFzc2VydGlvbiBmYWlsZWQhJCIpCisgIGFzc2VydCh0b251bWJlcihsaW5lKSA9PSBkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgLSAyKQorCisgIC0tICdhc3NlcnQnIHdpdGggbm9uLXN0cmluZyBtZXNzYWdlcworICByZXMsIG1zZyA9IHBjYWxsKGFzc2VydCwgZmFsc2UsIHQpCisgIGFzc2VydChub3QgcmVzIGFuZCBtc2cgPT0gdCkKKworICByZXMsIG1zZyA9IHBjYWxsKGFzc2VydCwgbmlsLCBuaWwpCisgIGFzc2VydChub3QgcmVzIGFuZCBtc2cgPT0gbmlsKQorCisgIC0tICdhc3NlcnQnIHdpdGhvdXQgYXJndW1lbnRzCisgIHJlcywgbXNnID0gcGNhbGwoYXNzZXJ0KQorICBhc3NlcnQobm90IHJlcyBhbmQgc3RyaW5nLmZpbmQobXNnLCAidmFsdWUgZXhwZWN0ZWQiKSkKK2VuZAorCistLSB4cGNhbGwgd2l0aCBhcmd1bWVudHMKK2EsIGIsIGMgPSB4cGNhbGwoc3RyaW5nLmZpbmQsIGVycm9yLCAiYWxvIiwgImFsIikKK2Fzc2VydChhIGFuZCBiID09IDEgYW5kIGMgPT0gMikKK2EsIGIsIGMgPSB4cGNhbGwoc3RyaW5nLmZpbmQsIGZ1bmN0aW9uICh4KSByZXR1cm4ge30gZW5kLCB0cnVlLCAiYWwiKQorYXNzZXJ0KG5vdCBhIGFuZCB0eXBlKGIpID09ICJ0YWJsZSIgYW5kIGMgPT0gbmlsKQorCisKK3ByaW50KCJ0ZXN0aW5nIHRva2VucyBpbiBlcnJvciBtZXNzYWdlcyIpCitjaGVja3N5bnRheCgic3ludGF4IGVycm9yIiwgIiIsICJlcnJvciIsIDEpCitjaGVja3N5bnRheCgiMS4wMDAiLCAiIiwgIjEuMDAwIiwgMSkKK2NoZWNrc3ludGF4KCJbW2FdXSIsICIiLCAiW1thXV0iLCAxKQorY2hlY2tzeW50YXgoIidhYSciLCAiIiwgIidhYSciLCAxKQorY2hlY2tzeW50YXgoIndoaWxlIDw8IGRvIGVuZCIsICIiLCAiPDwiLCAxKQorY2hlY2tzeW50YXgoImZvciA+PiBkbyBlbmQiLCAiIiwgIj4+IiwgMSkKKworLS0gdGVzdCBpbnZhbGlkIG5vbi1wcmludGFibGUgY2hhciBpbiBhIGNodW5rCitjaGVja3N5bnRheCgiYVwxYSA9IDEiLCAiIiwgIjxcXDE+IiwgMSkKKworLS0gdGVzdCAyNTUgYXMgZmlyc3QgY2hhciBpbiBhIGNodW5rCitjaGVja3N5bnRheCgiXDI1NWEgPSAxIiwgIiIsICI8XFwyNTU+IiwgMSkKKworZG9pdCgnSSA9IGxvYWQoImE9OSsiKTsgYT0zJykKK2Fzc2VydChhPT0zIGFuZCBJID09IG5pbCkKK3ByaW50KCcrJykKKworbGltID0gMTAwMAoraWYgX3NvZnQgdGhlbiBsaW0gPSAxMDAgZW5kCitmb3IgaT0xLGxpbSBkbworICBkb2l0KCdhID0gJykKKyAgZG9pdCgnYSA9IDQrbmlsJykKK2VuZAorCisKKy0tIHRlc3Rpbmcgc3ludGF4IGxpbWl0cworCitsb2NhbCBmdW5jdGlvbiB0ZXN0cmVwIChpbml0LCByZXAsIGNsb3NlLCByZXBjKQorICBsb2NhbCBzID0gaW5pdCAuLiBzdHJpbmcucmVwKHJlcCwgMTAwKSAuLiBjbG9zZSAuLiBzdHJpbmcucmVwKHJlcGMsIDEwMCkKKyAgYXNzZXJ0KGxvYWQocykpICAgLS0gMTAwIGxldmVscyBpcyBPSworICBzID0gaW5pdCAuLiBzdHJpbmcucmVwKHJlcCwgMTAwMDApCisgIGxvY2FsIHJlcywgbXNnID0gbG9hZChzKSAgIC0tIDEwMDAwIGxldmVscyBub3Qgb2sKKyAgYXNzZXJ0KG5vdCByZXMgYW5kIChzdHJpbmcuZmluZChtc2csICJ0b28gbWFueSByZWdpc3RlcnMiKSBvcgorICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5maW5kKG1zZywgInN0YWNrIG92ZXJmbG93IikpKQorZW5kCisKK3Rlc3RyZXAoImxvY2FsIGE7IGEiLCAiLGEiLCAiPSAxIiwgIiwxIikgICAgLS0gbXVsdGlwbGUgYXNzaWdubWVudAordGVzdHJlcCgibG9jYWwgYTsgYT0iLCAieyIsICIwIiwgIn0iKQordGVzdHJlcCgibG9jYWwgYTsgYT0iLCAiKCIsICIyIiwgIikiKQordGVzdHJlcCgibG9jYWwgYTsgIiwgImEoIiwgIjIiLCAiKSIpCit0ZXN0cmVwKCIiLCAiZG8gIiwgIiIsICIgZW5kIikKK3Rlc3RyZXAoIiIsICJ3aGlsZSBhIGRvICIsICIiLCAiIGVuZCIpCit0ZXN0cmVwKCJsb2NhbCBhOyAiLCAiaWYgYSB0aGVuIGVsc2UgIiwgIiIsICIgZW5kIikKK3Rlc3RyZXAoIiIsICJmdW5jdGlvbiBmb28gKCkgIiwgIiIsICIgZW5kIikKK3Rlc3RyZXAoImxvY2FsIGE7IGE9IiwgImEuLiIsICJhIiwgIiIpCit0ZXN0cmVwKCJsb2NhbCBhOyBhPSIsICJhXiIsICJhIiwgIiIpCisKK2NoZWNrbWVzc2FnZSgiYSA9IGYoeCIgLi4gc3RyaW5nLnJlcCgiLHgiLCAyNjApIC4uICIpIiwgInRvbyBtYW55IHJlZ2lzdGVycyIpCisKKworLS0gdGVzdGluZyBvdGhlciBsaW1pdHMKKworLS0gdXB2YWx1ZXMKK2xvY2FsIGxpbSA9IDEyNworbG9jYWwgIHMgPSAibG9jYWwgZnVuY3Rpb24gZm9vQSAoKVxuICBsb2NhbCAiCitmb3IgaiA9IDEsbGltIGRvCisgIHMgPSBzLi4iYSIuLmouLiIsICIKK2VuZAorcyA9IHMuLiJiLGNcbiIKK3MgPSBzLi4ibG9jYWwgZnVuY3Rpb24gZm9vQiAoKVxuICBsb2NhbCAiCitmb3IgaiA9IDEsbGltIGRvCisgIHMgPSBzLi4iYiIuLmouLiIsICIKK2VuZAorcyA9IHMuLiJiXG4iCitzID0gcy4uImZ1bmN0aW9uIGZvb0MgKCkgcmV0dXJuIGIrYyIKK2xvY2FsIGMgPSAxKzIKK2ZvciBqID0gMSxsaW0gZG8KKyAgcyA9IHMuLiIrYSIuLmouLiIrYiIuLmoKKyAgYyA9IGMgKyAyCitlbmQKK3MgPSBzLi4iXG5lbmQgIGVuZCBlbmQiCitsb2NhbCBhLGIgPSBsb2FkKHMpCithc3NlcnQoYyA+IDI1NSBhbmQgc3RyaW5nLmZpbmQoYiwgInRvbyBtYW55IHVwdmFsdWVzIikgYW5kCisgICAgICAgc3RyaW5nLmZpbmQoYiwgImxpbmUgNSIpKQorCistLSBsb2NhbCB2YXJpYWJsZXMKK3MgPSAiXG5mdW5jdGlvbiBmb28gKClcbiAgbG9jYWwgIgorZm9yIGogPSAxLDMwMCBkbworICBzID0gcy4uImEiLi5qLi4iLCAiCitlbmQKK3MgPSBzLi4iYlxuIgorbG9jYWwgYSxiID0gbG9hZChzKQorYXNzZXJ0KHN0cmluZy5maW5kKGIsICJsaW5lIDIiKSBhbmQgc3RyaW5nLmZpbmQoYiwgInRvbyBtYW55IGxvY2FsIHZhcmlhYmxlcyIpKQorCittdC5fX2luZGV4ID0gb2xkbW0KKworcHJpbnQoJ09LJykKZGlmZiAtLWdpdCBhL3Rlc3Rlcy9ldmVudHMubHVhIGIvdGVzdGVzL2V2ZW50cy5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwNjRkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9ldmVudHMubHVhCkBAIC0wLDAgKzEsNDc2IEBACistLSAkSWQ6IGV2ZW50cy5sdWEsdiAxLjUyIDIwMTgvMDMvMTIgMTM6NTE6MDIgcm9iZXJ0byBFeHAgJAorLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCisKK3ByaW50KCd0ZXN0aW5nIG1ldGF0YWJsZXMnKQorCitsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUnZGVidWcnCisKK1ggPSAyMDsgQiA9IDMwCisKK19FTlYgPSBzZXRtZXRhdGFibGUoe30sIHtfX2luZGV4PV9HfSkKKworY29sbGVjdGdhcmJhZ2UoKQorCitYID0gWCsxMAorYXNzZXJ0KFggPT0gMzAgYW5kIF9HLlggPT0gMjApCitCID0gZmFsc2UKK2Fzc2VydChCID09IGZhbHNlKQorX0VOVlsiQiJdID0gdW5kZWYKK2Fzc2VydChCID09IDMwKQorCithc3NlcnQoZ2V0bWV0YXRhYmxle30gPT0gbmlsKQorYXNzZXJ0KGdldG1ldGF0YWJsZSg0KSA9PSBuaWwpCithc3NlcnQoZ2V0bWV0YXRhYmxlKG5pbCkgPT0gbmlsKQorYT17bmFtZSA9ICJOQU1FIn07IHNldG1ldGF0YWJsZShhLCB7X19tZXRhdGFibGUgPSAieHV4dSIsCisgICAgICAgICAgICAgICAgICAgIF9fdG9zdHJpbmc9ZnVuY3Rpb24oeCkgcmV0dXJuIHgubmFtZSBlbmR9KQorYXNzZXJ0KGdldG1ldGF0YWJsZShhKSA9PSAieHV4dSIpCithc3NlcnQodG9zdHJpbmcoYSkgPT0gIk5BTUUiKQorLS0gY2Fubm90IGNoYW5nZSBhIHByb3RlY3RlZCBtZXRhdGFibGUKK2Fzc2VydChwY2FsbChzZXRtZXRhdGFibGUsIGEsIHt9KSA9PSBmYWxzZSkKK2EubmFtZSA9ICJnb3Jvcm9iYSIKK2Fzc2VydCh0b3N0cmluZyhhKSA9PSAiZ29yb3JvYmEiKQorCitsb2NhbCBhLCB0ID0gezEwLDIwLDMwOyB4PSIxMCIsIHk9IjIwIn0sIHt9Cithc3NlcnQoc2V0bWV0YXRhYmxlKGEsdCkgPT0gYSkKK2Fzc2VydChnZXRtZXRhdGFibGUoYSkgPT0gdCkKK2Fzc2VydChzZXRtZXRhdGFibGUoYSxuaWwpID09IGEpCithc3NlcnQoZ2V0bWV0YXRhYmxlKGEpID09IG5pbCkKK2Fzc2VydChzZXRtZXRhdGFibGUoYSx0KSA9PSBhKQorCisKK2Z1bmN0aW9uIGYgKHQsIGksIGUpCisgIGFzc2VydChub3QgZSkKKyAgbG9jYWwgcCA9IHJhd2dldCh0LCAicGFyZW50IikKKyAgcmV0dXJuIChwIGFuZCBwW2ldKzMpLCAiZHVtbXkgcmV0dXJuIgorZW5kCisKK3QuX19pbmRleCA9IGYKKworYS5wYXJlbnQgPSB7ej0yNSwgeD0xMiwgWzRdID0gMjR9Cithc3NlcnQoYVsxXSA9PSAxMCBhbmQgYS56ID09IDI4IGFuZCBhWzRdID09IDI3IGFuZCBhLnggPT0gIjEwIikKKworY29sbGVjdGdhcmJhZ2UoKQorCithID0gc2V0bWV0YXRhYmxlKHt9LCB0KQorZnVuY3Rpb24gZih0LCBpLCB2KSByYXdzZXQodCwgaSwgdi0zKSBlbmQKK3NldG1ldGF0YWJsZSh0LCB0KSAgIC0tIGNhdXNlcyBhIGJ1ZyBpbiA1LjEgIQordC5fX25ld2luZGV4ID0gZgorYVsxXSA9IDMwOyBhLnggPSAiMTAxIjsgYVs1XSA9IDIwMAorYXNzZXJ0KGFbMV0gPT0gMjcgYW5kIGEueCA9PSA5OCBhbmQgYVs1XSA9PSAxOTcpCisKK2RvICAgIC0tIGJ1ZyBpbiBMdWEgNS4zLjIKKyAgbG9jYWwgbXQgPSB7fQorICBtdC5fX25ld2luZGV4ID0gbXQKKyAgbG9jYWwgdCA9IHNldG1ldGF0YWJsZSh7fSwgbXQpCisgIHRbMV0gPSAxMCAgICAgLS0gd2lsbCBzZWdmYXVsdCBvbiBzb21lIG1hY2hpbmVzCisgIGFzc2VydChtdFsxXSA9PSAxMCkKK2VuZAorCisKK2xvY2FsIGMgPSB7fQorYSA9IHNldG1ldGF0YWJsZSh7fSwgdCkKK3QuX19uZXdpbmRleCA9IGMKK3QuX19pbmRleCA9IGMKK2FbMV0gPSAxMDsgYVsyXSA9IDIwOyBhWzNdID0gOTA7Citmb3IgaSA9IDQsIDIwIGRvIGFbaV0gPSBpICogMTAgZW5kCithc3NlcnQoYVsxXSA9PSAxMCBhbmQgYVsyXSA9PSAyMCBhbmQgYVszXSA9PSA5MCkKK2ZvciBpID0gNCwgMjAgZG8gYXNzZXJ0KGFbaV0gPT0gaSAqIDEwKSBlbmQKK2Fzc2VydChuZXh0KGEpID09IG5pbCkKKworCitkbworICBsb2NhbCBhOworICBhID0gc2V0bWV0YXRhYmxlKHt9LCB7X19pbmRleCA9IHNldG1ldGF0YWJsZSh7fSwKKyAgICAgICAgICAgICAgICAgICAgIHtfX2luZGV4ID0gc2V0bWV0YXRhYmxlKHt9LAorICAgICAgICAgICAgICAgICAgICAge19faW5kZXggPSBmdW5jdGlvbiAoXyxuKSByZXR1cm4gYVtuLTNdKzQsICJsaXhvIiBlbmR9KX0pfSkKKyAgYVswXSA9IDIwCisgIGZvciBpPTAsMTAgZG8KKyAgICBhc3NlcnQoYVtpKjNdID09IDIwICsgaSo0KQorICBlbmQKK2VuZAorCisKK2RvICAtLSBuZXdpbmRleAorICBsb2NhbCBmb2kKKyAgbG9jYWwgYSA9IHt9CisgIGZvciBpPTEsMTAgZG8gYVtpXSA9IDA7IGFbJ2EnLi5pXSA9IDA7IGVuZAorICBzZXRtZXRhdGFibGUoYSwge19fbmV3aW5kZXggPSBmdW5jdGlvbiAodCxrLHYpIGZvaT10cnVlOyByYXdzZXQodCxrLHYpIGVuZH0pCisgIGZvaSA9IGZhbHNlOyBhWzFdPTA7IGFzc2VydChub3QgZm9pKQorICBmb2kgPSBmYWxzZTsgYVsnYTEnXT0wOyBhc3NlcnQobm90IGZvaSkKKyAgZm9pID0gZmFsc2U7IGFbJ2ExMSddPTA7IGFzc2VydChmb2kpCisgIGZvaSA9IGZhbHNlOyBhWzExXT0wOyBhc3NlcnQoZm9pKQorICBmb2kgPSBmYWxzZTsgYVsxXT11bmRlZjsgYXNzZXJ0KG5vdCBmb2kpCisgIGFbMV0gPSB1bmRlZgorICBmb2kgPSBmYWxzZTsgYVsxXT1uaWw7IGFzc2VydChmb2kpCitlbmQKKworCitzZXRtZXRhdGFibGUodCwgbmlsKQorZnVuY3Rpb24gZiAodCwgLi4uKSByZXR1cm4gdCwgey4uLn0gZW5kCit0Ll9fY2FsbCA9IGYKKworZG8KKyAgbG9jYWwgeCx5ID0gYSh0YWJsZS51bnBhY2t7J2EnLCAxfSkKKyAgYXNzZXJ0KHg9PWEgYW5kIHlbMV09PSdhJyBhbmQgeVsyXT09MSBhbmQgeVszXT09dW5kZWYpCisgIHgseSA9IGEoKQorICBhc3NlcnQoeD09YSBhbmQgeVsxXT09dW5kZWYpCitlbmQKKworCitsb2NhbCBiID0gc2V0bWV0YXRhYmxlKHt9LCB0KQorc2V0bWV0YXRhYmxlKGIsdCkKKworZnVuY3Rpb24gZihvcCkKKyAgcmV0dXJuIGZ1bmN0aW9uICguLi4pIGNhcCA9IHtbMF0gPSBvcCwgLi4ufSA7IHJldHVybiAoLi4uKSBlbmQKK2VuZAordC5fX2FkZCA9IGYoImFkZCIpCit0Ll9fc3ViID0gZigic3ViIikKK3QuX19tdWwgPSBmKCJtdWwiKQordC5fX2RpdiA9IGYoImRpdiIpCit0Ll9faWRpdiA9IGYoImlkaXYiKQordC5fX21vZCA9IGYoIm1vZCIpCit0Ll9fdW5tID0gZigidW5tIikKK3QuX19wb3cgPSBmKCJwb3ciKQordC5fX2xlbiA9IGYoImxlbiIpCit0Ll9fYmFuZCA9IGYoImJhbmQiKQordC5fX2JvciA9IGYoImJvciIpCit0Ll9fYnhvciA9IGYoImJ4b3IiKQordC5fX3NobCA9IGYoInNobCIpCit0Ll9fc2hyID0gZigic2hyIikKK3QuX19ibm90ID0gZigiYm5vdCIpCisKKy0tIFNvbWUgdGVzdHMgYXJlIGRvbmUgaW5zaWRlIHNtYWxsIGFub255bW91cyBmdW5jdGlvbnMgdG8gZW5zdXJlCistLSB0aGF0IGNvbnN0YW50cyBnbyB0byBjb25zdGFudCB0YWJsZSBldmVuIGluIGRlYnVnIGNvbXBpbGF0aW9uLAorLS0gd2hlbiB0aGUgY29uc3RhbnQgdGFibGUgaXMgdmVyeSBzbWFsbC4KK2Fzc2VydChiKzUgPT0gYikKK2Fzc2VydChjYXBbMF0gPT0gImFkZCIgYW5kIGNhcFsxXSA9PSBiIGFuZCBjYXBbMl0gPT0gNSBhbmQgY2FwWzNdPT11bmRlZikKK2Fzc2VydChiKyc1JyA9PSBiKQorYXNzZXJ0KGNhcFswXSA9PSAiYWRkIiBhbmQgY2FwWzFdID09IGIgYW5kIGNhcFsyXSA9PSAnNScgYW5kIGNhcFszXT09dW5kZWYpCithc3NlcnQoNStiID09IDUpCithc3NlcnQoY2FwWzBdID09ICJhZGQiIGFuZCBjYXBbMV0gPT0gNSBhbmQgY2FwWzJdID09IGIgYW5kIGNhcFszXT09dW5kZWYpCithc3NlcnQoJzUnK2IgPT0gJzUnKQorYXNzZXJ0KGNhcFswXSA9PSAiYWRkIiBhbmQgY2FwWzFdID09ICc1JyBhbmQgY2FwWzJdID09IGIgYW5kIGNhcFszXT09dW5kZWYpCitiPWItMzsgYXNzZXJ0KGdldG1ldGF0YWJsZShiKSA9PSB0KQorYXNzZXJ0KGNhcFswXSA9PSAic3ViIiBhbmQgY2FwWzFdID09IGIgYW5kIGNhcFsyXSA9PSAzIGFuZCBjYXBbM109PXVuZGVmKQorYXNzZXJ0KDUtYSA9PSA1KQorYXNzZXJ0KGNhcFswXSA9PSAic3ViIiBhbmQgY2FwWzFdID09IDUgYW5kIGNhcFsyXSA9PSBhIGFuZCBjYXBbM109PXVuZGVmKQorYXNzZXJ0KCc1Jy1hID09ICc1JykKK2Fzc2VydChjYXBbMF0gPT0gInN1YiIgYW5kIGNhcFsxXSA9PSAnNScgYW5kIGNhcFsyXSA9PSBhIGFuZCBjYXBbM109PXVuZGVmKQorYXNzZXJ0KGEqYSA9PSBhKQorYXNzZXJ0KGNhcFswXSA9PSAibXVsIiBhbmQgY2FwWzFdID09IGEgYW5kIGNhcFsyXSA9PSBhIGFuZCBjYXBbM109PXVuZGVmKQorYXNzZXJ0KGEvMCA9PSBhKQorYXNzZXJ0KGNhcFswXSA9PSAiZGl2IiBhbmQgY2FwWzFdID09IGEgYW5kIGNhcFsyXSA9PSAwIGFuZCBjYXBbM109PXVuZGVmKQorYXNzZXJ0KGElMiA9PSBhKQorYXNzZXJ0KGNhcFswXSA9PSAibW9kIiBhbmQgY2FwWzFdID09IGEgYW5kIGNhcFsyXSA9PSAyIGFuZCBjYXBbM109PXVuZGVmKQorYXNzZXJ0KGEgLy8gKDEvMCkgPT0gYSkKK2Fzc2VydChjYXBbMF0gPT0gImlkaXYiIGFuZCBjYXBbMV0gPT0gYSBhbmQgY2FwWzJdID09IDEvMCBhbmQgY2FwWzNdPT11bmRlZikKKzsoZnVuY3Rpb24gKCkgYXNzZXJ0KGEgJiAiaGkiID09IGEpIGVuZCkoKQorYXNzZXJ0KGNhcFswXSA9PSAiYmFuZCIgYW5kIGNhcFsxXSA9PSBhIGFuZCBjYXBbMl0gPT0gImhpIiBhbmQgY2FwWzNdPT11bmRlZikKKzsoZnVuY3Rpb24gKCkgYXNzZXJ0KDEwICYgYSAgPT0gMTApIGVuZCkoKQorYXNzZXJ0KGNhcFswXSA9PSAiYmFuZCIgYW5kIGNhcFsxXSA9PSAxMCBhbmQgY2FwWzJdID09IGEgYW5kIGNhcFszXT09dW5kZWYpCis7KGZ1bmN0aW9uICgpIGFzc2VydChhIHwgMTAgID09IGEpIGVuZCkoKQorYXNzZXJ0KGNhcFswXSA9PSAiYm9yIiBhbmQgY2FwWzFdID09IGEgYW5kIGNhcFsyXSA9PSAxMCBhbmQgY2FwWzNdPT11bmRlZikKK2Fzc2VydChhIHwgImhpIiA9PSBhKQorYXNzZXJ0KGNhcFswXSA9PSAiYm9yIiBhbmQgY2FwWzFdID09IGEgYW5kIGNhcFsyXSA9PSAiaGkiIGFuZCBjYXBbM109PXVuZGVmKQorYXNzZXJ0KCJoaSIgfiBhID09ICJoaSIpCithc3NlcnQoY2FwWzBdID09ICJieG9yIiBhbmQgY2FwWzFdID09ICJoaSIgYW5kIGNhcFsyXSA9PSBhIGFuZCBjYXBbM109PXVuZGVmKQorOyhmdW5jdGlvbiAoKSBhc3NlcnQoMTAgfiBhID09IDEwKSBlbmQpKCkKK2Fzc2VydChjYXBbMF0gPT0gImJ4b3IiIGFuZCBjYXBbMV0gPT0gMTAgYW5kIGNhcFsyXSA9PSBhIGFuZCBjYXBbM109PXVuZGVmKQorYXNzZXJ0KC1hID09IGEpCithc3NlcnQoY2FwWzBdID09ICJ1bm0iIGFuZCBjYXBbMV0gPT0gYSkKK2Fzc2VydChhXjQgPT0gYSkKK2Fzc2VydChjYXBbMF0gPT0gInBvdyIgYW5kIGNhcFsxXSA9PSBhIGFuZCBjYXBbMl0gPT0gNCBhbmQgY2FwWzNdPT11bmRlZikKK2Fzc2VydChhXic0JyA9PSBhKQorYXNzZXJ0KGNhcFswXSA9PSAicG93IiBhbmQgY2FwWzFdID09IGEgYW5kIGNhcFsyXSA9PSAnNCcgYW5kIGNhcFszXT09dW5kZWYpCithc3NlcnQoNF5hID09IDQpCithc3NlcnQoY2FwWzBdID09ICJwb3ciIGFuZCBjYXBbMV0gPT0gNCBhbmQgY2FwWzJdID09IGEgYW5kIGNhcFszXT09dW5kZWYpCithc3NlcnQoJzQnXmEgPT0gJzQnKQorYXNzZXJ0KGNhcFswXSA9PSAicG93IiBhbmQgY2FwWzFdID09ICc0JyBhbmQgY2FwWzJdID09IGEgYW5kIGNhcFszXT09dW5kZWYpCithc3NlcnQoI2EgPT0gYSkKK2Fzc2VydChjYXBbMF0gPT0gImxlbiIgYW5kIGNhcFsxXSA9PSBhKQorYXNzZXJ0KH5hID09IGEpCithc3NlcnQoY2FwWzBdID09ICJibm90IiBhbmQgY2FwWzFdID09IGEpCithc3NlcnQoYSA8PCAzID09IGEpCithc3NlcnQoY2FwWzBdID09ICJzaGwiIGFuZCBjYXBbMV0gPT0gYSBhbmQgY2FwWzJdID09IDMpCithc3NlcnQoMS41ID4+IGEgPT0gMS41KQorYXNzZXJ0KGNhcFswXSA9PSAic2hyIiBhbmQgY2FwWzFdID09IDEuNSBhbmQgY2FwWzJdID09IGEpCisKKworLS0gdGVzdCBmb3IgcmF3bGVuCit0ID0gc2V0bWV0YXRhYmxlKHsxLDIsM30sIHtfX2xlbiA9IGZ1bmN0aW9uICgpIHJldHVybiAxMCBlbmR9KQorYXNzZXJ0KCN0ID09IDEwIGFuZCByYXdsZW4odCkgPT0gMykKK2Fzc2VydChyYXdsZW4iYWJjIiA9PSAzKQorYXNzZXJ0KG5vdCBwY2FsbChyYXdsZW4sIGlvLnN0ZGluKSkKK2Fzc2VydChub3QgcGNhbGwocmF3bGVuLCAzNCkpCithc3NlcnQobm90IHBjYWxsKHJhd2xlbikpCisKKy0tIHJhd2xlbiBmb3IgbG9uZyBzdHJpbmdzCithc3NlcnQocmF3bGVuKHN0cmluZy5yZXAoJ2EnLCAxMDAwKSkgPT0gMTAwMCkKKworCit0ID0ge30KK3QuX19sdCA9IGZ1bmN0aW9uIChhLGIsYykKKyAgY29sbGVjdGdhcmJhZ2UoKQorICBhc3NlcnQoYyA9PSBuaWwpCisgIGlmIHR5cGUoYSkgPT0gJ3RhYmxlJyB0aGVuIGEgPSBhLnggZW5kCisgIGlmIHR5cGUoYikgPT0gJ3RhYmxlJyB0aGVuIGIgPSBiLnggZW5kCisgcmV0dXJuIGE8YiwgImR1bW15IgorZW5kCisKK2Z1bmN0aW9uIE9wKHgpIHJldHVybiBzZXRtZXRhdGFibGUoe3g9eH0sIHQpIGVuZAorCitsb2NhbCBmdW5jdGlvbiB0ZXN0ICgpCisgIGFzc2VydChub3QoT3AoMSk8T3AoMSkpIGFuZCAoT3AoMSk8T3AoMikpIGFuZCBub3QoT3AoMik8T3AoMSkpKQorICBhc3NlcnQobm90KDEgPCBPcCgxKSkgYW5kIChPcCgxKSA8IDIpIGFuZCBub3QoMiA8IE9wKDEpKSkKKyAgYXNzZXJ0KG5vdChPcCgnYScpPE9wKCdhJykpIGFuZCAoT3AoJ2EnKTxPcCgnYicpKSBhbmQgbm90KE9wKCdiJyk8T3AoJ2EnKSkpCisgIGFzc2VydChub3QoJ2EnIDwgT3AoJ2EnKSkgYW5kIChPcCgnYScpIDwgJ2InKSBhbmQgbm90KE9wKCdiJykgPCBPcCgnYScpKSkKKyAgYXNzZXJ0KChPcCgxKTw9T3AoMSkpIGFuZCAoT3AoMSk8PU9wKDIpKSBhbmQgbm90KE9wKDIpPD1PcCgxKSkpCisgIGFzc2VydCgoT3AoJ2EnKTw9T3AoJ2EnKSkgYW5kIChPcCgnYScpPD1PcCgnYicpKSBhbmQgbm90KE9wKCdiJyk8PU9wKCdhJykpKQorICBhc3NlcnQobm90KE9wKDEpPk9wKDEpKSBhbmQgbm90KE9wKDEpPk9wKDIpKSBhbmQgKE9wKDIpPk9wKDEpKSkKKyAgYXNzZXJ0KG5vdChPcCgnYScpPk9wKCdhJykpIGFuZCBub3QoT3AoJ2EnKT5PcCgnYicpKSBhbmQgKE9wKCdiJyk+T3AoJ2EnKSkpCisgIGFzc2VydCgoT3AoMSk+PU9wKDEpKSBhbmQgbm90KE9wKDEpPj1PcCgyKSkgYW5kIChPcCgyKT49T3AoMSkpKQorICBhc3NlcnQoKDEgPj0gT3AoMSkpIGFuZCBub3QoMSA+PSBPcCgyKSkgYW5kIChPcCgyKSA+PSAxKSkKKyAgYXNzZXJ0KChPcCgnYScpPj1PcCgnYScpKSBhbmQgbm90KE9wKCdhJyk+PU9wKCdiJykpIGFuZCAoT3AoJ2InKT49T3AoJ2EnKSkpCisgIGFzc2VydCgoJ2EnID49IE9wKCdhJykpIGFuZCBub3QoT3AoJ2EnKSA+PSAnYicpIGFuZCAoT3AoJ2InKSA+PSBPcCgnYScpKSkKK2VuZAorCit0ZXN0KCkKKwordC5fX2xlID0gZnVuY3Rpb24gKGEsYixjKQorICBhc3NlcnQoYyA9PSBuaWwpCisgIGlmIHR5cGUoYSkgPT0gJ3RhYmxlJyB0aGVuIGEgPSBhLnggZW5kCisgIGlmIHR5cGUoYikgPT0gJ3RhYmxlJyB0aGVuIGIgPSBiLnggZW5kCisgcmV0dXJuIGE8PWIsICJkdW1teSIKK2VuZAorCit0ZXN0KCkgIC0tIHJldGVzdCBjb21wYXJpc29ucywgbm93IHVzaW5nIGJvdGggYGx0JyBhbmQgYGxlJworCisKKy0tIHRlc3QgYHBhcnRpYWwgb3JkZXInCisKK2xvY2FsIGZ1bmN0aW9uIHJhd1NldCh4KQorICBsb2NhbCB5ID0ge30KKyAgZm9yIF8sayBpbiBwYWlycyh4KSBkbyB5W2tdID0gMSBlbmQKKyAgcmV0dXJuIHkKK2VuZAorCitsb2NhbCBmdW5jdGlvbiBTZXQoeCkKKyAgcmV0dXJuIHNldG1ldGF0YWJsZShyYXdTZXQoeCksIHQpCitlbmQKKwordC5fX2x0ID0gZnVuY3Rpb24gKGEsYikKKyAgZm9yIGsgaW4gcGFpcnMoYSkgZG8KKyAgICBpZiBub3QgYltrXSB0aGVuIHJldHVybiBmYWxzZSBlbmQKKyAgICBiW2tdID0gdW5kZWYKKyAgZW5kCisgIHJldHVybiBuZXh0KGIpIH49IG5pbAorZW5kCisKK3QuX19sZSA9IG5pbAorCithc3NlcnQoU2V0ezEsMiwzfSA8IFNldHsxLDIsMyw0fSkKK2Fzc2VydChub3QoU2V0ezEsMiwzLDR9IDwgU2V0ezEsMiwzLDR9KSkKK2Fzc2VydCgoU2V0ezEsMiwzLDR9IDw9IFNldHsxLDIsMyw0fSkpCithc3NlcnQoKFNldHsxLDIsMyw0fSA+PSBTZXR7MSwyLDMsNH0pKQorYXNzZXJ0KChTZXR7MSwzfSA8PSBTZXR7Myw1fSkpICAgLS0gd3JvbmchISBtb2RlbCBuZWVkcyBhIGBsZScgbWV0aG9kIDstKQorCit0Ll9fbGUgPSBmdW5jdGlvbiAoYSxiKQorICBmb3IgayBpbiBwYWlycyhhKSBkbworICAgIGlmIG5vdCBiW2tdIHRoZW4gcmV0dXJuIGZhbHNlIGVuZAorICBlbmQKKyAgcmV0dXJuIHRydWUKK2VuZAorCithc3NlcnQobm90IChTZXR7MSwzfSA8PSBTZXR7Myw1fSkpICAgLS0gbm93IGl0cyBPSyEKK2Fzc2VydChub3QoU2V0ezEsM30gPD0gU2V0ezMsNX0pKQorYXNzZXJ0KG5vdChTZXR7MSwzfSA+PSBTZXR7Myw1fSkpCisKK3QuX19lcSA9IGZ1bmN0aW9uIChhLGIpCisgIGZvciBrIGluIHBhaXJzKGEpIGRvCisgICAgaWYgbm90IGJba10gdGhlbiByZXR1cm4gZmFsc2UgZW5kCisgICAgYltrXSA9IHVuZGVmCisgIGVuZAorICByZXR1cm4gbmV4dChiKSA9PSBuaWwKK2VuZAorCitsb2NhbCBzID0gU2V0ezEsMyw1fQorYXNzZXJ0KHMgPT0gU2V0ezMsNSwxfSkKK2Fzc2VydChub3QgcmF3ZXF1YWwocywgU2V0ezMsNSwxfSkpCithc3NlcnQocmF3ZXF1YWwocywgcykpCithc3NlcnQoU2V0ezEsMyw1LDF9ID09IHJhd1NldHszLDUsMX0pCithc3NlcnQocmF3U2V0ezEsMyw1LDF9ID09IFNldHszLDUsMX0pCithc3NlcnQoU2V0ezEsMyw1fSB+PSBTZXR7Myw1LDEsNn0pCisKKy0tICdfX2VxJyBpcyBub3QgdXNlZCBmb3IgdGFibGUgYWNjZXNzZXMKK3RbU2V0ezEsMyw1fV0gPSAxCithc3NlcnQodFtTZXR7MSwzLDV9XSA9PSB1bmRlZikKKworCitpZiBub3QgVCB0aGVuCisgIChNZXNzYWdlIG9yIHByaW50KSgnXG4gPj4+IHRlc3RDIG5vdCBhY3RpdmU6IHNraXBwaW5nIHRlc3RzIGZvciBcegordXNlcmRhdGEgPDw8XG4nKQorZWxzZQorICBsb2NhbCB1MSA9IFQubmV3dXNlcmRhdGEoMCwgMSkKKyAgbG9jYWwgdTIgPSBULm5ld3VzZXJkYXRhKDAsIDEpCisgIGxvY2FsIHUzID0gVC5uZXd1c2VyZGF0YSgwLCAxKQorICBhc3NlcnQodTEgfj0gdTIgYW5kIHUxIH49IHUzKQorICBkZWJ1Zy5zZXR1c2VydmFsdWUodTEsIDEpOworICBkZWJ1Zy5zZXR1c2VydmFsdWUodTIsIDIpOworICBkZWJ1Zy5zZXR1c2VydmFsdWUodTMsIDEpOworICBkZWJ1Zy5zZXRtZXRhdGFibGUodTEsIHtfX2VxID0gZnVuY3Rpb24gKGEsIGIpCisgICAgcmV0dXJuIGRlYnVnLmdldHVzZXJ2YWx1ZShhKSA9PSBkZWJ1Zy5nZXR1c2VydmFsdWUoYikKKyAgZW5kfSkKKyAgZGVidWcuc2V0bWV0YXRhYmxlKHUyLCB7X19lcSA9IGZ1bmN0aW9uIChhLCBiKQorICAgIHJldHVybiB0cnVlCisgIGVuZH0pCisgIGFzc2VydCh1MSA9PSB1MyBhbmQgdTMgPT0gdTEgYW5kIHUxIH49IHUyKQorICBhc3NlcnQodTIgPT0gdTEgYW5kIHUyID09IHUzIGFuZCB1MyA9PSB1MikKKyAgYXNzZXJ0KHUyIH49IHt9KSAgIC0tIGRpZmZlcmVudCB0eXBlcyBjYW5ub3QgYmUgZXF1YWwKKworICBsb2NhbCBtaXJyb3IgPSB7fQorICBkZWJ1Zy5zZXRtZXRhdGFibGUodTMsIHtfX2luZGV4ID0gbWlycm9yLCBfX25ld2luZGV4ID0gbWlycm9yfSkKKyAgZm9yIGkgPSAxLCAxMCBkbyB1M1tpXSA9IGkgZW5kCisgIGZvciBpID0gMSwgMTAgZG8gYXNzZXJ0KHUzW2ldID09IGkpIGVuZAorZW5kCisKKwordC5fX2NvbmNhdCA9IGZ1bmN0aW9uIChhLGIsYykKKyAgYXNzZXJ0KGMgPT0gbmlsKQorICBpZiB0eXBlKGEpID09ICd0YWJsZScgdGhlbiBhID0gYS52YWwgZW5kCisgIGlmIHR5cGUoYikgPT0gJ3RhYmxlJyB0aGVuIGIgPSBiLnZhbCBlbmQKKyAgaWYgQSB0aGVuIHJldHVybiBhLi5iCisgIGVsc2UKKyAgICByZXR1cm4gc2V0bWV0YXRhYmxlKHt2YWw9YS4uYn0sIHQpCisgIGVuZAorZW5kCisKK2MgPSB7dmFsPSJjIn07IHNldG1ldGF0YWJsZShjLCB0KQorZCA9IHt2YWw9ImQifTsgc2V0bWV0YXRhYmxlKGQsIHQpCisKK0EgPSB0cnVlCithc3NlcnQoYy4uZCA9PSAnY2QnKQorYXNzZXJ0KDAgLi4iYSIuLiJiIi4uYy4uZC4uImUiLi4iZiIuLig1KzMpLi4iZyIgPT0gIjBhYmNkZWY4ZyIpCisKK0EgPSBmYWxzZQorYXNzZXJ0KChjLi5kLi5jLi5kKS52YWwgPT0gJ2NkY2QnKQoreCA9IGMuLmQKK2Fzc2VydChnZXRtZXRhdGFibGUoeCkgPT0gdCBhbmQgeC52YWwgPT0gJ2NkJykKK3ggPSAwIC4uImEiLi4iYiIuLmMuLmQuLiJlIi4uImYiLi4iZyIKK2Fzc2VydCh4LnZhbCA9PSAiMGFiY2RlZmciKQorCisKKy0tIGNvbmNhdCBtZXRhbWV0aG9kIHggbnVtYmVycyAoYnVnIGluIDUuMS4xKQorYyA9IHt9Citsb2NhbCB4CitzZXRtZXRhdGFibGUoYywge19fY29uY2F0ID0gZnVuY3Rpb24gKGEsYikKKyAgYXNzZXJ0KHR5cGUoYSkgPT0gIm51bWJlciIgYW5kIGIgPT0gYyBvciB0eXBlKGIpID09ICJudW1iZXIiIGFuZCBhID09IGMpCisgIHJldHVybiBjCitlbmR9KQorYXNzZXJ0KGMuLjUgPT0gYyBhbmQgNSAuLiBjID09IGMpCithc3NlcnQoNCAuLiBjIC4uIDUgPT0gYyBhbmQgNCAuLiA1IC4uIDYgLi4gNyAuLiBjID09IGMpCisKKworLS0gdGVzdCBjb21wYXJpc29uIGNvbXBhdGliaWxpdGllcworbG9jYWwgdDEsIHQyLCBjLCBkCit0MSA9IHt9OyAgYyA9IHt9OyBzZXRtZXRhdGFibGUoYywgdDEpCitkID0ge30KK3QxLl9fZXEgPSBmdW5jdGlvbiAoKSByZXR1cm4gdHJ1ZSBlbmQKK3QxLl9fbHQgPSBmdW5jdGlvbiAoKSByZXR1cm4gdHJ1ZSBlbmQKK3NldG1ldGF0YWJsZShkLCB0MSkKK2Fzc2VydChjID09IGQgYW5kIGMgPCBkIGFuZCBub3QoZCA8PSBjKSkKK3QyID0ge30KK3QyLl9fZXEgPSB0MS5fX2VxCit0Mi5fX2x0ID0gdDEuX19sdAorc2V0bWV0YXRhYmxlKGQsIHQyKQorYXNzZXJ0KGMgPT0gZCBhbmQgYyA8IGQgYW5kIG5vdChkIDw9IGMpKQorCisKKworLS0gdGVzdCBmb3Igc2V2ZXJhbCBsZXZlbHMgb2YgY2FsbHMKK2xvY2FsIGkKK2xvY2FsIHR0ID0geworICBfX2NhbGwgPSBmdW5jdGlvbiAodCwgLi4uKQorICAgIGkgPSBpKzEKKyAgICBpZiB0LmYgdGhlbiByZXR1cm4gdC5mKC4uLikKKyAgICBlbHNlIHJldHVybiB7Li4ufQorICAgIGVuZAorICBlbmQKK30KKworbG9jYWwgYSA9IHNldG1ldGF0YWJsZSh7fSwgdHQpCitsb2NhbCBiID0gc2V0bWV0YXRhYmxlKHtmPWF9LCB0dCkKK2xvY2FsIGMgPSBzZXRtZXRhdGFibGUoe2Y9Yn0sIHR0KQorCitpID0gMAoreCA9IGMoMyw0LDUpCithc3NlcnQoaSA9PSAzIGFuZCB4WzFdID09IDMgYW5kIHhbM10gPT0gNSkKKworCithc3NlcnQoX0cuWCA9PSAyMCkKKworcHJpbnQnKycKKworbG9jYWwgX2cgPSBfRworX0VOViA9IHNldG1ldGF0YWJsZSh7fSwge19faW5kZXg9ZnVuY3Rpb24gKF8saykgcmV0dXJuIF9nW2tdIGVuZH0pCisKKworYSA9IHt9CityYXdzZXQoYSwgIngiLCAxLCAyLCAzKQorYXNzZXJ0KGEueCA9PSAxIGFuZCByYXdnZXQoYSwgIngiLCAzKSA9PSAxKQorCitwcmludCAnKycKKworLS0gdGVzdGluZyBtZXRhdGFibGVzIGZvciBiYXNpYyB0eXBlcworbXQgPSB7X19pbmRleCA9IGZ1bmN0aW9uIChhLGIpIHJldHVybiBhK2IgZW5kLAorICAgICAgX19sZW4gPSBmdW5jdGlvbiAoeCkgcmV0dXJuIG1hdGguZmxvb3IoeCkgZW5kfQorZGVidWcuc2V0bWV0YXRhYmxlKDEwLCBtdCkKK2Fzc2VydChnZXRtZXRhdGFibGUoLTIpID09IG10KQorYXNzZXJ0KCgxMClbM10gPT0gMTMpCithc3NlcnQoKDEwKVsiMyJdID09IDEzKQorYXNzZXJ0KCMzLjQ1ID09IDMpCitkZWJ1Zy5zZXRtZXRhdGFibGUoMjMsIG5pbCkKK2Fzc2VydChnZXRtZXRhdGFibGUoLTIpID09IG5pbCkKKworZGVidWcuc2V0bWV0YXRhYmxlKHRydWUsIG10KQorYXNzZXJ0KGdldG1ldGF0YWJsZShmYWxzZSkgPT0gbXQpCittdC5fX2luZGV4ID0gZnVuY3Rpb24gKGEsYikgcmV0dXJuIGEgb3IgYiBlbmQKK2Fzc2VydCgodHJ1ZSlbZmFsc2VdID09IHRydWUpCithc3NlcnQoKGZhbHNlKVtmYWxzZV0gPT0gZmFsc2UpCitkZWJ1Zy5zZXRtZXRhdGFibGUoZmFsc2UsIG5pbCkKK2Fzc2VydChnZXRtZXRhdGFibGUodHJ1ZSkgPT0gbmlsKQorCitkZWJ1Zy5zZXRtZXRhdGFibGUobmlsLCBtdCkKK2Fzc2VydChnZXRtZXRhdGFibGUobmlsKSA9PSBtdCkKK210Ll9fYWRkID0gZnVuY3Rpb24gKGEsYikgcmV0dXJuIChhIG9yIDEpICsgKGIgb3IgMikgZW5kCithc3NlcnQoMTAgKyBuaWwgPT0gMTIpCithc3NlcnQobmlsICsgMjMgPT0gMjQpCithc3NlcnQobmlsICsgbmlsID09IDMpCitkZWJ1Zy5zZXRtZXRhdGFibGUobmlsLCBuaWwpCithc3NlcnQoZ2V0bWV0YXRhYmxlKG5pbCkgPT0gbmlsKQorCitkZWJ1Zy5zZXRtZXRhdGFibGUobmlsLCB7fSkKKworCistLSBsb29wcyBpbiBkZWxlZ2F0aW9uCithID0ge307IHNldG1ldGF0YWJsZShhLCBhKTsgYS5fX2luZGV4ID0gYTsgYS5fX25ld2luZGV4ID0gYQorYXNzZXJ0KG5vdCBwY2FsbChmdW5jdGlvbiAoYSxiKSByZXR1cm4gYVtiXSBlbmQsIGEsIDEwKSkKK2Fzc2VydChub3QgcGNhbGwoZnVuY3Rpb24gKGEsYixjKSBhW2JdID0gYyBlbmQsIGEsIDEwLCB0cnVlKSkKKworLS0gYnVnIGluIDUuMQorVCwgSywgViA9IG5pbAorZ3JhbmRwYXJlbnQgPSB7fQorZ3JhbmRwYXJlbnQuX19uZXdpbmRleCA9IGZ1bmN0aW9uKHQsayx2KSBUPXQ7IEs9azsgVj12IGVuZAorCitwYXJlbnQgPSB7fQorcGFyZW50Ll9fbmV3aW5kZXggPSBwYXJlbnQKK3NldG1ldGF0YWJsZShwYXJlbnQsIGdyYW5kcGFyZW50KQorCitjaGlsZCA9IHNldG1ldGF0YWJsZSh7fSwgcGFyZW50KQorY2hpbGQuZm9vID0gMTAgICAgICAtLT4gQ1JBU0ggKG9uIHNvbWUgbWFjaGluZXMpCithc3NlcnQoVCA9PSBwYXJlbnQgYW5kIEsgPT0gImZvbyIgYW5kIFYgPT0gMTApCisKK3ByaW50ICdPSycKKworcmV0dXJuIDEyCisKKwpkaWZmIC0tZ2l0IGEvdGVzdGVzL2ZpbGVzLmx1YSBiL3Rlc3Rlcy9maWxlcy5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjN2MyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9maWxlcy5sdWEKQEAgLTAsMCArMSw4MzIgQEAKKy0tICRJZDogZmlsZXMubHVhLHYgMS4xMDEgMjAxOC8wMy8xMiAxMzo1MTowMiByb2JlcnRvIEV4cCAkCistLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBmaWxlIGFsbC5sdWEKKworbG9jYWwgZGVidWcgPSByZXF1aXJlICJkZWJ1ZyIKKworbG9jYWwgbWF4aW50ID0gbWF0aC5tYXhpbnRlZ2VyCisKK2Fzc2VydCh0eXBlKG9zLmdldGVudiJQQVRIIikgPT0gInN0cmluZyIpCisKK2Fzc2VydChpby5pbnB1dChpby5zdGRpbikgPT0gaW8uc3RkaW4pCithc3NlcnQobm90IHBjYWxsKGlvLmlucHV0LCAibm9uLWV4aXN0ZW50LWZpbGUiKSkKK2Fzc2VydChpby5vdXRwdXQoaW8uc3Rkb3V0KSA9PSBpby5zdGRvdXQpCisKKworbG9jYWwgZnVuY3Rpb24gdGVzdGVyciAobXNnLCBmLCAuLi4pCisgIGxvY2FsIHN0YXQsIGVyciA9IHBjYWxsKGYsIC4uLikKKyAgcmV0dXJuIChub3Qgc3RhdCBhbmQgc3RyaW5nLmZpbmQoZXJyLCBtc2csIDEsIHRydWUpKQorZW5kCisKKworbG9jYWwgZnVuY3Rpb24gY2hlY2tlcnIgKG1zZywgZiwgLi4uKQorICBhc3NlcnQodGVzdGVycihtc2csIGYsIC4uLikpCitlbmQKKworCistLSBjYW5ub3QgY2xvc2Ugc3RhbmRhcmQgZmlsZXMKK2Fzc2VydChub3QgaW8uY2xvc2UoaW8uc3RkaW4pIGFuZAorICAgICAgIG5vdCBpby5zdGRvdXQ6Y2xvc2UoKSBhbmQKKyAgICAgICBub3QgaW8uc3RkZXJyOmNsb3NlKCkpCisKKy0tIGNhbm5vdCBjYWxsIGNsb3NlIG1ldGhvZCB3aXRob3V0IGFuIGFyZ3VtZW50IChuZXcgaW4gNS4zLjUpCitjaGVja2VycigiZ290IG5vIHZhbHVlIiwgaW8uc3RkaW4uY2xvc2UpCisKKworYXNzZXJ0KHR5cGUoaW8uaW5wdXQoKSkgPT0gInVzZXJkYXRhIiBhbmQgaW8udHlwZShpby5vdXRwdXQoKSkgPT0gImZpbGUiKQorYXNzZXJ0KHR5cGUoaW8uc3RkaW4pID09ICJ1c2VyZGF0YSIgYW5kIGlvLnR5cGUoaW8uc3RkZXJyKSA9PSAiZmlsZSIpCithc3NlcnQobm90IGlvLnR5cGUoOCkpCitsb2NhbCBhID0ge307IHNldG1ldGF0YWJsZShhLCB7fSkKK2Fzc2VydChub3QgaW8udHlwZShhKSkKKworYXNzZXJ0KGdldG1ldGF0YWJsZShpby5pbnB1dCgpKS5fX25hbWUgPT0gIkZJTEUqIikKKworbG9jYWwgYSxiLGMgPSBpby5vcGVuKCd4dXh1X25hb19leGlzdGUnKQorYXNzZXJ0KG5vdCBhIGFuZCB0eXBlKGIpID09ICJzdHJpbmciIGFuZCB0eXBlKGMpID09ICJudW1iZXIiKQorCithLGIsYyA9IGlvLm9wZW4oJy9hL2IvYy9kJywgJ3cnKQorYXNzZXJ0KG5vdCBhIGFuZCB0eXBlKGIpID09ICJzdHJpbmciIGFuZCB0eXBlKGMpID09ICJudW1iZXIiKQorCitsb2NhbCBmaWxlID0gb3MudG1wbmFtZSgpCitsb2NhbCBmLCBtc2cgPSBpby5vcGVuKGZpbGUsICJ3IikKK2lmIG5vdCBmIHRoZW4KKyAgKE1lc3NhZ2Ugb3IgcHJpbnQpKCInb3MudG1wbmFtZScgZmlsZSBjYW5ub3QgYmUgb3Blbjsgc2tpcHBpbmcgZmlsZSB0ZXN0cyIpCisKK2Vsc2UgIC0teyAgbW9zdCB0ZXN0cyBoZXJlIG5lZWQgdG1wbmFtZQorZjpjbG9zZSgpCisKK3ByaW50KCd0ZXN0aW5nIGkvbycpCisKK2xvY2FsIG90aGVyZmlsZSA9IG9zLnRtcG5hbWUoKQorCitjaGVja2VycigiaW52YWxpZCBtb2RlIiwgaW8ub3BlbiwgZmlsZSwgInJ3IikKK2NoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAicmIrIikKK2NoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAicitiayIpCitjaGVja2VycigiaW52YWxpZCBtb2RlIiwgaW8ub3BlbiwgZmlsZSwgIiIpCitjaGVja2VycigiaW52YWxpZCBtb2RlIiwgaW8ub3BlbiwgZmlsZSwgIisiKQorY2hlY2tlcnIoImludmFsaWQgbW9kZSIsIGlvLm9wZW4sIGZpbGUsICJiIikKK2Fzc2VydChpby5vcGVuKGZpbGUsICJyK2IiKSk6Y2xvc2UoKQorYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIrIikpOmNsb3NlKCkKK2Fzc2VydChpby5vcGVuKGZpbGUsICJyYiIpKTpjbG9zZSgpCisKK2Fzc2VydChvcy5zZXRsb2NhbGUoJ0MnLCAnYWxsJykpCisKK2lvLmlucHV0KGlvLnN0ZGluKTsgaW8ub3V0cHV0KGlvLnN0ZG91dCk7CisKK29zLnJlbW92ZShmaWxlKQorYXNzZXJ0KG5vdCBsb2FkZmlsZShmaWxlKSkKK2NoZWNrZXJyKCIiLCBkb2ZpbGUsIGZpbGUpCithc3NlcnQobm90IGlvLm9wZW4oZmlsZSkpCitpby5vdXRwdXQoZmlsZSkKK2Fzc2VydChpby5vdXRwdXQoKSB+PSBpby5zdGRvdXQpCisKK2lmIG5vdCBfcG9ydCB0aGVuICAgLS0gaW52YWxpZCBzZWVrCisgIGxvY2FsIHN0YXR1cywgbXNnLCBjb2RlID0gaW8uc3RkaW46c2Vlaygic2V0IiwgMTAwMCkKKyAgYXNzZXJ0KG5vdCBzdGF0dXMgYW5kIHR5cGUobXNnKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjb2RlKSA9PSAibnVtYmVyIikKK2VuZAorCithc3NlcnQoaW8ub3V0cHV0KCk6c2VlaygpID09IDApCithc3NlcnQoaW8ud3JpdGUoImFsbyBhbG8iKTpzZWVrKCkgPT0gc3RyaW5nLmxlbigiYWxvIGFsbyIpKQorYXNzZXJ0KGlvLm91dHB1dCgpOnNlZWsoImN1ciIsIC0zKSA9PSBzdHJpbmcubGVuKCJhbG8gYWxvIiktMykKK2Fzc2VydChpby53cml0ZSgiam9hbyIpKQorYXNzZXJ0KGlvLm91dHB1dCgpOnNlZWsoImVuZCIpID09IHN0cmluZy5sZW4oImFsbyBqb2FvIikpCisKK2Fzc2VydChpby5vdXRwdXQoKTpzZWVrKCJzZXQiKSA9PSAwKQorCithc3NlcnQoaW8ud3JpdGUoJyLhbG8iJywgInthfVxuIiwgInNlY29uZCBsaW5lXG4iLCAidGhpcmQgbGluZSBcbiIpKQorYXNzZXJ0KGlvLndyaXRlKCfnZm91cnRoX2xpbmUnKSkKK2lvLm91dHB1dChpby5zdGRvdXQpCitjb2xsZWN0Z2FyYmFnZSgpICAtLSBmaWxlIHNob3VsZCBiZSBjbG9zZWQgYnkgR0MKK2Fzc2VydChpby5pbnB1dCgpID09IGlvLnN0ZGluIGFuZCByYXdlcXVhbChpby5vdXRwdXQoKSwgaW8uc3Rkb3V0KSkKK3ByaW50KCcrJykKKworLS0gdGVzdCBHQyBmb3IgZmlsZXMKK2NvbGxlY3RnYXJiYWdlKCkKK2ZvciBpPTEsMTIwIGRvCisgIGZvciBpPTEsNSBkbworICAgIGlvLmlucHV0KGZpbGUpCisgICAgYXNzZXJ0KGlvLm9wZW4oZmlsZSwgJ3InKSkKKyAgICBpby5saW5lcyhmaWxlKQorICBlbmQKKyAgY29sbGVjdGdhcmJhZ2UoKQorZW5kCisKK2lvLmlucHV0KCk6Y2xvc2UoKQoraW8uY2xvc2UoKQorCithc3NlcnQob3MucmVuYW1lKGZpbGUsIG90aGVyZmlsZSkpCithc3NlcnQobm90IG9zLnJlbmFtZShmaWxlLCBvdGhlcmZpbGUpKQorCitpby5vdXRwdXQoaW8ub3BlbihvdGhlcmZpbGUsICJhYiIpKQorYXNzZXJ0KGlvLndyaXRlKCJcblxuXHRcdCAgIiwgMzQ1MCwgIlxuIikpOworaW8uY2xvc2UoKQorCistLSB0ZXN0IHdyaXRpbmcvcmVhZGluZyBudW1iZXJzCitmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKK2Y6d3JpdGUobWF4aW50LCAnXG4nKQorZjp3cml0ZShzdHJpbmcuZm9ybWF0KCIwWCV4XG4iLCBtYXhpbnQpKQorZjp3cml0ZSgiMHhBQkNwLTMiLCAnXG4nKQorZjp3cml0ZSgwLCAnXG4nKQorZjp3cml0ZSgtbWF4aW50LCAnXG4nKQorZjp3cml0ZShzdHJpbmcuZm9ybWF0KCIweCVYXG4iLCAtbWF4aW50KSkKK2Y6d3JpdGUoIi0weEFCQ3AtMyIsICdcbicpCithc3NlcnQoZjpjbG9zZSgpKQorZiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJyIikpCithc3NlcnQoZjpyZWFkKCJuIikgPT0gbWF4aW50KQorYXNzZXJ0KGY6cmVhZCgibiIpID09IG1heGludCkKK2Fzc2VydChmOnJlYWQoIm4iKSA9PSAweEFCQ3AtMykKK2Fzc2VydChmOnJlYWQoIm4iKSA9PSAwKQorYXNzZXJ0KGY6cmVhZCgiKm4iKSA9PSAtbWF4aW50KSAgICAgICAgICAgIC0tIHRlc3Qgb2xkIGZvcm1hdCAod2l0aCAnKicpCithc3NlcnQoZjpyZWFkKCJuIikgPT0gLW1heGludCkKK2Fzc2VydChmOnJlYWQoIipuIikgPT0gLTB4QUJDcC0zKSAgICAgICAgICAgIC0tIHRlc3Qgb2xkIGZvcm1hdCAod2l0aCAnKicpCithc3NlcnQoZjpjbG9zZSgpKQorYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKKworCistLSB0ZXN0aW5nIG11bHRpcGxlIGFyZ3VtZW50cyB0byBpby5yZWFkCitkbworICBsb2NhbCBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKKyAgZjp3cml0ZVtbCithIGxpbmUKK2Fub3RoZXIgbGluZQorMTIzNAorMy40NQorb25lCit0d28KK3RocmVlCitdXQorICBsb2NhbCBsMSwgbDIsIGwzLCBsNCwgbjEsIG4yLCBjLCBkdW1teQorICBhc3NlcnQoZjpjbG9zZSgpKQorICBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIiKSkKKyAgbDEsIGwyLCBuMSwgbjIsIGR1bW15ID0gZjpyZWFkKCJsIiwgIkwiLCAibiIsICJuIikKKyAgYXNzZXJ0KGwxID09ICJhIGxpbmUiIGFuZCBsMiA9PSAiYW5vdGhlciBsaW5lXG4iIGFuZAorICAgICAgICAgbjEgPT0gMTIzNCBhbmQgbjIgPT0gMy40NSBhbmQgZHVtbXkgPT0gbmlsKQorICBhc3NlcnQoZjpjbG9zZSgpKQorICBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIiKSkKKyAgbDEsIGwyLCBuMSwgbjIsIGMsIGwzLCBsNCwgZHVtbXkgPSBmOnJlYWQoNywgImwiLCAibiIsICJuIiwgMSwgImwiLCAibCIpCisgIGFzc2VydChsMSA9PSAiYSBsaW5lXG4iIGFuZCBsMiA9PSAiYW5vdGhlciBsaW5lIiBhbmQgYyA9PSAnXG4nIGFuZAorICAgICAgICAgbjEgPT0gMTIzNCBhbmQgbjIgPT0gMy40NSBhbmQgbDMgPT0gIm9uZSIgYW5kIGw0ID09ICJ0d28iCisgICAgICAgICBhbmQgZHVtbXkgPT0gbmlsKQorICBhc3NlcnQoZjpjbG9zZSgpKQorICBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIiKSkKKyAgLS0gc2Vjb25kIGl0ZW0gZmFpbGluZworICBsMSwgbjEsIG4yLCBkdW1teSA9IGY6cmVhZCgibCIsICJuIiwgIm4iLCAibCIpCisgIGFzc2VydChsMSA9PSAiYSBsaW5lIiBhbmQgbjEgPT0gbmlsKQorICBhc3NlcnQoZjpjbG9zZSgpKQorICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQorZW5kCisKKworCistLSB0ZXN0IHlpZWxkaW5nIGR1cmluZyAnZG9maWxlJworZiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJ3IikpCitmOndyaXRlW1sKK2xvY2FsIHgsIHogPSBjb3JvdXRpbmUueWllbGQoMTApCitsb2NhbCB5ID0gY29yb3V0aW5lLnlpZWxkKDIwKQorcmV0dXJuIHggKyB5ICogegorXV0KK2Fzc2VydChmOmNsb3NlKCkpCitmID0gY29yb3V0aW5lLndyYXAoZG9maWxlKQorYXNzZXJ0KGYoZmlsZSkgPT0gMTApCitwcmludChmKDEwMCwgMTAxKSA9PSAyMCkKK2Fzc2VydChmKDIwMCkgPT0gMTAwICsgMjAwICogMTAxKQorYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKKworCitmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKKy0tIHRlc3QgbnVtYmVyIHRlcm1pbmF0aW9uCitmOndyaXRlW1sKKy0xMi4zLQktMHhmZmZmKyAgLjN8NS5FLTNYICArMjM0ZSsxM0UgMHhERUFEQkVFRkRFQURCRUVGeAorMHgxLjEzQXArM2UKK11dCistLSB2ZXJ5IGxvbmcgbnVtYmVyCitmOndyaXRlKCIxMjM0Iik7IGZvciBpID0gMSwgMTAwMCBkbyBmOndyaXRlKCIwIikgZW5kOyAgZjp3cml0ZSgiXG4iKQorLS0gaW52YWxpZCBzZXF1ZW5jZXMgKG11c3QgcmVhZCBhbmQgZGlzY2FyZCB2YWxpZCBwcmVmaXhlcykKK2Y6d3JpdGVbWworLmUrCTAuZTsJLS07ICAweFg7CitdXQorYXNzZXJ0KGY6Y2xvc2UoKSkKK2YgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAiciIpKQorYXNzZXJ0KGY6cmVhZCgibiIpID09IC0xMi4zKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiLSIpCithc3NlcnQoZjpyZWFkKCJuIikgPT0gLTB4ZmZmZik7IGFzc2VydChmOnJlYWQoMikgPT0gIisgIikKK2Fzc2VydChmOnJlYWQoIm4iKSA9PSAwLjMpOyBhc3NlcnQoZjpyZWFkKDEpID09ICJ8IikKK2Fzc2VydChmOnJlYWQoIm4iKSA9PSA1ZS0zKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiWCIpCithc3NlcnQoZjpyZWFkKCJuIikgPT0gMjM0ZTEzKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiRSIpCithc3NlcnQoZjpyZWFkKCJuIikgPT0gMFhkZWFkYmVlZmRlYWRiZWVmKTsgYXNzZXJ0KGY6cmVhZCgyKSA9PSAieFxuIikKK2Fzc2VydChmOnJlYWQoIm4iKSA9PSAweDEuMTNhUDMpOyBhc3NlcnQoZjpyZWFkKDEpID09ICJlIikKKworZG8gICAtLSBhdHRlbXB0IHRvIHJlYWQgdG9vIGxvbmcgbnVtYmVyCisgIGFzc2VydChmOnJlYWQoIm4iKSA9PSBuaWwpICAtLSBmYWlscworICBsb2NhbCBzID0gZjpyZWFkKCJMIikgICAtLSByZWFkIHJlc3Qgb2YgbGluZQorICBhc3NlcnQoc3RyaW5nLmZpbmQocywgIl4wMCpcbiQiKSkgIC0tIGxvdHMgb2YgMCdzIGxlZnQKK2VuZAorCithc3NlcnQobm90IGY6cmVhZCgibiIpKTsgYXNzZXJ0KGY6cmVhZCgyKSA9PSAiZSsiKQorYXNzZXJ0KG5vdCBmOnJlYWQoIm4iKSk7IGFzc2VydChmOnJlYWQoMSkgPT0gIjsiKQorYXNzZXJ0KG5vdCBmOnJlYWQoIm4iKSk7IGFzc2VydChmOnJlYWQoMikgPT0gIi07IikKK2Fzc2VydChub3QgZjpyZWFkKCJuIikpOyBhc3NlcnQoZjpyZWFkKDEpID09ICJYIikKK2Fzc2VydChub3QgZjpyZWFkKCJuIikpOyBhc3NlcnQoZjpyZWFkKDEpID09ICI7IikKK2Fzc2VydChub3QgZjpyZWFkKCJuIikpOyBhc3NlcnQobm90IGY6cmVhZCgwKSkgICAtLSBlbmQgb2YgZmlsZQorYXNzZXJ0KGY6Y2xvc2UoKSkKK2Fzc2VydChvcy5yZW1vdmUoZmlsZSkpCisKKworLS0gdGVzdCBsaW5lIGdlbmVyYXRvcnMKK2Fzc2VydChub3QgcGNhbGwoaW8ubGluZXMsICJub24tZXhpc3RlbnQtZmlsZSIpKQorYXNzZXJ0KG9zLnJlbmFtZShvdGhlcmZpbGUsIGZpbGUpKQoraW8ub3V0cHV0KG90aGVyZmlsZSkKK2xvY2FsIG4gPSAwCitsb2NhbCBmID0gaW8ubGluZXMoZmlsZSkKK3doaWxlIGYoKSBkbyBuID0gbiArIDEgZW5kOworYXNzZXJ0KG4gPT0gNikgICAtLSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGZpbGUKK2NoZWNrZXJyKCJmaWxlIGlzIGFscmVhZHkgY2xvc2VkIiwgZikKK2NoZWNrZXJyKCJmaWxlIGlzIGFscmVhZHkgY2xvc2VkIiwgZikKKy0tIGNvcHkgZnJvbSBmaWxlIHRvIG90aGVyZmlsZQorbiA9IDAKK2ZvciBsIGluIGlvLmxpbmVzKGZpbGUpIGRvIGlvLndyaXRlKGwsICJcbiIpOyBuID0gbiArIDEgZW5kCitpby5jbG9zZSgpCithc3NlcnQobiA9PSA2KQorLS0gY29weSBmcm9tIG90aGVyZmlsZSBiYWNrIHRvIGZpbGUKK2xvY2FsIGYgPSBhc3NlcnQoaW8ub3BlbihvdGhlcmZpbGUpKQorYXNzZXJ0KGlvLnR5cGUoZikgPT0gImZpbGUiKQoraW8ub3V0cHV0KGZpbGUpCithc3NlcnQobm90IGlvLm91dHB1dCgpOnJlYWQoKSkKK24gPSAwCitmb3IgbCBpbiBmOmxpbmVzKCkgZG8gaW8ud3JpdGUobCwgIlxuIik7IG4gPSBuICsgMSBlbmQKK2Fzc2VydCh0b3N0cmluZyhmKTpzdWIoMSwgNSkgPT0gImZpbGUgIikKK2Fzc2VydChmOmNsb3NlKCkpOyBpby5jbG9zZSgpCithc3NlcnQobiA9PSA2KQorY2hlY2tlcnIoImNsb3NlZCBmaWxlIiwgaW8uY2xvc2UsIGYpCithc3NlcnQodG9zdHJpbmcoZikgPT0gImZpbGUgKGNsb3NlZCkiKQorYXNzZXJ0KGlvLnR5cGUoZikgPT0gImNsb3NlZCBmaWxlIikKK2lvLmlucHV0KGZpbGUpCitmID0gaW8ub3BlbihvdGhlcmZpbGUpOmxpbmVzKCkKK24gPSAwCitmb3IgbCBpbiBpby5saW5lcygpIGRvIGFzc2VydChsID09IGYoKSk7IG4gPSBuICsgMSBlbmQKK2YgPSBuaWw7IGNvbGxlY3RnYXJiYWdlKCkKK2Fzc2VydChuID09IDYpCithc3NlcnQob3MucmVtb3ZlKG90aGVyZmlsZSkpCisKK2RvICAtLSBidWcgaW4gNS4zLjEKKyAgaW8ub3V0cHV0KG90aGVyZmlsZSkKKyAgaW8ud3JpdGUoc3RyaW5nLnJlcCgiYSIsIDMwMCksICJcbiIpCisgIGlvLmNsb3NlKCkKKyAgbG9jYWwgdCA9e307IGZvciBpID0gMSwgMjUwIGRvIHRbaV0gPSAxIGVuZAorICB0ID0ge2lvLmxpbmVzKG90aGVyZmlsZSwgdGFibGUudW5wYWNrKHQpKSgpfQorICAtLSBldmVyeXRoaW5nIG9rIGhlcmUKKyAgYXNzZXJ0KCN0ID09IDI1MCBhbmQgdFsxXSA9PSAnYScgYW5kIHRbI3RdID09ICdhJykKKyAgdFsjdCArIDFdID0gMSAgICAtLSBvbmUgdG9vIG1hbnkKKyAgY2hlY2tlcnIoInRvbyBtYW55IGFyZ3VtZW50cyIsIGlvLmxpbmVzLCBvdGhlcmZpbGUsIHRhYmxlLnVucGFjayh0KSkKKyAgY29sbGVjdGdhcmJhZ2UoKSAgIC0tIGVuc3VyZSAnb3RoZXJmaWxlJyBpcyBjbG9zZWQKKyAgYXNzZXJ0KG9zLnJlbW92ZShvdGhlcmZpbGUpKQorZW5kCisKK2lvLmlucHV0KGZpbGUpCitkbyAgLS0gdGVzdCBlcnJvciByZXR1cm5zCisgIGxvY2FsIGEsYixjID0gaW8uaW5wdXQoKTp3cml0ZSgieHV4dSIpCisgIGFzc2VydChub3QgYSBhbmQgdHlwZShiKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKK2VuZAorY2hlY2tlcnIoImludmFsaWQgZm9ybWF0IiwgaW8ucmVhZCwgIngiKQorYXNzZXJ0KGlvLnJlYWQoMCkgPT0gIiIpICAgLS0gbm90IGVvZgorYXNzZXJ0KGlvLnJlYWQoNSwgJ2wnKSA9PSAnIuFsbyInKQorYXNzZXJ0KGlvLnJlYWQoMCkgPT0gIiIpCithc3NlcnQoaW8ucmVhZCgpID09ICJzZWNvbmQgbGluZSIpCitsb2NhbCB4ID0gaW8uaW5wdXQoKTpzZWVrKCkKK2Fzc2VydChpby5yZWFkKCkgPT0gInRoaXJkIGxpbmUgIikKK2Fzc2VydChpby5pbnB1dCgpOnNlZWsoInNldCIsIHgpKQorYXNzZXJ0KGlvLnJlYWQoJ0wnKSA9PSAidGhpcmQgbGluZSBcbiIpCithc3NlcnQoaW8ucmVhZCgxKSA9PSAi5yIpCithc3NlcnQoaW8ucmVhZChzdHJpbmcubGVuImZvdXJ0aF9saW5lIikgPT0gImZvdXJ0aF9saW5lIikKK2Fzc2VydChpby5pbnB1dCgpOnNlZWsoImN1ciIsIC1zdHJpbmcubGVuImZvdXJ0aF9saW5lIikpCithc3NlcnQoaW8ucmVhZCgpID09ICJmb3VydGhfbGluZSIpCithc3NlcnQoaW8ucmVhZCgpID09ICIiKSAgLS0gZW1wdHkgbGluZQorYXNzZXJ0KGlvLnJlYWQoJ24nKSA9PSAzNDUwKQorYXNzZXJ0KGlvLnJlYWQoMSkgPT0gJ1xuJykKK2Fzc2VydChpby5yZWFkKDApID09IG5pbCkgIC0tIGVuZCBvZiBmaWxlCithc3NlcnQoaW8ucmVhZCgxKSA9PSBuaWwpICAtLSBlbmQgb2YgZmlsZQorYXNzZXJ0KGlvLnJlYWQoMzAwMDApID09IG5pbCkgIC0tIGVuZCBvZiBmaWxlCithc3NlcnQoKHtpby5yZWFkKDEpfSlbMl0gPT0gdW5kZWYpCithc3NlcnQoaW8ucmVhZCgpID09IG5pbCkgIC0tIGVuZCBvZiBmaWxlCithc3NlcnQoKHtpby5yZWFkKCl9KVsyXSA9PSB1bmRlZikKK2Fzc2VydChpby5yZWFkKCduJykgPT0gbmlsKSAgLS0gZW5kIG9mIGZpbGUKK2Fzc2VydCgoe2lvLnJlYWQoJ24nKX0pWzJdID09IHVuZGVmKQorYXNzZXJ0KGlvLnJlYWQoJ2EnKSA9PSAnJykgIC0tIGVuZCBvZiBmaWxlIChPSyBmb3IgJ2EnKQorYXNzZXJ0KGlvLnJlYWQoJ2EnKSA9PSAnJykgIC0tIGVuZCBvZiBmaWxlIChPSyBmb3IgJ2EnKQorY29sbGVjdGdhcmJhZ2UoKQorcHJpbnQoJysnKQoraW8uY2xvc2UoaW8uaW5wdXQoKSkKK2NoZWNrZXJyKCIgaW5wdXQgZmlsZSBpcyBjbG9zZWQiLCBpby5yZWFkKQorCithc3NlcnQob3MucmVtb3ZlKGZpbGUpKQorCitsb2NhbCB0ID0gJzAxMjM0NTY3ODknCitmb3IgaT0xLDEwIGRvIHQgPSB0Li50OyBlbmQKK2Fzc2VydChzdHJpbmcubGVuKHQpID09IDEwKjJeMTApCisKK2lvLm91dHB1dChmaWxlKQoraW8ud3JpdGUoImFsbyIpOndyaXRlKCJcbiIpCitpby5jbG9zZSgpCitjaGVja2VycigiIG91dHB1dCBmaWxlIGlzIGNsb3NlZCIsIGlvLndyaXRlKQorbG9jYWwgZiA9IGlvLm9wZW4oZmlsZSwgImErYiIpCitpby5vdXRwdXQoZikKK2NvbGxlY3RnYXJiYWdlKCkKKworYXNzZXJ0KGlvLndyaXRlKCcgJyAuLiB0IC4uICcgJykpCithc3NlcnQoaW8ud3JpdGUoJzsnLCAnZW5kIG9mIGZpbGVcbicpKQorZjpmbHVzaCgpOyBpby5mbHVzaCgpCitmOmNsb3NlKCkKK3ByaW50KCcrJykKKworaW8uaW5wdXQoZmlsZSkKK2Fzc2VydChpby5yZWFkKCkgPT0gImFsbyIpCithc3NlcnQoaW8ucmVhZCgxKSA9PSAnICcpCithc3NlcnQoaW8ucmVhZChzdHJpbmcubGVuKHQpKSA9PSB0KQorYXNzZXJ0KGlvLnJlYWQoMSkgPT0gJyAnKQorYXNzZXJ0KGlvLnJlYWQoMCkpCithc3NlcnQoaW8ucmVhZCgnYScpID09ICc7ZW5kIG9mIGZpbGVcbicpCithc3NlcnQoaW8ucmVhZCgwKSA9PSBuaWwpCithc3NlcnQoaW8uY2xvc2UoaW8uaW5wdXQoKSkpCisKKworLS0gdGVzdCBlcnJvcnMgaW4gcmVhZC93cml0ZQorZG8KKyAgbG9jYWwgZnVuY3Rpb24gaXNtc2cgKG0pCisgICAgLS0gZXJyb3IgbWVzc2FnZSBpcyBub3QgYSBjb2RlIG51bWJlcgorICAgIHJldHVybiAodHlwZShtKSA9PSAic3RyaW5nIiBhbmQgdG9udW1iZXIobSkgPT0gbmlsKQorICBlbmQKKworICAtLSByZWFkCisgIGxvY2FsIGYgPSBpby5vcGVuKGZpbGUsICJ3IikKKyAgbG9jYWwgciwgbSwgYyA9IGY6cmVhZCgpCisgIGFzc2VydChub3QgciBhbmQgaXNtc2cobSkgYW5kIHR5cGUoYykgPT0gIm51bWJlciIpCisgIGFzc2VydChmOmNsb3NlKCkpCisgIC0tIHdyaXRlCisgIGYgPSBpby5vcGVuKGZpbGUsICJyIikKKyAgciwgbSwgYyA9IGY6d3JpdGUoIndoYXRldmVyIikKKyAgYXNzZXJ0KG5vdCByIGFuZCBpc21zZyhtKSBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKKyAgYXNzZXJ0KGY6Y2xvc2UoKSkKKyAgLS0gbGluZXMKKyAgZiA9IGlvLm9wZW4oZmlsZSwgInciKQorICByLCBtID0gcGNhbGwoZjpsaW5lcygpKQorICBhc3NlcnQociA9PSBmYWxzZSBhbmQgaXNtc2cobSkpCisgIGFzc2VydChmOmNsb3NlKCkpCitlbmQKKworYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKKworLS0gdGVzdCBmb3IgTCBmb3JtYXQKK2lvLm91dHB1dChmaWxlKTsgaW8ud3JpdGUiXG5cbmxpbmVcbm90aGVyIjpjbG9zZSgpCitpby5pbnB1dChmaWxlKQorYXNzZXJ0KGlvLnJlYWQiTCIgPT0gIlxuIikKK2Fzc2VydChpby5yZWFkIkwiID09ICJcbiIpCithc3NlcnQoaW8ucmVhZCJMIiA9PSAibGluZVxuIikKK2Fzc2VydChpby5yZWFkIkwiID09ICJvdGhlciIpCithc3NlcnQoaW8ucmVhZCJMIiA9PSBuaWwpCitpby5pbnB1dCgpOmNsb3NlKCkKKworbG9jYWwgZiA9IGFzc2VydChpby5vcGVuKGZpbGUpKQorbG9jYWwgcyA9ICIiCitmb3IgbCBpbiBmOmxpbmVzKCJMIikgZG8gcyA9IHMgLi4gbCBlbmQKK2Fzc2VydChzID09ICJcblxubGluZVxub3RoZXIiKQorZjpjbG9zZSgpCisKK2lvLmlucHV0KGZpbGUpCitzID0gIiIKK2ZvciBsIGluIGlvLmxpbmVzKG5pbCwgIkwiKSBkbyBzID0gcyAuLiBsIGVuZAorYXNzZXJ0KHMgPT0gIlxuXG5saW5lXG5vdGhlciIpCitpby5pbnB1dCgpOmNsb3NlKCkKKworcyA9ICIiCitmb3IgbCBpbiBpby5saW5lcyhmaWxlLCAiTCIpIGRvIHMgPSBzIC4uIGwgZW5kCithc3NlcnQocyA9PSAiXG5cbmxpbmVcbm90aGVyIikKKworcyA9ICIiCitmb3IgbCBpbiBpby5saW5lcyhmaWxlLCAibCIpIGRvIHMgPSBzIC4uIGwgZW5kCithc3NlcnQocyA9PSAibGluZW90aGVyIikKKworaW8ub3V0cHV0KGZpbGUpOyBpby53cml0ZSJhID0gMTAgKyAzNFxuYSA9IDIqYVxuYSA9IC1hXG4iOmNsb3NlKCkKK2xvY2FsIHQgPSB7fQorYXNzZXJ0KGxvYWQoaW8ubGluZXMoZmlsZSwgIkwiKSwgbmlsLCBuaWwsIHQpKSgpCithc3NlcnQodC5hID09IC0oKDEwICsgMzQpICogMikpCisKKworLS0gdGVzdCBmb3IgbXVsdGlwZSBhcmd1bWVudHMgaW4gJ2xpbmVzJworaW8ub3V0cHV0KGZpbGUpOyBpby53cml0ZSIwMTIzNDU2Nzg5XG4iOmNsb3NlKCkKK2ZvciBhLGIgaW4gaW8ubGluZXMoZmlsZSwgMSwgMSkgZG8KKyAgaWYgYSA9PSAiXG4iIHRoZW4gYXNzZXJ0KGIgPT0gbmlsKQorICBlbHNlIGFzc2VydCh0b251bWJlcihhKSA9PSB0b251bWJlcihiKSAtIDEpCisgIGVuZAorZW5kCisKK2ZvciBhLGIsYyBpbiBpby5saW5lcyhmaWxlLCAxLCAyLCAiYSIpIGRvCisgIGFzc2VydChhID09ICIwIiBhbmQgYiA9PSAiMTIiIGFuZCBjID09ICIzNDU2Nzg5XG4iKQorZW5kCisKK2ZvciBhLGIsYyBpbiBpby5saW5lcyhmaWxlLCAiYSIsIDAsIDEpIGRvCisgIGlmIGEgPT0gIiIgdGhlbiBicmVhayBlbmQKKyAgYXNzZXJ0KGEgPT0gIjAxMjM0NTY3ODlcbiIgYW5kIGIgPT0gbmlsIGFuZCBjID09IG5pbCkKK2VuZAorY29sbGVjdGdhcmJhZ2UoKSAgIC0tIHRvIGNsb3NlIGZpbGUgaW4gcHJldmlvdXMgaXRlcmF0aW9uCisKK2lvLm91dHB1dChmaWxlKTsgaW8ud3JpdGUiMDBcbjEwXG4yMFxuMzBcbjQwXG4iOmNsb3NlKCkKK2ZvciBhLCBiIGluIGlvLmxpbmVzKGZpbGUsICJuIiwgIm4iKSBkbworICBpZiBhID09IDQwIHRoZW4gYXNzZXJ0KGIgPT0gbmlsKQorICBlbHNlIGFzc2VydChhID09IGIgLSAxMCkKKyAgZW5kCitlbmQKKworCistLSB0ZXN0IGxvYWQgeCBsaW5lcworaW8ub3V0cHV0KGZpbGUpOworaW8ud3JpdGVbWworbG9jYWwgeQorPSBYCitYID0KK1ggKgorMiArCitYOworWCA9CitYCistICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OworXV06Y2xvc2UoKQorX0cuWCA9IDEKK2Fzc2VydChub3QgbG9hZChpby5saW5lcyhmaWxlKSkpCitjb2xsZWN0Z2FyYmFnZSgpICAgLS0gdG8gY2xvc2UgZmlsZSBpbiBwcmV2aW91cyBpdGVyYXRpb24KK2xvYWQoaW8ubGluZXMoZmlsZSwgIkwiKSkoKQorYXNzZXJ0KF9HLlggPT0gMikKK2xvYWQoaW8ubGluZXMoZmlsZSwgMSkpKCkKK2Fzc2VydChfRy5YID09IDQpCitsb2FkKGlvLmxpbmVzKGZpbGUsIDMpKSgpCithc3NlcnQoX0cuWCA9PSA4KQorCitwcmludCgnKycpCisKK2xvY2FsIHgxID0gInN0cmluZ1xuXG5cXGNvbSBcIlwiJydjb2lzYXMgW1tlc3RyYW5oYXNdXSBdXSciCitpby5vdXRwdXQoZmlsZSkKK2Fzc2VydChpby53cml0ZShzdHJpbmcuZm9ybWF0KCJ4MiA9ICVxXG4tLSBjb21tZW50IHdpdGhvdXQgZW5kaW5nIEVPUyIsIHgxKSkpCitpby5jbG9zZSgpCithc3NlcnQobG9hZGZpbGUoZmlsZSkpKCkKK2Fzc2VydCh4MSA9PSB4MikKK3ByaW50KCcrJykKK2Fzc2VydChvcy5yZW1vdmUoZmlsZSkpCithc3NlcnQobm90IG9zLnJlbW92ZShmaWxlKSkKK2Fzc2VydChub3Qgb3MucmVtb3ZlKG90aGVyZmlsZSkpCisKKy0tIHRlc3RpbmcgbG9hZGZpbGUKK2xvY2FsIGZ1bmN0aW9uIHRlc3Rsb2FkZmlsZSAocywgZXhwcmVzKQorICBpby5vdXRwdXQoZmlsZSkKKyAgaWYgcyB0aGVuIGlvLndyaXRlKHMpIGVuZAorICBpby5jbG9zZSgpCisgIGxvY2FsIHJlcyA9IGFzc2VydChsb2FkZmlsZShmaWxlKSkoKQorICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQorICBhc3NlcnQocmVzID09IGV4cHJlcykKK2VuZAorCistLSBsb2FkaW5nIGVtcHR5IGZpbGUKK3Rlc3Rsb2FkZmlsZShuaWwsIG5pbCkKKworLS0gbG9hZGluZyBmaWxlIHdpdGggaW5pdGlhbCBjb21tZW50IHdpdGhvdXQgZW5kIG9mIGxpbmUKK3Rlc3Rsb2FkZmlsZSgiIyBhIG5vbi1lbmRpbmcgY29tbWVudCIsIG5pbCkKKworCistLSBjaGVja2luZyBVbmljb2RlIEJPTSBpbiBmaWxlcwordGVzdGxvYWRmaWxlKCJceEVGXHhCQlx4QkYjIHNvbWUgY29tbWVudFxucmV0dXJuIDIzNCIsIDIzNCkKK3Rlc3Rsb2FkZmlsZSgiXHhFRlx4QkJceEJGcmV0dXJuIDIzOSIsIDIzOSkKK3Rlc3Rsb2FkZmlsZSgiXHhFRlx4QkJceEJGIiwgbmlsKSAgIC0tIGVtcHR5IGZpbGUgd2l0aCBhIEJPTQorCisKKy0tIGNoZWNraW5nIGxpbmUgbnVtYmVycyBpbiBmaWxlcyB3aXRoIGluaXRpYWwgY29tbWVudHMKK3Rlc3Rsb2FkZmlsZSgiIyBhIGNvbW1lbnRcbnJldHVybiByZXF1aXJlJ2RlYnVnJy5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lIiwgMikKKworCistLSBsb2FkaW5nIGJpbmFyeSBmaWxlCitpby5vdXRwdXQoaW8ub3BlbihmaWxlLCAid2IiKSkKK2Fzc2VydChpby53cml0ZShzdHJpbmcuZHVtcChmdW5jdGlvbiAoKSByZXR1cm4gMTAsICdcMGFsb1wyNTUnLCAnaGknIGVuZCkpKQoraW8uY2xvc2UoKQorYSwgYiwgYyA9IGFzc2VydChsb2FkZmlsZShmaWxlKSkoKQorYXNzZXJ0KGEgPT0gMTAgYW5kIGIgPT0gIlwwYWxvXDI1NSIgYW5kIGMgPT0gImhpIikKK2Fzc2VydChvcy5yZW1vdmUoZmlsZSkpCisKKy0tIGJ1ZyBpbiA1LjIuMQorZG8KKyAgaW8ub3V0cHV0KGlvLm9wZW4oZmlsZSwgIndiIikpCisgIC0tIHNhdmUgZnVuY3Rpb24gd2l0aCBubyB1cHZhbHVlcworICBhc3NlcnQoaW8ud3JpdGUoc3RyaW5nLmR1bXAoZnVuY3Rpb24gKCkgcmV0dXJuIDEgZW5kKSkpCisgIGlvLmNsb3NlKCkKKyAgZiA9IGFzc2VydChsb2FkZmlsZShmaWxlLCAiYiIsIHt9KSkKKyAgYXNzZXJ0KHR5cGUoZikgPT0gImZ1bmN0aW9uIiBhbmQgZigpID09IDEpCisgIGFzc2VydChvcy5yZW1vdmUoZmlsZSkpCitlbmQKKworLS0gbG9hZGluZyBiaW5hcnkgZmlsZSB3aXRoIGluaXRpYWwgY29tbWVudAoraW8ub3V0cHV0KGlvLm9wZW4oZmlsZSwgIndiIikpCithc3NlcnQoaW8ud3JpdGUoIiN0aGlzIGlzIGEgY29tbWVudCBmb3IgYSBiaW5hcnkgZmlsZVwwXG4iLAorICAgICAgICAgICAgICAgIHN0cmluZy5kdW1wKGZ1bmN0aW9uICgpIHJldHVybiAyMCwgJ1wwXDBcMCcgZW5kKSkpCitpby5jbG9zZSgpCithLCBiLCBjID0gYXNzZXJ0KGxvYWRmaWxlKGZpbGUpKSgpCithc3NlcnQoYSA9PSAyMCBhbmQgYiA9PSAiXDBcMFwwIiBhbmQgYyA9PSBuaWwpCithc3NlcnQob3MucmVtb3ZlKGZpbGUpKQorCisKKy0tICdsb2FkZmlsZScgd2l0aCAnZW52JworZG8KKyAgbG9jYWwgZiA9IGlvLm9wZW4oZmlsZSwgJ3cnKQorICBmOndyaXRlW1sKKyAgICBpZiAoLi4uKSB0aGVuIGEgPSAxNTsgcmV0dXJuIGIsIGMsIGQKKyAgICBlbHNlIHJldHVybiBfRU5WCisgICAgZW5kCisgIF1dCisgIGY6Y2xvc2UoKQorICBsb2NhbCB0ID0ge2IgPSAxMiwgYyA9ICJ4dXh1IiwgZCA9IHByaW50fQorICBsb2NhbCBmID0gYXNzZXJ0KGxvYWRmaWxlKGZpbGUsICd0JywgdCkpCisgIGxvY2FsIGIsIGMsIGQgPSBmKDEpCisgIGFzc2VydCh0LmEgPT0gMTUgYW5kIGIgPT0gMTIgYW5kIGMgPT0gdC5jIGFuZCBkID09IHByaW50KQorICBhc3NlcnQoZigpID09IHQpCisgIGYgPSBhc3NlcnQobG9hZGZpbGUoZmlsZSwgJ3QnLCBuaWwpKQorICBhc3NlcnQoZigpID09IG5pbCkKKyAgZiA9IGFzc2VydChsb2FkZmlsZShmaWxlKSkKKyAgYXNzZXJ0KGYoKSA9PSBfRykKKyAgYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKK2VuZAorCisKKy0tICdsb2FkZmlsZScgeCBtb2RlcworZG8KKyAgaW8ub3BlbihmaWxlLCAndycpOndyaXRlKCJyZXR1cm4gMTAiKTpjbG9zZSgpCisgIGxvY2FsIHMsIG0gPSBsb2FkZmlsZShmaWxlLCAnYicpCisgIGFzc2VydChub3QgcyBhbmQgc3RyaW5nLmZpbmQobSwgImEgdGV4dCBjaHVuayIpKQorICBpby5vcGVuKGZpbGUsICd3Jyk6d3JpdGUoIlwyNyByZXR1cm4gMTAiKTpjbG9zZSgpCisgIGxvY2FsIHMsIG0gPSBsb2FkZmlsZShmaWxlLCAndCcpCisgIGFzc2VydChub3QgcyBhbmQgc3RyaW5nLmZpbmQobSwgImEgYmluYXJ5IGNodW5rIikpCisgIGFzc2VydChvcy5yZW1vdmUoZmlsZSkpCitlbmQKKworCitpby5vdXRwdXQoZmlsZSkKK2Fzc2VydChpby53cml0ZSgicXVhbHF1ZXIgY29pc2FcbiIpKQorYXNzZXJ0KGlvLndyaXRlKCJtYWlzIHF1YWxxdWVyIGNvaXNhIikpCitpby5jbG9zZSgpCithc3NlcnQoaW8ub3V0cHV0KGFzc2VydChpby5vcGVuKG90aGVyZmlsZSwgJ3diJykpKQorICAgICAgIDp3cml0ZSgib3V0cmEgY29pc2FcMFwxXDNcMFwwXDBcMFwyNTVcMCIpCisgICAgICAgOmNsb3NlKCkpCisKK2xvY2FsIGZpbGVoYW5kbGUgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAncisnKSkKK2xvY2FsIG90aGVyZmlsZWhhbmRsZSA9IGFzc2VydChpby5vcGVuKG90aGVyZmlsZSwgJ3JiJykpCithc3NlcnQoZmlsZWhhbmRsZSB+PSBvdGhlcmZpbGVoYW5kbGUpCithc3NlcnQodHlwZShmaWxlaGFuZGxlKSA9PSAidXNlcmRhdGEiKQorYXNzZXJ0KGZpbGVoYW5kbGU6cmVhZCgnbCcpID09ICJxdWFscXVlciBjb2lzYSIpCitpby5pbnB1dChvdGhlcmZpbGVoYW5kbGUpCithc3NlcnQoaW8ucmVhZChzdHJpbmcubGVuIm91dHJhIGNvaXNhIikgPT0gIm91dHJhIGNvaXNhIikKK2Fzc2VydChmaWxlaGFuZGxlOnJlYWQoJ2wnKSA9PSAibWFpcyBxdWFscXVlciBjb2lzYSIpCitmaWxlaGFuZGxlOmNsb3NlKCk7Cithc3NlcnQodHlwZShmaWxlaGFuZGxlKSA9PSAidXNlcmRhdGEiKQoraW8uaW5wdXQob3RoZXJmaWxlaGFuZGxlKQorYXNzZXJ0KGlvLnJlYWQoNCkgPT0gIlwwXDFcM1wwIikKK2Fzc2VydChpby5yZWFkKDMpID09ICJcMFwwXDAiKQorYXNzZXJ0KGlvLnJlYWQoMCkgPT0gIiIpICAgICAgICAtLSAyNTUgaXMgbm90IGVvZgorYXNzZXJ0KGlvLnJlYWQoMSkgPT0gIlwyNTUiKQorYXNzZXJ0KGlvLnJlYWQoJ2EnKSA9PSAiXDAiKQorYXNzZXJ0KG5vdCBpby5yZWFkKDApKQorYXNzZXJ0KG90aGVyZmlsZWhhbmRsZSA9PSBpby5pbnB1dCgpKQorb3RoZXJmaWxlaGFuZGxlOmNsb3NlKCkKK2Fzc2VydChvcy5yZW1vdmUoZmlsZSkpCithc3NlcnQob3MucmVtb3ZlKG90aGVyZmlsZSkpCitjb2xsZWN0Z2FyYmFnZSgpCisKK2lvLm91dHB1dChmaWxlKQorICA6d3JpdGVbWworIDEyMy40CS01NmUtMiAgbm90IGEgbnVtYmVyCitzZWNvbmQgbGluZQordGhpcmQgbGluZQorCithbmQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUKK11dCisgIDpjbG9zZSgpCitpby5pbnB1dChmaWxlKQorbG9jYWwgXyxhLGIsYyxkLGUsaCxfXyA9IGlvLnJlYWQoMSwgJ24nLCAnbicsICdsJywgJ2wnLCAnbCcsICdhJywgMTApCithc3NlcnQoaW8uY2xvc2UoaW8uaW5wdXQoKSkpCithc3NlcnQoXyA9PSAnICcgYW5kIF9fID09IG5pbCkKK2Fzc2VydCh0eXBlKGEpID09ICdudW1iZXInIGFuZCBhPT0xMjMuNCBhbmQgYj09LTU2ZS0yKQorYXNzZXJ0KGQ9PSdzZWNvbmQgbGluZScgYW5kIGU9PSd0aGlyZCBsaW5lJykKK2Fzc2VydChoPT1bWworCithbmQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUKK11dKQorYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKK2NvbGxlY3RnYXJiYWdlKCkKKworLS0gdGVzdGluZyBidWZmZXJzCitkbworICBsb2NhbCBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKKyAgbG9jYWwgZnIgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAiciIpKQorICBhc3NlcnQoZjpzZXR2YnVmKCJmdWxsIiwgMjAwMCkpCisgIGY6d3JpdGUoIngiKQorICBhc3NlcnQoZnI6cmVhZCgiYWxsIikgPT0gIiIpICAtLSBmdWxsIGJ1ZmZlcjsgb3V0cHV0IG5vdCB3cml0dGVuIHlldAorICBmOmNsb3NlKCkKKyAgZnI6c2Vlaygic2V0IikKKyAgYXNzZXJ0KGZyOnJlYWQoImFsbCIpID09ICJ4IikgICAtLSBgY2xvc2UnIGZsdXNoZXMgaXQKKyAgZiA9IGFzc2VydChpby5vcGVuKGZpbGUpLCAidyIpCisgIGFzc2VydChmOnNldHZidWYoIm5vIikpCisgIGY6d3JpdGUoIngiKQorICBmcjpzZWVrKCJzZXQiKQorICBhc3NlcnQoZnI6cmVhZCgiYWxsIikgPT0gIngiKSAgLS0gbm8gYnVmZmVyOyBvdXRwdXQgaXMgcmVhZHkKKyAgZjpjbG9zZSgpCisgIGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAiYSIpKQorICBhc3NlcnQoZjpzZXR2YnVmKCJsaW5lIikpCisgIGY6d3JpdGUoIngiKQorICBmcjpzZWVrKCJzZXQiLCAxKQorICBhc3NlcnQoZnI6cmVhZCgiYWxsIikgPT0gIiIpICAgLS0gbGluZSBidWZmZXI7IG5vIG91dHB1dCB3aXRob3V0IGBcbicKKyAgZjp3cml0ZSgiYVxuIik6c2Vlaygic2V0IiwgMSkKKyAgYXNzZXJ0KGZyOnJlYWQoImFsbCIpID09ICJ4YVxuIikgIC0tIG5vdyB3ZSBoYXZlIGEgd2hvbGUgbGluZQorICBmOmNsb3NlKCk7IGZyOmNsb3NlKCkKKyAgYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKK2VuZAorCisKK2lmIG5vdCBfc29mdCB0aGVuCisgIHByaW50KCJ0ZXN0aW5nIGxhcmdlIGZpbGVzICg+IEJVRlNJWikiKQorICBpby5vdXRwdXQoZmlsZSkKKyAgZm9yIGk9MSw1MDAxIGRvIGlvLndyaXRlKCcwMTIzNDU2Nzg5MTIzJykgZW5kCisgIGlvLndyaXRlKCdcbjEyMzQ2Jyk6Y2xvc2UoKQorICBpby5pbnB1dChmaWxlKQorICBsb2NhbCB4ID0gaW8ucmVhZCgnYScpCisgIGlvLmlucHV0KCk6c2Vlaygnc2V0JywgMCkKKyAgbG9jYWwgeSA9IGlvLnJlYWQoMzAwMDEpLi5pby5yZWFkKDEwMDUpLi5pby5yZWFkKDApLi4KKyAgICAgICAgICAgIGlvLnJlYWQoMSkuLmlvLnJlYWQoMTAwMDAzKQorICBhc3NlcnQoeCA9PSB5IGFuZCBzdHJpbmcubGVuKHgpID09IDUwMDEqMTMgKyA2KQorICBpby5pbnB1dCgpOnNlZWsoJ3NldCcsIDApCisgIHkgPSBpby5yZWFkKCkgIC0tIGh1Z2UgbGluZQorICBhc3NlcnQoeCA9PSB5Li4nXG4nLi5pby5yZWFkKCkpCisgIGFzc2VydChpby5yZWFkKCkgPT0gbmlsKQorICBpby5jbG9zZShpby5pbnB1dCgpKQorICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQorICB4ID0gbmlsOyB5ID0gbmlsCitlbmQKKworaWYgbm90IF9wb3J0IHRoZW4KKyAgbG9jYWwgcHJvZ25hbWUKKyAgZG8gIC0tIGdldCBuYW1lIG9mIHJ1bm5pbmcgZXhlY3V0YWJsZQorICAgIGxvY2FsIGFyZyA9IGFyZyBvciBBUkcKKyAgICBsb2NhbCBpID0gMAorICAgIHdoaWxlIGFyZ1tpXSBkbyBpID0gaSAtIDEgZW5kCisgICAgcHJvZ25hbWUgPSAnIicgLi4gYXJnW2kgKyAxXSAuLiAnIicKKyAgZW5kCisgIHByaW50KCJ0ZXN0aW5nIHBvcGVuL3BjbG9zZSBhbmQgZXhlY3V0ZSIpCisgIGxvY2FsIHRlc3RzID0geworICAgIC0tIGNvbW1hbmQsICAgd2hhdCwgIGNvZGUKKyAgICB7ImxzID4gL2Rldi9udWxsIiwgIm9rIn0sCisgICAgeyJub3QtdG8tYmUtZm91bmQtY29tbWFuZCIsICJleGl0In0sCisgICAgeyJleGl0IDMiLCAiZXhpdCIsIDN9LAorICAgIHsiZXhpdCAxMjkiLCAiZXhpdCIsIDEyOX0sCisgICAgeyJraWxsIC1zIEhVUCAkJCIsICJzaWduYWwiLCAxfSwKKyAgICB7ImtpbGwgLXMgS0lMTCAkJCIsICJzaWduYWwiLCA5fSwKKyAgICB7InNoIC1jICdraWxsIC1zIEhVUCAkJCciLCAiZXhpdCJ9LAorICAgIHtwcm9nbmFtZSAuLiAnIC1lICIgIicsICJvayJ9LAorICAgIHtwcm9nbmFtZSAuLiAnIC1lICJvcy5leGl0KDAsIHRydWUpIicsICJvayJ9LAorICAgIHtwcm9nbmFtZSAuLiAnIC1lICJvcy5leGl0KDIwLCB0cnVlKSInLCAiZXhpdCIsIDIwfSwKKyAgfQorICBwcmludCgiXG4oc29tZSBlcnJvciBtZXNzYWdlcyBhcmUgZXhwZWN0ZWQgbm93KSIpCisgIGZvciBfLCB2IGluIGlwYWlycyh0ZXN0cykgZG8KKyAgICBsb2NhbCB4LCB5LCB6ID0gaW8ucG9wZW4odlsxXSk6Y2xvc2UoKQorICAgIGxvY2FsIHgxLCB5MSwgejEgPSBvcy5leGVjdXRlKHZbMV0pCisgICAgYXNzZXJ0KHggPT0geDEgYW5kIHkgPT0geTEgYW5kIHogPT0gejEpCisgICAgaWYgdlsyXSA9PSAib2siIHRoZW4KKyAgICAgIGFzc2VydCh4IGFuZCB5ID09ICdleGl0JyBhbmQgeiA9PSAwKQorICAgIGVsc2UKKyAgICAgIGFzc2VydChub3QgeCBhbmQgeSA9PSB2WzJdKSAgIC0tIGNvcnJlY3Qgc3RhdHVzIGFuZCAnd2hhdCcKKyAgICAgIC0tIGNvcnJlY3QgY29kZSBpZiBrbm93biAoYnV0IGFsd2F5cyBkaWZmZXJlbnQgZnJvbSAwKQorICAgICAgYXNzZXJ0KCh2WzNdID09IG5pbCBhbmQgeiA+IDApIG9yIHZbM10gPT0geikKKyAgICBlbmQKKyAgZW5kCitlbmQKKworCistLSB0ZXN0aW5nIHRtcGZpbGUKK2YgPSBpby50bXBmaWxlKCkKK2Fzc2VydChpby50eXBlKGYpID09ICJmaWxlIikKK2Y6d3JpdGUoImFsbyIpCitmOnNlZWsoInNldCIpCithc3NlcnQoZjpyZWFkImEiID09ICJhbG8iKQorCitlbmQgLS19CisKK3ByaW50JysnCisKK3ByaW50KCJ0ZXN0aW5nIGRhdGUvdGltZSIpCisKK2Fzc2VydChvcy5kYXRlKCIiKSA9PSAiIikKK2Fzc2VydChvcy5kYXRlKCIhIikgPT0gIiIpCithc3NlcnQob3MuZGF0ZSgiXDBcMCIpID09ICJcMFwwIikKK2Fzc2VydChvcy5kYXRlKCIhXDBcMCIpID09ICJcMFwwIikKK2xvY2FsIHggPSBzdHJpbmcucmVwKCJhIiwgMTAwMDApCithc3NlcnQob3MuZGF0ZSh4KSA9PSB4KQorbG9jYWwgdCA9IG9zLnRpbWUoKQorRCA9IG9zLmRhdGUoIip0IiwgdCkKK2Fzc2VydChvcy5kYXRlKHN0cmluZy5yZXAoIiVkIiwgMTAwMCksIHQpID09CisgICAgICAgc3RyaW5nLnJlcChvcy5kYXRlKCIlZCIsIHQpLCAxMDAwKSkKK2Fzc2VydChvcy5kYXRlKHN0cmluZy5yZXAoIiUiLCAyMDApKSA9PSBzdHJpbmcucmVwKCIlIiwgMTAwKSkKKworbG9jYWwgdCA9IG9zLnRpbWUoKQorRCA9IG9zLmRhdGUoIip0IiwgdCkKK2xvYWQob3MuZGF0ZShbW2Fzc2VydChELnllYXI9PSVZIGFuZCBELm1vbnRoPT0lbSBhbmQgRC5kYXk9PSVkIGFuZAorICBELmhvdXI9PSVIIGFuZCBELm1pbj09JU0gYW5kIEQuc2VjPT0lUyBhbmQKKyAgRC53ZGF5PT0ldysxIGFuZCBELnlkYXk9PSVqIGFuZCB0eXBlKEQuaXNkc3QpID09ICdib29sZWFuJyldXSwgdCkpKCkKKworY2hlY2tlcnIoImludmFsaWQgY29udmVyc2lvbiBzcGVjaWZpZXIiLCBvcy5kYXRlLCAiJSIpCitjaGVja2VycigiaW52YWxpZCBjb252ZXJzaW9uIHNwZWNpZmllciIsIG9zLmRhdGUsICIlOSIpCitjaGVja2VycigiaW52YWxpZCBjb252ZXJzaW9uIHNwZWNpZmllciIsIG9zLmRhdGUsICIlIikKK2NoZWNrZXJyKCJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgb3MuZGF0ZSwgIiVPIikKK2NoZWNrZXJyKCJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgb3MuZGF0ZSwgIiVFIikKK2NoZWNrZXJyKCJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgb3MuZGF0ZSwgIiVFYSIpCisKK2NoZWNrZXJyKCJub3QgYW4gaW50ZWdlciIsIG9zLnRpbWUsIHt5ZWFyPTEwMDAsIG1vbnRoPTEsIGRheT0xLCBob3VyPSd4J30pCitjaGVja2Vycigibm90IGFuIGludGVnZXIiLCBvcy50aW1lLCB7eWVhcj0xMDAwLCBtb250aD0xLCBkYXk9MSwgaG91cj0xLjV9KQorCitjaGVja2VycigibWlzc2luZyIsIG9zLnRpbWUsIHtob3VyID0gMTJ9KSAgIC0tIG1pc3NpbmcgZGF0ZQorCitpZiBub3QgX3BvcnQgdGhlbgorICAtLSB0ZXN0IFBvc2l4LXNwZWNpZmljIG1vZGlmaWVycworICBhc3NlcnQodHlwZShvcy5kYXRlKCIlRXgiKSkgPT0gJ3N0cmluZycpCisgIGFzc2VydCh0eXBlKG9zLmRhdGUoIiVPeSIpKSA9PSAnc3RyaW5nJykKKworCisgIC0tIHRlc3Qgb3V0LW9mLXJhbmdlIGRhdGVzIChhdCBsZWFzdCBmb3IgVW5peCkKKyAgaWYgbWF4aW50ID49IDJeNjIgdGhlbiAgLS0gY2Fubm90IGRvIHRoZXNlIHRlc3RzIGluIFNtYWxsIEx1YQorICAgIC0tIG5vIGFyaXRoIG92ZXJmbG93cworICAgIGNoZWNrZXJyKCJvdXQtb2YtYm91bmQiLCBvcy50aW1lLCB7eWVhciA9IC1tYXhpbnQsIG1vbnRoID0gMSwgZGF5ID0gMX0pCisgICAgaWYgc3RyaW5nLnBhY2tzaXplKCJpIikgPT0gNCB0aGVuICAgLS0gNC1ieXRlIGludHMKKyAgICAgIGlmIHRlc3RlcnIoIm91dC1vZi1ib3VuZCIsIG9zLmRhdGUsICIlWSIsIDJeNDApIHRoZW4KKyAgICAgICAgLS0gdGltZV90IGhhcyA0IGJ5dGVzIGFuZCB0aGVyZWZvcmUgY2Fubm90IHJlcHJlc2VudCB5ZWFyIDQwMDAKKyAgICAgICAgcHJpbnQoIiAgNC1ieXRlIHRpbWVfdCIpCisgICAgICAgIGNoZWNrZXJyKCJjYW5ub3QgYmUgcmVwcmVzZW50ZWQiLCBvcy50aW1lLCB7eWVhcj00MDAwLCBtb250aD0xLCBkYXk9MX0pCisgICAgICBlbHNlCisgICAgICAgIC0tIHRpbWVfdCBoYXMgOCBieXRlczsgYW4gaW50IHllYXIgY2Fubm90IHJlcHJlc2VudCBhIGh1Z2UgdGltZQorICAgICAgICBwcmludCgiICA4LWJ5dGUgdGltZV90IikKKyAgICAgICAgY2hlY2tlcnIoImNhbm5vdCBiZSByZXByZXNlbnRlZCIsIG9zLmRhdGUsICIlWSIsIDJeNjApCisgICAgICAgIC0tIGl0IHNob3VsZCBoYXZlIG5vIHByb2JsZW1zIHdpdGggeWVhciA0MDAwCisgICAgICAgIGFzc2VydCh0b251bWJlcihvcy50aW1le3llYXI9NDAwMCwgbW9udGg9MSwgZGF5PTF9KSkKKyAgICAgIGVuZAorICAgIGVsc2UgICAgLS0gOC1ieXRlIGludHMKKyAgICAgIC0tIGFzc3VtZSB0aW1lX3QgaGFzIDggYnl0ZXMgdG9vCisgICAgICBwcmludCgiICA4LWJ5dGUgdGltZV90IikKKyAgICAgIGFzc2VydCh0b251bWJlcihvcy5kYXRlKCIlWSIsIDJeNjApKSkKKyAgICAgIC0tIGJ1dCBzdGlsbCBjYW5ub3QgcmVwcmVzZW50IGEgaHVnZSB5ZWFyCisgICAgICBjaGVja2VycigiY2Fubm90IGJlIHJlcHJlc2VudGVkIiwgb3MudGltZSwge3llYXI9Ml42MCwgbW9udGg9MSwgZGF5PTF9KQorICAgIGVuZAorICBlbmQKK2VuZAorCisKK0QgPSBvcy5kYXRlKCIhKnQiLCB0KQorbG9hZChvcy5kYXRlKFtbIWFzc2VydChELnllYXI9PSVZIGFuZCBELm1vbnRoPT0lbSBhbmQgRC5kYXk9PSVkIGFuZAorICBELmhvdXI9PSVIIGFuZCBELm1pbj09JU0gYW5kIEQuc2VjPT0lUyBhbmQKKyAgRC53ZGF5PT0ldysxIGFuZCBELnlkYXk9PSVqIGFuZCB0eXBlKEQuaXNkc3QpID09ICdib29sZWFuJyldXSwgdCkpKCkKKworZG8KKyAgbG9jYWwgRCA9IG9zLmRhdGUoIip0IikKKyAgbG9jYWwgdCA9IG9zLnRpbWUoRCkKKyAgYXNzZXJ0KHR5cGUoRC5pc2RzdCkgPT0gJ2Jvb2xlYW4nKQorICBELmlzZHN0ID0gbmlsCisgIGxvY2FsIHQxID0gb3MudGltZShEKQorICBhc3NlcnQodCA9PSB0MSkgICAtLSBpZiBpc2RzdCBpcyBhYnNlbnQgdXNlcyBjb3JyZWN0IGRlZmF1bHQKK2VuZAorCit0ID0gb3MudGltZShEKQorRC55ZWFyID0gRC55ZWFyLTE7Citsb2NhbCB0MSA9IG9zLnRpbWUoRCkKKy0tIGFsbG93IGZvciBsZWFwIHllYXJzCithc3NlcnQobWF0aC5hYnMob3MuZGlmZnRpbWUodCx0MSkvKDI0KjM2MDApIC0gMzY1KSA8IDIpCisKKy0tIHNob3VsZCBub3QgdGFrZSBtb3JlIHRoYW4gMSBzZWNvbmQgdG8gZXhlY3V0ZSB0aGVzZSB0d28gbGluZXMKK3QgPSBvcy50aW1lKCkKK3QxID0gb3MudGltZShvcy5kYXRlKCIqdCIpKQorbG9jYWwgZGlmZiA9IG9zLmRpZmZ0aW1lKHQxLHQpCithc3NlcnQoMCA8PSBkaWZmIGFuZCBkaWZmIDw9IDEpCitkaWZmID0gb3MuZGlmZnRpbWUodCx0MSkKK2Fzc2VydCgtMSA8PSBkaWZmIGFuZCBkaWZmIDw9IDApCisKK2xvY2FsIHQxID0gb3MudGltZXt5ZWFyPTIwMDAsIG1vbnRoPTEwLCBkYXk9MSwgaG91cj0yMywgbWluPTEyfQorbG9jYWwgdDIgPSBvcy50aW1le3llYXI9MjAwMCwgbW9udGg9MTAsIGRheT0xLCBob3VyPTIzLCBtaW49MTAsIHNlYz0xOX0KK2Fzc2VydChvcy5kaWZmdGltZSh0MSx0MikgPT0gNjAqMi0xOSkKKworLS0gc2luY2UgNS4zLjMsICdvcy50aW1lJyBub3JtYWxpemVzIHRhYmxlIGZpZWxkcwordDEgPSB7eWVhciA9IDIwMDUsIG1vbnRoID0gMSwgZGF5ID0gMSwgaG91ciA9IDEsIG1pbiA9IDAsIHNlYyA9IC0zNjAyfQorb3MudGltZSh0MSkKK2Fzc2VydCh0MS5kYXkgPT0gMzEgYW5kIHQxLm1vbnRoID09IDEyIGFuZCB0MS55ZWFyID09IDIwMDQgYW5kCisgICAgICAgdDEuaG91ciA9PSAyMyBhbmQgdDEubWluID09IDU5IGFuZCB0MS5zZWMgPT0gNTggYW5kCisgICAgICAgdDEueWRheSA9PSAzNjYpCisKK2lvLm91dHB1dChpby5zdGRvdXQpCitsb2NhbCB0ID0gb3MuZGF0ZSgnJWQgJW0gJVkgJUggJU0gJVMnKQorbG9jYWwgZCwgbSwgYSwgaCwgbWluLCBzID0gc3RyaW5nLm1hdGNoKHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJWQrKSAoJWQrKSAoJWQrKSAoJWQrKSAoJWQrKSAoJWQrKSIpCitkID0gdG9udW1iZXIoZCkKK20gPSB0b251bWJlcihtKQorYSA9IHRvbnVtYmVyKGEpCitoID0gdG9udW1iZXIoaCkKK21pbiA9IHRvbnVtYmVyKG1pbikKK3MgPSB0b251bWJlcihzKQoraW8ud3JpdGUoc3RyaW5nLmZvcm1hdCgndGVzdCBkb25lIG9uICUyLjJkLyUyLjJkLyVkJywgZCwgbSwgYSkpCitpby53cml0ZShzdHJpbmcuZm9ybWF0KCcsIGF0ICUyLjJkOiUyLjJkOiUyLjJkXG4nLCBoLCBtaW4sIHMpKQoraW8ud3JpdGUoc3RyaW5nLmZvcm1hdCgnJXNcbicsIF9WRVJTSU9OKSkKKworCmRpZmYgLS1naXQgYS90ZXN0ZXMvZ2MubHVhIGIvdGVzdGVzL2djLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQ3Y2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGVzL2djLmx1YQpAQCAtMCwwICsxLDY2MSBAQAorLS0gJElkOiBnYy5sdWEsdiAxLjgyIDIwMTgvMDMvMTIgMTQ6MTk6MzYgcm9iZXJ0byBFeHAgJAorLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCisKK3ByaW50KCd0ZXN0aW5nIGdhcmJhZ2UgY29sbGVjdGlvbicpCisKK2xvY2FsIGRlYnVnID0gcmVxdWlyZSJkZWJ1ZyIKKworYXNzZXJ0KGNvbGxlY3RnYXJiYWdlKCJpc3J1bm5pbmciKSkKKworY29sbGVjdGdhcmJhZ2UoKQorCitsb2NhbCBvbGRtb2RlID0gY29sbGVjdGdhcmJhZ2UoImluY3JlbWVudGFsIikKKworCitsb2NhbCBmdW5jdGlvbiBnY2luZm8gKCkKKyAgcmV0dXJuIGNvbGxlY3RnYXJiYWdlImNvdW50IiAqIDEwMjQKK2VuZAorCisKKy0tIHRlc3Qgd2VpcmQgcGFyYW1ldGVycyB0byAnY29sbGVjdGdhcmJhZ2UnCitkbworICAtLSBzYXZlIG9yaWdpbmFsIHBhcmFtZXRlcnMKKyAgbG9jYWwgYSA9IGNvbGxlY3RnYXJiYWdlKCJzZXRwYXVzZSIsIDIwMCkKKyAgbG9jYWwgYiA9IGNvbGxlY3RnYXJiYWdlKCJzZXRzdGVwbXVsIiwgMjAwKQorICBsb2NhbCB0ID0gezAsIDIsIDEwLCA5MCwgNTAwLCA1MDAwLCAzMDAwMCwgMHg3ZmZmZmZmZX0KKyAgZm9yIGkgPSAxLCAjdCBkbworICAgIGxvY2FsIHAgPSB0W2ldCisgICAgZm9yIGogPSAxLCAjdCBkbworICAgICAgbG9jYWwgbSA9IHRbal0KKyAgICAgIGNvbGxlY3RnYXJiYWdlKCJzZXRwYXVzZSIsIHApCisgICAgICBjb2xsZWN0Z2FyYmFnZSgic2V0c3RlcG11bCIsIG0pCisgICAgICBjb2xsZWN0Z2FyYmFnZSgic3RlcCIsIDApCisgICAgICBjb2xsZWN0Z2FyYmFnZSgic3RlcCIsIDEwMDAwKQorICAgIGVuZAorICBlbmQKKyAgLS0gcmVzdG9yZSBvcmlnaW5hbCBwYXJhbWV0ZXJzCisgIGNvbGxlY3RnYXJiYWdlKCJzZXRwYXVzZSIsIGEpCisgIGNvbGxlY3RnYXJiYWdlKCJzZXRzdGVwbXVsIiwgYikKKyAgY29sbGVjdGdhcmJhZ2UoKQorZW5kCisKKworX0dbIndoaWxlIl0gPSAyMzQKKworCistLQorLS0gdGVzdHMgZm9yIEdDIGFjdGl2YXRpb24gd2hlbiBjcmVhdGluZyBkaWZmZXJlbnQga2luZHMgb2Ygb2JqZWN0cworLS0KK2xvY2FsIGZ1bmN0aW9uIEdDMSAoKQorICBsb2NhbCB1CisgIGxvY2FsIGIgICAgIC0tIChhYm92ZSAndScgaXQgaW4gdGhlIHN0YWNrKQorICBsb2NhbCBmaW5pc2ggPSBmYWxzZQorICB1ID0gc2V0bWV0YXRhYmxlKHt9LCB7X19nYyA9IGZ1bmN0aW9uICgpIGZpbmlzaCA9IHRydWUgZW5kfSkKKyAgYiA9IHszNH0KKyAgcmVwZWF0IHUgPSB7fSB1bnRpbCBmaW5pc2gKKyAgYXNzZXJ0KGJbMV0gPT0gMzQpICAgLS0gJ3UnIHdhcyBjb2xsZWN0ZWQsIGJ1dCAnYicgd2FzIG5vdAorCisgIGZpbmlzaCA9IGZhbHNlOyBsb2NhbCBpID0gMQorICB1ID0gc2V0bWV0YXRhYmxlKHt9LCB7X19nYyA9IGZ1bmN0aW9uICgpIGZpbmlzaCA9IHRydWUgZW5kfSkKKyAgcmVwZWF0IGkgPSBpICsgMTsgdSA9IHRvc3RyaW5nKGkpIC4uIHRvc3RyaW5nKGkpIHVudGlsIGZpbmlzaAorICBhc3NlcnQoYlsxXSA9PSAzNCkgICAtLSAndScgd2FzIGNvbGxlY3RlZCwgYnV0ICdiJyB3YXMgbm90CisKKyAgZmluaXNoID0gZmFsc2UKKyAgdSA9IHNldG1ldGF0YWJsZSh7fSwge19fZ2MgPSBmdW5jdGlvbiAoKSBmaW5pc2ggPSB0cnVlIGVuZH0pCisgIHJlcGVhdCBsb2NhbCBpOyB1ID0gZnVuY3Rpb24gKCkgcmV0dXJuIGkgZW5kIHVudGlsIGZpbmlzaAorICBhc3NlcnQoYlsxXSA9PSAzNCkgICAtLSAndScgd2FzIGNvbGxlY3RlZCwgYnV0ICdiJyB3YXMgbm90CitlbmQKKworbG9jYWwgZnVuY3Rpb24gR0MyICgpCisgIGxvY2FsIHUKKyAgbG9jYWwgZmluaXNoID0gZmFsc2UKKyAgdSA9IHtzZXRtZXRhdGFibGUoe30sIHtfX2djID0gZnVuY3Rpb24gKCkgZmluaXNoID0gdHJ1ZSBlbmR9KX0KKyAgbG9jYWwgYiA9IHszNH0KKyAgcmVwZWF0IHUgPSB7e319IHVudGlsIGZpbmlzaAorICBhc3NlcnQoYlsxXSA9PSAzNCkgICAtLSAndScgd2FzIGNvbGxlY3RlZCwgYnV0ICdiJyB3YXMgbm90CisKKyAgZmluaXNoID0gZmFsc2U7IGxvY2FsIGkgPSAxCisgIHUgPSB7c2V0bWV0YXRhYmxlKHt9LCB7X19nYyA9IGZ1bmN0aW9uICgpIGZpbmlzaCA9IHRydWUgZW5kfSl9CisgIHJlcGVhdCBpID0gaSArIDE7IHUgPSB7dG9zdHJpbmcoaSkgLi4gdG9zdHJpbmcoaSl9IHVudGlsIGZpbmlzaAorICBhc3NlcnQoYlsxXSA9PSAzNCkgICAtLSAndScgd2FzIGNvbGxlY3RlZCwgYnV0ICdiJyB3YXMgbm90CisKKyAgZmluaXNoID0gZmFsc2UKKyAgdSA9IHtzZXRtZXRhdGFibGUoe30sIHtfX2djID0gZnVuY3Rpb24gKCkgZmluaXNoID0gdHJ1ZSBlbmR9KX0KKyAgcmVwZWF0IGxvY2FsIGk7IHUgPSB7ZnVuY3Rpb24gKCkgcmV0dXJuIGkgZW5kfSB1bnRpbCBmaW5pc2gKKyAgYXNzZXJ0KGJbMV0gPT0gMzQpICAgLS0gJ3UnIHdhcyBjb2xsZWN0ZWQsIGJ1dCAnYicgd2FzIG5vdAorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIEdDKCkgIEdDMSgpOyBHQzIoKSBlbmQKKworCitkbworICBwcmludCgiY3JlYXRpbmcgbWFueSBvYmplY3RzIikKKworICBsb2NhbCBjb250Q3JlYXRlID0gMAorCisgIGxvY2FsIGxpbWl0ID0gNTAwMAorCisgIHdoaWxlIGNvbnRDcmVhdGUgPD0gbGltaXQgZG8KKyAgICBsb2NhbCBhID0ge307IGEgPSBuaWwKKyAgICBjb250Q3JlYXRlID0gY29udENyZWF0ZSsxCisgIGVuZAorCisgIGxvY2FsIGEgPSAiYSIKKworICBjb250Q3JlYXRlID0gMAorICB3aGlsZSBjb250Q3JlYXRlIDw9IGxpbWl0IGRvCisgICAgYSA9IGNvbnRDcmVhdGUgLi4gImIiOworICAgIGEgPSBzdHJpbmcuZ3N1YihhLCAnKCVkJWQqKScsIHN0cmluZy51cHBlcikKKyAgICBhID0gImEiCisgICAgY29udENyZWF0ZSA9IGNvbnRDcmVhdGUrMQorICBlbmQKKworCisgIGNvbnRDcmVhdGUgPSAwCisKKyAgYSA9IHt9CisKKyAgZnVuY3Rpb24gYTp0ZXN0ICgpCisgICAgd2hpbGUgY29udENyZWF0ZSA8PSBsaW1pdCBkbworICAgICAgbG9hZChzdHJpbmcuZm9ybWF0KCJmdW5jdGlvbiB0ZW1wKGEpIHJldHVybiAnYSVkJyBlbmQiLCBjb250Q3JlYXRlKSwgIiIpKCkKKyAgICAgIGFzc2VydCh0ZW1wKCkgPT0gc3RyaW5nLmZvcm1hdCgnYSVkJywgY29udENyZWF0ZSkpCisgICAgICBjb250Q3JlYXRlID0gY29udENyZWF0ZSsxCisgICAgZW5kCisgIGVuZAorCisgIGE6dGVzdCgpCisKK2VuZAorCisKKy0tIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIHdpdGhvdXQgbG9jYWxzLCBnbG9iYWxzLCBldGMuCitkbyBsb2NhbCBmID0gZnVuY3Rpb24gKCkgZW5kIGVuZAorCisKK3ByaW50KCJmdW5jdGlvbnMgd2l0aCBlcnJvcnMiKQorcHJvZyA9IFtbCitkbworICBhID0gMTA7CisgIGZ1bmN0aW9uIGZvbyh4LHkpCisgICAgYSA9IHNpbihhKzAuNDU2LTAuMjNlLTEyKTsKKyAgICByZXR1cm4gZnVuY3Rpb24gKHopIHJldHVybiBzaW4oJXgreikgZW5kCisgIGVuZAorICBsb2NhbCB4ID0gZnVuY3Rpb24gKHcpIGE9YSt3OyBlbmQKK2VuZAorXV0KK2RvCisgIGxvY2FsIHN0ZXAgPSAxCisgIGlmIF9zb2Z0IHRoZW4gc3RlcCA9IDEzIGVuZAorICBmb3IgaT0xLCBzdHJpbmcubGVuKHByb2cpLCBzdGVwIGRvCisgICAgZm9yIGo9aSwgc3RyaW5nLmxlbihwcm9nKSwgc3RlcCBkbworICAgICAgcGNhbGwobG9hZChzdHJpbmcuc3ViKHByb2csIGksIGopLCAiIikpCisgICAgZW5kCisgIGVuZAorZW5kCisKK2ZvbyA9IG5pbAorcHJpbnQoJ2xvbmcgc3RyaW5ncycpCit4ID0gIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorYXNzZXJ0KHN0cmluZy5sZW4oeCk9PTgwKQorcyA9ICcnCituID0gMAorayA9IG1hdGgubWluKDMwMCwgKG1hdGgubWF4aW50ZWdlciAvLyA4MCkgLy8gMikKK3doaWxlIG4gPCBrIGRvIHMgPSBzLi54OyBuPW4rMTsgaj10b3N0cmluZyhuKSAgZW5kCithc3NlcnQoc3RyaW5nLmxlbihzKSA9PSBrKjgwKQorcyA9IHN0cmluZy5zdWIocywgMSwgMTAwMDApCitzLCBpID0gc3RyaW5nLmdzdWIocywgJyglZCVkJWQlZCknLCAnJykKK2Fzc2VydChpPT0xMDAwMCAvLyA0KQorcyA9IG5pbAoreCA9IG5pbAorCithc3NlcnQoX0dbIndoaWxlIl0gPT0gMjM0KQorCisKKy0tCistLSB0ZXN0IHRoZSAic2l6ZSIgb2YgYmFzaWMgR0Mgc3RlcHMgKHdoYXRldmVyIHRoZXkgbWVhbi4uLikKKy0tCitkbworcHJpbnQoInN0ZXBzIikKKworICBwcmludCgic3RlcHMgKDIpIikKKworICBsb2NhbCBmdW5jdGlvbiBkb3N0ZXBzIChzaXopCisgICAgY29sbGVjdGdhcmJhZ2UoKQorICAgIGxvY2FsIGEgPSB7fQorICAgIGZvciBpPTEsMTAwIGRvIGFbaV0gPSB7e319OyBsb2NhbCBiID0ge30gZW5kCisgICAgbG9jYWwgeCA9IGdjaW5mbygpCisgICAgbG9jYWwgaSA9IDAKKyAgICByZXBlYXQgICAtLSBkbyBzdGVwcyB1bnRpbCBpdCBjb21wbGV0ZXMgYSBjb2xsZWN0aW9uIGN5Y2xlCisgICAgICBpID0gaSsxCisgICAgdW50aWwgY29sbGVjdGdhcmJhZ2UoInN0ZXAiLCBzaXopCisgICAgYXNzZXJ0KGdjaW5mbygpIDwgeCkKKyAgICByZXR1cm4gaSAgICAtLSBudW1iZXIgb2Ygc3RlcHMKKyAgZW5kCisKKyAgY29sbGVjdGdhcmJhZ2Uic3RvcCIKKworICBpZiBub3QgX3BvcnQgdGhlbgorICAgIGFzc2VydChkb3N0ZXBzKDEwKSA8IGRvc3RlcHMoMikpCisgIGVuZAorCisgIC0tIGNvbGxlY3RvciBzaG91bGQgZG8gYSBmdWxsIGNvbGxlY3Rpb24gd2l0aCBzbyBtYW55IHN0ZXBzCisgIGFzc2VydChkb3N0ZXBzKDIwMDAwKSA9PSAxKQorICBhc3NlcnQoY29sbGVjdGdhcmJhZ2UoInN0ZXAiLCAyMDAwMCkgPT0gdHJ1ZSkKKyAgYXNzZXJ0KGNvbGxlY3RnYXJiYWdlKCJzdGVwIiwgMjAwMDApID09IHRydWUpCisKKyAgYXNzZXJ0KG5vdCBjb2xsZWN0Z2FyYmFnZSgiaXNydW5uaW5nIikpCisgIGNvbGxlY3RnYXJiYWdlInJlc3RhcnQiCisgIGFzc2VydChjb2xsZWN0Z2FyYmFnZSgiaXNydW5uaW5nIikpCisKK2VuZAorCisKK2lmIG5vdCBfcG9ydCB0aGVuCisgIC0tIHRlc3QgdGhlIHBhY2Ugb2YgdGhlIGNvbGxlY3RvcgorICBjb2xsZWN0Z2FyYmFnZSgpOyBjb2xsZWN0Z2FyYmFnZSgpCisgIGxvY2FsIHggPSBnY2luZm8oKQorICBjb2xsZWN0Z2FyYmFnZSJzdG9wIgorICByZXBlYXQKKyAgICBsb2NhbCBhID0ge30KKyAgdW50aWwgZ2NpbmZvKCkgPiAzICogeAorICBjb2xsZWN0Z2FyYmFnZSJyZXN0YXJ0IgorICBhc3NlcnQoY29sbGVjdGdhcmJhZ2UoImlzcnVubmluZyIpKQorICByZXBlYXQKKyAgICBsb2NhbCBhID0ge30KKyAgdW50aWwgZ2NpbmZvKCkgPD0geCAqIDIKK2VuZAorCisKK3ByaW50KCJjbGVhcmluZyB0YWJsZXMiKQorbGltID0gMTUKK2EgPSB7fQorLS0gZmlsbCBhIHdpdGggYGNvbGxlY3RhYmxlJyBpbmRpY2VzCitmb3IgaT0xLGxpbSBkbyBhW3t9XSA9IGkgZW5kCitiID0ge30KK2ZvciBrLHYgaW4gcGFpcnMoYSkgZG8gYltrXT12IGVuZAorLS0gcmVtb3ZlIGFsbCBpbmRpY2VzIGFuZCBjb2xsZWN0IHRoZW0KK2ZvciBuIGluIHBhaXJzKGIpIGRvCisgIGFbbl0gPSB1bmRlZgorICBhc3NlcnQodHlwZShuKSA9PSAndGFibGUnIGFuZCBuZXh0KG4pID09IG5pbCkKKyAgY29sbGVjdGdhcmJhZ2UoKQorZW5kCitiID0gbmlsCitjb2xsZWN0Z2FyYmFnZSgpCitmb3IgbiBpbiBwYWlycyhhKSBkbyBlcnJvcidjYW5ub3QgYmUgaGVyZScgZW5kCitmb3IgaT0xLGxpbSBkbyBhW2ldID0gaSBlbmQKK2ZvciBpPTEsbGltIGRvIGFzc2VydChhW2ldID09IGkpIGVuZAorCisKK3ByaW50KCd3ZWFrIHRhYmxlcycpCithID0ge307IHNldG1ldGF0YWJsZShhLCB7X19tb2RlID0gJ2snfSk7CistLSBmaWxsIGEgd2l0aCBzb21lIGBjb2xsZWN0YWJsZScgaW5kaWNlcworZm9yIGk9MSxsaW0gZG8gYVt7fV0gPSBpIGVuZAorLS0gYW5kIHNvbWUgbm9uLWNvbGxlY3RhYmxlIG9uZXMKK2ZvciBpPTEsbGltIGRvIGFbaV0gPSBpIGVuZAorZm9yIGk9MSxsaW0gZG8gbG9jYWwgcz1zdHJpbmcucmVwKCdAJywgaSk7IGFbc10gPSBzLi4nIycgZW5kCitjb2xsZWN0Z2FyYmFnZSgpCitsb2NhbCBpID0gMAorZm9yIGssdiBpbiBwYWlycyhhKSBkbyBhc3NlcnQoaz09diBvciBrLi4nIyc9PXYpOyBpPWkrMSBlbmQKK2Fzc2VydChpID09IDIqbGltKQorCithID0ge307IHNldG1ldGF0YWJsZShhLCB7X19tb2RlID0gJ3YnfSk7CithWzFdID0gc3RyaW5nLnJlcCgnYicsIDIxKQorY29sbGVjdGdhcmJhZ2UoKQorYXNzZXJ0KGFbMV0pICAgLS0gc3RyaW5ncyBhcmUgKnZhbHVlcyoKK2FbMV0gPSB1bmRlZgorLS0gZmlsbCBhIHdpdGggc29tZSBgY29sbGVjdGFibGUnIHZhbHVlcyAoaW4gYm90aCBwYXJ0cyBvZiB0aGUgdGFibGUpCitmb3IgaT0xLGxpbSBkbyBhW2ldID0ge30gZW5kCitmb3IgaT0xLGxpbSBkbyBhW2kuLid4J10gPSB7fSBlbmQKKy0tIGFuZCBzb21lIG5vbi1jb2xsZWN0YWJsZSBvbmVzCitmb3IgaT0xLGxpbSBkbyBsb2NhbCB0PXt9OyBhW3RdPXQgZW5kCitmb3IgaT0xLGxpbSBkbyBhW2krbGltXT1pLi4neCcgZW5kCitjb2xsZWN0Z2FyYmFnZSgpCitsb2NhbCBpID0gMAorZm9yIGssdiBpbiBwYWlycyhhKSBkbyBhc3NlcnQoaz09diBvciBrLWxpbS4uJ3gnID09IHYpOyBpPWkrMSBlbmQKK2Fzc2VydChpID09IDIqbGltKQorCithID0ge307IHNldG1ldGF0YWJsZShhLCB7X19tb2RlID0gJ2t2J30pOworbG9jYWwgeCwgeSwgeiA9IHt9LCB7fSwge30KKy0tIGtlZXAgb25seSBzb21lIGl0ZW1zCithWzFdLCBhWzJdLCBhWzNdID0geCwgeSwgegorYVtzdHJpbmcucmVwKCckJywgMTEpXSA9IHN0cmluZy5yZXAoJyQnLCAxMSkKKy0tIGZpbGwgYSB3aXRoIHNvbWUgYGNvbGxlY3RhYmxlJyB2YWx1ZXMKK2ZvciBpPTQsbGltIGRvIGFbaV0gPSB7fSBlbmQKK2ZvciBpPTEsbGltIGRvIGFbe31dID0gaSBlbmQKK2ZvciBpPTEsbGltIGRvIGxvY2FsIHQ9e307IGFbdF09dCBlbmQKK2NvbGxlY3RnYXJiYWdlKCkKK2Fzc2VydChuZXh0KGEpIH49IG5pbCkKK2xvY2FsIGkgPSAwCitmb3Igayx2IGluIHBhaXJzKGEpIGRvCisgIGFzc2VydCgoayA9PSAxIGFuZCB2ID09IHgpIG9yCisgICAgICAgICAoayA9PSAyIGFuZCB2ID09IHkpIG9yCisgICAgICAgICAoayA9PSAzIGFuZCB2ID09IHopIG9yIGs9PXYpOworICBpID0gaSsxCitlbmQKK2Fzc2VydChpID09IDQpCit4LHksej1uaWwKK2NvbGxlY3RnYXJiYWdlKCkKK2Fzc2VydChuZXh0KGEpID09IHN0cmluZy5yZXAoJyQnLCAxMSkpCisKKworLS0gJ2J1ZycgaW4gNS4xCithID0ge30KK2xvY2FsIHQgPSB7eCA9IDEwfQorbG9jYWwgQyA9IHNldG1ldGF0YWJsZSh7a2V5ID0gdH0sIHtfX21vZGUgPSAndid9KQorbG9jYWwgQzEgPSBzZXRtZXRhdGFibGUoe1t0XSA9IDF9LCB7X19tb2RlID0gJ2snfSkKK2EueCA9IHQgIC0tIHRoaXMgc2hvdWxkIG5vdCBwcmV2ZW50ICd0JyBmcm9tIGJlaW5nIHJlbW92ZWQgZnJvbQorICAgICAgICAgLS0gd2VhayB0YWJsZSAnQycgYnkgdGhlIHRpbWUgJ2EnIGlzIGZpbmFsaXplZAorCitzZXRtZXRhdGFibGUoYSwge19fZ2MgPSBmdW5jdGlvbiAodSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KEMua2V5ID09IG5pbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGUobmV4dChDMSkpID09ICd0YWJsZScpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZH0pCisKK2EsIHQgPSBuaWwKK2NvbGxlY3RnYXJiYWdlKCkKK2NvbGxlY3RnYXJiYWdlKCkKK2Fzc2VydChuZXh0KEMpID09IG5pbCBhbmQgbmV4dChDMSkgPT0gbmlsKQorQywgQzEgPSBuaWwKKworCistLSBlcGhlbWVyb25zCitsb2NhbCBtdCA9IHtfX21vZGUgPSAnayd9CithID0ge3sxMH0sezIwfSx7MzB9LHs0MH19OyBzZXRtZXRhdGFibGUoYSwgbXQpCit4ID0gbmlsCitmb3IgaSA9IDEsIDEwMCBkbyBsb2NhbCBuID0ge307IGFbbl0gPSB7ayA9IHt4fX07IHggPSBuIGVuZAorR0MoKQorbG9jYWwgbiA9IHgKK2xvY2FsIGkgPSAwCit3aGlsZSBuIGRvIG4gPSBhW25dLmtbMV07IGkgPSBpICsgMSBlbmQKK2Fzc2VydChpID09IDEwMCkKK3ggPSBuaWwKK0dDKCkKK2ZvciBpID0gMSwgNCBkbyBhc3NlcnQoYVtpXVsxXSA9PSBpICogMTApOyBhW2ldID0gdW5kZWYgZW5kCithc3NlcnQobmV4dChhKSA9PSBuaWwpCisKK2xvY2FsIEsgPSB7fQorYVtLXSA9IHt9Citmb3IgaT0xLDEwIGRvIGFbS11baV0gPSB7fTsgYVthW0tdW2ldXSA9IHNldG1ldGF0YWJsZSh7fSwgbXQpIGVuZAoreCA9IG5pbAorbG9jYWwgayA9IDEKK2ZvciBqID0gMSwxMDAgZG8KKyAgbG9jYWwgbiA9IHt9OyBsb2NhbCBuayA9IGslMTAgKyAxCisgIGFbYVtLXVtua11dW25dID0ge3gsIGsgPSBrfTsgeCA9IG47IGsgPSBuaworZW5kCitHQygpCitsb2NhbCBuID0geAorbG9jYWwgaSA9IDAKK3doaWxlIG4gZG8gbG9jYWwgdCA9IGFbYVtLXVtrXV1bbl07IG4gPSB0WzFdOyBrID0gdC5rOyBpID0gaSArIDEgZW5kCithc3NlcnQoaSA9PSAxMDApCitLID0gbmlsCitHQygpCistLSBhc3NlcnQobmV4dChhKSA9PSBuaWwpCisKKworLS0gdGVzdGluZyBlcnJvcnMgZHVyaW5nIEdDCitkbworY29sbGVjdGdhcmJhZ2UoInN0b3AiKSAgIC0tIHN0b3AgY29sbGVjdGlvbgorbG9jYWwgdSA9IHt9Citsb2NhbCBzID0ge307IHNldG1ldGF0YWJsZShzLCB7X19tb2RlID0gJ2snfSkKK3NldG1ldGF0YWJsZSh1LCB7X19nYyA9IGZ1bmN0aW9uIChvKQorICBsb2NhbCBpID0gc1tvXQorICBzW2ldID0gdHJ1ZQorICBhc3NlcnQobm90IHNbaSAtIDFdKSAgIC0tIGNoZWNrIHByb3BlciBmaW5hbGl6YXRpb24gb3JkZXIKKyAgaWYgaSA9PSA4IHRoZW4gZXJyb3IoImhlcmUiKSBlbmQgICAtLSBlcnJvciBkdXJpbmcgR0MKK2VuZH0pCisKK2ZvciBpID0gNiwgMTAgZG8KKyAgbG9jYWwgbiA9IHNldG1ldGF0YWJsZSh7fSwgZ2V0bWV0YXRhYmxlKHUpKQorICBzW25dID0gaQorZW5kCisKK2Fzc2VydChub3QgcGNhbGwoY29sbGVjdGdhcmJhZ2UpKQorZm9yIGkgPSA4LCAxMCBkbyBhc3NlcnQoc1tpXSkgZW5kCisKK2ZvciBpID0gMSwgNSBkbworICBsb2NhbCBuID0gc2V0bWV0YXRhYmxlKHt9LCBnZXRtZXRhdGFibGUodSkpCisgIHNbbl0gPSBpCitlbmQKKworY29sbGVjdGdhcmJhZ2UoKQorZm9yIGkgPSAxLCAxMCBkbyBhc3NlcnQoc1tpXSkgZW5kCisKK2dldG1ldGF0YWJsZSh1KS5fX2djID0gZmFsc2UKKworCistLSBfX2djIGVycm9ycyB3aXRoIG5vbi1zdHJpbmcgbWVzc2FnZXMKK3NldG1ldGF0YWJsZSh7fSwge19fZ2MgPSBmdW5jdGlvbiAoKSBlcnJvcnt9IGVuZH0pCitsb2NhbCBhLCBiID0gcGNhbGwoY29sbGVjdGdhcmJhZ2UpCithc3NlcnQobm90IGEgYW5kIHR5cGUoYikgPT0gInN0cmluZyIgYW5kIHN0cmluZy5maW5kKGIsICJlcnJvciBpbiBfX2djIikpCisKK2VuZAorcHJpbnQgJysnCisKKworLS0gdGVzdGluZyB1c2VyZGF0YQoraWYgVD09bmlsIHRoZW4KKyAgKE1lc3NhZ2Ugb3IgcHJpbnQpKCdcbiA+Pj4gdGVzdEMgbm90IGFjdGl2ZTogc2tpcHBpbmcgdXNlcmRhdGEgR0MgdGVzdHMgPDw8XG4nKQorCitlbHNlCisKKyAgbG9jYWwgZnVuY3Rpb24gbmV3cHJveHkodSkKKyAgICByZXR1cm4gZGVidWcuc2V0bWV0YXRhYmxlKFQubmV3dXNlcmRhdGEoMCksIGRlYnVnLmdldG1ldGF0YWJsZSh1KSkKKyAgZW5kCisKKyAgY29sbGVjdGdhcmJhZ2UoInN0b3AiKSAgIC0tIHN0b3AgY29sbGVjdGlvbgorICBsb2NhbCB1ID0gbmV3cHJveHkobmlsKQorICBkZWJ1Zy5zZXRtZXRhdGFibGUodSwge19fZ2MgPSB0cnVlfSkKKyAgbG9jYWwgcyA9IDAKKyAgbG9jYWwgYSA9IHtbdV0gPSAwfTsgc2V0bWV0YXRhYmxlKGEsIHtfX21vZGUgPSAndmsnfSkKKyAgZm9yIGk9MSwxMCBkbyBhW25ld3Byb3h5KHUpXSA9IGkgZW5kCisgIGZvciBrIGluIHBhaXJzKGEpIGRvIGFzc2VydChnZXRtZXRhdGFibGUoaykgPT0gZ2V0bWV0YXRhYmxlKHUpKSBlbmQKKyAgbG9jYWwgYTEgPSB7fTsgZm9yIGssdiBpbiBwYWlycyhhKSBkbyBhMVtrXSA9IHYgZW5kCisgIGZvciBrLHYgaW4gcGFpcnMoYTEpIGRvIGFbdl0gPSBrIGVuZAorICBmb3IgaSA9MSwxMCBkbyBhc3NlcnQoYVtpXSkgZW5kCisgIGdldG1ldGF0YWJsZSh1KS5hID0gYTEKKyAgZ2V0bWV0YXRhYmxlKHUpLnUgPSB1CisgIGRvCisgICAgbG9jYWwgdSA9IHUKKyAgICBnZXRtZXRhdGFibGUodSkuX19nYyA9IGZ1bmN0aW9uIChvKQorICAgICAgYXNzZXJ0KGFbb10gPT0gMTAtcykKKyAgICAgIGFzc2VydChhWzEwLXNdID09IHVuZGVmKSAtLSB1ZGF0YSBhbHJlYWR5IHJlbW92ZWQgZnJvbSB3ZWFrIHRhYmxlCisgICAgICBhc3NlcnQoZ2V0bWV0YXRhYmxlKG8pID09IGdldG1ldGF0YWJsZSh1KSkKKyAgICBhc3NlcnQoZ2V0bWV0YXRhYmxlKG8pLmFbb10gPT0gMTAtcykKKyAgICAgIHM9cysxCisgICAgZW5kCisgIGVuZAorICBhMSwgdSA9IG5pbAorICBhc3NlcnQobmV4dChhKSB+PSBuaWwpCisgIGNvbGxlY3RnYXJiYWdlKCkKKyAgYXNzZXJ0KHM9PTExKQorICBjb2xsZWN0Z2FyYmFnZSgpCisgIGFzc2VydChuZXh0KGEpID09IG5pbCkgIC0tIGZpbmFsaXplZCBrZXlzIGFyZSByZW1vdmVkIGluIHR3byBjeWNsZXMKK2VuZAorCisKKy0tIF9fZ2MgeCB3ZWFrIHRhYmxlcworbG9jYWwgdSA9IHNldG1ldGF0YWJsZSh7fSwge19fZ2MgPSB0cnVlfSkKKy0tIF9fZ2MgbWV0YW1ldGhvZCBzaG91bGQgYmUgY29sbGVjdGVkIGJlZm9yZSBydW5uaW5nCitzZXRtZXRhdGFibGUoZ2V0bWV0YXRhYmxlKHUpLCB7X19tb2RlID0gInYifSkKK2dldG1ldGF0YWJsZSh1KS5fX2djID0gZnVuY3Rpb24gKG8pIG9zLmV4aXQoMSkgZW5kICAtLSBjYW5ub3QgaGFwcGVuCit1ID0gbmlsCitjb2xsZWN0Z2FyYmFnZSgpCisKK2xvY2FsIHUgPSBzZXRtZXRhdGFibGUoe30sIHtfX2djID0gdHJ1ZX0pCitsb2NhbCBtID0gZ2V0bWV0YXRhYmxlKHUpCittLnggPSB7W3swfV0gPSAxOyBbMF0gPSB7MX19OyBzZXRtZXRhdGFibGUobS54LCB7X19tb2RlID0gImt2In0pOworbS5fX2djID0gZnVuY3Rpb24gKG8pCisgIGFzc2VydChuZXh0KGdldG1ldGF0YWJsZShvKS54KSA9PSBuaWwpCisgIG0gPSAxMAorZW5kCit1LCBtID0gbmlsCitjb2xsZWN0Z2FyYmFnZSgpCithc3NlcnQobT09MTApCisKK2RvICAgLS0gdGVzdHMgZm9yIHN0cmluZyBrZXlzIGluIHdlYWsgdGFibGVzCisgIGNvbGxlY3RnYXJiYWdlKCk7IGNvbGxlY3RnYXJiYWdlKCkKKyAgbG9jYWwgbSA9IGNvbGxlY3RnYXJiYWdlKCJjb3VudCIpICAgICAgICAgLS0gY3VycmVudCBtZW1vcnkKKyAgbG9jYWwgYSA9IHNldG1ldGF0YWJsZSh7fSwge19fbW9kZSA9ICJrdiJ9KQorICBhW3N0cmluZy5yZXAoImEiLCAyXjIyKV0gPSAyNSAgIC0tIGxvbmcgc3RyaW5nIGtleSAtPiBudW1iZXIgdmFsdWUKKyAgYVtzdHJpbmcucmVwKCJiIiwgMl4yMildID0ge30gICAtLSBsb25nIHN0cmluZyBrZXkgLT4gY29sZWN0YWJsZSB2YWx1ZQorICBhW3t9XSA9IDE0ICAgICAgICAgICAgICAgICAgICAgLS0gY29sZWN0YWJsZSBrZXkKKyAgYXNzZXJ0KGNvbGxlY3RnYXJiYWdlKCJjb3VudCIpID4gbSArIDJeMTMpICAgIC0tIDJeMTMgPT0gMiAqIDJeMjIgaW4gS0IKKyAgY29sbGVjdGdhcmJhZ2UoKQorICBhc3NlcnQoY29sbGVjdGdhcmJhZ2UoImNvdW50IikgPj0gbSArIDJeMTIgYW5kCisgICAgICAgIGNvbGxlY3RnYXJiYWdlKCJjb3VudCIpIDwgbSArIDJeMTMpICAgIC0tIG9uZSBrZXkgd2FzIGNvbGxlY3RlZAorICBsb2NhbCBrLCB2ID0gbmV4dChhKSAgIC0tIHN0cmluZyBrZXkgd2l0aCBudW1iZXIgdmFsdWUgcHJlc2VydmVkCisgIGFzc2VydChrID09IHN0cmluZy5yZXAoImEiLCAyXjIyKSBhbmQgdiA9PSAyNSkKKyAgYXNzZXJ0KG5leHQoYSwgaykgPT0gbmlsKSAgLS0gZXZlcnl0aGluZyBlbHNlIGNsZWFyZWQKKyAgYXNzZXJ0KGFbc3RyaW5nLnJlcCgiYiIsIDJeMjIpXSA9PSB1bmRlZikKKyAgYVtrXSA9IHVuZGVmICAgICAgICAtLSBlcmFzZSB0aGlzIGxhc3QgZW50cnkKKyAgayA9IG5pbAorICBjb2xsZWN0Z2FyYmFnZSgpCisgIGFzc2VydChuZXh0KGEpID09IG5pbCkKKyAgLS0gbWFrZSBzdXJlIHdpbGwgbm90IHRyeSB0byBjb21wYXJlIHdpdGggZGVhZCBrZXkKKyAgYXNzZXJ0KGFbc3RyaW5nLnJlcCgiYiIsIDEwMCldID09IHVuZGVmKQorICBhc3NlcnQoY29sbGVjdGdhcmJhZ2UoImNvdW50IikgPD0gbSArIDEpICAgLS0gZXZleXRoaW5nIGNvbGxlY3RlZAorZW5kCisKKworLS0gZXJyb3JzIGR1cmluZyBjb2xsZWN0aW9uCit1ID0gc2V0bWV0YXRhYmxlKHt9LCB7X19nYyA9IGZ1bmN0aW9uICgpIGVycm9yICIhISEiIGVuZH0pCit1ID0gbmlsCithc3NlcnQobm90IHBjYWxsKGNvbGxlY3RnYXJiYWdlKSkKKworCitpZiBub3QgX3NvZnQgdGhlbgorICBwcmludCgibG9uZyBsaXN0IikKKyAgbG9jYWwgYSA9IHt9CisgIGZvciBpID0gMSwyMDAwMDAgZG8KKyAgICBhID0ge25leHQgPSBhfQorICBlbmQKKyAgYSA9IG5pbAorICBjb2xsZWN0Z2FyYmFnZSgpCitlbmQKKworLS0gY3JlYXRlIG1hbnkgdGhyZWFkcyB3aXRoIHNlbGYtcmVmZXJlbmNlcyBhbmQgb3BlbiB1cHZhbHVlcworcHJpbnQoInNlbGYtcmVmZXJlbmNlZCB0aHJlYWRzIikKK2xvY2FsIHRocmVhZF9pZCA9IDAKK2xvY2FsIHRocmVhZHMgPSB7fQorCitsb2NhbCBmdW5jdGlvbiBmbiAodGhyZWFkKQorICAgIGxvY2FsIHggPSB7fQorICAgIHRocmVhZHNbdGhyZWFkX2lkXSA9IGZ1bmN0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0geAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgIGNvcm91dGluZS55aWVsZCgpCitlbmQKKword2hpbGUgdGhyZWFkX2lkIDwgMTAwMCBkbworICAgIGxvY2FsIHRocmVhZCA9IGNvcm91dGluZS5jcmVhdGUoZm4pCisgICAgY29yb3V0aW5lLnJlc3VtZSh0aHJlYWQsIHRocmVhZCkKKyAgICB0aHJlYWRfaWQgPSB0aHJlYWRfaWQgKyAxCitlbmQKKworCistLSBDcmVhdGUgYSBjbG9zdXJlIChmdW5jdGlvbiBpbnNpZGUgJ2YnKSB3aXRoIGFuIHVwdmFsdWUgKCdwYXJhbScpIHRoYXQKKy0tIHBvaW50cyAodGhyb3VnaCBhIHRhYmxlKSB0byB0aGUgY2xvc3VyZSBpdHNlbGYgYW5kIHRvIHRoZSB0aHJlYWQKKy0tICgnY28nIGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSBvZiAncGFyYW0nKSB3aGVyZSBjbG9zdXJlIGlzIHJ1bm5pbmcuCistLSBUaGVuLCBhc3NlcnQgdGhhdCB0YWJsZSAoYW5kIHRoZXJlZm9yZSBldmVyeXRoaW5nIGVsc2UpIHdpbGwgYmUKKy0tIGNvbGxlY3RlZC4KK2RvCisgIGxvY2FsIGNvbGxlY3RlZCA9IGZhbHNlICAgLS0gdG8gZGV0ZWN0IGNvbGxlY3Rpb24KKyAgY29sbGVjdGdhcmJhZ2UoKTsgY29sbGVjdGdhcmJhZ2UoInN0b3AiKQorICBkbworICAgIGxvY2FsIGZ1bmN0aW9uIGYgKHBhcmFtKQorICAgICAgOyhmdW5jdGlvbiAoKQorICAgICAgICBhc3NlcnQodHlwZShmKSA9PSAnZnVuY3Rpb24nIGFuZCB0eXBlKHBhcmFtKSA9PSAndGhyZWFkJykKKyAgICAgICAgcGFyYW0gPSB7cGFyYW0sIGZ9CisgICAgICAgIHNldG1ldGF0YWJsZShwYXJhbSwge19fZ2MgPSBmdW5jdGlvbiAoKSBjb2xsZWN0ZWQgPSB0cnVlIGVuZH0pCisgICAgICAgIGNvcm91dGluZS55aWVsZCgxMDApCisgICAgICBlbmQpKCkKKyAgICBlbmQKKyAgICBsb2NhbCBjbyA9IGNvcm91dGluZS5jcmVhdGUoZikKKyAgICBhc3NlcnQoY29yb3V0aW5lLnJlc3VtZShjbywgY28pKQorICBlbmQKKyAgLS0gTm93LCB0aHJlYWQgYW5kIGNsb3N1cmUgYXJlIG5vdCByZWFjaGVhYmxlIGFueSBtb3JlLgorICBjb2xsZWN0Z2FyYmFnZSgpCisgIGFzc2VydChjb2xsZWN0ZWQpCisgIGNvbGxlY3RnYXJiYWdlKCJyZXN0YXJ0IikKK2VuZAorCisKK2RvCisgIGNvbGxlY3RnYXJiYWdlKCkKKyAgY29sbGVjdGdhcmJhZ2Uic3RvcCIKKyAgY29sbGVjdGdhcmJhZ2UoInN0ZXAiLCAwKSAgIC0tIHN0ZXBzIHNob3VsZCBub3QgdW5ibG9jayB0aGUgY29sbGVjdG9yCisgIGxvY2FsIHggPSBnY2luZm8oKQorICByZXBlYXQKKyAgICBmb3IgaT0xLDEwMDAgZG8gX0VOVi5hID0ge30gZW5kICAgLS0gbm8gY29sbGVjdGlvbiBkdXJpbmcgdGhlIGxvb3AKKyAgdW50aWwgZ2NpbmZvKCkgPiAyICogeAorICBjb2xsZWN0Z2FyYmFnZSJyZXN0YXJ0IgorZW5kCisKKworaWYgVCB0aGVuICAgLS0gdGVzdHMgZm9yIHdlaXJkIGNhc2VzIGNvbGxlY3RpbmcgdXB2YWx1ZXMKKworICBsb2NhbCBmdW5jdGlvbiBmb28gKCkKKyAgICBsb2NhbCBhID0ge3ggPSAyMH0KKyAgICBjb3JvdXRpbmUueWllbGQoZnVuY3Rpb24gKCkgcmV0dXJuIGEueCBlbmQpICAtLSB3aWxsIHJ1biBjb2xsZWN0b3IKKyAgICBhc3NlcnQoYS54ID09IDIwKSAgIC0tICdhJyBpcyAnb2snCisgICAgYSA9IHt4ID0gMzB9ICAgLS0gY3JlYXRlIGEgbmV3IG9iamVjdAorICAgIGFzc2VydChULmdjY29sb3IoYSkgPT0gIndoaXRlIikgICAtLSBvZiBjb3Vyc2UgaXQgaXMgbmV3Li4uCisgICAgY29yb3V0aW5lLnlpZWxkKDEwMCkgICAtLSAnYScgaXMgc3RpbGwgbG9jYWwgdG8gdGhpcyB0aHJlYWQKKyAgZW5kCisKKyAgbG9jYWwgdCA9IHNldG1ldGF0YWJsZSh7fSwge19fbW9kZSA9ICJrdiJ9KQorICBjb2xsZWN0Z2FyYmFnZSgpOyBjb2xsZWN0Z2FyYmFnZSgnc3RvcCcpCisgIC0tIGNyZWF0ZSBjb3JvdXRpbmUgaW4gYSB3ZWFrIHRhYmxlLCBzbyBpdCB3aWxsIG5ldmVyIGJlIG1hcmtlZAorICB0LmNvID0gY29yb3V0aW5lLndyYXAoZm9vKQorICBsb2NhbCBmID0gdC5jbygpICAgLS0gY3JlYXRlIGZ1bmN0aW9uIHRvIGFjY2VzcyBsb2NhbCAnYScKKyAgVC5nY3N0YXRlKCJhdG9taWMiKSAgIC0tIGVuc3VyZSBhbGwgb2JqZWN0cyBhcmUgdHJhdmVyc2VkCisgIGFzc2VydChULmdjc3RhdGUoKSA9PSAiYXRvbWljIikKKyAgYXNzZXJ0KHQuY28oKSA9PSAxMDApICAgLS0gcmVzdW1lIGNvcm91dGluZSwgY3JlYXRpbmcgbmV3IHRhYmxlIGZvciAnYScKKyAgYXNzZXJ0KFQuZ2Njb2xvcih0LmNvKSA9PSAid2hpdGUiKSAgLS0gdGhyZWFkIHdhcyBub3QgdHJhdmVyc2VkCisgIFQuZ2NzdGF0ZSgicGF1c2UiKSAgIC0tIGNvbGxlY3QgdGhyZWFkLCBidXQgc2hvdWxkIG1hcmsgJ2EnIGJlZm9yZSB0aGF0CisgIGFzc2VydCh0LmNvID09IG5pbCBhbmQgZigpID09IDMwKSAgIC0tIGVuc3VyZSBjb3JyZWN0IGFjY2VzcyB0byAnYScKKworICBjb2xsZWN0Z2FyYmFnZSgicmVzdGFydCIpCisKKyAgLS0gdGVzdCBiYXJyaWVyIGluIHN3ZWVwIHBoYXNlIChiYWNraW5nIHVzZXJkYXRhIHRvIGdyYXkpCisgIGxvY2FsIHUgPSBULm5ld3VzZXJkYXRhKDAsIDEpICAgLS0gY3JlYXRlIGEgdXNlcmRhdGEKKyAgY29sbGVjdGdhcmJhZ2UoKQorICBjb2xsZWN0Z2FyYmFnZSJzdG9wIgorICBsb2NhbCBhID0ge30gICAgIC0tIGF2b2lkICd1JyBhcyBmaXJzdCBlbGVtZW50IGluICdhbGxnYycKKyAgVC5nY3N0YXRlImF0b21pYyIKKyAgVC5nY3N0YXRlInN3ZWVwYWxsZ2MiCisgIGxvY2FsIHggPSB7fQorICBhc3NlcnQoVC5nY2NvbG9yKHUpID09ICJibGFjayIpICAgLS0gdXNlcmRhdGEgaXMgIm9sZCIgKGJsYWNrKQorICBhc3NlcnQoVC5nY2NvbG9yKHgpID09ICJ3aGl0ZSIpICAgLS0gdGFibGUgaXMgIm5ldyIgKHdoaXRlKQorICBkZWJ1Zy5zZXR1c2VydmFsdWUodSwgeCkgICAgICAgICAgLS0gdHJpZ2dlciBiYXJyaWVyCisgIGFzc2VydChULmdjY29sb3IodSkgPT0gImdyYXkiKSAgIC0tIHVzZXJkYXRhIGNoYW5nZWQgYmFjayB0byBncmF5CisgIGNvbGxlY3RnYXJiYWdlInJlc3RhcnQiCisKKyAgcHJpbnQiKyIKK2VuZAorCisKK2lmIFQgdGhlbgorICBsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUgImRlYnVnIgorICBjb2xsZWN0Z2FyYmFnZSgic3RvcCIpCisgIGxvY2FsIHggPSBULm5ld3VzZXJkYXRhKDApCisgIGxvY2FsIHkgPSBULm5ld3VzZXJkYXRhKDApCisgIGRlYnVnLnNldG1ldGF0YWJsZSh5LCB7X19nYyA9IHRydWV9KSAgIC0tIGJsZXNzIHRoZSBuZXcgdWRhdGEgYmVmb3JlLi4uCisgIGRlYnVnLnNldG1ldGF0YWJsZSh4LCB7X19nYyA9IHRydWV9KSAgIC0tIC4uLnRoZSBvbGQgb25lCisgIGFzc2VydChULmdjY29sb3IoeSkgPT0gIndoaXRlIikKKyAgVC5jaGVja21lbW9yeSgpCisgIGNvbGxlY3RnYXJiYWdlKCJyZXN0YXJ0IikKK2VuZAorCisKK2lmIFQgdGhlbgorICBwcmludCgiZW1lcmdlbmN5IGNvbGxlY3Rpb25zIikKKyAgY29sbGVjdGdhcmJhZ2UoKQorICBjb2xsZWN0Z2FyYmFnZSgpCisgIFQudG90YWxtZW0oVC50b3RhbG1lbSgpICsgMjAwKQorICBmb3IgaT0xLDIwMCBkbyBsb2NhbCBhID0ge30gZW5kCisgIFQudG90YWxtZW0oMCkKKyAgY29sbGVjdGdhcmJhZ2UoKQorICBsb2NhbCB0ID0gVC50b3RhbG1lbSgidGFibGUiKQorICBsb2NhbCBhID0ge3t9LCB7fSwge319ICAgLS0gY3JlYXRlIDQgbmV3IHRhYmxlcworICBhc3NlcnQoVC50b3RhbG1lbSgidGFibGUiKSA9PSB0ICsgNCkKKyAgdCA9IFQudG90YWxtZW0oImZ1bmN0aW9uIikKKyAgYSA9IGZ1bmN0aW9uICgpIGVuZCAgIC0tIGNyZWF0ZSAxIG5ldyBjbG9zdXJlCisgIGFzc2VydChULnRvdGFsbWVtKCJmdW5jdGlvbiIpID09IHQgKyAxKQorICB0ID0gVC50b3RhbG1lbSgidGhyZWFkIikKKyAgYSA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKCkgZW5kKSAgIC0tIGNyZWF0ZSAxIG5ldyBjb3JvdXRpbmUKKyAgYXNzZXJ0KFQudG90YWxtZW0oInRocmVhZCIpID09IHQgKyAxKQorZW5kCisKKy0tIGNyZWF0ZSBhbiBvYmplY3QgdG8gYmUgY29sbGVjdGVkIHdoZW4gc3RhdGUgaXMgY2xvc2VkCitkbworICBsb2NhbCBzZXRtZXRhdGFibGUsYXNzZXJ0LHR5cGUscHJpbnQsZ2V0bWV0YXRhYmxlID0KKyAgICAgICAgc2V0bWV0YXRhYmxlLGFzc2VydCx0eXBlLHByaW50LGdldG1ldGF0YWJsZQorICBsb2NhbCB0dCA9IHt9CisgIHR0Ll9fZ2MgPSBmdW5jdGlvbiAobykKKyAgICBhc3NlcnQoZ2V0bWV0YXRhYmxlKG8pID09IHR0KQorICAgIC0tIGNyZWF0ZSBuZXcgb2JqZWN0cyBkdXJpbmcgR0MKKyAgICBsb2NhbCBhID0gJ3h1eHUnLi4oMTArMykuLidqb2FvJywge30KKyAgICBfX19HbG9iID0gbyAgLS0gcmVzc3VyZWN0IG9iamVjdCEKKyAgICBzZXRtZXRhdGFibGUoe30sIHR0KSAgLS0gY3JlYXRlcyBhIG5ldyBvbmUgd2l0aCBzYW1lIG1ldGF0YWJsZQorICAgIHByaW50KCI+Pj4gY2xvc2luZyBzdGF0ZSAiIC4uICI8PDxcbiIpCisgIGVuZAorICBsb2NhbCB1ID0gc2V0bWV0YXRhYmxlKHt9LCB0dCkKKyAgX19fR2xvYiA9IHt1fSAgIC0tIGF2b2lkIG9iamVjdCBiZWluZyBjb2xsZWN0ZWQgYmVmb3JlIHByb2dyYW0gZW5kCitlbmQKKworLS0gY3JlYXRlIHNldmVyYWwgb2JqZWN0cyB0byByYWlzZSBlcnJvcnMgd2hlbiBjb2xsZWN0ZWQgd2hpbGUgY2xvc2luZyBzdGF0ZQorZG8KKyAgbG9jYWwgbXQgPSB7X19nYyA9IGZ1bmN0aW9uIChvKSByZXR1cm4gbyArIDEgZW5kfQorICBmb3IgaSA9IDEsMTAgZG8KKyAgICAtLSBjcmVhdGUgb2JqZWN0IGFuZCBwcmVzZXJ2ZSBpdCB1bnRpbCB0aGUgZW5kCisgICAgdGFibGUuaW5zZXJ0KF9fX0dsb2IsIHNldG1ldGF0YWJsZSh7fSwgbXQpKQorICBlbmQKK2VuZAorCistLSBqdXN0IHRvIG1ha2Ugc3VyZQorYXNzZXJ0KGNvbGxlY3RnYXJiYWdlJ2lzcnVubmluZycpCisKK2NvbGxlY3RnYXJiYWdlKG9sZG1vZGUpCisKK3ByaW50KCdPSycpCmRpZmYgLS1naXQgYS90ZXN0ZXMvZ290by5sdWEgYi90ZXN0ZXMvZ290by5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyNjAxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9nb3RvLmx1YQpAQCAtMCwwICsxLDI1NiBAQAorLS0gJElkOiBnb3RvLmx1YSx2IDEuMTUgMjAxNy8xMS8zMCAxMzozMTowNyByb2JlcnRvIEV4cCAkCistLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBmaWxlIGFsbC5sdWEKKworY29sbGVjdGdhcmJhZ2UoKQorCitsb2NhbCBmdW5jdGlvbiBlcnJtc2cgKGNvZGUsIG0pCisgIGxvY2FsIHN0LCBtc2cgPSBsb2FkKGNvZGUpCisgIGFzc2VydChub3Qgc3QgYW5kIHN0cmluZy5maW5kKG1zZywgbSkpCitlbmQKKworLS0gY2Fubm90IHNlZSBsYWJlbCBpbnNpZGUgYmxvY2sKK2Vycm1zZyhbWyBnb3RvIGwxOyBkbyA6OmwxOjogZW5kIF1dLCAibGFiZWwgJ2wxJyIpCitlcnJtc2coW1sgZG8gOjpsMTo6IGVuZCBnb3RvIGwxOyBdXSwgImxhYmVsICdsMSciKQorCistLSByZXBlYXRlZCBsYWJlbAorZXJybXNnKFtbIDo6bDE6OiA6OmwxOjogXV0sICJsYWJlbCAnbDEnIikKKworCistLSB1bmRlZmluZWQgbGFiZWwKK2Vycm1zZyhbWyBnb3RvIGwxOyBsb2NhbCBhYSA6OmwxOjogOjpsMjo6IHByaW50KDMpIF1dLCAibG9jYWwgJ2FhJyIpCisKKy0tIGp1bXBpbmcgb3ZlciB2YXJpYWJsZSBkZWZpbml0aW9uCitlcnJtc2coW1sKK2RvIGxvY2FsIGJiLCBjYzsgZ290byBsMTsgZW5kCitsb2NhbCBhYQorOjpsMTo6IHByaW50KDMpCitdXSwgImxvY2FsICdhYSciKQorCistLSBqdW1waW5nIGludG8gYSBibG9jaworZXJybXNnKFtbIGRvIDo6bDE6OiBlbmQgZ290byBsMSBdXSwgImxhYmVsICdsMSciKQorZXJybXNnKFtbIGdvdG8gbDEgZG8gOjpsMTo6IGVuZCBdXSwgImxhYmVsICdsMSciKQorCistLSBjYW5ub3QgY29udGludWUgYSByZXBlYXQtdW50aWwgd2l0aCB2YXJpYWJsZXMKK2Vycm1zZyhbWworICByZXBlYXQKKyAgICBpZiB4IHRoZW4gZ290byBjb250IGVuZAorICAgIGxvY2FsIHh1eHUgPSAxMAorICAgIDo6Y29udDo6CisgIHVudGlsIHh1eHUgPCB4CitdXSwgImxvY2FsICd4dXh1JyIpCisKKy0tIHNpbXBsZSBnb3RvcworbG9jYWwgeAorZG8KKyAgbG9jYWwgeSA9IDEyCisgIGdvdG8gbDEKKyAgOjpsMjo6IHggPSB4ICsgMTsgZ290byBsMworICA6OmwxOjogeCA9IHk7IGdvdG8gbDIKK2VuZAorOjpsMzo6IDo6bDNfMTo6IGFzc2VydCh4ID09IDEzKQorCisKKy0tIGxvbmcgbGFiZWxzCitkbworICBsb2NhbCBwcm9nID0gW1sKKyAgZG8KKyAgICBsb2NhbCBhID0gMQorICAgIGdvdG8gbCVzYTsgYSA9IGEgKyAxCisgICA6Omwlc2E6OiBhID0gYSArIDEwCisgICAgZ290byBsJXNiOyBhID0gYSArIDIKKyAgIDo6bCVzYjo6IGEgPSBhICsgMjAKKyAgICByZXR1cm4gYQorICBlbmQKKyAgXV0KKyAgbG9jYWwgbGFiZWwgPSBzdHJpbmcucmVwKCIwMTIzNDU2Nzg5IiwgNDApCisgIHByb2cgPSBzdHJpbmcuZm9ybWF0KHByb2csIGxhYmVsLCBsYWJlbCwgbGFiZWwsIGxhYmVsKQorICBhc3NlcnQoYXNzZXJ0KGxvYWQocHJvZykpKCkgPT0gMzEpCitlbmQKKworLS0gZ290byB0byBjb3JyZWN0IGxhYmVsIHdoZW4gbmVzdGVkCitkbyBnb3RvIGwzOyA6OmwzOjogZW5kICAgLS0gZG9lcyBub3QgbG9vcCBqdW1waW5nIHRvIHByZXZpb3VzIGxhYmVsICdsMycKKworLS0gb2sgdG8ganVtcCBvdmVyIGxvY2FsIGRlYy4gdG8gZW5kIG9mIGJsb2NrCitkbworICBnb3RvIGwxCisgIGxvY2FsIGEgPSAyMworICB4ID0gYQorICA6OmwxOjo7CitlbmQKKword2hpbGUgdHJ1ZSBkbworICBnb3RvIGw0CisgIGdvdG8gbDEgIC0tIG9rIHRvIGp1bXAgb3ZlciBsb2NhbCBkZWMuIHRvIGVuZCBvZiBibG9jaworICBnb3RvIGwxICAtLSBtdWx0aXBsZSB1c2VzIG9mIHNhbWUgbGFiZWwKKyAgbG9jYWwgeCA9IDQ1CisgIDo6bDE6OiA7OzsKK2VuZAorOjpsNDo6IGFzc2VydCh4ID09IDEzKQorCitpZiBwcmludCB0aGVuCisgIGdvdG8gbDEgICAtLSBvayB0byBqdW1wIG92ZXIgbG9jYWwgZGVjLiB0byBlbmQgb2YgYmxvY2sKKyAgZXJyb3IoInNob3VsZCBub3QgYmUgaGVyZSIpCisgIGdvdG8gbDIgICAtLSBvayB0byBqdW1wIG92ZXIgbG9jYWwgZGVjLiB0byBlbmQgb2YgYmxvY2sKKyAgbG9jYWwgeAorICA6OmwxOjogOyA6OmwyOjogOzsKK2Vsc2UgZW5kCisKKy0tIHRvIHJlcGVhdCBhIGxhYmVsIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uIGlzIE9LCitsb2NhbCBmdW5jdGlvbiBmb28gKCkKKyAgbG9jYWwgYSA9IHt9CisgIGdvdG8gbDMKKyAgOjpsMTo6IGFbI2EgKyAxXSA9IDE7IGdvdG8gbDI7CisgIDo6bDI6OiBhWyNhICsgMV0gPSAyOyBnb3RvIGw1OworICA6OmwzOjoKKyAgOjpsM2E6OiBhWyNhICsgMV0gPSAzOyBnb3RvIGwxOworICA6Omw0OjogYVsjYSArIDFdID0gNDsgZ290byBsNjsKKyAgOjpsNTo6IGFbI2EgKyAxXSA9IDU7IGdvdG8gbDQ7CisgIDo6bDY6OiBhc3NlcnQoYVsxXSA9PSAzIGFuZCBhWzJdID09IDEgYW5kIGFbM10gPT0gMiBhbmQKKyAgICAgICAgICAgICAgYVs0XSA9PSA1IGFuZCBhWzVdID09IDQpCisgIGlmIG5vdCBhWzZdIHRoZW4gYVs2XSA9IHRydWU7IGdvdG8gbDNhIGVuZCAgIC0tIGRvIGl0IHR3aWNlCitlbmQKKworOjpsNjo6IGZvbygpCisKKworZG8gICAtLSBidWcgaW4gNS4yIC0+IDUuMy4yCisgIGxvY2FsIHgKKyAgOjpMMTo6CisgIGxvY2FsIHkgICAgICAgICAgICAgLS0gY2Fubm90IGpvaW4gdGhpcyBTRVROSUwgd2l0aCBwcmV2aW91cyBvbmUKKyAgYXNzZXJ0KHkgPT0gbmlsKQorICB5ID0gdHJ1ZQorICBpZiB4ID09IG5pbCB0aGVuCisgICAgeCA9IDEKKyAgICBnb3RvIEwxCisgIGVsc2UKKyAgICB4ID0geCArIDEKKyAgZW5kCisgIGFzc2VydCh4ID09IDIgYW5kIHkgPT0gdHJ1ZSkKK2VuZAorCistLSBidWcgaW4gNS4zCitkbworICBsb2NhbCBmaXJzdCA9IHRydWUKKyAgbG9jYWwgYSA9IGZhbHNlCisgIGlmIHRydWUgdGhlbgorICAgIGdvdG8gTEJMCisgICAgOjpsb29wOjoKKyAgICBhID0gdHJ1ZQorICAgIDo6TEJMOjoKKyAgICBpZiBmaXJzdCB0aGVuCisgICAgICBmaXJzdCA9IGZhbHNlCisgICAgICBnb3RvIGxvb3AKKyAgICBlbmQKKyAgZW5kCisgIGFzc2VydChhKQorZW5kCisKK2RvICAgLS0gY29tcGlsaW5nIGluZmluaXRlIGxvb3BzCisgIGdvdG8gZXNjYXBlICAgLS0gZG8gbm90IHJ1biB0aGUgaW5maW5pdGUgbG9vcHMKKyAgOjphOjogZ290byBhCisgIDo6Yjo6IGdvdG8gYworICA6OmM6OiBnb3RvIGIKK2VuZAorOjplc2NhcGU6OgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHRlc3RpbmcgY2xvc2luZyBvZiB1cHZhbHVlcworCitsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUgJ2RlYnVnJworCitsb2NhbCBmdW5jdGlvbiBmb28gKCkKKyAgbG9jYWwgdCA9IHt9CisgIGRvCisgIGxvY2FsIGkgPSAxCisgIGxvY2FsIGEsIGIsIGMsIGQKKyAgdFsxXSA9IGZ1bmN0aW9uICgpIHJldHVybiBhLCBiLCBjLCBkIGVuZAorICA6OmwxOjoKKyAgbG9jYWwgYgorICBkbworICAgIGxvY2FsIGMKKyAgICB0WyN0ICsgMV0gPSBmdW5jdGlvbiAoKSByZXR1cm4gYSwgYiwgYywgZCBlbmQgICAgLS0gdFsyXSwgdFs0XSwgdFs2XQorICAgIGlmIGkgPiAyIHRoZW4gZ290byBsMiBlbmQKKyAgICBkbworICAgICAgbG9jYWwgZAorICAgICAgdFsjdCArIDFdID0gZnVuY3Rpb24gKCkgcmV0dXJuIGEsIGIsIGMsIGQgZW5kICAgLS0gdFszXSwgdFs1XQorICAgICAgaSA9IGkgKyAxCisgICAgICBsb2NhbCBhCisgICAgICBnb3RvIGwxCisgICAgZW5kCisgIGVuZAorICBlbmQKKyAgOjpsMjo6IHJldHVybiB0CitlbmQKKworbG9jYWwgYSA9IGZvbygpCithc3NlcnQoI2EgPT0gNikKKworLS0gYWxsIGZ1bmN0aW9ucyBzaGFyZSBzYW1lICdhJworZm9yIGkgPSAyLCA2IGRvCisgIGFzc2VydChkZWJ1Zy51cHZhbHVlaWQoYVsxXSwgMSkgPT0gZGVidWcudXB2YWx1ZWlkKGFbaV0sIDEpKQorZW5kCisKKy0tICdiJyBhbmQgJ2MnIGFyZSBzaGFyZWQgYW1vbmcgc29tZSBvZiB0aGVtCitmb3IgaSA9IDIsIDYgZG8KKyAgLS0gb25seSBhWzFdIHVzZXMgZXh0ZXJuYWwgJ2InLydiJworICBhc3NlcnQoZGVidWcudXB2YWx1ZWlkKGFbMV0sIDIpIH49IGRlYnVnLnVwdmFsdWVpZChhW2ldLCAyKSkKKyAgYXNzZXJ0KGRlYnVnLnVwdmFsdWVpZChhWzFdLCAzKSB+PSBkZWJ1Zy51cHZhbHVlaWQoYVtpXSwgMykpCitlbmQKKworZm9yIGkgPSAzLCA1LCAyIGRvCisgIC0tIGlubmVyIGZ1bmN0aW9ucyBzaGFyZSAnYicvJ2MnIHdpdGggcHJldmlvdXMgb25lcworICBhc3NlcnQoZGVidWcudXB2YWx1ZWlkKGFbaV0sIDIpID09IGRlYnVnLnVwdmFsdWVpZChhW2kgLSAxXSwgMikpCisgIGFzc2VydChkZWJ1Zy51cHZhbHVlaWQoYVtpXSwgMykgPT0gZGVidWcudXB2YWx1ZWlkKGFbaSAtIDFdLCAzKSkKKyAgLS0gYnV0IG5vdCB3aXRoIG5leHQgb25lcworICBhc3NlcnQoZGVidWcudXB2YWx1ZWlkKGFbaV0sIDIpIH49IGRlYnVnLnVwdmFsdWVpZChhW2kgKyAxXSwgMikpCisgIGFzc2VydChkZWJ1Zy51cHZhbHVlaWQoYVtpXSwgMykgfj0gZGVidWcudXB2YWx1ZWlkKGFbaSArIDFdLCAzKSkKK2VuZAorCistLSBvbmx5IGV4dGVybmFsICdkJyBpcyBzaGFyZWQKK2ZvciBpID0gMiwgNiwgMiBkbworICBhc3NlcnQoZGVidWcudXB2YWx1ZWlkKGFbMV0sIDQpID09IGRlYnVnLnVwdmFsdWVpZChhW2ldLCA0KSkKK2VuZAorCistLSBpbnRlcm5hbCAnZCdzIGFyZSBhbGwgZGlmZmVyZW50Citmb3IgaSA9IDMsIDUsIDIgZG8KKyAgZm9yIGogPSAxLCA2IGRvCisgICAgYXNzZXJ0KChkZWJ1Zy51cHZhbHVlaWQoYVtpXSwgNCkgPT0gZGVidWcudXB2YWx1ZWlkKGFbal0sIDQpKQorICAgICAgPT0gKGkgPT0gaikpCisgIGVuZAorZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSB0ZXN0aW5nIGlmIHggZ290byBvcHRpbWl6YXRpb25zCisKK2xvY2FsIGZ1bmN0aW9uIHRlc3RHIChhKQorICBpZiBhID09IDEgdGhlbgorICAgIGdvdG8gbDEKKyAgICBlcnJvcigic2hvdWxkIG5ldmVyIGJlIGhlcmUhIikKKyAgZWxzZWlmIGEgPT0gMiB0aGVuIGdvdG8gbDIKKyAgZWxzZWlmIGEgPT0gMyB0aGVuIGdvdG8gbDMKKyAgZWxzZWlmIGEgPT0gNCB0aGVuCisgICAgZ290byBsMSAgLS0gZ28gdG8gaW5zaWRlIHRoZSBibG9jaworICAgIGVycm9yKCJzaG91bGQgbmV2ZXIgYmUgaGVyZSEiKQorICAgIDo6bDE6OiBhID0gYSArIDEgICAtLSBtdXN0IGdvIHRvICdpZicgZW5kCisgIGVsc2UKKyAgICBnb3RvIGw0CisgICAgOjpsNGE6OiBhID0gYSAqIDI7IGdvdG8gbDRiCisgICAgZXJyb3IoInNob3VsZCBuZXZlciBiZSBoZXJlISIpCisgICAgOjpsNDo6IGdvdG8gbDRhCisgICAgZXJyb3IoInNob3VsZCBuZXZlciBiZSBoZXJlISIpCisgICAgOjpsNGI6OgorICBlbmQKKyAgZG8gcmV0dXJuIGEgZW5kCisgIDo6bDI6OiBkbyByZXR1cm4gIjIiIGVuZAorICA6OmwzOjogZG8gcmV0dXJuICIzIiBlbmQKKyAgOjpsMTo6IHJldHVybiAiMSIKK2VuZAorCithc3NlcnQodGVzdEcoMSkgPT0gIjEiKQorYXNzZXJ0KHRlc3RHKDIpID09ICIyIikKK2Fzc2VydCh0ZXN0RygzKSA9PSAiMyIpCithc3NlcnQodGVzdEcoNCkgPT0gNSkKK2Fzc2VydCh0ZXN0Ryg1KSA9PSAxMCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworcHJpbnQnT0snCmRpZmYgLS1naXQgYS90ZXN0ZXMvbGlicy9saWIxLmMgYi90ZXN0ZXMvbGlicy9saWIxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiNmVmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9saWJzL2xpYjEuYwpAQCAtMCwwICsxLDQ0IEBACisjaW5jbHVkZSAibHVhLmgiCisjaW5jbHVkZSAibGF1eGxpYi5oIgorCitzdGF0aWMgaW50IGlkIChsdWFfU3RhdGUgKkwpIHsKKyAgcmV0dXJuIGx1YV9nZXR0b3AoTCk7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBsdWFMX1JlZyBmdW5jc1tdID0geworICB7ImlkIiwgaWR9LAorICB7TlVMTCwgTlVMTH0KK307CisKKworLyogZnVuY3Rpb24gdXNlZCBieSBsaWIxMS5jICovCitMVUFNT0RfQVBJIGludCBsaWIxX2V4cG9ydCAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9wdXNoc3RyaW5nKEwsICJleHBvcnRlZCIpOworICByZXR1cm4gMTsKK30KKworCitMVUFNT0RfQVBJIGludCBvbmVmdW5jdGlvbiAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfY2hlY2t2ZXJzaW9uKEwpOworICBsdWFfc2V0dG9wKEwsIDIpOworICBsdWFfcHVzaHZhbHVlKEwsIDEpOworICByZXR1cm4gMjsKK30KKworCitMVUFNT0RfQVBJIGludCBhbm90aGVyZnVuYyAobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfY2hlY2t2ZXJzaW9uKEwpOworICBsdWFfcHVzaGZzdHJpbmcoTCwgIiVkJSUlZFxuIiwgKGludClsdWFfdG9pbnRlZ2VyKEwsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClsdWFfdG9pbnRlZ2VyKEwsIDIpKTsKKyAgcmV0dXJuIDE7Cit9IAorCisKK0xVQU1PRF9BUEkgaW50IGx1YW9wZW5fbGliMV9zdWIgKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfc2V0Z2xvYmFsKEwsICJ5Iik7ICAvKiAybmQgYXJnOiBleHRyYSB2YWx1ZSAoZmlsZSBuYW1lKSAqLworICBsdWFfc2V0Z2xvYmFsKEwsICJ4Iik7ICAvKiAxc3QgYXJnOiBtb2R1bGUgbmFtZSAqLworICBsdWFMX25ld2xpYihMLCBmdW5jcyk7CisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS90ZXN0ZXMvbGlicy9saWIxMS5jIGIvdGVzdGVzL2xpYnMvbGliMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzdkMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGVzL2xpYnMvbGliMTEuYwpAQCAtMCwwICsxLDEwIEBACisjaW5jbHVkZSAibHVhLmgiCisKKy8qIGZ1bmN0aW9uIGZyb20gbGliMS5jICovCitpbnQgbGliMV9leHBvcnQgKGx1YV9TdGF0ZSAqTCk7CisKK0xVQU1PRF9BUEkgaW50IGx1YW9wZW5fbGliMTEgKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gbGliMV9leHBvcnQoTCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdGVzL2xpYnMvbGliMi5jIGIvdGVzdGVzL2xpYnMvbGliMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTY1MWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0ZXMvbGlicy9saWIyLmMKQEAgLTAsMCArMSwyMyBAQAorI2luY2x1ZGUgImx1YS5oIgorI2luY2x1ZGUgImxhdXhsaWIuaCIKKworc3RhdGljIGludCBpZCAobHVhX1N0YXRlICpMKSB7CisgIHJldHVybiBsdWFfZ2V0dG9wKEwpOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbHVhTF9SZWcgZnVuY3NbXSA9IHsKKyAgeyJpZCIsIGlkfSwKKyAge05VTEwsIE5VTEx9Cit9OworCisKK0xVQU1PRF9BUEkgaW50IGx1YW9wZW5fbGliMiAobHVhX1N0YXRlICpMKSB7CisgIGx1YV9zZXR0b3AoTCwgMik7CisgIGx1YV9zZXRnbG9iYWwoTCwgInkiKTsgIC8qIHkgZ2V0cyAybmQgcGFyYW1ldGVyICovCisgIGx1YV9zZXRnbG9iYWwoTCwgIngiKTsgIC8qIHggZ2V0cyAxc3QgcGFyYW1ldGVyICovCisgIGx1YUxfbmV3bGliKEwsIGZ1bmNzKTsKKyAgcmV0dXJuIDE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdGVzL2xpYnMvbGliMjEuYyBiL3Rlc3Rlcy9saWJzL2xpYjIxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5YjY4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9saWJzL2xpYjIxLmMKQEAgLTAsMCArMSwxMCBAQAorI2luY2x1ZGUgImx1YS5oIgorCisKK2ludCBsdWFvcGVuX2xpYjIgKGx1YV9TdGF0ZSAqTCk7CisKK0xVQU1PRF9BUEkgaW50IGx1YW9wZW5fbGliMjEgKGx1YV9TdGF0ZSAqTCkgeworICByZXR1cm4gbHVhb3Blbl9saWIyKEwpOworfQorCisKZGlmZiAtLWdpdCBhL3Rlc3Rlcy9saWJzL21ha2VmaWxlIGIvdGVzdGVzL2xpYnMvbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyNWZiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9saWJzL21ha2VmaWxlCkBAIC0wLDAgKzEsMjYgQEAKKyMgY2hhbmdlIHRoaXMgdmFyaWFibGUgdG8gcG9pbnQgdG8gdGhlIGRpcmVjdG9yeSB3aXRoIEx1YSBoZWFkZXJzCisjIG9mIHRoZSB2ZXJzaW9uIGJlaW5nIHRlc3RlZAorTFVBX0RJUiA9IC4uLy4uLworCitDQyA9IGdjYworCisjIGNvbXBpbGF0aW9uIHNob3VsZCBnZW5lcmF0ZSBEeW5hbWljLUxpbmsgTGlicmFyaWVzCitDRkxBR1MgPSAtV2FsbCAtc3RkPWdudTk5IC1PMiAtSSQoTFVBX0RJUikgLWZQSUMgLXNoYXJlZAorCisjIGxpYnJhcmllcyB1c2VkIGJ5IHRoZSB0ZXN0cworYWxsOiBsaWIxLnNvIGxpYjExLnNvIGxpYjIuc28gbGliMjEuc28gbGliMi12Mi5zbworCitsaWIxLnNvOiBsaWIxLmMKKwkkKENDKSAkKENGTEFHUykgLW8gbGliMS5zbyBsaWIxLmMKKworbGliMTEuc286IGxpYjExLmMKKwkkKENDKSAkKENGTEFHUykgLW8gbGliMTEuc28gbGliMTEuYworCitsaWIyLnNvOiBsaWIyLmMKKwkkKENDKSAkKENGTEFHUykgLW8gbGliMi5zbyBsaWIyLmMKKworbGliMjEuc286IGxpYjIxLmMKKwkkKENDKSAkKENGTEFHUykgLW8gbGliMjEuc28gbGliMjEuYworCitsaWIyLXYyLnNvOiBsaWIyLnNvCisJbXYgbGliMi5zbyAuL2xpYjItdjIuc28KZGlmZiAtLWdpdCBhL3Rlc3Rlcy9saXRlcmFscy5sdWEgYi90ZXN0ZXMvbGl0ZXJhbHMubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjJiM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0ZXMvbGl0ZXJhbHMubHVhCkBAIC0wLDAgKzEsMzAyIEBACistLSAkSWQ6IGxpdGVyYWxzLmx1YSx2IDEuMzYgMjAxNi8xMS8wNyAxMzoxMToyOCByb2JlcnRvIEV4cCAkCistLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBmaWxlIGFsbC5sdWEKKworcHJpbnQoJ3Rlc3Rpbmcgc2Nhbm5lcicpCisKK2xvY2FsIGRlYnVnID0gcmVxdWlyZSAiZGVidWciCisKKworbG9jYWwgZnVuY3Rpb24gZG9zdHJpbmcgKHgpIHJldHVybiBhc3NlcnQobG9hZCh4KSwgIiIpKCkgZW5kCisKK2Rvc3RyaW5nKCJ4IFx2XGYgPSBcdFxyICdhXDBhJyBcdlxmXGYiKQorYXNzZXJ0KHggPT0gJ2FcMGEnIGFuZCBzdHJpbmcubGVuKHgpID09IDMpCisKKy0tIGVzY2FwZSBzZXF1ZW5jZXMKK2Fzc2VydCgnXG5cIlwnXFwnID09IFtbCisKKyInXF1dKQorCithc3NlcnQoc3RyaW5nLmZpbmQoIlxhXGJcZlxuXHJcdFx2IiwgIl4lYyVjJWMlYyVjJWMlYyQiKSkKKworLS0gYXNzdW1lIEFTQ0lJIGp1c3QgZm9yIHRlc3RzOgorYXNzZXJ0KCJcMDk5MTIiID09ICdjMTInKQorYXNzZXJ0KCJcOTlhYiIgPT0gJ2NhYicpCithc3NlcnQoIlwwOTkiID09ICdcOTknKQorYXNzZXJ0KCJcMDk5XG4iID09ICdjXDEwJykKK2Fzc2VydCgnXDBcMFwwYWxvJyA9PSAnXDAnIC4uICdcMFwwJyAuLiAnYWxvJykKKworYXNzZXJ0KDAxMCAuLiAwMjAgLi4gLTAzMCA9PSAiMTAyMC0zMCIpCisKKy0tIGhleGFkZWNpbWFsIGVzY2FwZXMKK2Fzc2VydCgiXHgwMFx4MDVceDEwXHgxZlx4M0NceGZGXHhlOCIgPT0gIlwwXDVcMTZcMzFcNjBcMjU1XDIzMiIpCisKK2xvY2FsIGZ1bmN0aW9uIGxleHN0cmluZyAoeCwgeSwgbikKKyAgbG9jYWwgZiA9IGFzc2VydChsb2FkKCdyZXR1cm4gJyAuLiB4IC4uCisgICAgICAgICAgICAnLCByZXF1aXJlImRlYnVnIi5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lJywgJycpKQorICBsb2NhbCBzLCBsID0gZigpCisgIGFzc2VydChzID09IHkgYW5kIGwgPT0gbikKK2VuZAorCitsZXhzdHJpbmcoIidhYmNcXHogIFxuICAgZWZnJyIsICJhYmNlZmciLCAyKQorbGV4c3RyaW5nKCInYWJjXFx6ICBcblxuXG4nIiwgImFiYyIsIDQpCitsZXhzdHJpbmcoIidcXHogIFxuXHRcZlx2XG4nIiwgICIiLCAzKQorbGV4c3RyaW5nKCJbW1xuYWxvXG5hbG9cblxuXV0iLCAiYWxvXG5hbG9cblxuIiwgNSkKK2xleHN0cmluZygiW1tcbmFsb1xyYWxvXG5cbl1dIiwgImFsb1xuYWxvXG5cbiIsIDUpCitsZXhzdHJpbmcoIltbXG5hbG9ccmFsb1xyXG5dXSIsICJhbG9cbmFsb1xuIiwgNCkKK2xleHN0cmluZygiW1tccmFsb1xuXHJhbG9cclxuXV0iLCAiYWxvXG5hbG9cbiIsIDQpCitsZXhzdHJpbmcoIltbYWxvXVxuXWFsb11dIiwgImFsb11cbl1hbG8iLCAyKQorCithc3NlcnQoImFiY1x6CisgICAgICAgIGRlZlx6CisgICAgICAgIGdoaVx6CisgICAgICAgIiA9PSAnYWJjZGVmZ2hpJykKKworCistLSBVVEYtOCBzZXF1ZW5jZXMKK2Fzc2VydCgiXHV7MH1cdXswMDAwMDAwMH1ceDAwXDAiID09IHN0cmluZy5jaGFyKDAsIDAsIDAsIDApKQorCistLSBsaW1pdHMgZm9yIDEtYnl0ZSBzZXF1ZW5jZXMKK2Fzc2VydCgiXHV7MH1cdXs3Rn0iID09ICJceDAwXHpceDdGIikKKworLS0gbGltaXRzIGZvciAyLWJ5dGUgc2VxdWVuY2VzCithc3NlcnQoIlx1ezgwfVx1ezdGRn0iID09ICJceEMyXHg4MFx6XHhERlx4QkYiKQorCistLSBsaW1pdHMgZm9yIDMtYnl0ZSBzZXF1ZW5jZXMKK2Fzc2VydCgiXHV7ODAwfVx1e0ZGRkZ9IiA9PSAgICJceEUwXHhBMFx4ODBcelx4RUZceEJGXHhCRiIpCisKKy0tIGxpbWl0cyBmb3IgNC1ieXRlIHNlcXVlbmNlcworYXNzZXJ0KCJcdXsxMDAwMH1cdXsxMEZGRkZ9IiA9PSAiXHhGMFx4OTBceDgwXHg4MFx6XHhGNFx4OEZceEJGXHhCRiIpCisKKworLS0gRXJyb3IgaW4gZXNjYXBlIHNlcXVlbmNlcworbG9jYWwgZnVuY3Rpb24gbGV4ZXJyb3IgKHMsIGVycikKKyAgbG9jYWwgc3QsIG1zZyA9IGxvYWQoJ3JldHVybiAnIC4uIHMsICcnKQorICBpZiBlcnIgfj0gJzxlb2Y+JyB0aGVuIGVyciA9IGVyciAuLiAiJyIgZW5kCisgIGFzc2VydChub3Qgc3QgYW5kIHN0cmluZy5maW5kKG1zZywgIm5lYXIgLi0iIC4uIGVycikpCitlbmQKKworbGV4ZXJyb3IoW1siYWJjXHgiXV0sIFtbXHgiXV0pCitsZXhlcnJvcihbWyJhYmNceF1dLCBbW1x4XV0pCitsZXhlcnJvcihbWyJceF1dLCBbW1x4XV0pCitsZXhlcnJvcihbWyJceDUiXV0sIFtbXHg1Il1dKQorbGV4ZXJyb3IoW1siXHg1XV0sIFtbXHg1XV0pCitsZXhlcnJvcihbWyJceHIiXV0sIFtbXHhyXV0pCitsZXhlcnJvcihbWyJceHJdXSwgW1tceHJdXSkKK2xleGVycm9yKFtbIlx4Ll1dLCBbW1x4Ll1dKQorbGV4ZXJyb3IoW1siXHg4JSJdXSwgW1tceDglJV1dKQorbGV4ZXJyb3IoW1siXHhBR11dLCBbW1x4QUddXSkKK2xleGVycm9yKFtbIlxnIl1dLCBbW1xnXV0pCitsZXhlcnJvcihbWyJcZ11dLCBbW1xnXV0pCitsZXhlcnJvcihbWyJcLiJdXSwgW1tcJS5dXSkKKworbGV4ZXJyb3IoW1siXDk5OSJdXSwgW1tcOTk5Il1dKQorbGV4ZXJyb3IoW1sieHl6XDMwMCJdXSwgW1tcMzAwIl1dKQorbGV4ZXJyb3IoW1siICAgXDI1NiJdXSwgW1tcMjU2Il1dKQorCistLSBlcnJvcnMgaW4gVVRGLTggc2VxdWVuY2VzCitsZXhlcnJvcihbWyJhYmNcdXsxMTAwMDB9Il1dLCBbW2FiY1x1ezExMDAwMF1dKSAgIC0tIHRvbyBsYXJnZQorbGV4ZXJyb3IoW1siYWJjXHUxMXIiXV0sIFtbYWJjXHUxXV0pICAgIC0tIG1pc3NpbmcgJ3snCitsZXhlcnJvcihbWyJhYmNcdSJdXSwgW1thYmNcdSJdXSkgICAgLS0gbWlzc2luZyAneycKK2xleGVycm9yKFtbImFiY1x1ezExciJdXSwgW1thYmNcdXsxMXJdXSkgICAgLS0gbWlzc2luZyAnfScKK2xleGVycm9yKFtbImFiY1x1ezExIl1dLCBbW2FiY1x1ezExIl1dKSAgICAtLSBtaXNzaW5nICd9JworbGV4ZXJyb3IoW1siYWJjXHV7MTFdXSwgW1thYmNcdXsxMV1dKSAgICAtLSBtaXNzaW5nICd9JworbGV4ZXJyb3IoW1siYWJjXHV7ciJdXSwgW1thYmNcdXtyXV0pICAgICAtLSBubyBkaWdpdHMKKworLS0gdW5maW5pc2hlZCBzdHJpbmdzCitsZXhlcnJvcigiWz1bYWxvXV0iLCAiPGVvZj4iKQorbGV4ZXJyb3IoIls9W2Fsb109IiwgIjxlb2Y+IikKK2xleGVycm9yKCJbPVthbG9dIiwgIjxlb2Y+IikKK2xleGVycm9yKCInYWxvIiwgIjxlb2Y+IikKK2xleGVycm9yKCInYWxvIFxceiAgXG5cbiIsICI8ZW9mPiIpCitsZXhlcnJvcigiJ2FsbyBcXHoiLCAiPGVvZj4iKQorbGV4ZXJyb3IoW1snYWxvIFw5OF1dLCAiPGVvZj4iKQorCistLSB2YWxpZCBjaGFyYWN0ZXJzIGluIHZhcmlhYmxlIG5hbWVzCitmb3IgaSA9IDAsIDI1NSBkbworICBsb2NhbCBzID0gc3RyaW5nLmNoYXIoaSkKKyAgYXNzZXJ0KG5vdCBzdHJpbmcuZmluZChzLCAiW2EtekEtWl9dIikgPT0gbm90IGxvYWQocyAuLiAiPTEiLCAiIikpCisgIGFzc2VydChub3Qgc3RyaW5nLmZpbmQocywgIlthLXpBLVpfMC05XSIpID09CisgICAgICAgICBub3QgbG9hZCgiYSIgLi4gcyAuLiAiMSA9IDEiLCAiIikpCitlbmQKKworCistLSBsb25nIHZhcmlhYmxlIG5hbWVzCisKK3ZhcjEgPSBzdHJpbmcucmVwKCdhJywgMTUwMDApIC4uICcxJwordmFyMiA9IHN0cmluZy5yZXAoJ2EnLCAxNTAwMCkgLi4gJzInCitwcm9nID0gc3RyaW5nLmZvcm1hdChbWworICAlcyA9IDUKKyAgJXMgPSAlcyArIDEKKyAgcmV0dXJuIGZ1bmN0aW9uICgpIHJldHVybiAlcyAtICVzIGVuZAorXV0sIHZhcjEsIHZhcjIsIHZhcjEsIHZhcjEsIHZhcjIpCitsb2NhbCBmID0gZG9zdHJpbmcocHJvZykKK2Fzc2VydChfR1t2YXIxXSA9PSA1IGFuZCBfR1t2YXIyXSA9PSA2IGFuZCBmKCkgPT0gLTEpCit2YXIxLCB2YXIyLCBmID0gbmlsCitwcmludCgnKycpCisKKy0tIGVzY2FwZXMgLS0KK2Fzc2VydCgiXG5cdCIgPT0gW1sKKworCV1dKQorYXNzZXJ0KFtbCisKKyAkZGVidWddXSA9PSAiXG4gJGRlYnVnIikKK2Fzc2VydChbWyBbIF1dIH49IFtbIF0gXV0pCistLSBsb25nIHN0cmluZ3MgLS0KK2IgPSAiMDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorYXNzZXJ0KHN0cmluZy5sZW4oYikgPT0gOTYwKQorcHJvZyA9IFs9WworcHJpbnQoJysnKQorCithMSA9IFtbInRoaXMgaXMgYSAnc3RyaW5nJyB3aXRoIHNldmVyYWwgJ3F1b3RlcyciXV0KK2EyID0gIidxdW90ZXMnIgorCithc3NlcnQoc3RyaW5nLmZpbmQoYTEsIGEyKSA9PSAzNCkKK3ByaW50KCcrJykKKworYTEgPSBbPT1bdGVtcCA9IFtbYW4gYXJiaXRyYXJ5IHZhbHVlXV07IF09PV0KK2Fzc2VydChsb2FkKGExKSkoKQorYXNzZXJ0KHRlbXAgPT0gJ2FuIGFyYml0cmFyeSB2YWx1ZScpCistLSBsb25nIHN0cmluZ3MgLS0KK2IgPSAiMDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorYXNzZXJ0KHN0cmluZy5sZW4oYikgPT0gOTYwKQorcHJpbnQoJysnKQorCithID0gW1swMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorMDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKKzAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CiswMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorMDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKKzAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CiswMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorMDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKKzAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CiswMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorMDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKKzAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CiswMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorMDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKKzAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CiswMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorMDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKKzAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CiswMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorMDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKKzAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CiswMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorMDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKK11dCithc3NlcnQoc3RyaW5nLmxlbihhKSA9PSAxODYzKQorYXNzZXJ0KHN0cmluZy5zdWIoYSwgMSwgNDApID09IHN0cmluZy5zdWIoYiwgMSwgNDApKQoreCA9IDEKK109XQorCitwcmludCgnKycpCit4ID0gbmlsCitkb3N0cmluZyhwcm9nKQorYXNzZXJ0KHgpCisKK3Byb2cgPSBuaWwKK2EgPSBuaWwKK2IgPSBuaWwKKworCistLSB0ZXN0aW5nIGxpbmUgZW5kcworcHJvZyA9IFtbCithID0gMSAgICAgICAgLS0gYSBjb21tZW50CitiID0gMgorCisKK3ggPSBbPVsKK2hpCitdPV0KK3kgPSAiXAoraGVsbG9cclxuXAorIgorcmV0dXJuIHJlcXVpcmUiZGVidWciLmdldGluZm8oMSkuY3VycmVudGxpbmUKK11dCisKK2ZvciBfLCBuIGluIHBhaXJzeyJcbiIsICJcciIsICJcblxyIiwgIlxyXG4ifSBkbworICBsb2NhbCBwcm9nLCBubiA9IHN0cmluZy5nc3ViKHByb2csICJcbiIsIG4pCisgIGFzc2VydChkb3N0cmluZyhwcm9nKSA9PSBubikKKyAgYXNzZXJ0KF9HLnggPT0gImhpXG4iIGFuZCBfRy55ID09ICJcbmhlbGxvXHJcblxuIikKK2VuZAorCisKKy0tIHRlc3RpbmcgY29tbWVudHMgYW5kIHN0cmluZ3Mgd2l0aCBsb25nIGJyYWNrZXRzCithID0gWz09W109XT09XQorYXNzZXJ0KGEgPT0gIl09IikKKworYSA9IFs9PVtbPT09W1s9W11dPV1bPT09PVtdXT09PV09PT1dPT1dCithc3NlcnQoYSA9PSAiWz09PVtbPVtdXT1dWz09PT1bXV09PT1dPT09IikKKworYSA9IFs9PT09W1s9PT1bWz1bXV09XVs9PT09W11dPT09XT09PV09PT09XQorYXNzZXJ0KGEgPT0gIls9PT1bWz1bXV09XVs9PT09W11dPT09XT09PSIpCisKK2EgPSBbPVtdXV1dXV1dXV09XQorYXNzZXJ0KGEgPT0gIl1dXV1dXV1dIikKKworCistLVs9PT1bCit4IHkgeiBbPT1bIGJsdSBmb28KK109PQorXQorXT1dPT1dCitlcnJvciBlcnJvcl09XT09PV0KKworLS0gZ2VuZXJhdGUgYWxsIHN0cmluZ3Mgb2YgZm91ciBvZiB0aGVzZSBjaGFycworbG9jYWwgeCA9IHsiPSIsICJbIiwgIl0iLCAiXG4ifQorbG9jYWwgbGVuID0gNAorbG9jYWwgZnVuY3Rpb24gZ2VuIChjLCBuKQorICBpZiBuPT0wIHRoZW4gY29yb3V0aW5lLnlpZWxkKGMpCisgIGVsc2UKKyAgICBmb3IgXywgYSBpbiBwYWlycyh4KSBkbworICAgICAgZ2VuKGMuLmEsIG4tMSkKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZm9yIHMgaW4gY29yb3V0aW5lLndyYXAoZnVuY3Rpb24gKCkgZ2VuKCIiLCBsZW4pIGVuZCkgZG8KKyAgYXNzZXJ0KHMgPT0gbG9hZCgicmV0dXJuIFs9PT09W1xuIi4ucy4uIl09PT09XSIsICIiKSgpKQorZW5kCisKKworLS0gdGVzdGluZyBkZWNpbWFsIHBvaW50IGxvY2FsZQoraWYgb3Muc2V0bG9jYWxlKCJwdF9CUiIpIG9yIG9zLnNldGxvY2FsZSgicHRiIikgdGhlbgorICBhc3NlcnQodG9udW1iZXIoIjMsNCIpID09IDMuNCBhbmQgdG9udW1iZXIiMy40IiA9PSAzLjQpCisgIGFzc2VydCh0b251bWJlcigiICAtLjQgICIpID09IC0wLjQpCisgIGFzc2VydCh0b251bWJlcigiICArMHguNDEgICIpID09IDBYMC40MSkKKyAgYXNzZXJ0KG5vdCBsb2FkKCJhID0gKDMsNCkiKSkKKyAgYXNzZXJ0KGFzc2VydChsb2FkKCJyZXR1cm4gMy40IikpKCkgPT0gMy40KQorICBhc3NlcnQoYXNzZXJ0KGxvYWQoInJldHVybiAuNCwzIikpKCkgPT0gLjQpCisgIGFzc2VydChhc3NlcnQobG9hZCgicmV0dXJuIDQuIikpKCkgPT0gNC4pCisgIGFzc2VydChhc3NlcnQobG9hZCgicmV0dXJuIDQuKy41IikpKCkgPT0gNC41KQorCisgIGFzc2VydCgiIDB4LjEgIiArICIgMHgsMSIgKyAiLTBYLjFcdCIgPT0gMHgwLjEpCisKKyAgYXNzZXJ0KHRvbnVtYmVyImluZiIgPT0gbmlsIGFuZCB0b251bWJlciJOQU4iID09IG5pbCkKKworICBhc3NlcnQoYXNzZXJ0KGxvYWQoc3RyaW5nLmZvcm1hdCgicmV0dXJuICVxIiwgNC41MSkpKSgpID09IDQuNTEpCisKKyAgbG9jYWwgYSxiID0gbG9hZCgicmV0dXJuIDQuNS4iKQorICBhc3NlcnQoc3RyaW5nLmZpbmQoYiwgIic0JS41JS4nIikpCisKKyAgYXNzZXJ0KG9zLnNldGxvY2FsZSgiQyIpKQorZWxzZQorICAoTWVzc2FnZSBvciBwcmludCkoCisgICAnXG4gPj4+IHB0X0JSIGxvY2FsZSBub3QgYXZhaWxhYmxlOiBza2lwcGluZyBkZWNpbWFsIHBvaW50IHRlc3RzIDw8PFxuJykKK2VuZAorCisKKy0tIHRlc3RpbmcgJXEgeCBsaW5lIGVuZHMKK2xvY2FsIHMgPSAiYSBzdHJpbmcgd2l0aCBcciBhbmQgXG4gYW5kIFxyXG4gYW5kIFxuXHIiCitsb2NhbCBjID0gc3RyaW5nLmZvcm1hdCgicmV0dXJuICVxIiwgcykKK2Fzc2VydChhc3NlcnQobG9hZChjKSkoKSA9PSBzKQorCistLSB0ZXN0aW5nIGVycm9ycworYXNzZXJ0KG5vdCBsb2FkImEgPSAnbm9uLWVuZGluZyBzdHJpbmciKQorYXNzZXJ0KG5vdCBsb2FkImEgPSAnbm9uLWVuZGluZyBzdHJpbmdcbiciKQorYXNzZXJ0KG5vdCBsb2FkImEgPSAnXFwzNDUnIikKK2Fzc2VydChub3QgbG9hZCJhID0gWz14XSIpCisKK3ByaW50KCdPSycpCmRpZmYgLS1naXQgYS90ZXN0ZXMvbG9jYWxzLmx1YSBiL3Rlc3Rlcy9sb2NhbHMubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNzgwYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0ZXMvbG9jYWxzLmx1YQpAQCAtMCwwICsxLDE4MSBAQAorLS0gJElkOiBsb2NhbHMubHVhLHYgMS40MSAyMDE4LzA2LzE5IDEyOjI1OjM5IHJvYmVydG8gRXhwICQKKy0tIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGZpbGUgYWxsLmx1YQorCitwcmludCgndGVzdGluZyBsb2NhbCB2YXJpYWJsZXMgYW5kIGVudmlyb25tZW50cycpCisKK2xvY2FsIGRlYnVnID0gcmVxdWlyZSJkZWJ1ZyIKKworCistLSBidWcgaW4gNS4xOgorCitsb2NhbCBmdW5jdGlvbiBmKHgpIHggPSBuaWw7IHJldHVybiB4IGVuZAorYXNzZXJ0KGYoMTApID09IG5pbCkKKworbG9jYWwgZnVuY3Rpb24gZigpIGxvY2FsIHg7IHJldHVybiB4IGVuZAorYXNzZXJ0KGYoMTApID09IG5pbCkKKworbG9jYWwgZnVuY3Rpb24gZih4KSB4ID0gbmlsOyBsb2NhbCB5OyByZXR1cm4geCwgeSBlbmQKK2Fzc2VydChmKDEwKSA9PSBuaWwgYW5kIHNlbGVjdCgyLCBmKDIwKSkgPT0gbmlsKQorCitkbworICBsb2NhbCBpID0gMTAKKyAgZG8gbG9jYWwgaSA9IDEwMDsgYXNzZXJ0KGk9PTEwMCkgZW5kCisgIGRvIGxvY2FsIGkgPSAxMDAwOyBhc3NlcnQoaT09MTAwMCkgZW5kCisgIGFzc2VydChpID09IDEwKQorICBpZiBpIH49IDEwIHRoZW4KKyAgICBsb2NhbCBpID0gMjAKKyAgZWxzZQorICAgIGxvY2FsIGkgPSAzMAorICAgIGFzc2VydChpID09IDMwKQorICBlbmQKK2VuZAorCisKKworZiA9IG5pbAorCitsb2NhbCBmCit4ID0gMQorCithID0gbmlsCitsb2FkKCdsb2NhbCBhID0ge30nKSgpCithc3NlcnQoYSA9PSBuaWwpCisKK2Z1bmN0aW9uIGYgKGEpCisgIGxvY2FsIF8xLCBfMiwgXzMsIF80LCBfNQorICBsb2NhbCBfNiwgXzcsIF84LCBfOSwgXzEwCisgIGxvY2FsIHggPSAzCisgIGxvY2FsIGIgPSBhCisgIGxvY2FsIGMsZCA9IGEsYgorICBpZiAoZCA9PSBiKSB0aGVuCisgICAgbG9jYWwgeCA9ICdxJworICAgIHggPSBiCisgICAgYXNzZXJ0KHggPT0gMikKKyAgZWxzZQorICAgIGFzc2VydChuaWwpCisgIGVuZAorICBhc3NlcnQoeCA9PSAzKQorICBsb2NhbCBmID0gMTAKK2VuZAorCitsb2NhbCBiPTEwCitsb2NhbCBhOyByZXBlYXQgbG9jYWwgYjsgYSxiPTEsMjsgYXNzZXJ0KGErMT09Yik7IHVudGlsIGErYj09MworCisKK2Fzc2VydCh4ID09IDEpCisKK2YoMikKK2Fzc2VydCh0eXBlKGYpID09ICdmdW5jdGlvbicpCisKKworbG9jYWwgZnVuY3Rpb24gZ2V0ZW52IChmKQorICBsb2NhbCBhLGIgPSBkZWJ1Zy5nZXR1cHZhbHVlKGYsIDEpCisgIGFzc2VydChhID09ICdfRU5WJykKKyAgcmV0dXJuIGIKK2VuZAorCistLSB0ZXN0IGZvciBnbG9iYWwgdGFibGUgb2YgbG9hZGVkIGNodW5rcworYXNzZXJ0KGdldGVudihsb2FkImE9MyIpID09IF9HKQorbG9jYWwgYyA9IHt9OyBsb2NhbCBmID0gbG9hZCgiYSA9IDMiLCBuaWwsIG5pbCwgYykKK2Fzc2VydChnZXRlbnYoZikgPT0gYykKK2Fzc2VydChjLmEgPT0gbmlsKQorZigpCithc3NlcnQoYy5hID09IDMpCisKKy0tIG9sZCB0ZXN0IGZvciBsaW1pdHMgZm9yIHNwZWNpYWwgaW5zdHJ1Y3Rpb25zIChub3cganVzdCBhIGdlbmVyaWMgdGVzdCkKK2RvCisgIGxvY2FsIGkgPSAyCisgIGxvY2FsIHAgPSA0ICAgIC0tIHAgPT0gMl5pCisgIHJlcGVhdAorICAgIGZvciBqPS0zLDMgZG8KKyAgICAgIGFzc2VydChsb2FkKHN0cmluZy5mb3JtYXQoW1tsb2NhbCBhPSVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE9YSslczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoYSA9PTJeJXMpXV0sIGosIHAtaiwgaSksICcnKSkgKCkKKyAgICAgIGFzc2VydChsb2FkKHN0cmluZy5mb3JtYXQoW1tsb2NhbCBhPSVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE9YS0lczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoYT09LTJeJXMpXV0sIC1qLCBwLWosIGkpLCAnJykpICgpCisgICAgICBhc3NlcnQobG9hZChzdHJpbmcuZm9ybWF0KFtbbG9jYWwgYSxiPTAsJXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYT1iLSVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChhPT0tMl4lcyldXSwgLWosIHAtaiwgaSksICcnKSkgKCkKKyAgICBlbmQKKyAgICBwID0gMiAqIHA7ICBpID0gaSArIDEKKyAgdW50aWwgcCA8PSAwCitlbmQKKworcHJpbnQnKycKKworCitpZiByYXdnZXQoX0csICJUIikgdGhlbgorICAtLSB0ZXN0aW5nIGNsZWFyaW5nIG9mIGRlYWQgZWxlbWVudHMgZnJvbSB0YWJsZXMKKyAgY29sbGVjdGdhcmJhZ2UoInN0b3AiKSAgIC0tIHN0b3AgR0MKKyAgbG9jYWwgYSA9IHtbe31dID0gNCwgWzNdID0gMCwgYWxvID0gMSwgCisgICAgICAgICAgICAgYTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAgPSAxMH0KKworICBsb2NhbCB0ID0gVC5xdWVyeXRhYihhKQorCisgIGZvciBrLF8gaW4gcGFpcnMoYSkgZG8gYVtrXSA9IHVuZGVmIGVuZAorICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gcmVzdG9yZSBHQyBhbmQgY29sbGVjdCBkZWFkIGZpZWxzIGluIGBhJworICBmb3IgaT0wLHQtMSBkbworICAgIGxvY2FsIGsgPSBxdWVyeXRhYihhLCBpKQorICAgIGFzc2VydChrID09IG5pbCBvciB0eXBlKGspID09ICdudW1iZXInIG9yIGsgPT0gJ2FsbycpCisgIGVuZAorCisgIC0tIHRlc3RpbmcgYWxsb2NhdGlvbiBlcnJvcnMgZHVyaW5nIHRhYmxlIGluc2VydGlvbnMKKyAgbG9jYWwgYSA9IHt9CisgIGxvY2FsIGZ1bmN0aW9uIGFkZGl0ZW1zICgpCisgICAgYS54ID0gdHJ1ZTsgYS55ID0gdHJ1ZTsgYS56ID0gdHJ1ZQorICAgIGFbMV0gPSB0cnVlCisgICAgYVsyXSA9IHRydWUKKyAgZW5kCisgIGZvciBpID0gMSwgbWF0aC5odWdlIGRvCisgICAgVC5hbGxvY2NvdW50KGkpCisgICAgbG9jYWwgc3QsIG1zZyA9IHBjYWxsKGFkZGl0ZW1zKQorICAgIFQuYWxsb2Njb3VudCgpCisgICAgbG9jYWwgY291bnQgPSAwCisgICAgZm9yIGssIHYgaW4gcGFpcnMoYSkgZG8KKyAgICAgIGFzc2VydChhW2tdID09IHYpCisgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgIGVuZAorICAgIGlmIHN0IHRoZW4gYXNzZXJ0KGNvdW50ID09IDUpOyBicmVhayBlbmQKKyAgZW5kCitlbmQKKworCistLSB0ZXN0aW5nIGxleGljYWwgZW52aXJvbm1lbnRzCisKK2Fzc2VydChfRU5WID09IF9HKQorCitkbworbG9jYWwgZHVtbXkKK2xvY2FsIF9FTlYgPSAoZnVuY3Rpb24gKC4uLikgcmV0dXJuIC4uLiBlbmQpKF9HLCBkdW1teSkgICAtLSB7CisKK2RvIGxvY2FsIF9FTlYgPSB7YXNzZXJ0PWFzc2VydH07IGFzc2VydCh0cnVlKSBlbmQKK210ID0ge19HID0gX0d9Citsb2NhbCBmb28seAorQSA9IGZhbHNlICAgIC0tICJkZWNsYXJlIiBBCitkbyBsb2NhbCBfRU5WID0gbXQKKyAgZnVuY3Rpb24gZm9vICh4KQorICAgIEEgPSB4CisgICAgZG8gbG9jYWwgX0VOViA9ICBfRzsgQSA9IDEwMDAgZW5kCisgICAgcmV0dXJuIGZ1bmN0aW9uICh4KSByZXR1cm4gQSAuLiB4IGVuZAorICBlbmQKK2VuZAorYXNzZXJ0KGdldGVudihmb28pID09IG10KQoreCA9IGZvbygnaGknKTsgYXNzZXJ0KG10LkEgPT0gJ2hpJyBhbmQgQSA9PSAxMDAwKQorYXNzZXJ0KHgoJyonKSA9PSBtdC5BIC4uICcqJykKKworZG8gbG9jYWwgX0VOViA9IHthc3NlcnQ9YXNzZXJ0LCBBPTEwfTsKKyAgZG8gbG9jYWwgX0VOViA9IHthc3NlcnQ9YXNzZXJ0LCBBPTIwfTsKKyAgICBhc3NlcnQoQT09MjApO3g9QQorICBlbmQKKyAgYXNzZXJ0KEE9PTEwIGFuZCB4PT0yMCkKK2VuZAorYXNzZXJ0KHg9PTIwKQorCisKK3ByaW50KCdPSycpCisKK3JldHVybiA1LGYKKworZW5kICAgLS0gfQorCmRpZmYgLS1naXQgYS90ZXN0ZXMvbWFpbi5sdWEgYi90ZXN0ZXMvbWFpbi5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyYjM5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9tYWluLmx1YQpAQCAtMCwwICsxLDM4MSBAQAorIyB0ZXN0aW5nIHNwZWNpYWwgY29tbWVudCBvbiBmaXJzdCBsaW5lCistLSAkSWQ6IG1haW4ubHVhLHYgMS42OSAyMDE4LzA2LzE5IDEyOjIzOjUwIHJvYmVydG8gRXhwICQKKy0tIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGZpbGUgYWxsLmx1YQorCistLSBtb3N0IChhbGw/KSB0ZXN0cyBoZXJlIGFzc3VtZSBhIHJlYXNvbmFibGUgIlVuaXgtbGlrZSIgc2hlbGwKK2lmIF9wb3J0IHRoZW4gcmV0dXJuIGVuZAorCistLSB1c2Ugb25seSAiZG91YmxlIHF1b3RlcyIgaW5zaWRlIHNoZWxsIHNjcmlwdHMgKGJldHRlciBjaGFuZ2UgdG8KKy0tIHJ1biBvbiBXaW5kb3dzKQorCisKK3ByaW50ICgidGVzdGluZyBzdGFuZC1hbG9uZSBpbnRlcnByZXRlciIpCisKK2Fzc2VydChvcy5leGVjdXRlKCkpICAgLS0gbWFjaGluZSBoYXMgYSBzeXN0ZW0gY29tbWFuZAorCitsb2NhbCBhcmcgPSBhcmcgb3IgQVJHCisKK2xvY2FsIHByb2cgPSBvcy50bXBuYW1lKCkKK2xvY2FsIG90aGVycHJvZyA9IG9zLnRtcG5hbWUoKQorbG9jYWwgb3V0ID0gb3MudG1wbmFtZSgpCisKK2xvY2FsIHByb2duYW1lCitkbworICBsb2NhbCBpID0gMAorICB3aGlsZSBhcmdbaV0gZG8gaT1pLTEgZW5kCisgIHByb2duYW1lID0gYXJnW2krMV0KK2VuZAorcHJpbnQoInByb2duYW1lOiAiLi5wcm9nbmFtZSkKKworbG9jYWwgcHJlcGZpbGUgPSBmdW5jdGlvbiAocywgcCkKKyAgcCA9IHAgb3IgcHJvZworICBpby5vdXRwdXQocCkKKyAgaW8ud3JpdGUocykKKyAgYXNzZXJ0KGlvLmNsb3NlKCkpCitlbmQKKworbG9jYWwgZnVuY3Rpb24gZ2V0b3V0cHV0ICgpCisgIGlvLmlucHV0KG91dCkKKyAgbG9jYWwgdCA9IGlvLnJlYWQoImEiKQorICBpby5pbnB1dCgpOmNsb3NlKCkKKyAgYXNzZXJ0KG9zLnJlbW92ZShvdXQpKQorICByZXR1cm4gdAorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIGNoZWNrcHJvZ291dCAocykKKyAgbG9jYWwgdCA9IGdldG91dHB1dCgpCisgIGZvciBsaW5lIGluIHN0cmluZy5nbWF0Y2gocywgIi4tXG4iKSBkbworICAgIGFzc2VydChzdHJpbmcuZmluZCh0LCBsaW5lLCAxLCB0cnVlKSkKKyAgZW5kCitlbmQKKworbG9jYWwgZnVuY3Rpb24gY2hlY2tvdXQgKHMpCisgIGxvY2FsIHQgPSBnZXRvdXRwdXQoKQorICBpZiBzIH49IHQgdGhlbiBwcmludChzdHJpbmcuZm9ybWF0KCInJXMnIC0gJyVzJ1xuIiwgcywgdCkpIGVuZAorICBhc3NlcnQocyA9PSB0KQorICByZXR1cm4gdAorZW5kCisKKworbG9jYWwgZnVuY3Rpb24gUlVOIChwLCAuLi4pCisgIHAgPSBzdHJpbmcuZ3N1YihwLCAibHVhIiwgJyInLi5wcm9nbmFtZS4uJyInLCAxKQorICBsb2NhbCBzID0gc3RyaW5nLmZvcm1hdChwLCAuLi4pCisgIGFzc2VydChvcy5leGVjdXRlKHMpKQorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIE5vUnVuIChtc2csIHAsIC4uLikKKyAgcCA9IHN0cmluZy5nc3ViKHAsICJsdWEiLCAnIicuLnByb2duYW1lLi4nIicsIDEpCisgIGxvY2FsIHMgPSBzdHJpbmcuZm9ybWF0KHAsIC4uLikKKyAgcyA9IHN0cmluZy5mb3JtYXQoIiVzIDI+ICVzIiwgcywgb3V0KSAgLS0gd2lsbCBzZW5kIGVycm9yIHRvICdvdXQnCisgIGFzc2VydChub3Qgb3MuZXhlY3V0ZShzKSkKKyAgYXNzZXJ0KHN0cmluZy5maW5kKGdldG91dHB1dCgpLCBtc2csIDEsIHRydWUpKSAgLS0gY2hlY2sgZXJyb3IgbWVzc2FnZQorZW5kCisKK1JVTignbHVhIC12JykKKworcHJpbnQoc3RyaW5nLmZvcm1hdCgiKHRlbXBvcmFyeSBwcm9ncmFtIGZpbGUgdXNlZCBpbiB0aGVzZSB0ZXN0czogJXMpIiwgcHJvZykpCisKKy0tIHJ1bm5pbmcgc3RkaW4gYXMgYSBmaWxlCitwcmVwZmlsZSIiCitSVU4oJ2x1YSAtIDwgJXMgPiAlcycsIHByb2csIG91dCkKK2NoZWNrb3V0KCIiKQorCitwcmVwZmlsZVtbCisgIHByaW50KAorMSwgYQorKQorXV0KK1JVTignbHVhIC0gPCAlcyA+ICVzJywgcHJvZywgb3V0KQorY2hlY2tvdXQoIjFcdG5pbFxuIikKKworUlVOKCdlY2hvICJwcmludCgxMClcbnByaW50KDIpXG4iIHwgbHVhID4gJXMnLCBvdXQpCitjaGVja291dCgiMTBcbjJcbiIpCisKKworLS0gdGVzdCBvcHRpb24gJy0nCitSVU4oJ2VjaG8gInByaW50KGFyZ1sxXSkiIHwgbHVhIC0gLWggPiAlcycsIG91dCkKK2NoZWNrb3V0KCItaFxuIikKKworLS0gdGVzdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCBieSBMdWEKKworcHJlcGZpbGUoInByaW50KHBhY2thZ2UucGF0aCkiKQorCistLSB0ZXN0IExVQV9QQVRICitSVU4oJ2VudiBMVUFfSU5JVD0gTFVBX1BBVEg9eCBsdWEgJXMgPiAlcycsIHByb2csIG91dCkKK2NoZWNrb3V0KCJ4XG4iKQorCistLSB0ZXN0IExVQV9QQVRIX3ZlcnNpb24KK1JVTignZW52IExVQV9JTklUPSBMVUFfUEFUSF81XzQ9eSBMVUFfUEFUSD14IGx1YSAlcyA+ICVzJywgcHJvZywgb3V0KQorY2hlY2tvdXQoInlcbiIpCisKKy0tIHRlc3QgTFVBX0NQQVRICitwcmVwZmlsZSgicHJpbnQocGFja2FnZS5jcGF0aCkiKQorUlVOKCdlbnYgTFVBX0lOSVQ9IExVQV9DUEFUSD14dXh1IGx1YSAlcyA+ICVzJywgcHJvZywgb3V0KQorY2hlY2tvdXQoInh1eHVcbiIpCisKKy0tIHRlc3QgTFVBX0NQQVRIX3ZlcnNpb24KK1JVTignZW52IExVQV9JTklUPSBMVUFfQ1BBVEhfNV80PXlhY2MgTFVBX0NQQVRIPXggbHVhICVzID4gJXMnLCBwcm9nLCBvdXQpCitjaGVja291dCgieWFjY1xuIikKKworLS0gdGVzdCBMVUFfSU5JVCAoYW5kIGl0cyBhY2Nlc3MgdG8gJ2FyZycgdGFibGUpCitwcmVwZmlsZSgicHJpbnQoWCkiKQorUlVOKCdlbnYgTFVBX0lOSVQ9Ilg9dG9udW1iZXIoYXJnWzFdKSIgbHVhICVzIDMuMiA+ICVzJywgcHJvZywgb3V0KQorY2hlY2tvdXQoIjMuMlxuIikKKworLS0gdGVzdCBMVUFfSU5JVF92ZXJzaW9uCitwcmVwZmlsZSgicHJpbnQoWCkiKQorUlVOKCdlbnYgTFVBX0lOSVRfNV80PSJYPTEwIiBMVUFfSU5JVD0iWD0zIiBsdWEgJXMgPiAlcycsIHByb2csIG91dCkKK2NoZWNrb3V0KCIxMFxuIikKKworLS0gdGVzdCBMVUFfSU5JVCBmb3IgZmlsZXMKK3ByZXBmaWxlKCJ4ID0geCBvciAxMDsgcHJpbnQoeCk7IHggPSB4ICsgMSIpCitSVU4oJ2VudiBMVUFfSU5JVD0iQCVzIiBsdWEgJXMgPiAlcycsIHByb2csIHByb2csIG91dCkKK2NoZWNrb3V0KCIxMFxuMTFcbiIpCisKKy0tIHRlc3QgZXJyb3JzIGluIExVQV9JTklUCitOb1J1bignTFVBX0lOSVQ6MTogbXNnJywgJ2VudiBMVUFfSU5JVD0iZXJyb3IoXCdtc2dcJykiIGx1YScpCisKKy0tIHRlc3Qgb3B0aW9uICctRScKK2xvY2FsIGRlZmF1bHRwYXRoLCBkZWZhdWx0Q3BhdGgKKworZG8KKyAgcHJlcGZpbGUoInByaW50KHBhY2thZ2UucGF0aCwgcGFja2FnZS5jcGF0aCkiKQorICBSVU4oJ2VudiBMVUFfSU5JVD0iZXJyb3IoMTApIiBMVUFfUEFUSD14eHggTFVBX0NQQVRIPXh4eCBsdWEgLUUgJXMgPiAlcycsCisgICAgICAgcHJvZywgb3V0KQorICBsb2NhbCBvdXQgPSBnZXRvdXRwdXQoKQorICBkZWZhdWx0cGF0aCA9IHN0cmluZy5tYXRjaChvdXQsICJeKC4tKVx0IikKKyAgZGVmYXVsdENwYXRoID0gc3RyaW5nLm1hdGNoKG91dCwgIlx0KC4tKSQiKQorZW5kCisKKy0tIHBhdGhzIGRpZCBub3QgY2hhbmdlZAorYXNzZXJ0KG5vdCBzdHJpbmcuZmluZChkZWZhdWx0cGF0aCwgInh4eCIpIGFuZAorICAgICAgIHN0cmluZy5maW5kKGRlZmF1bHRwYXRoLCAibHVhIikgYW5kCisgICAgICAgbm90IHN0cmluZy5maW5kKGRlZmF1bHRDcGF0aCwgInh4eCIpIGFuZAorICAgICAgIHN0cmluZy5maW5kKGRlZmF1bHRDcGF0aCwgImx1YSIpKQorCisKKy0tIHRlc3QgcmVwbGFjZW1lbnQgb2YgJzs7JyB0byBkZWZhdWx0IHBhdGgKK2xvY2FsIGZ1bmN0aW9uIGNvbnZlcnQgKHApCisgIHByZXBmaWxlKCJwcmludChwYWNrYWdlLnBhdGgpIikKKyAgUlVOKCdlbnYgTFVBX1BBVEg9IiVzIiBsdWEgJXMgPiAlcycsIHAsIHByb2csIG91dCkKKyAgbG9jYWwgZXhwZWN0ZWQgPSBnZXRvdXRwdXQoKQorICBleHBlY3RlZCA9IHN0cmluZy5zdWIoZXhwZWN0ZWQsIDEsIC0yKSAgIC0tIGN1dCBmaW5hbCBlbmQgb2YgbGluZQorICBhc3NlcnQoc3RyaW5nLmdzdWIocCwgIjs7IiwgIjsiLi5kZWZhdWx0cGF0aC4uIjsiKSA9PSBleHBlY3RlZCkKK2VuZAorCitjb252ZXJ0KCI7IikKK2NvbnZlcnQoIjs7IikKK2NvbnZlcnQoIjs7OyIpCitjb252ZXJ0KCI7Ozs7IikKK2NvbnZlcnQoIjs7Ozs7IikKK2NvbnZlcnQoIjs7YTs7O2JjIikKKworCistLSB0ZXN0IC1sIG92ZXIgbXVsdGlwbGUgbGlicmFyaWVzCitwcmVwZmlsZSgicHJpbnQoMSk7IGE9MjsgcmV0dXJuIHt4PTE1fSIpCitwcmVwZmlsZSgoInByaW50KGEpOyBwcmludChfR1snJXMnXS54KSIpOmZvcm1hdChwcm9nKSwgb3RoZXJwcm9nKQorUlVOKCdlbnYgTFVBX1BBVEg9Ij87OyIgbHVhIC1sICVzIC1sJXMgLWxzdHJpbmcgLWwgaW8gJXMgPiAlcycsIHByb2csIG90aGVycHJvZywgb3RoZXJwcm9nLCBvdXQpCitjaGVja291dCgiMVxuMlxuMTVcbjJcbjE1XG4iKQorCistLSB0ZXN0ICdhcmcnIHRhYmxlCitsb2NhbCBhID0gW1sKKyAgYXNzZXJ0KCNhcmcgPT0gMyBhbmQgYXJnWzFdID09ICdhJyBhbmQKKyAgICAgICAgIGFyZ1syXSA9PSAnYicgYW5kIGFyZ1szXSA9PSAnYycpCisgIGFzc2VydChhcmdbLTFdID09ICctLScgYW5kIGFyZ1stMl0gPT0gIi1lICIgYW5kIGFyZ1stM10gPT0gJyVzJykKKyAgYXNzZXJ0KGFyZ1s0XSA9PSB1bmRlZiBhbmQgYXJnWy00XSA9PSB1bmRlZikKKyAgbG9jYWwgYSwgYiwgYyA9IC4uLgorICBhc3NlcnQoLi4uID09ICdhJyBhbmQgYSA9PSAnYScgYW5kIGIgPT0gJ2InIGFuZCBjID09ICdjJykKK11dCithID0gc3RyaW5nLmZvcm1hdChhLCBwcm9nbmFtZSkKK3ByZXBmaWxlKGEpCitSVU4oJ2x1YSAiLWUgIiAtLSAlcyBhIGIgYycsIHByb2cpICAgLS0gIi1lICIgcnVucyBhbiBlbXB0eSBjb21tYW5kCisKKy0tIHRlc3QgJ2FyZycgYXZhaWxhYmlsaXR5IGluIGxpYnJhcmllcworcHJlcGZpbGUiYXNzZXJ0KGFyZykiCitwcmVwZmlsZSgiYXNzZXJ0KGFyZykiLCBvdGhlcnByb2cpCitSVU4oJ2VudiBMVUFfUEFUSD0iPzs7IiBsdWEgLWwlcyAtIDwgJXMnLCBwcm9nLCBvdGhlcnByb2cpCisKKy0tIHRlc3QgbWVzc2luZyB1cCB0aGUgJ2FyZycgdGFibGUKK1JVTignZWNobyAicHJpbnQoLi4uKSIgfCBsdWEgLWUgImFyZ1sxXSA9IDEwMCIgLSA+ICVzJywgb3V0KQorY2hlY2tvdXQoIjEwMFxuIikKK05vUnVuKCInYXJnJyBpcyBub3QgYSB0YWJsZSIsICdlY2hvICIiIHwgbHVhIC1lICJhcmcgPSAxIiAtJykKKworLS0gdGVzdCBlcnJvciBpbiAncHJpbnQnCitSVU4oJ2VjaG8gMTAgfCBsdWEgLWUgInByaW50PW5pbCIgLWkgPiAvZGV2L251bGwgMj4gJXMnLCBvdXQpCithc3NlcnQoc3RyaW5nLmZpbmQoZ2V0b3V0cHV0KCksICJlcnJvciBjYWxsaW5nICdwcmludCciKSkKKworLS0gdGVzdCAnZGVidWcuZGVidWcnCitSVU4oJ2VjaG8gImlvLnN0ZGVycjp3cml0ZSgxMDAwKVxuY29udCIgfCBsdWEgLWUgInJlcXVpcmVcJ2RlYnVnXCcuZGVidWcoKSIgMj4gJXMnLCBvdXQpCitjaGVja291dCgibHVhX2RlYnVnPiAxMDAwbHVhX2RlYnVnPiAiKQorCistLSB0ZXN0IG1hbnkgYXJndW1lbnRzCitwcmVwZmlsZVtbcHJpbnQoKHsuLi59KVszMF0pXV0KK1JVTignbHVhICVzICVzID4gJXMnLCBwcm9nLCBzdHJpbmcucmVwKCIgYSIsIDMwKSwgb3V0KQorY2hlY2tvdXQoImFcbiIpCisKK1JVTihbW2x1YSAiLWVwcmludCgxKSIgLWVhPTMgLWUgInByaW50KGEpIiA+ICVzXV0sIG91dCkKK2NoZWNrb3V0KCIxXG4zXG4iKQorCistLSB0ZXN0IGl0ZXJhY3RpdmUgbW9kZQorcHJlcGZpbGVbWworKDYqMi02KSAtLSA9PT0KK2EgPQorMTAKK3ByaW50KGEpCithXV0KK1JVTihbW2x1YSAtZSJfUFJPTVBUPScnIF9QUk9NUFQyPScnIiAtaSA8ICVzID4gJXNdXSwgcHJvZywgb3V0KQorY2hlY2twcm9nb3V0KCI2XG4xMFxuMTBcblxuIikKKworcHJlcGZpbGUoImEgPSBbW2JcbmNcbmRcbmVdXVxuPWEiKQorUlVOKFtbbHVhIC1lIl9QUk9NUFQ9JycgX1BST01QVDI9JyciIC1pIDwgJXMgPiAlc11dLCBwcm9nLCBvdXQpCitjaGVja3Byb2dvdXQoImJcbmNcbmRcbmVcblxuIikKKworcHJvbXB0ID0gImFsbyIKK3ByZXBmaWxlW1sgLS0KK2EgPSAyCitdXQorUlVOKFtbbHVhICItZV9QUk9NUFQ9JyVzJyIgLWkgPCAlcyA+ICVzXV0sIHByb21wdCwgcHJvZywgb3V0KQorbG9jYWwgdCA9IGdldG91dHB1dCgpCithc3NlcnQoc3RyaW5nLmZpbmQodCwgcHJvbXB0IC4uICIuKiIgLi4gcHJvbXB0IC4uICIuKiIgLi4gcHJvbXB0KSkKKworLS0gdGVzdCBmb3IgZXJyb3Igb2JqZWN0cworcHJlcGZpbGVbWworZGVidWcgPSByZXF1aXJlICJkZWJ1ZyIKK20gPSB7eD0wfQorc2V0bWV0YXRhYmxlKG0sIHtfX3Rvc3RyaW5nID0gZnVuY3Rpb24oeCkKKyAgcmV0dXJuIHRvc3RyaW5nKGRlYnVnLmdldGluZm8oNCkuY3VycmVudGxpbmUgKyB4LngpCitlbmR9KQorZXJyb3IobSkKK11dCitOb1J1bihwcm9nbmFtZSAuLiAiOiA2XG4iLCBbW2x1YSAlc11dLCBwcm9nKQorCitwcmVwZmlsZSgiZXJyb3J7fSIpCitOb1J1bigiZXJyb3Igb2JqZWN0IGlzIGEgdGFibGUgdmFsdWUiLCBbW2x1YSAlc11dLCBwcm9nKQorCisKKy0tIGNodW5rIGJyb2tlbiBpbiBtYW55IGxpbmVzCitzID0gWz1bIC0tIAorZnVuY3Rpb24gZiAoIHggKSAKKyAgbG9jYWwgYSA9IFtbCit4dXh1CitdXQorICBsb2NhbCBiID0gIlwKK3h1eHVcbiIKKyAgaWYgeCA9PSAxMSB0aGVuIHJldHVybiAxICsgMTIgLCAyICsgMjAgZW5kICAtLVtbIHRlc3QgbXVsdGlwbGUgcmV0dXJucyBdXQorICByZXR1cm4geCArIDEgCisgIC0tXFwKK2VuZAorcmV0dXJuKCBmKCAxMDAgKSApCithc3NlcnQoIGEgPT0gYiApCitkbyByZXR1cm4gZiggMTEgKSBlbmQgIF09XQorcyA9IHN0cmluZy5nc3ViKHMsICcgJywgJ1xuXG4nKSAgIC0tIGNoYW5nZSBhbGwgc3BhY2VzIGZvciBuZXdsaW5lcworcHJlcGZpbGUocykKK1JVTihbW2x1YSAtZSJfUFJPTVBUPScnIF9QUk9NUFQyPScnIiAtaSA8ICVzID4gJXNdXSwgcHJvZywgb3V0KQorY2hlY2twcm9nb3V0KCIxMDFcbjEzXHQyMlxuXG4iKQorICAKK3ByZXBmaWxlW1sjY29tbWVudCBpbiAxc3QgbGluZSB3aXRob3V0IFxuIGF0IHRoZSBlbmRdXQorUlVOKCdsdWEgJXMnLCBwcm9nKQorICAKK3ByZXBmaWxlW1sjdGVzdCBsaW5lIG51bWJlciB3aGVuIGZpbGUgc3RhcnRzIHdpdGggY29tbWVudCBsaW5lCitkZWJ1ZyA9IHJlcXVpcmUiZGVidWciCitwcmludChkZWJ1Zy5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lKQorXV0KK1JVTignbHVhICVzID4gJXMnLCBwcm9nLCBvdXQpCitjaGVja3Byb2dvdXQoJzMnKQorCistLSBjbG9zZSBMdWEgd2l0aCBhbiBvcGVuIGZpbGUKK3ByZXBmaWxlKHN0cmluZy5mb3JtYXQoW1tpby5vdXRwdXQoJXEpOyBpby53cml0ZSgnYWxvJyldXSwgb3V0KSkKK1JVTignbHVhICVzJywgcHJvZykKK2NoZWNrb3V0KCdhbG8nKQorCistLSBidWcgaW4gNS4yIGJldGEgKGV4dHJhIFwwIGFmdGVyIHZlcnNpb24gbGluZSkKK1JVTihbW2x1YSAtdiAgLWUicHJpbnQnaGVsbG8nIiA+ICVzXV0sIG91dCkKK3QgPSBnZXRvdXRwdXQoKQorYXNzZXJ0KHN0cmluZy5maW5kKHQsICJQVUMlLVJpb1xuaGVsbG8iKSkKKworCistLSB0ZXN0aW5nIG9zLmV4aXQKK3ByZXBmaWxlKCJvcy5leGl0KG5pbCwgdHJ1ZSkiKQorUlVOKCdsdWEgJXMnLCBwcm9nKQorcHJlcGZpbGUoIm9zLmV4aXQoMCwgdHJ1ZSkiKQorUlVOKCdsdWEgJXMnLCBwcm9nKQorcHJlcGZpbGUoIm9zLmV4aXQodHJ1ZSwgdHJ1ZSkiKQorUlVOKCdsdWEgJXMnLCBwcm9nKQorcHJlcGZpbGUoIm9zLmV4aXQoMSwgdHJ1ZSkiKQorTm9SdW4oIiIsICJsdWEgJXMiLCBwcm9nKSAgIC0tIG5vIG1lc3NhZ2UKK3ByZXBmaWxlKCJvcy5leGl0KGZhbHNlLCB0cnVlKSIpCitOb1J1bigiIiwgImx1YSAlcyIsIHByb2cpICAgLS0gbm8gbWVzc2FnZQorCistLSByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCithc3NlcnQob3MucmVtb3ZlKHByb2cpKQorYXNzZXJ0KG9zLnJlbW92ZShvdGhlcnByb2cpKQorYXNzZXJ0KG5vdCBvcy5yZW1vdmUob3V0KSkKKworLS0gaW52YWxpZCBvcHRpb25zCitOb1J1bigidW5yZWNvZ25pemVkIG9wdGlvbiAnLWgnIiwgImx1YSAtaCIpCitOb1J1bigidW5yZWNvZ25pemVkIG9wdGlvbiAnLS0tJyIsICJsdWEgLS0tIikKK05vUnVuKCJ1bnJlY29nbml6ZWQgb3B0aW9uICctRXgnIiwgImx1YSAtRXgiKQorTm9SdW4oInVucmVjb2duaXplZCBvcHRpb24gJy12diciLCAibHVhIC12diIpCitOb1J1bigidW5yZWNvZ25pemVkIG9wdGlvbiAnLWl2JyIsICJsdWEgLWl2IikKK05vUnVuKCInLWUnIG5lZWRzIGFyZ3VtZW50IiwgImx1YSAtZSIpCitOb1J1bigic3ludGF4IGVycm9yIiwgImx1YSAtZSBhIikKK05vUnVuKCInLWwnIG5lZWRzIGFyZ3VtZW50IiwgImx1YSAtbCIpCisKKworaWYgVCB0aGVuICAgLS0gYXV4aWxpYXJ5IGxpYnJhcnk/CisgIHByaW50KCJ0ZXN0aW5nICdub3QgZW5vdWdoIG1lbW9yeScgdG8gY3JlYXRlIGEgc3RhdGUiKQorICBOb1J1bigibm90IGVub3VnaCBtZW1vcnkiLCAiZW52IE1FTUxJTUlUPTEwMCBsdWEiKQorZW5kCitwcmludCgnKycpCisKK3ByaW50KCd0ZXN0aW5nIEN0cmwgQycpCitkbworICAtLSBpbnRlcnJ1cHQgYSBzY3JpcHQKKyAgbG9jYWwgZnVuY3Rpb24ga2lsbCAocGlkKQorICAgIHJldHVybiBvcy5leGVjdXRlKHN0cmluZy5mb3JtYXQoJ2tpbGwgLUlOVCAlcyAyPiAvZGV2L251bGwnLCBwaWQpKQorICBlbmQKKworICAtLSBmdW5jdGlvbiB0byBydW4gYSBzY3JpcHQgaW4gYmFja2dyb3VuZCwgcmV0dXJuaW5nIGl0cyBvdXRwdXQgZmlsZQorICAtLSBkZXNjcmlwdG9yIGFuZCBpdHMgcGlkCisgIGxvY2FsIGZ1bmN0aW9uIHJ1bmJhY2sgKGx1YXByZykKKyAgICAtLSBzaGVsbCBzY3JpcHQgdG8gcnVuICdsdWFwcmcnIGluIGJhY2tncm91bmQgYW5kIGVjaG8gaXRzIHBpZAorICAgIGxvY2FsIHNoZWxscHJnID0gc3RyaW5nLmZvcm1hdCgnJXMgLWUgIiVzIiAmIGVjaG8gJCEnLCBwcm9nbmFtZSwgbHVhcHJnKQorICAgIGxvY2FsIGYgPSBpby5wb3BlbihzaGVsbHByZywgInIiKSAgIC0tIHJ1biBzaGVsbCBzY3JpcHQKKyAgICBsb2NhbCBwaWQgPSBmOnJlYWQoKSAgIC0tIGdldCBwaWQgZm9yIEx1YSBzY3JpcHQKKyAgICBwcmludCgiKGlmIHRlc3QgZmFpbHMgbm93LCBpdCBtYXkgbGVhdmUgYSBMdWEgc2NyaXB0IHJ1bm5pbmcgaW4gXHoKKyAgICAgICAgICAgIGJhY2tncm91bmQsIHBpZCAiIC4uIHBpZCAuLiAiKSIpCisgICAgcmV0dXJuIGYsIHBpZAorICBlbmQKKworICAtLSBMdWEgc2NyaXB0IHRoYXQgcnVucyBwcm90ZWN0ZWQgaW5maW5pdGUgbG9vcCBhbmQgdGhlbiBwcmludHMgJzQyJworICBsb2NhbCBmLCBwaWQgPSBydW5iYWNrW1sKKyAgICBwY2FsbChmdW5jdGlvbiAoKSBwcmludCgxMik7IHdoaWxlIHRydWUgZG8gZW5kIGVuZCk7IHByaW50KDQyKV1dCisgIC0tIHdhaXQgdW50aWwgc2NyaXB0IGlzIGluc2lkZSAncGNhbGwnCisgIGFzc2VydChmOnJlYWQoKSA9PSAiMTIiKQorICBraWxsKHBpZCkgIC0tIHNlbmQgSU5UIHNpZ25hbCB0byBMdWEgc2NyaXB0CisgIC0tIGNoZWNrIHRoYXQgJ3BjYWxsJyBjYXB0dXJlZCB0aGUgZXhjZXB0aW9uIGFuZCBzY3JpcHQgY29udGludWVkIHJ1bm5pbmcKKyAgYXNzZXJ0KGY6cmVhZCgpID09ICI0MiIpICAtLSBleHBlY3RlZCBvdXRwdXQKKyAgYXNzZXJ0KGY6Y2xvc2UoKSkKKyAgcHJpbnQoImRvbmUiKQorCisgIC0tIEx1YSBzY3JpcHQgaW4gYSBsb25nIHVuYnJlYWthYmxlIHNlYXJjaAorICBsb2NhbCBmLCBwaWQgPSBydW5iYWNrW1sKKyAgICBwcmludCgxNSk7IHN0cmluZy5maW5kKHN0cmluZy5yZXAoJ2EnLCAxMDAwMDApLCAnLipiJyldXQorICAtLSB3YWl0IChzbyBzY3JpcHQgY2FuIHJlYWNoIHRoZSBsb29wKQorICBhc3NlcnQoZjpyZWFkKCkgPT0gIjE1IikKKyAgYXNzZXJ0KG9zLmV4ZWN1dGUoInNsZWVwIDEiKSkKKyAgLS0gbXVzdCBzZW5kIGF0IGxlYXN0IHR3byBJTlQgc2lnbmFscyB0byBzdG9wIHRoaXMgTHVhIHNjcmlwdAorICBsb2NhbCBuID0gMTAwCisgIGZvciBpID0gMCwgMTAwIGRvICAgLS0ga2VlcCBzZW5kaW5nIHNpZ25hbHMKKyAgICBpZiBub3Qga2lsbChwaWQpIHRoZW4gICAtLSB1bnRpbCBpdCBmYWlscworICAgICAgbiA9IGkgICAtLSBudW1iZXIgb2Ygbm9uLWZhaWxlZCBraWxscworICAgICAgYnJlYWsKKyAgICBlbmQKKyAgZW5kCisgIGFzc2VydChmOmNsb3NlKCkpCisgIGFzc2VydChuID49IDIpCisgIHByaW50KHN0cmluZy5mb3JtYXQoImRvbmUgKHdpdGggJWQga2lsbHMpIiwgbikpCisKK2VuZAorCitwcmludCgiT0siKQpkaWZmIC0tZ2l0IGEvdGVzdGVzL21hdGgubHVhIGIvdGVzdGVzL21hdGgubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTk4NDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0ZXMvbWF0aC5sdWEKQEAgLTAsMCArMSw5MzEgQEAKKy0tICRJZDogbWF0aC5sdWEsdiAxLjg2IDIwMTgvMDUvMDkgMTQ6NTU6NTIgcm9iZXJ0byBFeHAgJAorLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCisKK3ByaW50KCJ0ZXN0aW5nIG51bWJlcnMgYW5kIG1hdGggbGliIikKKworbG9jYWwgbWluaW50ID0gbWF0aC5taW5pbnRlZ2VyCitsb2NhbCBtYXhpbnQgPSBtYXRoLm1heGludGVnZXIKKworbG9jYWwgaW50Yml0cyA9IG1hdGguZmxvb3IobWF0aC5sb2cobWF4aW50LCAyKSArIDAuNSkgKyAxCithc3NlcnQoKDEgPDwgaW50Yml0cykgPT0gMCkKKworYXNzZXJ0KG1pbmludCA9PSAxIDw8IChpbnRiaXRzIC0gMSkpCithc3NlcnQobWF4aW50ID09IG1pbmludCAtIDEpCisKKy0tIG51bWJlciBvZiBiaXRzIGluIHRoZSBtYW50aXNzYSBvZiBhIGZsb2F0aW5nLXBvaW50IG51bWJlcgorbG9jYWwgZmxvYXRiaXRzID0gMjQKK2RvCisgIGxvY2FsIHAgPSAyLjBeZmxvYXRiaXRzCisgIHdoaWxlIHAgPCBwICsgMS4wIGRvCisgICAgcCA9IHAgKiAyLjAKKyAgICBmbG9hdGJpdHMgPSBmbG9hdGJpdHMgKyAxCisgIGVuZAorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIGlzTmFOICh4KQorICByZXR1cm4gKHggfj0geCkKK2VuZAorCithc3NlcnQoaXNOYU4oMC8wKSkKK2Fzc2VydChub3QgaXNOYU4oMS8wKSkKKworCitkbworICBsb2NhbCB4ID0gMi4wXmZsb2F0Yml0cworICBhc3NlcnQoeCA+IHggLSAxLjAgYW5kIHggPT0geCArIDEuMCkKKworICBwcmludChzdHJpbmcuZm9ybWF0KCIlZC1iaXQgaW50ZWdlcnMsICVkLWJpdCAobWFudGlzc2EpIGZsb2F0cyIsCisgICAgICAgICAgICAgICAgICAgICAgIGludGJpdHMsIGZsb2F0Yml0cykpCitlbmQKKworYXNzZXJ0KG1hdGgudHlwZSgwKSA9PSAiaW50ZWdlciIgYW5kIG1hdGgudHlwZSgwLjApID09ICJmbG9hdCIKKyAgICAgICBhbmQgbWF0aC50eXBlKCIxMCIpID09IG5pbCkKKworCitsb2NhbCBmdW5jdGlvbiBjaGVja2Vycm9yIChtc2csIGYsIC4uLikKKyAgbG9jYWwgcywgZXJyID0gcGNhbGwoZiwgLi4uKQorICBhc3NlcnQobm90IHMgYW5kIHN0cmluZy5maW5kKGVyciwgbXNnKSkKK2VuZAorCitsb2NhbCBtc2dmMmkgPSAibnVtYmVyLiogaGFzIG5vIGludGVnZXIgcmVwcmVzZW50YXRpb24iCisKKy0tIGZsb2F0IGVxdWFsaXR5CitmdW5jdGlvbiBlcSAoYSxiLGxpbWl0KQorICBpZiBub3QgbGltaXQgdGhlbgorICAgIGlmIGZsb2F0Yml0cyA+PSA1MCB0aGVuIGxpbWl0ID0gMUUtMTEKKyAgICBlbHNlIGxpbWl0ID0gMUUtNQorICAgIGVuZAorICBlbmQKKyAgLS0gYSA9PSBiIG5lZWRlZCBmb3IgK2luZi8taW5mCisgIHJldHVybiBhID09IGIgb3IgbWF0aC5hYnMoYS1iKSA8PSBsaW1pdAorZW5kCisKKworLS0gZXF1YWxpdHkgd2l0aCB0eXBlcworZnVuY3Rpb24gZXFUIChhLGIpCisgIHJldHVybiBhID09IGIgYW5kIG1hdGgudHlwZShhKSA9PSBtYXRoLnR5cGUoYikKK2VuZAorCisKKy0tIGJhc2ljIGZsb2F0IG5vdGF0aW9uCithc3NlcnQoMGUxMiA9PSAwIGFuZCAuMCA9PSAwIGFuZCAwLiA9PSAwIGFuZCAuMmUyID09IDIwIGFuZCAyLkUtMSA9PSAwLjIpCisKK2RvCisgIGxvY2FsIGEsYixjID0gIjIiLCAiIDNlMCAiLCAiIDEwICAiCisgIGFzc2VydChhK2IgPT0gNSBhbmQgLWIgPT0gLTMgYW5kIGIrIjIiID09IDUgYW5kICIxMCItYyA9PSAwKQorICBhc3NlcnQodHlwZShhKSA9PSAnc3RyaW5nJyBhbmQgdHlwZShiKSA9PSAnc3RyaW5nJyBhbmQgdHlwZShjKSA9PSAnc3RyaW5nJykKKyAgYXNzZXJ0KGEgPT0gIjIiIGFuZCBiID09ICIgM2UwICIgYW5kIGMgPT0gIiAxMCAgIiBhbmQgLWMgPT0gLSIgIDEwICIpCisgIGFzc2VydChjJWEgPT0gMCBhbmQgYV5iID09IDA4KQorICBhID0gMAorICBhc3NlcnQoYSA9PSAtYSBhbmQgMCA9PSAtMCkKK2VuZAorCitkbworICBsb2NhbCB4ID0gLTEKKyAgbG9jYWwgbXogPSAwL3ggICAtLSBtaW51cyB6ZXJvCisgIHQgPSB7WzBdID0gMTAsIDIwLCAzMCwgNDAsIDUwfQorICBhc3NlcnQodFttel0gPT0gdFswXSBhbmQgdFstMF0gPT0gdFswXSkKK2VuZAorCitkbyAgIC0tIHRlc3RzIGZvciAnbW9kZicKKyAgbG9jYWwgYSxiID0gbWF0aC5tb2RmKDMuNSkKKyAgYXNzZXJ0KGEgPT0gMy4wIGFuZCBiID09IDAuNSkKKyAgYSxiID0gbWF0aC5tb2RmKC0yLjUpCisgIGFzc2VydChhID09IC0yLjAgYW5kIGIgPT0gLTAuNSkKKyAgYSxiID0gbWF0aC5tb2RmKC0zZTIzKQorICBhc3NlcnQoYSA9PSAtM2UyMyBhbmQgYiA9PSAwLjApCisgIGEsYiA9IG1hdGgubW9kZigzZTM1KQorICBhc3NlcnQoYSA9PSAzZTM1IGFuZCBiID09IDAuMCkKKyAgYSxiID0gbWF0aC5tb2RmKC0xLzApICAgLS0gLWluZgorICBhc3NlcnQoYSA9PSAtMS8wIGFuZCBiID09IDAuMCkKKyAgYSxiID0gbWF0aC5tb2RmKDEvMCkgICAtLSBpbmYKKyAgYXNzZXJ0KGEgPT0gMS8wIGFuZCBiID09IDAuMCkKKyAgYSxiID0gbWF0aC5tb2RmKDAvMCkgICAtLSBOYU4KKyAgYXNzZXJ0KGlzTmFOKGEpIGFuZCBpc05hTihiKSkKKyAgYSxiID0gbWF0aC5tb2RmKDMpICAtLSBpbnRlZ2VyIGFyZ3VtZW50CisgIGFzc2VydChlcVQoYSwgMykgYW5kIGVxVChiLCAwLjApKQorICBhLGIgPSBtYXRoLm1vZGYobWluaW50KQorICBhc3NlcnQoZXFUKGEsIG1pbmludCkgYW5kIGVxVChiLCAwLjApKQorZW5kCisKK2Fzc2VydChtYXRoLmh1Z2UgPiAxMGUzMCkKK2Fzc2VydCgtbWF0aC5odWdlIDwgLTEwZTMwKQorCisKKy0tIGludGVnZXIgYXJpdGhtZXRpYworYXNzZXJ0KG1pbmludCA8IG1pbmludCArIDEpCithc3NlcnQobWF4aW50IC0gMSA8IG1heGludCkKK2Fzc2VydCgwIC0gbWluaW50ID09IG1pbmludCkKK2Fzc2VydChtaW5pbnQgKiBtaW5pbnQgPT0gMCkKK2Fzc2VydChtYXhpbnQgKiBtYXhpbnQgKiBtYXhpbnQgPT0gbWF4aW50KQorCisKKy0tIHRlc3RpbmcgZmxvb3IgZGl2aXNpb24gYW5kIGNvbnZlcnNpb25zCisKK2ZvciBfLCBpIGluIHBhaXJzey0xNiwgLTE1LCAtMywgLTIsIC0xLCAwLCAxLCAyLCAzLCAxNX0gZG8KKyAgZm9yIF8sIGogaW4gcGFpcnN7LTE2LCAtMTUsIC0zLCAtMiwgLTEsIDEsIDIsIDMsIDE1fSBkbworICAgIGZvciBfLCB0aSBpbiBwYWlyc3swLCAwLjB9IGRvICAgICAtLSB0cnkgJ2knIGFzIGludGVnZXIgYW5kIGFzIGZsb2F0CisgICAgICBmb3IgXywgdGogaW4gcGFpcnN7MCwgMC4wfSBkbyAgIC0tIHRyeSAnaicgYXMgaW50ZWdlciBhbmQgYXMgZmxvYXQKKyAgICAgICAgbG9jYWwgeCA9IGkgKyB0aQorICAgICAgICBsb2NhbCB5ID0gaiArIHRqCisgICAgICAgICAgYXNzZXJ0KGkvL2ogPT0gbWF0aC5mbG9vcihpL2opKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Fzc2VydCgxLy8wLjAgPT0gMS8wKQorYXNzZXJ0KC0xIC8vIDAuMCA9PSAtMS8wKQorYXNzZXJ0KGVxVCgzLjUgLy8gMS41LCAyLjApKQorYXNzZXJ0KGVxVCgzLjUgLy8gLTEuNSwgLTMuMCkpCisKK2Fzc2VydChtYXhpbnQgLy8gbWF4aW50ID09IDEpCithc3NlcnQobWF4aW50IC8vIDEgPT0gbWF4aW50KQorYXNzZXJ0KChtYXhpbnQgLSAxKSAvLyBtYXhpbnQgPT0gMCkKK2Fzc2VydChtYXhpbnQgLy8gKG1heGludCAtIDEpID09IDEpCithc3NlcnQobWluaW50IC8vIG1pbmludCA9PSAxKQorYXNzZXJ0KG1pbmludCAvLyBtaW5pbnQgPT0gMSkKK2Fzc2VydCgobWluaW50ICsgMSkgLy8gbWluaW50ID09IDApCithc3NlcnQobWluaW50IC8vIChtaW5pbnQgKyAxKSA9PSAxKQorYXNzZXJ0KG1pbmludCAvLyAxID09IG1pbmludCkKKworYXNzZXJ0KG1pbmludCAvLyAtMSA9PSAtbWluaW50KQorYXNzZXJ0KG1pbmludCAvLyAtMiA9PSAyXihpbnRiaXRzIC0gMikpCithc3NlcnQobWF4aW50IC8vIC0xID09IC1tYXhpbnQpCisKKworLS0gbmVnYXRpdmUgZXhwb25lbnRzCitkbworICBhc3NlcnQoMl4tMyA9PSAxIC8gMl4zKQorICBhc3NlcnQoZXEoKC0zKV4tMywgMSAvICgtMyleMykpCisgIGZvciBpID0gLTMsIDMgZG8gICAgLS0gdmFyaWFibGVzIGF2b2lkIGNvbnN0YW50IGZvbGRpbmcKKyAgICAgIGZvciBqID0gLTMsIDMgZG8KKyAgICAgICAgLS0gZG9tYWluIGVycm9ycyAoMF4oLW4pKSBhcmUgbm90IHBvcnRhYmxlCisgICAgICAgIGlmIG5vdCBfcG9ydCBvciBpIH49IDAgb3IgaiA+IDAgdGhlbgorICAgICAgICAgIGFzc2VydChlcShpXmosIDEgLyBpXigtaikpKQorICAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZAorCistLSBjb21wYXJpc29uIGJldHdlZW4gZmxvYXRzIGFuZCBpbnRlZ2VycyAoYm9yZGVyIGNhc2VzKQoraWYgZmxvYXRiaXRzIDwgaW50Yml0cyB0aGVuCisgIGFzc2VydCgyLjBeZmxvYXRiaXRzID09ICgxIDw8IGZsb2F0Yml0cykpCisgIGFzc2VydCgyLjBeZmxvYXRiaXRzIC0gMS4wID09ICgxIDw8IGZsb2F0Yml0cykgLSAxLjApCisgIGFzc2VydCgyLjBeZmxvYXRiaXRzIC0gMS4wIH49ICgxIDw8IGZsb2F0Yml0cykpCisgIC0tIGZsb2F0IGlzIHJvdW5kZWQsIGludCBpcyBub3QKKyAgYXNzZXJ0KDIuMF5mbG9hdGJpdHMgKyAxLjAgfj0gKDEgPDwgZmxvYXRiaXRzKSArIDEpCitlbHNlICAgLS0gZmxvYXRzIGNhbiBleHByZXNzIGFsbCBpbnRlZ2VycyB3aXRoIGZ1bGwgYWNjdXJhY3kKKyAgYXNzZXJ0KG1heGludCA9PSBtYXhpbnQgKyAwLjApCisgIGFzc2VydChtYXhpbnQgLSAxID09IG1heGludCAtIDEuMCkKKyAgYXNzZXJ0KG1pbmludCArIDEgPT0gbWluaW50ICsgMS4wKQorICBhc3NlcnQobWF4aW50IH49IG1heGludCAtIDEuMCkKK2VuZAorYXNzZXJ0KG1heGludCArIDAuMCA9PSAyLjBeKGludGJpdHMgLSAxKSAtIDEuMCkKK2Fzc2VydChtaW5pbnQgKyAwLjAgPT0gbWluaW50KQorYXNzZXJ0KG1pbmludCArIDAuMCA9PSAtMi4wXihpbnRiaXRzIC0gMSkpCisKKworLS0gb3JkZXIgYmV0d2VlbiBmbG9hdHMgYW5kIGludGVnZXJzCithc3NlcnQoMSA8IDEuMSk7IGFzc2VydChub3QgKDEgPCAwLjkpKQorYXNzZXJ0KDEgPD0gMS4xKTsgYXNzZXJ0KG5vdCAoMSA8PSAwLjkpKQorYXNzZXJ0KC0xIDwgLTAuOSk7IGFzc2VydChub3QgKC0xIDwgLTEuMSkpCithc3NlcnQoMSA8PSAxLjEpOyBhc3NlcnQobm90ICgtMSA8PSAtMS4xKSkKK2Fzc2VydCgtMSA8IC0wLjkpOyBhc3NlcnQobm90ICgtMSA8IC0xLjEpKQorYXNzZXJ0KC0xIDw9IC0wLjkpOyBhc3NlcnQobm90ICgtMSA8PSAtMS4xKSkKK2Fzc2VydChtaW5pbnQgPD0gbWluaW50ICsgMC4wKQorYXNzZXJ0KG1pbmludCArIDAuMCA8PSBtaW5pbnQpCithc3NlcnQobm90IChtaW5pbnQgPCBtaW5pbnQgKyAwLjApKQorYXNzZXJ0KG5vdCAobWluaW50ICsgMC4wIDwgbWluaW50KSkKK2Fzc2VydChtYXhpbnQgPCBtaW5pbnQgKiAtMS4wKQorYXNzZXJ0KG1heGludCA8PSBtaW5pbnQgKiAtMS4wKQorCitkbworICBsb2NhbCBmbWF4aTEgPSAyXihpbnRiaXRzIC0gMSkKKyAgYXNzZXJ0KG1heGludCA8IGZtYXhpMSkKKyAgYXNzZXJ0KG1heGludCA8PSBmbWF4aTEpCisgIGFzc2VydChub3QgKGZtYXhpMSA8PSBtYXhpbnQpKQorICBhc3NlcnQobWluaW50IDw9IC0yXihpbnRiaXRzIC0gMSkpCisgIGFzc2VydCgtMl4oaW50Yml0cyAtIDEpIDw9IG1pbmludCkKK2VuZAorCitpZiBmbG9hdGJpdHMgPCBpbnRiaXRzIHRoZW4KKyAgcHJpbnQoInRlc3Rpbmcgb3JkZXIgKGZsb2F0cyBjYW5ub3QgcmVwcmVzZW50IGFsbCBpbnRlZ2VycykiKQorICBsb2NhbCBmbWF4ID0gMl5mbG9hdGJpdHMKKyAgbG9jYWwgaWZtYXggPSBmbWF4IHwgMAorICBhc3NlcnQoZm1heCA8IGlmbWF4ICsgMSkKKyAgYXNzZXJ0KGZtYXggLSAxIDwgaWZtYXgpCisgIGFzc2VydCgtKGZtYXggLSAxKSA+IC1pZm1heCkKKyAgYXNzZXJ0KG5vdCAoZm1heCA8PSBpZm1heCAtIDEpKQorICBhc3NlcnQoLWZtYXggPiAtKGlmbWF4ICsgMSkpCisgIGFzc2VydChub3QgKC1mbWF4ID49IC0oaWZtYXggLSAxKSkpCisKKyAgYXNzZXJ0KGZtYXgvMiAtIDAuNSA8IGlmbWF4Ly8yKQorICBhc3NlcnQoLShmbWF4LzIgLSAwLjUpID4gLWlmbWF4Ly8yKQorCisgIGFzc2VydChtYXhpbnQgPCAyXmludGJpdHMpCisgIGFzc2VydChtaW5pbnQgPiAtMl5pbnRiaXRzKQorICBhc3NlcnQobWF4aW50IDw9IDJeaW50Yml0cykKKyAgYXNzZXJ0KG1pbmludCA+PSAtMl5pbnRiaXRzKQorZWxzZQorICBwcmludCgidGVzdGluZyBvcmRlciAoZmxvYXRzIGNhbiByZXByZXNlbnQgYWxsIGludGVnZXJzKSIpCisgIGFzc2VydChtYXhpbnQgPCBtYXhpbnQgKyAxLjApCisgIGFzc2VydChtYXhpbnQgPCBtYXhpbnQgKyAwLjUpCisgIGFzc2VydChtYXhpbnQgLSAxLjAgPCBtYXhpbnQpCisgIGFzc2VydChtYXhpbnQgLSAwLjUgPCBtYXhpbnQpCisgIGFzc2VydChub3QgKG1heGludCArIDAuMCA8IG1heGludCkpCisgIGFzc2VydChtYXhpbnQgKyAwLjAgPD0gbWF4aW50KQorICBhc3NlcnQobm90IChtYXhpbnQgPCBtYXhpbnQgKyAwLjApKQorICBhc3NlcnQobWF4aW50ICsgMC4wIDw9IG1heGludCkKKyAgYXNzZXJ0KG1heGludCA8PSBtYXhpbnQgKyAwLjApCisgIGFzc2VydChub3QgKG1heGludCArIDEuMCA8PSBtYXhpbnQpKQorICBhc3NlcnQobm90IChtYXhpbnQgKyAwLjUgPD0gbWF4aW50KSkKKyAgYXNzZXJ0KG5vdCAobWF4aW50IDw9IG1heGludCAtIDEuMCkpCisgIGFzc2VydChub3QgKG1heGludCA8PSBtYXhpbnQgLSAwLjUpKQorCisgIGFzc2VydChtaW5pbnQgPCBtaW5pbnQgKyAxLjApCisgIGFzc2VydChtaW5pbnQgPCBtaW5pbnQgKyAwLjUpCisgIGFzc2VydChtaW5pbnQgPD0gbWluaW50ICsgMC41KQorICBhc3NlcnQobWluaW50IC0gMS4wIDwgbWluaW50KQorICBhc3NlcnQobWluaW50IC0gMS4wIDw9IG1pbmludCkKKyAgYXNzZXJ0KG5vdCAobWluaW50ICsgMC4wIDwgbWluaW50KSkKKyAgYXNzZXJ0KG5vdCAobWluaW50ICsgMC41IDwgbWluaW50KSkKKyAgYXNzZXJ0KG5vdCAobWluaW50IDwgbWluaW50ICsgMC4wKSkKKyAgYXNzZXJ0KG1pbmludCArIDAuMCA8PSBtaW5pbnQpCisgIGFzc2VydChtaW5pbnQgPD0gbWluaW50ICsgMC4wKQorICBhc3NlcnQobm90IChtaW5pbnQgKyAxLjAgPD0gbWluaW50KSkKKyAgYXNzZXJ0KG5vdCAobWluaW50ICsgMC41IDw9IG1pbmludCkpCisgIGFzc2VydChub3QgKG1pbmludCA8PSBtaW5pbnQgLSAxLjApKQorZW5kCisKK2RvCisgIGxvY2FsIE5hTiA9IDAvMAorICBhc3NlcnQobm90IChOYU4gPCAwKSkKKyAgYXNzZXJ0KG5vdCAoTmFOID4gbWluaW50KSkKKyAgYXNzZXJ0KG5vdCAoTmFOIDw9IC05KSkKKyAgYXNzZXJ0KG5vdCAoTmFOIDw9IG1heGludCkpCisgIGFzc2VydChub3QgKE5hTiA8IG1heGludCkpCisgIGFzc2VydChub3QgKG1pbmludCA8PSBOYU4pKQorICBhc3NlcnQobm90IChtaW5pbnQgPCBOYU4pKQorICBhc3NlcnQobm90ICg0IDw9IE5hTikpCisgIGFzc2VydChub3QgKDQgPCBOYU4pKQorZW5kCisKKworLS0gYXZvaWRpbmcgZXJyb3JzIGF0IGNvbXBpbGUgdGltZQorbG9jYWwgZnVuY3Rpb24gY2hlY2tjb21wdCAobXNnLCBjb2RlKQorICBjaGVja2Vycm9yKG1zZywgYXNzZXJ0KGxvYWQoY29kZSkpKQorZW5kCitjaGVja2NvbXB0KCJkaXZpZGUgYnkgemVybyIsICJyZXR1cm4gMiAvLyAwIikKK2NoZWNrY29tcHQobXNnZjJpLCAicmV0dXJuIDIuMyA+PiAwIikKK2NoZWNrY29tcHQobXNnZjJpLCAoInJldHVybiAyLjBeJWQgJiAxIik6Zm9ybWF0KGludGJpdHMgLSAxKSkKK2NoZWNrY29tcHQoImZpZWxkICdodWdlJyIsICJyZXR1cm4gbWF0aC5odWdlIDw8IDEiKQorY2hlY2tjb21wdChtc2dmMmksICgicmV0dXJuIDEgfCAyLjBeJWQiKTpmb3JtYXQoaW50Yml0cyAtIDEpKQorY2hlY2tjb21wdChtc2dmMmksICJyZXR1cm4gMi4zIH4gMC4wIikKKworCistLSB0ZXN0aW5nIG92ZXJmbG93IGVycm9ycyB3aGVuIGNvbnZlcnRpbmcgZnJvbSBmbG9hdCB0byBpbnRlZ2VyIChydW50aW1lKQorbG9jYWwgZnVuY3Rpb24gZjJpICh4KSByZXR1cm4geCB8IHggZW5kCitjaGVja2Vycm9yKG1zZ2YyaSwgZjJpLCBtYXRoLmh1Z2UpICAgICAtLSAraW5mCitjaGVja2Vycm9yKG1zZ2YyaSwgZjJpLCAtbWF0aC5odWdlKSAgICAtLSAtaW5mCitjaGVja2Vycm9yKG1zZ2YyaSwgZjJpLCAwLzApICAgICAgICAgICAtLSBOYU4KKworaWYgZmxvYXRiaXRzIDwgaW50Yml0cyB0aGVuCisgIC0tIGNvbnZlcnNpb24gdGVzdHMgd2hlbiBmbG9hdCBjYW5ub3QgcmVwcmVzZW50IGFsbCBpbnRlZ2VycworICBhc3NlcnQobWF4aW50ICsgMS4wID09IG1heGludCArIDAuMCkKKyAgYXNzZXJ0KG1pbmludCAtIDEuMCA9PSBtaW5pbnQgKyAwLjApCisgIGNoZWNrZXJyb3IobXNnZjJpLCBmMmksIG1heGludCArIDAuMCkKKyAgYXNzZXJ0KGYyaSgyLjBeKGludGJpdHMgLSAyKSkgPT0gMSA8PCAoaW50Yml0cyAtIDIpKQorICBhc3NlcnQoZjJpKC0yLjBeKGludGJpdHMgLSAyKSkgPT0gLSgxIDw8IChpbnRiaXRzIC0gMikpKQorICBhc3NlcnQoKDIuMF4oZmxvYXRiaXRzIC0gMSkgKyAxLjApIC8vIDEgPT0gKDEgPDwgKGZsb2F0Yml0cyAtIDEpKSArIDEpCisgIC0tIG1heGltdW0gaW50ZWdlciByZXByZXNlbnRhYmxlIGFzIGEgZmxvYXQKKyAgbG9jYWwgbWYgPSBtYXhpbnQgLSAoMSA8PCAoZmxvYXRiaXRzIC0gaW50Yml0cykpICsgMQorICBhc3NlcnQoZjJpKG1mICsgMC4wKSA9PSBtZikgIC0tIE9LIHVwIHRvIGhlcmUKKyAgbWYgPSBtZiArIDEKKyAgYXNzZXJ0KGYyaShtZiArIDAuMCkgfj0gbWYpICAgLS0gbm8gbW9yZSByZXByZXNlbnRhYmxlCitlbHNlCisgIC0tIGNvbnZlcnNpb24gdGVzdHMgd2hlbiBmbG9hdCBjYW4gcmVwcmVzZW50IGFsbCBpbnRlZ2VycworICBhc3NlcnQobWF4aW50ICsgMS4wID4gbWF4aW50KQorICBhc3NlcnQobWluaW50IC0gMS4wIDwgbWluaW50KQorICBhc3NlcnQoZjJpKG1heGludCArIDAuMCkgPT0gbWF4aW50KQorICBjaGVja2Vycm9yKCJubyBpbnRlZ2VyIHJlcCIsIGYyaSwgbWF4aW50ICsgMS4wKQorICBjaGVja2Vycm9yKCJubyBpbnRlZ2VyIHJlcCIsIGYyaSwgbWluaW50IC0gMS4wKQorZW5kCisKKy0tICdtaW5pbnQnIHNob3VsZCBiZSByZXByZXNlbnRhYmxlIGFzIGEgZmxvYXQgbm8gbWF0dGVyIHRoZSBwcmVjaXNpb24KK2Fzc2VydChmMmkobWluaW50ICsgMC4wKSA9PSBtaW5pbnQpCisKKworLS0gdGVzdGluZyBudW1lcmljIHN0cmluZ3MKKworYXNzZXJ0KCIyIiArIDEgPT0gMykKK2Fzc2VydCgiMiAiICsgMSA9PSAzKQorYXNzZXJ0KCIgLTIgIiArIDEgPT0gLTEpCithc3NlcnQoIiAtMHhhICIgKyAxID09IC05KQorCisKKy0tIExpdGVyYWwgaW50ZWdlciBPdmVyZmxvd3MgKG5ldyBiZWhhdmlvciBpbiA1LjMuMykKK2RvCisgIC0tIG5vIG92ZXJmbG93cworICBhc3NlcnQoZXFUKHRvbnVtYmVyKHRvc3RyaW5nKG1heGludCkpLCBtYXhpbnQpKQorICBhc3NlcnQoZXFUKHRvbnVtYmVyKHRvc3RyaW5nKG1pbmludCkpLCBtaW5pbnQpKQorCisgIC0tIGFkZCAxIHRvIGxhc3QgZGlnaXQgYXMgYSBzdHJpbmcgKGl0IGNhbm5vdCBiZSA5Li4uKQorICBsb2NhbCBmdW5jdGlvbiBpbmNkIChuKQorICAgIGxvY2FsIHMgPSBzdHJpbmcuZm9ybWF0KCIlZCIsIG4pCisgICAgcyA9IHN0cmluZy5nc3ViKHMsICIlZCQiLCBmdW5jdGlvbiAoZCkKKyAgICAgICAgICBhc3NlcnQoZCB+PSAnOScpCisgICAgICAgICAgcmV0dXJuIHN0cmluZy5jaGFyKHN0cmluZy5ieXRlKGQpICsgMSkKKyAgICAgICAgZW5kKQorICAgIHJldHVybiBzCisgIGVuZAorCisgIC0tICd0b251bWJlcicgd2l0aCBvdmVyZmxvdyBieSAxCisgIGFzc2VydChlcVQodG9udW1iZXIoaW5jZChtYXhpbnQpKSwgbWF4aW50ICsgMS4wKSkKKyAgYXNzZXJ0KGVxVCh0b251bWJlcihpbmNkKG1pbmludCkpLCBtaW5pbnQgLSAxLjApKQorCisgIC0tIGxhcmdlIG51bWJlcnMKKyAgYXNzZXJ0KGVxVCh0b251bWJlcigiMSIuLnN0cmluZy5yZXAoIjAiLCAzMCkpLCAxZTMwKSkKKyAgYXNzZXJ0KGVxVCh0b251bWJlcigiLTEiLi5zdHJpbmcucmVwKCIwIiwgMzApKSwgLTFlMzApKQorCisgIC0tIGhleGEgZm9ybWF0IHN0aWxsIHdyYXBzIGFyb3VuZAorICBhc3NlcnQoZXFUKHRvbnVtYmVyKCIweDEiLi5zdHJpbmcucmVwKCIwIiwgMzApKSwgMCkpCisKKyAgLS0gbGV4ZXIgaW4gdGhlIGxpbWl0cworICBhc3NlcnQobWluaW50ID09IGxvYWQoInJldHVybiAiIC4uIG1pbmludCkoKSkKKyAgYXNzZXJ0KGVxVChtYXhpbnQsIGxvYWQoInJldHVybiAiIC4uIG1heGludCkoKSkpCisKKyAgYXNzZXJ0KGVxVCgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wLCAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCkpCisgIGFzc2VydChlcVQoLTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjAsIC0xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCkpCitlbmQKKworCistLSB0ZXN0aW5nICd0b251bWJlcicKKworLS0gJ3RvbnVtYmVyJyB3aXRoIG51bWJlcnMKK2Fzc2VydCh0b251bWJlcigzLjQpID09IDMuNCkKK2Fzc2VydChlcVQodG9udW1iZXIoMyksIDMpKQorYXNzZXJ0KGVxVCh0b251bWJlcihtYXhpbnQpLCBtYXhpbnQpIGFuZCBlcVQodG9udW1iZXIobWluaW50KSwgbWluaW50KSkKK2Fzc2VydCh0b251bWJlcigxLzApID09IDEvMCkKKworLS0gJ3RvbnVtYmVyJyB3aXRoIHN0cmluZ3MKK2Fzc2VydCh0b251bWJlcigiMCIpID09IDApCithc3NlcnQodG9udW1iZXIoIiIpID09IG5pbCkKK2Fzc2VydCh0b251bWJlcigiICAiKSA9PSBuaWwpCithc3NlcnQodG9udW1iZXIoIi0iKSA9PSBuaWwpCithc3NlcnQodG9udW1iZXIoIiAgLTB4ICIpID09IG5pbCkKK2Fzc2VydCh0b251bWJlcnt9ID09IG5pbCkKK2Fzc2VydCh0b251bWJlcicrMC4wMScgPT0gMS8xMDAgYW5kIHRvbnVtYmVyJysuMDEnID09IDAuMDEgYW5kCisgICAgICAgdG9udW1iZXInLjAxJyA9PSAwLjAxICAgIGFuZCB0b251bWJlcictMS4nID09IC0xIGFuZAorICAgICAgIHRvbnVtYmVyJysxLicgPT0gMSkKK2Fzc2VydCh0b251bWJlcicrIDAuMDEnID09IG5pbCBhbmQgdG9udW1iZXInKy5lMScgPT0gbmlsIGFuZAorICAgICAgIHRvbnVtYmVyJzFlJyA9PSBuaWwgICAgIGFuZCB0b251bWJlcicxLjBlKycgPT0gbmlsIGFuZAorICAgICAgIHRvbnVtYmVyJy4nID09IG5pbCkKK2Fzc2VydCh0b251bWJlcignLTAxMicpID09IC0wMTAtMikKK2Fzc2VydCh0b251bWJlcignLTEuMmUyJykgPT0gLSAtIC0xMjApCisKK2Fzc2VydCh0b251bWJlcigiMHhmZmZmZmZmZmZmZmYiKSA9PSAoMSA8PCAoNCoxMikpIC0gMSkKK2Fzc2VydCh0b251bWJlcigiMHgiLi5zdHJpbmcucmVwKCJmIiwgKGludGJpdHMvLzQpKSkgPT0gLTEpCithc3NlcnQodG9udW1iZXIoIi0weCIuLnN0cmluZy5yZXAoImYiLCAoaW50Yml0cy8vNCkpKSA9PSAxKQorCistLSB0ZXN0aW5nICd0b251bWJlcicgd2l0aCBiYXNlCithc3NlcnQodG9udW1iZXIoJyAgMDAxMDEwICAnLCAyKSA9PSAxMCkKK2Fzc2VydCh0b251bWJlcignICAwMDEwMTAgICcsIDEwKSA9PSAwMDEwMTApCithc3NlcnQodG9udW1iZXIoJyAgLTEwMTAgICcsIDIpID09IC0xMCkKK2Fzc2VydCh0b251bWJlcignMTAnLCAzNikgPT0gMzYpCithc3NlcnQodG9udW1iZXIoJyAgLTEwICAnLCAzNikgPT0gLTM2KQorYXNzZXJ0KHRvbnVtYmVyKCcgICsxWiAgJywgMzYpID09IDM2ICsgMzUpCithc3NlcnQodG9udW1iZXIoJyAgLTF6ICAnLCAzNikgPT0gLTM2ICsgLTM1KQorYXNzZXJ0KHRvbnVtYmVyKCctZkZmYScsIDE2KSA9PSAtKDEwKygxNiooMTUrKDE2KigxNSsoMTYqMTUpKSkpKSkpCithc3NlcnQodG9udW1iZXIoc3RyaW5nLnJlcCgnMScsIChpbnRiaXRzIC0gMikpLCAyKSArIDEgPT0gMl4oaW50Yml0cyAtIDIpKQorYXNzZXJ0KHRvbnVtYmVyKCdmZmZmRkZGRicsIDE2KSsxID09ICgxIDw8IDMyKSkKK2Fzc2VydCh0b251bWJlcignMGZmZmZGRkZGJywgMTYpKzEgPT0gKDEgPDwgMzIpKQorYXNzZXJ0KHRvbnVtYmVyKCctMGZmZmZmZkZGRkYnLCAxNikgLSAxID09IC0oMSA8PCA0MCkpCitmb3IgaSA9IDIsMzYgZG8KKyAgbG9jYWwgaTIgPSBpICogaQorICBsb2NhbCBpMTAgPSBpMiAqIGkyICogaTIgKiBpMiAqIGkyICAgICAgLS0gaV4xMAorICBhc3NlcnQodG9udW1iZXIoJ1x0MTAwMDAwMDAwMDBcdCcsIGkpID09IGkxMCkKK2VuZAorCitpZiBub3QgX3NvZnQgdGhlbgorICAtLSB0ZXN0cyB3aXRoIHZlcnkgbG9uZyBudW1lcmFscworICBhc3NlcnQodG9udW1iZXIoIjB4Ii4uc3RyaW5nLnJlcCgiZiIsIDEzKS4uIi4wIikgPT0gMi4wXig0KjEzKSAtIDEpCisgIGFzc2VydCh0b251bWJlcigiMHgiLi5zdHJpbmcucmVwKCJmIiwgMTUwKS4uIi4wIikgPT0gMi4wXig0KjE1MCkgLSAxKQorICBhc3NlcnQodG9udW1iZXIoIjB4Ii4uc3RyaW5nLnJlcCgiZiIsIDMwMCkuLiIuMCIpID09IDIuMF4oNCozMDApIC0gMSkKKyAgYXNzZXJ0KHRvbnVtYmVyKCIweCIuLnN0cmluZy5yZXAoImYiLCA1MDApLi4iLjAiKSA9PSAyLjBeKDQqNTAwKSAtIDEpCisgIGFzc2VydCh0b251bWJlcignMHgzLicgLi4gc3RyaW5nLnJlcCgnMCcsIDEwMDApKSA9PSAzKQorICBhc3NlcnQodG9udW1iZXIoJzB4JyAuLiBzdHJpbmcucmVwKCcwJywgMTAwMCkgLi4gJ2EnKSA9PSAxMCkKKyAgYXNzZXJ0KHRvbnVtYmVyKCcweDAuJyAuLiBzdHJpbmcucmVwKCcwJywgMTMpLi4iMSIpID09IDIuMF4oLTQqMTQpKQorICBhc3NlcnQodG9udW1iZXIoJzB4MC4nIC4uIHN0cmluZy5yZXAoJzAnLCAxNTApLi4iMSIpID09IDIuMF4oLTQqMTUxKSkKKyAgYXNzZXJ0KHRvbnVtYmVyKCcweDAuJyAuLiBzdHJpbmcucmVwKCcwJywgMzAwKS4uIjEiKSA9PSAyLjBeKC00KjMwMSkpCisgIGFzc2VydCh0b251bWJlcignMHgwLicgLi4gc3RyaW5nLnJlcCgnMCcsIDUwMCkuLiIxIikgPT0gMi4wXigtNCo1MDEpKQorCisgIGFzc2VydCh0b251bWJlcignMHhlMDMnIC4uIHN0cmluZy5yZXAoJzAnLCAxMDAwKSAuLiAncC00MDAwJykgPT0gMzU4Ny4wKQorICBhc3NlcnQodG9udW1iZXIoJzB4LicgLi4gc3RyaW5nLnJlcCgnMCcsIDEwMDApIC4uICc3NHA0MDA0JykgPT0gMHg3LjQpCitlbmQKKworLS0gdGVzdGluZyAndG9udW1iZXInIGZvciBpbnZhbGlkIGZvcm1hdHMKKworbG9jYWwgZnVuY3Rpb24gZiAoLi4uKQorICBpZiBzZWxlY3QoJyMnLCAuLi4pID09IDEgdGhlbgorICAgIHJldHVybiAoLi4uKQorICBlbHNlCisgICAgcmV0dXJuICIqKioiCisgIGVuZAorZW5kCisKK2Fzc2VydChmKHRvbnVtYmVyKCdmRmZhJywgMTUpKSA9PSBuaWwpCithc3NlcnQoZih0b251bWJlcignMDk5JywgOCkpID09IG5pbCkKK2Fzc2VydChmKHRvbnVtYmVyKCcxXDAnLCAyKSkgPT0gbmlsKQorYXNzZXJ0KGYodG9udW1iZXIoJycsIDgpKSA9PSBuaWwpCithc3NlcnQoZih0b251bWJlcignICAnLCA5KSkgPT0gbmlsKQorYXNzZXJ0KGYodG9udW1iZXIoJyAgJywgOSkpID09IG5pbCkKK2Fzc2VydChmKHRvbnVtYmVyKCcweGYnLCAxMCkpID09IG5pbCkKKworYXNzZXJ0KGYodG9udW1iZXIoJ2luZicpKSA9PSBuaWwpCithc3NlcnQoZih0b251bWJlcignIElORiAnKSkgPT0gbmlsKQorYXNzZXJ0KGYodG9udW1iZXIoJ05hbicpKSA9PSBuaWwpCithc3NlcnQoZih0b251bWJlcignbmFuJykpID09IG5pbCkKKworYXNzZXJ0KGYodG9udW1iZXIoJyAgJykpID09IG5pbCkKK2Fzc2VydChmKHRvbnVtYmVyKCcnKSkgPT0gbmlsKQorYXNzZXJ0KGYodG9udW1iZXIoJzEgIGEnKSkgPT0gbmlsKQorYXNzZXJ0KGYodG9udW1iZXIoJzEgIGEnLCAyKSkgPT0gbmlsKQorYXNzZXJ0KGYodG9udW1iZXIoJzFcMCcpKSA9PSBuaWwpCithc3NlcnQoZih0b251bWJlcignMSBcMCcpKSA9PSBuaWwpCithc3NlcnQoZih0b251bWJlcignMVwwICcpKSA9PSBuaWwpCithc3NlcnQoZih0b251bWJlcignZTEnKSkgPT0gbmlsKQorYXNzZXJ0KGYodG9udW1iZXIoJ2UgIDEnKSkgPT0gbmlsKQorYXNzZXJ0KGYodG9udW1iZXIoJyAzLjQuNSAnKSkgPT0gbmlsKQorCisKKy0tIHRlc3RpbmcgJ3RvbnVtYmVyJyBmb3IgaW52YWxpZCBoZXhhZGVjaW1hbCBmb3JtYXRzCisKK2Fzc2VydCh0b251bWJlcignMHgnKSA9PSBuaWwpCithc3NlcnQodG9udW1iZXIoJ3gnKSA9PSBuaWwpCithc3NlcnQodG9udW1iZXIoJ3gzJykgPT0gbmlsKQorYXNzZXJ0KHRvbnVtYmVyKCcweDMuMy4zJykgPT0gbmlsKSAgIC0tIHR3byBkZWNpbWFsIHBvaW50cworYXNzZXJ0KHRvbnVtYmVyKCcwMHgyJykgPT0gbmlsKQorYXNzZXJ0KHRvbnVtYmVyKCcweCAyJykgPT0gbmlsKQorYXNzZXJ0KHRvbnVtYmVyKCcwIHgyJykgPT0gbmlsKQorYXNzZXJ0KHRvbnVtYmVyKCcyM3gnKSA9PSBuaWwpCithc3NlcnQodG9udW1iZXIoJy0gMHhhYScpID09IG5pbCkKK2Fzc2VydCh0b251bWJlcignLTB4YWFQICcpID09IG5pbCkgICAtLSBubyBleHBvbmVudAorYXNzZXJ0KHRvbnVtYmVyKCcweDAuNTFwJykgPT0gbmlsKQorYXNzZXJ0KHRvbnVtYmVyKCcweDVwKy0yJykgPT0gbmlsKQorCisKKy0tIHRlc3RpbmcgaGV4YWRlY2ltYWwgbnVtZXJhbHMKKworYXNzZXJ0KDB4MTAgPT0gMTYgYW5kIDB4ZmZmID09IDJeMTIgLSAxIGFuZCAwWEZCID09IDI1MSkKK2Fzc2VydCgweDBwMTIgPT0gMCBhbmQgMHguMHAtMyA9PSAwKQorYXNzZXJ0KDB4RkZGRkZGRkYgPT0gKDEgPDwgMzIpIC0gMSkKK2Fzc2VydCh0b251bWJlcignKzB4MicpID09IDIpCithc3NlcnQodG9udW1iZXIoJy0weGFBJykgPT0gLTE3MCkKK2Fzc2VydCh0b251bWJlcignLTB4ZmZGRkZmZmYnKSA9PSAtKDEgPDwgMzIpICsgMSkKKworLS0gcG9zc2libGUgY29uZnVzaW9uIHdpdGggZGVjaW1hbCBleHBvbmVudAorYXNzZXJ0KDBFKzEgPT0gMCBhbmQgMHhFKzEgPT0gMTUgYW5kIDB4ZS0xID09IDEzKQorCisKKy0tIGZsb2F0aW5nIGhleGFzCisKK2Fzc2VydCh0b251bWJlcignICAweDIuNSAgJykgPT0gMHgyNS8xNikKK2Fzc2VydCh0b251bWJlcignICAtMHgyLjUgICcpID09IC0weDI1LzE2KQorYXNzZXJ0KHRvbnVtYmVyKCcgICsweDAuNTFwKzggICcpID09IDB4NTEpCithc3NlcnQoMHguRmZmZkZGRkYgPT0gMSAtICcweC4wMDAwMDAwMScpCithc3NlcnQoJzB4QS5hJyArIDAgPT0gMTAgKyAxMC8xNikKK2Fzc2VydCgweGEuYVA0ID09IDBYQUEpCithc3NlcnQoMHg0UC0yID09IDEpCithc3NlcnQoMHgxLjEgPT0gJzB4MS4nICsgJysweC4xJykKK2Fzc2VydCgwWGFiY2RlZi4wID09IDB4LkFCQ0RFRnArMjQpCisKKworYXNzZXJ0KDEuMSA9PSAxLisuMSkKK2Fzc2VydCgxMDAuMCA9PSAxRTIgYW5kIC4wMSA9PSAxZS0yKQorYXNzZXJ0KDExMTExMTExMTEgLSAxMTExMTExMTEwID09IDEwMDAuMDBlLTAzKQorYXNzZXJ0KDEuMSA9PSAnMS4nKycuMScpCithc3NlcnQodG9udW1iZXInMTExMTExMTExMScgLSB0b251bWJlcicxMTExMTExMTEwJyA9PQorICAgICAgIHRvbnVtYmVyIiAgKzAuMDAxZSszIFxuXHQiKQorCithc3NlcnQoMC4xZS0zMCA+IDAuOUUtMzEgYW5kIDAuOUUzMCA8IDAuMWUzMSkKKworYXNzZXJ0KDAuMTIzNDU2ID4gMC4xMjM0NTUpCisKK2Fzc2VydCh0b251bWJlcignKzEuMjNFMTgnKSA9PSAxLjIzKjEwLjBeMTgpCisKKy0tIHRlc3Rpbmcgb3JkZXIgb3BlcmF0b3JzCithc3NlcnQobm90KDE8MSkgYW5kICgxPDIpIGFuZCBub3QoMjwxKSkKK2Fzc2VydChub3QoJ2EnPCdhJykgYW5kICgnYSc8J2InKSBhbmQgbm90KCdiJzwnYScpKQorYXNzZXJ0KCgxPD0xKSBhbmQgKDE8PTIpIGFuZCBub3QoMjw9MSkpCithc3NlcnQoKCdhJzw9J2EnKSBhbmQgKCdhJzw9J2InKSBhbmQgbm90KCdiJzw9J2EnKSkKK2Fzc2VydChub3QoMT4xKSBhbmQgbm90KDE+MikgYW5kICgyPjEpKQorYXNzZXJ0KG5vdCgnYSc+J2EnKSBhbmQgbm90KCdhJz4nYicpIGFuZCAoJ2InPidhJykpCithc3NlcnQoKDE+PTEpIGFuZCBub3QoMT49MikgYW5kICgyPj0xKSkKK2Fzc2VydCgoJ2EnPj0nYScpIGFuZCBub3QoJ2EnPj0nYicpIGFuZCAoJ2InPj0nYScpKQorYXNzZXJ0KDEuMyA8IDEuNCBhbmQgMS4zIDw9IDEuNCBhbmQgbm90ICgxLjMgPCAxLjMpIGFuZCAxLjMgPD0gMS4zKQorCistLSB0ZXN0aW5nIG1vZCBvcGVyYXRvcgorYXNzZXJ0KGVxVCgtNCAlIDMsIDIpKQorYXNzZXJ0KGVxVCg0ICUgLTMsIC0yKSkKK2Fzc2VydChlcVQoLTQuMCAlIDMsIDIuMCkpCithc3NlcnQoZXFUKDQgJSAtMy4wLCAtMi4wKSkKK2Fzc2VydChtYXRoLnBpIC0gbWF0aC5waSAlIDEgPT0gMykKK2Fzc2VydChtYXRoLnBpIC0gbWF0aC5waSAlIDAuMDAxID09IDMuMTQxKQorCithc3NlcnQoZXFUKG1pbmludCAlIG1pbmludCwgMCkpCithc3NlcnQoZXFUKG1heGludCAlIG1heGludCwgMCkpCithc3NlcnQoKG1pbmludCArIDEpICUgbWluaW50ID09IG1pbmludCArIDEpCithc3NlcnQoKG1heGludCAtIDEpICUgbWF4aW50ID09IG1heGludCAtIDEpCithc3NlcnQobWluaW50ICUgbWF4aW50ID09IG1heGludCAtIDEpCisKK2Fzc2VydChtaW5pbnQgJSAtMSA9PSAwKQorYXNzZXJ0KG1pbmludCAlIC0yID09IDApCithc3NlcnQobWF4aW50ICUgLTIgPT0gLTEpCisKKy0tIG5vbi1wb3J0YWJsZSB0ZXN0cyBiZWNhdXNlIFdpbmRvd3MgQyBsaWJyYXJ5IGNhbm5vdCBjb21wdXRlIAorLS0gZm1vZCgxLCBodWdlKSBjb3JyZWN0bHkKK2lmIG5vdCBfcG9ydCB0aGVuCisgIGxvY2FsIGZ1bmN0aW9uIGFuYW4gKHgpIGFzc2VydChpc05hTih4KSkgZW5kICAgLS0gYXNzZXJ0IE5vdCBhIE51bWJlcgorICBhbmFuKDAuMCAlIDApCisgIGFuYW4oMS4zICUgMCkKKyAgYW5hbihtYXRoLmh1Z2UgJSAxKQorICBhbmFuKG1hdGguaHVnZSAlIDFlMzApCisgIGFuYW4oLW1hdGguaHVnZSAlIDFlMzApCisgIGFuYW4oLW1hdGguaHVnZSAlIC0xZTMwKQorICBhc3NlcnQoMSAlIG1hdGguaHVnZSA9PSAxKQorICBhc3NlcnQoMWUzMCAlIG1hdGguaHVnZSA9PSAxZTMwKQorICBhc3NlcnQoMWUzMCAlIC1tYXRoLmh1Z2UgPT0gLW1hdGguaHVnZSkKKyAgYXNzZXJ0KC0xICUgbWF0aC5odWdlID09IG1hdGguaHVnZSkKKyAgYXNzZXJ0KC0xICUgLW1hdGguaHVnZSA9PSAtMSkKK2VuZAorCisKKy0tIHRlc3RpbmcgdW5zaWduZWQgY29tcGFyaXNvbnMKK2Fzc2VydChtYXRoLnVsdCgzLCA0KSkKK2Fzc2VydChub3QgbWF0aC51bHQoNCwgNCkpCithc3NlcnQobWF0aC51bHQoLTIsIC0xKSkKK2Fzc2VydChtYXRoLnVsdCgyLCAtMSkpCithc3NlcnQobm90IG1hdGgudWx0KC0yLCAtMikpCithc3NlcnQobWF0aC51bHQobWF4aW50LCBtaW5pbnQpKQorYXNzZXJ0KG5vdCBtYXRoLnVsdChtaW5pbnQsIG1heGludCkpCisKKworYXNzZXJ0KGVxKG1hdGguc2luKC05LjgpXjIgKyBtYXRoLmNvcygtOS44KV4yLCAxKSkKK2Fzc2VydChlcShtYXRoLnRhbihtYXRoLnBpLzQpLCAxKSkKK2Fzc2VydChlcShtYXRoLnNpbihtYXRoLnBpLzIpLCAxKSBhbmQgZXEobWF0aC5jb3MobWF0aC5waS8yKSwgMCkpCithc3NlcnQoZXEobWF0aC5hdGFuKDEpLCBtYXRoLnBpLzQpIGFuZCBlcShtYXRoLmFjb3MoMCksIG1hdGgucGkvMikgYW5kCisgICAgICAgZXEobWF0aC5hc2luKDEpLCBtYXRoLnBpLzIpKQorYXNzZXJ0KGVxKG1hdGguZGVnKG1hdGgucGkvMiksIDkwKSBhbmQgZXEobWF0aC5yYWQoOTApLCBtYXRoLnBpLzIpKQorYXNzZXJ0KG1hdGguYWJzKC0xMC40MykgPT0gMTAuNDMpCithc3NlcnQoZXFUKG1hdGguYWJzKG1pbmludCksIG1pbmludCkpCithc3NlcnQoZXFUKG1hdGguYWJzKG1heGludCksIG1heGludCkpCithc3NlcnQoZXFUKG1hdGguYWJzKC1tYXhpbnQpLCBtYXhpbnQpKQorYXNzZXJ0KGVxKG1hdGguYXRhbigxLDApLCBtYXRoLnBpLzIpKQorYXNzZXJ0KG1hdGguZm1vZCgxMCwzKSA9PSAxKQorYXNzZXJ0KGVxKG1hdGguc3FydCgxMCleMiwgMTApKQorYXNzZXJ0KGVxKG1hdGgubG9nKDIsIDEwKSwgbWF0aC5sb2coMikvbWF0aC5sb2coMTApKSkKK2Fzc2VydChlcShtYXRoLmxvZygyLCAyKSwgMSkpCithc3NlcnQoZXEobWF0aC5sb2coOSwgMyksIDIpKQorYXNzZXJ0KGVxKG1hdGguZXhwKDApLCAxKSkKK2Fzc2VydChlcShtYXRoLnNpbigxMCksIG1hdGguc2luKDEwJSgyKm1hdGgucGkpKSkpCisKKworYXNzZXJ0KHRvbnVtYmVyKCcgMS4zZS0yICcpID09IDEuM2UtMikKK2Fzc2VydCh0b251bWJlcignIC0xLjAwMDAwMDAwMDAwMDAxICcpID09IC0xLjAwMDAwMDAwMDAwMDAxKQorCistLSB0ZXN0aW5nIGNvbnN0YW50IGxpbWl0cworLS0gMl4yMyA9IDgzODg2MDgKK2Fzc2VydCg4Mzg4NjA5ICsgLTgzODg2MDkgPT0gMCkKK2Fzc2VydCg4Mzg4NjA4ICsgLTgzODg2MDggPT0gMCkKK2Fzc2VydCg4Mzg4NjA3ICsgLTgzODg2MDcgPT0gMCkKKworCisKK2RvICAgLS0gdGVzdGluZyBmbG9vciAmIGNlaWwKKyAgYXNzZXJ0KGVxVChtYXRoLmZsb29yKDMuNCksIDMpKQorICBhc3NlcnQoZXFUKG1hdGguY2VpbCgzLjQpLCA0KSkKKyAgYXNzZXJ0KGVxVChtYXRoLmZsb29yKC0zLjQpLCAtNCkpCisgIGFzc2VydChlcVQobWF0aC5jZWlsKC0zLjQpLCAtMykpCisgIGFzc2VydChlcVQobWF0aC5mbG9vcihtYXhpbnQpLCBtYXhpbnQpKQorICBhc3NlcnQoZXFUKG1hdGguY2VpbChtYXhpbnQpLCBtYXhpbnQpKQorICBhc3NlcnQoZXFUKG1hdGguZmxvb3IobWluaW50KSwgbWluaW50KSkKKyAgYXNzZXJ0KGVxVChtYXRoLmZsb29yKG1pbmludCArIDAuMCksIG1pbmludCkpCisgIGFzc2VydChlcVQobWF0aC5jZWlsKG1pbmludCksIG1pbmludCkpCisgIGFzc2VydChlcVQobWF0aC5jZWlsKG1pbmludCArIDAuMCksIG1pbmludCkpCisgIGFzc2VydChtYXRoLmZsb29yKDFlNTApID09IDFlNTApCisgIGFzc2VydChtYXRoLmNlaWwoMWU1MCkgPT0gMWU1MCkKKyAgYXNzZXJ0KG1hdGguZmxvb3IoLTFlNTApID09IC0xZTUwKQorICBhc3NlcnQobWF0aC5jZWlsKC0xZTUwKSA9PSAtMWU1MCkKKyAgZm9yIF8sIHAgaW4gcGFpcnN7MzEsMzIsNjMsNjR9IGRvCisgICAgYXNzZXJ0KG1hdGguZmxvb3IoMl5wKSA9PSAyXnApCisgICAgYXNzZXJ0KG1hdGguZmxvb3IoMl5wICsgMC41KSA9PSAyXnApCisgICAgYXNzZXJ0KG1hdGguY2VpbCgyXnApID09IDJecCkKKyAgICBhc3NlcnQobWF0aC5jZWlsKDJecCAtIDAuNSkgPT0gMl5wKQorICBlbmQKKyAgY2hlY2tlcnJvcigibnVtYmVyIGV4cGVjdGVkIiwgbWF0aC5mbG9vciwge30pCisgIGNoZWNrZXJyb3IoIm51bWJlciBleHBlY3RlZCIsIG1hdGguY2VpbCwgcHJpbnQpCisgIGFzc2VydChlcVQobWF0aC50b2ludGVnZXIobWluaW50KSwgbWluaW50KSkKKyAgYXNzZXJ0KGVxVChtYXRoLnRvaW50ZWdlcihtaW5pbnQgLi4gIiIpLCBtaW5pbnQpKQorICBhc3NlcnQoZXFUKG1hdGgudG9pbnRlZ2VyKG1heGludCksIG1heGludCkpCisgIGFzc2VydChlcVQobWF0aC50b2ludGVnZXIobWF4aW50IC4uICIiKSwgbWF4aW50KSkKKyAgYXNzZXJ0KGVxVChtYXRoLnRvaW50ZWdlcihtaW5pbnQgKyAwLjApLCBtaW5pbnQpKQorICBhc3NlcnQobWF0aC50b2ludGVnZXIoMC4wIC0gbWluaW50KSA9PSBuaWwpCisgIGFzc2VydChtYXRoLnRvaW50ZWdlcihtYXRoLnBpKSA9PSBuaWwpCisgIGFzc2VydChtYXRoLnRvaW50ZWdlcigtbWF0aC5waSkgPT0gbmlsKQorICBhc3NlcnQobWF0aC5mbG9vcihtYXRoLmh1Z2UpID09IG1hdGguaHVnZSkKKyAgYXNzZXJ0KG1hdGguY2VpbChtYXRoLmh1Z2UpID09IG1hdGguaHVnZSkKKyAgYXNzZXJ0KG1hdGgudG9pbnRlZ2VyKG1hdGguaHVnZSkgPT0gbmlsKQorICBhc3NlcnQobWF0aC5mbG9vcigtbWF0aC5odWdlKSA9PSAtbWF0aC5odWdlKQorICBhc3NlcnQobWF0aC5jZWlsKC1tYXRoLmh1Z2UpID09IC1tYXRoLmh1Z2UpCisgIGFzc2VydChtYXRoLnRvaW50ZWdlcigtbWF0aC5odWdlKSA9PSBuaWwpCisgIGFzc2VydChtYXRoLnRvaW50ZWdlcigiMzQuMCIpID09IDM0KQorICBhc3NlcnQobWF0aC50b2ludGVnZXIoIjM0LjMiKSA9PSBuaWwpCisgIGFzc2VydChtYXRoLnRvaW50ZWdlcih7fSkgPT0gbmlsKQorICBhc3NlcnQobWF0aC50b2ludGVnZXIoMC8wKSA9PSBuaWwpICAgIC0tIE5hTgorZW5kCisKKworLS0gdGVzdGluZyBmbW9kIGZvciBpbnRlZ2VycworZm9yIGkgPSAtNiwgNiBkbworICBmb3IgaiA9IC02LCA2IGRvCisgICAgaWYgaiB+PSAwIHRoZW4KKyAgICAgIGxvY2FsIG1pID0gbWF0aC5mbW9kKGksIGopCisgICAgICBsb2NhbCBtZiA9IG1hdGguZm1vZChpICsgMC4wLCBqKQorICAgICAgYXNzZXJ0KG1pID09IG1mKQorICAgICAgYXNzZXJ0KG1hdGgudHlwZShtaSkgPT0gJ2ludGVnZXInIGFuZCBtYXRoLnR5cGUobWYpID09ICdmbG9hdCcpCisgICAgICBpZiAoaSA+PSAwIGFuZCBqID49IDApIG9yIChpIDw9IDAgYW5kIGogPD0gMCkgb3IgbWkgPT0gMCB0aGVuCisgICAgICAgIGFzc2VydChlcVQobWksIGkgJSBqKSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZAorYXNzZXJ0KGVxVChtYXRoLmZtb2QobWluaW50LCBtaW5pbnQpLCAwKSkKK2Fzc2VydChlcVQobWF0aC5mbW9kKG1heGludCwgbWF4aW50KSwgMCkpCithc3NlcnQoZXFUKG1hdGguZm1vZChtaW5pbnQgKyAxLCBtaW5pbnQpLCBtaW5pbnQgKyAxKSkKK2Fzc2VydChlcVQobWF0aC5mbW9kKG1heGludCAtIDEsIG1heGludCksIG1heGludCAtIDEpKQorCitjaGVja2Vycm9yKCJ6ZXJvIiwgbWF0aC5mbW9kLCAzLCAwKQorCisKK2RvICAgIC0tIHRlc3RpbmcgbWF4L21pbgorICBjaGVja2Vycm9yKCJ2YWx1ZSBleHBlY3RlZCIsIG1hdGgubWF4KQorICBjaGVja2Vycm9yKCJ2YWx1ZSBleHBlY3RlZCIsIG1hdGgubWluKQorICBhc3NlcnQoZXFUKG1hdGgubWF4KDMpLCAzKSkKKyAgYXNzZXJ0KGVxVChtYXRoLm1heCgzLCA1LCA5LCAxKSwgOSkpCisgIGFzc2VydChtYXRoLm1heChtYXhpbnQsIDEwZTYwKSA9PSAxMGU2MCkKKyAgYXNzZXJ0KGVxVChtYXRoLm1heChtaW5pbnQsIG1pbmludCArIDEpLCBtaW5pbnQgKyAxKSkKKyAgYXNzZXJ0KGVxVChtYXRoLm1pbigzKSwgMykpCisgIGFzc2VydChlcVQobWF0aC5taW4oMywgNSwgOSwgMSksIDEpKQorICBhc3NlcnQobWF0aC5taW4oMy4yLCA1LjksIC05LjIsIDEuMSkgPT0gLTkuMikKKyAgYXNzZXJ0KG1hdGgubWluKDEuOSwgMS43LCAxLjcyKSA9PSAxLjcpCisgIGFzc2VydChtYXRoLm1pbigtMTBlNjAsIG1pbmludCkgPT0gLTEwZTYwKQorICBhc3NlcnQoZXFUKG1hdGgubWluKG1heGludCwgbWF4aW50IC0gMSksIG1heGludCAtIDEpKQorICBhc3NlcnQoZXFUKG1hdGgubWluKG1heGludCAtIDIsIG1heGludCwgbWF4aW50IC0gMSksIG1heGludCAtIDIpKQorZW5kCistLSB0ZXN0aW5nIGltcGxpY2l0IGNvbnZlcnRpb25zCisKK2xvY2FsIGEsYiA9ICcxMCcsICcyMCcKK2Fzc2VydChhKmIgPT0gMjAwIGFuZCBhK2IgPT0gMzAgYW5kIGEtYiA9PSAtMTAgYW5kIGEvYiA9PSAwLjUgYW5kIC1iID09IC0yMCkKK2Fzc2VydChhID09ICcxMCcgYW5kIGIgPT0gJzIwJykKKworCitkbworICBwcmludCgidGVzdGluZyAtMCBhbmQgTmFOIikKKyAgbG9jYWwgbXosIHogPSAtMC4wLCAwLjAKKyAgYXNzZXJ0KG16ID09IHopCisgIGFzc2VydCgxL216IDwgMCBhbmQgMCA8IDEveikKKyAgbG9jYWwgYSA9IHtbbXpdID0gMX0KKyAgYXNzZXJ0KGFbel0gPT0gMSBhbmQgYVttel0gPT0gMSkKKyAgYVt6XSA9IDIKKyAgYXNzZXJ0KGFbel0gPT0gMiBhbmQgYVttel0gPT0gMikKKyAgbG9jYWwgaW5mID0gbWF0aC5odWdlICogMiArIDEKKyAgbXosIHogPSAtMS9pbmYsIDEvaW5mCisgIGFzc2VydChteiA9PSB6KQorICBhc3NlcnQoMS9teiA8IDAgYW5kIDAgPCAxL3opCisgIGxvY2FsIE5hTiA9IGluZiAtIGluZgorICBhc3NlcnQoTmFOIH49IE5hTikKKyAgYXNzZXJ0KG5vdCAoTmFOIDwgTmFOKSkKKyAgYXNzZXJ0KG5vdCAoTmFOIDw9IE5hTikpCisgIGFzc2VydChub3QgKE5hTiA+IE5hTikpCisgIGFzc2VydChub3QgKE5hTiA+PSBOYU4pKQorICBhc3NlcnQobm90ICgwIDwgTmFOKSBhbmQgbm90IChOYU4gPCAwKSkKKyAgbG9jYWwgTmFOMSA9IDAvMAorICBhc3NlcnQoTmFOIH49IE5hTjEgYW5kIG5vdCAoTmFOIDw9IE5hTjEpIGFuZCBub3QgKE5hTjEgPD0gTmFOKSkKKyAgbG9jYWwgYSA9IHt9CisgIGFzc2VydChub3QgcGNhbGwocmF3c2V0LCBhLCBOYU4sIDEpKQorICBhc3NlcnQoYVtOYU5dID09IHVuZGVmKQorICBhWzFdID0gMQorICBhc3NlcnQobm90IHBjYWxsKHJhd3NldCwgYSwgTmFOLCAxKSkKKyAgYXNzZXJ0KGFbTmFOXSA9PSB1bmRlZikKKyAgLS0gc3RyaW5ncyB3aXRoIHNhbWUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIGFzIDAuMCAobWlnaHQgY3JlYXRlIHByb2JsZW1zCisgIC0tIGZvciBjb25zdGFudCBtYW5pcHVsYXRpb24gaW4gdGhlIHByZS1jb21waWxlcikKKyAgbG9jYWwgYTEsIGEyLCBhMywgYTQsIGE1ID0gMCwgMCwgIlwwXDBcMFwwXDBcMFwwXDAiLCAwLCAiXDBcMFwwXDBcMFwwXDBcMCIKKyAgYXNzZXJ0KGExID09IGEyIGFuZCBhMiA9PSBhNCBhbmQgYTEgfj0gYTMpCisgIGFzc2VydChhMyA9PSBhNSkKK2VuZAorCisKK3ByaW50KCJ0ZXN0aW5nICdtYXRoLnJhbmRvbSciKQorCitsb2NhbCByYW5kb20sIG1heCwgbWluID0gbWF0aC5yYW5kb20sIG1hdGgubWF4LCBtYXRoLm1pbgorCitsb2NhbCBmdW5jdGlvbiB0ZXN0bmVhciAodmFsLCByZWYsIHRvbCkKKyAgcmV0dXJuIChtYXRoLmFicyh2YWwgLSByZWYpIDwgcmVmICogdG9sKQorZW5kCisKKworLS0gbG93LWxldmVsISEgRm9yIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHJhbmRvbSBpbiBMdWEsCistLSB0aGUgZmlyc3QgY2FsbCBhZnRlciBzZWVkIDEwMDcgc2hvdWxkIHJldHVybiAweDdhNzA0MGE1YTMyM2M5ZDYKK2RvCisgIC0tIGFsbCBjb21wdXRhdGlvbnMgYXNzdW1lIGF0IG1vc3QgMzItYml0IGludGVnZXJzCisgIGxvY2FsIGggPSAweDdhNzA0MGE1ICAgLS0gaGlnaGVyIGhhbGYKKyAgbG9jYWwgbCA9IDB4YTMyM2M5ZDYgICAtLSBsb3dlciBoYWxmCisKKyAgbWF0aC5yYW5kb21zZWVkKDEwMDcpCisgIC0tIGdldCB0aGUgbG93ICdpbnRiaXRzJyBvZiB0aGUgNjQtYml0IGV4cGVjdGVkIHJlc3VsdAorICBsb2NhbCByZXMgPSAoaCA8PCAzMiB8IGwpICYgfih+MCA8PCBpbnRiaXRzKQorICBhc3NlcnQocmFuZG9tKDApID09IHJlcykKKworICBtYXRoLnJhbmRvbXNlZWQoMTAwNywgMCkKKyAgLS0gdXNpbmcgbG93ZXIgYml0cyB0byBnZW5lcmF0ZSByYW5kb20gZmxvYXRzOyAodGhlICclIDJeMzInIGNvbnZlcnRzCisgIC0tIDMyLWJpdCBpbnRlZ2VycyB0byBmbG9hdHMgYXMgdW5zaWduZWQpCisgIGxvY2FsIHJlcworICBpZiBmbG9hdGJpdHMgPD0gMzIgdGhlbgorICAgIC0tIGdldCBhbGwgYml0cyBmcm9tIHRoZSBsb3dlciBoYWxmCisgICAgcmVzID0gKGwgJiB+KH4wIDw8IGZsb2F0Yml0cykpICUgMl4zMgorICBlbHNlCisgICAgLS0gZ2V0IDMyIGJpdHMgZnJvbSB0aGUgbG93ZXIgaGFsZiBhbmQgdGhlIHJlc3QgZnJvbSB0aGUgaGlnaGVyIGhhbGYKKyAgICByZXMgPSAoKGggJiB+KH4wIDw8IChmbG9hdGJpdHMgLSAzMikpKSAlIDJeMzIpICogMl4zMiArIChsICUgMl4zMikKKyAgZW5kCisgIGFzc2VydChyYW5kb20oKSAqIDJeZmxvYXRiaXRzID09IHJlcykKK2VuZAorCittYXRoLnJhbmRvbXNlZWQoMCwgb3MudGltZSgpKQorCitkbyAgIC0tIHRlc3QgcmFuZG9tIGZvciBmbG9hdHMKKyAgbG9jYWwgcmFuZGJpdHMgPSBtYXRoLm1pbihmbG9hdGJpdHMsIDY0KSAgIC0tIGF0IG1vc3QgNjQgcmFuZG9tIGJpdHMKKyAgbG9jYWwgbXVsdCA9IDJecmFuZGJpdHMgICAgICAtLSB0byBtYWtlIHJhbmRvbSBmbG9hdCBpbnRvIGFuIGludGVncmFsCisgIGxvY2FsIGNvdW50cyA9IHt9ICAgIC0tIGNvdW50cyBmb3IgYml0cworICBmb3IgaSA9IDEsIHJhbmRiaXRzIGRvIGNvdW50c1tpXSA9IDAgZW5kCisgIGxvY2FsIHVwID0gLW1hdGguaHVnZQorICBsb2NhbCBsb3cgPSBtYXRoLmh1Z2UKKyAgbG9jYWwgcm91bmRzID0gMTAwICogcmFuZGJpdHMgICAtLSAxMDAgdGltZXMgZm9yIGVhY2ggYml0CisgIGxvY2FsIHRvdGFscm91bmRzID0gMAorICA6OmRvYWdhaW46OiAgIC0tIHdpbGwgcmVwZWF0IHRlc3QgdW50aWwgd2UgZ2V0IGdvb2Qgc3RhdGlzdGljcworICBmb3IgaSA9IDAsIHJvdW5kcyBkbworICAgIGxvY2FsIHQgPSByYW5kb20oKQorICAgIGFzc2VydCgwIDw9IHQgYW5kIHQgPCAxKQorICAgIHVwID0gbWF4KHVwLCB0KQorICAgIGxvdyA9IG1pbihsb3csIHQpCisgICAgYXNzZXJ0KHQgKiBtdWx0ICUgMSA9PSAwKSAgICAtLSBubyBleHRyYSBiaXRzCisgICAgbG9jYWwgYml0ID0gaSAlIHJhbmRiaXRzICAgICAtLSBiaXQgdG8gYmUgdGVzdGVkCisgICAgaWYgKHQgKiAyXmJpdCkgJSAxID49IDAuNSB0aGVuICAgIC0tIGlzIGJpdCBzZXQ/CisgICAgICBjb3VudHNbYml0ICsgMV0gPSBjb3VudHNbYml0ICsgMV0gKyAxICAgLS0gaW5jcmVtZW50IGl0cyBjb3VudAorICAgIGVuZAorICBlbmQKKyAgdG90YWxyb3VuZHMgPSB0b3RhbHJvdW5kcyArIHJvdW5kcworICBpZiBub3QgKGVxKHVwLCAxLCAwLjAwMSkgYW5kIGVxKGxvdywgMCwgMC4wMDEpKSB0aGVuCisgICAgZ290byBkb2FnYWluCisgIGVuZAorICAtLSBhbGwgYml0IGNvdW50cyBzaG91bGQgYmUgbmVhciA1MCUKKyAgbG9jYWwgZXhwZWN0ZWQgPSAodG90YWxyb3VuZHMgLyByYW5kYml0cyAvIDIpCisgIGZvciBpID0gMSwgcmFuZGJpdHMgZG8KKyAgICBpZiBub3QgdGVzdG5lYXIoY291bnRzW2ldLCBleHBlY3RlZCwgMC4xMCkgdGhlbgorICAgICAgZ290byBkb2FnYWluCisgICAgZW5kCisgIGVuZAorICBwcmludChzdHJpbmcuZm9ybWF0KCJmbG9hdCByYW5kb20gcmFuZ2UgaW4gJWQgY2FsbHM6IFslZiwgJWZdIiwKKyAgICAgICAgICAgICAgICAgICAgICB0b3RhbHJvdW5kcywgbG93LCB1cCkpCitlbmQKKworCitkbyAgIC0tIHRlc3QgcmFuZG9tIGZvciBmdWxsIGludGVnZXJzCisgIGxvY2FsIHVwID0gMAorICBsb2NhbCBsb3cgPSAwCisgIGxvY2FsIGNvdW50cyA9IHt9ICAgIC0tIGNvdW50cyBmb3IgYml0cworICBmb3IgaSA9IDEsIGludGJpdHMgZG8gY291bnRzW2ldID0gMCBlbmQKKyAgbG9jYWwgcm91bmRzID0gMTAwICogaW50Yml0cyAgIC0tIDEwMCB0aW1lcyBmb3IgZWFjaCBiaXQKKyAgbG9jYWwgdG90YWxyb3VuZHMgPSAwCisgIDo6ZG9hZ2Fpbjo6ICAgLS0gd2lsbCByZXBlYXQgdGVzdCB1bnRpbCB3ZSBnZXQgZ29vZCBzdGF0aXN0aWNzCisgIGZvciBpID0gMCwgcm91bmRzIGRvCisgICAgbG9jYWwgdCA9IHJhbmRvbSgwKQorICAgIHVwID0gbWF4KHVwLCB0KQorICAgIGxvdyA9IG1pbihsb3csIHQpCisgICAgbG9jYWwgYml0ID0gaSAlIGludGJpdHMgICAgIC0tIGJpdCB0byBiZSB0ZXN0ZWQKKyAgICAtLSBpbmNyZW1lbnQgaXRzIGNvdW50IGlmIGl0IGlzIHNldAorICAgIGNvdW50c1tiaXQgKyAxXSA9IGNvdW50c1tiaXQgKyAxXSArICgodCA+PiBiaXQpICYgMSkKKyAgZW5kCisgIHRvdGFscm91bmRzID0gdG90YWxyb3VuZHMgKyByb3VuZHMKKyAgbG9jYWwgbGltID0gbWF4aW50ID4+IDEwCisgIGlmIG5vdCAobWF4aW50IC0gdXAgPCBsaW0gYW5kIGxvdyAtIG1pbmludCA8IGxpbSkgdGhlbgorICAgIGdvdG8gZG9hZ2FpbgorICBlbmQKKyAgLS0gYWxsIGJpdCBjb3VudHMgc2hvdWxkIGJlIG5lYXIgNTAlCisgIGxvY2FsIGV4cGVjdGVkID0gKHRvdGFscm91bmRzIC8gaW50Yml0cyAvIDIpCisgIGZvciBpID0gMSwgaW50Yml0cyBkbworICAgIGlmIG5vdCB0ZXN0bmVhcihjb3VudHNbaV0sIGV4cGVjdGVkLCAwLjEwKSB0aGVuCisgICAgICBnb3RvIGRvYWdhaW4KKyAgICBlbmQKKyAgZW5kCisgIHByaW50KHN0cmluZy5mb3JtYXQoCisgICAgICJpbnRlZ2VyIHJhbmRvbSByYW5nZSBpbiAlZCBjYWxsczogW21pbmludCArICUuMGZwcG0sIG1heGludCAtICUuMGZwcG1dIiwKKyAgICAgIHRvdGFscm91bmRzLCAobWluaW50IC0gbG93KSAvIG1pbmludCAqIDFlNiwKKyAgICAgICAgICAgICAgICAgICAobWF4aW50IC0gdXApIC8gbWF4aW50ICogMWU2KSkKK2VuZAorCitkbworICAtLSB0ZXN0IGRpc3RyaWJ1dGlvbiBmb3IgYSBkaWNlCisgIGxvY2FsIGNvdW50ID0gezAsIDAsIDAsIDAsIDAsIDB9CisgIGxvY2FsIHJlcCA9IDIwMAorICBsb2NhbCB0b3RhbHJlcCA9IDAKKyAgOjpkb2FnYWluOjoKKyAgZm9yIGkgPSAxLCByZXAgKiA2IGRvCisgICAgbG9jYWwgciA9IHJhbmRvbSg2KQorICAgIGNvdW50W3JdID0gY291bnRbcl0gKyAxCisgIGVuZAorICB0b3RhbHJlcCA9IHRvdGFscmVwICsgcmVwCisgIGZvciBpID0gMSwgNiBkbworICAgIGlmIG5vdCB0ZXN0bmVhcihjb3VudFtpXSwgdG90YWxyZXAsIDAuMDUpIHRoZW4KKyAgICAgIGdvdG8gZG9hZ2FpbgorICAgIGVuZAorICBlbmQKK2VuZAorCitkbworICBsb2NhbCBmdW5jdGlvbiBhdXggKHgxLCB4MikgICAgIC0tIHRlc3QgcmFuZG9tIGZvciBzbWFsbCBpbnRlcnZhbHMKKyAgICBsb2NhbCBtYXJrID0ge307IGxvY2FsIGNvdW50ID0gMCAgIC0tIHRvIGNoZWNrIHRoYXQgYWxsIHZhbHVlcyBhcHBlYXJlZAorICAgIHdoaWxlIHRydWUgZG8KKyAgICAgIGxvY2FsIHQgPSByYW5kb20oeDEsIHgyKQorICAgICAgYXNzZXJ0KHgxIDw9IHQgYW5kIHQgPD0geDIpCisgICAgICBpZiBub3QgbWFya1t0XSB0aGVuICAtLSBuZXcgdmFsdWUKKyAgICAgICAgbWFya1t0XSA9IHRydWUKKyAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgaWYgY291bnQgPT0geDIgLSB4MSArIDEgdGhlbiAgIC0tIGFsbCB2YWx1ZXMgYXBwZWFyZWQ7IE9LCisgICAgICAgICAgZ290byBvaworICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICAgOjpvazo6CisgIGVuZAorCisgIGF1eCgtMTAsMCkKKyAgYXV4KDEsIDYpCisgIGF1eCgxLCAyKQorICBhdXgoMSwgMzIpCisgIGF1eCgtMTAsIDEwKQorICBhdXgoLTEwLC0xMCkgICAtLSB1bml0IHNldAorICBhdXgobWluaW50LCBtaW5pbnQpICAgLS0gdW5pdCBzZXQKKyAgYXV4KG1heGludCwgbWF4aW50KSAgIC0tIHVuaXQgc2V0CisgIGF1eChtaW5pbnQsIG1pbmludCArIDkpCisgIGF1eChtYXhpbnQgLSAzLCBtYXhpbnQpCitlbmQKKworZG8KKyAgbG9jYWwgZnVuY3Rpb24gYXV4KHAxLCBwMikgICAgICAgLS0gdGVzdCByYW5kb20gZm9yIGxhcmdlIGludGVydmFscworICAgIGxvY2FsIG1heCA9IG1pbmludAorICAgIGxvY2FsIG1pbiA9IG1heGludAorICAgIGxvY2FsIG4gPSAxMDAKKyAgICBsb2NhbCBtYXJrID0ge307IGxvY2FsIGNvdW50ID0gMCAgIC0tIHRvIGNvdW50IGhvdyBtYW55IGRpZmZlcmVudCB2YWx1ZXMKKyAgICA6OmRvYWdhaW46OgorICAgIGZvciBfID0gMSwgbiBkbworICAgICAgbG9jYWwgdCA9IHJhbmRvbShwMSwgcDIpCisgICAgICBpZiBub3QgbWFya1t0XSB0aGVuICAtLSBuZXcgdmFsdWUKKyAgICAgICAgYXNzZXJ0KHAxIDw9IHQgYW5kIHQgPD0gcDIpCisgICAgICAgIG1heCA9IG1hdGgubWF4KG1heCwgdCkKKyAgICAgICAgbWluID0gbWF0aC5taW4obWluLCB0KQorICAgICAgICBtYXJrW3RdID0gdHJ1ZQorICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgZW5kCisgICAgZW5kCisgICAgLS0gYXQgbGVhc3QgODAlIG9mIHZhbHVlcyBhcmUgZGlmZmVyZW50CisgICAgaWYgbm90IChjb3VudCA+PSBuICogMC44KSB0aGVuCisgICAgICBnb3RvIGRvYWdhaW4KKyAgICBlbmQKKyAgICAtLSBtaW4gYW5kIG1heCBub3QgdG9vIGZhciBmcm9tIGZvcm1hbCBtaW4gYW5kIG1heAorICAgIGxvY2FsIGRpZmYgPSAocDIgLSBwMSkgPj4gNAorICAgIGlmIG5vdCAobWluIDwgcDEgKyBkaWZmIGFuZCBtYXggPiBwMiAtIGRpZmYpIHRoZW4KKyAgICAgIGdvdG8gZG9hZ2FpbgorICAgIGVuZAorICBlbmQKKyAgYXV4KDAsIG1heGludCkKKyAgYXV4KDEsIG1heGludCkKKyAgYXV4KG1pbmludCwgLTEpCisgIGF1eChtaW5pbnQgLy8gMiwgbWF4aW50IC8vIDIpCisgIGF1eChtaW5pbnQsIG1heGludCkKKyAgYXV4KG1pbmludCArIDEsIG1heGludCkKKyAgYXV4KG1pbmludCwgbWF4aW50IC0gMSkKKyAgYXV4KDAsIDEgPDwgKGludGJpdHMgLSA1KSkKK2VuZAorCisKK2Fzc2VydChub3QgcGNhbGwocmFuZG9tLCAxLCAyLCAzKSkgICAgLS0gdG9vIG1hbnkgYXJndW1lbnRzCisKKy0tIGVtcHR5IGludGVydmFsCithc3NlcnQobm90IHBjYWxsKHJhbmRvbSwgbWluaW50ICsgMSwgbWluaW50KSkKK2Fzc2VydChub3QgcGNhbGwocmFuZG9tLCBtYXhpbnQsIG1heGludCAtIDEpKQorYXNzZXJ0KG5vdCBwY2FsbChyYW5kb20sIG1heGludCwgbWluaW50KSkKKworCisKK3ByaW50KCdPSycpCmRpZmYgLS1naXQgYS90ZXN0ZXMvbmV4dHZhci5sdWEgYi90ZXN0ZXMvbmV4dHZhci5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjM2FjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9uZXh0dmFyLmx1YQpAQCAtMCwwICsxLDY2OSBAQAorLS0gJElkOiBuZXh0dmFyLmx1YSx2IDEuODUgMjAxOC8wNi8xOSAxMjoyNDoxOSByb2JlcnRvIEV4cCAkCistLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBmaWxlIGFsbC5sdWEKKworcHJpbnQoJ3Rlc3RpbmcgdGFibGVzLCBuZXh0LCBhbmQgZm9yJykKKworbG9jYWwgZnVuY3Rpb24gY2hlY2tlcnJvciAobXNnLCBmLCAuLi4pCisgIGxvY2FsIHMsIGVyciA9IHBjYWxsKGYsIC4uLikKKyAgYXNzZXJ0KG5vdCBzIGFuZCBzdHJpbmcuZmluZChlcnIsIG1zZykpCitlbmQKKworCitsb2NhbCBhID0ge30KKworLS0gbWFrZSBzdXJlIHRhYmxlIGhhcyBsb3RzIG9mIHNwYWNlIGluIGhhc2ggcGFydAorZm9yIGk9MSwxMDAgZG8gYVtpLi4iKyJdID0gdHJ1ZSBlbmQKK2ZvciBpPTEsMTAwIGRvIGFbaS4uIisiXSA9IHVuZGVmIGVuZAorLS0gZmlsbCBoYXNoIHBhcnQgd2l0aCBudW1lcmljIGluZGljZXMgdGVzdGluZyBzaXplIG9wZXJhdG9yCitmb3IgaT0xLDEwMCBkbworICBhW2ldID0gdHJ1ZQorICBhc3NlcnQoI2EgPT0gaSkKK2VuZAorCistLSB0ZXN0aW5nIGlwYWlycworbG9jYWwgeCA9IDAKK2ZvciBrLHYgaW4gaXBhaXJzezEwLDIwLDMwO3g9MTJ9IGRvCisgIHggPSB4ICsgMQorICBhc3NlcnQoayA9PSB4IGFuZCB2ID09IHggKiAxMCkKK2VuZAorCitmb3IgXyBpbiBpcGFpcnN7eD0xMiwgeT0yNH0gZG8gYXNzZXJ0KG5pbCkgZW5kCisKKy0tIHRlc3QgZm9yICdmYWxzZScgeCBpcGFpcgoreCA9IGZhbHNlCitsb2NhbCBpID0gMAorZm9yIGssdiBpbiBpcGFpcnN7dHJ1ZSxmYWxzZSx0cnVlLGZhbHNlfSBkbworICBpID0gaSArIDEKKyAgeCA9IG5vdCB4CisgIGFzc2VydCh4ID09IHYpCitlbmQKK2Fzc2VydChpID09IDQpCisKKy0tIGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGFsd2F5cyB0aGUgc2FtZQorYXNzZXJ0KHR5cGUoaXBhaXJze30pID09ICdmdW5jdGlvbicgYW5kIGlwYWlyc3t9ID09IGlwYWlyc3t9KQorCisKK2lmIG5vdCBUIHRoZW4KKyAgKE1lc3NhZ2Ugb3IgcHJpbnQpCisgICAgKCdcbiA+Pj4gdGVzdEMgbm90IGFjdGl2ZTogc2tpcHBpbmcgdGVzdHMgZm9yIHRhYmxlIHNpemVzIDw8PFxuJykKK2Vsc2UgLS1bCistLSB0ZXN0aW5nIHRhYmxlIHNpemVzCisKK2xvY2FsIGZ1bmN0aW9uIGxvZzIgKHgpIHJldHVybiBtYXRoLmxvZyh4LCAyKSBlbmQKKworbG9jYWwgZnVuY3Rpb24gbXAyIChuKSAgIC0tIG1pbmltdW0gcG93ZXIgb2YgMiA+PSBuCisgIGxvY2FsIG1wID0gMl5tYXRoLmNlaWwobG9nMihuKSkKKyAgYXNzZXJ0KG4gPT0gMCBvciAobXAvMiA8IG4gYW5kIG4gPD0gbXApKQorICByZXR1cm4gbXAKK2VuZAorCitsb2NhbCBmdW5jdGlvbiBmYiAobikKKyAgbG9jYWwgciwgbm4gPSBULmludDJmYihuKQorICBhc3NlcnQociA8IDI1NikKKyAgcmV0dXJuIG5uCitlbmQKKworLS0gdGVzdCBmYiBmdW5jdGlvbgorZm9yIGEgPSAxLCAxMDAwMCBkbyAgIC0tIGFsbCBudW1iZXJzIHVwIHRvIDEwXjQKKyAgbG9jYWwgbiA9IGZiKGEpCisgIGFzc2VydChhIDw9IG4gYW5kIG4gPD0gYSoxLjEyNSkKK2VuZAorbG9jYWwgYSA9IDEwMjQgICAtLSBwbHVzIGEgZmV3IHVwIHRvIDIgXjMwCitsb2NhbCBsaW0gPSAyXjMwCit3aGlsZSBhIDwgbGltIGRvCisgIGxvY2FsIG4gPSBmYihhKQorICBhc3NlcnQoYSA8PSBuIGFuZCBuIDw9IGEqMS4xMjUpCisgIGEgPSBtYXRoLmNlaWwoYSoxLjMpCitlbmQKKworIAorbG9jYWwgZnVuY3Rpb24gY2hlY2sgKHQsIG5hLCBuaCkKKyAgbG9jYWwgYSwgaCA9IFQucXVlcnl0YWIodCkKKyAgaWYgYSB+PSBuYSBvciBoIH49IG5oIHRoZW4KKyAgICBwcmludChuYSwgbmgsIGEsIGgpCisgICAgYXNzZXJ0KG5pbCkKKyAgZW5kCitlbmQKKworCistLSB0ZXN0aW5nIEMgbGlicmFyeSBzaXplcworZG8KKyAgbG9jYWwgcyA9IDAKKyAgZm9yIF8gaW4gcGFpcnMobWF0aCkgZG8gcyA9IHMgKyAxIGVuZAorICBjaGVjayhtYXRoLCAwLCBtcDIocykpCitlbmQKKworCistLSB0ZXN0aW5nIGNvbnN0cnVjdG9yIHNpemVzCitsb2NhbCBsaW0gPSA0MAorbG9jYWwgcyA9ICdyZXR1cm4geycKK2ZvciBpPTEsbGltIGRvCisgIHMgPSBzLi5pLi4nLCcKKyAgbG9jYWwgcyA9IHMKKyAgZm9yIGs9MCxsaW0gZG8gCisgICAgbG9jYWwgdCA9IGxvYWQocy4uJ30nLCAnJykoKQorICAgIGFzc2VydCgjdCA9PSBpKQorICAgIGNoZWNrKHQsIGZiKGkpLCBtcDIoaykpCisgICAgcyA9IHN0cmluZy5mb3JtYXQoJyVzYSVkPSVkLCcsIHMsIGssIGspCisgIGVuZAorZW5kCisKKworLS0gdGVzdHMgd2l0aCB1bmtub3duIG51bWJlciBvZiBlbGVtZW50cworbG9jYWwgYSA9IHt9Citmb3IgaT0xLGxpbSBkbyBhW2ldID0gaSBlbmQgICAtLSBidWlsZCBhdXhpbGlhcnkgdGFibGUKK2ZvciBrPTAsbGltIGRvCisgIGxvY2FsIGEgPSB7dGFibGUudW5wYWNrKGEsMSxrKX0KKyAgYXNzZXJ0KCNhID09IGspCisgIGNoZWNrKGEsIGssIDApCisgIGEgPSB7MSwyLDMsdGFibGUudW5wYWNrKGEsMSxrKX0KKyAgY2hlY2soYSwgayszLCAwKQorICBhc3NlcnQoI2EgPT0gayArIDMpCitlbmQKKworCistLSB0ZXN0aW5nIHRhYmxlcyBkeW5hbWljYWxseSBidWlsdAorbG9jYWwgbGltID0gMTMwCitsb2NhbCBhID0ge307IGFbMl0gPSAxOyBjaGVjayhhLCAwLCAxKQorYSA9IHt9OyBhWzBdID0gMTsgY2hlY2soYSwgMCwgMSk7IGFbMl0gPSAxOyBjaGVjayhhLCAwLCAyKQorYSA9IHt9OyBhWzBdID0gMTsgYVsxXSA9IDE7IGNoZWNrKGEsIDEsIDEpCithID0ge30KK2ZvciBpID0gMSxsaW0gZG8KKyAgYVtpXSA9IDEKKyAgYXNzZXJ0KCNhID09IGkpCisgIGNoZWNrKGEsIG1wMihpKSwgMCkKK2VuZAorCithID0ge30KK2ZvciBpID0gMSxsaW0gZG8KKyAgYVsnYScuLmldID0gMQorICBhc3NlcnQoI2EgPT0gMCkKKyAgY2hlY2soYSwgMCwgbXAyKGkpKQorZW5kCisKK2EgPSB7fQorZm9yIGk9MSwxNiBkbyBhW2ldID0gaSBlbmQKK2NoZWNrKGEsIDE2LCAwKQorZG8KKyAgZm9yIGk9MSwxMSBkbyBhW2ldID0gdW5kZWYgZW5kCisgIGZvciBpPTMwLDUwIGRvIGFbaV0gPSB0cnVlOyBhW2ldID0gdW5kZWYgZW5kICAgLS0gZm9yY2UgYSByZWhhc2ggKD8pCisgIGNoZWNrKGEsIDAsIDgpICAgLS0gNSBlbGVtZW50cyBpbiB0aGUgdGFibGUKKyAgYVsxMF0gPSAxCisgIGZvciBpPTMwLDUwIGRvIGFbaV0gPSB0cnVlOyBhW2ldID0gdW5kZWYgZW5kICAgLS0gZm9yY2UgYSByZWhhc2ggKD8pCisgIGNoZWNrKGEsIDAsIDgpICAgLS0gb25seSA2IGVsZW1lbnRzIGluIHRoZSB0YWJsZQorICBmb3IgaT0xLDE0IGRvIGFbaV0gPSB0cnVlOyBhW2ldID0gdW5kZWYgZW5kCisgIGZvciBpPTE4LDUwIGRvIGFbaV0gPSB0cnVlOyBhW2ldID0gdW5kZWYgZW5kICAgLS0gZm9yY2UgYSByZWhhc2ggKD8pCisgIGNoZWNrKGEsIDAsIDQpICAgLS0gb25seSAyIGVsZW1lbnRzIChbMTVdIGFuZCBbMTZdKQorZW5kCisKKy0tIHJldmVyc2UgZmlsbGluZworZm9yIGk9MSxsaW0gZG8KKyAgbG9jYWwgYSA9IHt9CisgIGZvciBpPWksMSwtMSBkbyBhW2ldID0gaSBlbmQgICAtLSBmaWxsIGluIHJldmVyc2UKKyAgY2hlY2soYSwgbXAyKGkpLCAwKQorZW5kCisKKy0tIHNpemUgdGVzdHMgZm9yIHZhcmFyZworbGltID0gMzUKK2Z1bmN0aW9uIGZvbyAobiwgLi4uKQorICBsb2NhbCBhcmcgPSB7Li4ufQorICBjaGVjayhhcmcsIG4sIDApCisgIGFzc2VydChzZWxlY3QoJyMnLCAuLi4pID09IG4pCisgIGFyZ1tuKzFdID0gdHJ1ZQorICBjaGVjayhhcmcsIG1wMihuKzEpLCAwKQorICBhcmcueCA9IHRydWUKKyAgY2hlY2soYXJnLCBtcDIobisxKSwgMSkKK2VuZAorbG9jYWwgYSA9IHt9Citmb3IgaT0xLGxpbSBkbyBhW2ldID0gdHJ1ZTsgZm9vKGksIHRhYmxlLnVucGFjayhhKSkgZW5kCisKKworLS0gVGFibGUgbGVuZ3RoIHdpdGggbGltaXQgc21hbGxlciB0aGFuIG1heGltdW0gdmFsdWUgYXQgYXJyYXkKK2xvY2FsIGEgPSB7fQorZm9yIGkgPSAxLDY0IGRvIGFbaV0gPSB0cnVlIGVuZCAgICAtLSBtYWtlIGl0cyBhcnJheSBzaXplIDY0Citmb3IgaSA9IDEsNjQgZG8gYVtpXSA9IG5pbCBlbmQgICAgIC0tIGVyYXNlIGFsbCBlbGVtZW50cworYXNzZXJ0KFQucXVlcnl0YWIoYSkgPT0gNjQpICAgIC0tIGFycmF5IHBhcnQgaGFzIDY0IGVsZW1lbnRzCithWzMyXSA9IHRydWU7IGFbNDhdID0gdHJ1ZTsgICAgLS0gYmluYXJ5IHNlYXJjaCB3aWxsIGZpbmQgdGhlc2Ugb25lcworYVs1MV0gPSB0cnVlICAgICAgICAgICAgICAgICAgIC0tIGJpbmFyeSBzZWFyY2ggd2lsbCBtaXNzIHRoaXMgb25lCithc3NlcnQoI2EgPT0gNDgpICAgICAgICAgICAgICAgLS0gdGhpcyB3aWxsIHNldCB0aGUgbGltaXQKK2Fzc2VydChzZWxlY3QoNCwgVC5xdWVyeXRhYihhKSkgPT0gNDgpICAtLSB0aGlzIGlzIHRoZSBsaW1pdCBub3cKK2FbNTBdID0gdHJ1ZSAgICAgICAgICAgICAgICAgICAtLSB0aGlzIHdpbGwgc2V0IGEgbmV3IGxpbWl0Cithc3NlcnQoc2VsZWN0KDQsIFQucXVlcnl0YWIoYSkpID09IDUwKSAgLS0gdGhpcyBpcyB0aGUgbGltaXQgbm93CistLSBidXQgdGhlIHNpemUgaXMgbGFyZ2VyIChhbmQgc3RpbGwgaW5zaWRlIHRoZSBhcnJheSBwYXJ0KQorYXNzZXJ0KCNhID09IDUxKQorCitlbmQgIC0tXQorCisKKy0tIHRlc3Qgc2l6ZSBvcGVyYXRpb24gb24gdGFibGVzIHdpdGggbmlscworYXNzZXJ0KCN7fSA9PSAwKQorYXNzZXJ0KCN7bmlsfSA9PSAwKQorYXNzZXJ0KCN7bmlsLCBuaWx9ID09IDApCithc3NlcnQoI3tuaWwsIG5pbCwgbmlsfSA9PSAwKQorYXNzZXJ0KCN7bmlsLCBuaWwsIG5pbCwgbmlsfSA9PSAwKQorYXNzZXJ0KCN7MSwgMiwgMywgbmlsLCBuaWx9ID09IDMpCitwcmludCcrJworCisKK2xvY2FsIG5vZmluZCA9IHt9CisKK2EsYixjID0gMSwyLDMKK2EsYixjID0gbmlsCisKKworLS0gbmV4dCB1c2VzIGFsd2F5cyB0aGUgc2FtZSBpdGVyYWN0aW9uIGZ1bmN0aW9uCithc3NlcnQobmV4dHt9ID09IG5leHR7fSkKKworbG9jYWwgZnVuY3Rpb24gZmluZCAobmFtZSkKKyAgbG9jYWwgbix2CisgIHdoaWxlIDEgZG8KKyAgICBuLHYgPSBuZXh0KF9HLCBuKQorICAgIGlmIG5vdCBuIHRoZW4gcmV0dXJuIG5vZmluZCBlbmQKKyAgICBhc3NlcnQoX0dbbl0gfj0gdW5kZWYpCisgICAgaWYgbiA9PSBuYW1lIHRoZW4gcmV0dXJuIHYgZW5kCisgIGVuZAorZW5kCisKK2xvY2FsIGZ1bmN0aW9uIGZpbmQxIChuYW1lKQorICBmb3Igbix2IGluIHBhaXJzKF9HKSBkbworICAgIGlmIG49PW5hbWUgdGhlbiByZXR1cm4gdiBlbmQKKyAgZW5kCisgIHJldHVybiBuaWwgIC0tIG5vdCBmb3VuZAorZW5kCisKKworYXNzZXJ0KHByaW50PT1maW5kKCJwcmludCIpIGFuZCBwcmludCA9PSBmaW5kMSgicHJpbnQiKSkKK2Fzc2VydChfR1sicHJpbnQiXT09ZmluZCgicHJpbnQiKSkKK2Fzc2VydChhc3NlcnQ9PWZpbmQxKCJhc3NlcnQiKSkKK2Fzc2VydChub2ZpbmQ9PWZpbmQoInJldHVybiIpKQorYXNzZXJ0KG5vdCBmaW5kMSgicmV0dXJuIikpCitfR1sicmV0IiAuLiAidXJuIl0gPSB1bmRlZgorYXNzZXJ0KG5vZmluZD09ZmluZCgicmV0dXJuIikpCitfR1sieHh4Il0gPSAxCithc3NlcnQoeHh4PT1maW5kKCJ4eHgiKSkKKworLS0gaW52YWxpZCBrZXkgdG8gJ25leHQnCitjaGVja2Vycm9yKCJpbnZhbGlkIGtleSIsIG5leHQsIHsxMCwyMH0sIDMpCisKKy0tIGJvdGggJ3BhaXJzJyBhbmQgJ2lwYWlycycgbmVlZCBhbiBhcmd1bWVudAorY2hlY2tlcnJvcigiYmFkIGFyZ3VtZW50IiwgcGFpcnMpCitjaGVja2Vycm9yKCJiYWQgYXJndW1lbnQiLCBpcGFpcnMpCisKK3ByaW50KCcrJykKKworYSA9IHt9Citmb3IgaT0wLDEwMDAwIGRvCisgIGlmIG1hdGguZm1vZChpLDEwKSB+PSAwIHRoZW4KKyAgICBhWyd4Jy4uaV0gPSBpCisgIGVuZAorZW5kCisKK24gPSB7bj0wfQorZm9yIGksdiBpbiBwYWlycyhhKSBkbworICBuLm4gPSBuLm4rMQorICBhc3NlcnQoaSBhbmQgdiBhbmQgYVtpXSA9PSB2KQorZW5kCithc3NlcnQobi5uID09IDkwMDApCithID0gbmlsCisKK2RvICAgLS0gY2xlYXIgZ2xvYmFsIHRhYmxlCisgIGxvY2FsIGEgPSB7fQorICBmb3Igbix2IGluIHBhaXJzKF9HKSBkbyBhW25dPXYgZW5kCisgIGZvciBuLHYgaW4gcGFpcnMoYSkgZG8KKyAgICBpZiBub3QgcGFja2FnZS5sb2FkZWRbbl0gYW5kIHR5cGUodikgfj0gImZ1bmN0aW9uIiBhbmQKKyAgICAgICBub3Qgc3RyaW5nLmZpbmQobiwgIl5bJXVfXSIpIHRoZW4KKyAgICAgIF9HW25dID0gdW5kZWYKKyAgICBlbmQKKyAgICBjb2xsZWN0Z2FyYmFnZSgpCisgIGVuZAorZW5kCisKKworLS0gCisKK2xvY2FsIGZ1bmN0aW9uIGNoZWNrbmV4dCAoYSkKKyAgbG9jYWwgYiA9IHt9CisgIGRvIGxvY2FsIGssdiA9IG5leHQoYSk7IHdoaWxlIGsgZG8gYltrXSA9IHY7IGssdiA9IG5leHQoYSxrKSBlbmQgZW5kCisgIGZvciBrLHYgaW4gcGFpcnMoYikgZG8gYXNzZXJ0KGFba10gPT0gdikgZW5kCisgIGZvciBrLHYgaW4gcGFpcnMoYSkgZG8gYXNzZXJ0KGJba10gPT0gdikgZW5kCitlbmQKKworY2hlY2tuZXh0ezEseD0xLHk9Mix6PTN9CitjaGVja25leHR7MSwyLHg9MSx5PTIsej0zfQorY2hlY2tuZXh0ezEsMiwzLHg9MSx5PTIsej0zfQorY2hlY2tuZXh0ezEsMiwzLDQseD0xLHk9Mix6PTN9CitjaGVja25leHR7MSwyLDMsNCw1LHg9MSx5PTIsej0zfQorCithc3NlcnQoI3t9ID09IDApCithc3NlcnQoI3tbLTFdID0gMn0gPT0gMCkKK2ZvciBpPTAsNDAgZG8KKyAgbG9jYWwgYSA9IHt9CisgIGZvciBqPTEsaSBkbyBhW2pdPWogZW5kCisgIGFzc2VydCgjYSA9PSBpKQorZW5kCisKKy0tICdtYXhuJyBpcyBub3cgZGVwcmVjYXRlZCwgYnV0IGl0IGlzIGVhc2lseSBkZWZpbmVkIGluIEx1YQorZnVuY3Rpb24gdGFibGUubWF4biAodCkKKyAgbG9jYWwgbWF4ID0gMAorICBmb3IgayBpbiBwYWlycyh0KSBkbworICAgIG1heCA9ICh0eXBlKGspID09ICdudW1iZXInKSBhbmQgbWF0aC5tYXgobWF4LCBrKSBvciBtYXgKKyAgZW5kCisgIHJldHVybiBtYXgKK2VuZAorCithc3NlcnQodGFibGUubWF4bnt9ID09IDApCithc3NlcnQodGFibGUubWF4bntbIjEwMDAiXSA9IHRydWV9ID09IDApCithc3NlcnQodGFibGUubWF4bntbIjEwMDAiXSA9IHRydWUsIFsyNC41XSA9IDN9ID09IDI0LjUpCithc3NlcnQodGFibGUubWF4bntbMTAwMF0gPSB0cnVlfSA9PSAxMDAwKQorYXNzZXJ0KHRhYmxlLm1heG57WzEwXSA9IHRydWUsIFsxMDAqbWF0aC5waV0gPSBwcmludH0gPT0gMTAwKm1hdGgucGkpCisKK3RhYmxlLm1heG4gPSBuaWwKKworLS0gaW50IG92ZXJmbG93CithID0ge30KK2ZvciBpPTAsNTAgZG8gYVsyXmldID0gdHJ1ZSBlbmQKK2Fzc2VydChhWyNhXSkKKworcHJpbnQoJysnKQorCisKK2RvICAgIC0tIHRlc3RpbmcgJ25leHQnIHdpdGggYWxsIGtpbmRzIG9mIGtleXMKKyAgbG9jYWwgYSA9IHsKKyAgICBbMV0gPSAxLCAgICAgICAgICAgICAgICAgICAgICAgIC0tIGludGVnZXIKKyAgICBbMS4xXSA9IDIsICAgICAgICAgICAgICAgICAgICAgIC0tIGZsb2F0CisgICAgWyd4J10gPSAzLCAgICAgICAgICAgICAgICAgICAgICAtLSBzaG9ydCBzdHJpbmcKKyAgICBbc3RyaW5nLnJlcCgneCcsIDEwMDApXSA9IDQsICAgIC0tIGxvbmcgc3RyaW5nCisgICAgW3ByaW50XSA9IDUsICAgICAgICAgICAgICAgICAgICAtLSBDIGZ1bmN0aW9uCisgICAgW2NoZWNrZXJyb3JdID0gNiwgICAgICAgICAgICAgICAtLSBMdWEgZnVuY3Rpb24KKyAgICBbY29yb3V0aW5lLnJ1bm5pbmcoKV0gPSA3LCAgICAgIC0tIHRocmVhZAorICAgIFt0cnVlXSA9IDgsICAgICAgICAgICAgICAgICAgICAgLS0gYm9vbGVhbgorICAgIFtpby5zdGRpbl0gPSA5LCAgICAgICAgICAgICAgICAgLS0gdXNlcmRhdGEKKyAgICBbe31dID0gMTAsICAgICAgICAgICAgICAgICAgICAgIC0tIHRhYmxlCisgIH0KKyAgbG9jYWwgYiA9IHt9OyBmb3IgaSA9IDEsIDEwIGRvIGJbaV0gPSB0cnVlIGVuZAorICBmb3IgaywgdiBpbiBwYWlycyhhKSBkbworICAgIGFzc2VydChiW3ZdKTsgYlt2XSA9IHVuZGVmCisgIGVuZAorICBhc3NlcnQobmV4dChiKSA9PSBuaWwpICAgICAgICAtLSAnYicgbm93IGlzIGVtcHR5CitlbmQKKworCistLSBlcmFzaW5nIHZhbHVlcworbG9jYWwgdCA9IHtbezF9XSA9IDEsIFt7Mn1dID0gMiwgW3N0cmluZy5yZXAoInggIiwgNCldID0gMywKKyAgICAgICAgICAgWzEwMC4zXSA9IDQsIFs0XSA9IDV9CisKK2xvY2FsIG4gPSAwCitmb3IgaywgdiBpbiBwYWlycyggdCApIGRvCisgIG4gPSBuKzEKKyAgYXNzZXJ0KHRba10gPT0gdikKKyAgdFtrXSA9IHVuZGVmCisgIGNvbGxlY3RnYXJiYWdlKCkKKyAgYXNzZXJ0KHRba10gPT0gdW5kZWYpCitlbmQKK2Fzc2VydChuID09IDUpCisKKworbG9jYWwgZnVuY3Rpb24gdGVzdCAoYSkKKyAgYXNzZXJ0KG5vdCBwY2FsbCh0YWJsZS5pbnNlcnQsIGEsIDIsIDIwKSk7CisgIHRhYmxlLmluc2VydChhLCAxMCk7IHRhYmxlLmluc2VydChhLCAyLCAyMCk7CisgIHRhYmxlLmluc2VydChhLCAxLCAtMSk7IHRhYmxlLmluc2VydChhLCA0MCk7CisgIHRhYmxlLmluc2VydChhLCAjYSsxLCA1MCkKKyAgdGFibGUuaW5zZXJ0KGEsIDIsIC0yKQorICBhc3NlcnQoYVsyXSB+PSB1bmRlZikKKyAgYXNzZXJ0KGFbIjIiXSA9PSB1bmRlZikKKyAgYXNzZXJ0KG5vdCBwY2FsbCh0YWJsZS5pbnNlcnQsIGEsIDAsIDIwKSk7CisgIGFzc2VydChub3QgcGNhbGwodGFibGUuaW5zZXJ0LCBhLCAjYSArIDIsIDIwKSk7CisgIGFzc2VydCh0YWJsZS5yZW1vdmUoYSwxKSA9PSAtMSkKKyAgYXNzZXJ0KHRhYmxlLnJlbW92ZShhLDEpID09IC0yKQorICBhc3NlcnQodGFibGUucmVtb3ZlKGEsMSkgPT0gMTApCisgIGFzc2VydCh0YWJsZS5yZW1vdmUoYSwxKSA9PSAyMCkKKyAgYXNzZXJ0KHRhYmxlLnJlbW92ZShhLDEpID09IDQwKQorICBhc3NlcnQodGFibGUucmVtb3ZlKGEsMSkgPT0gNTApCisgIGFzc2VydCh0YWJsZS5yZW1vdmUoYSwxKSA9PSBuaWwpCisgIGFzc2VydCh0YWJsZS5yZW1vdmUoYSkgPT0gbmlsKQorICBhc3NlcnQodGFibGUucmVtb3ZlKGEsICNhKSA9PSBuaWwpCitlbmQKKworYSA9IHtuPTAsIFstN10gPSAiYmFuIn0KK3Rlc3QoYSkKK2Fzc2VydChhLm4gPT0gMCBhbmQgYVstN10gPT0gImJhbiIpCisKK2EgPSB7Wy03XSA9ICJiYW4ifTsKK3Rlc3QoYSkKK2Fzc2VydChhLm4gPT0gbmlsIGFuZCAjYSA9PSAwIGFuZCBhWy03XSA9PSAiYmFuIikKKworYSA9IHtbLTFdID0gImJhbiJ9Cit0ZXN0KGEpCithc3NlcnQoI2EgPT0gMCBhbmQgdGFibGUucmVtb3ZlKGEpID09IG5pbCBhbmQgYVstMV0gPT0gImJhbiIpCisKK2EgPSB7WzBdID0gImJhbiJ9Cithc3NlcnQoI2EgPT0gMCBhbmQgdGFibGUucmVtb3ZlKGEpID09ICJiYW4iIGFuZCBhWzBdID09IHVuZGVmKQorCit0YWJsZS5pbnNlcnQoYSwgMSwgMTApOyB0YWJsZS5pbnNlcnQoYSwgMSwgMjApOyB0YWJsZS5pbnNlcnQoYSwgMSwgLTEpCithc3NlcnQodGFibGUucmVtb3ZlKGEpID09IDEwKQorYXNzZXJ0KHRhYmxlLnJlbW92ZShhKSA9PSAyMCkKK2Fzc2VydCh0YWJsZS5yZW1vdmUoYSkgPT0gLTEpCithc3NlcnQodGFibGUucmVtb3ZlKGEpID09IG5pbCkKKworYSA9IHsnYycsICdkJ30KK3RhYmxlLmluc2VydChhLCAzLCAnYScpCit0YWJsZS5pbnNlcnQoYSwgJ2InKQorYXNzZXJ0KHRhYmxlLnJlbW92ZShhLCAxKSA9PSAnYycpCithc3NlcnQodGFibGUucmVtb3ZlKGEsIDEpID09ICdkJykKK2Fzc2VydCh0YWJsZS5yZW1vdmUoYSwgMSkgPT0gJ2EnKQorYXNzZXJ0KHRhYmxlLnJlbW92ZShhLCAxKSA9PSAnYicpCithc3NlcnQodGFibGUucmVtb3ZlKGEsIDEpID09IG5pbCkKK2Fzc2VydCgjYSA9PSAwIGFuZCBhLm4gPT0gbmlsKQorCithID0gezEwLDIwLDMwLDQwfQorYXNzZXJ0KHRhYmxlLnJlbW92ZShhLCAjYSArIDEpID09IG5pbCkKK2Fzc2VydChub3QgcGNhbGwodGFibGUucmVtb3ZlLCBhLCAwKSkKK2Fzc2VydChhWyNhXSA9PSA0MCkKK2Fzc2VydCh0YWJsZS5yZW1vdmUoYSwgI2EpID09IDQwKQorYXNzZXJ0KGFbI2FdID09IDMwKQorYXNzZXJ0KHRhYmxlLnJlbW92ZShhLCAyKSA9PSAyMCkKK2Fzc2VydChhWyNhXSA9PSAzMCBhbmQgI2EgPT0gMikKKworZG8gICAtLSB0ZXN0aW5nIHRhYmxlIGxpYnJhcnkgd2l0aCBtZXRhbWV0aG9kcworICBsb2NhbCBmdW5jdGlvbiB0ZXN0IChwcm94eSwgdCkKKyAgICBmb3IgaSA9IDEsIDEwIGRvCisgICAgICB0YWJsZS5pbnNlcnQocHJveHksIDEsIGkpCisgICAgZW5kCisgICAgYXNzZXJ0KCNwcm94eSA9PSAxMCBhbmQgI3QgPT0gMTAgYW5kIHByb3h5WzFdIH49IHVuZGVmKQorICAgIGZvciBpID0gMSwgMTAgZG8KKyAgICAgIGFzc2VydCh0W2ldID09IDExIC0gaSkKKyAgICBlbmQKKyAgICB0YWJsZS5zb3J0KHByb3h5KQorICAgIGZvciBpID0gMSwgMTAgZG8KKyAgICAgIGFzc2VydCh0W2ldID09IGkgYW5kIHByb3h5W2ldID09IGkpCisgICAgZW5kCisgICAgYXNzZXJ0KHRhYmxlLmNvbmNhdChwcm94eSwgIiwiKSA9PSAiMSwyLDMsNCw1LDYsNyw4LDksMTAiKQorICAgIGZvciBpID0gMSwgOCBkbworICAgICAgYXNzZXJ0KHRhYmxlLnJlbW92ZShwcm94eSwgMSkgPT0gaSkKKyAgICBlbmQKKyAgICBhc3NlcnQoI3Byb3h5ID09IDIgYW5kICN0ID09IDIpCisgICAgbG9jYWwgYSwgYiwgYyA9IHRhYmxlLnVucGFjayhwcm94eSkKKyAgICBhc3NlcnQoYSA9PSA5IGFuZCBiID09IDEwIGFuZCBjID09IG5pbCkKKyAgZW5kCisKKyAgLS0gYWxsIHZpcnR1YWwKKyAgbG9jYWwgdCA9IHt9CisgIGxvY2FsIHByb3h5ID0gc2V0bWV0YXRhYmxlKHt9LCB7CisgICAgX19sZW4gPSBmdW5jdGlvbiAoKSByZXR1cm4gI3QgZW5kLAorICAgIF9faW5kZXggPSB0LAorICAgIF9fbmV3aW5kZXggPSB0LAorICB9KQorICB0ZXN0KHByb3h5LCB0KQorCisgIC0tIG9ubHkgX19uZXdpbmRleAorICBsb2NhbCBjb3VudCA9IDAKKyAgdCA9IHNldG1ldGF0YWJsZSh7fSwgeworICAgIF9fbmV3aW5kZXggPSBmdW5jdGlvbiAodCxrLHYpIGNvdW50ID0gY291bnQgKyAxOyByYXdzZXQodCxrLHYpIGVuZH0pCisgIHRlc3QodCwgdCkKKyAgYXNzZXJ0KGNvdW50ID09IDEwKSAgIC0tIGFmdGVyIGZpcnN0IDEwLCBhbGwgb3RoZXIgc2V0cyBhcmUgbm90IG5ldworCisgIC0tIG5vIF9fbmV3aW5kZXgKKyAgdCA9IHNldG1ldGF0YWJsZSh7fSwgeworICAgIF9faW5kZXggPSBmdW5jdGlvbiAoXyxrKSByZXR1cm4gayArIDEgZW5kLAorICAgIF9fbGVuID0gZnVuY3Rpb24gKF8pIHJldHVybiA1IGVuZH0pCisgIGFzc2VydCh0YWJsZS5jb25jYXQodCwgIjsiKSA9PSAiMjszOzQ7NTs2IikKKworZW5kCisKKworaWYgbm90IFQgdGhlbgorICAoTWVzc2FnZSBvciBwcmludCkKKyAgICAoJ1xuID4+PiB0ZXN0QyBub3QgYWN0aXZlOiBza2lwcGluZyB0ZXN0cyBmb3IgdGFibGUgbGlicmFyeSBvbiBub24tdGFibGVzIDw8PFxuJykKK2Vsc2UgLS1bCisgIGxvY2FsIGRlYnVnID0gcmVxdWlyZSdkZWJ1ZycKKyAgbG9jYWwgdGFiID0gezEwLCAyMCwgMzB9CisgIGxvY2FsIG10ID0ge30KKyAgbG9jYWwgdSA9IFQubmV3dXNlcmRhdGEoMCkKKyAgY2hlY2tlcnJvcigidGFibGUgZXhwZWN0ZWQiLCB0YWJsZS5pbnNlcnQsIHUsIDQwKQorICBjaGVja2Vycm9yKCJ0YWJsZSBleHBlY3RlZCIsIHRhYmxlLnJlbW92ZSwgdSkKKyAgZGVidWcuc2V0bWV0YXRhYmxlKHUsIG10KQorICBjaGVja2Vycm9yKCJ0YWJsZSBleHBlY3RlZCIsIHRhYmxlLmluc2VydCwgdSwgNDApCisgIGNoZWNrZXJyb3IoInRhYmxlIGV4cGVjdGVkIiwgdGFibGUucmVtb3ZlLCB1KQorICBtdC5fX2luZGV4ID0gdGFiCisgIGNoZWNrZXJyb3IoInRhYmxlIGV4cGVjdGVkIiwgdGFibGUuaW5zZXJ0LCB1LCA0MCkKKyAgY2hlY2tlcnJvcigidGFibGUgZXhwZWN0ZWQiLCB0YWJsZS5yZW1vdmUsIHUpCisgIG10Ll9fbmV3aW5kZXggPSB0YWIKKyAgY2hlY2tlcnJvcigidGFibGUgZXhwZWN0ZWQiLCB0YWJsZS5pbnNlcnQsIHUsIDQwKQorICBjaGVja2Vycm9yKCJ0YWJsZSBleHBlY3RlZCIsIHRhYmxlLnJlbW92ZSwgdSkKKyAgbXQuX19sZW4gPSBmdW5jdGlvbiAoKSByZXR1cm4gI3RhYiBlbmQKKyAgdGFibGUuaW5zZXJ0KHUsIDQwKQorICBhc3NlcnQoI3UgPT0gNCBhbmQgI3RhYiA9PSA0IGFuZCB1WzRdID09IDQwIGFuZCB0YWJbNF0gPT0gNDApCisgIGFzc2VydCh0YWJsZS5yZW1vdmUodSkgPT0gNDApCisgIHRhYmxlLmluc2VydCh1LCAxLCA1MCkKKyAgYXNzZXJ0KCN1ID09IDQgYW5kICN0YWIgPT0gNCBhbmQgdVs0XSA9PSAzMCBhbmQgdGFiWzFdID09IDUwKQorCisgIG10Ll9fbmV3aW5kZXggPSBuaWwKKyAgbXQuX19sZW4gPSBuaWwKKyAgbG9jYWwgdGFiMiA9IHt9CisgIGxvY2FsIHUyID0gVC5uZXd1c2VyZGF0YSgwKSAKKyAgZGVidWcuc2V0bWV0YXRhYmxlKHUyLCB7X19uZXdpbmRleCA9IGZ1bmN0aW9uIChfLCBrLCB2KSB0YWIyW2tdID0gdiBlbmR9KQorICB0YWJsZS5tb3ZlKHUsIDEsIDQsIDEsIHUyKQorICBhc3NlcnQoI3RhYjIgPT0gNCBhbmQgdGFiMlsxXSA9PSB0YWJbMV0gYW5kIHRhYjJbNF0gPT0gdGFiWzRdKQorCitlbmQgLS0gXQorCitwcmludCgnKycpCisKK2EgPSB7fQorZm9yIGk9MSwxMDAwIGRvCisgIGFbaV0gPSBpOyBhW2kgLSAxXSA9IHVuZGVmCitlbmQKK2Fzc2VydChuZXh0KGEsbmlsKSA9PSAxMDAwIGFuZCBuZXh0KGEsMTAwMCkgPT0gbmlsKQorCithc3NlcnQobmV4dCh7fSkgPT0gbmlsKQorYXNzZXJ0KG5leHQoe30sIG5pbCkgPT0gbmlsKQorCitmb3IgYSxiIGluIHBhaXJze30gZG8gZXJyb3Iibm90IGhlcmUiIGVuZAorZm9yIGk9MSwwIGRvIGVycm9yJ25vdCBoZXJlJyBlbmQKK2ZvciBpPTAsMSwtMSBkbyBlcnJvcidub3QgaGVyZScgZW5kCithID0gbmlsOyBmb3IgaT0xLDEgZG8gYXNzZXJ0KG5vdCBhKTsgYT0xIGVuZDsgYXNzZXJ0KGEpCithID0gbmlsOyBmb3IgaT0xLDEsLTEgZG8gYXNzZXJ0KG5vdCBhKTsgYT0xIGVuZDsgYXNzZXJ0KGEpCisKK2RvCisgIHByaW50KCJ0ZXN0aW5nIGZsb2F0cyBpbiBudW1lcmljIGZvciIpCisgIGxvY2FsIGEKKyAgLS0gaW50ZWdlciBjb3VudAorICBhID0gMDsgZm9yIGk9MSwgMSwgMSBkbyBhPWErMSBlbmQ7IGFzc2VydChhPT0xKQorICBhID0gMDsgZm9yIGk9MTAwMDAsIDFlNCwgLTEgZG8gYT1hKzEgZW5kOyBhc3NlcnQoYT09MSkKKyAgYSA9IDA7IGZvciBpPTEsIDAuOTk5OTksIDEgZG8gYT1hKzEgZW5kOyBhc3NlcnQoYT09MCkKKyAgYSA9IDA7IGZvciBpPTk5OTksIDFlNCwgLTEgZG8gYT1hKzEgZW5kOyBhc3NlcnQoYT09MCkKKyAgYSA9IDA7IGZvciBpPTEsIDAuOTk5OTksIC0xIGRvIGE9YSsxIGVuZDsgYXNzZXJ0KGE9PTEpCisKKyAgLS0gZmxvYXQgY291bnQKKyAgYSA9IDA7IGZvciBpPTAsIDAuOTk5OTk5OTk5LCAwLjEgZG8gYT1hKzEgZW5kOyBhc3NlcnQoYT09MTApCisgIGEgPSAwOyBmb3IgaT0xLjAsIDEsIDEgZG8gYT1hKzEgZW5kOyBhc3NlcnQoYT09MSkKKyAgYSA9IDA7IGZvciBpPS0xLjUsIC0xLjUsIDEgZG8gYT1hKzEgZW5kOyBhc3NlcnQoYT09MSkKKyAgYSA9IDA7IGZvciBpPTFlNiwgMWU2LCAtMSBkbyBhPWErMSBlbmQ7IGFzc2VydChhPT0xKQorICBhID0gMDsgZm9yIGk9MS4wLCAwLjk5OTk5LCAxIGRvIGE9YSsxIGVuZDsgYXNzZXJ0KGE9PTApCisgIGEgPSAwOyBmb3IgaT05OTk5OSwgMWU1LCAtMS4wIGRvIGE9YSsxIGVuZDsgYXNzZXJ0KGE9PTApCisgIGEgPSAwOyBmb3IgaT0xLjAsIDAuOTk5OTksIC0xIGRvIGE9YSsxIGVuZDsgYXNzZXJ0KGE9PTEpCitlbmQKKworLS0gY29udmVyc2lvbgorYSA9IDA7IGZvciBpPSIxMCIsIjEiLCItMiIgZG8gYT1hKzEgZW5kOyBhc3NlcnQoYT09NSkKKworZG8gIC0tIGNoZWNraW5nIHR5cGVzCisgIGxvY2FsIGMKKyAgbG9jYWwgZnVuY3Rpb24gY2hlY2tmbG9hdCAoaSkKKyAgICBhc3NlcnQobWF0aC50eXBlKGkpID09ICJmbG9hdCIpCisgICAgYyA9IGMgKyAxCisgIGVuZAorCisgIGMgPSAwOyBmb3IgaSA9IDEuMCwgMTAgZG8gY2hlY2tmbG9hdChpKSBlbmQKKyAgYXNzZXJ0KGMgPT0gMTApCisKKyAgYyA9IDA7IGZvciBpID0gLTEsIC0xMCwgLTEuMCBkbyBjaGVja2Zsb2F0KGkpIGVuZAorICBhc3NlcnQoYyA9PSAxMCkKKworICBsb2NhbCBmdW5jdGlvbiBjaGVja2ludCAoaSkKKyAgICBhc3NlcnQobWF0aC50eXBlKGkpID09ICJpbnRlZ2VyIikKKyAgICBjID0gYyArIDEKKyAgZW5kCisKKyAgbG9jYWwgbSA9IG1hdGgubWF4aW50ZWdlcgorICBjID0gMDsgZm9yIGkgPSBtLCBtIC0gMTAsIC0xIGRvIGNoZWNraW50KGkpIGVuZAorICBhc3NlcnQoYyA9PSAxMSkKKworICBjID0gMDsgZm9yIGkgPSAxLCAxMC45IGRvIGNoZWNraW50KGkpIGVuZAorICBhc3NlcnQoYyA9PSAxMCkKKworICBjID0gMDsgZm9yIGkgPSAxMCwgMC4wMDEsIC0xIGRvIGNoZWNraW50KGkpIGVuZAorICBhc3NlcnQoYyA9PSAxMCkKKworICBjID0gMDsgZm9yIGkgPSAxLCAiMTAuOCIgZG8gY2hlY2tpbnQoaSkgZW5kCisgIGFzc2VydChjID09IDEwKQorCisgIGMgPSAwOyBmb3IgaSA9IDksICIzLjQiLCAtMSBkbyBjaGVja2ludChpKSBlbmQKKyAgYXNzZXJ0KGMgPT0gNikKKworICBjID0gMDsgZm9yIGkgPSAwLCAiIC0zLjQgICIsIC0xIGRvIGNoZWNraW50KGkpIGVuZAorICBhc3NlcnQoYyA9PSA0KQorCisgIGMgPSAwOyBmb3IgaSA9IDEwMCwgIjk2LjMiLCAtMiBkbyBjaGVja2ludChpKSBlbmQKKyAgYXNzZXJ0KGMgPT0gMikKKworICBjID0gMDsgZm9yIGkgPSAxLCBtYXRoLmh1Z2UgZG8gaWYgaSA+IDEwIHRoZW4gYnJlYWsgZW5kOyBjaGVja2ludChpKSBlbmQKKyAgYXNzZXJ0KGMgPT0gMTApCisKKyAgYyA9IDA7IGZvciBpID0gLTEsIC1tYXRoLmh1Z2UsIC0xIGRvCisgICAgICAgICAgIGlmIGkgPCAtMTAgdGhlbiBicmVhayBlbmQ7IGNoZWNraW50KGkpCisgICAgICAgICAgZW5kCisgIGFzc2VydChjID09IDEwKQorCisKKyAgZm9yIGkgPSBtYXRoLm1pbmludGVnZXIsIC0xMGUxMDAgZG8gYXNzZXJ0KGZhbHNlKSBlbmQKKyAgZm9yIGkgPSBtYXRoLm1heGludGVnZXIsIDEwZTEwMCwgLTEgZG8gYXNzZXJ0KGZhbHNlKSBlbmQKKworZW5kCisKK2NvbGxlY3RnYXJiYWdlKCkKKworCistLSB0ZXN0aW5nIGdlbmVyaWMgJ2ZvcicKKworbG9jYWwgZnVuY3Rpb24gZiAobiwgcCkKKyAgbG9jYWwgdCA9IHt9OyBmb3IgaT0xLHAgZG8gdFtpXSA9IGkqMTAgZW5kCisgIHJldHVybiBmdW5jdGlvbiAoXyxuKQorICAgICAgICAgICBpZiBuID4gMCB0aGVuCisgICAgICAgICAgICAgbiA9IG4tMQorICAgICAgICAgICAgIHJldHVybiBuLCB0YWJsZS51bnBhY2sodCkKKyAgICAgICAgICAgZW5kCisgICAgICAgICBlbmQsIG5pbCwgbgorZW5kCisKK2xvY2FsIHggPSAwCitmb3IgbixhLGIsYyxkIGluIGYoNSwzKSBkbworICB4ID0geCsxCisgIGFzc2VydChhID09IDEwIGFuZCBiID09IDIwIGFuZCBjID09IDMwIGFuZCBkID09IG5pbCkKK2VuZAorYXNzZXJ0KHggPT0gNSkKKworCisKKy0tIHRlc3RpbmcgX19wYWlycyBhbmQgX19pcGFpcnMgbWV0YW1ldGhvZAorYSA9IHt9CitkbworICBsb2NhbCB4LHkseiA9IHBhaXJzKGEpCisgIGFzc2VydCh0eXBlKHgpID09ICdmdW5jdGlvbicgYW5kIHkgPT0gYSBhbmQgeiA9PSBuaWwpCitlbmQKKworbG9jYWwgZnVuY3Rpb24gZm9vIChlLGkpCisgIGFzc2VydChlID09IGEpCisgIGlmIGkgPD0gMTAgdGhlbiByZXR1cm4gaSsxLCBpKzIgZW5kCitlbmQKKworbG9jYWwgZnVuY3Rpb24gZm9vMSAoZSxpKQorICBpID0gaSArIDEKKyAgYXNzZXJ0KGUgPT0gYSkKKyAgaWYgaSA8PSBlLm4gdGhlbiByZXR1cm4gaSxhW2ldIGVuZAorZW5kCisKK3NldG1ldGF0YWJsZShhLCB7X19wYWlycyA9IGZ1bmN0aW9uICh4KSByZXR1cm4gZm9vLCB4LCAwIGVuZH0pCisKK2xvY2FsIGkgPSAwCitmb3Igayx2IGluIHBhaXJzKGEpIGRvCisgIGkgPSBpICsgMQorICBhc3NlcnQoayA9PSBpIGFuZCB2ID09IGsrMSkKK2VuZAorCithLm4gPSA1CithWzNdID0gMzAKKworLS0gdGVzdGluZyBpcGFpcnMgd2l0aCBtZXRhbWV0aG9kcworYSA9IHtuPTEwfQorc2V0bWV0YXRhYmxlKGEsIHsgX19pbmRleCA9IGZ1bmN0aW9uICh0LGspCisgICAgICAgICAgICAgICAgICAgICBpZiBrIDw9IHQubiB0aGVuIHJldHVybiBrICogMTAgZW5kIAorICAgICAgICAgICAgICAgICAgZW5kfSkKK2kgPSAwCitmb3Igayx2IGluIGlwYWlycyhhKSBkbworICBpID0gaSArIDEKKyAgYXNzZXJ0KGsgPT0gaSBhbmQgdiA9PSBpICogMTApCitlbmQKK2Fzc2VydChpID09IGEubikKKworcHJpbnQiT0siCmRpZmYgLS1naXQgYS90ZXN0ZXMvcG0ubHVhIGIvdGVzdGVzL3BtLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTE3YzhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGVzL3BtLmx1YQpAQCAtMCwwICsxLDM3NCBAQAorLS0gJElkOiBwbS5sdWEsdiAxLjUwIDIwMTgvMDMvMTIgMTQ6MTk6MzYgcm9iZXJ0byBFeHAgJAorLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCisKK3ByaW50KCd0ZXN0aW5nIHBhdHRlcm4gbWF0Y2hpbmcnKQorCitsb2NhbCBmdW5jdGlvbiBjaGVja2Vycm9yIChtc2csIGYsIC4uLikKKyAgbG9jYWwgcywgZXJyID0gcGNhbGwoZiwgLi4uKQorICBhc3NlcnQobm90IHMgYW5kIHN0cmluZy5maW5kKGVyciwgbXNnKSkKK2VuZAorCisKK2Z1bmN0aW9uIGYocywgcCkKKyAgbG9jYWwgaSxlID0gc3RyaW5nLmZpbmQocywgcCkKKyAgaWYgaSB0aGVuIHJldHVybiBzdHJpbmcuc3ViKHMsIGksIGUpIGVuZAorZW5kCisKK2EsYiA9IHN0cmluZy5maW5kKCcnLCAnJykgICAgLS0gZW1wdHkgcGF0dGVybnMgYXJlIHRyaWNreQorYXNzZXJ0KGEgPT0gMSBhbmQgYiA9PSAwKTsKK2EsYiA9IHN0cmluZy5maW5kKCdhbG8nLCAnJykKK2Fzc2VydChhID09IDEgYW5kIGIgPT0gMCkKK2EsYiA9IHN0cmluZy5maW5kKCdhXDBvIGFcMG8gYVwwbycsICdhJywgMSkgICAtLSBmaXJzdCBwb3NpdGlvbgorYXNzZXJ0KGEgPT0gMSBhbmQgYiA9PSAxKQorYSxiID0gc3RyaW5nLmZpbmQoJ2FcMG8gYVwwbyBhXDBvJywgJ2FcMG8nLCAyKSAgIC0tIHN0YXJ0cyBpbiB0aGUgbWlkbGUKK2Fzc2VydChhID09IDUgYW5kIGIgPT0gNykKK2EsYiA9IHN0cmluZy5maW5kKCdhXDBvIGFcMG8gYVwwbycsICdhXDBvJywgOSkgICAtLSBzdGFydHMgaW4gdGhlIG1pZGxlCithc3NlcnQoYSA9PSA5IGFuZCBiID09IDExKQorYSxiID0gc3RyaW5nLmZpbmQoJ2FcMGFcMGFcMGFcMFwwYWInLCAnXDBhYicsIDIpOyAgLS0gZmluZHMgYXQgdGhlIGVuZAorYXNzZXJ0KGEgPT0gOSBhbmQgYiA9PSAxMSk7CithLGIgPSBzdHJpbmcuZmluZCgnYVwwYVwwYVwwYVwwXDBhYicsICdiJykgICAgLS0gbGFzdCBwb3NpdGlvbgorYXNzZXJ0KGEgPT0gMTEgYW5kIGIgPT0gMTEpCithc3NlcnQoc3RyaW5nLmZpbmQoJ2FcMGFcMGFcMGFcMFwwYWInLCAnYlwwJykgPT0gbmlsKSAgIC0tIGNoZWNrIGVuZGluZworYXNzZXJ0KHN0cmluZy5maW5kKCcnLCAnXDAnKSA9PSBuaWwpCithc3NlcnQoc3RyaW5nLmZpbmQoJ2FsbzEyM2FsbycsICcxMicpID09IDQpCithc3NlcnQoc3RyaW5nLmZpbmQoJ2FsbzEyM2FsbycsICdeMTInKSA9PSBuaWwpCisKK2Fzc2VydChzdHJpbmcubWF0Y2goImFhYWIiLCAiLipiIikgPT0gImFhYWIiKQorYXNzZXJ0KHN0cmluZy5tYXRjaCgiYWFhIiwgIi4qYSIpID09ICJhYWEiKQorYXNzZXJ0KHN0cmluZy5tYXRjaCgiYiIsICIuKmIiKSA9PSAiYiIpCisKK2Fzc2VydChzdHJpbmcubWF0Y2goImFhYWIiLCAiLitiIikgPT0gImFhYWIiKQorYXNzZXJ0KHN0cmluZy5tYXRjaCgiYWFhIiwgIi4rYSIpID09ICJhYWEiKQorYXNzZXJ0KG5vdCBzdHJpbmcubWF0Y2goImIiLCAiLitiIikpCisKK2Fzc2VydChzdHJpbmcubWF0Y2goImFhYWIiLCAiLj9iIikgPT0gImFiIikKK2Fzc2VydChzdHJpbmcubWF0Y2goImFhYSIsICIuP2EiKSA9PSAiYWEiKQorYXNzZXJ0KHN0cmluZy5tYXRjaCgiYiIsICIuP2IiKSA9PSAiYiIpCisKK2Fzc2VydChmKCdhbG9BTE8nLCAnJWwqJykgPT0gJ2FsbycpCithc3NlcnQoZignYUxvX0FMTycsICclYSonKSA9PSAnYUxvJykKKworYXNzZXJ0KGYoIiAgXG5cciomXG5cciAgIHh1eHUgIFxuXG4iLCAiJWclZyVnKyIpID09ICJ4dXh1IikKKworYXNzZXJ0KGYoJ2FhYWInLCAnYSonKSA9PSAnYWFhJyk7Cithc3NlcnQoZignYWFhJywgJ14uKiQnKSA9PSAnYWFhJyk7Cithc3NlcnQoZignYWFhJywgJ2IqJykgPT0gJycpOworYXNzZXJ0KGYoJ2FhYScsICdhYiphJykgPT0gJ2FhJykKK2Fzc2VydChmKCdhYmEnLCAnYWIqYScpID09ICdhYmEnKQorYXNzZXJ0KGYoJ2FhYWInLCAnYSsnKSA9PSAnYWFhJykKK2Fzc2VydChmKCdhYWEnLCAnXi4rJCcpID09ICdhYWEnKQorYXNzZXJ0KGYoJ2FhYScsICdiKycpID09IG5pbCkKK2Fzc2VydChmKCdhYWEnLCAnYWIrYScpID09IG5pbCkKK2Fzc2VydChmKCdhYmEnLCAnYWIrYScpID09ICdhYmEnKQorYXNzZXJ0KGYoJ2EkYScsICcuJCcpID09ICdhJykKK2Fzc2VydChmKCdhJGEnLCAnLiUkJykgPT0gJ2EkJykKK2Fzc2VydChmKCdhJGEnLCAnLiQuJykgPT0gJ2EkYScpCithc3NlcnQoZignYSRhJywgJyQkJykgPT0gbmlsKQorYXNzZXJ0KGYoJ2EkYicsICdhJCcpID09IG5pbCkKK2Fzc2VydChmKCdhJGEnLCAnJCcpID09ICcnKQorYXNzZXJ0KGYoJycsICdiKicpID09ICcnKQorYXNzZXJ0KGYoJ2FhYScsICdiYionKSA9PSBuaWwpCithc3NlcnQoZignYWFhYicsICdhLScpID09ICcnKQorYXNzZXJ0KGYoJ2FhYScsICdeLi0kJykgPT0gJ2FhYScpCithc3NlcnQoZignYWFiYWFhYmFhYWJhYWFiYScsICdiLipiJykgPT0gJ2JhYWFiYWFhYmFhYWInKQorYXNzZXJ0KGYoJ2FhYmFhYWJhYWFiYWFhYmEnLCAnYi4tYicpID09ICdiYWFhYicpCithc3NlcnQoZignYWxvIHhvJywgJy5vJCcpID09ICd4bycpCithc3NlcnQoZignIFxuIGlzdG8g6SBhc3NpbScsICclUyVTKicpID09ICdpc3RvJykKK2Fzc2VydChmKCcgXG4gaXN0byDpIGFzc2ltJywgJyVTKiQnKSA9PSAnYXNzaW0nKQorYXNzZXJ0KGYoJyBcbiBpc3RvIOkgYXNzaW0nLCAnW2Etel0qJCcpID09ICdhc3NpbScpCithc3NlcnQoZigndW0gY2FyYWN0ZXIgPyBleHRyYScsICdbXiVzYS16XScpID09ICc/JykKK2Fzc2VydChmKCcnLCAnYT8nKSA9PSAnJykKK2Fzc2VydChmKCfhJywgJ+E/JykgPT0gJ+EnKQorYXNzZXJ0KGYoJ+FibCcsICfhP2I/bD8nKSA9PSAn4WJsJykKK2Fzc2VydChmKCcgIOFibCcsICfhP2I/bD8nKSA9PSAnJykKK2Fzc2VydChmKCdhYScsICdeYWE/YT9hJykgPT0gJ2FhJykKK2Fzc2VydChmKCddXV3hYicsICdbXl1dJykgPT0gJ+EnKQorYXNzZXJ0KGYoIjBhbG8gYWxvIiwgIiV4KiIpID09ICIwYSIpCithc3NlcnQoZigiYWxvIGFsbyIsICIlQysiKSA9PSAiYWxvIGFsbyIpCitwcmludCgnKycpCisKKworZnVuY3Rpb24gZjEocywgcCkKKyAgcCA9IHN0cmluZy5nc3ViKHAsICIlJShbMC05XSkiLCBmdW5jdGlvbiAocykKKyAgICAgICAgcmV0dXJuICIlIiAuLiAodG9udW1iZXIocykrMSkKKyAgICAgICBlbmQpCisgIHAgPSBzdHJpbmcuZ3N1YihwLCAiXihePykiLCAiJTEoKSIsIDEpCisgIHAgPSBzdHJpbmcuZ3N1YihwLCAiKCQ/KSQiLCAiKCklMSIsIDEpCisgIGxvY2FsIHQgPSB7c3RyaW5nLm1hdGNoKHMsIHApfQorICByZXR1cm4gc3RyaW5nLnN1YihzLCB0WzFdLCB0WyN0XSAtIDEpCitlbmQKKworYXNzZXJ0KGYxKCdhbG8gYWx4IDEyMyBiXDBvIGJcMG8nLCAnKC4uKikgJTEnKSA9PSAiYlwwbyBiXDBvIikKK2Fzc2VydChmMSgnYXh6MTIzPSA0PSA0IDM0JywgJyguKyk9KC4qKT0lMiAlMScpID09ICczPSA0PSA0IDMnKQorYXNzZXJ0KGYxKCc9PT09PT09JywgJ14oPSopPSUxJCcpID09ICc9PT09PT09JykKK2Fzc2VydChzdHJpbmcubWF0Y2goJz09PT09PT09PT0nLCAnXihbPV0qKT0lMSQnKSA9PSBuaWwpCisKK2xvY2FsIGZ1bmN0aW9uIHJhbmdlIChpLCBqKQorICBpZiBpIDw9IGogdGhlbgorICAgIHJldHVybiBpLCByYW5nZShpKzEsIGopCisgIGVuZAorZW5kCisKK2xvY2FsIGFiYyA9IHN0cmluZy5jaGFyKHJhbmdlKDAsIDEyNykpIC4uIHN0cmluZy5jaGFyKHJhbmdlKDEyOCwgMjU1KSk7CisKK2Fzc2VydChzdHJpbmcubGVuKGFiYykgPT0gMjU2KQorCitmdW5jdGlvbiBzdHJzZXQgKHApCisgIGxvY2FsIHJlcyA9IHtzPScnfQorICBzdHJpbmcuZ3N1YihhYmMsIHAsIGZ1bmN0aW9uIChjKSByZXMucyA9IHJlcy5zIC4uIGMgZW5kKQorICByZXR1cm4gcmVzLnMKK2VuZDsKKworYXNzZXJ0KHN0cmluZy5sZW4oc3Ryc2V0KCdbXDIwMC1cMjEwXScpKSA9PSAxMSkKKworYXNzZXJ0KHN0cnNldCgnW2Etel0nKSA9PSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKQorYXNzZXJ0KHN0cnNldCgnW2EteiVkXScpID09IHN0cnNldCgnWyVkYS11dS16XScpKQorYXNzZXJ0KHN0cnNldCgnW2EtXScpID09ICItYSIpCithc3NlcnQoc3Ryc2V0KCdbXiVXXScpID09IHN0cnNldCgnWyV3XScpKQorYXNzZXJ0KHN0cnNldCgnW10lJV0nKSA9PSAnJV0nKQorYXNzZXJ0KHN0cnNldCgnW2ElLXpdJykgPT0gJy1heicpCithc3NlcnQoc3Ryc2V0KCdbJV4lWyUtYSVdJS1iXScpID09ICctW11eYWInKQorYXNzZXJ0KHN0cnNldCgnJVonKSA9PSBzdHJzZXQoJ1tcMS1cMjU1XScpKQorYXNzZXJ0KHN0cnNldCgnLicpID09IHN0cnNldCgnW1wxLVwyNTUlel0nKSkKK3ByaW50KCcrJyk7CisKK2Fzc2VydChzdHJpbmcubWF0Y2goImFsbyB4eXpLIiwgIigldyspSyIpID09ICJ4eXoiKQorYXNzZXJ0KHN0cmluZy5tYXRjaCgiMjU0IEsiLCAiKCVkKilLIikgPT0gIiIpCithc3NlcnQoc3RyaW5nLm1hdGNoKCJhbG8gIiwgIigldyopJCIpID09ICIiKQorYXNzZXJ0KHN0cmluZy5tYXRjaCgiYWxvICIsICIoJXcrKSQiKSA9PSBuaWwpCithc3NlcnQoc3RyaW5nLmZpbmQoIijhbG8pIiwgIiUo4SIpID09IDEpCitsb2NhbCBhLCBiLCBjLCBkLCBlID0gc3RyaW5nLm1hdGNoKCLibG8gYWxvIiwgIl4oKCguKS4pLiogKCV3KikpJCIpCithc3NlcnQoYSA9PSAn4mxvIGFsbycgYW5kIGIgPT0gJ+JsJyBhbmQgYyA9PSAn4icgYW5kIGQgPT0gJ2FsbycgYW5kIGUgPT0gbmlsKQorYSwgYiwgYywgZCAgPSBzdHJpbmcubWF0Y2goJzAxMjM0NTY3ODknLCAnKC4rKC4/KSgpKScpCithc3NlcnQoYSA9PSAnMDEyMzQ1Njc4OScgYW5kIGIgPT0gJycgYW5kIGMgPT0gMTEgYW5kIGQgPT0gbmlsKQorcHJpbnQoJysnKQorCithc3NlcnQoc3RyaW5nLmdzdWIoJ/xsbyD8bG8nLCAn/CcsICd4JykgPT0gJ3hsbyB4bG8nKQorYXNzZXJ0KHN0cmluZy5nc3ViKCdhbG8g+mxvICAnLCAnICskJywgJycpID09ICdhbG8g+mxvJykgIC0tIHRyaW0KK2Fzc2VydChzdHJpbmcuZ3N1YignICBhbG8gYWxvICAnLCAnXiVzKiguLSklcyokJywgJyUxJykgPT0gJ2FsbyBhbG8nKSAgLS0gZG91YmxlIHRyaW0KK2Fzc2VydChzdHJpbmcuZ3N1YignYWxvICBhbG8gIFxuIDEyM1xuICcsICclcysnLCAnICcpID09ICdhbG8gYWxvIDEyMyAnKQordCA9ICJhYucgZCIKK2EsIGIgPSBzdHJpbmcuZ3N1Yih0LCAnKC4pJywgJyUxQCcpCithc3NlcnQoJ0AnLi5hID09IHN0cmluZy5nc3ViKHQsICcnLCAnQCcpIGFuZCBiID09IDUpCithLCBiID0gc3RyaW5nLmdzdWIoJ2Fi52QnLCAnKC4pJywgJyUwQCcsIDIpCithc3NlcnQoYSA9PSAnYUBiQOdkJyBhbmQgYiA9PSAyKQorYXNzZXJ0KHN0cmluZy5nc3ViKCdhbG8gYWxvJywgJygpW2FsXScsICclMScpID09ICcxMm8gNTZvJykKK2Fzc2VydChzdHJpbmcuZ3N1YigiYWJjPXh5eiIsICIoJXcqKSglcCkoJXcrKSIsICIlMyUyJTEtJTAiKSA9PQorICAgICAgICAgICAgICAieHl6PWFiYy1hYmM9eHl6IikKK2Fzc2VydChzdHJpbmcuZ3N1YigiYWJjIiwgIiV3IiwgIiUxJTAiKSA9PSAiYWFiYmNjIikKK2Fzc2VydChzdHJpbmcuZ3N1YigiYWJjIiwgIiV3KyIsICIlMCUxIikgPT0gImFiY2FiYyIpCithc3NlcnQoc3RyaW5nLmdzdWIoJ+Hp7ScsICckJywgJ1ww8/onKSA9PSAn4entXDDz+icpCithc3NlcnQoc3RyaW5nLmdzdWIoJycsICdeJywgJ3InKSA9PSAncicpCithc3NlcnQoc3RyaW5nLmdzdWIoJycsICckJywgJ3InKSA9PSAncicpCitwcmludCgnKycpCisKKworZG8gICAtLSBuZXcgKDUuMy4zKSBzZW1hbnRpY3MgZm9yIGVtcHR5IG1hdGNoZXMKKyAgYXNzZXJ0KHN0cmluZy5nc3ViKCJhIGIgY2QiLCAiICoiLCAiLSIpID09ICItYS1iLWMtZC0iKQorCisgIGxvY2FsIHJlcyA9ICIiCisgIGxvY2FsIHN1YiA9ICJhICBcbmJjXHRcdGQiCisgIGxvY2FsIGkgPSAxCisgIGZvciBwLCBlIGluIHN0cmluZy5nbWF0Y2goc3ViLCAiKCklcyooKSIpIGRvCisgICAgcmVzID0gcmVzIC4uIHN0cmluZy5zdWIoc3ViLCBpLCBwIC0gMSkgLi4gIi0iCisgICAgaSA9IGUKKyAgZW5kCisgIGFzc2VydChyZXMgPT0gIi1hLWItYy1kLSIpCitlbmQKKworCithc3NlcnQoc3RyaW5nLmdzdWIoInVtIChkb2lzKSB0cmVzIChxdWF0cm8pIiwgIiglKCV3KyUpKSIsIHN0cmluZy51cHBlcikgPT0KKyAgICAgICAgICAgICJ1bSAoRE9JUykgdHJlcyAoUVVBVFJPKSIpCisKK2RvCisgIGxvY2FsIGZ1bmN0aW9uIHNldGdsb2JhbCAobix2KSByYXdzZXQoX0csIG4sIHYpIGVuZAorICBzdHJpbmcuZ3N1YigiYT1yb2JlcnRvLHJvYmVydG89YSIsICIoJXcrKT0oJXcldyopIiwgc2V0Z2xvYmFsKQorICBhc3NlcnQoX0cuYT09InJvYmVydG8iIGFuZCBfRy5yb2JlcnRvPT0iYSIpCitlbmQKKworZnVuY3Rpb24gZihhLGIpIHJldHVybiBzdHJpbmcuZ3N1YihhLCcuJyxiKSBlbmQKK2Fzc2VydChzdHJpbmcuZ3N1YigidHJvY2FyIHR1ZG8gZW0gfHRlc3RlfGJ8IOkgfGJlbGV6YXxhbHwiLCAifChbXnxdKil8KFtefF0qKXwiLCBmKSA9PQorICAgICAgICAgICAgInRyb2NhciB0dWRvIGVtIGJiYmJiIOkgYWxhbGFsYWxhbGFsIikKKworbG9jYWwgZnVuY3Rpb24gZG9zdHJpbmcgKHMpIHJldHVybiBsb2FkKHMsICIiKSgpIG9yICIiIGVuZAorYXNzZXJ0KHN0cmluZy5nc3ViKCJhbG8gJGE9J3gnJCBub3ZhbWVudGUgJHJldHVybiBhJCIsCisgICAgICAgICAgICAgICAgICAgIiQoW14kXSopJSQiLAorICAgICAgICAgICAgICAgICAgIGRvc3RyaW5nKSA9PSAiYWxvICBub3ZhbWVudGUgeCIpCisKK3ggPSBzdHJpbmcuZ3N1YigiJHg9c3RyaW5nLmdzdWIoJ2FsbycsICcuJywgc3RyaW5nLnVwcGVyKSQgYXNzaW0gdmFpIHBhcmEgJHJldHVybiB4JCIsCisgICAgICAgICAiJChbXiRdKiklJCIsIGRvc3RyaW5nKQorYXNzZXJ0KHggPT0gJyBhc3NpbSB2YWkgcGFyYSBBTE8nKQorCit0ID0ge30KK3MgPSAnYSBhbG8gam9zZSAgam9hbycKK3IgPSBzdHJpbmcuZ3N1YihzLCAnKCkoJXcrKSgpJywgZnVuY3Rpb24gKGEsdyxiKQorICAgICAgYXNzZXJ0KHN0cmluZy5sZW4odykgPT0gYi1hKTsKKyAgICAgIHRbYV0gPSBiLWE7CisgICAgZW5kKQorYXNzZXJ0KHMgPT0gciBhbmQgdFsxXSA9PSAxIGFuZCB0WzNdID09IDMgYW5kIHRbN10gPT0gNCBhbmQgdFsxM10gPT0gNCkKKworCitmdW5jdGlvbiBpc2JhbGFuY2VkIChzKQorICByZXR1cm4gc3RyaW5nLmZpbmQoc3RyaW5nLmdzdWIocywgIiViKCkiLCAiIiksICJbKCldIikgPT0gbmlsCitlbmQKKworYXNzZXJ0KGlzYmFsYW5jZWQoIig5ICgoOCkpKFwwKSA3KSBcMFwwIGEgYiAoKShjKSgpIGEiKSkKK2Fzc2VydChub3QgaXNiYWxhbmNlZCgiKDkgKCg4KSA3KSBhIGIgKFwwIGMpIGEiKSkKK2Fzc2VydChzdHJpbmcuZ3N1YigiYWxvICdvaScgYWxvIiwgIiViJyciLCAnIicpID09ICdhbG8gIiBhbG8nKQorCisKK2xvY2FsIHQgPSB7ImFwcGxlIiwgIm9yYW5nZSIsICJsaW1lIjsgbj0wfQorYXNzZXJ0KHN0cmluZy5nc3ViKCJ4IGFuZCB4IGFuZCB4IiwgIngiLCBmdW5jdGlvbiAoKSB0Lm49dC5uKzE7IHJldHVybiB0W3Qubl0gZW5kKQorICAgICAgICA9PSAiYXBwbGUgYW5kIG9yYW5nZSBhbmQgbGltZSIpCisKK3QgPSB7bj0wfQorc3RyaW5nLmdzdWIoImZpcnN0IHNlY29uZCB3b3JkIiwgIiV3JXcqIiwgZnVuY3Rpb24gKHcpIHQubj10Lm4rMTsgdFt0Lm5dID0gdyBlbmQpCithc3NlcnQodFsxXSA9PSAiZmlyc3QiIGFuZCB0WzJdID09ICJzZWNvbmQiIGFuZCB0WzNdID09ICJ3b3JkIiBhbmQgdC5uID09IDMpCisKK3QgPSB7bj0wfQorYXNzZXJ0KHN0cmluZy5nc3ViKCJmaXJzdCBzZWNvbmQgd29yZCIsICIldysiLAorICAgICAgICAgZnVuY3Rpb24gKHcpIHQubj10Lm4rMTsgdFt0Lm5dID0gdyBlbmQsIDIpID09ICJmaXJzdCBzZWNvbmQgd29yZCIpCithc3NlcnQodFsxXSA9PSAiZmlyc3QiIGFuZCB0WzJdID09ICJzZWNvbmQiIGFuZCB0WzNdID09IHVuZGVmKQorCitjaGVja2Vycm9yKCJpbnZhbGlkIHJlcGxhY2VtZW50IHZhbHVlICUoYSB0YWJsZSUpIiwKKyAgICAgICAgICAgIHN0cmluZy5nc3ViLCAiYWxvIiwgIi4iLCB7YSA9IHt9fSkKK2NoZWNrZXJyb3IoImludmFsaWQgY2FwdHVyZSBpbmRleCAlJTIiLCBzdHJpbmcuZ3N1YiwgImFsbyIsICIuIiwgIiUyIikKK2NoZWNrZXJyb3IoImludmFsaWQgY2FwdHVyZSBpbmRleCAlJTAiLCBzdHJpbmcuZ3N1YiwgImFsbyIsICIoJTApIiwgImEiKQorY2hlY2tlcnJvcigiaW52YWxpZCBjYXB0dXJlIGluZGV4ICUlMSIsIHN0cmluZy5nc3ViLCAiYWxvIiwgIiglMSkiLCAiYSIpCitjaGVja2Vycm9yKCJpbnZhbGlkIHVzZSBvZiAnJSUnIiwgc3RyaW5nLmdzdWIsICJhbG8iLCAiLiIsICIleCIpCisKKy0tIGJ1ZyBzaW5jZSAyLjUgKEMtc3RhY2sgb3ZlcmZsb3cpCitkbworICBsb2NhbCBmdW5jdGlvbiBmIChzaXplKQorICAgIGxvY2FsIHMgPSBzdHJpbmcucmVwKCJhIiwgc2l6ZSkKKyAgICBsb2NhbCBwID0gc3RyaW5nLnJlcCgiLj8iLCBzaXplKQorICAgIHJldHVybiBwY2FsbChzdHJpbmcubWF0Y2gsIHMsIHApCisgIGVuZAorICBsb2NhbCByLCBtID0gZig4MCkKKyAgYXNzZXJ0KHIgYW5kICNtID09IDgwKQorICByLCBtID0gZigyMDAwMDApCisgIGFzc2VydChub3QgciBhbmQgc3RyaW5nLmZpbmQobSwgInRvbyBjb21wbGV4IikpCitlbmQKKworaWYgbm90IF9zb2Z0IHRoZW4KKyAgcHJpbnQoImJpZyBzdHJpbmdzIikKKyAgbG9jYWwgYSA9IHN0cmluZy5yZXAoJ2EnLCAzMDAwMDApCisgIGFzc2VydChzdHJpbmcuZmluZChhLCAnXmEqLj8kJykpCisgIGFzc2VydChub3Qgc3RyaW5nLmZpbmQoYSwgJ15hKi4/YiQnKSkKKyAgYXNzZXJ0KHN0cmluZy5maW5kKGEsICdeYS0uPyQnKSkKKworICAtLSBidWcgaW4gNS4xLjIKKyAgYSA9IHN0cmluZy5yZXAoJ2EnLCAxMDAwMCkgLi4gc3RyaW5nLnJlcCgnYicsIDEwMDAwKQorICBhc3NlcnQobm90IHBjYWxsKHN0cmluZy5nc3ViLCBhLCAnYicpKQorZW5kCisKKy0tIHJlY3Vyc2l2ZSBuZXN0IG9mIGdzdWJzCitmdW5jdGlvbiByZXYgKHMpCisgIHJldHVybiBzdHJpbmcuZ3N1YihzLCAiKC4pKC4rKSIsIGZ1bmN0aW9uIChjLHMxKSByZXR1cm4gcmV2KHMxKS4uYyBlbmQpCitlbmQKKworbG9jYWwgeCA9ICJhYmNkZWYiCithc3NlcnQocmV2KHJldih4KSkgPT0geCkKKworCistLSBnc3ViIHdpdGggdGFibGVzCithc3NlcnQoc3RyaW5nLmdzdWIoImFsbyBhbG8iLCAiLiIsIHt9KSA9PSAiYWxvIGFsbyIpCithc3NlcnQoc3RyaW5nLmdzdWIoImFsbyBhbG8iLCAiKC4pIiwge2E9IkFBIiwgbD0iIn0pID09ICJBQW8gQUFvIikKK2Fzc2VydChzdHJpbmcuZ3N1YigiYWxvIGFsbyIsICIoLikuIiwge2E9IkFBIiwgbD0iSyJ9KSA9PSAiQUFvIEFBbyIpCithc3NlcnQoc3RyaW5nLmdzdWIoImFsbyBhbG8iLCAiKCguKSguPykpIiwge2FsPSJBQSIsIG89ZmFsc2V9KSA9PSAiQUFvIEFBbyIpCisKK2Fzc2VydChzdHJpbmcuZ3N1YigiYWxvIGFsbyIsICIoKS4iLCB7J3gnLCd5eScsJ3p6eid9KSA9PSAieHl5enp6IGFsbyIpCisKK3QgPSB7fTsgc2V0bWV0YXRhYmxlKHQsIHtfX2luZGV4ID0gZnVuY3Rpb24gKHQscykgcmV0dXJuIHN0cmluZy51cHBlcihzKSBlbmR9KQorYXNzZXJ0KHN0cmluZy5nc3ViKCJhIGFsbyBiIGhpIiwgIiV3JXcrIiwgdCkgPT0gImEgQUxPIGIgSEkiKQorCisKKy0tIHRlc3RzIGZvciBnbWF0Y2gKK2xvY2FsIGEgPSAwCitmb3IgaSBpbiBzdHJpbmcuZ21hdGNoKCdhYmNkZScsICcoKScpIGRvIGFzc2VydChpID09IGErMSk7IGE9aSBlbmQKK2Fzc2VydChhPT02KQorCit0ID0ge249MH0KK2ZvciB3IGluIHN0cmluZy5nbWF0Y2goImZpcnN0IHNlY29uZCB3b3JkIiwgIiV3KyIpIGRvCisgICAgICB0Lm49dC5uKzE7IHRbdC5uXSA9IHcKK2VuZAorYXNzZXJ0KHRbMV0gPT0gImZpcnN0IiBhbmQgdFsyXSA9PSAic2Vjb25kIiBhbmQgdFszXSA9PSAid29yZCIpCisKK3QgPSB7MywgNiwgOX0KK2ZvciBpIGluIHN0cmluZy5nbWF0Y2ggKCJ4dXh4IHV1IHBwYXIgciIsICIoKSguKSUyIikgZG8KKyAgYXNzZXJ0KGkgPT0gdGFibGUucmVtb3ZlKHQsIDEpKQorZW5kCithc3NlcnQoI3QgPT0gMCkKKwordCA9IHt9Citmb3IgaSxqIGluIHN0cmluZy5nbWF0Y2goIjEzIDE0IDEwID0gMTEsIDE1PSAxNiwgMjI9MjMiLCAiKCVkKyklcyo9JXMqKCVkKykiKSBkbworICB0W3RvbnVtYmVyKGkpXSA9IHRvbnVtYmVyKGopCitlbmQKK2EgPSAwCitmb3Igayx2IGluIHBhaXJzKHQpIGRvIGFzc2VydChrKzEgPT0gdiswKTsgYT1hKzEgZW5kCithc3NlcnQoYSA9PSAzKQorCisKKy0tIHRlc3RzIGZvciBgJWYnIChgZnJvbnRpZXJzJykKKworYXNzZXJ0KHN0cmluZy5nc3ViKCJhYWEgYWEgYSBhYWEgYSIsICIlZlsld11hIiwgIngiKSA9PSAieGFhIHhhIHggeGFhIHgiKQorYXNzZXJ0KHN0cmluZy5nc3ViKCJbW11dIFtdW10gW1tbWyIsICIlZltbXS4iLCAieCIpID09ICJ4W11dIHhdeF0geFtbWyIpCithc3NlcnQoc3RyaW5nLmdzdWIoIjAxYWJjNDVkZTMiLCAiJWZbJWRdIiwgIi4iKSA9PSAiLjAxYWJjLjQ1ZGUuMyIpCithc3NlcnQoc3RyaW5nLmdzdWIoIjAxYWJjNDUgZGUzeCIsICIlZlslRF0ldyIsICIuIikgPT0gIjAxLmJjNDUgZGUzLiIpCithc3NlcnQoc3RyaW5nLmdzdWIoImZ1bmN0aW9uIiwgIiVmW1wxLVwyNTVdJXciLCAiLiIpID09ICIudW5jdGlvbiIpCithc3NlcnQoc3RyaW5nLmdzdWIoImZ1bmN0aW9uIiwgIiVmW15cMS1cMjU1XSIsICIuIikgPT0gImZ1bmN0aW9uLiIpCisKK2Fzc2VydChzdHJpbmcuZmluZCgiYSIsICIlZlthXSIpID09IDEpCithc3NlcnQoc3RyaW5nLmZpbmQoImEiLCAiJWZbXiV6XSIpID09IDEpCithc3NlcnQoc3RyaW5nLmZpbmQoImEiLCAiJWZbXiVsXSIpID09IDIpCithc3NlcnQoc3RyaW5nLmZpbmQoImFiYSIsICIlZlthJXpdIikgPT0gMykKK2Fzc2VydChzdHJpbmcuZmluZCgiYWJhIiwgIiVmWyV6XSIpID09IDQpCithc3NlcnQobm90IHN0cmluZy5maW5kKCJhYmEiLCAiJWZbJWwlel0iKSkKK2Fzc2VydChub3Qgc3RyaW5nLmZpbmQoImFiYSIsICIlZlteJWwlel0iKSkKKworbG9jYWwgaSwgZSA9IHN0cmluZy5maW5kKCIgYWxvIGFhbG8gYWxsbyIsICIlZlslU10uLSVmWyVzXS4tJWZbJVNdIikKK2Fzc2VydChpID09IDIgYW5kIGUgPT0gNSkKK2xvY2FsIGsgPSBzdHJpbmcubWF0Y2goIiBhbG8gYWFsbyBhbGxvIiwgIiVmWyVTXSguLSVmWyVzXS4tJWZbJVNdKSIpCithc3NlcnQoayA9PSAnYWxvICcpCisKK2xvY2FsIGEgPSB7MSwgNSwgOSwgMTQsIDE3LH0KK2ZvciBrIGluIHN0cmluZy5nbWF0Y2goImFsbyBhbG8gdGgwMiBpcyAxaGF0IiwgIigpJWZbJXclZF0iKSBkbworICBhc3NlcnQodGFibGUucmVtb3ZlKGEsIDEpID09IGspCitlbmQKK2Fzc2VydCgjYSA9PSAwKQorCisKKy0tIG1hbGZvcm1lZCBwYXR0ZXJucworbG9jYWwgZnVuY3Rpb24gbWFsZm9ybSAocCwgbSkKKyAgbSA9IG0gb3IgIm1hbGZvcm1lZCIKKyAgbG9jYWwgciwgbXNnID0gcGNhbGwoc3RyaW5nLmZpbmQsICJhIiwgcCkKKyAgYXNzZXJ0KG5vdCByIGFuZCBzdHJpbmcuZmluZChtc2csIG0pKQorZW5kCisKK21hbGZvcm0oIiguIiwgInVuZmluaXNoZWQgY2FwdHVyZSIpCittYWxmb3JtKCIuKSIsICJpbnZhbGlkIHBhdHRlcm4gY2FwdHVyZSIpCittYWxmb3JtKCJbYSIpCittYWxmb3JtKCJbXSIpCittYWxmb3JtKCJbXl0iKQorbWFsZm9ybSgiW2ElXSIpCittYWxmb3JtKCJbYSUiKQorbWFsZm9ybSgiJWIiKQorbWFsZm9ybSgiJWJhIikKK21hbGZvcm0oIiUiKQorbWFsZm9ybSgiJWYiLCAibWlzc2luZyIpCisKKy0tIFwwIGluIHBhdHRlcm5zCithc3NlcnQoc3RyaW5nLm1hdGNoKCJhYlwwXDFcMmMiLCAiW1wwLVwyXSsiKSA9PSAiXDBcMVwyIikKK2Fzc2VydChzdHJpbmcubWF0Y2goImFiXDBcMVwyYyIsICJbXDAtXDBdKyIpID09ICJcMCIpCithc3NlcnQoc3RyaW5nLmZpbmQoImIkYSIsICIkXDA/IikgPT0gMikKK2Fzc2VydChzdHJpbmcuZmluZCgiYWJjXDBlZmciLCAiJVwwIikgPT0gNCkKK2Fzc2VydChzdHJpbmcubWF0Y2goImFiY1wwZWZnXDBcMWVcMWciLCAiJWJcMFwxIikgPT0gIlwwZWZnXDBcMWVcMSIpCithc3NlcnQoc3RyaW5nLm1hdGNoKCJhYmNcMFwwXDAiLCAiJVwwKyIpID09ICJcMFwwXDAiKQorYXNzZXJ0KHN0cmluZy5tYXRjaCgiYWJjXDBcMFwwIiwgIiVcMCVcMD8iKSA9PSAiXDBcMCIpCisKKy0tIG1hZ2ljIGNoYXIgYWZ0ZXIgXDAKK2Fzc2VydChzdHJpbmcuZmluZCgiYWJjXDBcMCIsIlwwLiIpID09IDQpCithc3NlcnQoc3RyaW5nLmZpbmQoImFiY3hcMFwwYWJjXDBhYmMiLCJ4XDBcMGFiY1wwYS4iKSA9PSA0KQorCitwcmludCgnT0snKQorCmRpZmYgLS1naXQgYS90ZXN0ZXMvc29ydC5sdWEgYi90ZXN0ZXMvc29ydC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViOWI3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy9zb3J0Lmx1YQpAQCAtMCwwICsxLDMxMCBAQAorLS0gJElkOiBzb3J0Lmx1YSx2IDEuMzkgMjAxOC8wMy8xMiAxMzo1MTowMiByb2JlcnRvIEV4cCAkCistLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBmaWxlIGFsbC5sdWEKKworcHJpbnQgInRlc3RpbmcgKHBhcnRzIG9mKSB0YWJsZSBsaWJyYXJ5IgorCitwcmludCAidGVzdGluZyB1bnBhY2siCisKK2xvY2FsIHVucGFjayA9IHRhYmxlLnVucGFjaworCitsb2NhbCBtYXhJID0gbWF0aC5tYXhpbnRlZ2VyCitsb2NhbCBtaW5JID0gbWF0aC5taW5pbnRlZ2VyCisKKworbG9jYWwgZnVuY3Rpb24gY2hlY2tlcnJvciAobXNnLCBmLCAuLi4pCisgIGxvY2FsIHMsIGVyciA9IHBjYWxsKGYsIC4uLikKKyAgYXNzZXJ0KG5vdCBzIGFuZCBzdHJpbmcuZmluZChlcnIsIG1zZykpCitlbmQKKworCitjaGVja2Vycm9yKCJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIiwgdGFibGUuaW5zZXJ0LCB7fSwgMiwgMywgNCkKKworbG9jYWwgeCx5LHosYSxuCithID0ge307IGxpbSA9IF9zb2Z0IGFuZCAyMDAgb3IgMjAwMAorZm9yIGk9MSwgbGltIGRvIGFbaV09aSBlbmQKK2Fzc2VydChzZWxlY3QobGltLCB1bnBhY2soYSkpID09IGxpbSBhbmQgc2VsZWN0KCcjJywgdW5wYWNrKGEpKSA9PSBsaW0pCit4ID0gdW5wYWNrKGEpCithc3NlcnQoeCA9PSAxKQoreCA9IHt1bnBhY2soYSl9Cithc3NlcnQoI3ggPT0gbGltIGFuZCB4WzFdID09IDEgYW5kIHhbbGltXSA9PSBsaW0pCit4ID0ge3VucGFjayhhLCBsaW0tMil9Cithc3NlcnQoI3ggPT0gMyBhbmQgeFsxXSA9PSBsaW0tMiBhbmQgeFszXSA9PSBsaW0pCit4ID0ge3VucGFjayhhLCAxMCwgNil9Cithc3NlcnQobmV4dCh4KSA9PSBuaWwpICAgLS0gbm8gZWxlbWVudHMKK3ggPSB7dW5wYWNrKGEsIDExLCAxMCl9Cithc3NlcnQobmV4dCh4KSA9PSBuaWwpICAgLS0gbm8gZWxlbWVudHMKK3gseSA9IHVucGFjayhhLCAxMCwgMTApCithc3NlcnQoeCA9PSAxMCBhbmQgeSA9PSBuaWwpCit4LHkseiA9IHVucGFjayhhLCAxMCwgMTEpCithc3NlcnQoeCA9PSAxMCBhbmQgeSA9PSAxMSBhbmQgeiA9PSBuaWwpCithLHggPSB1bnBhY2t7MX0KK2Fzc2VydChhPT0xIGFuZCB4PT1uaWwpCithLHggPSB1bnBhY2soezEsMn0sIDEsIDEpCithc3NlcnQoYT09MSBhbmQgeD09bmlsKQorCitkbworICBsb2NhbCBtYXhpID0gKDEgPDwgMzEpIC0gMSAgICAgICAgICAtLSBtYXhpbXVtIHZhbHVlIGZvciBhbiBpbnQgKHVzdWFsbHkpCisgIGxvY2FsIG1pbmkgPSAtKDEgPDwgMzEpICAgICAgICAgICAgIC0tIG1pbmltdW0gdmFsdWUgZm9yIGFuIGludCAodXN1YWxseSkKKyAgY2hlY2tlcnJvcigidG9vIG1hbnkgcmVzdWx0cyIsIHVucGFjaywge30sIDAsIG1heGkpCisgIGNoZWNrZXJyb3IoInRvbyBtYW55IHJlc3VsdHMiLCB1bnBhY2ssIHt9LCAxLCBtYXhpKQorICBjaGVja2Vycm9yKCJ0b28gbWFueSByZXN1bHRzIiwgdW5wYWNrLCB7fSwgMCwgbWF4SSkKKyAgY2hlY2tlcnJvcigidG9vIG1hbnkgcmVzdWx0cyIsIHVucGFjaywge30sIDEsIG1heEkpCisgIGNoZWNrZXJyb3IoInRvbyBtYW55IHJlc3VsdHMiLCB1bnBhY2ssIHt9LCBtaW5pLCBtYXhpKQorICBjaGVja2Vycm9yKCJ0b28gbWFueSByZXN1bHRzIiwgdW5wYWNrLCB7fSwgLW1heGksIG1heGkpCisgIGNoZWNrZXJyb3IoInRvbyBtYW55IHJlc3VsdHMiLCB1bnBhY2ssIHt9LCBtaW5JLCBtYXhJKQorICB1bnBhY2soe30sIG1heGksIDApCisgIHVucGFjayh7fSwgbWF4aSwgMSkKKyAgdW5wYWNrKHt9LCBtYXhJLCBtaW5JKQorICBwY2FsbCh1bnBhY2ssIHt9LCAxLCBtYXhpICsgMSkKKyAgbG9jYWwgYSwgYiA9IHVucGFjayh7W21heGldID0gMjB9LCBtYXhpLCBtYXhpKQorICBhc3NlcnQoYSA9PSAyMCBhbmQgYiA9PSBuaWwpCisgIGEsIGIgPSB1bnBhY2soe1ttYXhpXSA9IDIwfSwgbWF4aSAtIDEsIG1heGkpCisgIGFzc2VydChhID09IG5pbCBhbmQgYiA9PSAyMCkKKyAgbG9jYWwgdCA9IHtbbWF4SSAtIDFdID0gMTIsIFttYXhJXSA9IDIzfQorICBhLCBiID0gdW5wYWNrKHQsIG1heEkgLSAxLCBtYXhJKTsgYXNzZXJ0KGEgPT0gMTIgYW5kIGIgPT0gMjMpCisgIGEsIGIgPSB1bnBhY2sodCwgbWF4SSwgbWF4SSk7IGFzc2VydChhID09IDIzIGFuZCBiID09IG5pbCkKKyAgYSwgYiA9IHVucGFjayh0LCBtYXhJLCBtYXhJIC0gMSk7IGFzc2VydChhID09IG5pbCBhbmQgYiA9PSBuaWwpCisgIHQgPSB7W21pbkldID0gMTIuMywgW21pbkkgKyAxXSA9IDIzLjV9CisgIGEsIGIgPSB1bnBhY2sodCwgbWluSSwgbWluSSArIDEpOyBhc3NlcnQoYSA9PSAxMi4zIGFuZCBiID09IDIzLjUpCisgIGEsIGIgPSB1bnBhY2sodCwgbWluSSwgbWluSSk7IGFzc2VydChhID09IDEyLjMgYW5kIGIgPT0gbmlsKQorICBhLCBiID0gdW5wYWNrKHQsIG1pbkkgKyAxLCBtaW5JKTsgYXNzZXJ0KGEgPT0gbmlsIGFuZCBiID09IG5pbCkKK2VuZAorCitkbyAgIC0tIGxlbmd0aCBpcyBub3QgYW4gaW50ZWdlcgorICBsb2NhbCB0ID0gc2V0bWV0YXRhYmxlKHt9LCB7X19sZW4gPSBmdW5jdGlvbiAoKSByZXR1cm4gJ2FiYycgZW5kfSkKKyAgYXNzZXJ0KCN0ID09ICdhYmMnKQorICBjaGVja2Vycm9yKCJvYmplY3QgbGVuZ3RoIGlzIG5vdCBhbiBpbnRlZ2VyIiwgdGFibGUuaW5zZXJ0LCB0LCAxKQorZW5kCisKK3ByaW50ICJ0ZXN0aW5nIHBhY2siCisKK2EgPSB0YWJsZS5wYWNrKCkKK2Fzc2VydChhWzFdID09IHVuZGVmIGFuZCBhLm4gPT0gMCkgCisKK2EgPSB0YWJsZS5wYWNrKHRhYmxlKQorYXNzZXJ0KGFbMV0gPT0gdGFibGUgYW5kIGEubiA9PSAxKQorCithID0gdGFibGUucGFjayhuaWwsIG5pbCwgbmlsLCBuaWwpCithc3NlcnQoYVsxXSA9PSBuaWwgYW5kIGEubiA9PSA0KQorCisKKy0tIHRlc3RpbmcgbW92ZQorZG8KKworICBjaGVja2Vycm9yKCJ0YWJsZSBleHBlY3RlZCIsIHRhYmxlLm1vdmUsIDEsIDIsIDMsIDQpCisKKyAgbG9jYWwgZnVuY3Rpb24gZXFUIChhLCBiKQorICAgIGZvciBrLCB2IGluIHBhaXJzKGEpIGRvIGFzc2VydChiW2tdID09IHYpIGVuZCAKKyAgICBmb3IgaywgdiBpbiBwYWlycyhiKSBkbyBhc3NlcnQoYVtrXSA9PSB2KSBlbmQgCisgIGVuZAorCisgIGxvY2FsIGEgPSB0YWJsZS5tb3ZlKHsxMCwyMCwzMH0sIDEsIDMsIDIpICAtLSBtb3ZlIGZvcndhcmQKKyAgZXFUKGEsIHsxMCwxMCwyMCwzMH0pCisKKyAgLS0gbW92ZSBmb3J3YXJkIHdpdGggb3ZlcmxhcCBvZiAxCisgIGEgPSB0YWJsZS5tb3ZlKHsxMCwgMjAsIDMwfSwgMSwgMywgMykKKyAgZXFUKGEsIHsxMCwgMjAsIDEwLCAyMCwgMzB9KQorCisgIC0tIG1vdmluZyB0byB0aGUgc2FtZSB0YWJsZSAobm90IGJlaW5nIGV4cGxpY2l0IGFib3V0IGl0KQorICBhID0gezEwLCAyMCwgMzAsIDQwfQorICB0YWJsZS5tb3ZlKGEsIDEsIDQsIDIsIGEpCisgIGVxVChhLCB7MTAsIDEwLCAyMCwgMzAsIDQwfSkKKworICBhID0gdGFibGUubW92ZSh7MTAsMjAsMzB9LCAyLCAzLCAxKSAgIC0tIG1vdmUgYmFja3dhcmQKKyAgZXFUKGEsIHsyMCwzMCwzMH0pCisKKyAgYSA9IHt9ICAgLS0gbW92ZSB0byBuZXcgdGFibGUKKyAgYXNzZXJ0KHRhYmxlLm1vdmUoezEwLDIwLDMwfSwgMSwgMywgMSwgYSkgPT0gYSkKKyAgZXFUKGEsIHsxMCwyMCwzMH0pCisKKyAgYSA9IHt9CisgIGFzc2VydCh0YWJsZS5tb3ZlKHsxMCwyMCwzMH0sIDEsIDAsIDMsIGEpID09IGEpICAtLSBlbXB0eSBtb3ZlIChubyBtb3ZlKQorICBlcVQoYSwge30pCisKKyAgYSA9IHRhYmxlLm1vdmUoezEwLDIwLDMwfSwgMSwgMTAsIDEpICAgLS0gbW92ZSB0byB0aGUgc2FtZSBwbGFjZQorICBlcVQoYSwgezEwLDIwLDMwfSkKKworICAtLSBtb3Zpbmcgb24gdGhlIGZyaW5nZXMKKyAgYSA9IHRhYmxlLm1vdmUoe1ttYXhJIC0gMl0gPSAxLCBbbWF4SSAtIDFdID0gMiwgW21heEldID0gM30sCisgICAgICAgICAgICAgICAgIG1heEkgLSAyLCBtYXhJLCAtMTAsIHt9KQorICBlcVQoYSwge1stMTBdID0gMSwgWy05XSA9IDIsIFstOF0gPSAzfSkKKworICBhID0gdGFibGUubW92ZSh7W21pbkldID0gMSwgW21pbkkgKyAxXSA9IDIsIFttaW5JICsgMl0gPSAzfSwKKyAgICAgICAgICAgICAgICAgbWluSSwgbWluSSArIDIsIC0xMCwge30pCisgIGVxVChhLCB7Wy0xMF0gPSAxLCBbLTldID0gMiwgWy04XSA9IDN9KQorCisgIGEgPSB0YWJsZS5tb3ZlKHs0NX0sIDEsIDEsIG1heEkpCisgIGVxVChhLCB7NDUsIFttYXhJXSA9IDQ1fSkKKworICBhID0gdGFibGUubW92ZSh7W21heEldID0gMTAwfSwgbWF4SSwgbWF4SSwgbWluSSkKKyAgZXFUKGEsIHtbbWluSV0gPSAxMDAsIFttYXhJXSA9IDEwMH0pCisKKyAgYSA9IHRhYmxlLm1vdmUoe1ttaW5JXSA9IDEwMH0sIG1pbkksIG1pbkksIG1heEkpCisgIGVxVChhLCB7W21pbkldID0gMTAwLCBbbWF4SV0gPSAxMDB9KQorCisgIGEgPSBzZXRtZXRhdGFibGUoe30sIHsKKyAgICAgICAgX19pbmRleCA9IGZ1bmN0aW9uIChfLGspIHJldHVybiBrICogMTAgZW5kLAorICAgICAgICBfX25ld2luZGV4ID0gZXJyb3J9KQorICBsb2NhbCBiID0gdGFibGUubW92ZShhLCAxLCAxMCwgMywge30pCisgIGVxVChhLCB7fSkKKyAgZXFUKGIsIHtuaWwsbmlsLDEwLDIwLDMwLDQwLDUwLDYwLDcwLDgwLDkwLDEwMH0pCisKKyAgYiA9IHNldG1ldGF0YWJsZSh7IiJ9LCB7CisgICAgICAgIF9faW5kZXggPSBlcnJvciwKKyAgICAgICAgX19uZXdpbmRleCA9IGZ1bmN0aW9uICh0LGssdikKKyAgICAgICAgICB0WzFdID0gc3RyaW5nLmZvcm1hdCgiJXMoJWQsJWQpIiwgdFsxXSwgaywgdikKKyAgICAgIGVuZH0pCisgIHRhYmxlLm1vdmUoYSwgMTAsIDEzLCAzLCBiKQorICBhc3NlcnQoYlsxXSA9PSAiKDMsMTAwKSg0LDExMCkoNSwxMjApKDYsMTMwKSIpCisgIGxvY2FsIHN0YXQsIG1zZyA9IHBjYWxsKHRhYmxlLm1vdmUsIGIsIDEwLCAxMywgMywgYikKKyAgYXNzZXJ0KG5vdCBzdGF0IGFuZCBtc2cgPT0gYikKK2VuZAorCitkbworICAtLSBmb3IgdmVyeSBsb25nIG1vdmVzLCBqdXN0IGNoZWNrIGluaXRpYWwgYWNjZXNzZXMgYW5kIGludGVycnVwdAorICAtLSBtb3ZlIHdpdGggYW4gZXJyb3IKKyAgbG9jYWwgZnVuY3Rpb24gY2hlY2ttb3ZlIChmLCBlLCB0LCB4LCB5KQorICAgIGxvY2FsIHBvczEsIHBvczIKKyAgICBsb2NhbCBhID0gc2V0bWV0YXRhYmxlKHt9LCB7CisgICAgICAgICAgICAgICAgX19pbmRleCA9IGZ1bmN0aW9uIChfLGspIHBvczEgPSBrIGVuZCwKKyAgICAgICAgICAgICAgICBfX25ld2luZGV4ID0gZnVuY3Rpb24gKF8saykgcG9zMiA9IGs7IGVycm9yKCkgZW5kLCB9KQorICAgIGxvY2FsIHN0LCBtc2cgPSBwY2FsbCh0YWJsZS5tb3ZlLCBhLCBmLCBlLCB0KQorICAgIGFzc2VydChub3Qgc3QgYW5kIG5vdCBtc2cgYW5kIHBvczEgPT0geCBhbmQgcG9zMiA9PSB5KQorICBlbmQKKyAgY2hlY2ttb3ZlKDEsIG1heEksIDAsIDEsIDApCisgIGNoZWNrbW92ZSgwLCBtYXhJIC0gMSwgMSwgbWF4SSAtIDEsIG1heEkpCisgIGNoZWNrbW92ZShtaW5JLCAtMiwgLTUsIC0yLCBtYXhJIC0gNikKKyAgY2hlY2ttb3ZlKG1pbkkgKyAxLCAtMSwgLTIsIC0xLCBtYXhJIC0gMykKKyAgY2hlY2ttb3ZlKG1pbkksIC0yLCAwLCBtaW5JLCAwKSAgLS0gbm9uIG92ZXJsYXBwaW5nCisgIGNoZWNrbW92ZShtaW5JICsgMSwgLTEsIDEsIG1pbkkgKyAxLCAxKSAgLS0gbm9uIG92ZXJsYXBwaW5nCitlbmQKKworY2hlY2tlcnJvcigidG9vIG1hbnkiLCB0YWJsZS5tb3ZlLCB7fSwgMCwgbWF4SSwgMSkKK2NoZWNrZXJyb3IoInRvbyBtYW55IiwgdGFibGUubW92ZSwge30sIC0xLCBtYXhJIC0gMSwgMSkKK2NoZWNrZXJyb3IoInRvbyBtYW55IiwgdGFibGUubW92ZSwge30sIG1pbkksIC0xLCAxKQorY2hlY2tlcnJvcigidG9vIG1hbnkiLCB0YWJsZS5tb3ZlLCB7fSwgbWluSSwgbWF4SSwgMSkKK2NoZWNrZXJyb3IoIndyYXAgYXJvdW5kIiwgdGFibGUubW92ZSwge30sIDEsIG1heEksIDIpCitjaGVja2Vycm9yKCJ3cmFwIGFyb3VuZCIsIHRhYmxlLm1vdmUsIHt9LCAxLCAyLCBtYXhJKQorY2hlY2tlcnJvcigid3JhcCBhcm91bmQiLCB0YWJsZS5tb3ZlLCB7fSwgbWluSSwgLTIsIDIpCisKKworcHJpbnQidGVzdGluZyBzb3J0IgorCisKKy0tIHN0cmFuZ2UgbGVuZ3RocworbG9jYWwgYSA9IHNldG1ldGF0YWJsZSh7fSwge19fbGVuID0gZnVuY3Rpb24gKCkgcmV0dXJuIC0xIGVuZH0pCithc3NlcnQoI2EgPT0gLTEpCit0YWJsZS5zb3J0KGEsIGVycm9yKSAgICAtLSBzaG91bGQgbm90IGNvbXBhcmUgYW55dGhpbmcKK2EgPSBzZXRtZXRhdGFibGUoe30sIHtfX2xlbiA9IGZ1bmN0aW9uICgpIHJldHVybiBtYXhJIGVuZH0pCitjaGVja2Vycm9yKCJ0b28gYmlnIiwgdGFibGUuc29ydCwgYSkKKworLS0gdGVzdCBjaGVja3MgZm9yIGludmFsaWQgb3JkZXIgZnVuY3Rpb25zCitsb2NhbCBmdW5jdGlvbiBjaGVjayAodCkKKyAgbG9jYWwgZnVuY3Rpb24gZihhLCBiKSBhc3NlcnQoYSBhbmQgYik7IHJldHVybiB0cnVlIGVuZAorICBjaGVja2Vycm9yKCJpbnZhbGlkIG9yZGVyIGZ1bmN0aW9uIiwgdGFibGUuc29ydCwgdCwgZikKK2VuZAorCitjaGVja3sxLDIsMyw0fQorY2hlY2t7MSwyLDMsNCw1fQorY2hlY2t7MSwyLDMsNCw1LDZ9CisKKworZnVuY3Rpb24gY2hlY2sgKGEsIGYpCisgIGYgPSBmIG9yIGZ1bmN0aW9uICh4LHkpIHJldHVybiB4PHkgZW5kOworICBmb3IgbiA9ICNhLCAyLCAtMSBkbworICAgIGFzc2VydChub3QgZihhW25dLCBhW24tMV0pKQorICBlbmQKK2VuZAorCithID0geyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsCisgICAgICJPY3QiLCAiTm92IiwgIkRlYyJ9CisKK3RhYmxlLnNvcnQoYSkKK2NoZWNrKGEpCisKK2Z1bmN0aW9uIHBlcm0gKHMsIG4pCisgIG4gPSBuIG9yICNzCisgIGlmIG4gPT0gMSB0aGVuCisgICAgbG9jYWwgdCA9IHt1bnBhY2socyl9CisgICAgdGFibGUuc29ydCh0KQorICAgIGNoZWNrKHQpCisgIGVsc2UKKyAgICBmb3IgaSA9IDEsIG4gZG8KKyAgICAgIHNbaV0sIHNbbl0gPSBzW25dLCBzW2ldCisgICAgICBwZXJtKHMsIG4gLSAxKQorICAgICAgc1tpXSwgc1tuXSA9IHNbbl0sIHNbaV0KKyAgICBlbmQKKyAgZW5kCitlbmQKKworcGVybXt9CitwZXJtezF9CitwZXJtezEsMn0KK3Blcm17MSwyLDN9CitwZXJtezEsMiwzLDR9CitwZXJtezIsMiwzLDR9CitwZXJtezEsMiwzLDQsNX0KK3Blcm17MSwyLDMsMyw1fQorcGVybXsxLDIsMyw0LDUsNn0KK3Blcm17MiwyLDMsMyw1LDZ9CisKK2Z1bmN0aW9uIHRpbWVzb3J0IChhLCBuLCBmdW5jLCBtc2csIHByZSkKKyAgbG9jYWwgeCA9IG9zLmNsb2NrKCkKKyAgdGFibGUuc29ydChhLCBmdW5jKQorICB4ID0gKG9zLmNsb2NrKCkgLSB4KSAqIDEwMDAKKyAgcHJlID0gcHJlIG9yICIiCisgIHByaW50KHN0cmluZy5mb3JtYXQoIiVzc29ydGluZyAlZCAlcyBlbGVtZW50cyBpbiAlLjJmIG1zZWMuIiwgcHJlLCBuLCBtc2csIHgpKQorICBjaGVjayhhLCBmdW5jKQorZW5kCisKK2xpbWl0ID0gNTAwMDAKK2lmIF9zb2Z0IHRoZW4gbGltaXQgPSA1MDAwIGVuZAorCithID0ge30KK2ZvciBpPTEsbGltaXQgZG8KKyAgYVtpXSA9IG1hdGgucmFuZG9tKCkKK2VuZAorCit0aW1lc29ydChhLCBsaW1pdCwgbmlsLCAicmFuZG9tIikKKwordGltZXNvcnQoYSwgbGltaXQsIG5pbCwgInNvcnRlZCIsICJyZS0iKQorCithID0ge30KK2ZvciBpPTEsbGltaXQgZG8KKyAgYVtpXSA9IG1hdGgucmFuZG9tKCkKK2VuZAorCit4ID0gb3MuY2xvY2soKTsgaT0wCit0YWJsZS5zb3J0KGEsIGZ1bmN0aW9uKHgseSkgaT1pKzE7IHJldHVybiB5PHggZW5kKQoreCA9IChvcy5jbG9jaygpIC0geCkgKiAxMDAwCitwcmludChzdHJpbmcuZm9ybWF0KCJJbnZlcnQtc29ydGluZyBvdGhlciAlZCBlbGVtZW50cyBpbiAlLjJmIG1zZWMuLCB3aXRoICVpIGNvbXBhcmlzb25zIiwKKyAgICAgIGxpbWl0LCB4LCBpKSkKK2NoZWNrKGEsIGZ1bmN0aW9uKHgseSkgcmV0dXJuIHk8eCBlbmQpCisKKwordGFibGUuc29ydHt9ICAtLSBlbXB0eSBhcnJheQorCitmb3IgaT0xLGxpbWl0IGRvIGFbaV0gPSBmYWxzZSBlbmQKK3RpbWVzb3J0KGEsIGxpbWl0LCAgZnVuY3Rpb24oeCx5KSByZXR1cm4gbmlsIGVuZCwgImVxdWFsIikKKworZm9yIGksdiBpbiBwYWlycyhhKSBkbyBhc3NlcnQodiA9PSBmYWxzZSkgZW5kCisKK0EgPSB7IuFsbyIsICJcMGZpcnN0IDotKSIsICJhbG8iLCAidGhlbiB0aGlzIG9uZSIsICI0NSIsICJhbmQgYSBuZXcifQordGFibGUuc29ydChBKQorY2hlY2soQSkKKwordGFibGUuc29ydChBLCBmdW5jdGlvbiAoeCwgeSkKKyAgICAgICAgICBsb2FkKHN0cmluZy5mb3JtYXQoIkFbJXFdID0gJyciLCB4KSwgIiIpKCkKKyAgICAgICAgICBjb2xsZWN0Z2FyYmFnZSgpCisgICAgICAgICAgcmV0dXJuIHg8eQorICAgICAgICBlbmQpCisKKwordHQgPSB7X19sdCA9IGZ1bmN0aW9uIChhLGIpIHJldHVybiBhLnZhbCA8IGIudmFsIGVuZH0KK2EgPSB7fQorZm9yIGk9MSwxMCBkbyAgYVtpXSA9IHt2YWw9bWF0aC5yYW5kb20oMTAwKX07IHNldG1ldGF0YWJsZShhW2ldLCB0dCk7IGVuZAordGFibGUuc29ydChhKQorY2hlY2soYSwgdHQuX19sdCkKK2NoZWNrKGEpCisKK3ByaW50Ik9LIgpkaWZmIC0tZ2l0IGEvdGVzdGVzL3N0cmluZ3MubHVhIGIvdGVzdGVzL3N0cmluZ3MubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzIwYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0ZXMvc3RyaW5ncy5sdWEKQEAgLTAsMCArMSwzODIgQEAKKy0tICRJZDogc3RyaW5ncy5sdWEsdiAxLjg5IDIwMTgvMDYvMTkgMTI6MjU6MTUgcm9iZXJ0byBFeHAgJAorLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCisKK3ByaW50KCd0ZXN0aW5nIHN0cmluZ3MgYW5kIHN0cmluZyBsaWJyYXJ5JykKKworbG9jYWwgbWF4aSwgbWluaSA9IG1hdGgubWF4aW50ZWdlciwgbWF0aC5taW5pbnRlZ2VyCisKKworbG9jYWwgZnVuY3Rpb24gY2hlY2tlcnJvciAobXNnLCBmLCAuLi4pCisgIGxvY2FsIHMsIGVyciA9IHBjYWxsKGYsIC4uLikKKyAgYXNzZXJ0KG5vdCBzIGFuZCBzdHJpbmcuZmluZChlcnIsIG1zZykpCitlbmQKKworCistLSB0ZXN0aW5nIHN0cmluZyBjb21wYXJpc29ucworYXNzZXJ0KCdhbG8nIDwgJ2FsbzEnKQorYXNzZXJ0KCcnIDwgJ2EnKQorYXNzZXJ0KCdhbG9cMGFsbycgPCAnYWxvXDBiJykKK2Fzc2VydCgnYWxvXDBhbG9cMFwwJyA+ICdhbG9cMGFsb1wwJykKK2Fzc2VydCgnYWxvJyA8ICdhbG9cMCcpCithc3NlcnQoJ2Fsb1wwJyA+ICdhbG8nKQorYXNzZXJ0KCdcMCcgPCAnXDEnKQorYXNzZXJ0KCdcMFwwJyA8ICdcMFwxJykKK2Fzc2VydCgnXDFcMGFcMGEnIDw9ICdcMVwwYVwwYScpCithc3NlcnQobm90ICgnXDFcMGFcMGInIDw9ICdcMVwwYVwwYScpKQorYXNzZXJ0KCdcMFwwXDAnIDwgJ1wwXDBcMFwwJykKK2Fzc2VydChub3QoJ1wwXDBcMFwwJyA8ICdcMFwwXDAnKSkKK2Fzc2VydCgnXDBcMFwwJyA8PSAnXDBcMFwwXDAnKQorYXNzZXJ0KG5vdCgnXDBcMFwwXDAnIDw9ICdcMFwwXDAnKSkKK2Fzc2VydCgnXDBcMFwwJyA8PSAnXDBcMFwwJykKK2Fzc2VydCgnXDBcMFwwJyA+PSAnXDBcMFwwJykKK2Fzc2VydChub3QgKCdcMFwwYicgPCAnXDBcMGFcMCcpKQorCistLSB0ZXN0aW5nIHN0cmluZy5zdWIKK2Fzc2VydChzdHJpbmcuc3ViKCIxMjM0NTY3ODkiLDIsNCkgPT0gIjIzNCIpCithc3NlcnQoc3RyaW5nLnN1YigiMTIzNDU2Nzg5Iiw3KSA9PSAiNzg5IikKK2Fzc2VydChzdHJpbmcuc3ViKCIxMjM0NTY3ODkiLDcsNikgPT0gIiIpCithc3NlcnQoc3RyaW5nLnN1YigiMTIzNDU2Nzg5Iiw3LDcpID09ICI3IikKK2Fzc2VydChzdHJpbmcuc3ViKCIxMjM0NTY3ODkiLDAsMCkgPT0gIiIpCithc3NlcnQoc3RyaW5nLnN1YigiMTIzNDU2Nzg5IiwtMTAsMTApID09ICIxMjM0NTY3ODkiKQorYXNzZXJ0KHN0cmluZy5zdWIoIjEyMzQ1Njc4OSIsMSw5KSA9PSAiMTIzNDU2Nzg5IikKK2Fzc2VydChzdHJpbmcuc3ViKCIxMjM0NTY3ODkiLC0xMCwtMjApID09ICIiKQorYXNzZXJ0KHN0cmluZy5zdWIoIjEyMzQ1Njc4OSIsLTEpID09ICI5IikKK2Fzc2VydChzdHJpbmcuc3ViKCIxMjM0NTY3ODkiLC00KSA9PSAiNjc4OSIpCithc3NlcnQoc3RyaW5nLnN1YigiMTIzNDU2Nzg5IiwtNiwgLTQpID09ICI0NTYiKQorYXNzZXJ0KHN0cmluZy5zdWIoIjEyMzQ1Njc4OSIsIG1pbmksIC00KSA9PSAiMTIzNDU2IikKK2Fzc2VydChzdHJpbmcuc3ViKCIxMjM0NTY3ODkiLCBtaW5pLCBtYXhpKSA9PSAiMTIzNDU2Nzg5IikKK2Fzc2VydChzdHJpbmcuc3ViKCIxMjM0NTY3ODkiLCBtaW5pLCBtaW5pKSA9PSAiIikKK2Fzc2VydChzdHJpbmcuc3ViKCJcMDAwMTIzNDU2Nzg5IiwzLDUpID09ICIyMzQiKQorYXNzZXJ0KCgiXDAwMDEyMzQ1Njc4OSIpOnN1Yig4KSA9PSAiNzg5IikKKworLS0gdGVzdGluZyBzdHJpbmcuZmluZAorYXNzZXJ0KHN0cmluZy5maW5kKCIxMjM0NTY3ODkiLCAiMzQ1IikgPT0gMykKK2EsYiA9IHN0cmluZy5maW5kKCIxMjM0NTY3ODkiLCAiMzQ1IikKK2Fzc2VydChzdHJpbmcuc3ViKCIxMjM0NTY3ODkiLCBhLCBiKSA9PSAiMzQ1IikKK2Fzc2VydChzdHJpbmcuZmluZCgiMTIzNDU2Nzg5MDEyMzQ1Njc4OSIsICIzNDUiLCAzKSA9PSAzKQorYXNzZXJ0KHN0cmluZy5maW5kKCIxMjM0NTY3ODkwMTIzNDU2Nzg5IiwgIjM0NSIsIDQpID09IDEzKQorYXNzZXJ0KHN0cmluZy5maW5kKCIxMjM0NTY3ODkwMTIzNDU2Nzg5IiwgIjM0NiIsIDQpID09IG5pbCkKK2Fzc2VydChzdHJpbmcuZmluZCgiMTIzNDU2Nzg5MDEyMzQ1Njc4OSIsICIuNDUiLCAtOSkgPT0gMTMpCithc3NlcnQoc3RyaW5nLmZpbmQoImFiY2RlZmciLCAiXDAiLCA1LCAxKSA9PSBuaWwpCithc3NlcnQoc3RyaW5nLmZpbmQoIiIsICIiKSA9PSAxKQorYXNzZXJ0KHN0cmluZy5maW5kKCIiLCAiIiwgMSkgPT0gMSkKK2Fzc2VydChub3Qgc3RyaW5nLmZpbmQoIiIsICIiLCAyKSkKK2Fzc2VydChzdHJpbmcuZmluZCgnJywgJ2FhYScsIDEpID09IG5pbCkKK2Fzc2VydCgoJ2FsbyguKWFsbycpOmZpbmQoJyguKScsIDEsIDEpID09IDQpCisKK2Fzc2VydChzdHJpbmcubGVuKCIiKSA9PSAwKQorYXNzZXJ0KHN0cmluZy5sZW4oIlwwXDBcMCIpID09IDMpCithc3NlcnQoc3RyaW5nLmxlbigiMTIzNDU2Nzg5MCIpID09IDEwKQorCithc3NlcnQoIyIiID09IDApCithc3NlcnQoIyJcMFwwXDAiID09IDMpCithc3NlcnQoIyIxMjM0NTY3ODkwIiA9PSAxMCkKKworLS0gdGVzdGluZyBzdHJpbmcuYnl0ZS9zdHJpbmcuY2hhcgorYXNzZXJ0KHN0cmluZy5ieXRlKCJhIikgPT0gOTcpCithc3NlcnQoc3RyaW5nLmJ5dGUoIlx4ZTQiKSA+IDEyNykKK2Fzc2VydChzdHJpbmcuYnl0ZShzdHJpbmcuY2hhcigyNTUpKSA9PSAyNTUpCithc3NlcnQoc3RyaW5nLmJ5dGUoc3RyaW5nLmNoYXIoMCkpID09IDApCithc3NlcnQoc3RyaW5nLmJ5dGUoIlwwIikgPT0gMCkKK2Fzc2VydChzdHJpbmcuYnl0ZSgiXDBcMGFsb1wweCIsIC0xKSA9PSBzdHJpbmcuYnl0ZSgneCcpKQorYXNzZXJ0KHN0cmluZy5ieXRlKCJiYSIsIDIpID09IDk3KQorYXNzZXJ0KHN0cmluZy5ieXRlKCJcblxuIiwgMiwgLTEpID09IDEwKQorYXNzZXJ0KHN0cmluZy5ieXRlKCJcblxuIiwgMiwgMikgPT0gMTApCithc3NlcnQoc3RyaW5nLmJ5dGUoIiIpID09IG5pbCkKK2Fzc2VydChzdHJpbmcuYnl0ZSgiaGkiLCAtMykgPT0gbmlsKQorYXNzZXJ0KHN0cmluZy5ieXRlKCJoaSIsIDMpID09IG5pbCkKK2Fzc2VydChzdHJpbmcuYnl0ZSgiaGkiLCA5LCAxMCkgPT0gbmlsKQorYXNzZXJ0KHN0cmluZy5ieXRlKCJoaSIsIDIsIDEpID09IG5pbCkKK2Fzc2VydChzdHJpbmcuY2hhcigpID09ICIiKQorYXNzZXJ0KHN0cmluZy5jaGFyKDAsIDI1NSwgMCkgPT0gIlwwXDI1NVwwIikKK2Fzc2VydChzdHJpbmcuY2hhcigwLCBzdHJpbmcuYnl0ZSgiXHhlNCIpLCAwKSA9PSAiXDBceGU0XDAiKQorYXNzZXJ0KHN0cmluZy5jaGFyKHN0cmluZy5ieXRlKCJceGU0bFww83UiLCAxLCAtMSkpID09ICJceGU0bFww83UiKQorYXNzZXJ0KHN0cmluZy5jaGFyKHN0cmluZy5ieXRlKCJceGU0bFww83UiLCAxLCAwKSkgPT0gIiIpCithc3NlcnQoc3RyaW5nLmNoYXIoc3RyaW5nLmJ5dGUoIlx4ZTRsXDDzdSIsIC0xMCwgMTAwKSkgPT0gIlx4ZTRsXDDzdSIpCisKK2Fzc2VydChzdHJpbmcudXBwZXIoImFiXDBjIikgPT0gIkFCXDBDIikKK2Fzc2VydChzdHJpbmcubG93ZXIoIlwwQUJDYyUkIikgPT0gIlwwYWJjYyUkIikKK2Fzc2VydChzdHJpbmcucmVwKCd0ZXN0ZScsIDApID09ICcnKQorYXNzZXJ0KHN0cmluZy5yZXAoJ3Tpc1wwMHTqJywgMikgPT0gJ3Tpc1wwdOp06XNcMDAwdOonKQorYXNzZXJ0KHN0cmluZy5yZXAoJycsIDEwKSA9PSAnJykKKworaWYgc3RyaW5nLnBhY2tzaXplKCJpIikgPT0gNCB0aGVuCisgIC0tIHJlc3VsdCBsZW5ndGggd291bGQgYmUgMl4zMSAoaW50IG92ZXJmbG93KQorICBjaGVja2Vycm9yKCJ0b28gbGFyZ2UiLCBzdHJpbmcucmVwLCAnYWEnLCAoMSA8PCAzMCkpCisgIGNoZWNrZXJyb3IoInRvbyBsYXJnZSIsIHN0cmluZy5yZXAsICdhJywgKDEgPDwgMzApLCAnLCcpCitlbmQKKworLS0gcmVwZXRpdGlvbnMgd2l0aCBzZXBhcmF0b3IKK2Fzc2VydChzdHJpbmcucmVwKCd0ZXN0ZScsIDAsICd4dXh1JykgPT0gJycpCithc3NlcnQoc3RyaW5nLnJlcCgndGVzdGUnLCAxLCAneHV4dScpID09ICd0ZXN0ZScpCithc3NlcnQoc3RyaW5nLnJlcCgnXDFcMFwxJywgMiwgJ1wwXDAnKSA9PSAnXDFcMFwxXDBcMFwxXDBcMScpCithc3NlcnQoc3RyaW5nLnJlcCgnJywgMTAsICcuJykgPT0gc3RyaW5nLnJlcCgnLicsIDkpKQorYXNzZXJ0KG5vdCBwY2FsbChzdHJpbmcucmVwLCAiYWEiLCBtYXhpIC8vIDIgKyAxMCkpCithc3NlcnQobm90IHBjYWxsKHN0cmluZy5yZXAsICIiLCBtYXhpIC8vIDIgKyAxMCwgImFhIikpCisKK2Fzc2VydChzdHJpbmcucmV2ZXJzZSIiID09ICIiKQorYXNzZXJ0KHN0cmluZy5yZXZlcnNlIlwwXDFcMlwzIiA9PSAiXDNcMlwxXDAiKQorYXNzZXJ0KHN0cmluZy5yZXZlcnNlIlwwMDAxMjM0IiA9PSAiNDMyMVwwIikKKworZm9yIGk9MCwzMCBkbyBhc3NlcnQoc3RyaW5nLmxlbihzdHJpbmcucmVwKCdhJywgaSkpID09IGkpIGVuZAorCithc3NlcnQodHlwZSh0b3N0cmluZyhuaWwpKSA9PSAnc3RyaW5nJykKK2Fzc2VydCh0eXBlKHRvc3RyaW5nKDEyKSkgPT0gJ3N0cmluZycpCithc3NlcnQoc3RyaW5nLmZpbmQodG9zdHJpbmd7fSwgJ3RhYmxlOicpKQorYXNzZXJ0KHN0cmluZy5maW5kKHRvc3RyaW5nKHByaW50KSwgJ2Z1bmN0aW9uOicpKQorYXNzZXJ0KCN0b3N0cmluZygnXDAnKSA9PSAxKQorYXNzZXJ0KHRvc3RyaW5nKHRydWUpID09ICJ0cnVlIikKK2Fzc2VydCh0b3N0cmluZyhmYWxzZSkgPT0gImZhbHNlIikKK2Fzc2VydCh0b3N0cmluZygtMTIwMykgPT0gIi0xMjAzIikKK2Fzc2VydCh0b3N0cmluZygxMjAzLjEyNSkgPT0gIjEyMDMuMTI1IikKK2Fzc2VydCh0b3N0cmluZygtMC41KSA9PSAiLTAuNSIpCithc3NlcnQodG9zdHJpbmcoLTMyNzY3KSA9PSAiLTMyNzY3IikKK2lmIG1hdGgudG9pbnRlZ2VyKDIxNDc0ODM2NDcpIHRoZW4gICAtLSBubyBvdmVyZmxvdz8gKDMyIGJpdHMpCisgIGFzc2VydCh0b3N0cmluZygtMjE0NzQ4MzY0NykgPT0gIi0yMTQ3NDgzNjQ3IikKK2VuZAoraWYgbWF0aC50b2ludGVnZXIoNDYxMTY4NjAxODQyNzM4NzkwNCkgdGhlbiAgIC0tIG5vIG92ZXJmbG93PyAoNjQgYml0cykKKyAgYXNzZXJ0KHRvc3RyaW5nKDQ2MTE2ODYwMTg0MjczODc5MDQpID09ICI0NjExNjg2MDE4NDI3Mzg3OTA0IikKKyAgYXNzZXJ0KHRvc3RyaW5nKC00NjExNjg2MDE4NDI3Mzg3OTA0KSA9PSAiLTQ2MTE2ODYwMTg0MjczODc5MDQiKQorZW5kCisKK2lmIHRvc3RyaW5nKDAuMCkgPT0gIjAuMCIgdGhlbiAgIC0tICJzdGFuZGFyZCIgY29lcmNpb24gZmxvYXQtPnN0cmluZworICBhc3NlcnQoJycgLi4gMTIgPT0gJzEyJyBhbmQgMTIuMCAuLiAnJyA9PSAnMTIuMCcpCisgIGFzc2VydCh0b3N0cmluZygtMTIwMyArIDAuMCkgPT0gIi0xMjAzLjAiKQorZWxzZSAgIC0tIGNvbXBhdGlibGUgY29lcmNpb24KKyAgYXNzZXJ0KHRvc3RyaW5nKDAuMCkgPT0gIjAiKQorICBhc3NlcnQoJycgLi4gMTIgPT0gJzEyJyBhbmQgMTIuMCAuLiAnJyA9PSAnMTInKQorICBhc3NlcnQodG9zdHJpbmcoLTEyMDMgKyAwLjApID09ICItMTIwMyIpCitlbmQKKworCit4ID0gJyLtbG8iXG5cXCcKK2Fzc2VydChzdHJpbmcuZm9ybWF0KCclcSVzJywgeCwgeCkgPT0gJyJcXCLtbG9cXCJcXFxuXFxcXCIi7WxvIlxuXFwnKQorYXNzZXJ0KHN0cmluZy5mb3JtYXQoJyVxJywgIlwwIikgPT0gW1siXDAiXV0pCithc3NlcnQobG9hZChzdHJpbmcuZm9ybWF0KCdyZXR1cm4gJXEnLCB4KSkoKSA9PSB4KQoreCA9ICJcMFwxXDAwMjNcNVwwMDA5IgorYXNzZXJ0KGxvYWQoc3RyaW5nLmZvcm1hdCgncmV0dXJuICVxJywgeCkpKCkgPT0geCkKK2Fzc2VydChzdHJpbmcuZm9ybWF0KCJcMCVjXDAlYyV4XDAiLCBzdHJpbmcuYnl0ZSgiXHhlNCIpLCBzdHJpbmcuYnl0ZSgiYiIpLCAxNDApID09CisgICAgICAgICAgICAgICJcMFx4ZTRcMGI4Y1wwIikKK2Fzc2VydChzdHJpbmcuZm9ybWF0KCcnKSA9PSAiIikKK2Fzc2VydChzdHJpbmcuZm9ybWF0KCIlYyIsMzQpLi5zdHJpbmcuZm9ybWF0KCIlYyIsNDgpLi5zdHJpbmcuZm9ybWF0KCIlYyIsOTApLi5zdHJpbmcuZm9ybWF0KCIlYyIsMTAwKSA9PQorICAgICAgIHN0cmluZy5mb3JtYXQoIiVjJWMlYyVjIiwgMzQsIDQ4LCA5MCwgMTAwKSkKK2Fzc2VydChzdHJpbmcuZm9ybWF0KCIlc1wwIGlzIG5vdCBcMCVzIiwgJ25vdCBiZScsICdiZScpID09ICdub3QgYmVcMCBpcyBub3QgXDBiZScpCithc3NlcnQoc3RyaW5nLmZvcm1hdCgiJSUlZCAlMDEwZCIsIDEwLCAyMykgPT0gIiUxMCAwMDAwMDAwMDIzIikKK2Fzc2VydCh0b251bWJlcihzdHJpbmcuZm9ybWF0KCIlZiIsIDEwLjMpKSA9PSAxMC4zKQoreCA9IHN0cmluZy5mb3JtYXQoJyIlLTUwcyInLCAnYScpCithc3NlcnQoI3ggPT0gNTIpCithc3NlcnQoc3RyaW5nLnN1Yih4LCAxLCA0KSA9PSAnImEgICcpCisKK2Fzc2VydChzdHJpbmcuZm9ybWF0KCItJS4yMHMuMjBzIiwgc3RyaW5nLnJlcCgiJSIsIDIwMDApKSA9PQorICAgICAgICAgICAgICAgICAgICAgIi0iLi5zdHJpbmcucmVwKCIlIiwgMjApLi4iLjIwcyIpCithc3NlcnQoc3RyaW5nLmZvcm1hdCgnIi0lMjBzLjIwcyInLCBzdHJpbmcucmVwKCIlIiwgMjAwMCkpID09CisgICAgICAgc3RyaW5nLmZvcm1hdCgiJXEiLCAiLSIuLnN0cmluZy5yZXAoIiUiLCAyMDAwKS4uIi4yMHMiKSkKKworZG8KKyAgbG9jYWwgZnVuY3Rpb24gY2hlY2tRICh2KQorICAgIGxvY2FsIHMgPSBzdHJpbmcuZm9ybWF0KCIlcSIsIHYpCisgICAgbG9jYWwgbnYgPSBsb2FkKCJyZXR1cm4gIiAuLiBzKSgpCisgICAgYXNzZXJ0KHYgPT0gbnYgYW5kIG1hdGgudHlwZSh2KSA9PSBtYXRoLnR5cGUobnYpKQorICBlbmQKKyAgY2hlY2tRKCJcMFwwXDFcMjU1XHV7MjM0fSIpCisgIGNoZWNrUShtYXRoLm1heGludGVnZXIpCisgIGNoZWNrUShtYXRoLm1pbmludGVnZXIpCisgIGNoZWNrUShtYXRoLnBpKQorICBjaGVja1EoMC4xKQorICBjaGVja1EodHJ1ZSkKKyAgY2hlY2tRKG5pbCkKKyAgY2hlY2tRKGZhbHNlKQorICBjaGVja1EobWF0aC5odWdlKQorICBjaGVja1EoLW1hdGguaHVnZSkKKyAgYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiVxIiwgMC8wKSA9PSAiKDAvMCkiKSAgIC0tIE5hTgorICBjaGVja2Vycm9yKCJubyBsaXRlcmFsIiwgc3RyaW5nLmZvcm1hdCwgIiVxIiwge30pCitlbmQKKworYXNzZXJ0KHN0cmluZy5mb3JtYXQoIlwwJXNcMCIsICJcMFwwXDEiKSA9PSAiXDBcMFwwXDFcMCIpCitjaGVja2Vycm9yKCJjb250YWlucyB6ZXJvcyIsIHN0cmluZy5mb3JtYXQsICIlMTBzIiwgIlwwIikKKworLS0gZm9ybWF0IHggdG9zdHJpbmcKK2Fzc2VydChzdHJpbmcuZm9ybWF0KCIlcyAlcyIsIG5pbCwgdHJ1ZSkgPT0gIm5pbCB0cnVlIikKK2Fzc2VydChzdHJpbmcuZm9ybWF0KCIlcyAlLjRzIiwgZmFsc2UsIHRydWUpID09ICJmYWxzZSB0cnVlIikKK2Fzc2VydChzdHJpbmcuZm9ybWF0KCIlLjNzICUuM3MiLCBmYWxzZSwgdHJ1ZSkgPT0gImZhbCB0cnUiKQorbG9jYWwgbSA9IHNldG1ldGF0YWJsZSh7fSwge19fdG9zdHJpbmcgPSBmdW5jdGlvbiAoKSByZXR1cm4gImhlbGxvIiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19uYW1lID0gImhpIn0pCithc3NlcnQoc3RyaW5nLmZvcm1hdCgiJXMgJS4xMHMiLCBtLCBtKSA9PSAiaGVsbG8gaGVsbG8iKQorZ2V0bWV0YXRhYmxlKG0pLl9fdG9zdHJpbmcgPSBuaWwgICAtLSB3aWxsIHVzZSAnX19uYW1lJyBmcm9tIG5vdyBvbgorYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiUuNHMiLCBtKSA9PSAiaGk6ICIpCisKK2dldG1ldGF0YWJsZShtKS5fX3Rvc3RyaW5nID0gZnVuY3Rpb24gKCkgcmV0dXJuIHt9IGVuZAorY2hlY2tlcnJvcigiJ19fdG9zdHJpbmcnIG11c3QgcmV0dXJuIGEgc3RyaW5nIiwgdG9zdHJpbmcsIG0pCisKKworYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiV4IiwgMC4wKSA9PSAiMCIpCithc3NlcnQoc3RyaW5nLmZvcm1hdCgiJTAyeCIsIDAuMCkgPT0gIjAwIikKK2Fzc2VydChzdHJpbmcuZm9ybWF0KCIlMDhYIiwgMHhGRkZGRkZGRikgPT0gIkZGRkZGRkZGIikKK2Fzc2VydChzdHJpbmcuZm9ybWF0KCIlKzA4ZCIsIDMxNTAxKSA9PSAiKzAwMzE1MDEiKQorYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiUrMDhkIiwgLTMwOTI3KSA9PSAiLTAwMzA5MjciKQorCisKK2RvICAgIC0tIGxvbmdlc3QgbnVtYmVyIHRoYXQgY2FuIGJlIGZvcm1hdHRlZAorICBsb2NhbCBpID0gMQorICBsb2NhbCBqID0gMTAwMDAKKyAgd2hpbGUgaSArIDEgPCBqIGRvICAgLS0gYmluYXJ5IHNlYXJjaCBmb3IgbWF4aW11bSBmaW5pdGUgZmxvYXQKKyAgICBsb2NhbCBtID0gKGkgKyBqKSAvLyAyCisgICAgaWYgMTBebSA8IG1hdGguaHVnZSB0aGVuIGkgPSBtIGVsc2UgaiA9IG0gZW5kCisgIGVuZAorICBhc3NlcnQoMTBeaSA8IG1hdGguaHVnZSBhbmQgMTBeaiA9PSBtYXRoLmh1Z2UpCisgIGxvY2FsIHMgPSBzdHJpbmcuZm9ybWF0KCclLjk5ZicsIC0oMTBeaSkpCisgIGFzc2VydChzdHJpbmcubGVuKHMpID49IGkgKyAxMDEpCisgIGFzc2VydCh0b251bWJlcihzKSA9PSAtKDEwXmkpKQorZW5kCisKKworLS0gdGVzdGluZyBsYXJnZSBudW1iZXJzIGZvciBmb3JtYXQKK2RvICAgLS0gYXNzdW1lIGF0IGxlYXN0IDMyIGJpdHMKKyAgbG9jYWwgbWF4LCBtaW4gPSAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCAgICAtLSAibGFyZ2UiIGZvciAzMiBiaXRzCisgIGFzc2VydChzdHJpbmcuc3ViKHN0cmluZy5mb3JtYXQoIiU4eCIsIC0xKSwgLTgpID09ICJmZmZmZmZmZiIpCisgIGFzc2VydChzdHJpbmcuZm9ybWF0KCIleCIsIG1heCkgPT0gIjdmZmZmZmZmIikKKyAgYXNzZXJ0KHN0cmluZy5zdWIoc3RyaW5nLmZvcm1hdCgiJXgiLCBtaW4pLCAtOCkgPT0gIjgwMDAwMDAwIikKKyAgYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiVkIiwgbWF4KSA9PSAgIjIxNDc0ODM2NDciKQorICBhc3NlcnQoc3RyaW5nLmZvcm1hdCgiJWQiLCBtaW4pID09ICItMjE0NzQ4MzY0OCIpCisgIGFzc2VydChzdHJpbmcuZm9ybWF0KCIldSIsIDB4ZmZmZmZmZmYpID09ICI0Mjk0OTY3Mjk1IikKKyAgYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiVvIiwgMHhBQkNEKSA9PSAiMTI1NzE1IikKKworICBtYXgsIG1pbiA9IDB4N2ZmZmZmZmZmZmZmZmZmZiwgLTB4ODAwMDAwMDAwMDAwMDAwMAorICBpZiBtYXggPiAyLjBeNTMgdGhlbiAgLS0gb25seSBmb3IgNjQgYml0cworICAgIGFzc2VydChzdHJpbmcuZm9ybWF0KCIleCIsICgyXjUyIHwgMCkgLSAxKSA9PSAiZmZmZmZmZmZmZmZmZiIpCisgICAgYXNzZXJ0KHN0cmluZy5mb3JtYXQoIjB4JThYIiwgMHg4ZjAwMDAwMykgPT0gIjB4OEYwMDAwMDMiKQorICAgIGFzc2VydChzdHJpbmcuZm9ybWF0KCIlZCIsIDJeNTMpID09ICI5MDA3MTk5MjU0NzQwOTkyIikKKyAgICBhc3NlcnQoc3RyaW5nLmZvcm1hdCgiJWkiLCAtMl41MykgPT0gIi05MDA3MTk5MjU0NzQwOTkyIikKKyAgICBhc3NlcnQoc3RyaW5nLmZvcm1hdCgiJXgiLCBtYXgpID09ICI3ZmZmZmZmZmZmZmZmZmZmIikKKyAgICBhc3NlcnQoc3RyaW5nLmZvcm1hdCgiJXgiLCBtaW4pID09ICI4MDAwMDAwMDAwMDAwMDAwIikKKyAgICBhc3NlcnQoc3RyaW5nLmZvcm1hdCgiJWQiLCBtYXgpID09ICAiOTIyMzM3MjAzNjg1NDc3NTgwNyIpCisgICAgYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiVkIiwgbWluKSA9PSAiLTkyMjMzNzIwMzY4NTQ3NzU4MDgiKQorICAgIGFzc2VydChzdHJpbmcuZm9ybWF0KCIldSIsIH4oLTEgPDwgNjQpKSA9PSAiMTg0NDY3NDQwNzM3MDk1NTE2MTUiKQorICAgIGFzc2VydCh0b3N0cmluZygxMjM0NTY3ODkwMTIzKSA9PSAnMTIzNDU2Nzg5MDEyMycpCisgIGVuZAorZW5kCisKKworZG8gcHJpbnQoInRlc3RpbmcgJ2Zvcm1hdCAlYSAlQSciKQorICBsb2NhbCBmdW5jdGlvbiBtYXRjaGhleGEgKG4pCisgICAgbG9jYWwgcyA9IHN0cmluZy5mb3JtYXQoIiVhIiwgbikKKyAgICAtLSByZXN1bHQgbWF0Y2hlcyBJU08gQyByZXF1aXJlbWVudHMKKyAgICBhc3NlcnQoc3RyaW5nLmZpbmQocywgIl4lLT8weFsxLTlhLWZdJS4/WzAtOWEtZl0qcFstK10/JWQrJCIpKQorICAgIGFzc2VydCh0b251bWJlcihzKSA9PSBuKSAgLS0gYW5kIGhhcyBmdWxsIHByZWNpc2lvbgorICAgIHMgPSBzdHJpbmcuZm9ybWF0KCIlQSIsIG4pCisgICAgYXNzZXJ0KHN0cmluZy5maW5kKHMsICJeJS0/MFhbMS05QS1GXSUuP1swLTlBLUZdKlBbLStdPyVkKyQiKSkKKyAgICBhc3NlcnQodG9udW1iZXIocykgPT0gbikKKyAgZW5kCisgIGZvciBfLCBuIGluIGlwYWlyc3swLjEsIC0wLjEsIDEvMywgLTEvMywgMWUzMCwgLTFlMzAsCisgICAgICAgICAgICAgICAgICAgICAtNDUvMjQ3LCAxLCAtMSwgMiwgLTIsIDNlLTIwLCAtM2UtMjB9IGRvCisgICAgbWF0Y2hoZXhhKG4pCisgIGVuZAorCisgIGFzc2VydChzdHJpbmcuZmluZChzdHJpbmcuZm9ybWF0KCIlQSIsIDAuMCksICJeMFgwJS4/MD9QJSs/MCQiKSkKKyAgYXNzZXJ0KHN0cmluZy5maW5kKHN0cmluZy5mb3JtYXQoIiVhIiwgLTAuMCksICJeJS0weDAlLj8wP3AlKz8wJCIpKQorCisgIGlmIG5vdCBfcG9ydCB0aGVuICAgLS0gdGVzdCBpbmYsIC1pbmYsIE5hTiwgYW5kIC0wLjAKKyAgICBhc3NlcnQoc3RyaW5nLmZpbmQoc3RyaW5nLmZvcm1hdCgiJWEiLCAxLzApLCAiXmluZiIpKQorICAgIGFzc2VydChzdHJpbmcuZmluZChzdHJpbmcuZm9ybWF0KCIlQSIsIC0xLzApLCAiXiUtSU5GIikpCisgICAgYXNzZXJ0KHN0cmluZy5maW5kKHN0cmluZy5mb3JtYXQoIiVhIiwgMC8wKSwgIl4lLT9uYW4iKSkKKyAgICBhc3NlcnQoc3RyaW5nLmZpbmQoc3RyaW5nLmZvcm1hdCgiJWEiLCAtMC4wKSwgIl4lLTB4MCIpKQorICBlbmQKKyAgCisgIGlmIG5vdCBwY2FsbChzdHJpbmcuZm9ybWF0LCAiJS4zYSIsIDApIHRoZW4KKyAgICAoTWVzc2FnZSBvciBwcmludCkoIlxuID4+PiBtb2RpZmllcnMgZm9yIGZvcm1hdCAnJWEnIG5vdCBhdmFpbGFibGUgPDw8XG4iKQorICBlbHNlCisgICAgYXNzZXJ0KHN0cmluZy5maW5kKHN0cmluZy5mb3JtYXQoIiUrLjJBIiwgMTIpLCAiXiUrMFgleCUuJXgwUCUrPyVkJCIpKQorICAgIGFzc2VydChzdHJpbmcuZmluZChzdHJpbmcuZm9ybWF0KCIlLjRBIiwgLTEyKSwgIl4lLTBYJXglLiV4MDAwUCUrPyVkJCIpKQorICBlbmQKK2VuZAorCisKKy0tIGVycm9ycyBpbiBmb3JtYXQKKworbG9jYWwgZnVuY3Rpb24gY2hlY2sgKGZtdCwgbXNnKQorICBjaGVja2Vycm9yKG1zZywgc3RyaW5nLmZvcm1hdCwgZm10LCAxMCkKK2VuZAorCitsb2NhbCBhdXggPSBzdHJpbmcucmVwKCcwJywgNjAwKQorY2hlY2soIiUxMDAuM2QiLCAidG9vIGxvbmciKQorY2hlY2soIiUxIi4uYXV4Li4iLjNkIiwgInRvbyBsb25nIikKK2NoZWNrKCIlMS4xMDBkIiwgInRvbyBsb25nIikKK2NoZWNrKCIlMTAuMSIuLmF1eC4uIjAwNGQiLCAidG9vIGxvbmciKQorY2hlY2soIiV0IiwgImludmFsaWQgb3B0aW9uIikKK2NoZWNrKCIlIi4uYXV4Li4iZCIsICJyZXBlYXRlZCBmbGFncyIpCitjaGVjaygiJWQgJWQiLCAibm8gdmFsdWUiKQorCisKK2Fzc2VydChsb2FkKCJyZXR1cm4gMVxuLS1jb21tZW50IHdpdGhvdXQgZW5kaW5nIEVPTCIpKCkgPT0gMSkKKworCitjaGVja2Vycm9yKCJ0YWJsZSBleHBlY3RlZCIsIHRhYmxlLmNvbmNhdCwgMykKK2Fzc2VydCh0YWJsZS5jb25jYXR7fSA9PSAiIikKK2Fzc2VydCh0YWJsZS5jb25jYXQoe30sICd4JykgPT0gIiIpCithc3NlcnQodGFibGUuY29uY2F0KHsnXDAnLCAnXDBcMScsICdcMFwxXDInfSwgJy5cMC4nKSA9PSAiXDAuXDAuXDBcMS5cMC5cMFwxXDIiKQorbG9jYWwgYSA9IHt9OyBmb3IgaT0xLDMwMCBkbyBhW2ldID0gInh1eHUiIGVuZAorYXNzZXJ0KHRhYmxlLmNvbmNhdChhLCAiMTIzIikuLiIxMjMiID09IHN0cmluZy5yZXAoInh1eHUxMjMiLCAzMDApKQorYXNzZXJ0KHRhYmxlLmNvbmNhdChhLCAiYiIsIDIwLCAyMCkgPT0gInh1eHUiKQorYXNzZXJ0KHRhYmxlLmNvbmNhdChhLCAiIiwgMjAsIDIxKSA9PSAieHV4dXh1eHUiKQorYXNzZXJ0KHRhYmxlLmNvbmNhdChhLCAieCIsIDIyLCAyMSkgPT0gIiIpCithc3NlcnQodGFibGUuY29uY2F0KGEsICIzIiwgMjk5KSA9PSAieHV4dTN4dXh1IikKK2Fzc2VydCh0YWJsZS5jb25jYXQoe30sICJ4IiwgbWF4aSwgbWF4aSAtIDEpID09ICIiKQorYXNzZXJ0KHRhYmxlLmNvbmNhdCh7fSwgIngiLCBtaW5pICsgMSwgbWluaSkgPT0gIiIpCithc3NlcnQodGFibGUuY29uY2F0KHt9LCAieCIsIG1heGksIG1pbmkpID09ICIiKQorYXNzZXJ0KHRhYmxlLmNvbmNhdCh7W21heGldID0gImFsbyJ9LCAieCIsIG1heGksIG1heGkpID09ICJhbG8iKQorYXNzZXJ0KHRhYmxlLmNvbmNhdCh7W21heGldID0gImFsbyIsIFttYXhpIC0gMV0gPSAieSJ9LCAiLSIsIG1heGkgLSAxLCBtYXhpKQorICAgICAgID09ICJ5LWFsbyIpCisKK2Fzc2VydChub3QgcGNhbGwodGFibGUuY29uY2F0LCB7ImEiLCAiYiIsIHt9fSkpCisKK2EgPSB7ImEiLCJiIiwiYyJ9Cithc3NlcnQodGFibGUuY29uY2F0KGEsICIsIiwgMSwgMCkgPT0gIiIpCithc3NlcnQodGFibGUuY29uY2F0KGEsICIsIiwgMSwgMSkgPT0gImEiKQorYXNzZXJ0KHRhYmxlLmNvbmNhdChhLCAiLCIsIDEsIDIpID09ICJhLGIiKQorYXNzZXJ0KHRhYmxlLmNvbmNhdChhLCAiLCIsIDIpID09ICJiLGMiKQorYXNzZXJ0KHRhYmxlLmNvbmNhdChhLCAiLCIsIDMpID09ICJjIikKK2Fzc2VydCh0YWJsZS5jb25jYXQoYSwgIiwiLCA0KSA9PSAiIikKKworaWYgbm90IF9wb3J0IHRoZW4KKworICBsb2NhbCBsb2NhbGVzID0geyAicHRiIiwgInB0X0JSLmlzbzg4NTkxIiwgIklTTy04ODU5LTEiIH0KKyAgbG9jYWwgZnVuY3Rpb24gdHJ5bG9jYWxlICh3KQorICAgIGZvciBpID0gMSwgI2xvY2FsZXMgZG8KKyAgICAgIGlmIG9zLnNldGxvY2FsZShsb2NhbGVzW2ldLCB3KSB0aGVuCisgICAgICAgIHByaW50KHN0cmluZy5mb3JtYXQoIiclcycgbG9jYWxlIHNldCB0byAnJXMnIiwgdywgbG9jYWxlc1tpXSkpCisgICAgICAgIHJldHVybiBsb2NhbGVzW2ldCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBwcmludChzdHJpbmcuZm9ybWF0KCInJXMnIGxvY2FsZSBub3QgZm91bmQiLCB3KSkKKyAgICByZXR1cm4gZmFsc2UKKyAgZW5kCisKKyAgaWYgdHJ5bG9jYWxlKCJjb2xsYXRlIikgIHRoZW4KKyAgICBhc3NlcnQoImFsbyIgPCAi4WxvIiBhbmQgIuFsbyIgPCAiYW1vIikKKyAgZW5kCisKKyAgaWYgdHJ5bG9jYWxlKCJjdHlwZSIpIHRoZW4KKyAgICBhc3NlcnQoc3RyaW5nLmdzdWIoIuHp7fP6IiwgIiVhIiwgIngiKSA9PSAieHh4eHgiKQorICAgIGFzc2VydChzdHJpbmcuZ3N1Yigi4cHpySIsICIlbCIsICJ4IikgPT0gInjBeMkiKQorICAgIGFzc2VydChzdHJpbmcuZ3N1Yigi4cHpySIsICIldSIsICJ4IikgPT0gIuF46XgiKQorICAgIGFzc2VydChzdHJpbmcudXBwZXIi4cHpe3h1eHV95+NvIiA9PSAiwcHJe1hVWFV9x8NPIikKKyAgZW5kCisKKyAgb3Muc2V0bG9jYWxlKCJDIikKKyAgYXNzZXJ0KG9zLnNldGxvY2FsZSgpID09ICdDJykKKyAgYXNzZXJ0KG9zLnNldGxvY2FsZShuaWwsICJudW1lcmljIikgPT0gJ0MnKQorCitlbmQKKworCistLSBidWcgaW4gTHVhIDUuMy4yCistLSAnZ21hdGNoJyBpdGVyYXRvciBkb2VzIG5vdCB3b3JrIGFjcm9zcyBjb3JvdXRpbmVzCitkbworICBsb2NhbCBmID0gc3RyaW5nLmdtYXRjaCgiMSAyIDMgNCA1IiwgIiVkKyIpCisgIGFzc2VydChmKCkgPT0gIjEiKQorICBjbyA9IGNvcm91dGluZS53cmFwKGYpCisgIGFzc2VydChjbygpID09ICIyIikKK2VuZAorCitwcmludCgnT0snKQorCmRpZmYgLS1naXQgYS90ZXN0ZXMvdHBhY2subHVhIGIvdGVzdGVzL3RwYWNrLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTYzOWNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGVzL3RwYWNrLmx1YQpAQCAtMCwwICsxLDMyNCBAQAorLS0gJElkOiB0cGFjay5sdWEsdiAxLjE0IDIwMTgvMDYvMDQgMTQ6MjY6MzIgcm9iZXJ0byBFeHAgJAorLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCisKK2xvY2FsIHBhY2sgPSBzdHJpbmcucGFjaworbG9jYWwgcGFja3NpemUgPSBzdHJpbmcucGFja3NpemUKK2xvY2FsIHVucGFjayA9IHN0cmluZy51bnBhY2sKKworcHJpbnQgInRlc3RpbmcgcGFjay91bnBhY2siCisKKy0tIG1heGltdW0gc2l6ZSBmb3IgaW50ZWdlcnMKK2xvY2FsIE5CID0gMTYKKworbG9jYWwgc2l6ZXNob3J0ID0gcGFja3NpemUoImgiKQorbG9jYWwgc2l6ZWludCA9IHBhY2tzaXplKCJpIikKK2xvY2FsIHNpemVsb25nID0gcGFja3NpemUoImwiKQorbG9jYWwgc2l6ZXNpemVfdCA9IHBhY2tzaXplKCJUIikKK2xvY2FsIHNpemVMSSA9IHBhY2tzaXplKCJqIikKK2xvY2FsIHNpemVmbG9hdCA9IHBhY2tzaXplKCJmIikKK2xvY2FsIHNpemVkb3VibGUgPSBwYWNrc2l6ZSgiZCIpCitsb2NhbCBzaXplbnVtYmVyID0gcGFja3NpemUoIm4iKQorbG9jYWwgbGl0dGxlID0gKHBhY2soImkyIiwgMSkgPT0gIlwxXDAiKQorbG9jYWwgYWxpZ24gPSBwYWNrc2l6ZSgiIXhYaTE2IikKKworYXNzZXJ0KDEgPD0gc2l6ZXNob3J0IGFuZCBzaXplc2hvcnQgPD0gc2l6ZWludCBhbmQgc2l6ZWludCA8PSBzaXplbG9uZyBhbmQKKyAgICAgICBzaXplZmxvYXQgPD0gc2l6ZWRvdWJsZSkKKworcHJpbnQoInBsYXRmb3JtOiIpCitwcmludChzdHJpbmcuZm9ybWF0KAorICAiXHRzaG9ydCAlZCwgaW50ICVkLCBsb25nICVkLCBzaXplX3QgJWQsIGZsb2F0ICVkLCBkb3VibGUgJWQsXG5cegorICAgXHRsdWEgSW50ZWdlciAlZCwgbHVhIE51bWJlciAlZCIsCisgICBzaXplc2hvcnQsIHNpemVpbnQsIHNpemVsb25nLCBzaXplc2l6ZV90LCBzaXplZmxvYXQsIHNpemVkb3VibGUsCisgICBzaXplTEksIHNpemVudW1iZXIpKQorcHJpbnQoIlx0IiAuLiAobGl0dGxlIGFuZCAibGl0dGxlIiBvciAiYmlnIikgLi4gIiBlbmRpYW4iKQorcHJpbnQoIlx0YWxpZ25tZW50OiAiIC4uIGFsaWduKQorCisKKy0tIGNoZWNrIGVycm9ycyBpbiBhcmd1bWVudHMKK2Z1bmN0aW9uIGNoZWNrZXJyb3IgKG1zZywgZiwgLi4uKQorICBsb2NhbCBzdGF0dXMsIGVyciA9IHBjYWxsKGYsIC4uLikKKyAgLS0gcHJpbnQoc3RhdHVzLCBlcnIsIG1zZykKKyAgYXNzZXJ0KG5vdCBzdGF0dXMgYW5kIHN0cmluZy5maW5kKGVyciwgbXNnKSkKK2VuZAorCistLSBtaW5pbXVtIGJlaGF2aW9yIGZvciBpbnRlZ2VyIGZvcm1hdHMKK2Fzc2VydCh1bnBhY2soIkIiLCBwYWNrKCJCIiwgMHhmZikpID09IDB4ZmYpCithc3NlcnQodW5wYWNrKCJiIiwgcGFjaygiYiIsIDB4N2YpKSA9PSAweDdmKQorYXNzZXJ0KHVucGFjaygiYiIsIHBhY2soImIiLCAtMHg4MCkpID09IC0weDgwKQorCithc3NlcnQodW5wYWNrKCJIIiwgcGFjaygiSCIsIDB4ZmZmZikpID09IDB4ZmZmZikKK2Fzc2VydCh1bnBhY2soImgiLCBwYWNrKCJoIiwgMHg3ZmZmKSkgPT0gMHg3ZmZmKQorYXNzZXJ0KHVucGFjaygiaCIsIHBhY2soImgiLCAtMHg4MDAwKSkgPT0gLTB4ODAwMCkKKworYXNzZXJ0KHVucGFjaygiTCIsIHBhY2soIkwiLCAweGZmZmZmZmZmKSkgPT0gMHhmZmZmZmZmZikKK2Fzc2VydCh1bnBhY2soImwiLCBwYWNrKCJsIiwgMHg3ZmZmZmZmZikpID09IDB4N2ZmZmZmZmYpCithc3NlcnQodW5wYWNrKCJsIiwgcGFjaygibCIsIC0weDgwMDAwMDAwKSkgPT0gLTB4ODAwMDAwMDApCisKKworZm9yIGkgPSAxLCBOQiBkbworICAtLSBzbWFsbCBudW1iZXJzIHdpdGggc2lnbmFsIGV4dGVuc2lvbiAoIlx4RkYuLi4iKQorICBsb2NhbCBzID0gc3RyaW5nLnJlcCgiXHhmZiIsIGkpCisgIGFzc2VydChwYWNrKCJpIiAuLiBpLCAtMSkgPT0gcykKKyAgYXNzZXJ0KHBhY2tzaXplKCJpIiAuLiBpKSA9PSAjcykKKyAgYXNzZXJ0KHVucGFjaygiaSIgLi4gaSwgcykgPT0gLTEpCisKKyAgLS0gc21hbGwgdW5zaWduZWQgbnVtYmVyICgiXDAuLi5ceEFBIikKKyAgcyA9ICJceEFBIiAuLiBzdHJpbmcucmVwKCJcMCIsIGkgLSAxKQorICBhc3NlcnQocGFjaygiPEkiIC4uIGksIDB4QUEpID09IHMpCisgIGFzc2VydCh1bnBhY2soIjxJIiAuLiBpLCBzKSA9PSAweEFBKQorICBhc3NlcnQocGFjaygiPkkiIC4uIGksIDB4QUEpID09IHM6cmV2ZXJzZSgpKQorICBhc3NlcnQodW5wYWNrKCI+SSIgLi4gaSwgczpyZXZlcnNlKCkpID09IDB4QUEpCitlbmQKKworZG8KKyAgbG9jYWwgbG51bSA9IDB4MTMxMjExMTAwOTA4MDcwNjA1MDQwMzAyMDEKKyAgbG9jYWwgcyA9IHBhY2soIjxqIiwgbG51bSkKKyAgYXNzZXJ0KHVucGFjaygiPGoiLCBzKSA9PSBsbnVtKQorICBhc3NlcnQodW5wYWNrKCI8aSIgLi4gc2l6ZUxJICsgMSwgcyAuLiAiXDAiKSA9PSBsbnVtKQorICBhc3NlcnQodW5wYWNrKCI8aSIgLi4gc2l6ZUxJICsgMSwgcyAuLiAiXDAiKSA9PSBsbnVtKQorCisgIGZvciBpID0gc2l6ZUxJICsgMSwgTkIgZG8KKyAgICBsb2NhbCBzID0gcGFjaygiPGoiLCAtbG51bSkKKyAgICBhc3NlcnQodW5wYWNrKCI8aiIsIHMpID09IC1sbnVtKQorICAgIC0tIHN0cmluZ3Mgd2l0aCAoY29ycmVjdCkgZXh0cmEgYnl0ZXMKKyAgICBhc3NlcnQodW5wYWNrKCI8aSIgLi4gaSwgcyAuLiAoIlx4RkYiKTpyZXAoaSAtIHNpemVMSSkpID09IC1sbnVtKQorICAgIGFzc2VydCh1bnBhY2soIj5pIiAuLiBpLCAoIlx4RkYiKTpyZXAoaSAtIHNpemVMSSkgLi4gczpyZXZlcnNlKCkpID09IC1sbnVtKQorICAgIGFzc2VydCh1bnBhY2soIjxJIiAuLiBpLCBzIC4uICgiXDAiKTpyZXAoaSAtIHNpemVMSSkpID09IC1sbnVtKQorCisgICAgLS0gb3ZlcmZsb3dzCisgICAgY2hlY2tlcnJvcigiZG9lcyBub3QgZml0IiwgdW5wYWNrLCAiPEkiIC4uIGksICgiXHgwMCIpOnJlcChpIC0gMSkgLi4gIlwxIikKKyAgICBjaGVja2Vycm9yKCJkb2VzIG5vdCBmaXQiLCB1bnBhY2ssICI+aSIgLi4gaSwgIlwxIiAuLiAoIlx4MDAiKTpyZXAoaSAtIDEpKQorICBlbmQKK2VuZAorCitmb3IgaSA9IDEsIHNpemVMSSBkbworICBsb2NhbCBsc3RyID0gIlwxXDJcM1w0XDVcNlw3XDhcOVwxMFwxMVwxMlwxMyIKKyAgbG9jYWwgbG51bSA9IDB4MTMxMjExMTAwOTA4MDcwNjA1MDQwMzAyMDEKKyAgbG9jYWwgbiA9IGxudW0gJiAofigtMSA8PCAoaSAqIDgpKSkKKyAgbG9jYWwgcyA9IHN0cmluZy5zdWIobHN0ciwgMSwgaSkKKyAgYXNzZXJ0KHBhY2soIjxpIiAuLiBpLCBuKSA9PSBzKQorICBhc3NlcnQocGFjaygiPmkiIC4uIGksIG4pID09IHM6cmV2ZXJzZSgpKQorICBhc3NlcnQodW5wYWNrKCI+aSIgLi4gaSwgczpyZXZlcnNlKCkpID09IG4pCitlbmQKKworLS0gc2lnbiBleHRlbnNpb24KK2RvCisgIGxvY2FsIHUgPSAweGYwCisgIGZvciBpID0gMSwgc2l6ZUxJIC0gMSBkbworICAgIGFzc2VydCh1bnBhY2soIjxpIi4uaSwgIlx4ZjAiLi4oIlx4ZmYiKTpyZXAoaSAtIDEpKSA9PSAtMTYpCisgICAgYXNzZXJ0KHVucGFjaygiPkkiLi5pLCAiXHhmMCIuLigiXHhmZiIpOnJlcChpIC0gMSkpID09IHUpCisgICAgdSA9IHUgKiAyNTYgKyAweGZmCisgIGVuZAorZW5kCisKKy0tIG1peGVkIGVuZGlhbm5lc3MKK2RvCisgIGFzc2VydChwYWNrKCI+aTIgPGkyIiwgMTAsIDIwKSA9PSAiXDBcMTBcMjBcMCIpCisgIGxvY2FsIGEsIGIgPSB1bnBhY2soIjxpMiA+aTIiLCAiXDEwXDBcMFwyMCIpCisgIGFzc2VydChhID09IDEwIGFuZCBiID09IDIwKQorICBhc3NlcnQocGFjaygiPWk0IiwgMjAwMSkgPT0gcGFjaygiaTQiLCAyMDAxKSkKK2VuZAorCitwcmludCgidGVzdGluZyBpbnZhbGlkIGZvcm1hdHMiKQorCitjaGVja2Vycm9yKCJvdXQgb2YgbGltaXRzIiwgcGFjaywgImkwIiwgMCkKK2NoZWNrZXJyb3IoIm91dCBvZiBsaW1pdHMiLCBwYWNrLCAiaSIgLi4gTkIgKyAxLCAwKQorY2hlY2tlcnJvcigib3V0IG9mIGxpbWl0cyIsIHBhY2ssICIhIiAuLiBOQiArIDEsIDApCitjaGVja2Vycm9yKCIlKDE3JSkgb3V0IG9mIGxpbWl0cyAlWzEsMTYlXSIsIHBhY2ssICJYaSIgLi4gTkIgKyAxKQorY2hlY2tlcnJvcigiaW52YWxpZCBmb3JtYXQgb3B0aW9uICdyJyIsIHBhY2ssICJpM3IiLCAwKQorY2hlY2tlcnJvcigiMTYlLWJ5dGUgaW50ZWdlciIsIHVucGFjaywgImkxNiIsIHN0cmluZy5yZXAoJ1wzJywgMTYpKQorY2hlY2tlcnJvcigibm90IHBvd2VyIG9mIDIiLCBwYWNrLCAiITRpMyIsIDApOworY2hlY2tlcnJvcigibWlzc2luZyBzaXplIiwgcGFjaywgImMiLCAiIikKK2NoZWNrZXJyb3IoInZhcmlhYmxlJS1sZW5ndGggZm9ybWF0IiwgcGFja3NpemUsICJzIikKK2NoZWNrZXJyb3IoInZhcmlhYmxlJS1sZW5ndGggZm9ybWF0IiwgcGFja3NpemUsICJ6IikKKworLS0gb3ZlcmZsb3cgaW4gb3B0aW9uIHNpemUgIChlcnJvciB3aWxsIGJlIGluIGRpZ2l0IGFmdGVyIGxpbWl0KQorY2hlY2tlcnJvcigiaW52YWxpZCBmb3JtYXQiLCBwYWNrc2l6ZSwgImMxIiAuLiBzdHJpbmcucmVwKCIwIiwgNDApKQorCitpZiBwYWNrc2l6ZSgiaSIpID09IDQgdGhlbgorICAtLSByZXN1bHQgd291bGQgYmUgMl4zMSAgKDJeMyByZXBldGl0aW9ucyBvZiAyXjI4IHN0cmluZ3MpCisgIGxvY2FsIHMgPSBzdHJpbmcucmVwKCJjMjY4NDM1NDU2IiwgMl4zKQorICBjaGVja2Vycm9yKCJ0b28gbGFyZ2UiLCBwYWNrc2l6ZSwgcykKKyAgLS0gb25lIGxlc3MgaXMgT0sKKyAgcyA9IHN0cmluZy5yZXAoImMyNjg0MzU0NTYiLCAyXjMgLSAxKSAuLiAiYzI2ODQzNTQ1NSIKKyAgYXNzZXJ0KHBhY2tzaXplKHMpID09IDB4N2ZmZmZmZmYpCitlbmQKKworLS0gb3ZlcmZsb3cgaW4gcGFja2luZworZm9yIGkgPSAxLCBzaXplTEkgLSAxIGRvCisgIGxvY2FsIHVtYXggPSAoMSA8PCAoaSAqIDgpKSAtIDEKKyAgbG9jYWwgbWF4ID0gdW1heCA+PiAxCisgIGxvY2FsIG1pbiA9IH5tYXgKKyAgY2hlY2tlcnJvcigib3ZlcmZsb3ciLCBwYWNrLCAiPEkiIC4uIGksIC0xKQorICBjaGVja2Vycm9yKCJvdmVyZmxvdyIsIHBhY2ssICI8SSIgLi4gaSwgbWluKQorICBjaGVja2Vycm9yKCJvdmVyZmxvdyIsIHBhY2ssICI+SSIgLi4gaSwgdW1heCArIDEpCisKKyAgY2hlY2tlcnJvcigib3ZlcmZsb3ciLCBwYWNrLCAiPmkiIC4uIGksIHVtYXgpCisgIGNoZWNrZXJyb3IoIm92ZXJmbG93IiwgcGFjaywgIj5pIiAuLiBpLCBtYXggKyAxKQorICBjaGVja2Vycm9yKCJvdmVyZmxvdyIsIHBhY2ssICI8aSIgLi4gaSwgbWluIC0gMSkKKworICBhc3NlcnQodW5wYWNrKCI+aSIgLi4gaSwgcGFjaygiPmkiIC4uIGksIG1heCkpID09IG1heCkKKyAgYXNzZXJ0KHVucGFjaygiPGkiIC4uIGksIHBhY2soIjxpIiAuLiBpLCBtaW4pKSA9PSBtaW4pCisgIGFzc2VydCh1bnBhY2soIj5JIiAuLiBpLCBwYWNrKCI+SSIgLi4gaSwgdW1heCkpID09IHVtYXgpCitlbmQKKworLS0gTHVhIGludGVnZXIgc2l6ZQorYXNzZXJ0KHVucGFjaygiPmoiLCBwYWNrKCI+aiIsIG1hdGgubWF4aW50ZWdlcikpID09IG1hdGgubWF4aW50ZWdlcikKK2Fzc2VydCh1bnBhY2soIjxqIiwgcGFjaygiPGoiLCBtYXRoLm1pbmludGVnZXIpKSA9PSBtYXRoLm1pbmludGVnZXIpCithc3NlcnQodW5wYWNrKCI8SiIsIHBhY2soIjxqIiwgLTEpKSA9PSAtMSkgICAtLSBtYXhpbXVtIHVuc2lnbmVkIGludGVnZXIKKworaWYgbGl0dGxlIHRoZW4KKyAgYXNzZXJ0KHBhY2soImYiLCAyNCkgPT0gcGFjaygiPGYiLCAyNCkpCitlbHNlCisgIGFzc2VydChwYWNrKCJmIiwgMjQpID09IHBhY2soIj5mIiwgMjQpKQorZW5kCisKK3ByaW50ICJ0ZXN0aW5nIHBhY2svdW5wYWNrIG9mIGZsb2F0aW5nLXBvaW50IG51bWJlcnMiIAorCitmb3IgXywgbiBpbiBpcGFpcnN7MCwgLTEuMSwgMS45LCAxLzAsIC0xLzAsIDFlMjAsIC0xZTIwLCAwLjEsIDIwMDAuN30gZG8KKyAgICBhc3NlcnQodW5wYWNrKCJuIiwgcGFjaygibiIsIG4pKSA9PSBuKQorICAgIGFzc2VydCh1bnBhY2soIjxuIiwgcGFjaygiPG4iLCBuKSkgPT0gbikKKyAgICBhc3NlcnQodW5wYWNrKCI+biIsIHBhY2soIj5uIiwgbikpID09IG4pCisgICAgYXNzZXJ0KHBhY2soIjxmIiwgbikgPT0gcGFjaygiPmYiLCBuKTpyZXZlcnNlKCkpCisgICAgYXNzZXJ0KHBhY2soIj5kIiwgbikgPT0gcGFjaygiPGQiLCBuKTpyZXZlcnNlKCkpCitlbmQKKworLS0gZm9yIG5vbi1uYXRpdmUgcHJlY2lzaW9ucywgdGVzdCBvbmx5IHdpdGggInJvdW5kIiBudW1iZXJzCitmb3IgXywgbiBpbiBpcGFpcnN7MCwgLTEuNSwgMS8wLCAtMS8wLCAxZTEwLCAtMWU5LCAwLjUsIDIwMDAuMjV9IGRvCisgIGFzc2VydCh1bnBhY2soIjxmIiwgcGFjaygiPGYiLCBuKSkgPT0gbikKKyAgYXNzZXJ0KHVucGFjaygiPmYiLCBwYWNrKCI+ZiIsIG4pKSA9PSBuKQorICBhc3NlcnQodW5wYWNrKCI8ZCIsIHBhY2soIjxkIiwgbikpID09IG4pCisgIGFzc2VydCh1bnBhY2soIj5kIiwgcGFjaygiPmQiLCBuKSkgPT0gbikKK2VuZAorCitwcmludCAidGVzdGluZyBwYWNrL3VucGFjayBvZiBzdHJpbmdzIgorZG8KKyAgbG9jYWwgcyA9IHN0cmluZy5yZXAoImFiYyIsIDEwMDApCisgIGFzc2VydChwYWNrKCJ6QiIsIHMsIDI0NykgPT0gcyAuLiAiXDBceEY3IikKKyAgbG9jYWwgczEsIGIgPSB1bnBhY2soInpCIiwgcyAuLiAiXDBceEY5IikKKyAgYXNzZXJ0KGIgPT0gMjQ5IGFuZCBzMSA9PSBzKQorICBzMSA9IHBhY2soInMiLCBzKQorICBhc3NlcnQodW5wYWNrKCJzIiwgczEpID09IHMpCisKKyAgY2hlY2tlcnJvcigiZG9lcyBub3QgZml0IiwgcGFjaywgInMxIiwgcykKKworICBjaGVja2Vycm9yKCJjb250YWlucyB6ZXJvcyIsIHBhY2ssICJ6IiwgImFsb1wwIik7CisKKyAgY2hlY2tlcnJvcigidW5maW5pc2hlZCBzdHJpbmciLCB1bnBhY2ssICJ6YzEwMDAwMDAwIiwgImFsbyIpCisKKyAgZm9yIGkgPSAyLCBOQiBkbworICAgIGxvY2FsIHMxID0gcGFjaygicyIgLi4gaSwgcykKKyAgICBhc3NlcnQodW5wYWNrKCJzIiAuLiBpLCBzMSkgPT0gcyBhbmQgI3MxID09ICNzICsgaSkKKyAgZW5kCitlbmQKKworZG8KKyAgbG9jYWwgeCA9IHBhY2soInMiLCAiYWxvIikKKyAgY2hlY2tlcnJvcigidG9vIHNob3J0IiwgdW5wYWNrLCAicyIsIHg6c3ViKDEsIC0yKSkKKyAgY2hlY2tlcnJvcigidG9vIHNob3J0IiwgdW5wYWNrLCAiYzUiLCAiYWJjZCIpCisgIGNoZWNrZXJyb3IoIm91dCBvZiBsaW1pdHMiLCBwYWNrLCAiczEwMCIsICJhbG8iKQorZW5kCisKK2RvCisgIGFzc2VydChwYWNrKCJjMCIsICIiKSA9PSAiIikKKyAgYXNzZXJ0KHBhY2tzaXplKCJjMCIpID09IDApCisgIGFzc2VydCh1bnBhY2soImMwIiwgIiIpID09ICIiKQorICBhc3NlcnQocGFjaygiPCEgYzMiLCAiYWJjIikgPT0gImFiYyIpCisgIGFzc2VydChwYWNrc2l6ZSgiPCEgYzMiKSA9PSAzKQorICBhc3NlcnQocGFjaygiPiE0IGM2IiwgImFiY2RlZiIpID09ICJhYmNkZWYiKQorICBhc3NlcnQocGFjaygiYzMiLCAiMTIzIikgPT0gIjEyMyIpCisgIGFzc2VydChwYWNrKCJjMCIsICIiKSA9PSAiIikKKyAgYXNzZXJ0KHBhY2soImM4IiwgIjEyMzQ1NiIpID09ICIxMjM0NTZcMFwwIikKKyAgYXNzZXJ0KHBhY2soImM4OCIsICIiKSA9PSBzdHJpbmcucmVwKCJcMCIsIDg4KSkKKyAgYXNzZXJ0KHBhY2soImMxODgiLCAiYWIiKSA9PSAiYWIiIC4uIHN0cmluZy5yZXAoIlwwIiwgMTg4IC0gMikpCisgIGxvY2FsIGEsIGIsIGMgPSB1bnBhY2soIiE0IHogYzMiLCAiYWJjZGVmZ2hpXDB4eXoiKQorICBhc3NlcnQoYSA9PSAiYWJjZGVmZ2hpIiBhbmQgYiA9PSAieHl6IiBhbmQgYyA9PSAxNCkKKyAgY2hlY2tlcnJvcigibG9uZ2VyIHRoYW4iLCBwYWNrLCAiYzMiLCAiMTIzNCIpCitlbmQKKworCistLSB0ZXN0aW5nIG11bHRpcGxlIHR5cGVzIGFuZCBzZXF1ZW5jZQorZG8KKyAgbG9jYWwgeCA9IHBhY2soIjxiIGggYiBmIGQgZiBuIGkiLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KQorICBhc3NlcnQoI3ggPT0gcGFja3NpemUoIjxiIGggYiBmIGQgZiBuIGkiKSkKKyAgbG9jYWwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCA9IHVucGFjaygiPGIgaCBiIGYgZCBmIG4gaSIsIHgpCisgIGFzc2VydChhID09IDEgYW5kIGIgPT0gMiBhbmQgYyA9PSAzIGFuZCBkID09IDQgYW5kIGUgPT0gNSBhbmQgZiA9PSA2IGFuZAorICAgICAgICAgZyA9PSA3IGFuZCBoID09IDgpIAorZW5kCisKK3ByaW50ICJ0ZXN0aW5nIGFsaWdubWVudCIKK2RvCisgIGFzc2VydChwYWNrKCIgPCBpMSBpMiAiLCAyLCAzKSA9PSAiXDJcM1wwIikgICAtLSBubyBhbGlnbm1lbnQgYnkgZGVmYXVsdAorICBsb2NhbCB4ID0gcGFjaygiPiE4IGIgWGggaTQgaTggYzEgWGk4IiwgLTEyLCAxMDAsIDIwMCwgIlx4RUMiKQorICBhc3NlcnQoI3ggPT0gcGFja3NpemUoIj4hOCBiIFhoIGk0IGk4IGMxIFhpOCIpKQorICBhc3NlcnQoeCA9PSAiXHhmNCIgLi4gIlwwXDBcMCIgLi4KKyAgICAgICAgICAgICAgIlwwXDBcMFwxMDAiIC4uCisgICAgICAgICAgICAgICJcMFwwXDBcMFwwXDBcMFx4QzgiIC4uIAorICAgICAgICAgICAgICAiXHhFQyIgLi4gIlwwXDBcMFwwXDBcMFwwIikKKyAgbG9jYWwgYSwgYiwgYywgZCwgcG9zID0gdW5wYWNrKCI+ITggYzEgWGggaTQgaTggYiBYaTggWEkgWEgiLCB4KQorICBhc3NlcnQoYSA9PSAiXHhGNCIgYW5kIGIgPT0gMTAwIGFuZCBjID09IDIwMCBhbmQgZCA9PSAtMjAgYW5kIChwb3MgLSAxKSA9PSAjeCkKKworICB4ID0gcGFjaygiPiE0IGMzIGM0IGMyIHogaTQgYzUgYzIgWGk0IiwKKyAgICAgICAgICAgICAgICAgICJhYmMiLCAiYWJjZCIsICJ4eiIsICJoZWxsbyIsIDUsICJ3b3JsZCIsICJ4eSIpCisgIGFzc2VydCh4ID09ICJhYmNhYmNkeHpoZWxsb1wwXDBcMFwwXDBcNXdvcmxkeHlcMCIpCisgIGxvY2FsIGEsIGIsIGMsIGQsIGUsIGYsIGcsIHBvcyA9IHVucGFjaygiPiE0IGMzIGM0IGMyIHogaTQgYzUgYzIgWGggWGk0IiwgeCkKKyAgYXNzZXJ0KGEgPT0gImFiYyIgYW5kIGIgPT0gImFiY2QiIGFuZCBjID09ICJ4eiIgYW5kIGQgPT0gImhlbGxvIiBhbmQKKyAgICAgICAgIGUgPT0gNSBhbmQgZiA9PSAid29ybGQiIGFuZCBnID09ICJ4eSIgYW5kIChwb3MgLSAxKSAlIDQgPT0gMCkKKworICB4ID0gcGFjaygiIGIgYiBYZCBiIFhiIHgiLCAxLCAyLCAzKQorICBhc3NlcnQocGFja3NpemUoIiBiIGIgWGQgYiBYYiB4IikgPT0gNCkKKyAgYXNzZXJ0KHggPT0gIlwxXDJcM1wwIikKKyAgYSwgYiwgYywgcG9zID0gdW5wYWNrKCJiYlhkYiIsIHgpCisgIGFzc2VydChhID09IDEgYW5kIGIgPT0gMiBhbmQgYyA9PSAzIGFuZCBwb3MgPT0gI3gpCisKKyAgLS0gb25seSBhbGlnbm1lbnQKKyAgYXNzZXJ0KHBhY2tzaXplKCIhOCB4WGk4IikgPT0gOCkKKyAgbG9jYWwgcG9zID0gdW5wYWNrKCIhOCB4WGk4IiwgIjAxMjM0NTY3MDEyMzQ1NjciKTsgYXNzZXJ0KHBvcyA9PSA5KQorICBhc3NlcnQocGFja3NpemUoIiE4IHhYaTIiKSA9PSAyKQorICBsb2NhbCBwb3MgPSB1bnBhY2soIiE4IHhYaTIiLCAiMDEyMzQ1NjcwMTIzNDU2NyIpOyBhc3NlcnQocG9zID09IDMpCisgIGFzc2VydChwYWNrc2l6ZSgiITIgeFhpMiIpID09IDIpCisgIGxvY2FsIHBvcyA9IHVucGFjaygiITIgeFhpMiIsICIwMTIzNDU2NzAxMjM0NTY3Iik7IGFzc2VydChwb3MgPT0gMykKKyAgYXNzZXJ0KHBhY2tzaXplKCIhMiB4WGk4IikgPT0gMikKKyAgbG9jYWwgcG9zID0gdW5wYWNrKCIhMiB4WGk4IiwgIjAxMjM0NTY3MDEyMzQ1NjciKTsgYXNzZXJ0KHBvcyA9PSAzKQorICBhc3NlcnQocGFja3NpemUoIiExNiB4WGkxNiIpID09IDE2KQorICBsb2NhbCBwb3MgPSB1bnBhY2soIiExNiB4WGkxNiIsICIwMTIzNDU2NzAxMjM0NTY3Iik7IGFzc2VydChwb3MgPT0gMTcpCisKKyAgY2hlY2tlcnJvcigiaW52YWxpZCBuZXh0IG9wdGlvbiIsIHBhY2ssICJYIikKKyAgY2hlY2tlcnJvcigiaW52YWxpZCBuZXh0IG9wdGlvbiIsIHVucGFjaywgIlhYaSIsICIiKQorICBjaGVja2Vycm9yKCJpbnZhbGlkIG5leHQgb3B0aW9uIiwgdW5wYWNrLCAiWCBpIiwgIiIpCisgIGNoZWNrZXJyb3IoImludmFsaWQgbmV4dCBvcHRpb24iLCBwYWNrLCAiWGMxIikKK2VuZAorCitkbyAgICAtLSB0ZXN0aW5nIGluaXRpYWwgcG9zaXRpb24KKyAgbG9jYWwgeCA9IHBhY2soImk0aTRpNGk0IiwgMSwgMiwgMywgNCkKKyAgZm9yIHBvcyA9IDEsIDE2LCA0IGRvCisgICAgbG9jYWwgaSwgcCA9IHVucGFjaygiaTQiLCB4LCBwb3MpCisgICAgYXNzZXJ0KGkgPT0gcG9zLy80ICsgMSBhbmQgcCA9PSBwb3MgKyA0KQorICBlbmQKKworICAtLSB3aXRoIGFsaWdubWVudAorICBmb3IgcG9zID0gMCwgMTIgZG8gICAgLS0gd2lsbCBhbHdheXMgcm91bmQgcG9zaXRpb24gdG8gcG93ZXIgb2YgMgorICAgIGxvY2FsIGksIHAgPSB1bnBhY2soIiE0IGk0IiwgeCwgcG9zICsgMSkKKyAgICBhc3NlcnQoaSA9PSAocG9zICsgMykvLzQgKyAxIGFuZCBwID09IGkqNCArIDEpCisgIGVuZAorCisgIC0tIG5lZ2F0aXZlIGluZGljZXMKKyAgbG9jYWwgaSwgcCA9IHVucGFjaygiITQgaTQiLCB4LCAtNCkKKyAgYXNzZXJ0KGkgPT0gNCBhbmQgcCA9PSAxNykKKyAgbG9jYWwgaSwgcCA9IHVucGFjaygiITQgaTQiLCB4LCAtNykKKyAgYXNzZXJ0KGkgPT0gNCBhbmQgcCA9PSAxNykKKyAgbG9jYWwgaSwgcCA9IHVucGFjaygiITQgaTQiLCB4LCAtI3gpCisgIGFzc2VydChpID09IDEgYW5kIHAgPT0gNSkKKworICAtLSBsaW1pdHMKKyAgZm9yIGkgPSAxLCAjeCArIDEgZG8KKyAgICBhc3NlcnQodW5wYWNrKCJjMCIsIHgsIGkpID09ICIiKQorICBlbmQKKyAgY2hlY2tlcnJvcigib3V0IG9mIHN0cmluZyIsIHVucGFjaywgImMwIiwgeCwgMCkKKyAgY2hlY2tlcnJvcigib3V0IG9mIHN0cmluZyIsIHVucGFjaywgImMwIiwgeCwgI3ggKyAyKQorICBjaGVja2Vycm9yKCJvdXQgb2Ygc3RyaW5nIiwgdW5wYWNrLCAiYzAiLCB4LCAtKCN4ICsgMSkpCisgCitlbmQKKworcHJpbnQgIk9LIgorCmRpZmYgLS1naXQgYS90ZXN0ZXMvdXRmOC5sdWEgYi90ZXN0ZXMvdXRmOC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjMTkwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rlcy91dGY4Lmx1YQpAQCAtMCwwICsxLDIxMCBAQAorLS0gJElkOiB1dGY4Lmx1YSx2IDEuMTIgMjAxNi8xMS8wNyAxMzoxMToyOCByb2JlcnRvIEV4cCAkCistLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBmaWxlIGFsbC5sdWEKKworcHJpbnQgInRlc3RpbmcgVVRGLTggbGlicmFyeSIKKworbG9jYWwgdXRmOCA9IHJlcXVpcmUndXRmOCcKKworCitsb2NhbCBmdW5jdGlvbiBjaGVja2Vycm9yIChtc2csIGYsIC4uLikKKyAgbG9jYWwgcywgZXJyID0gcGNhbGwoZiwgLi4uKQorICBhc3NlcnQobm90IHMgYW5kIHN0cmluZy5maW5kKGVyciwgbXNnKSkKK2VuZAorCisKK2xvY2FsIGZ1bmN0aW9uIGxlbiAocykKKyAgcmV0dXJuICNzdHJpbmcuZ3N1YihzLCAiW1x4ODAtXHhCRl0iLCAiIikKK2VuZAorCisKK2xvY2FsIGp1c3RvbmUgPSAiXiIgLi4gdXRmOC5jaGFycGF0dGVybiAuLiAiJCIKKworLS0gJ3QnIGlzIHRoZSBsaXN0IG9mIGNvZGVwb2ludHMgb2YgJ3MnCitsb2NhbCBmdW5jdGlvbiBjaGVja3N5bnRheCAocywgdCkKKyAgbG9jYWwgdHMgPSB7InJldHVybiAnIn0KKyAgZm9yIGkgPSAxLCAjdCBkbyB0c1tpICsgMV0gPSBzdHJpbmcuZm9ybWF0KCJcXHV7JXh9IiwgdFtpXSkgZW5kCisgIHRzWyN0ICsgMl0gPSAiJyIKKyAgdHMgPSB0YWJsZS5jb25jYXQodHMpCisgIGFzc2VydChhc3NlcnQobG9hZCh0cykpKCkgPT0gcykKK2VuZAorCithc3NlcnQodXRmOC5vZmZzZXQoImFsbyIsIDUpID09IG5pbCkKK2Fzc2VydCh1dGY4Lm9mZnNldCgiYWxvIiwgLTQpID09IG5pbCkKKworLS0gJ3QnIGlzIHRoZSBsaXN0IG9mIGNvZGVwb2ludHMgb2YgJ3MnCitsb2NhbCBmdW5jdGlvbiBjaGVjayAocywgdCkKKyAgbG9jYWwgbCA9IHV0ZjgubGVuKHMpIAorICBhc3NlcnQoI3QgPT0gbCBhbmQgbGVuKHMpID09IGwpCisgIGFzc2VydCh1dGY4LmNoYXIodGFibGUudW5wYWNrKHQpKSA9PSBzKQorCisgIGFzc2VydCh1dGY4Lm9mZnNldChzLCAwKSA9PSAxKQorCisgIGNoZWNrc3ludGF4KHMsIHQpCisKKyAgbG9jYWwgdDEgPSB7dXRmOC5jb2RlcG9pbnQocywgMSwgLTEpfQorICBhc3NlcnQoI3QgPT0gI3QxKQorICBmb3IgaSA9IDEsICN0IGRvIGFzc2VydCh0W2ldID09IHQxW2ldKSBlbmQKKworICBmb3IgaSA9IDEsIGwgZG8KKyAgICBsb2NhbCBwaSA9IHV0Zjgub2Zmc2V0KHMsIGkpICAgICAgICAtLSBwb3NpdGlvbiBvZiBpLXRoIGNoYXIKKyAgICBsb2NhbCBwaTEgPSB1dGY4Lm9mZnNldChzLCAyLCBwaSkgICAtLSBwb3NpdGlvbiBvZiBuZXh0IGNoYXIKKyAgICBhc3NlcnQoc3RyaW5nLmZpbmQoc3RyaW5nLnN1YihzLCBwaSwgcGkxIC0gMSksIGp1c3RvbmUpKQorICAgIGFzc2VydCh1dGY4Lm9mZnNldChzLCAtMSwgcGkxKSA9PSBwaSkKKyAgICBhc3NlcnQodXRmOC5vZmZzZXQocywgaSAtIGwgLSAxKSA9PSBwaSkKKyAgICBhc3NlcnQocGkxIC0gcGkgPT0gI3V0ZjguY2hhcih1dGY4LmNvZGVwb2ludChzLCBwaSkpKQorICAgIGZvciBqID0gcGksIHBpMSAtIDEgZG8gCisgICAgICBhc3NlcnQodXRmOC5vZmZzZXQocywgMCwgaikgPT0gcGkpCisgICAgZW5kCisgICAgZm9yIGogPSBwaSArIDEsIHBpMSAtIDEgZG8KKyAgICAgIGFzc2VydChub3QgdXRmOC5sZW4ocywgaikpCisgICAgZW5kCisgICBhc3NlcnQodXRmOC5sZW4ocywgcGksIHBpKSA9PSAxKQorICAgYXNzZXJ0KHV0ZjgubGVuKHMsIHBpLCBwaTEgLSAxKSA9PSAxKQorICAgYXNzZXJ0KHV0ZjgubGVuKHMsIHBpKSA9PSBsIC0gaSArIDEpCisgICBhc3NlcnQodXRmOC5sZW4ocywgcGkxKSA9PSBsIC0gaSkKKyAgIGFzc2VydCh1dGY4LmxlbihzLCAxLCBwaSkgPT0gaSkKKyAgZW5kCisKKyAgbG9jYWwgaSA9IDAKKyAgZm9yIHAsIGMgaW4gdXRmOC5jb2RlcyhzKSBkbworICAgIGkgPSBpICsgMQorICAgIGFzc2VydChjID09IHRbaV0gYW5kIHAgPT0gdXRmOC5vZmZzZXQocywgaSkpCisgICAgYXNzZXJ0KHV0ZjguY29kZXBvaW50KHMsIHApID09IGMpCisgIGVuZAorICBhc3NlcnQoaSA9PSAjdCkKKworICBpID0gMAorICBmb3IgcCwgYyBpbiB1dGY4LmNvZGVzKHMpIGRvCisgICAgaSA9IGkgKyAxCisgICAgYXNzZXJ0KGMgPT0gdFtpXSBhbmQgcCA9PSB1dGY4Lm9mZnNldChzLCBpKSkgCisgIGVuZAorICBhc3NlcnQoaSA9PSAjdCkKKworICBpID0gMAorICBmb3IgYyBpbiBzdHJpbmcuZ21hdGNoKHMsIHV0ZjguY2hhcnBhdHRlcm4pIGRvCisgICAgaSA9IGkgKyAxCisgICAgYXNzZXJ0KGMgPT0gdXRmOC5jaGFyKHRbaV0pKQorICBlbmQKKyAgYXNzZXJ0KGkgPT0gI3QpCisKKyAgZm9yIGkgPSAxLCBsIGRvCisgICAgYXNzZXJ0KHV0Zjgub2Zmc2V0KHMsIGkpID09IHV0Zjgub2Zmc2V0KHMsIGkgLSBsIC0gMSwgI3MgKyAxKSkKKyAgZW5kCisKK2VuZAorCisKK2RvICAgIC0tIGVycm9yIGluZGljYXRpb24gaW4gdXRmOC5sZW4KKyAgbG9jYWwgZnVuY3Rpb24gY2hlY2sgKHMsIHApCisgICAgbG9jYWwgYSwgYiA9IHV0ZjgubGVuKHMpCisgICAgYXNzZXJ0KG5vdCBhIGFuZCBiID09IHApCisgIGVuZAorICBjaGVjaygiYWJjXHhFM2RlZiIsIDQpCisgIGNoZWNrKCLmsYnlrZdceDgwIiwgIygi5rGJ5a2XIikgKyAxKQorICBjaGVjaygiXHhGNFx4OUZceEJGIiwgMSkKKyAgY2hlY2soIlx4RjRceDlGXHhCRlx4QkYiLCAxKQorZW5kCisKKy0tIGVycm9yIGluIHV0ZjguY29kZXMKK2NoZWNrZXJyb3IoImludmFsaWQgVVRGJS04IGNvZGUiLAorICBmdW5jdGlvbiAoKQorICAgIGxvY2FsIHMgPSAiYWJceGZmIgorICAgIGZvciBjIGluIHV0ZjguY29kZXMocykgZG8gYXNzZXJ0KGMpIGVuZAorICBlbmQpCisKKworLS0gZXJyb3IgaW4gaW5pdGlhbCBwb3NpdGlvbiBmb3Igb2Zmc2V0CitjaGVja2Vycm9yKCJwb3NpdGlvbiBvdXQgb2YgcmFuZ2UiLCB1dGY4Lm9mZnNldCwgImFiYyIsIDEsIDUpCitjaGVja2Vycm9yKCJwb3NpdGlvbiBvdXQgb2YgcmFuZ2UiLCB1dGY4Lm9mZnNldCwgImFiYyIsIDEsIC00KQorY2hlY2tlcnJvcigicG9zaXRpb24gb3V0IG9mIHJhbmdlIiwgdXRmOC5vZmZzZXQsICIiLCAxLCAyKQorY2hlY2tlcnJvcigicG9zaXRpb24gb3V0IG9mIHJhbmdlIiwgdXRmOC5vZmZzZXQsICIiLCAxLCAtMSkKK2NoZWNrZXJyb3IoImNvbnRpbnVhdGlvbiBieXRlIiwgdXRmOC5vZmZzZXQsICLwpqe6IiwgMSwgMikKK2NoZWNrZXJyb3IoImNvbnRpbnVhdGlvbiBieXRlIiwgdXRmOC5vZmZzZXQsICLwpqe6IiwgMSwgMikKK2NoZWNrZXJyb3IoImNvbnRpbnVhdGlvbiBieXRlIiwgdXRmOC5vZmZzZXQsICJceDgwIiwgMSkKKworCisKK2xvY2FsIHMgPSAiaGVsbG8gV29ybGQiCitsb2NhbCB0ID0ge3N0cmluZy5ieXRlKHMsIDEsIC0xKX0KK2ZvciBpID0gMSwgdXRmOC5sZW4ocykgZG8gYXNzZXJ0KHRbaV0gPT0gc3RyaW5nLmJ5dGUocywgaSkpIGVuZAorY2hlY2socywgdCkKKworY2hlY2soIuaxieWtly/mvKLlrZciLCB7Mjc3MjEsIDIzMzgzLCA0NywgMjg0NTAsIDIzMzgzLH0pCisKK2RvCisgIGxvY2FsIHMgPSAiw6HDqcOtXDEyOCIKKyAgbG9jYWwgdCA9IHt1dGY4LmNvZGVwb2ludChzLDEsI3MgLSAxKX0KKyAgYXNzZXJ0KCN0ID09IDMgYW5kIHRbMV0gPT0gMjI1IGFuZCB0WzJdID09IDIzMyBhbmQgdFszXSA9PSAyMzcpCisgIGNoZWNrZXJyb3IoImludmFsaWQgVVRGJS04IGNvZGUiLCB1dGY4LmNvZGVwb2ludCwgcywgMSwgI3MpCisgIGNoZWNrZXJyb3IoIm91dCBvZiByYW5nZSIsIHV0ZjguY29kZXBvaW50LCBzLCAjcyArIDEpCisgIHQgPSB7dXRmOC5jb2RlcG9pbnQocywgNCwgMyl9CisgIGFzc2VydCgjdCA9PSAwKQorICBjaGVja2Vycm9yKCJvdXQgb2YgcmFuZ2UiLCB1dGY4LmNvZGVwb2ludCwgcywgLSgjcyArIDEpLCAxKQorICBjaGVja2Vycm9yKCJvdXQgb2YgcmFuZ2UiLCB1dGY4LmNvZGVwb2ludCwgcywgMSwgI3MgKyAxKQorZW5kCisKK2Fzc2VydCh1dGY4LmNoYXIoKSA9PSAiIikKK2Fzc2VydCh1dGY4LmNoYXIoOTcsIDk4LCA5OSkgPT0gImFiYyIpCisKK2Fzc2VydCh1dGY4LmNvZGVwb2ludCh1dGY4LmNoYXIoMHgxMEZGRkYpKSA9PSAweDEwRkZGRikKKworY2hlY2tlcnJvcigidmFsdWUgb3V0IG9mIHJhbmdlIiwgdXRmOC5jaGFyLCAweDEwRkZGRiArIDEpCisKK2xvY2FsIGZ1bmN0aW9uIGludmFsaWQgKHMpCisgIGNoZWNrZXJyb3IoImludmFsaWQgVVRGJS04IGNvZGUiLCB1dGY4LmNvZGVwb2ludCwgcykKKyAgYXNzZXJ0KG5vdCB1dGY4LmxlbihzKSkKK2VuZAorCistLSBVVEYtOCByZXByZXNlbnRhdGlvbiBmb3IgMHgxMWZmZmYgKHZhbHVlIG91dCBvZiB2YWxpZCByYW5nZSkKK2ludmFsaWQoIlx4RjRceDlGXHhCRlx4QkYiKQorCistLSBvdmVybG9uZyBzZXF1ZW5jZXMKK2ludmFsaWQoIlx4QzBceDgwIikgICAgICAgICAgLS0gemVybworaW52YWxpZCgiXHhDMVx4QkYiKSAgICAgICAgICAtLSAweDdGIChzaG91bGQgYmUgY29kZWQgaW4gMSBieXRlKQoraW52YWxpZCgiXHhFMFx4OUZceEJGIikgICAgICAtLSAweDdGRiAoc2hvdWxkIGJlIGNvZGVkIGluIDIgYnl0ZXMpCitpbnZhbGlkKCJceEYwXHg4Rlx4QkZceEJGIikgIC0tIDB4RkZGRiAoc2hvdWxkIGJlIGNvZGVkIGluIDMgYnl0ZXMpCisKKworLS0gaW52YWxpZCBieXRlcworaW52YWxpZCgiXHg4MCIpICAtLSBjb250aW51YXRpb24gYnl0ZQoraW52YWxpZCgiXHhCRiIpICAtLSBjb250aW51YXRpb24gYnl0ZQoraW52YWxpZCgiXHhGRSIpICAtLSBpbnZhbGlkIGJ5dGUKK2ludmFsaWQoIlx4RkYiKSAgLS0gaW52YWxpZCBieXRlCisKKworLS0gZW1wdHkgc3RyaW5nCitjaGVjaygiIiwge30pCisKKy0tIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGZvciBlYWNoIHNlcXVlbmNlIHNpemUKK3MgPSAiXDAgXHg3Rlx6CisgICAgIFx4QzJceDgwIFx4REZceEJGXHoKKyAgICAgXHhFMFx4QTBceDgwIFx4RUZceEJGXHhCRlx6CisgICAgIFx4RjBceDkwXHg4MFx4ODAgIFx4RjRceDhGXHhCRlx4QkYiCitzID0gc3RyaW5nLmdzdWIocywgIiAiLCAiIikKK2NoZWNrKHMsIHswLDB4N0YsIDB4ODAsMHg3RkYsIDB4ODAwLDB4RkZGRiwgMHgxMDAwMCwweDEwRkZGRn0pCisKK3ggPSAi5pel5pys6KqeYS00XDDDqcOzIgorY2hlY2soeCwgezI2MDg1LCAyNjQxMiwgMzU0ODYsIDk3LCA0NSwgNTIsIDAsIDIzMywgMjQzfSkKKworCistLSBTdXBwbGVtZW50YXJ5IENoYXJhY3RlcnMKK2NoZWNrKCLwo7K38KCcjvCgsZPwoYG78KC1vGFi8KC6oiIsCisgICAgICB7MHgyM0NCNywgMHgyMDcwRSwgMHgyMEM1MywgMHgyMTA3QiwgMHgyMEQ3QywgMHg2MSwgMHg2MiwgMHgyMEVBMix9KQorCitjaGVjaygi8KizivCptpjwpqe68KizkvClhKvwpJOTXHhGNFx4OEZceEJGXHhCRiIsCisgICAgICB7MHgyOENDQSwgMHgyOUQ5OCwgMHgyNjlGQSwgMHgyOENEMiwgMHgyNTEyQiwgMHgyNDREMywgMHgxMGZmZmZ9KQorCisKK2xvY2FsIGkgPSAwCitmb3IgcCwgYyBpbiBzdHJpbmcuZ21hdGNoKHgsICIoKSgiIC4uIHV0ZjguY2hhcnBhdHRlcm4gLi4gIikiKSBkbworICBpID0gaSArIDEKKyAgYXNzZXJ0KHV0Zjgub2Zmc2V0KHgsIGkpID09IHApCisgIGFzc2VydCh1dGY4Lmxlbih4LCBwKSA9PSB1dGY4Lmxlbih4KSAtIGkgKyAxKQorICBhc3NlcnQodXRmOC5sZW4oYykgPT0gMSkKKyAgZm9yIGogPSAxLCAjYyAtIDEgZG8KKyAgICBhc3NlcnQodXRmOC5vZmZzZXQoeCwgMCwgcCArIGogLSAxKSA9PSBwKQorICBlbmQKK2VuZAorCitwcmludCdvaycKKwpkaWZmIC0tZ2l0IGEvdGVzdGVzL3ZhcmFyZy5sdWEgYi90ZXN0ZXMvdmFyYXJnLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDVjZTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGVzL3ZhcmFyZy5sdWEKQEAgLTAsMCArMSwxNTEgQEAKKy0tICRJZDogdmFyYXJnLmx1YSx2IDEuMjkgMjAxOC8wMy8xMiAxNDoxOTozNiByb2JlcnRvIEV4cCAkCistLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBmaWxlIGFsbC5sdWEKKworcHJpbnQoJ3Rlc3RpbmcgdmFyYXJnJykKKworZnVuY3Rpb24gZihhLCAuLi4pCisgIGxvY2FsIHggPSB7biA9IHNlbGVjdCgnIycsIC4uLiksIC4uLn0KKyAgZm9yIGkgPSAxLCB4Lm4gZG8gYXNzZXJ0KGFbaV0gPT0geFtpXSkgZW5kCisgIHJldHVybiB4Lm4KK2VuZAorCitmdW5jdGlvbiBjMTIgKC4uLikKKyAgYXNzZXJ0KGFyZyA9PSBfRy5hcmcpICAgIC0tIG5vIGxvY2FsICdhcmcnCisgIGxvY2FsIHggPSB7Li4ufTsgeC5uID0gI3gKKyAgbG9jYWwgcmVzID0gKHgubj09MiBhbmQgeFsxXSA9PSAxIGFuZCB4WzJdID09IDIpCisgIGlmIHJlcyB0aGVuIHJlcyA9IDU1IGVuZAorICByZXR1cm4gcmVzLCAyCitlbmQKKworZnVuY3Rpb24gdmFyYXJnICguLi4pIHJldHVybiB7biA9IHNlbGVjdCgnIycsIC4uLiksIC4uLn0gZW5kCisKK2xvY2FsIGNhbGwgPSBmdW5jdGlvbiAoZiwgYXJncykgcmV0dXJuIGYodGFibGUudW5wYWNrKGFyZ3MsIDEsIGFyZ3MubikpIGVuZAorCithc3NlcnQoZigpID09IDApCithc3NlcnQoZih7MSwyLDN9LCAxLCAyLCAzKSA9PSAzKQorYXNzZXJ0KGYoeyJhbG8iLCBuaWwsIDQ1LCBmLCBuaWx9LCAiYWxvIiwgbmlsLCA0NSwgZiwgbmlsKSA9PSA1KQorCithc3NlcnQodmFyYXJnKCkubiA9PSAwKQorYXNzZXJ0KHZhcmFyZyhuaWwsIG5pbCkubiA9PSAyKQorCithc3NlcnQoYzEyKDEsMik9PTU1KQorYSxiID0gYXNzZXJ0KGNhbGwoYzEyLCB7MSwyfSkpCithc3NlcnQoYSA9PSA1NSBhbmQgYiA9PSAyKQorYSA9IGNhbGwoYzEyLCB7MSwyO249Mn0pCithc3NlcnQoYSA9PSA1NSBhbmQgYiA9PSAyKQorYSA9IGNhbGwoYzEyLCB7MSwyO249MX0pCithc3NlcnQobm90IGEpCithc3NlcnQoYzEyKDEsMiwzKSA9PSBmYWxzZSkKK2xvY2FsIGEgPSB2YXJhcmcoY2FsbChuZXh0LCB7X0csbmlsO249Mn0pKQorbG9jYWwgYixjID0gbmV4dChfRykKK2Fzc2VydChhWzFdID09IGIgYW5kIGFbMl0gPT0gYyBhbmQgYS5uID09IDIpCithID0gdmFyYXJnKGNhbGwoY2FsbCwge2MxMiwgezEsMn19KSkKK2Fzc2VydChhLm4gPT0gMiBhbmQgYVsxXSA9PSA1NSBhbmQgYVsyXSA9PSAyKQorYSA9IGNhbGwocHJpbnQsIHsnKyd9KQorYXNzZXJ0KGEgPT0gbmlsKQorCitsb2NhbCB0ID0gezEsIDEwfQorZnVuY3Rpb24gdDpmICguLi4pIGxvY2FsIGFyZyA9IHsuLi59OyByZXR1cm4gc2VsZlsuLi5dKyNhcmcgZW5kCithc3NlcnQodDpmKDEsNCkgPT0gMyBhbmQgdDpmKDIpID09IDExKQorcHJpbnQoJysnKQorCitsaW0gPSAyMAorbG9jYWwgaSwgYSA9IDEsIHt9Cit3aGlsZSBpIDw9IGxpbSBkbyBhW2ldID0gaSswLjM7IGk9aSsxIGVuZAorCitmdW5jdGlvbiBmKGEsIGIsIGMsIGQsIC4uLikKKyAgbG9jYWwgbW9yZSA9IHsuLi59CisgIGFzc2VydChhID09IDEuMyBhbmQgbW9yZVsxXSA9PSA1LjMgYW5kCisgICAgICAgICBtb3JlW2xpbS00XSA9PSBsaW0rMC4zIGFuZCBub3QgbW9yZVtsaW0tM10pCitlbmQKKworZnVuY3Rpb24gZyhhLGIsYykKKyAgYXNzZXJ0KGEgPT0gMS4zIGFuZCBiID09IDIuMyBhbmQgYyA9PSAzLjMpCitlbmQKKworY2FsbChmLCBhKQorY2FsbChnLCBhKQorCithID0ge30KK2kgPSAxCit3aGlsZSBpIDw9IGxpbSBkbyBhW2ldID0gaTsgaT1pKzEgZW5kCithc3NlcnQoY2FsbChtYXRoLm1heCwgYSkgPT0gbGltKQorCitwcmludCgiKyIpCisKKworLS0gbmV3LXN0eWxlIHZhcmFyZ3MKKworZnVuY3Rpb24gb25lbGVzcyAoYSwgLi4uKSByZXR1cm4gLi4uIGVuZAorCitmdW5jdGlvbiBmIChuLCBhLCAuLi4pCisgIGxvY2FsIGIKKyAgYXNzZXJ0KGFyZyA9PSBfRy5hcmcpICAgLS0gbm8gbG9jYWwgJ2FyZycKKyAgaWYgbiA9PSAwIHRoZW4KKyAgICBsb2NhbCBiLCBjLCBkID0gLi4uCisgICAgcmV0dXJuIGEsIGIsIGMsIGQsIG9uZWxlc3Mob25lbGVzcyhvbmVsZXNzKC4uLikpKQorICBlbHNlCisgICAgbiwgYiwgYSA9IG4tMSwgLi4uLCBhCisgICAgYXNzZXJ0KGIgPT0gLi4uKQorICAgIHJldHVybiBmKG4sIGEsIC4uLikKKyAgZW5kCitlbmQKKworYSxiLGMsZCxlID0gYXNzZXJ0KGYoMTAsNSw0LDMsMiwxKSkKK2Fzc2VydChhPT01IGFuZCBiPT00IGFuZCBjPT0zIGFuZCBkPT0yIGFuZCBlPT0xKQorCithLGIsYyxkLGUgPSBmKDQpCithc3NlcnQoYT09bmlsIGFuZCBiPT1uaWwgYW5kIGM9PW5pbCBhbmQgZD09bmlsIGFuZCBlPT1uaWwpCisKKworLS0gdmFyYXJncyBmb3IgbWFpbiBjaHVua3MKK2YgPSBsb2FkW1sgcmV0dXJuIHsuLi59IF1dCit4ID0gZigyLDMpCithc3NlcnQoeFsxXSA9PSAyIGFuZCB4WzJdID09IDMgYW5kIHhbM10gPT0gdW5kZWYpCisKKworZiA9IGxvYWRbWworICBsb2NhbCB4ID0gey4uLn0KKyAgZm9yIGk9MSxzZWxlY3QoJyMnLCAuLi4pIGRvIGFzc2VydCh4W2ldID09IHNlbGVjdChpLCAuLi4pKSBlbmQKKyAgYXNzZXJ0KHhbc2VsZWN0KCcjJywgLi4uKSsxXSA9PSB1bmRlZikKKyAgcmV0dXJuIHRydWUKK11dCisKK2Fzc2VydChmKCJhIiwgImIiLCBuaWwsIHt9LCBhc3NlcnQpKQorYXNzZXJ0KGYoKSkKKworYSA9IHtzZWxlY3QoMywgdGFibGUudW5wYWNrezEwLDIwLDMwLDQwfSl9Cithc3NlcnQoI2EgPT0gMiBhbmQgYVsxXSA9PSAzMCBhbmQgYVsyXSA9PSA0MCkKK2EgPSB7c2VsZWN0KDEpfQorYXNzZXJ0KG5leHQoYSkgPT0gbmlsKQorYSA9IHtzZWxlY3QoLTEsIDMsIDUsIDcpfQorYXNzZXJ0KGFbMV0gPT0gNyBhbmQgYVsyXSA9PSB1bmRlZikKK2EgPSB7c2VsZWN0KC0yLCAzLCA1LCA3KX0KK2Fzc2VydChhWzFdID09IDUgYW5kIGFbMl0gPT0gNyBhbmQgYVszXSA9PSB1bmRlZikKK3BjYWxsKHNlbGVjdCwgMTAwMDApCitwY2FsbChzZWxlY3QsIC0xMDAwMCkKKworCistLSBidWcgaW4gNS4yLjIKKworZnVuY3Rpb24gZihwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5LCBwMTAsCitwMTEsIHAxMiwgcDEzLCBwMTQsIHAxNSwgcDE2LCBwMTcsIHAxOCwgcDE5LCBwMjAsCitwMjEsIHAyMiwgcDIzLCBwMjQsIHAyNSwgcDI2LCBwMjcsIHAyOCwgcDI5LCBwMzAsCitwMzEsIHAzMiwgcDMzLCBwMzQsIHAzNSwgcDM2LCBwMzcsIHAzOCwgcDM5LCBwNDAsCitwNDEsIHA0MiwgcDQzLCBwNDQsIHA0NSwgcDQ2LCBwNDgsIHA0OSwgcDUwLCAuLi4pCisgIGxvY2FsIGExLGEyLGEzLGE0LGE1LGE2LGE3CisgIGxvY2FsIGE4LGE5LGExMCxhMTEsYTEyLGExMyxhMTQKK2VuZAorCistLSBhc3NlcnRpb24gZmFpbCBoZXJlCitmKCkKKworLS0gbWlzc2luZyBhcmd1bWVudHMgaW4gdGFpbCBjYWxsCitkbworICBsb2NhbCBmdW5jdGlvbiBmKGEsYixjKSByZXR1cm4gYywgYiBlbmQKKyAgbG9jYWwgZnVuY3Rpb24gZygpIHJldHVybiBmKDEsMikgZW5kCisgIGxvY2FsIGEsIGIgPSBnKCkKKyAgYXNzZXJ0KGEgPT0gbmlsIGFuZCBiID09IDIpCitlbmQKK3ByaW50KCdPSycpCisKZGlmZiAtLWdpdCBhL3Rlc3Rlcy92ZXJ5YmlnLmx1YSBiL3Rlc3Rlcy92ZXJ5YmlnLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjI5ZGVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGVzL3ZlcnliaWcubHVhCkBAIC0wLDAgKzEsMTUyIEBACistLSAkSWQ6IHZlcnliaWcubHVhLHYgMS4yNyAyMDE4LzAzLzA5IDE0OjIzOjQ4IHJvYmVydG8gRXhwICQKKy0tIFNlZSBDb3B5cmlnaHQgTm90aWNlIGluIGZpbGUgYWxsLmx1YQorCitwcmludCAidGVzdGluZyBSSyIKKworLS0gdGVzdGluZyBvcGNvZGVzIHdpdGggUksgYXJndW1lbnRzIGxhcmdlciB0aGFuIEsgbGltaXQKK2xvY2FsIGZ1bmN0aW9uIGZvbyAoKQorICBsb2NhbCBkdW1teSA9IHsKKyAgICAgLS0gZmlsbCBmaXJzdCAyNTYgZW50cmllcyBpbiB0YWJsZSBvZiBjb25zdGFudHMKKyAgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCisgICAgIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLAorICAgICAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKKyAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsCisgICAgIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLAorICAgICA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwKKyAgICAgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsCisgICAgIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLAorICAgICAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwKKyAgICAgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsCisgICAgIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LAorICAgICAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsIDE0NCwKKyAgICAgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsCisgICAgIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwgMTYwLAorICAgICAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwKKyAgICAgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMsIDE3NCwgMTc1LCAxNzYsCisgICAgIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LAorICAgICAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwKKyAgICAgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsCisgICAgIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LAorICAgICAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwKKyAgICAgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLCAyMjQsCisgICAgIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLAorICAgICAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwKKyAgICAgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsCisgICAgIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2LAorICB9CisgIGFzc2VydCgyNC41ICsgMC42ID09IDI1LjEpCisgIGxvY2FsIHQgPSB7Zm9vID0gZnVuY3Rpb24gKHNlbGYsIHgpIHJldHVybiB4ICsgc2VsZi54IGVuZCwgeCA9IDEwfQorICB0LnQgPSB0CisgIGFzc2VydCh0OmZvbygxLjUpID09IDExLjUpCisgIGFzc2VydCh0LnQ6Zm9vKDAuNSkgPT0gMTAuNSkgICAtLSBidWcgaW4gNS4yIGFscGhhCisgIGFzc2VydCgyNC4zID09IDI0LjMpCisgIGFzc2VydCgoZnVuY3Rpb24gKCkgcmV0dXJuIHQueCBlbmQpKCkgPT0gMTApCitlbmQKKworCitmb28oKQorZm9vID0gbmlsCisKK2lmIF9zb2Z0IHRoZW4gcmV0dXJuIDEwIGVuZAorCitwcmludCAidGVzdGluZyBsYXJnZSBwcm9ncmFtcyAoPjY0aykiCisKKy0tIHRlbXBsYXRlIHRvIGNyZWF0ZSBhIHZlcnkgYmlnIHRlc3QgZmlsZQorcHJvZyA9IFtbJAorCitsb2NhbCBhLGIKKworYiA9IHskMSQKKyAgYjMwMDA5ID0gNjU1MzQsCisgIGIzMDAxMCA9IDY1NTM1LAorICBiMzAwMTEgPSA2NTUzNiwKKyAgYjMwMDEyID0gNjU1MzcsCisgIGIzMDAxMyA9IDE2Nzc3MjE0LAorICBiMzAwMTQgPSAxNjc3NzIxNSwKKyAgYjMwMDE1ID0gMTY3NzcyMTYsCisgIGIzMDAxNiA9IDE2Nzc3MjE3LAorICBiMzAwMTcgPSAweDdmZmZmZiwKKyAgYjMwMDE4ID0gLTB4N2ZmZmZmLAorICBiMzAwMTkgPSAweDFmZmZmZmYsCisgIGIzMDAyMCA9IC0weDFmZmZmZCwKKyAgYjMwMDIxID0gLTY1NTM0LAorICBiMzAwMjIgPSAtNjU1MzUsCisgIGIzMDAyMyA9IC02NTUzNiwKKyAgYjMwMDI0ID0gLTB4ZmZmZmZmLAorICBiMzAwMjUgPSAxNTAxMi41LAorICAkMiQKK307CisKK2Fzc2VydChiLmE1MDAwOCA9PSAyNTAwNCBhbmQgYlsiYTExIl0gPT0gLTUuNSkKK2Fzc2VydChiLmEzMzAwNyA9PSAtMTY1MDMuNSBhbmQgYi5hNTAwMDkgPT0gLTI1MDA0LjUpCithc3NlcnQoYlsiYiIuLjMwMDI0XSA9PSAtMHhmZmZmZmYpCisKK2Z1bmN0aW9uIGI6eHh4IChhLGIpIHJldHVybiBhK2IgZW5kCithc3NlcnQoYjp4eHgoMTAsIDEyKSA9PSAyMikgICAtLSBwdXNoc2VsZiB3aXRoIG5vbi1jb25zdGFudCBpbmRleAorYlsieHh4Il0gPSB1bmRlZgorCitzID0gMDsgbj0wCitmb3IgYSxiIGluIHBhaXJzKGIpIGRvIHM9cytiOyBuPW4rMSBlbmQKKy0tIHdpdGggMzItYml0IGZsb2F0cywgZXhhY3QgdmFsdWUgb2YgJ3MnIGRlcGVuZHMgb24gc3VtbWF0aW9uIG9yZGVyCithc3NlcnQoODE4MDAwMDAuMCA8IHMgYW5kIHMgPCA4MTg2MDAwMCBhbmQgbiA9PSA3MDAwMSkKKworYSA9IG5pbDsgYiA9IG5pbAorcHJpbnQnKycKKworZnVuY3Rpb24gZih4KSBiPXggZW5kCisKK2EgPSBmeyQzJH0gb3IgMTAKKworYXNzZXJ0KGE9PTEwKQorYXNzZXJ0KGJbMV0gPT0gImExMCIgYW5kIGJbMl0gPT0gNSBhbmQgYlsjYi0xXSA9PSAiYTUwMDA5IikKKworCitmdW5jdGlvbiB4eHh4ICh4KSByZXR1cm4gYlt4XSBlbmQKKworYXNzZXJ0KHh4eHgoMykgPT0gImExMSIpCisKK2EgPSBuaWw7IGI9bmlsCit4eHh4ID0gbmlsCisKK3JldHVybiAxMAorCitdXQorCistLSBmdW5jdGlvbnMgdG8gZmlsbCBpbiB0aGUgJG4kCisKK2xvY2FsIGZ1bmN0aW9uIHNpZyAoeCkKKyAgcmV0dXJuICh4ICUgMiA9PSAwKSBhbmQgJycgb3IgJy0nCitlbmQKKworRiA9IHsKK2Z1bmN0aW9uICgpICAgLS0gJDEkCisgIGZvciBpPTEwLDUwMDA5IGRvCisgICAgaW8ud3JpdGUoJ2EnLCBpLCAnID0gJywgc2lnKGkpLCA1KygoaS0xMCkvMiksICcsXG4nKQorICBlbmQKK2VuZCwKKworZnVuY3Rpb24gKCkgICAtLSAkMiQKKyAgZm9yIGk9MzAwMjYsNTAwMDkgZG8KKyAgICBpby53cml0ZSgnYicsIGksICcgPSAnLCBzaWcoaSksIDE1MDEzKygoaS0zMDAyNikvMiksICcsXG4nKQorICBlbmQKK2VuZCwKKworZnVuY3Rpb24gKCkgICAtLSAkMyQKKyAgZm9yIGk9MTAsNTAwMDkgZG8KKyAgICBpby53cml0ZSgnImEnLCBpLCAnIiwgJywgc2lnKGkpLCA1KygoaS0xMCkvMiksICcsXG4nKQorICBlbmQKK2VuZCwKK30KKworZmlsZSA9IG9zLnRtcG5hbWUoKQoraW8ub3V0cHV0KGZpbGUpCitmb3IgcyBpbiBzdHJpbmcuZ21hdGNoKHByb2csICIkKFteJF0rKSIpIGRvCisgIGxvY2FsIG4gPSB0b251bWJlcihzKQorICBpZiBub3QgbiB0aGVuIGlvLndyaXRlKHMpIGVsc2UgRltuXSgpIGVuZAorZW5kCitpby5jbG9zZSgpCityZXN1bHQgPSBkb2ZpbGUoZmlsZSkKK2Fzc2VydChvcy5yZW1vdmUoZmlsZSkpCitwcmludCdPSycKK3JldHVybiByZXN1bHQKKwo=