ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJhdGV4dC9leHRfdXNlcl9tb2RlbS5jIGIvYXAvbGliL2xpYmF0ZXh0L2V4dF91c2VyX21vZGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTZkZTBiNQotLS0gL2Rldi9udWxsCisrKyBiL2FwL2xpYi9saWJhdGV4dC9leHRfdXNlcl9tb2RlbS5jCkBAIC0wLDAgKzEsNTg0IEBACisjaWZuZGVmIENPTkZJR19NSU5fOE1fVkVSU0lPTgorI2luY2x1ZGUgImV4dF9zb2NrZXRfZnVuYy5oIgorI2luY2x1ZGUgImNmZ19udl9kZWYuaCIKKyNpbmNsdWRlICJhdF9jb250ZXh0LmgiCisjaW5jbHVkZSAia3dhdGNoX21zZy5oIgorCitpbnQgbmV0Y29uX2V4dGNpZCA9IC0xOworY2hhciBuZXRjb25fY29uZmlnbmFtZVsxMF0gPSB7MH07CitpbnQgbmV0Y29uX3ZhbHVlX2ludCA9IDA7CitjaGFyIG5ldGNvbl92YWx1ZV9jaGFyWzcwXSA9IHswfTsKK2V4dGVybiBjaGFyKiBub3JtYWxfZ2V0enZlcnNpb24oKTsKK2ludCB1cmNzeXNpbmZvID0gMDsKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgbW9kZTsKKwlpbnQgY3JlZzsKKwlpbnQgY2dyZWc7CisJaW50IGNlcmVnOworfSBFWFRfTkVUU1RBVEVfSU5GTzsKK0VYVF9ORVRTVEFURV9JTkZPIHVyY2luZm8gPSB7MH07CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vufq153NvY2tldLe9sLi6r8r9yrXP1sf4CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KK3N0YXRpYyBpbnQgZ3NtYmFuZCA9IDA7CisKK3N0YXRpYyB2b2lkIGNvbW1fcnNwbXNnX3Byb2Modm9pZCAqcnNwX21zZywgdm9pZCoqcmV0LCBpbnQgKnJldGxlbikKK3sKKwlBVF9DT01NX1JTUE1TRyAqbXNnID0gKEFUX0NPTU1fUlNQTVNHKilyc3BfbXNnOworCWNoYXIgKmF0X3N0ciA9IE5VTEw7CisJaW50IG9mZnNldCA9IDA7CisKKwlpZiAobXNnLT5yZXN1bHQgPCAwKSB7CisJCWF0X3N0ciA9IG1hbGxvYygzMik7CisJCWFzc2VydChhdF9zdHIpOworCQltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisJCWlmIChtc2ctPmVycmNvZGUpIHsKKwkJCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SOiAlZFxyXG4iLCBtc2ctPmVycmNvZGUpOworCQl9IGVsc2UgeworCQkJc3ByaW50ZihhdF9zdHIsICJcclxuRVJST1JcclxuIik7CisJCX0KKwl9IGVsc2UgeworCQlhdF9zdHIgPSBtYWxsb2MoNjQpOworCQlhc3NlcnQoYXRfc3RyKTsKKwkJbWVtc2V0KGF0X3N0ciwgMHgwMCwgNjQpOworCQlpZiAobXNnLT5tc2dfY21kID09IE1TR19DTURfTkVUQUNUX1JFUSkgeworCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyLCAiXHJcbk9LXHJcbiIpOworCQkJaWYgKG1zZy0+dXJjX3N3aXRjaCkgeworCQkJCWlmIChnX2N1c3RvbWVyX3R5cGUgPT0gQ1VTVE9NRVJfR1VPRElBTikKKwkJCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiXHJcbiRNWVVSQ0FDVDogJWQsJWRcclxuIiwgbXNnLT5leHRjaWQsIG1zZy0+YWN0X3R5cGUpOworCQkJCWVsc2UgaWYgKGdfY3VzdG9tZXJfdHlwZSA9PSBDVVNUT01FUl9OQU5ESUFOKQorCQkJCQlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIgKyBvZmZzZXQsICJcclxuJE1ZVVJDQUNUOiAlZCwlZCxcIiVzXCJcclxuIiwgbXNnLT5leHRjaWQsIG1zZy0+YWN0X3R5cGUsIG1zZy0+aXApOworCQkJfQorCisJCQkqcmV0ID0gYXRfc3RyOworCQkJKnJldGxlbiA9IG9mZnNldDsKKwkJCXJldHVybjsKKwkJfQorCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5PS1xyXG4iKTsKKwl9CisJKnJldCA9IGF0X3N0cjsKKwkqcmV0bGVuID0gc3RybGVuKGF0X3N0cik7CisKK30KKworCitpbnQgZXh0X25ldGNvbl9yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJc3RydWN0IG5ldGNvbl9yZXFtc2cgKnJlcW1zZyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IG5ldGNvbl9yZXFtc2cpKTsKKwlhc3NlcnQocmVxbXNnKTsKKwljaGFyIGNvbmZpZ25hbWVbMTBdID0gezB9OworCWNoYXIgKmxfcXVvdGEgPSBOVUxMOy8v1/PLq9L9usUKKwljaGFyICpyX3F1b3RhID0gTlVMTDsvL9PSy6vS/brFCisJY2hhciAqYXRfc3RyID0gTlVMTDsKKworCS8vaWYgKE5VTEwgPT0gcmVxbXNnKSBzb2Z0YXBfYXNzZXJ0KCIiKTsKKwkvL7P1yry7rworCW1lbXNldChyZXFtc2csIDB4MDAsIHNpemVvZihzdHJ1Y3QgbmV0Y29uX3JlcW1zZykpOworCXJlcW1zZy0+YXV0aF90eXBlID0gLTE7CisJcmVxbXNnLT5jZmdwID0gLTE7CisJcmVxbXNnLT5jZmd0ID0gLTE7CisKKwlyZXFtc2ctPmV4dGNpZCA9IGF0X3BhcmFzWzBdIC0gJzAnOworCWlmIChyZXFtc2ctPmV4dGNpZCA8IDAgfHwgcmVxbXNnLT5leHRjaWQgPj0gNikKKwkJZ290byBlcnJvcjsKKwlsX3F1b3RhID0gc3Ryc3RyKGF0X3BhcmFzLCAiXCIiKTsKKwlpZiAoTlVMTCA9PSBsX3F1b3RhKSB7CisJCWdvdG8gZXJyb3I7CisJfQorCXJfcXVvdGEgPSBzdHJzdHIobF9xdW90YSArIDEsICJcIiIpOworCisJaWYgKE5VTEwgPT0gcl9xdW90YSkgeworCQlnb3RvIGVycm9yOworCX0KKwltZW1jcHkoY29uZmlnbmFtZSwgbF9xdW90YSArIDEsIHJfcXVvdGEgLSBsX3F1b3RhIC0gMSk7CisJaWYgKDAgPT0gYXRfc3RybmNtcChjb25maWduYW1lLCAiQVBOIiwgc3RybGVuKCJBUE4iKSkpIHsKKwkJbF9xdW90YSA9IHN0cnN0cihyX3F1b3RhICsgMSwgIlwiIik7CisJCWlmIChsX3F1b3RhID09IE5VTEwpCisJCQlnb3RvIGVycm9yOworCQlyX3F1b3RhID0gc3Ryc3RyKGxfcXVvdGEgKyAxLCAiXCIiKTsKKwkJaWYgKHJfcXVvdGEgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3I7CisJCW1lbWNweShyZXFtc2ctPmFwbiwgbF9xdW90YSArIDEsIHJfcXVvdGEgLSBsX3F1b3RhIC0gMSk7CisJCW1lbXNldChuZXRjb25fdmFsdWVfY2hhciwgMCwgc2l6ZW9mKG5ldGNvbl92YWx1ZV9jaGFyKSk7CisJCW1lbWNweShuZXRjb25fdmFsdWVfY2hhciwgbF9xdW90YSArIDEsIHJfcXVvdGEgLSBsX3F1b3RhIC0gMSk7CisJfSBlbHNlIGlmICgwID09IGF0X3N0cm5jbXAoY29uZmlnbmFtZSwgIlVTRVJQV0QiLCBzdHJsZW4oIlVTRVJQV0QiKSkpIHsKKwkJbF9xdW90YSA9IHN0cnN0cihyX3F1b3RhICsgMSwgIlwiIik7CisJCWlmIChsX3F1b3RhID09IE5VTEwpCisJCQlnb3RvIGVycm9yOworCQlyX3F1b3RhID0gc3Ryc3RyKGxfcXVvdGEgKyAxLCAiXCIiKTsKKwkJaWYgKHJfcXVvdGEgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3I7CisJCWNoYXIgKmNvbW1hID0gc3Ryc3RyKGxfcXVvdGEgKyAxLCAiLCIpOworCQlpZiAoTlVMTCAhPSBjb21tYSkgeyAvL9PQtrq6xaOs08O7p8P7w9zC67K7zqq/1QorCQkJaWYgKGNvbW1hID4gcl9xdW90YSkKKwkJCQlnb3RvIGVycm9yOworCQkJbWVtY3B5KHJlcW1zZy0+dXNlcm5hbWUsIGxfcXVvdGEgKyAxLCBjb21tYSAtIGxfcXVvdGEgLSAxKTsKKwkJCW1lbWNweShyZXFtc2ctPnBhc3N3b3JkLCBjb21tYSArIDEsIHJfcXVvdGEgLSBjb21tYSAtIDEpOworCQl9CisJCW1lbXNldChuZXRjb25fdmFsdWVfY2hhciwgMCwgc2l6ZW9mKG5ldGNvbl92YWx1ZV9jaGFyKSk7CisJCW1lbWNweShuZXRjb25fdmFsdWVfY2hhciwgbF9xdW90YSArIDEsIHJfcXVvdGEgLSBsX3F1b3RhIC0gMSk7CisKKwkJcmVxbXNnLT5pc191c2VycHdkID0gMTsKKwl9IGVsc2UgaWYgKDAgPT0gYXRfc3RybmNtcChjb25maWduYW1lLCAiQ0ZHVCIsIHN0cmxlbigiQ0ZHVCIpKSkgeworCQlpbnQgbGVuID0gc3RybGVuKHJfcXVvdGEgKyAyKTsKKwkJY2hhciogc3RyID0gbWFsbG9jKGxlbiArIDEpOworCQlhc3NlcnQoc3RyKTsKKwkJc3RyY3B5KHN0ciwgcl9xdW90YSArIDIpOworCQlyZXFtc2ctPmNmZ3QgPSBhdG9pKHN0cik7CisJCWlmIChyZXFtc2ctPmNmZ3QgPCAxIHx8IHJlcW1zZy0+Y2ZndCA+IDY1NTM1KXsKKyAgICAgICAgICAgIGZyZWUoc3RyKTsKKwkJCWdvdG8gZXJyb3I7CisgICAgICAgIH0KKwkJbmV0Y29uX3ZhbHVlX2ludCA9IGF0b2koc3RyKTsKKwkJZnJlZShzdHIpOworCX0gZWxzZSBpZiAoMCA9PSBhdF9zdHJuY21wKGNvbmZpZ25hbWUsICJDRkdQIiwgc3RybGVuKCJDRkdQIikpKSB7CisJCWludCBsZW4gPSBzdHJsZW4ocl9xdW90YSArIDIpOworCQljaGFyKiBzdHIgPSBtYWxsb2MobGVuICsgMSk7CisJCWFzc2VydChzdHIpOworCQlzdHJjcHkoc3RyLCByX3F1b3RhICsgMik7CisJCXJlcW1zZy0+Y2ZncCA9IGF0b2koc3RyKTsKKwkJaWYgKHJlcW1zZy0+Y2ZncCA8IDEgfHwgcmVxbXNnLT5jZmdwID4gMTQ2MCkgeworICAgICAgICAgICAgZnJlZShzdHIpOworCQkJZ290byBlcnJvcjsKKyAgICAgICAgfQorCQluZXRjb25fdmFsdWVfaW50ID0gYXRvaShzdHIpOworCQlmcmVlKHN0cik7CisJfSBlbHNlIGlmICgwID09IGF0X3N0cm5jbXAoY29uZmlnbmFtZSwgIkFVVEgiLCBzdHJsZW4oIkFVVEgiKSkpIHsKKwkJaW50IGxlbiA9IHN0cmxlbihyX3F1b3RhICsgMik7CisJCWNoYXIqIHN0ciA9IG1hbGxvYyhsZW4gKyAxKTsKKwkJYXNzZXJ0KHN0cik7CisJCXN0cmNweShzdHIsIHJfcXVvdGEgKyAyKTsKKwkJcmVxbXNnLT5hdXRoX3R5cGUgPSBhdG9pKHN0cik7CisJCWlmIChyZXFtc2ctPmF1dGhfdHlwZSA8IDAgfHwgcmVxbXNnLT5hdXRoX3R5cGUgPiAyKSB7CisgICAgICAgICAgICBmcmVlKHN0cik7CisJCQlnb3RvIGVycm9yOworICAgICAgICB9CisJCW5ldGNvbl92YWx1ZV9pbnQgPSBhdG9pKHN0cik7CisJCWZyZWUoc3RyKTsKKwl9IGVsc2UgeworCQlnb3RvIGVycm9yOworCX0KKwluZXRjb25fZXh0Y2lkID0gcmVxbXNnLT5leHRjaWQ7CisJc3RybmNweShuZXRjb25fY29uZmlnbmFtZSwgY29uZmlnbmFtZSxzaXplb2YobmV0Y29uX2NvbmZpZ25hbWUpLTEpOworCisJKnJlc19tc2cgPSByZXFtc2c7CisJKnJlc19tc2dsZW4gPSBzaXplb2Yoc3RydWN0IG5ldGNvbl9yZXFtc2cpOworCXJldHVybiBBVF9DT05USU5VRTsKK2Vycm9yOgorICAgIGZyZWUocmVxbXNnKTsKKwlhdF9zdHIgPSBtYWxsb2MoMzIpOworCWFzc2VydChhdF9zdHIpOworCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKwlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUjogOTgwXHJcbiIpOworCSpyZXNfbXNnID0gYXRfc3RyOworCSpyZXNfbXNnbGVuID0gc3RybGVuKGF0X3N0cik7CisJcmV0dXJuIEFUX0VORDsKK30KK2ludCBleHRfbmV0Y29uX3JzcCh2b2lkICpyc3BfbXNnLCB2b2lkKipyZXQsIGludCAqcmV0bGVuKQoreworCWNvbW1fcnNwbXNnX3Byb2MocnNwX21zZywgcmV0LCByZXRsZW4pOworCXJldHVybiBBVF9FTkQ7Cit9CisKK2ludCBleHRfbmV0YWN0X3JlcShpbnQgYXRfZmQsIGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2csIGludCAqcmVzX21zZ2xlbikKK3sKKwlzdHJ1Y3QgbmV0YWN0X3JlcW1zZyAqcmVxbXNnID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0YWN0X3JlcW1zZykpOworCWFzc2VydChyZXFtc2cpOworCWNoYXIgKnBbMl0gPSB7JnJlcW1zZy0+ZXh0Y2lkLCAmcmVxbXNnLT5hY3RfdHlwZX07CisgICAgY2hhciAqYXRfc3RyID0gTlVMTDsKKwltZW1zZXQocmVxbXNnLCAweDAwLCBzaXplb2Yoc3RydWN0IGNvbW1fcmVxbXNnKSk7CisJaWYoMiAhPSBwYXJzZV9wYXJhbTIoIiVkLCVkIiwgYXRfcGFyYXMsIHApKXsKKyAgICAgICAgZnJlZShyZXFtc2cpOworICAgIAlhdF9zdHIgPSBtYWxsb2MoMzIpOworCQlhc3NlcnQoYXRfc3RyKTsKKyAgICAJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworICAgIAlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUjogOTgwXHJcbiIpOworICAgIAkqcmVzX21zZyA9IGF0X3N0cjsKKyAgICAJKnJlc19tc2dsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKyAgICAJcmV0dXJuIEFUX0VORDsKKyAgICB9ICAgCisKKwkqcmVzX21zZyA9IHJlcW1zZzsKKwkqcmVzX21zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgbmV0YWN0X3JlcW1zZyk7CisJcmV0dXJuIEFUX0NPTlRJTlVFOworfQoraW50IGV4dF9uZXRhY3RfcnNwKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pCit7CisJY29tbV9yc3Btc2dfcHJvYyhyc3BfbXNnLCByZXQsIHJldGxlbik7CisKKwlyZXR1cm4gQVRfRU5EOworfQorCisvKsjtudi7+iovCitpbnQgZXh0X3Bvd2Vyb2ZmX3JlcShpbnQgYXRfZmQsIGNoYXIgKiBhdF9wYXJhcywgdm9pZCAqKnJlc19tc2csIGludCAqIHJlc19tc2dsZW4pCit7CisJcmV0dXJuIEFUX0NPTlRJTlVFOworfQorCisKKworaW50IGV4dF9pX2FjdF9mdW5jKGludCBhdF9mZCwgY2hhciAqIGF0X3BhcmFzLCB2b2lkICogKnJlc19tc2csIGludCAqIHJlc19tc2dsZW4pCit7CisJY2hhciAqYXRfc3RyID0gTlVMTDsKKworCWF0X3N0ciA9IG1hbGxvYygxMjgpOworCWFzc2VydChhdF9zdHIpOworCW1lbXNldChhdF9zdHIsIDAsIDEyOCk7CisJc3ByaW50ZigoY2hhciopYXRfc3RyLCAiXHJcbkxRQlNcclxuTFEzMDBWM1xyXG5SRVZJU0lPTiBWMS4wLjBcclxuT0tcclxuIik7CisKKwkqcmVzX21zZyA9IGF0X3N0cjsKKwkqcmVzX21zZ2xlbiA9IHN0cmxlbigqcmVzX21zZyk7CisJcmV0dXJuIEFUX0VORDsKK30KK2ludCBleHRfbXliYW5kX3NldF9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpCit7CisJaWYgKHVuaXhfc2VuZF9wcm9jKGdldF9kZWZhdWx0X3NvY2tmZCgpLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX01ZQkFORF9TRVRfUkVRLCBzdHJsZW4oYXRfcGFyYXMpLCAodW5zaWduZWQgY2hhciAqKWF0X3BhcmFzLCAwKSkKKwkJc29mdGFwX2Fzc2VydCgiIik7CisJcmV0dXJuIEFUX0NPTlRJTlVFOworfQorCitpbnQgZXh0X215YmFuZF9xdWVyeV9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpCit7CisJaWYgKHVuaXhfc2VuZF9wcm9jKGdldF9kZWZhdWx0X3NvY2tmZCgpLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX01ZQkFORF9RVUVSWV9SRVEsIDAsIE5VTEwsIDApKQorCQlzb2Z0YXBfYXNzZXJ0KCIiKTsKKwlyZXR1cm4gQVRfQ09OVElOVUU7Cit9CisKK2ludCBleHRfYmVlaF9hY3RfZnVuYyhpbnQgYXRfZmQsIGNoYXIgKiBhdF9wYXJhcywgdm9pZCAqICpyZXNfbXNnLCBpbnQgKiByZXNfbXNnbGVuKQoreworCSpyZXNfbXNnID0gYXRfb2tfYnVpbGQoKTsKKwkqcmVzX21zZ2xlbiA9IHN0cmxlbigqcmVzX21zZyk7CisJcmV0dXJuIEFUX0VORDsKK30KKworaW50IGV4dF9wb3dlcm9mZl9yc3Aodm9pZCAqcnNwX21zZywgdm9pZCoqcmV0LCBpbnQgKnJldGxlbikKK3sKKwljaGFyICphdF9zdHIgPSBOVUxMOworCisJYXRfc3RyID0gYXRfb2tfYnVpbGQoKTsKKworCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOworCisJcmV0dXJuIEFUX0VORDsKK30KKworLyq2wcjtvP7N4rK/sOaxvrrFKi8KK2ludCBleHRfZ21yX2FjdF9mdW5jKGludCBhdF9mZCwgY2hhciAqIGF0X3BhcmFzLCB2b2lkICogKnJlc19tc2csIGludCAqIHJlc19tc2dsZW4pCit7CisJY2hhciBod3ZlclszMl0gPSB7MH07CisJY2hhciBzd3ZlclszMl0gPSB7MH07CisJY2hhciAqYXRfc3RyID0gTlVMTDsKKworCS8vY2ZnX2dldF9pdGVtKE5WX0hXX1ZFUlNJT04sIGh3dmVyLCBzaXplb2YoaHd2ZXIpKTsKKwkvL2NmZ19nZXRfaXRlbShOVl9XQV9WRVJTSU9OLCBzd3Zlciwgc2l6ZW9mKHN3dmVyKSk7CisJLy+zp8nMtPq6xaGixKO/6dDNusWhotOyvP63orK8yNXG2qGiyO28/reisrzI1cbayOe6zrvxyKEKKwlhdF9zdHIgPSBtYWxsb2MoMTI4KTsKKwlhc3NlcnQoYXRfc3RyKTsKKwltZW1zZXQoYXRfc3RyLCAwLCAxMjgpOworCXNwcmludGYoKGNoYXIqKWF0X3N0ciwgIlxyXG5MUUJTXHJcbkxRMzAwVjNcclxuVjEuMC4wXHJcbjE1MTAxN1xyXG5WMS4wXHJcbjE1MTAxN1xyXG5PS1xyXG4iKTsKKwkqcmVzX21zZyA9IGF0X3N0cjsKKwkqcmVzX21zZ2xlbiA9IHN0cmxlbigqcmVzX21zZyk7CisJcmV0dXJuIEFUX0VORDsKK30KKy8qu/HIoVNJTb+o0PLB0LrFKi8KK2ludCBleHRfY2NpZF9hY3RfZnVuYyhpbnQgYXRfZmQsIGNoYXIgKiBhdF9wYXJhcywgdm9pZCAqICpyZXNfbXNnLCBpbnQgKiByZXNfbXNnbGVuKQoreworCWNoYXIgaWNjaWRbMzJdID0gezB9OworCWNoYXIgKmF0X3N0ciA9IE5VTEw7CisKKwlhdF9zdHIgPSBtYWxsb2MoNjQpOworCWFzc2VydChhdF9zdHIpOworCW1lbXNldChhdF9zdHIsIDAsIDY0KTsKKwljZmdfZ2V0X2l0ZW0oTlZfWklDQ0lELCBpY2NpZCwgc2l6ZW9mKGljY2lkKSk7CisJLy9hdF9wcmludCgxLCJleHRfY2NpZF9hY3RfZnVuYzogaWNjaWQgPSAlc1xuIixpY2NpZCk7CisJc3ByaW50ZigoY2hhciopYXRfc3RyLCAiXHJcbiRNWUNDSUQ6IFwiJXNcIlxyXG5PS1xyXG4iLCBpY2NpZCk7CisJKnJlc19tc2cgPSBhdF9zdHI7CisJKnJlc19tc2dsZW4gPSBzdHJsZW4oKnJlc19tc2cpOworCXJldHVybiBBVF9FTkQ7Cit9CitpbnQgZXh0X25ldGNvbl9xdWVyeV9mdW5jKGludCBhdF9mZCwgY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZywgaW50ICpyZXNfbXNnbGVuKQoreworCWNoYXIgKmF0X3N0ciA9IE5VTEw7CisJaW50IG9mZnNldCA9IDA7CisKKwlpZiAobmV0Y29uX2V4dGNpZCA9PSAtMSkgeworCQlhdF9zdHIgPSBtYWxsb2MoMzIpOworCQlhc3NlcnQoYXRfc3RyKTsKKwkJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUlxyXG4iKTsKKwl9IGVsc2UgeworCQlhdF9zdHIgPSBtYWxsb2MoMzIgKyBzaXplb2YobmV0Y29uX2V4dGNpZCkgKyBzaXplb2YobmV0Y29uX2NvbmZpZ25hbWUpICsgc2l6ZW9mKG5ldGNvbl92YWx1ZV9jaGFyKSk7CisJCWFzc2VydChhdF9zdHIpOworCQltZW1zZXQoYXRfc3RyLCAwLCAzMiArIHNpemVvZihuZXRjb25fZXh0Y2lkKSArIHNpemVvZihuZXRjb25fY29uZmlnbmFtZSkgKyBzaXplb2YobmV0Y29uX3ZhbHVlX2NoYXIpKTsKKwkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiXHJcbiRNWU5FVENPTjogJWQsXCIlc1wiLCIsIG5ldGNvbl9leHRjaWQsIG5ldGNvbl9jb25maWduYW1lKTsKKwkJaWYgKDAgPT0gYXRfc3RybmNtcChuZXRjb25fY29uZmlnbmFtZSwgIkFQTiIsIHN0cmxlbigiQVBOIikpIHx8IDAgPT0gYXRfc3RybmNtcChuZXRjb25fY29uZmlnbmFtZSwgIlVTRVJQV0QiLCBzdHJsZW4oIlVTRVJQV0QiKSkpIHsKKwkJCW9mZnNldCArPSBzcHJpbnRmKGF0X3N0ciArIG9mZnNldCwgIlwiJXNcIlxyXG5PS1xyXG4iLCBuZXRjb25fdmFsdWVfY2hhcik7CisJCX0gZWxzZSB7CisJCQlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIgKyBvZmZzZXQsICIlZFxyXG5PS1xyXG4iLCBuZXRjb25fdmFsdWVfaW50KTsKKwkJfQorCX0KKworCSpyZXNfbXNnID0gYXRfc3RyOworCSpyZXNfbXNnbGVuID0gc3RybGVuKCpyZXNfbXNnKTsKKwlyZXR1cm4gQVRfRU5EOworCit9CisKK2ludCBleHRfZ21yX3F1ZXJ5X2Z1bmMoY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZykKK3sKKwlpZiAodW5peF9zZW5kX3Byb2MoZ2V0X2RlZmF1bHRfc29ja2ZkKCksIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfR01SX1FVRVJZX1JFUSwgMCwgTlVMTCwgMCkpCisJCXNvZnRhcF9hc3NlcnQoIiIpOworCXJldHVybiBBVF9DT05USU5VRTsKK30KK2ludCBleHRfZ21yX2Z1bmMoaW50IGF0X2ZkLCBjaGFyICogYXRfcGFyYXMsIHZvaWQgKiAqcmVzX21zZywgaW50ICogcmVzX21zZ2xlbikKK3sKKwkqcmVzX21zZyA9IGF0X29rX2J1aWxkKCk7CisJKnJlc19tc2dsZW4gPSBzdHJsZW4oKnJlc19tc2cpOworCXJldHVybiBBVF9FTkQ7Cit9CisKK2ludCBleHRfbXlzeXNpbmZvX3F1ZXJ5X2Z1bmMoY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZykKK3sKKwlpZiAodW5peF9zZW5kX3Byb2MoZ2V0X2RlZmF1bHRfc29ja2ZkKCksIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfTVlTWVNJTkZPX1FVRVJZX1JFUSwgMCwgTlVMTCwgMCkpCisJCXNvZnRhcF9hc3NlcnQoIiIpOworCXJldHVybiBBVF9DT05USU5VRTsKK30KKworaW50IGV4dF9teW5ldGluZm9fc2V0X2Z1bmMoY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZykKK3sKKwlpZiAodW5peF9zZW5kX3Byb2MoZ2V0X2RlZmF1bHRfc29ja2ZkKCksIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfTVlORVRJTkZPX1NFVF9SRVEsIHN0cmxlbihhdF9wYXJhcyksICh1bnNpZ25lZCBjaGFyICopYXRfcGFyYXMsIDApKQorCQlzb2Z0YXBfYXNzZXJ0KCIiKTsKKwlyZXR1cm4gQVRfQ09OVElOVUU7Cit9CisKK2ludCBleHRfbXluZXRpbmZvX3F1ZXJ5X2Z1bmMoY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZykKK3sKKwlpZiAodW5peF9zZW5kX3Byb2MoZ2V0X2RlZmF1bHRfc29ja2ZkKCksIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfTVlORVRJTkZPX1FVRVJZX1JFUSwgMCwgTlVMTCwgMCkpCisJCXNvZnRhcF9hc3NlcnQoIiIpOworCXJldHVybiBBVF9DT05USU5VRTsKK30KKworaW50IGV4dF91cmNzeXNpbmZvX2FjdF9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpCit7CisJaW50IGZsYWcgPSAwOworCXZvaWQgKnBbMV0gPSB7JmZsYWd9OworCWludCByZXQgPSAwOworCXJldCA9IHBhcnNlX3BhcmFtKCIlZCIsIGF0X3BhcmFzLCBwKTsKKwlpZiAocmV0ICE9IEFUX1BBUlNFX09LKQorCQlyZXR1cm4gQVRfRU5EOworCWlmICgxID09IGZsYWcpIHsKKwkJdXJjc3lzaW5mbyA9IDE7CisJCSpyZXNfbXNnID0gYXRfb2tfYnVpbGQoKTsKKwl9IGVsc2UgeworCQkqcmVzX21zZyA9IGF0X2Vycl9idWlsZCgwKTsKKwl9CisJcmV0dXJuIEFUX0VORDsKK30KKworaW50IG1vZGVfaW5mb3JtX2FjdChjaGFyICphdF9wYXJhcywgaW50IGlzX3F1ZXJ5X3JlcG9ydCkKK3sKKwlpbnQgbW9kZSA9IDA7CisJdm9pZCAqcFsxXSA9IHsmbW9kZX07CisJaW50IHJldCA9IDA7CisJcmV0ID0gcGFyc2VfcGFyYW0oIiVkIiwgYXRfcGFyYXMsIHApOworCWlmIChyZXQgIT0gQVRfUEFSU0VfT0spCisJCXJldHVybiBBVF9FTkQ7CisJaWYgKChtb2RlICE9IHVyY2luZm8ubW9kZSkgJiYgKHVyY3N5c2luZm8gPT0gMSkpIHsKKwkJdXJjaW5mby5tb2RlID0gbW9kZTsKKwkJaWYgKHVuaXhfc2VuZF9wcm9jKGdldF9kZWZhdWx0X3NvY2tmZCgpLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX01ZVVJDU1lTSU5GT19JTkZPUk1fUkVRLCAwLCBOVUxMLCAwKSkKKwkJCXNvZnRhcF9hc3NlcnQoIiIpOworCX0KKwlyZXR1cm4gQVRfRU5EOworfQorCitpbnQgbmV0X3N0YXRlX3RyYW5zZmVyKGludCBzdGF0ZSkKK3sKKwlpZiAoKHN0YXRlID09IDEpIHx8IChzdGF0ZSA9PSA1KSkKKwkJcmV0dXJuIDE7CisJZWxzZSByZXR1cm4gMDsKK30KK2ludCBjcmVnX2luZm9ybV9hY3QoY2hhciAqYXRfcGFyYXMsIGludCBpc19xdWVyeV9yZXBvcnQpCit7CisJaW50IHN0YXRlID0gMDsKKwl2b2lkICpwWzFdID0geyZzdGF0ZX07CisJaW50IHJldCA9IDA7CisJcmV0ID0gcGFyc2VfcGFyYW0oIiVkIiwgYXRfcGFyYXMsIHApOworCWlmIChyZXQgIT0gQVRfUEFSU0VfT0spCisJCXJldHVybiBBVF9FTkQ7CisJc3RhdGUgPSBuZXRfc3RhdGVfdHJhbnNmZXIoc3RhdGUpOworCWlmICgoc3RhdGUgIT0gdXJjaW5mby5jcmVnKSAmJiAodXJjc3lzaW5mbyA9PSAxKSkgeworCQl1cmNpbmZvLmNyZWcgPSBzdGF0ZTsKKwkJaWYgKHVuaXhfc2VuZF9wcm9jKGdldF9kZWZhdWx0X3NvY2tmZCgpLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX01ZVVJDU1lTSU5GT19JTkZPUk1fUkVRLCAwLCBOVUxMLCAwKSkKKwkJCXNvZnRhcF9hc3NlcnQoIiIpOworCX0KKwlyZXR1cm4gQVRfRU5EOworfQoraW50IGNncmVnX2luZm9ybV9hY3QoY2hhciAqYXRfcGFyYXMsIGludCBpc19xdWVyeV9yZXBvcnQpCit7CisJaW50IHN0YXRlID0gMDsKKwl2b2lkICpwWzFdID0geyZzdGF0ZX07CisJaW50IHJldCA9IDA7CisJcmV0ID0gcGFyc2VfcGFyYW0oIiVkIiwgYXRfcGFyYXMsIHApOworCWlmIChyZXQgIT0gQVRfUEFSU0VfT0spCisJCXJldHVybiBBVF9FTkQ7CisJc3RhdGUgPSBuZXRfc3RhdGVfdHJhbnNmZXIoc3RhdGUpOworCWlmICgoc3RhdGUgIT0gdXJjaW5mby5jZ3JlZykgJiYgKHVyY3N5c2luZm8gPT0gMSkpIHsKKwkJdXJjaW5mby5jZ3JlZyA9IHN0YXRlOworCQlpZiAodW5peF9zZW5kX3Byb2MoZ2V0X2RlZmF1bHRfc29ja2ZkKCksIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfTVlVUkNTWVNJTkZPX0lORk9STV9SRVEsIDAsIE5VTEwsIDApKQorCQkJc29mdGFwX2Fzc2VydCgiIik7CisJfQorCXJldHVybiBBVF9FTkQ7Cit9CitpbnQgY2VyZWdfaW5mb3JtX2FjdChjaGFyICphdF9wYXJhcywgaW50IGlzX3F1ZXJ5X3JlcG9ydCkKK3sKKwlpbnQgc3RhdGUgPSAwOworCXZvaWQgKnBbMV0gPSB7JnN0YXRlfTsKKwlpbnQgcmV0ID0gMDsKKwlyZXQgPSBwYXJzZV9wYXJhbSgiJWQiLCBhdF9wYXJhcywgcCk7CisJaWYgKHJldCAhPSBBVF9QQVJTRV9PSykKKwkJcmV0dXJuIEFUX0VORDsKKwlzdGF0ZSA9IG5ldF9zdGF0ZV90cmFuc2ZlcihzdGF0ZSk7CisJaWYgKChzdGF0ZSAhPSB1cmNpbmZvLmNlcmVnKSAmJiAodXJjc3lzaW5mbyA9PSAxKSkgeworCQl1cmNpbmZvLmNlcmVnID0gc3RhdGU7CisJCWlmICh1bml4X3NlbmRfcHJvYyhnZXRfZGVmYXVsdF9zb2NrZmQoKSwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9NWVVSQ1NZU0lORk9fSU5GT1JNX1JFUSwgMCwgTlVMTCwgMCkpCisJCQlzb2Z0YXBfYXNzZXJ0KCIiKTsKKwl9CisJcmV0dXJuIEFUX0VORDsKK30KKworaW50IGV4dF90aW1lX3NldF9mdW5jKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpCit7CQorCWNoYXIgc2V0dGltZVszMl0gPSB7MH07CisJdm9pZCAqcFtdID0ge3NldHRpbWV9OworCWludCByZXQgPSAwOworCWNoYXIgKmF0X3N0ciA9IE5VTEw7CisJYXRfc3RyID0gbWFsbG9jKDE2KTsKKwlhc3NlcnQoYXRfc3RyKTsKKwltZW1zZXQoYXRfc3RyLDAsMTYpOworCXN0cnVjdCB0bSBzZXRfdG0gPSB7MH07CisJc3RydWN0IHRpbWV2YWwgdGltZV90diA9IHswfTsKKwlzdHJ1Y3QgdGltZXpvbmUgdGltZV90eiA9IHswLCAwfTsKKwkKKwlyZXQgPSBwYXJzZV9wYXJhbSgiJTMycyIsYXRfcGFyYXMsIHApOworCWlmKHJldCAhPSBBVF9QQVJTRV9PSykKKwl7CisJCXNwcmludGYoYXRfc3RyLCJcclxuRVJST1I6IDk4MFxyXG4iKTsKKwkJKnJlc19tc2cgPSBhdF9zdHI7CisJCXJldHVybiBBVF9FTkQ7CisJfQorCXNzY2FuZihzZXR0aW1lLCIlMmQvJTJkLyUyZCwlMmQ6JTJkOiUyZCIsJnNldF90bS50bV95ZWFyLAorCQkmc2V0X3RtLnRtX21vbiwmc2V0X3RtLnRtX21kYXksJnNldF90bS50bV9ob3VyLCZzZXRfdG0udG1fbWluLCZzZXRfdG0udG1fc2VjKTsKKwlhdF9wcmludCgxLCJleHRfdGltZV9zZXRfZnVuYzogJTJkLyUyZC8lMmQsJTJkOiUyZDolMmRcbiIsc2V0X3RtLnRtX3llYXIsCisJCXNldF90bS50bV9tb24sc2V0X3RtLnRtX21kYXksc2V0X3RtLnRtX2hvdXIsc2V0X3RtLnRtX21pbixzZXRfdG0udG1fc2VjKTsKKworI2lmIDEgICAvLyBrdyAzCisgICAgaWYoc2V0X3RtLnRtX3llYXIgPCAwIHx8IHNldF90bS50bV95ZWFyID4gNTAwMCkKKyAgICB7CisgICAgICAgIHNldF90bS50bV95ZWFyID0gMTk3MDsKKyAgICB9CisKKyAgICBpZihzZXRfdG0udG1fbW9uIDwgMCB8fCBzZXRfdG0udG1fbW9uID4gMTMpCisgICAgeworICAgICAgICBzZXRfdG0udG1fbW9uID0gMTsKKyAgICB9CisjZW5kaWYKKwlzZXRfdG0udG1feWVhciA9IHNldF90bS50bV95ZWFyICsgMTAwOworCXNldF90bS50bV9tb24gPSBzZXRfdG0udG1fbW9uIC0gMTsJCisKKwl0aW1lX3R2LnR2X3NlYyA9IG1rdGltZSgmc2V0X3RtKTsKKyAgICBpZih0aW1lX3R2LnR2X3NlYyA8IDApLy8gY292IE0KKyAgICB7CisgICAgICAgIHRpbWVfdHYudHZfc2VjID0gMDsKKyAgICB9CisgICAgCisvLwl0aW1lX3R2LnR2X3NlYyA9IHRpbWVfdHYudHZfc2VjOyAgLy8gY292IE0KKwlzdHJ1Y3QgdG0gKiBuZXdfdGltZSA9IGdtdGltZSgmdGltZV90di50dl9zZWMpOworCWlmKG5ld190aW1lKQorCQl0aW1lX3R6LnR6X21pbnV0ZXN3ZXN0ID0gKG1rdGltZShuZXdfdGltZSkgLSAodGltZV90di50dl9zZWMpKSAvIDYwOworCQorCWlmICgwICE9IHNldHRpbWVvZmRheSgmdGltZV90diwmdGltZV90eikpCisJeworCQlhdF9wcmludChBVF9FUlIsInptbWlfYXV0b19hY3Qsc2V0IHRpbWUgb2Ygc3lzdGVtIHdyb25nIik7CisJCXNwcmludGYoYXRfc3RyLCJcclxuRVJST1I6IDk4MVxyXG4iKTsKKwkJKnJlc19tc2cgPSBhdF9zdHI7CisJCXJldHVybiBBVF9FTkQ7CisJfQorCXJ0Y19zZXRfdGltZShNT0RVTEVfSURfQVRfQ1RMKTsKKwlzcHJpbnRmKGF0X3N0ciwiXHJcbk9LXHJcbiIpOworCSpyZXNfbXNnID0gYXRfc3RyOworCXJldHVybiBBVF9FTkQ7CQorfQorCitpbnQgZXh0X3RpbWVfcXVlcnlfZnVuYyhjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnKQorewkKKwlzdHJ1Y3QgdG0gKnA7CisJdGltZV90IHRpbWVwOworCWNoYXIgYnVmWzMyXSA9IHswfTsKKwljaGFyICphdF9zdHIgPSBOVUxMOworCWF0X3N0ciA9IG1hbGxvYyg2NCk7CisJYXNzZXJ0KGF0X3N0cik7CisJbWVtc2V0KGF0X3N0ciwwLDY0KTsKKwl0aW1lKCZ0aW1lcCk7CisJcCA9IGxvY2FsdGltZSgmdGltZXApOworCWFzc2VydChwKTsKKwlzbnByaW50ZihidWYsMzIsIiUwMmQvJTAyZC8lMDJkLCUwMmQ6JTAyZDolMDJkIiwoMTkwMCArIHAtPnRtX3llYXIpJTEwMCwxICsgcC0+dG1fbW9uLHAtPnRtX21kYXkscC0+dG1faG91cixwLT50bV9taW4scC0+dG1fc2VjKTsKKwlhdF9wcmludCgxLCJleHRfdGltZV9xdWVyeV9mdW5jOiB0aW1lOiAlc1xuIixidWYpOworCXNwcmludGYoYXRfc3RyLCJcclxuK0NDTEs6IFwiJXNcIlxyXG5PS1xyXG4iLGJ1Zik7CisJKnJlc19tc2cgPSBhdF9zdHI7CisJcmV0dXJuIEFUX0VORDsJCit9CisKK2ludCAgZXh0X3VzZXJfbW9kZW1fcmVnaXN0KHZvaWQpCit7CisvLyNpZmRlZiBHVU9ESUFOCisJaWYgKGdfY3VzdG9tZXJfdHlwZSA9PSBDVVNUT01FUl9HVU9ESUFOKSB7CisJCS8vUERQvKS77gorCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVENPTj0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVENPTl9SRVEsIE1TR19DTURfTkVUQ09OX1JTUCwgZXh0X25ldGNvbl9yZXEsIGV4dF9uZXRjb25fcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRBQ1Q9IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9ORVRBQ1RfUkVRLCBNU0dfQ01EX05FVEFDVF9SU1AsIGV4dF9uZXRhY3RfcmVxLCBleHRfbmV0YWN0X3JzcCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZUE9XRVJPRkYiLCBNT0RVTEVfSURfTUFJTl9DVFJMLCBNU0dfQ01EX1BPV0VST0ZGX1JFUVVFU1QsIE1TR19DTURfUE9XRVJPRkZfUlNQLCBleHRfcG93ZXJvZmZfcmVxLCBleHRfcG93ZXJvZmZfcnNwKTsKKworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWUdNUiIsIDAsIDAsIDAsIGV4dF9nbXJfYWN0X2Z1bmMsIE5VTEwpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWUNDSUQiLCAwLCAwLCAwLCBleHRfY2NpZF9hY3RfZnVuYywgTlVMTCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIkFUSSIsIDAsIDAsIDAsIGV4dF9pX2FjdF9mdW5jLCBOVUxMKTsKKworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWUJDQ0g/IiwgMCwgMCwgMCwgZXh0X2JlZWhfYWN0X2Z1bmMsIE5VTEwpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWUJDQ0g9PyIsIDAsIDAsIDAsIGV4dF9iZWVoX2FjdF9mdW5jLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlCQ0NIPSIsIDAsIDAsIDAsIGV4dF9iZWVoX2FjdF9mdW5jLCBOVUxMKTsKKworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMoIk1ZQkFORD0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBleHRfbXliYW5kX3NldF9mdW5jKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jKCJNWUJBTkQ/IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgZXh0X215YmFuZF9xdWVyeV9mdW5jKTsKKworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVENPTj8iLCAwLCAwLCAwLCBleHRfbmV0Y29uX3F1ZXJ5X2Z1bmMsIE5VTEwpOworCisJCXJlZ2lzdGVyX3NlcnZfZnVuYygiR01SIiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgZXh0X2dtcl9xdWVyeV9mdW5jKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiR01SPT8iLCAwLCAwLCAwLCBleHRfZ21yX2Z1bmMsIE5VTEwpOworCX0gZWxzZSBpZiAoZ19jdXN0b21lcl90eXBlID09IENVU1RPTUVSX05BTkRJQU4pIHsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlQT1dFUk9GRiIsIE1PRFVMRV9JRF9NQUlOX0NUUkwsIE1TR19DTURfUE9XRVJPRkZfUkVRVUVTVCwgTVNHX0NNRF9QT1dFUk9GRl9SU1AsIGV4dF9wb3dlcm9mZl9yZXEsIGV4dF9wb3dlcm9mZl9yc3ApOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVENPTj0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVENPTl9SRVEsIE1TR19DTURfTkVUQ09OX1JTUCwgZXh0X25ldGNvbl9yZXEsIGV4dF9uZXRjb25fcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRDT04/IiwgMCwgMCwgMCwgZXh0X25ldGNvbl9xdWVyeV9mdW5jLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRBQ1Q9IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9ORVRBQ1RfUkVRLCBNU0dfQ01EX05FVEFDVF9SU1AsIGV4dF9uZXRhY3RfcmVxLCBleHRfbmV0YWN0X3JzcCk7CisKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlHTVIiLCAwLCAwLCAwLCBleHRfZ21yX2FjdF9mdW5jLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlDQ0lEIiwgMCwgMCwgMCwgZXh0X2NjaWRfYWN0X2Z1bmMsIE5VTEwpOworCisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIkFUSSIsIDAsIDAsIDAsIGV4dF9pX2FjdF9mdW5jLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jKCJHTVIiLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBleHRfZ21yX3F1ZXJ5X2Z1bmMpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJHTVI9PyIsIDAsIDAsIDAsIGV4dF9nbXJfZnVuYywgTlVMTCk7CisKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jKCJNWVVSQ1NZU0lORk89IiwgMCwgZXh0X3VyY3N5c2luZm9fYWN0X2Z1bmMpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMoIk1ZU1lTSU5GTyIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIGV4dF9teXN5c2luZm9fcXVlcnlfZnVuYyk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYygiTVlORVRJTkZPPSIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIGV4dF9teW5ldGluZm9fc2V0X2Z1bmMpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMoIk1ZTkVUSU5GTz8iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBleHRfbXluZXRpbmZvX3F1ZXJ5X2Z1bmMpOworCisJCXJlZ2lzdGVyX2luZm9ybV9mdW5jKCJDRVJFRyIsIGNlcmVnX2luZm9ybV9hY3QpOworCQlyZWdpc3Rlcl9pbmZvcm1fZnVuYygiQ0dSRUciLCBjZ3JlZ19pbmZvcm1fYWN0KTsKKwkJcmVnaXN0ZXJfaW5mb3JtX2Z1bmMoIkNSRUciLCBjcmVnX2luZm9ybV9hY3QpOworCQlyZWdpc3Rlcl9pbmZvcm1fZnVuYygiTU9ERSIsIG1vZGVfaW5mb3JtX2FjdCk7CisJfQorCXJlZ2lzdGVyX3NlcnZfZnVuYygiQ0NMSz0iLDAsZXh0X3RpbWVfc2V0X2Z1bmMpOworCXJlZ2lzdGVyX3NlcnZfZnVuYygiQ0NMSz8iLDAsZXh0X3RpbWVfcXVlcnlfZnVuYyk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgo=