Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBUb25lIG1hcHBpbmcgb3BlcmF0b3IgKERyYWdvLCAyMDAzKQovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKLy8KLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKLy8KLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCi8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCi8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQovLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAovLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCi8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCi8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgovLyBUSElTIERJU0NMQUlNRVIuCi8vCi8vIFVzZSBhdCB5b3VyIG93biByaXNrIQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaW5jbHVkZSA8Y21hdGg+CgojaW5jbHVkZSAiRnJlZUltYWdlLmgiCiNpbmNsdWRlICJVdGlsaXRpZXMuaCIKI2luY2x1ZGUgIlRvbmVNYXBwaW5nLmgiCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIExvZ2FyaXRobWljIG1hcHBpbmcgb3BlcmF0b3IKLy8gUmVmZXJlbmNlOiAKLy8gWzFdIEYuIERyYWdvLCBLLiBNeXN6a293c2tpLCBULiBBbm5lbiwgYW5kIE4uIENoaWJhLCAKLy8gQWRhcHRpdmUgTG9nYXJpdGhtaWMgTWFwcGluZyBmb3IgRGlzcGxheWluZyBIaWdoIENvbnRyYXN0IFNjZW5lcywgCi8vIEV1cm9ncmFwaGljcyAyMDAzLgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKioKQmlhcyBmdW5jdGlvbgoqLwpzdGF0aWMgaW5saW5lIGRvdWJsZSAKYmlhc0Z1bmN0aW9uKGNvbnN0IGRvdWJsZSBiLCBjb25zdCBkb3VibGUgeCkgewoJcmV0dXJuIHBvdyAoeCwgYik7CQkvLyBwb3coeCwgbG9nKGJpYXMpL2xvZygwLjUpCn0KCi8qKgpQYWTpIGFwcHJveGltYXRpb24gb2YgbG9nKHggKyAxKQp4KDYreCkvKDYrNHgpIGdvb2QgaWYgeCA8IDEKeCooNiArIDAuNzY2MngpLyg1Ljk4OTcgKyAzLjc2NTh4KSBiZXR3ZWVuIDEgYW5kIDIKU2VlIGh0dHA6Ly93d3cubmV6dW1pLmRlbW9uLmNvLnVrL2NvbnN1bHQvbG9neC5odG0KKi8Kc3RhdGljIGlubGluZSBkb3VibGUgCnBhZGVfbG9nKGNvbnN0IGRvdWJsZSB4KSB7CglpZih4IDwgMSkgewoJCXJldHVybiAoeCAqICg2ICsgeCkgLyAoNiArIDQgKiB4KSk7Cgl9IGVsc2UgaWYoeCA8IDIpIHsKCQlyZXR1cm4gKHggKiAoNiArIDAuNzY2MiAqIHgpIC8gKDUuOTg5NyArIDMuNzY1OCAqIHgpKTsKCX0KCXJldHVybiBsb2coeCArIDEpOwp9CgovKioKTG9nIG1hcHBpbmcgb3BlcmF0b3IKQHBhcmFtIGRpYiBJbnB1dCAvIE91dHB1dCBZeHkgaW1hZ2UKQHBhcmFtIG1heEx1bSBNYXhpbXVtIGx1bWluYW5jZQpAcGFyYW0gYXZnTHVtIEF2ZXJhZ2UgbHVtaW5hbmNlICh3b3JsZCBhZGFwdGF0aW9uIGx1bWluYW5jZSkKQHBhcmFtIGJpYXNQYXJhbSBCaWFzIHBhcmFtZXRlciAoYSB6ZXJvIHZhbHVlIGRlZmF1bHQgdG8gMC44NSkKQHBhcmFtIGV4cG9zdXJlIEV4cG9zdXJlIHBhcmFtZXRlciAoZGVmYXVsdCB0byAwKQpAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQoqLwpzdGF0aWMgQk9PTCAKVG9uZU1hcHBpbmdEcmFnbzAzKEZJQklUTUFQICpkaWIsIGNvbnN0IGZsb2F0IG1heEx1bSwgY29uc3QgZmxvYXQgYXZnTHVtLCBmbG9hdCBiaWFzUGFyYW0sIGNvbnN0IGZsb2F0IGV4cG9zdXJlKSB7Cgljb25zdCBmbG9hdCBMT0cwNSA9IC0wLjY5MzE0N0Y7CS8vIGxvZygwLjUpIAoKCWRvdWJsZSBMbWF4LCBkaXZpZGVyLCBpbnRlcnBvbCwgYmlhc1A7Cgl1bnNpZ25lZCB4LCB5OwoJZG91YmxlIEw7CgoJaWYoRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpICE9IEZJVF9SR0JGKQoJCXJldHVybiBGQUxTRTsKCgljb25zdCB1bnNpZ25lZCB3aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKCWNvbnN0IHVuc2lnbmVkIHBpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOwoKCgkvLyBhcmJpdHJhcnkgQmlhcyBQYXJhbWV0ZXIgCglpZihiaWFzUGFyYW0gPT0gMCkgCgkJYmlhc1BhcmFtID0gMC44NUY7CgoJLy8gbm9ybWFsaXplIG1heGltdW0gbHVtaW5hbmNlIGJ5IGF2ZXJhZ2UgbHVtaW5hbmNlCglMbWF4ID0gbWF4THVtIC8gYXZnTHVtOwoJCglkaXZpZGVyID0gbG9nMTAoTG1heCsxKTsKICAgICAgICBiaWFzUCA9IHN0ZDo6bG9nKGJpYXNQYXJhbSkgLyBMT0cwNTsKCiNpZiAhZGVmaW5lZChEUkFHTzAzX0ZBU1QpCgoJLyoqCglOb3JtYWwgdG9uZSBtYXBwaW5nIG9mIGV2ZXJ5IHBpeGVsCglmdXJ0aGVyIGFjY2VsZXJhdGlvbiBpcyBvYnRhaW5lZCBieSBhIFBhZOkgYXBwcm94aW1hdGlvbiBvZiBsb2coeCArIDEpCgkqLwoJQllURSAqYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOwoJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKCQlGSVJHQkYgKnBpeGVsID0gKEZJUkdCRiopYml0czsKCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkJCWRvdWJsZSBZdyA9IHBpeGVsW3hdLnJlZCAvIGF2Z0x1bTsKCQkJWXcgKj0gZXhwb3N1cmU7CgkJCWludGVycG9sID0gbG9nKDIgKyBiaWFzRnVuY3Rpb24oYmlhc1AsIFl3IC8gTG1heCkgKiA4KTsKCQkJTCA9IHBhZGVfbG9nKFl3KTsvLyBsb2coWXcgKyAxKQoJCQlwaXhlbFt4XS5yZWQgPSAoZmxvYXQpKChMIC8gaW50ZXJwb2wpIC8gZGl2aWRlcik7CgkJfQoJCS8vIG5leHQgbGluZQoJCWJpdHMgKz0gcGl0Y2g7Cgl9CgojZWxzZQoJdW5zaWduZWQgaW5kZXg7CglpbnQgaSwgajsKCgl1bnNpZ25lZCBtYXhfd2lkdGggID0gd2lkdGggLSAod2lkdGggJSAzKTsKCXVuc2lnbmVkIG1heF9oZWlnaHQgPSBoZWlnaHQgLSAoaGVpZ2h0ICUgMyk7IAoJdW5zaWduZWQgZnBpdGNoID0gcGl0Y2ggLyBzaXplb2YoRklSR0JGKTsKCgkvKioKCWZhc3QgdG9uZSBtYXBwaW5nCglzcGxpdCB0aGUgaW1hZ2UgaW50byAzeDMgcGl4ZWwgdGlsZXMgYW5kIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uIGZvciBlYWNoIGdyb3VwIG9mIDkgcGl4ZWxzCglmdXJ0aGVyIGFjY2VsZXJhdGlvbiBpcyBvYnRhaW5lZCBieSBhIFBhZOkgYXBwcm94aW1hdGlvbiBvZiBsb2coeCArIDEpCgk9PiBwcm9kdWNlIGFydGlmYWN0cyBhbmQgbm90IHNvIGZhc3Rlciwgc28gdGhlIGNvZGUgaGFzIGJlZW4gZGlzYWJsZWQKCSovCiNkZWZpbmUgUElYRUwoeCwgeSkJaW1hZ2VbeSpmcGl0Y2ggKyB4XS5yZWQKCglGSVJHQkYgKmltYWdlID0gKEZJUkdCRiopRnJlZUltYWdlX0dldEJpdHMoZGliKTsKCWZvcih5ID0gMDsgeSA8IG1heF9oZWlnaHQ7IHkgKz0gMykgewoJCWZvcih4ID0gMDsgeCA8IG1heF93aWR0aDsgeCArPSAzKSB7CgkJCWRvdWJsZSBhdmVyYWdlID0gMDsKCQkJZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7CgkJCQlmb3IoaiA9IDA7IGogPCAzOyBqKyspIHsKCQkJCQlpbmRleCA9ICh5ICsgaSkqZnBpdGNoICsgKHggKyBqKTsKCQkJCQlpbWFnZVtpbmRleF0ucmVkIC89IChmbG9hdClhdmdMdW07CgkJCQkJaW1hZ2VbaW5kZXhdLnJlZCAqPSBleHBvc3VyZTsgCgkJCQkJYXZlcmFnZSArPSBpbWFnZVtpbmRleF0ucmVkOwoJCQkJfQoJCQl9CgkJCWF2ZXJhZ2UgPSBhdmVyYWdlIC8gOSAtIFBJWEVMKHgsIHkpOwoJCQlpZihhdmVyYWdlID4gLTEgJiYgYXZlcmFnZSA8IDEpIHsKCQkJCWludGVycG9sID0gbG9nKDIgKyBwb3coUElYRUwoeCArIDEsIHkgKyAxKSAvIExtYXgsIGJpYXNQKSAqIDgpOwoJCQkJZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7CgkJCQkJZm9yKGogPSAwOyBqIDwgMzsgaisrKSB7CgkJCQkJCWluZGV4ID0gKHkgKyBpKSpmcGl0Y2ggKyAoeCArIGopOwoJCQkJCQlMID0gcGFkZV9sb2coaW1hZ2VbaW5kZXhdLnJlZCk7Ly8gbG9nKGltYWdlW2luZGV4XS5yZWQgKyAxKQoJCQkJCQlpbWFnZVtpbmRleF0ucmVkID0gKGZsb2F0KSgoTCAvIGludGVycG9sKSAvIGRpdmlkZXIpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlIHsKCQkJCWZvcihpID0gMDsgaSA8IDM7IGkrKykgewoJCQkJCWZvcihqID0gMDsgaiA8IDM7IGorKykgewoJCQkJCQlpbmRleCA9ICh5ICsgaSkqZnBpdGNoICsgKHggKyBqKTsKCQkJCQkJaW50ZXJwb2wgPSBsb2coMiArIHBvdyhpbWFnZVtpbmRleF0ucmVkIC8gTG1heCwgYmlhc1ApICogOCk7CgkJCQkJCUwgPSBwYWRlX2xvZyhpbWFnZVtpbmRleF0ucmVkKTsvLyBsb2coaW1hZ2VbaW5kZXhdLnJlZCArIDEpCgkJCQkJCWltYWdlW2luZGV4XS5yZWQgPSAoZmxvYXQpKChMIC8gaW50ZXJwb2wpIC8gZGl2aWRlcik7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSAvL3gKCX0gLy8geQoKCS8qKgoJTm9ybWFsIHRvbmUgbWFwcGluZyBvZiBldmVyeSBwaXhlbCBmb3IgdGhlIHJlbWFpbmluZyByaWdodCBhbmQgYm90dG9tIGJhbmRzCgkqLwoJQllURSAqYml0czsKCgkvLyByaWdodCBiYW5kCgliaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRpYik7Cglmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCUZJUkdCRiAqcGl4ZWwgPSAoRklSR0JGKiliaXRzOwoJCWZvcih4ID0gbWF4X3dpZHRoOyB4IDwgd2lkdGg7IHgrKykgewoJCQlkb3VibGUgWXcgPSBwaXhlbFt4XS5yZWQgLyBhdmdMdW07CgkJCVl3ICo9IGV4cG9zdXJlOwoJCQlpbnRlcnBvbCA9IGxvZygyICsgYmlhc0Z1bmN0aW9uKGJpYXNQLCBZdyAvIExtYXgpICogOCk7CgkJCUwgPSBwYWRlX2xvZyhZdyk7Ly8gbG9nKFl3ICsgMSkKCQkJcGl4ZWxbeF0ucmVkID0gKGZsb2F0KSgoTCAvIGludGVycG9sKSAvIGRpdmlkZXIpOwoJCX0KCQkvLyBuZXh0IGxpbmUKCQliaXRzICs9IHBpdGNoOwoJfQoJLy8gYm90dG9tIGJhbmQKCWJpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoZGliKTsKCWZvcih5ID0gbWF4X2hlaWdodDsgeSA8IGhlaWdodDsgeSsrKSB7CgkJRklSR0JGICpwaXhlbCA9IChGSVJHQkYqKWJpdHM7CgkJZm9yKHggPSAwOyB4IDwgbWF4X3dpZHRoOyB4KyspIHsKCQkJZG91YmxlIFl3ID0gcGl4ZWxbeF0ucmVkIC8gYXZnTHVtOwoJCQlZdyAqPSBleHBvc3VyZTsKCQkJaW50ZXJwb2wgPSBsb2coMiArIGJpYXNGdW5jdGlvbihiaWFzUCwgWXcgLyBMbWF4KSAqIDgpOwoJCQlMID0gcGFkZV9sb2coWXcpOy8vIGxvZyhZdyArIDEpCgkJCXBpeGVsW3hdLnJlZCA9IChmbG9hdCkoKEwgLyBpbnRlcnBvbCkgLyBkaXZpZGVyKTsKCQl9CgkJLy8gbmV4dCBsaW5lCgkJYml0cyArPSBwaXRjaDsKCX0KCiNlbmRpZgkvLyBEUkFHTzAzX0ZBU1QKCglyZXR1cm4gVFJVRTsKfQoKLyoqCkN1c3RvbSBnYW1tYSBjb3JyZWN0aW9uIGJhc2VkIG9uIHRoZSBJVFUtUiBCVC43MDkgc3RhbmRhcmQKQHBhcmFtIGRpYiBSR0JGIGltYWdlIHRvIGJlIGNvcnJlY3RlZApAcGFyYW0gZ2FtbWF2YWwgR2FtbWEgdmFsdWUgKDIuMiBpcyBhIGdvb2QgZGVmYXVsdCB2YWx1ZSkKQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKi8Kc3RhdGljIEJPT0wgClJFQzcwOUdhbW1hQ29ycmVjdGlvbihGSUJJVE1BUCAqZGliLCBjb25zdCBmbG9hdCBnYW1tYXZhbCkgewoJaWYoRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpICE9IEZJVF9SR0JGKQoJCXJldHVybiBGQUxTRTsKCglmbG9hdCBzbG9wZSA9IDQuNUY7CglmbG9hdCBzdGFydCA9IDAuMDE4RjsKCQoJY29uc3QgZmxvYXQgZmdhbW1hID0gKGZsb2F0KSgoMC40NSAvIGdhbW1hdmFsKSAqIDIpOwoJaWYoZ2FtbWF2YWwgPj0gMi4xRikgewoJCXN0YXJ0ID0gKGZsb2F0KSgwLjAxOCAvICgoZ2FtbWF2YWwgLSAyKSAqIDcuNSkpOwoJCXNsb3BlID0gKGZsb2F0KSg0LjUgKiAoKGdhbW1hdmFsIC0gMikgKiA3LjUpKTsKCX0gZWxzZSBpZiAoZ2FtbWF2YWwgPD0gMS45RikgewoJCXN0YXJ0ID0gKGZsb2F0KSgwLjAxOCAqICgoMiAtIGdhbW1hdmFsKSAqIDcuNSkpOwoJCXNsb3BlID0gKGZsb2F0KSg0LjUgLyAoKDIgLSBnYW1tYXZhbCkgKiA3LjUpKTsKCX0KCgljb25zdCB1bnNpZ25lZCB3aWR0aCAgPSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsKCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKCWNvbnN0IHVuc2lnbmVkIHBpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOwoKCUJZVEUgKmJpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoZGliKTsKCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CgkJZmxvYXQgKnBpeGVsID0gKGZsb2F0KiliaXRzOwoJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKCQkJZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICpwaXhlbCA9ICgqcGl4ZWwgPD0gc3RhcnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKnBpeGVsICogc2xvcGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoMS4wOTlGICogc3RkOjpwb3coKnBpeGVsLCBmZ2FtbWEpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTlGKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbCsrOwogICAgICAgICAgICAgICAgICAgICAgICB9CgkJfQoJCWJpdHMgKz0gcGl0Y2g7Cgl9CgoJcmV0dXJuIFRSVUU7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gIE1haW4gYWxnb3JpdGhtCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qKgpBcHBseSB0aGUgQWRhcHRpdmUgTG9nYXJpdGhtaWMgTWFwcGluZyBvcGVyYXRvciB0byBhIEhEUiBpbWFnZSBhbmQgY29udmVydCB0byAyNC1iaXQgUkdCCkBwYXJhbSBzcmMgSW5wdXQgUkdCMTYgb3IgUkdCW0FdRiBpbWFnZQpAcGFyYW0gZ2FtbWEgR2FtbWEgY29ycmVjdGlvbiAoZ2FtbWEgPiAwKS4gMSBtZWFucyBubyBjb3JyZWN0aW9uLCAyLjIgaW4gdGhlIG9yaWdpbmFsIHBhcGVyLgpAcGFyYW0gZXhwb3N1cmUgRXhwb3N1cmUgcGFyYW1ldGVyICgwIG1lYW5zIG5vIGNvcnJlY3Rpb24sIDAgaW4gdGhlIG9yaWdpbmFsIHBhcGVyKQpAcmV0dXJuIFJldHVybnMgYSAyNC1iaXQgUkdCIGltYWdlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKi8KRklCSVRNQVAqIERMTF9DQUxMQ09OViAKRnJlZUltYWdlX1Rtb0RyYWdvMDMoRklCSVRNQVAgKnNyYywgZG91YmxlIGdhbW1hLCBkb3VibGUgZXhwb3N1cmUpIHsKCWZsb2F0IG1heEx1bSwgbWluTHVtLCBhdmdMdW07CgoJaWYoIUZyZWVJbWFnZV9IYXNQaXhlbHMoc3JjKSkgcmV0dXJuIE5VTEw7CgoJLy8gd29ya2luZyBSR0JGIHZhcmlhYmxlCglGSUJJVE1BUCAqZGliID0gTlVMTDsKCglkaWIgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCRihzcmMpOwoJaWYoIWRpYikgcmV0dXJuIE5VTEw7CgoJLy8gZGVmYXVsdCBhbGdvcml0aG0gcGFyYW1ldGVycwoJY29uc3QgZmxvYXQgYmlhc1BhcmFtID0gMC44NUY7Cgljb25zdCBmbG9hdCBleHBvUGFyYW0gPSAoZmxvYXQpcG93KDIuMCwgZXhwb3N1cmUpOyAvL2RlZmF1bHQgZXhwb3N1cmUgaXMgMSwgMl4wCgoJLy8gY29udmVydCB0byBZeHkKCUNvbnZlcnRJblBsYWNlUkdCRlRvWXh5KGRpYik7CgkvLyBnZXQgdGhlIGx1bWluYW5jZQoJTHVtaW5hbmNlRnJvbVl4eShkaWIsICZtYXhMdW0sICZtaW5MdW0sICZhdmdMdW0pOwoJLy8gcGVyZm9ybSB0aGUgdG9uZSBtYXBwaW5nCglUb25lTWFwcGluZ0RyYWdvMDMoZGliLCBtYXhMdW0sIGF2Z0x1bSwgYmlhc1BhcmFtLCBleHBvUGFyYW0pOwoJLy8gY29udmVydCBiYWNrIHRvIFJHQkYKCUNvbnZlcnRJblBsYWNlWXh5VG9SR0JGKGRpYik7CglpZihnYW1tYSAhPSAxKSB7CgkJLy8gcGVyZm9ybSBnYW1tYSBjb3JyZWN0aW9uCgkJUkVDNzA5R2FtbWFDb3JyZWN0aW9uKGRpYiwgKGZsb2F0KWdhbW1hKTsKCX0KCS8vIGNsYW1wIGltYWdlIGhpZ2hlc3QgdmFsdWVzIHRvIGRpc3BsYXkgd2hpdGUsIHRoZW4gY29udmVydCB0byAyNC1iaXQgUkdCCglGSUJJVE1BUCAqZHN0ID0gQ2xhbXBDb252ZXJ0UkdCRlRvMjQoZGliKTsKCgkvLyBjbGVhbi11cCBhbmQgcmV0dXJuCglGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CgoJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKGRzdCwgc3JjKTsKCQoJcmV0dXJuIGRzdDsKfQo=