LyoKICogVkdBIGhhcmR3YXJlIGVtdWxhdGlvbgogKiAKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuICh3aXRoIHNvbWUgaGVscCBmcm9tIE1hcmN1cyBNZWlzc25lcikKICoKICovCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5jb24uaCIKI2luY2x1ZGUgIm1pc2NlbXUuaCIKI2luY2x1ZGUgInZnYS5oIgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgInNlcnZpY2VzLmgiCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwoKc3RhdGljIElEaXJlY3REcmF3ICpscGRkcmF3ID0gTlVMTDsKc3RhdGljIElEaXJlY3REcmF3U3VyZmFjZSAqbHBkZHN1cmY7CnN0YXRpYyBJRGlyZWN0RHJhd1BhbGV0dGUgKmxwZGRwYWw7CnN0YXRpYyBERFNVUkZBQ0VERVNDIHNkZXNjOwpzdGF0aWMgTE9ORyB2Z2FfcG9sbGluZyx2Z2FfcmVmcmVzaDsKc3RhdGljIEhBTkRMRSBwb2xsX3RpbWVyOwoKdHlwZWRlZiBIUkVTVUxUIFdJTkFQSSAoKkRpcmVjdERyYXdDcmVhdGVQcm9jKShMUEdVSUQsTFBESVJFQ1REUkFXICosTFBVTktOT1dOKTsKc3RhdGljIERpcmVjdERyYXdDcmVhdGVQcm9jIHBEaXJlY3REcmF3Q3JlYXRlOwoKc3RhdGljIHZvaWQgVkdBX0RlaW5zdGFsbFRpbWVyKHZvaWQpCnsKICAgIGlmIChwb2xsX3RpbWVyKSB7CiAgICAgICAgU0VSVklDRV9EZWxldGUoIHBvbGxfdGltZXIgKTsKICAgICAgICBwb2xsX3RpbWVyID0gMDsKICAgIH0KfQoKc3RhdGljIHZvaWQgVkdBX0luc3RhbGxUaW1lcih1bnNpZ25lZCBSYXRlKQp7CiAgICBWR0FfRGVpbnN0YWxsVGltZXIoKTsKICAgIGlmICghcG9sbF90aW1lcikKICAgICAgICBwb2xsX3RpbWVyID0gU0VSVklDRV9BZGRUaW1lciggUmF0ZSwgVkdBX1BvbGwsIDAgKTsKfQoKSEFORExFIFZHQV9BbHBoYUNvbnNvbGUodm9pZCkKewogICAgLyogdGhpcyBhc3N1bWVzIHRoYXQgbm8gV2luMzIgcmVkaXJlY3Rpb24gaGFzIHRha2VuIHBsYWNlLCBidXQgdGhlbiBhZ2FpbiwKICAgICAqIG9ubHkgMTYtYml0IGFwcHMgYXJlIGxpa2VseSB0byB1c2UgdGhpcyBwYXJ0IG9mIFdpbmUuLi4gKi8KICAgIHJldHVybiBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOwp9CgpjaGFyKlZHQV9BbHBoYUJ1ZmZlcih2b2lkKQp7CiAgICByZXR1cm4gRE9TTUVNX01hcERvc1RvTGluZWFyKDB4YjgwMDApOwp9CgovKioqIEdSQVBISUNTIE1PREUgKioqLwoKaW50IFZHQV9TZXRNb2RlKHVuc2lnbmVkIFhyZXMsdW5zaWduZWQgWXJlcyx1bnNpZ25lZCBEZXB0aCkKewogICAgaWYgKGxwZGRyYXcpIFZHQV9FeGl0KCk7CiAgICBpZiAoIWxwZGRyYXcpIHsKICAgICAgICBpZiAoIXBEaXJlY3REcmF3Q3JlYXRlKQogICAgICAgIHsKICAgICAgICAgICAgSE1PRFVMRSBobW9kID0gTG9hZExpYnJhcnlBKCAiZGRyYXcuZGxsIiApOwogICAgICAgICAgICBpZiAoaG1vZCkgcERpcmVjdERyYXdDcmVhdGUgPSAoRGlyZWN0RHJhd0NyZWF0ZVByb2MpR2V0UHJvY0FkZHJlc3MoIGhtb2QsICJEaXJlY3REcmF3Q3JlYXRlIiApOwogICAgICAgIH0KICAgICAgICBpZiAocERpcmVjdERyYXdDcmVhdGUpIHBEaXJlY3REcmF3Q3JlYXRlKE5VTEwsJmxwZGRyYXcsTlVMTCk7CiAgICAgICAgaWYgKCFscGRkcmF3KSB7CiAgICAgICAgICAgIEVSUigiRGlyZWN0RHJhdyBpcyBub3QgYXZhaWxhYmxlXG4iKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGlmIChJRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZShscGRkcmF3LFhyZXMsWXJlcyxEZXB0aCkpIHsKICAgICAgICAgICAgRVJSKCJEaXJlY3REcmF3IGRvZXMgbm90IHN1cHBvcnQgcmVxdWVzdGVkIGRpc3BsYXkgbW9kZVxuIik7CiAgICAgICAgICAgIElEaXJlY3REcmF3X1JlbGVhc2UobHBkZHJhdyk7CiAgICAgICAgICAgIGxwZGRyYXc9TlVMTDsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIElEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUobHBkZHJhdyxERFBDQVBTXzhCSVQsTlVMTCwmbHBkZHBhbCxOVUxMKTsKICAgICAgICBtZW1zZXQoJnNkZXNjLDAsc2l6ZW9mKHNkZXNjKSk7CiAgICAgICAgc2Rlc2MuZHdTaXplPXNpemVvZihzZGVzYyk7CglzZGVzYy5kd0ZsYWdzID0gRERTRF9DQVBTOwoJc2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX1BSSU1BUllTVVJGQUNFOwogICAgICAgIGlmIChJRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlKGxwZGRyYXcsJnNkZXNjLCZscGRkc3VyZixOVUxMKXx8KCFscGRkc3VyZikpIHsKICAgICAgICAgICAgRVJSKCJEaXJlY3REcmF3IHN1cmZhY2UgaXMgbm90IGF2YWlsYWJsZVxuIik7CiAgICAgICAgICAgIElEaXJlY3REcmF3X1JlbGVhc2UobHBkZHJhdyk7CiAgICAgICAgICAgIGxwZGRyYXc9TlVMTDsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIEZJWE1FKCJubyBkZWZhdWx0IHBhbGV0dGUgZW50cmllc1xuIik7CiAgICAgICAgSURpcmVjdERyYXdTdXJmYWNlX1NldFBhbGV0dGUobHBkZHN1cmYsbHBkZHBhbCk7CiAgICAgICAgdmdhX3JlZnJlc2g9MDsKICAgICAgICAvKiBwb2xsIGV2ZXJ5IDIwbXMgKDUwZnBzIHNob3VsZCBwcm92aWRlIGFkZXF1YXRlIHJlc3BvbnNpdmVuZXNzKSAqLwogICAgICAgIFZHQV9JbnN0YWxsVGltZXIoMjApOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCmludCBWR0FfR2V0TW9kZSh1bnNpZ25lZCpIZWlnaHQsdW5zaWduZWQqV2lkdGgsdW5zaWduZWQqRGVwdGgpCnsKICAgIGlmICghbHBkZHJhdykgcmV0dXJuIDE7CiAgICBpZiAoIWxwZGRzdXJmKSByZXR1cm4gMTsKICAgIGlmIChIZWlnaHQpICpIZWlnaHQ9c2Rlc2MuZHdIZWlnaHQ7CiAgICBpZiAoV2lkdGgpICpXaWR0aD1zZGVzYy5kd1dpZHRoOwogICAgaWYgKERlcHRoKSAqRGVwdGg9c2Rlc2MuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQ7CiAgICByZXR1cm4gMDsKfQoKdm9pZCBWR0FfRXhpdCh2b2lkKQp7CiAgICBpZiAobHBkZHJhdykgewogICAgICAgIFZHQV9EZWluc3RhbGxUaW1lcigpOwogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZV9TZXRQYWxldHRlKGxwZGRzdXJmLE5VTEwpOwogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGxwZGRzdXJmKTsKICAgICAgICBscGRkc3VyZj1OVUxMOwogICAgICAgIElEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKGxwZGRwYWwpOwogICAgICAgIGxwZGRwYWw9TlVMTDsKICAgICAgICBJRGlyZWN0RHJhd19SZWxlYXNlKGxwZGRyYXcpOwogICAgICAgIGxwZGRyYXc9TlVMTDsKICAgIH0KfQoKdm9pZCBWR0FfU2V0UGFsZXR0ZShQQUxFVFRFRU5UUlkqcGFsLGludCBzdGFydCxpbnQgbGVuKQp7CiAgICBpZiAoIWxwZGRyYXcpIHJldHVybjsKICAgIElEaXJlY3REcmF3UGFsZXR0ZV9TZXRFbnRyaWVzKGxwZGRwYWwsMCxzdGFydCxsZW4scGFsKTsKfQoKdm9pZCBWR0FfU2V0UXVhZFBhbGV0dGUoUkdCUVVBRCpjb2xvcixpbnQgc3RhcnQsaW50IGxlbikKewogICAgUEFMRVRURUVOVFJZIHBhbFsyNTZdOwogICAgaW50IGM7CgogICAgaWYgKCFscGRkcmF3KSByZXR1cm47CiAgICBmb3IgKGM9MDsgYzxsZW47IGMrKykgewogICAgICAgIHBhbFtjXS5wZVJlZCAgPWNvbG9yW2NdLnJnYlJlZDsKICAgICAgICBwYWxbY10ucGVHcmVlbj1jb2xvcltjXS5yZ2JHcmVlbjsKICAgICAgICBwYWxbY10ucGVCbHVlID1jb2xvcltjXS5yZ2JCbHVlOwogICAgICAgIHBhbFtjXS5wZUZsYWdzPTA7CiAgICB9CiAgICBJRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcyhscGRkcGFsLDAsc3RhcnQsbGVuLHBhbCk7Cn0KCkxQU1RSIFZHQV9Mb2NrKHVuc2lnbmVkKlBpdGNoLHVuc2lnbmVkKkhlaWdodCx1bnNpZ25lZCpXaWR0aCx1bnNpZ25lZCpEZXB0aCkKewogICAgaWYgKCFscGRkcmF3KSByZXR1cm4gTlVMTDsKICAgIGlmICghbHBkZHN1cmYpIHJldHVybiBOVUxMOwogICAgaWYgKElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKGxwZGRzdXJmLE5VTEwsJnNkZXNjLDAsMCkpIHsKICAgICAgICBFUlIoImNvdWxkIG5vdCBsb2NrIHN1cmZhY2UhXG4iKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmIChQaXRjaCkgKlBpdGNoPXNkZXNjLnUxLmxQaXRjaDsKICAgIGlmIChIZWlnaHQpICpIZWlnaHQ9c2Rlc2MuZHdIZWlnaHQ7CiAgICBpZiAoV2lkdGgpICpXaWR0aD1zZGVzYy5kd1dpZHRoOwogICAgaWYgKERlcHRoKSAqRGVwdGg9c2Rlc2MuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQ7CiAgICByZXR1cm4gc2Rlc2MubHBTdXJmYWNlOwp9Cgp2b2lkIFZHQV9VbmxvY2sodm9pZCkKewogICAgSURpcmVjdERyYXdTdXJmYWNlX1VubG9jayhscGRkc3VyZixzZGVzYy5scFN1cmZhY2UpOwp9CgovKioqIFRFWFQgTU9ERSAqKiovCgppbnQgVkdBX1NldEFscGhhTW9kZSh1bnNpZ25lZCBYcmVzLHVuc2lnbmVkIFlyZXMpCnsKICAgIENPT1JEIHNpejsKCiAgICBpZiAobHBkZHJhdykgVkdBX0V4aXQoKTsKCiAgICAvKiB0aGUgeHRlcm0gaXMgc2xvdywgc28gcmVmcmVzaCBvbmx5IGV2ZXJ5IDIwMG1zICg1ZnBzKSAqLwogICAgVkdBX0luc3RhbGxUaW1lcigyMDApOwoKICAgIHNpei5YID0gWHJlczsKICAgIHNpei5ZID0gWXJlczsKICAgIFNldENvbnNvbGVTY3JlZW5CdWZmZXJTaXplKFZHQV9BbHBoYUNvbnNvbGUoKSxzaXopOwogICAgcmV0dXJuIDA7Cn0KCnZvaWQgVkdBX0dldEFscGhhTW9kZSh1bnNpZ25lZCpYcmVzLHVuc2lnbmVkKllyZXMpCnsKICAgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGluZm87CiAgICBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhWR0FfQWxwaGFDb25zb2xlKCksJmluZm8pOwogICAgaWYgKFhyZXMpICpYcmVzPWluZm8uZHdTaXplLlg7CiAgICBpZiAoWXJlcykgKllyZXM9aW5mby5kd1NpemUuWTsKfQoKdm9pZCBWR0FfU2V0Q3Vyc29yUG9zKHVuc2lnbmVkIFgsdW5zaWduZWQgWSkKewogICAgQ09PUkQgcG9zOwogICAgCiAgICBwb3MuWCA9IFg7CiAgICBwb3MuWSA9IFk7CiAgICBTZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24oVkdBX0FscGhhQ29uc29sZSgpLHBvcyk7Cn0KCnZvaWQgVkdBX0dldEN1cnNvclBvcyh1bnNpZ25lZCpYLHVuc2lnbmVkKlkpCnsKICAgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGluZm87CiAgICBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhWR0FfQWxwaGFDb25zb2xlKCksJmluZm8pOwogICAgaWYgKFgpICpYPWluZm8uZHdDdXJzb3JQb3NpdGlvbi5YOwogICAgaWYgKFkpICpZPWluZm8uZHdDdXJzb3JQb3NpdGlvbi5ZOwp9Cgp2b2lkIFZHQV9Xcml0ZUNoYXJzKHVuc2lnbmVkIFgsdW5zaWduZWQgWSx1bnNpZ25lZCBjaCxpbnQgYXR0cixpbnQgY291bnQpCnsKICAgIHVuc2lnbmVkIFhSLCBZUjsKICAgIGNoYXIqZGF0OwoKICAgIFZHQV9HZXRBbHBoYU1vZGUoJlhSLCAmWVIpOwogICAgZGF0ID0gVkdBX0FscGhhQnVmZmVyKCkgKyAoKFhSKlkgKyBYKSAqIDIpOwogICAgLyogRklYTUU6IGFsc28gY2FsbCBXcml0ZUNvbnNvbGVPdXRwdXRBLCBmb3IgYmV0dGVyIHJlc3BvbnNpdmVuZXNzICovCiAgICB3aGlsZSAoY291bnQtLSkgewogICAgICAgICpkYXQrKyA9IGNoOwogICAgICAgIGlmIChhdHRyPj0wKSAqZGF0ID0gYXR0cjsKICAgICAgICBkYXQrKzsKICAgIH0KfQoKLyoqKiBDT05UUk9MICoqKi8KCnZvaWQgQ0FMTEJBQ0sgVkdBX1BvbGwoIFVMT05HX1BUUiBhcmcgKQp7CiAgICBjaGFyICpkYXQ7CiAgICB1bnNpZ25lZCBpbnQgUGl0Y2gsSGVpZ2h0LFdpZHRoLFksWDsKICAgIGNoYXIgKnN1cmY7CgogICAgaWYgKCFJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCZ2Z2FfcG9sbGluZywgMSkpIHsKICAgICAgICAvKiBGSVhNRTogb3B0aW1pemUgYnkgZG9pbmcgdGhpcyBvbmx5IGlmIHRoZSBkYXRhIGhhcyBhY3R1YWxseSBjaGFuZ2VkCiAgICAgICAgICogICAgICAgIChpbiBhIHdheSBzaW1pbGFyIHRvIERJQlNlY3Rpb24sIHBlcmhhcHMpICovCiAgICAgICAgaWYgKGxwZGRyYXcpIHsKICAgICAgICAgIC8qIGdyYXBoaWNzIG1vZGUgKi8KICAgICAgICAgIHN1cmYgPSBWR0FfTG9jaygmUGl0Y2gsJkhlaWdodCwmV2lkdGgsTlVMTCk7CiAgICAgICAgICBpZiAoIXN1cmYpIHJldHVybjsKICAgICAgICAgIGRhdCA9IERPU01FTV9NYXBEb3NUb0xpbmVhcigweGEwMDAwKTsKICAgICAgICAgIC8qIGNvcHkgZnJvbSB2aXJ0dWFsIFZHQSBmcmFtZSBidWZmZXIgdG8gRGlyZWN0RHJhdyBzdXJmYWNlICovCiAgICAgICAgICBmb3IgKFk9MDsgWTxIZWlnaHQ7IFkrKyxzdXJmKz1QaXRjaCxkYXQrPVdpZHRoKSB7CiAgICAgICAgICAgICAgbWVtY3B5KHN1cmYsZGF0LFdpZHRoKTsKICAgICAgICAgICAgICAvKmZvciAoWD0wOyBYPFdpZHRoOyBYKyspIGlmIChkYXRbWF0pIFRSQUNFKGRkcmF3LCJkYXRhKCVkKSBhdCAoJWQsJWQpXG4iLGRhdFtYXSxYLFkpOyovCiAgICAgICAgICB9CiAgICAgICAgICBWR0FfVW5sb2NrKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8qIHRleHQgbW9kZSAqLwogICAgICAgICAgQ0hBUl9JTkZPIGNoWzgwXTsKICAgICAgICAgIENPT1JEIHNpeiwgb2ZmOwogICAgICAgICAgU01BTExfUkVDVCBkZXN0OwogICAgICAgICAgSEFORExFIGNvbiA9IFZHQV9BbHBoYUNvbnNvbGUoKTsKCiAgICAgICAgICBWR0FfR2V0QWxwaGFNb2RlKCZXaWR0aCwmSGVpZ2h0KTsKICAgICAgICAgIGRhdCA9IFZHQV9BbHBoYUJ1ZmZlcigpOwogICAgICAgICAgc2l6LlggPSA4MDsgc2l6LlkgPSAxOwogICAgICAgICAgb2ZmLlggPSAwOyBvZmYuWSA9IDA7CiAgICAgICAgICAvKiBjb3B5IGZyb20gdmlydHVhbCBWR0EgZnJhbWUgYnVmZmVyIHRvIGNvbnNvbGUgKi8KICAgICAgICAgIGZvciAoWT0wOyBZPEhlaWdodDsgWSsrKSB7CiAgICAgICAgICAgICAgZGVzdC5Ub3A9WTsgZGVzdC5Cb3R0b209WTsKICAgICAgICAgICAgICBmb3IgKFg9MDsgWDxXaWR0aDsgWCsrKSB7CiAgICAgICAgICAgICAgICAgIGNoW1hdLkNoYXIuQXNjaWlDaGFyID0gKmRhdCsrOwoJCSAgLyogV3JpdGVDb25zb2xlT3V0cHV0QSBkb2Vzbid0IGxpa2UgImRlYWQiIGNoYXJzICovCgkJICBpZiAoY2hbWF0uQ2hhci5Bc2NpaUNoYXIgPT0gJ1wwJykKCQkgICAgICBjaFtYXS5DaGFyLkFzY2lpQ2hhciA9ICcgJzsKICAgICAgICAgICAgICAgICAgY2hbWF0uQXR0cmlidXRlcyA9ICpkYXQrKzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZGVzdC5MZWZ0PTA7IGRlc3QuUmlnaHQ9V2lkdGgrMTsKICAgICAgICAgICAgICBXcml0ZUNvbnNvbGVPdXRwdXRBKGNvbiwgY2gsIHNpeiwgb2ZmLCAmZGVzdCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZnYV9yZWZyZXNoPTE7CiAgICB9CiAgICBJbnRlcmxvY2tlZERlY3JlbWVudCgmdmdhX3BvbGxpbmcpOwp9CgpzdGF0aWMgQllURSBwYWxyZWcscGFsY250OwpzdGF0aWMgUEFMRVRURUVOVFJZIHBhbGRhdDsKCnZvaWQgVkdBX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwgKQp7CiAgICBzd2l0Y2ggKHBvcnQpIHsKICAgICAgICBjYXNlIDB4M2M4OgogICAgICAgICAgICBwYWxyZWc9dmFsOyBwYWxjbnQ9MDsgYnJlYWs7CiAgICAgICAgY2FzZSAweDNjOToKICAgICAgICAgICAgKChCWVRFKikmcGFsZGF0KVtwYWxjbnQrK109dmFsIDw8IDI7CiAgICAgICAgICAgIGlmIChwYWxjbnQ9PTMpIHsKICAgICAgICAgICAgICAgIFZHQV9TZXRQYWxldHRlKCZwYWxkYXQscGFscmVnKyssMSk7CiAgICAgICAgICAgICAgICBwYWxjbnQ9MDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgIH0KfQoKQllURSBWR0FfaW9wb3J0X2luKCBXT1JEIHBvcnQgKQp7CiAgICBCWVRFIHJldDsKCiAgICBzd2l0Y2ggKHBvcnQpIHsKICAgICAgICBjYXNlIDB4M2RhOgogICAgICAgICAgICAvKiBzaW5jZSB3ZSBkb24ndCAoeWV0Pykgc2VydmUgRE9TIFZNIHJlcXVlc3RzIHdoaWxlIFZHQV9Qb2xsIGlzIHJ1bm5pbmcsCiAgICAgICAgICAgICAgIHdlIG5lZWQgdG8gZmFrZSB0aGUgb2NjdXJyZW5jZSBvZiB0aGUgdmVydGljYWwgcmVmcmVzaCAqLwogICAgICAgICAgICByZXQ9dmdhX3JlZnJlc2g/MHgwMDoweDA4OwogICAgICAgICAgICB2Z2FfcmVmcmVzaD0wOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXQ9MHhmZjsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCnZvaWQgVkdBX0NsZWFuKHZvaWQpCnsKICAgIFZHQV9FeGl0KCk7CiAgICBWR0FfRGVpbnN0YWxsVGltZXIoKTsKfQo=