LyoKICogVkdBIGhhcmR3YXJlIGVtdWxhdGlvbgogKiAKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuICh3aXRoIHNvbWUgaGVscCBmcm9tIE1hcmN1cyBNZWlzc25lcikKICoKICovCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbmNvbi5oIgojaW5jbHVkZSAibWlzY2VtdS5oIgojaW5jbHVkZSAidmdhLmgiCiNpbmNsdWRlICJkZHJhdy5oIgojaW5jbHVkZSAic2VydmljZXMuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7CgpzdGF0aWMgSURpcmVjdERyYXcgKmxwZGRyYXcgPSBOVUxMOwpzdGF0aWMgSURpcmVjdERyYXdTdXJmYWNlICpscGRkc3VyZjsKc3RhdGljIElEaXJlY3REcmF3UGFsZXR0ZSAqbHBkZHBhbDsKc3RhdGljIEREU1VSRkFDRURFU0Mgc2Rlc2M7CnN0YXRpYyBMT05HIHZnYV9wb2xsaW5nLHZnYV9yZWZyZXNoOwpzdGF0aWMgSEFORExFIHBvbGxfdGltZXI7Cgp0eXBlZGVmIEhSRVNVTFQgV0lOQVBJICgqRGlyZWN0RHJhd0NyZWF0ZVByb2MpKExQR1VJRCxMUERJUkVDVERSQVcgKixMUFVOS05PV04pOwpzdGF0aWMgRGlyZWN0RHJhd0NyZWF0ZVByb2MgcERpcmVjdERyYXdDcmVhdGU7Cgp0eXBlZGVmIEhXTkQgV0lOQVBJICgqQ3JlYXRlV2luZG93RXhBUHJvYykoRFdPUkQsTFBDU1RSLExQQ1NUUixEV09SRCxJTlQsSU5ULCBJTlQsSU5ULEhXTkQsSE1FTlUsSElOU1RBTkNFLExQVk9JRCk7CnN0YXRpYyBDcmVhdGVXaW5kb3dFeEFQcm9jIHBDcmVhdGVXaW5kb3dFeEE7CgpzdGF0aWMgdm9pZCBWR0FfRGVpbnN0YWxsVGltZXIodm9pZCkKewogICAgaWYgKHBvbGxfdGltZXIpIHsKICAgICAgICBTRVJWSUNFX0RlbGV0ZSggcG9sbF90aW1lciApOwogICAgICAgIHBvbGxfdGltZXIgPSAwOwogICAgfQp9CgpzdGF0aWMgdm9pZCBWR0FfSW5zdGFsbFRpbWVyKHVuc2lnbmVkIFJhdGUpCnsKICAgIFZHQV9EZWluc3RhbGxUaW1lcigpOwogICAgaWYgKCFwb2xsX3RpbWVyKQogICAgICAgIHBvbGxfdGltZXIgPSBTRVJWSUNFX0FkZFRpbWVyKCBSYXRlLCBWR0FfUG9sbCwgMCApOwp9CgpIQU5ETEUgVkdBX0FscGhhQ29uc29sZSh2b2lkKQp7CiAgICAvKiB0aGlzIGFzc3VtZXMgdGhhdCBubyBXaW4zMiByZWRpcmVjdGlvbiBoYXMgdGFrZW4gcGxhY2UsIGJ1dCB0aGVuIGFnYWluLAogICAgICogb25seSAxNi1iaXQgYXBwcyBhcmUgbGlrZWx5IHRvIHVzZSB0aGlzIHBhcnQgb2YgV2luZS4uLiAqLwogICAgcmV0dXJuIEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7Cn0KCmNoYXIqVkdBX0FscGhhQnVmZmVyKHZvaWQpCnsKICAgIHJldHVybiBET1NNRU1fTWFwRG9zVG9MaW5lYXIoMHhiODAwMCk7Cn0KCi8qKiogR1JBUEhJQ1MgTU9ERSAqKiovCgppbnQgVkdBX1NldE1vZGUodW5zaWduZWQgWHJlcyx1bnNpZ25lZCBZcmVzLHVuc2lnbmVkIERlcHRoKQp7CiAgICBMUkVTVUxUCXJlczsKICAgIEhXTkQJaHduZDsKCiAgICBpZiAobHBkZHJhdykgVkdBX0V4aXQoKTsKICAgIGlmICghbHBkZHJhdykgewogICAgICAgIGlmICghcERpcmVjdERyYXdDcmVhdGUpCiAgICAgICAgewogICAgICAgICAgICBITU9EVUxFIGhtb2QgPSBMb2FkTGlicmFyeUEoICJkZHJhdy5kbGwiICk7CiAgICAgICAgICAgIGlmIChobW9kKSBwRGlyZWN0RHJhd0NyZWF0ZSA9IChEaXJlY3REcmF3Q3JlYXRlUHJvYylHZXRQcm9jQWRkcmVzcyggaG1vZCwgIkRpcmVjdERyYXdDcmVhdGUiICk7CgkgICAgaWYgKCFwRGlyZWN0RHJhd0NyZWF0ZSkgewoJCUVSUigiQ2FuJ3QgbG9va3VwIERpcmVjdERyYXdDcmVhdGUgZnJvbSBkZHJhdy5kbGwuXG4iKTsKCQlyZXR1cm4gMTsKCSAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghcENyZWF0ZVdpbmRvd0V4QSkKCXsKICAgICAgICAgICAgSE1PRFVMRSBobW9kID0gTG9hZExpYnJhcnlBKCAidXNlcjMyLmRsbCIgKTsKCSAgICBpZiAoIWhtb2QpIHsKCQlFUlIoIkNhbid0IGxvYWQgdXNlcjMyLmRsbC5cbiIpOwoJCXJldHVybiAxOwoJICAgIH0KICAgICAgICAgICAgaWYgKGhtb2QpIHBDcmVhdGVXaW5kb3dFeEEgPSAoQ3JlYXRlV2luZG93RXhBUHJvYylHZXRQcm9jQWRkcmVzcyggaG1vZCwgIkNyZWF0ZVdpbmRvd0V4QSIgKTsKCSAgICBpZiAoIXBDcmVhdGVXaW5kb3dFeEEpIHsKCQlFUlIoIkNhbid0IGxvb2t1cCBDcmVhdGVXaW5kb3dFeEEgZnJvbSB1c2VyMzIuZGxsLlxuIik7CgkJcmV0dXJuIDE7CgkgICAgfQoJfQogICAgICAgIHJlcyA9IHBEaXJlY3REcmF3Q3JlYXRlKE5VTEwsJmxwZGRyYXcsTlVMTCk7CiAgICAgICAgaWYgKCFscGRkcmF3KSB7CiAgICAgICAgICAgIEVSUigiRGlyZWN0RHJhdyBpcyBub3QgYXZhaWxhYmxlIChyZXMgPSAlbHgpXG4iLHJlcyk7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KCWh3bmQgPSBwQ3JlYXRlV2luZG93RXhBKDAsIlNUQVRJQyIsIldJTkVET1MgVkdBIixXU19QT1BVUHxXU19CT1JERVJ8V1NfQ0FQVElPTnxXU19TWVNNRU5VLDAsMCxYcmVzLFlyZXMsMCwwLDAsTlVMTCk7CglpZiAoIWh3bmQpIHsKCSAgICBFUlIoIkZhaWxlZCB0byBjcmVhdGUgdXNlciB3aW5kb3cuXG4iKTsKCX0KICAgICAgICBpZiAoKHJlcz1JRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsKGxwZGRyYXcsaHduZCxERFNDTF9GVUxMU0NSRUVOfEREU0NMX0VYQ0xVU0lWRSkpKSB7CgkgICAgRVJSKCJDb3VsZCBub3Qgc2V0IGNvb3BlcmF0aXZlIGxldmVsIHRvIGV4Y2x1c2l2ZSAoJWx4KVxuIixyZXMpOwoJfQoKICAgICAgICBpZiAoKHJlcz1JRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZShscGRkcmF3LFhyZXMsWXJlcyxEZXB0aCkpKSB7CiAgICAgICAgICAgIEVSUigiRGlyZWN0RHJhdyBkb2VzIG5vdCBzdXBwb3J0IHJlcXVlc3RlZCBkaXNwbGF5IG1vZGUgKCVkeCVkeCVkKSwgcmVzID0gJWx4IVxuIixYcmVzLFlyZXMsRGVwdGgscmVzKTsKICAgICAgICAgICAgSURpcmVjdERyYXdfUmVsZWFzZShscGRkcmF3KTsKICAgICAgICAgICAgbHBkZHJhdz1OVUxMOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgcmVzPUlEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUobHBkZHJhdyxERFBDQVBTXzhCSVQsTlVMTCwmbHBkZHBhbCxOVUxMKTsKCWlmIChyZXMpIHsKCSAgICBFUlIoIkNvdWxkIG5vdCBjcmVhdGUgcGFsZXR0ZSAocmVzID0gJWx4KVxuIixyZXMpOwoJfQogICAgICAgIG1lbXNldCgmc2Rlc2MsMCxzaXplb2Yoc2Rlc2MpKTsKICAgICAgICBzZGVzYy5kd1NpemU9c2l6ZW9mKHNkZXNjKTsKCXNkZXNjLmR3RmxhZ3MgPSBERFNEX0NBUFM7CglzZGVzYy5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfUFJJTUFSWVNVUkZBQ0U7CiAgICAgICAgaWYgKElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBkZHJhdywmc2Rlc2MsJmxwZGRzdXJmLE5VTEwpfHwoIWxwZGRzdXJmKSkgewogICAgICAgICAgICBFUlIoIkRpcmVjdERyYXcgc3VyZmFjZSBpcyBub3QgYXZhaWxhYmxlXG4iKTsKICAgICAgICAgICAgSURpcmVjdERyYXdfUmVsZWFzZShscGRkcmF3KTsKICAgICAgICAgICAgbHBkZHJhdz1OVUxMOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgRklYTUUoIm5vIGRlZmF1bHQgcGFsZXR0ZSBlbnRyaWVzXG4iKTsKICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VfU2V0UGFsZXR0ZShscGRkc3VyZixscGRkcGFsKTsKICAgICAgICB2Z2FfcmVmcmVzaD0wOwogICAgICAgIC8qIHBvbGwgZXZlcnkgMjBtcyAoNTBmcHMgc2hvdWxkIHByb3ZpZGUgYWRlcXVhdGUgcmVzcG9uc2l2ZW5lc3MpICovCiAgICAgICAgVkdBX0luc3RhbGxUaW1lcigyMCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKaW50IFZHQV9HZXRNb2RlKHVuc2lnbmVkKkhlaWdodCx1bnNpZ25lZCpXaWR0aCx1bnNpZ25lZCpEZXB0aCkKewogICAgaWYgKCFscGRkcmF3KSByZXR1cm4gMTsKICAgIGlmICghbHBkZHN1cmYpIHJldHVybiAxOwogICAgaWYgKEhlaWdodCkgKkhlaWdodD1zZGVzYy5kd0hlaWdodDsKICAgIGlmIChXaWR0aCkgKldpZHRoPXNkZXNjLmR3V2lkdGg7CiAgICBpZiAoRGVwdGgpICpEZXB0aD1zZGVzYy5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudDsKICAgIHJldHVybiAwOwp9Cgp2b2lkIFZHQV9FeGl0KHZvaWQpCnsKICAgIGlmIChscGRkcmF3KSB7CiAgICAgICAgVkdBX0RlaW5zdGFsbFRpbWVyKCk7CiAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlX1NldFBhbGV0dGUobHBkZHN1cmYsTlVMTCk7CiAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UobHBkZHN1cmYpOwogICAgICAgIGxwZGRzdXJmPU5VTEw7CiAgICAgICAgSURpcmVjdERyYXdQYWxldHRlX1JlbGVhc2UobHBkZHBhbCk7CiAgICAgICAgbHBkZHBhbD1OVUxMOwogICAgICAgIElEaXJlY3REcmF3X1JlbGVhc2UobHBkZHJhdyk7CiAgICAgICAgbHBkZHJhdz1OVUxMOwogICAgfQp9Cgp2b2lkIFZHQV9TZXRQYWxldHRlKFBBTEVUVEVFTlRSWSpwYWwsaW50IHN0YXJ0LGludCBsZW4pCnsKICAgIGlmICghbHBkZHJhdykgcmV0dXJuOwogICAgSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMobHBkZHBhbCwwLHN0YXJ0LGxlbixwYWwpOwp9Cgp2b2lkIFZHQV9TZXRRdWFkUGFsZXR0ZShSR0JRVUFEKmNvbG9yLGludCBzdGFydCxpbnQgbGVuKQp7CiAgICBQQUxFVFRFRU5UUlkgcGFsWzI1Nl07CiAgICBpbnQgYzsKCiAgICBpZiAoIWxwZGRyYXcpIHJldHVybjsKICAgIGZvciAoYz0wOyBjPGxlbjsgYysrKSB7CiAgICAgICAgcGFsW2NdLnBlUmVkICA9Y29sb3JbY10ucmdiUmVkOwogICAgICAgIHBhbFtjXS5wZUdyZWVuPWNvbG9yW2NdLnJnYkdyZWVuOwogICAgICAgIHBhbFtjXS5wZUJsdWUgPWNvbG9yW2NdLnJnYkJsdWU7CiAgICAgICAgcGFsW2NdLnBlRmxhZ3M9MDsKICAgIH0KICAgIElEaXJlY3REcmF3UGFsZXR0ZV9TZXRFbnRyaWVzKGxwZGRwYWwsMCxzdGFydCxsZW4scGFsKTsKfQoKTFBTVFIgVkdBX0xvY2sodW5zaWduZWQqUGl0Y2gsdW5zaWduZWQqSGVpZ2h0LHVuc2lnbmVkKldpZHRoLHVuc2lnbmVkKkRlcHRoKQp7CiAgICBpZiAoIWxwZGRyYXcpIHJldHVybiBOVUxMOwogICAgaWYgKCFscGRkc3VyZikgcmV0dXJuIE5VTEw7CiAgICBpZiAoSURpcmVjdERyYXdTdXJmYWNlX0xvY2sobHBkZHN1cmYsTlVMTCwmc2Rlc2MsMCwwKSkgewogICAgICAgIEVSUigiY291bGQgbm90IGxvY2sgc3VyZmFjZSFcbiIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgaWYgKFBpdGNoKSAqUGl0Y2g9c2Rlc2MudTEubFBpdGNoOwogICAgaWYgKEhlaWdodCkgKkhlaWdodD1zZGVzYy5kd0hlaWdodDsKICAgIGlmIChXaWR0aCkgKldpZHRoPXNkZXNjLmR3V2lkdGg7CiAgICBpZiAoRGVwdGgpICpEZXB0aD1zZGVzYy5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudDsKICAgIHJldHVybiBzZGVzYy5scFN1cmZhY2U7Cn0KCnZvaWQgVkdBX1VubG9jayh2b2lkKQp7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrKGxwZGRzdXJmLHNkZXNjLmxwU3VyZmFjZSk7Cn0KCi8qKiogVEVYVCBNT0RFICoqKi8KCmludCBWR0FfU2V0QWxwaGFNb2RlKHVuc2lnbmVkIFhyZXMsdW5zaWduZWQgWXJlcykKewogICAgQ09PUkQgc2l6OwoKICAgIGlmIChscGRkcmF3KSBWR0FfRXhpdCgpOwoKICAgIC8qIHRoZSB4dGVybSBpcyBzbG93LCBzbyByZWZyZXNoIG9ubHkgZXZlcnkgMjAwbXMgKDVmcHMpICovCiAgICBWR0FfSW5zdGFsbFRpbWVyKDIwMCk7CgogICAgc2l6LlggPSBYcmVzOwogICAgc2l6LlkgPSBZcmVzOwogICAgU2V0Q29uc29sZVNjcmVlbkJ1ZmZlclNpemUoVkdBX0FscGhhQ29uc29sZSgpLHNpeik7CiAgICByZXR1cm4gMDsKfQoKdm9pZCBWR0FfR2V0QWxwaGFNb2RlKHVuc2lnbmVkKlhyZXMsdW5zaWduZWQqWXJlcykKewogICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gaW5mbzsKICAgIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKFZHQV9BbHBoYUNvbnNvbGUoKSwmaW5mbyk7CiAgICBpZiAoWHJlcykgKlhyZXM9aW5mby5kd1NpemUuWDsKICAgIGlmIChZcmVzKSAqWXJlcz1pbmZvLmR3U2l6ZS5ZOwp9Cgp2b2lkIFZHQV9TZXRDdXJzb3JQb3ModW5zaWduZWQgWCx1bnNpZ25lZCBZKQp7CiAgICBDT09SRCBwb3M7CiAgICAKICAgIHBvcy5YID0gWDsKICAgIHBvcy5ZID0gWTsKICAgIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihWR0FfQWxwaGFDb25zb2xlKCkscG9zKTsKfQoKdm9pZCBWR0FfR2V0Q3Vyc29yUG9zKHVuc2lnbmVkKlgsdW5zaWduZWQqWSkKewogICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gaW5mbzsKICAgIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKFZHQV9BbHBoYUNvbnNvbGUoKSwmaW5mbyk7CiAgICBpZiAoWCkgKlg9aW5mby5kd0N1cnNvclBvc2l0aW9uLlg7CiAgICBpZiAoWSkgKlk9aW5mby5kd0N1cnNvclBvc2l0aW9uLlk7Cn0KCnZvaWQgVkdBX1dyaXRlQ2hhcnModW5zaWduZWQgWCx1bnNpZ25lZCBZLHVuc2lnbmVkIGNoLGludCBhdHRyLGludCBjb3VudCkKewogICAgdW5zaWduZWQgWFIsIFlSOwogICAgY2hhcipkYXQ7CgogICAgVkdBX0dldEFscGhhTW9kZSgmWFIsICZZUik7CiAgICBkYXQgPSBWR0FfQWxwaGFCdWZmZXIoKSArICgoWFIqWSArIFgpICogMik7CiAgICAvKiBGSVhNRTogYWxzbyBjYWxsIFdyaXRlQ29uc29sZU91dHB1dEEsIGZvciBiZXR0ZXIgcmVzcG9uc2l2ZW5lc3MgKi8KICAgIHdoaWxlIChjb3VudC0tKSB7CiAgICAgICAgKmRhdCsrID0gY2g7CiAgICAgICAgaWYgKGF0dHI+PTApICpkYXQgPSBhdHRyOwogICAgICAgIGRhdCsrOwogICAgfQp9CgovKioqIENPTlRST0wgKioqLwoKdm9pZCBDQUxMQkFDSyBWR0FfUG9sbCggVUxPTkdfUFRSIGFyZyApCnsKICAgIGNoYXIgKmRhdDsKICAgIHVuc2lnbmVkIGludCBQaXRjaCxIZWlnaHQsV2lkdGgsWSxYOwogICAgY2hhciAqc3VyZjsKCiAgICBpZiAoIUludGVybG9ja2VkRXhjaGFuZ2VBZGQoJnZnYV9wb2xsaW5nLCAxKSkgewogICAgICAgIC8qIEZJWE1FOiBvcHRpbWl6ZSBieSBkb2luZyB0aGlzIG9ubHkgaWYgdGhlIGRhdGEgaGFzIGFjdHVhbGx5IGNoYW5nZWQKICAgICAgICAgKiAgICAgICAgKGluIGEgd2F5IHNpbWlsYXIgdG8gRElCU2VjdGlvbiwgcGVyaGFwcykgKi8KICAgICAgICBpZiAobHBkZHJhdykgewogICAgICAgICAgLyogZ3JhcGhpY3MgbW9kZSAqLwogICAgICAgICAgc3VyZiA9IFZHQV9Mb2NrKCZQaXRjaCwmSGVpZ2h0LCZXaWR0aCxOVUxMKTsKICAgICAgICAgIGlmICghc3VyZikgcmV0dXJuOwogICAgICAgICAgZGF0ID0gRE9TTUVNX01hcERvc1RvTGluZWFyKDB4YTAwMDApOwogICAgICAgICAgLyogY29weSBmcm9tIHZpcnR1YWwgVkdBIGZyYW1lIGJ1ZmZlciB0byBEaXJlY3REcmF3IHN1cmZhY2UgKi8KICAgICAgICAgIGZvciAoWT0wOyBZPEhlaWdodDsgWSsrLHN1cmYrPVBpdGNoLGRhdCs9V2lkdGgpIHsKICAgICAgICAgICAgICBtZW1jcHkoc3VyZixkYXQsV2lkdGgpOwogICAgICAgICAgICAgIC8qZm9yIChYPTA7IFg8V2lkdGg7IFgrKykgaWYgKGRhdFtYXSkgVFJBQ0UoZGRyYXcsImRhdGEoJWQpIGF0ICglZCwlZClcbiIsZGF0W1hdLFgsWSk7Ki8KICAgICAgICAgIH0KICAgICAgICAgIFZHQV9VbmxvY2soKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLyogdGV4dCBtb2RlICovCiAgICAgICAgICBDSEFSX0lORk8gY2hbODBdOwogICAgICAgICAgQ09PUkQgc2l6LCBvZmY7CiAgICAgICAgICBTTUFMTF9SRUNUIGRlc3Q7CiAgICAgICAgICBIQU5ETEUgY29uID0gVkdBX0FscGhhQ29uc29sZSgpOwoKICAgICAgICAgIFZHQV9HZXRBbHBoYU1vZGUoJldpZHRoLCZIZWlnaHQpOwogICAgICAgICAgZGF0ID0gVkdBX0FscGhhQnVmZmVyKCk7CiAgICAgICAgICBzaXouWCA9IDgwOyBzaXouWSA9IDE7CiAgICAgICAgICBvZmYuWCA9IDA7IG9mZi5ZID0gMDsKICAgICAgICAgIC8qIGNvcHkgZnJvbSB2aXJ0dWFsIFZHQSBmcmFtZSBidWZmZXIgdG8gY29uc29sZSAqLwogICAgICAgICAgZm9yIChZPTA7IFk8SGVpZ2h0OyBZKyspIHsKICAgICAgICAgICAgICBkZXN0LlRvcD1ZOyBkZXN0LkJvdHRvbT1ZOwogICAgICAgICAgICAgIGZvciAoWD0wOyBYPFdpZHRoOyBYKyspIHsKICAgICAgICAgICAgICAgICAgY2hbWF0uQ2hhci5Bc2NpaUNoYXIgPSAqZGF0Kys7CgkJICAvKiBXcml0ZUNvbnNvbGVPdXRwdXRBIGRvZXNuJ3QgbGlrZSAiZGVhZCIgY2hhcnMgKi8KCQkgIGlmIChjaFtYXS5DaGFyLkFzY2lpQ2hhciA9PSAnXDAnKQoJCSAgICAgIGNoW1hdLkNoYXIuQXNjaWlDaGFyID0gJyAnOwogICAgICAgICAgICAgICAgICBjaFtYXS5BdHRyaWJ1dGVzID0gKmRhdCsrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkZXN0LkxlZnQ9MDsgZGVzdC5SaWdodD1XaWR0aCsxOwogICAgICAgICAgICAgIFdyaXRlQ29uc29sZU91dHB1dEEoY29uLCBjaCwgc2l6LCBvZmYsICZkZXN0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmdhX3JlZnJlc2g9MTsKICAgIH0KICAgIEludGVybG9ja2VkRGVjcmVtZW50KCZ2Z2FfcG9sbGluZyk7Cn0KCnN0YXRpYyBCWVRFIHBhbHJlZyxwYWxjbnQ7CnN0YXRpYyBQQUxFVFRFRU5UUlkgcGFsZGF0OwoKdm9pZCBWR0FfaW9wb3J0X291dCggV09SRCBwb3J0LCBCWVRFIHZhbCApCnsKICAgIHN3aXRjaCAocG9ydCkgewogICAgICAgIGNhc2UgMHgzYzg6CiAgICAgICAgICAgIHBhbHJlZz12YWw7IHBhbGNudD0wOyBicmVhazsKICAgICAgICBjYXNlIDB4M2M5OgogICAgICAgICAgICAoKEJZVEUqKSZwYWxkYXQpW3BhbGNudCsrXT12YWwgPDwgMjsKICAgICAgICAgICAgaWYgKHBhbGNudD09MykgewogICAgICAgICAgICAgICAgVkdBX1NldFBhbGV0dGUoJnBhbGRhdCxwYWxyZWcrKywxKTsKICAgICAgICAgICAgICAgIHBhbGNudD0wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgfQp9CgpCWVRFIFZHQV9pb3BvcnRfaW4oIFdPUkQgcG9ydCApCnsKICAgIEJZVEUgcmV0OwoKICAgIHN3aXRjaCAocG9ydCkgewogICAgICAgIGNhc2UgMHgzZGE6CiAgICAgICAgICAgIC8qIHNpbmNlIHdlIGRvbid0ICh5ZXQ/KSBzZXJ2ZSBET1MgVk0gcmVxdWVzdHMgd2hpbGUgVkdBX1BvbGwgaXMgcnVubmluZywKICAgICAgICAgICAgICAgd2UgbmVlZCB0byBmYWtlIHRoZSBvY2N1cnJlbmNlIG9mIHRoZSB2ZXJ0aWNhbCByZWZyZXNoICovCiAgICAgICAgICAgIHJldD12Z2FfcmVmcmVzaD8weDAwOjB4MDg7CiAgICAgICAgICAgIHZnYV9yZWZyZXNoPTA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldD0weGZmOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKdm9pZCBWR0FfQ2xlYW4odm9pZCkKewogICAgVkdBX0V4aXQoKTsKICAgIFZHQV9EZWluc3RhbGxUaW1lcigpOwp9Cg==