LyoKICogUlBDIG1lc3NhZ2VzCiAqCiAqIENvcHlyaWdodCAyMDAxLTIwMDIgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICogQ29weXJpZ2h0IDIwMDQgRmlsaXAgTmF2YXJhCiAqIENvcHlyaWdodCAyMDA2IENvZGVXZWF2ZXJzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKCiNpbmNsdWRlICJycGMuaCIKI2luY2x1ZGUgInJwY25kci5oIgojaW5jbHVkZSAicnBjZGNlcC5oIgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNpbmNsdWRlICJycGNfYmluZGluZy5oIgojaW5jbHVkZSAicnBjX21pc2MuaCIKI2luY2x1ZGUgInJwY19kZWZzLmgiCiNpbmNsdWRlICJycGNfbWVzc2FnZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwocnBjKTsKCi8qIG5vdGU6IHRoZSBEQ0UvUlBDIHNwZWMgc2F5cyB0aGUgYWxpZ25tZW50IGFtb3VudCBzaG91bGQgYmUgNCwgYnV0CiAqIE1TL1JQQyBzZXJ2ZXJzIHNlZW0gdG8gYWx3YXlzIHVzZSAxNiAqLwojZGVmaW5lIEFVVEhfQUxJR05NRU5UIDE2CgovKiBnZXRzIHRoZSBhbW91bnQgbmVlZGVkIHRvIHJvdW5kIGEgdmFsdWUgdXAgdG8gdGhlIHNwZWNpZmllZCBhbGlnbm1lbnQgKi8KI2RlZmluZSBST1VORF9VUF9BTU9VTlQodmFsdWUsIGFsaWdubWVudCkgXAogICAgKCgoYWxpZ25tZW50KSAtICgoKHZhbHVlKSAlIChhbGlnbm1lbnQpKSkpICUgKGFsaWdubWVudCkpCiNkZWZpbmUgUk9VTkRfVVAodmFsdWUsIGFsaWdubWVudCkgKCgodmFsdWUpICsgKChhbGlnbm1lbnQpIC0gMSkpICYgfigoYWxpZ25tZW50KS0xKSkKCmVudW0gc2VjdXJlX3BhY2tldF9kaXJlY3Rpb24KewogIFNFQ1VSRV9QQUNLRVRfU0VORCwKICBTRUNVUkVfUEFDS0VUX1JFQ0VJVkUKfTsKCnN0YXRpYyBSUENfU1RBVFVTIElfUnBjUmVBbGxvY2F0ZUJ1ZmZlcihQUlBDX01FU1NBR0UgcE1zZyk7CgpzdGF0aWMgRFdPUkQgUlBDUlQ0X0dldEhlYWRlclNpemUoUnBjUGt0SGRyICpIZWFkZXIpCnsKICBzdGF0aWMgY29uc3QgRFdPUkQgaGVhZGVyX3NpemVzW10gPSB7CiAgICBzaXplb2YoSGVhZGVyLT5yZXF1ZXN0KSwgMCwgc2l6ZW9mKEhlYWRlci0+cmVzcG9uc2UpLAogICAgc2l6ZW9mKEhlYWRlci0+ZmF1bHQpLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBzaXplb2YoSGVhZGVyLT5iaW5kKSwKICAgIHNpemVvZihIZWFkZXItPmJpbmRfYWNrKSwgc2l6ZW9mKEhlYWRlci0+YmluZF9uYWNrKSwKICAgIDAsIDAsIDAsIDAsIDAKICB9OwogIFVMT05HIHJldCA9IDA7CiAgCiAgaWYgKEhlYWRlci0+Y29tbW9uLnB0eXBlIDwgc2l6ZW9mKGhlYWRlcl9zaXplcykgLyBzaXplb2YoaGVhZGVyX3NpemVzWzBdKSkgewogICAgcmV0ID0gaGVhZGVyX3NpemVzW0hlYWRlci0+Y29tbW9uLnB0eXBlXTsKICAgIGlmIChyZXQgPT0gMCkKICAgICAgRklYTUUoInVuaGFuZGxlZCBwYWNrZXQgdHlwZVxuIik7CiAgICBpZiAoSGVhZGVyLT5jb21tb24uZmxhZ3MgJiBSUENfRkxHX09CSkVDVF9VVUlEKQogICAgICByZXQgKz0gc2l6ZW9mKFVVSUQpOwogIH0gZWxzZSB7CiAgICBUUkFDRSgiaW52YWxpZCBwYWNrZXQgdHlwZVxuIik7CiAgfQoKICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IHBhY2tldF9oYXNfYm9keShScGNQa3RIZHIgKkhlYWRlcikKewogICAgcmV0dXJuIChIZWFkZXItPmNvbW1vbi5wdHlwZSA9PSBQS1RfRkFVTFQpIHx8CiAgICAgICAgICAgKEhlYWRlci0+Y29tbW9uLnB0eXBlID09IFBLVF9SRVFVRVNUKSB8fAogICAgICAgICAgIChIZWFkZXItPmNvbW1vbi5wdHlwZSA9PSBQS1RfUkVTUE9OU0UpOwp9CgpzdGF0aWMgaW50IHBhY2tldF9oYXNfYXV0aF92ZXJpZmllcihScGNQa3RIZHIgKkhlYWRlcikKewogICAgcmV0dXJuICEoSGVhZGVyLT5jb21tb24ucHR5cGUgPT0gUEtUX0JJTkRfTkFDSykgJiYKICAgICAgICAgICAhKEhlYWRlci0+Y29tbW9uLnB0eXBlID09IFBLVF9TSFVURE9XTik7Cn0KCnN0YXRpYyBWT0lEIFJQQ1JUNF9CdWlsZENvbW1vbkhlYWRlcihScGNQa3RIZHIgKkhlYWRlciwgdW5zaWduZWQgY2hhciBQYWNrZXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIERhdGFSZXByZXNlbnRhdGlvbikKewogIEhlYWRlci0+Y29tbW9uLnJwY192ZXIgPSBSUENfVkVSX01BSk9SOwogIEhlYWRlci0+Y29tbW9uLnJwY192ZXJfbWlub3IgPSBSUENfVkVSX01JTk9SOwogIEhlYWRlci0+Y29tbW9uLnB0eXBlID0gUGFja2V0VHlwZTsKICBIZWFkZXItPmNvbW1vbi5kcmVwWzBdID0gTE9CWVRFKExPV09SRChEYXRhUmVwcmVzZW50YXRpb24pKTsKICBIZWFkZXItPmNvbW1vbi5kcmVwWzFdID0gSElCWVRFKExPV09SRChEYXRhUmVwcmVzZW50YXRpb24pKTsKICBIZWFkZXItPmNvbW1vbi5kcmVwWzJdID0gTE9CWVRFKEhJV09SRChEYXRhUmVwcmVzZW50YXRpb24pKTsKICBIZWFkZXItPmNvbW1vbi5kcmVwWzNdID0gSElCWVRFKEhJV09SRChEYXRhUmVwcmVzZW50YXRpb24pKTsKICBIZWFkZXItPmNvbW1vbi5hdXRoX2xlbiA9IDA7CiAgSGVhZGVyLT5jb21tb24uY2FsbF9pZCA9IDE7CiAgSGVhZGVyLT5jb21tb24uZmxhZ3MgPSAwOwogIC8qIEZsYWdzIGFuZCBmcmFnbWVudCBsZW5ndGggYXJlIGNvbXB1dGVkIGluIFJQQ1JUNF9TZW5kLiAqLwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgpzdGF0aWMgUnBjUGt0SGRyICpSUENSVDRfQnVpbGRSZXF1ZXN0SGVhZGVyKHVuc2lnbmVkIGxvbmcgRGF0YVJlcHJlc2VudGF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBCdWZmZXJMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBQcm9jTnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVVJRCAqT2JqZWN0VXVpZCkKewogIFJwY1BrdEhkciAqaGVhZGVyOwogIEJPT0wgaGFzX29iamVjdDsKICBSUENfU1RBVFVTIHN0YXR1czsKCiAgaGFzX29iamVjdCA9IChPYmplY3RVdWlkICE9IE5VTEwgJiYgIVV1aWRJc05pbChPYmplY3RVdWlkLCAmc3RhdHVzKSk7CiAgaGVhZGVyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCiAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoZWFkZXItPnJlcXVlc3QpICsgKGhhc19vYmplY3QgPyBzaXplb2YoVVVJRCkgOiAwKSk7CiAgaWYgKGhlYWRlciA9PSBOVUxMKSB7CiAgICByZXR1cm4gTlVMTDsKICB9CgogIFJQQ1JUNF9CdWlsZENvbW1vbkhlYWRlcihoZWFkZXIsIFBLVF9SRVFVRVNULCBEYXRhUmVwcmVzZW50YXRpb24pOwogIGhlYWRlci0+Y29tbW9uLmZyYWdfbGVuID0gc2l6ZW9mKGhlYWRlci0+cmVxdWVzdCk7CiAgaGVhZGVyLT5yZXF1ZXN0LmFsbG9jX2hpbnQgPSBCdWZmZXJMZW5ndGg7CiAgaGVhZGVyLT5yZXF1ZXN0LmNvbnRleHRfaWQgPSAwOwogIGhlYWRlci0+cmVxdWVzdC5vcG51bSA9IFByb2NOdW07CiAgaWYgKGhhc19vYmplY3QpIHsKICAgIGhlYWRlci0+Y29tbW9uLmZsYWdzIHw9IFJQQ19GTEdfT0JKRUNUX1VVSUQ7CiAgICBoZWFkZXItPmNvbW1vbi5mcmFnX2xlbiArPSBzaXplb2YoVVVJRCk7CiAgICBtZW1jcHkoJmhlYWRlci0+cmVxdWVzdCArIDEsIE9iamVjdFV1aWQsIHNpemVvZihVVUlEKSk7CiAgfQoKICByZXR1cm4gaGVhZGVyOwp9CgpzdGF0aWMgUnBjUGt0SGRyICpSUENSVDRfQnVpbGRSZXNwb25zZUhlYWRlcih1bnNpZ25lZCBsb25nIERhdGFSZXByZXNlbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIEJ1ZmZlckxlbmd0aCkKewogIFJwY1BrdEhkciAqaGVhZGVyOwoKICBoZWFkZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKGhlYWRlci0+cmVzcG9uc2UpKTsKICBpZiAoaGVhZGVyID09IE5VTEwpIHsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgUlBDUlQ0X0J1aWxkQ29tbW9uSGVhZGVyKGhlYWRlciwgUEtUX1JFU1BPTlNFLCBEYXRhUmVwcmVzZW50YXRpb24pOwogIGhlYWRlci0+Y29tbW9uLmZyYWdfbGVuID0gc2l6ZW9mKGhlYWRlci0+cmVzcG9uc2UpOwogIGhlYWRlci0+cmVzcG9uc2UuYWxsb2NfaGludCA9IEJ1ZmZlckxlbmd0aDsKCiAgcmV0dXJuIGhlYWRlcjsKfQoKUnBjUGt0SGRyICpSUENSVDRfQnVpbGRGYXVsdEhlYWRlcih1bnNpZ25lZCBsb25nIERhdGFSZXByZXNlbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUENfU1RBVFVTIFN0YXR1cykKewogIFJwY1BrdEhkciAqaGVhZGVyOwoKICBoZWFkZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKGhlYWRlci0+ZmF1bHQpKTsKICBpZiAoaGVhZGVyID09IE5VTEwpIHsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgUlBDUlQ0X0J1aWxkQ29tbW9uSGVhZGVyKGhlYWRlciwgUEtUX0ZBVUxULCBEYXRhUmVwcmVzZW50YXRpb24pOwogIGhlYWRlci0+Y29tbW9uLmZyYWdfbGVuID0gc2l6ZW9mKGhlYWRlci0+ZmF1bHQpOwogIGhlYWRlci0+ZmF1bHQuc3RhdHVzID0gU3RhdHVzOwoKICByZXR1cm4gaGVhZGVyOwp9CgpScGNQa3RIZHIgKlJQQ1JUNF9CdWlsZEJpbmRIZWFkZXIodW5zaWduZWQgbG9uZyBEYXRhUmVwcmVzZW50YXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBNYXhUcmFuc21pc3Npb25TaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgTWF4UmVjZWl2ZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUENfU1lOVEFYX0lERU5USUZJRVIgKkFic3RyYWN0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUENfU1lOVEFYX0lERU5USUZJRVIgKlRyYW5zZmVySWQpCnsKICBScGNQa3RIZHIgKmhlYWRlcjsKCiAgaGVhZGVyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihoZWFkZXItPmJpbmQpKTsKICBpZiAoaGVhZGVyID09IE5VTEwpIHsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgUlBDUlQ0X0J1aWxkQ29tbW9uSGVhZGVyKGhlYWRlciwgUEtUX0JJTkQsIERhdGFSZXByZXNlbnRhdGlvbik7CiAgaGVhZGVyLT5jb21tb24uZnJhZ19sZW4gPSBzaXplb2YoaGVhZGVyLT5iaW5kKTsKICBoZWFkZXItPmJpbmQubWF4X3RzaXplID0gTWF4VHJhbnNtaXNzaW9uU2l6ZTsKICBoZWFkZXItPmJpbmQubWF4X3JzaXplID0gTWF4UmVjZWl2ZVNpemU7CiAgaGVhZGVyLT5iaW5kLm51bV9lbGVtZW50cyA9IDE7CiAgaGVhZGVyLT5iaW5kLm51bV9zeW50YXhlcyA9IDE7CiAgbWVtY3B5KCZoZWFkZXItPmJpbmQuYWJzdHJhY3QsIEFic3RyYWN0SWQsIHNpemVvZihSUENfU1lOVEFYX0lERU5USUZJRVIpKTsKICBtZW1jcHkoJmhlYWRlci0+YmluZC50cmFuc2ZlciwgVHJhbnNmZXJJZCwgc2l6ZW9mKFJQQ19TWU5UQVhfSURFTlRJRklFUikpOwoKICByZXR1cm4gaGVhZGVyOwp9CgpzdGF0aWMgUnBjUGt0SGRyICpSUENSVDRfQnVpbGRBdXRoSGVhZGVyKHVuc2lnbmVkIGxvbmcgRGF0YVJlcHJlc2VudGF0aW9uKQp7CiAgUnBjUGt0SGRyICpoZWFkZXI7CgogIGhlYWRlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAogICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGVhZGVyLT5jb21tb24pICsgMTIpOwogIGlmIChoZWFkZXIgPT0gTlVMTCkKICAgIHJldHVybiBOVUxMOwoKICBSUENSVDRfQnVpbGRDb21tb25IZWFkZXIoaGVhZGVyLCBQS1RfQVVUSDMsIERhdGFSZXByZXNlbnRhdGlvbik7CiAgaGVhZGVyLT5jb21tb24uZnJhZ19sZW4gPSAweDE0OwogIGhlYWRlci0+Y29tbW9uLmF1dGhfbGVuID0gMDsKCiAgcmV0dXJuIGhlYWRlcjsKfQoKUnBjUGt0SGRyICpSUENSVDRfQnVpbGRCaW5kTmFja0hlYWRlcih1bnNpZ25lZCBsb25nIERhdGFSZXByZXNlbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFJwY1ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBScGNWZXJzaW9uTWlub3IpCnsKICBScGNQa3RIZHIgKmhlYWRlcjsKCiAgaGVhZGVyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihoZWFkZXItPmJpbmRfbmFjaykpOwogIGlmIChoZWFkZXIgPT0gTlVMTCkgewogICAgcmV0dXJuIE5VTEw7CiAgfQoKICBSUENSVDRfQnVpbGRDb21tb25IZWFkZXIoaGVhZGVyLCBQS1RfQklORF9OQUNLLCBEYXRhUmVwcmVzZW50YXRpb24pOwogIGhlYWRlci0+Y29tbW9uLmZyYWdfbGVuID0gc2l6ZW9mKGhlYWRlci0+YmluZF9uYWNrKTsKICBoZWFkZXItPmJpbmRfbmFjay5wcm90b2NvbHNfY291bnQgPSAxOwogIGhlYWRlci0+YmluZF9uYWNrLnByb3RvY29sc1swXS5ycGNfdmVyID0gUnBjVmVyc2lvbjsKICBoZWFkZXItPmJpbmRfbmFjay5wcm90b2NvbHNbMF0ucnBjX3Zlcl9taW5vciA9IFJwY1ZlcnNpb25NaW5vcjsKCiAgcmV0dXJuIGhlYWRlcjsKfQoKUnBjUGt0SGRyICpSUENSVDRfQnVpbGRCaW5kQWNrSGVhZGVyKHVuc2lnbmVkIGxvbmcgRGF0YVJlcHJlc2VudGF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgTWF4VHJhbnNtaXNzaW9uU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IE1heFJlY2VpdmVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgU2VydmVyQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgUmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBSZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUENfU1lOVEFYX0lERU5USUZJRVIgKlRyYW5zZmVySWQpCnsKICBScGNQa3RIZHIgKmhlYWRlcjsKICB1bnNpZ25lZCBsb25nIGhlYWRlcl9zaXplOwogIFJwY0FkZHJlc3NTdHJpbmcgKnNlcnZlcl9hZGRyZXNzOwogIFJwY1Jlc3VsdHMgKnJlc3VsdHM7CiAgUlBDX1NZTlRBWF9JREVOVElGSUVSICp0cmFuc2Zlcl9pZDsKCiAgaGVhZGVyX3NpemUgPSBzaXplb2YoaGVhZGVyLT5iaW5kX2FjaykgKwogICAgICAgICAgICAgICAgUk9VTkRfVVAoRklFTERfT0ZGU0VUKFJwY0FkZHJlc3NTdHJpbmcsIHN0cmluZ1tzdHJsZW4oU2VydmVyQWRkcmVzcykgKyAxXSksIDQpICsKICAgICAgICAgICAgICAgIHNpemVvZihScGNSZXN1bHRzKSArCiAgICAgICAgICAgICAgICBzaXplb2YoUlBDX1NZTlRBWF9JREVOVElGSUVSKTsKCiAgaGVhZGVyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIGhlYWRlcl9zaXplKTsKICBpZiAoaGVhZGVyID09IE5VTEwpIHsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgUlBDUlQ0X0J1aWxkQ29tbW9uSGVhZGVyKGhlYWRlciwgUEtUX0JJTkRfQUNLLCBEYXRhUmVwcmVzZW50YXRpb24pOwogIGhlYWRlci0+Y29tbW9uLmZyYWdfbGVuID0gaGVhZGVyX3NpemU7CiAgaGVhZGVyLT5iaW5kX2Fjay5tYXhfdHNpemUgPSBNYXhUcmFuc21pc3Npb25TaXplOwogIGhlYWRlci0+YmluZF9hY2subWF4X3JzaXplID0gTWF4UmVjZWl2ZVNpemU7CiAgc2VydmVyX2FkZHJlc3MgPSAoUnBjQWRkcmVzc1N0cmluZyopKCZoZWFkZXItPmJpbmRfYWNrICsgMSk7CiAgc2VydmVyX2FkZHJlc3MtPmxlbmd0aCA9IHN0cmxlbihTZXJ2ZXJBZGRyZXNzKSArIDE7CiAgc3RyY3B5KHNlcnZlcl9hZGRyZXNzLT5zdHJpbmcsIFNlcnZlckFkZHJlc3MpOwogIC8qIHJlc3VsdHMgaXMgNC1ieXRlIGFsaWduZWQgKi8KICByZXN1bHRzID0gKFJwY1Jlc3VsdHMqKSgoVUxPTkdfUFRSKXNlcnZlcl9hZGRyZXNzICsgUk9VTkRfVVAoRklFTERfT0ZGU0VUKFJwY0FkZHJlc3NTdHJpbmcsIHN0cmluZ1tzZXJ2ZXJfYWRkcmVzcy0+bGVuZ3RoXSksIDQpKTsKICByZXN1bHRzLT5udW1fcmVzdWx0cyA9IDE7CiAgcmVzdWx0cy0+cmVzdWx0c1swXS5yZXN1bHQgPSBSZXN1bHQ7CiAgcmVzdWx0cy0+cmVzdWx0c1swXS5yZWFzb24gPSBSZWFzb247CiAgdHJhbnNmZXJfaWQgPSAoUlBDX1NZTlRBWF9JREVOVElGSUVSKikocmVzdWx0cyArIDEpOwogIG1lbWNweSh0cmFuc2Zlcl9pZCwgVHJhbnNmZXJJZCwgc2l6ZW9mKFJQQ19TWU5UQVhfSURFTlRJRklFUikpOwoKICByZXR1cm4gaGVhZGVyOwp9CgpWT0lEIFJQQ1JUNF9GcmVlSGVhZGVyKFJwY1BrdEhkciAqSGVhZGVyKQp7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgSGVhZGVyKTsKfQoKc3RhdGljIFJQQ19TVEFUVVMgUlBDUlQ0X1NlY3VyZVBhY2tldChScGNDb25uZWN0aW9uICpDb25uZWN0aW9uLAogICAgZW51bSBzZWN1cmVfcGFja2V0X2RpcmVjdGlvbiBkaXIsCiAgICBScGNQa3RIZHIgKmhkciwgdW5zaWduZWQgaW50IGhkcl9zaXplLAogICAgdW5zaWduZWQgY2hhciAqc3R1Yl9kYXRhLCB1bnNpZ25lZCBpbnQgc3R1Yl9kYXRhX3NpemUsCiAgICBScGNBdXRoVmVyaWZpZXIgKmF1dGhfaGRyLAogICAgdW5zaWduZWQgY2hhciAqYXV0aF92YWx1ZSwgdW5zaWduZWQgaW50IGF1dGhfdmFsdWVfc2l6ZSkKewogICAgU2VjQnVmZmVyRGVzYyBtZXNzYWdlOwogICAgU2VjQnVmZmVyIGJ1ZmZlcnNbNF07CiAgICBTRUNVUklUWV9TVEFUVVMgc2VjX3N0YXR1czsKCiAgICBtZXNzYWdlLnVsVmVyc2lvbiA9IFNFQ0JVRkZFUl9WRVJTSU9OOwogICAgbWVzc2FnZS5jQnVmZmVycyA9IHNpemVvZihidWZmZXJzKS9zaXplb2YoYnVmZmVyc1swXSk7CiAgICBtZXNzYWdlLnBCdWZmZXJzID0gYnVmZmVyczsKCiAgICBidWZmZXJzWzBdLmNiQnVmZmVyID0gaGRyX3NpemU7CiAgICBidWZmZXJzWzBdLkJ1ZmZlclR5cGUgPSBTRUNCVUZGRVJfREFUQXxTRUNCVUZGRVJfUkVBRE9OTFlfV0lUSF9DSEVDS1NVTTsKICAgIGJ1ZmZlcnNbMF0ucHZCdWZmZXIgPSBoZHI7CiAgICBidWZmZXJzWzFdLmNiQnVmZmVyID0gc3R1Yl9kYXRhX3NpemU7CiAgICBidWZmZXJzWzFdLkJ1ZmZlclR5cGUgPSBTRUNCVUZGRVJfREFUQTsKICAgIGJ1ZmZlcnNbMV0ucHZCdWZmZXIgPSBzdHViX2RhdGE7CiAgICBidWZmZXJzWzJdLmNiQnVmZmVyID0gc2l6ZW9mKCphdXRoX2hkcik7CiAgICBidWZmZXJzWzJdLkJ1ZmZlclR5cGUgPSBTRUNCVUZGRVJfREFUQXxTRUNCVUZGRVJfUkVBRE9OTFlfV0lUSF9DSEVDS1NVTTsKICAgIGJ1ZmZlcnNbMl0ucHZCdWZmZXIgPSBhdXRoX2hkcjsKICAgIGJ1ZmZlcnNbM10uY2JCdWZmZXIgPSBhdXRoX3ZhbHVlX3NpemU7CiAgICBidWZmZXJzWzNdLkJ1ZmZlclR5cGUgPSBTRUNCVUZGRVJfVE9LRU47CiAgICBidWZmZXJzWzNdLnB2QnVmZmVyID0gYXV0aF92YWx1ZTsKCiAgICBpZiAoZGlyID09IFNFQ1VSRV9QQUNLRVRfU0VORCkKICAgIHsKICAgICAgICBpZiAoKGF1dGhfaGRyLT5hdXRoX2xldmVsID09IFJQQ19DX0FVVEhOX0xFVkVMX1BLVF9QUklWQUNZKSAmJiBwYWNrZXRfaGFzX2JvZHkoaGRyKSkKICAgICAgICB7CiAgICAgICAgICAgIHNlY19zdGF0dXMgPSBFbmNyeXB0TWVzc2FnZSgmQ29ubmVjdGlvbi0+Y3R4LCAwLCAmbWVzc2FnZSwgMCAvKiBGSVhNRSAqLyk7CiAgICAgICAgICAgIGlmIChzZWNfc3RhdHVzICE9IFNFQ19FX09LKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlIoIkVuY3J5cHRNZXNzYWdlIGZhaWxlZCB3aXRoIDB4JTA4eFxuIiwgc2VjX3N0YXR1cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gUlBDX1NfU0VDX1BLR19FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhdXRoX2hkci0+YXV0aF9sZXZlbCAhPSBSUENfQ19BVVRITl9MRVZFTF9OT05FKQogICAgICAgIHsKICAgICAgICAgICAgc2VjX3N0YXR1cyA9IE1ha2VTaWduYXR1cmUoJkNvbm5lY3Rpb24tPmN0eCwgMCwgJm1lc3NhZ2UsIDAgLyogRklYTUUgKi8pOwogICAgICAgICAgICBpZiAoc2VjX3N0YXR1cyAhPSBTRUNfRV9PSykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCJNYWtlU2lnbmF0dXJlIGZhaWxlZCB3aXRoIDB4JTA4eFxuIiwgc2VjX3N0YXR1cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gUlBDX1NfU0VDX1BLR19FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGRpciA9PSBTRUNVUkVfUEFDS0VUX1JFQ0VJVkUpCiAgICB7CiAgICAgICAgaWYgKChhdXRoX2hkci0+YXV0aF9sZXZlbCA9PSBSUENfQ19BVVRITl9MRVZFTF9QS1RfUFJJVkFDWSkgJiYgcGFja2V0X2hhc19ib2R5KGhkcikpCiAgICAgICAgewogICAgICAgICAgICBzZWNfc3RhdHVzID0gRGVjcnlwdE1lc3NhZ2UoJkNvbm5lY3Rpb24tPmN0eCwgJm1lc3NhZ2UsIDAgLyogRklYTUUgKi8sIDApOwogICAgICAgICAgICBpZiAoc2VjX3N0YXR1cyAhPSBTRUNfRV9PSykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCJFbmNyeXB0TWVzc2FnZSBmYWlsZWQgd2l0aCAweCUwOHhcbiIsIHNlY19zdGF0dXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIFJQQ19TX1NFQ19QS0dfRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYXV0aF9oZHItPmF1dGhfbGV2ZWwgIT0gUlBDX0NfQVVUSE5fTEVWRUxfTk9ORSkKICAgICAgICB7CiAgICAgICAgICAgIHNlY19zdGF0dXMgPSBWZXJpZnlTaWduYXR1cmUoJkNvbm5lY3Rpb24tPmN0eCwgJm1lc3NhZ2UsIDAgLyogRklYTUUgKi8sIE5VTEwpOwogICAgICAgICAgICBpZiAoc2VjX3N0YXR1cyAhPSBTRUNfRV9PSykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCJWZXJpZnlTaWduYXR1cmUgZmFpbGVkIHdpdGggMHglMDh4XG4iLCBzZWNfc3RhdHVzKTsKICAgICAgICAgICAgICAgIHJldHVybiBSUENfU19TRUNfUEtHX0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBSUENfU19PSzsKfQogICAgICAgICAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBSUENSVDRfU2VuZEF1dGggKGludGVybmFsKQogKiAKICogVHJhbnNtaXQgYSBwYWNrZXQgd2l0aCBhdXRob3JpemF0aW9uIGRhdGEgb3ZlciBjb25uZWN0aW9uIGluIGFjY2VwdGFibGUgZnJhZ21lbnRzLgogKi8Kc3RhdGljIFJQQ19TVEFUVVMgUlBDUlQ0X1NlbmRBdXRoKFJwY0Nvbm5lY3Rpb24gKkNvbm5lY3Rpb24sIFJwY1BrdEhkciAqSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQnVmZmVyLCB1bnNpZ25lZCBpbnQgQnVmZmVyTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQXV0aCwgdW5zaWduZWQgaW50IEF1dGhMZW5ndGgpCnsKICBQVUNIQVIgYnVmZmVyX3BvczsKICBEV09SRCBoZHJfc2l6ZTsKICBMT05HIGNvdW50OwogIHVuc2lnbmVkIGNoYXIgKnBrdDsKICBMT05HIGFsZW47CiAgUlBDX1NUQVRVUyBzdGF0dXM7CgogIGJ1ZmZlcl9wb3MgPSBCdWZmZXI7CiAgLyogVGhlIHBhY2tldCBidWlsZGluZyBmdW5jdGlvbnMgc2F2ZSB0aGUgcGFja2V0IGhlYWRlciBzaXplLCBzbyB3ZSBjYW4gdXNlIGl0LiAqLwogIGhkcl9zaXplID0gSGVhZGVyLT5jb21tb24uZnJhZ19sZW47CiAgaWYgKEF1dGhMZW5ndGgpCiAgICBIZWFkZXItPmNvbW1vbi5hdXRoX2xlbiA9IEF1dGhMZW5ndGg7CiAgZWxzZSBpZiAoQ29ubmVjdGlvbi0+QXV0aEluZm8gJiYgcGFja2V0X2hhc19hdXRoX3ZlcmlmaWVyKEhlYWRlcikpCiAgICBIZWFkZXItPmNvbW1vbi5hdXRoX2xlbiA9IDE2IC8qIEZJWE1FICovOwogIGVsc2UKICAgIEhlYWRlci0+Y29tbW9uLmF1dGhfbGVuID0gMDsKICBIZWFkZXItPmNvbW1vbi5mbGFncyB8PSBSUENfRkxHX0ZJUlNUOwogIEhlYWRlci0+Y29tbW9uLmZsYWdzICY9IH5SUENfRkxHX0xBU1Q7CgogIGFsZW4gPSBSUENfQVVUSF9WRVJJRklFUl9MRU4oJkhlYWRlci0+Y29tbW9uKTsKCiAgd2hpbGUgKCEoSGVhZGVyLT5jb21tb24uZmxhZ3MgJiBSUENfRkxHX0xBU1QpKSB7CiAgICB1bnNpZ25lZCBjaGFyIGF1dGhfcGFkX2xlbiA9IEhlYWRlci0+Y29tbW9uLmF1dGhfbGVuID8gUk9VTkRfVVBfQU1PVU5UKEJ1ZmZlckxlbmd0aCwgQVVUSF9BTElHTk1FTlQpIDogMDsKICAgIHVuc2lnbmVkIGludCBwa3Rfc2l6ZSA9IEJ1ZmZlckxlbmd0aCArIGhkcl9zaXplICsgYWxlbiArIGF1dGhfcGFkX2xlbjsKCiAgICAvKiBkZWNpZGUgaWYgd2UgbmVlZCB0byBzcGxpdCB0aGUgcGFja2V0IGludG8gZnJhZ21lbnRzICovCiAgIGlmIChwa3Rfc2l6ZSA8PSBDb25uZWN0aW9uLT5NYXhUcmFuc21pc3Npb25TaXplKSB7CiAgICAgSGVhZGVyLT5jb21tb24uZmxhZ3MgfD0gUlBDX0ZMR19MQVNUOwogICAgIEhlYWRlci0+Y29tbW9uLmZyYWdfbGVuID0gcGt0X3NpemU7CiAgICB9IGVsc2UgewogICAgICBhdXRoX3BhZF9sZW4gPSAwOwogICAgICAvKiBtYWtlIHN1cmUgcGFja2V0IHBheWxvYWQgd2lsbCBiZSBhIG11bHRpcGxlIG9mIDE2ICovCiAgICAgIEhlYWRlci0+Y29tbW9uLmZyYWdfbGVuID0KICAgICAgICAoKENvbm5lY3Rpb24tPk1heFRyYW5zbWlzc2lvblNpemUgLSBoZHJfc2l6ZSAtIGFsZW4pICYgfihBVVRIX0FMSUdOTUVOVC0xKSkgKwogICAgICAgIGhkcl9zaXplICsgYWxlbjsKICAgIH0KCiAgICBwa3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgSGVhZGVyLT5jb21tb24uZnJhZ19sZW4pOwoKICAgIG1lbWNweShwa3QsIEhlYWRlciwgaGRyX3NpemUpOwoKICAgIC8qIGZyYWdtZW50IGNvbnNpc3RlZCBvZiBoZWFkZXIgb25seSBhbmQgaXMgdGhlIGxhc3Qgb25lICovCiAgICBpZiAoaGRyX3NpemUgPT0gSGVhZGVyLT5jb21tb24uZnJhZ19sZW4pCiAgICAgIGdvdG8gd3JpdGU7CgogICAgbWVtY3B5KHBrdCArIGhkcl9zaXplLCBidWZmZXJfcG9zLCBIZWFkZXItPmNvbW1vbi5mcmFnX2xlbiAtIGhkcl9zaXplIC0gYXV0aF9wYWRfbGVuIC0gYWxlbik7CgogICAgLyogYWRkIHRoZSBhdXRob3JpemF0aW9uIGluZm8gKi8KICAgIGlmIChDb25uZWN0aW9uLT5BdXRoSW5mbyAmJiBwYWNrZXRfaGFzX2F1dGhfdmVyaWZpZXIoSGVhZGVyKSkKICAgIHsKICAgICAgUnBjQXV0aFZlcmlmaWVyICphdXRoX2hkciA9IChScGNBdXRoVmVyaWZpZXIgKikmcGt0W0hlYWRlci0+Y29tbW9uLmZyYWdfbGVuIC0gYWxlbl07CgogICAgICBhdXRoX2hkci0+YXV0aF90eXBlID0gQ29ubmVjdGlvbi0+QXV0aEluZm8tPkF1dGhuU3ZjOwogICAgICBhdXRoX2hkci0+YXV0aF9sZXZlbCA9IENvbm5lY3Rpb24tPkF1dGhJbmZvLT5BdXRobkxldmVsOwogICAgICBhdXRoX2hkci0+YXV0aF9wYWRfbGVuZ3RoID0gYXV0aF9wYWRfbGVuOwogICAgICBhdXRoX2hkci0+YXV0aF9yZXNlcnZlZCA9IDA7CiAgICAgIC8qIGEgdW5pcXVlIG51bWJlci4uLiAqLwogICAgICBhdXRoX2hkci0+YXV0aF9jb250ZXh0X2lkID0gKHVuc2lnbmVkIGxvbmcpQ29ubmVjdGlvbjsKCiAgICAgIGlmIChBdXRoTGVuZ3RoKQogICAgICAgIG1lbWNweShhdXRoX2hkciArIDEsIEF1dGgsIEF1dGhMZW5ndGgpOwogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBzdGF0dXMgPSBSUENSVDRfU2VjdXJlUGFja2V0KENvbm5lY3Rpb24sIFNFQ1VSRV9QQUNLRVRfU0VORCwKICAgICAgICAgICAgKFJwY1BrdEhkciAqKXBrdCwgaGRyX3NpemUsCiAgICAgICAgICAgIHBrdCArIGhkcl9zaXplLCBIZWFkZXItPmNvbW1vbi5mcmFnX2xlbiAtIGhkcl9zaXplIC0gYWxlbiwKICAgICAgICAgICAgYXV0aF9oZHIsCiAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopKGF1dGhfaGRyICsgMSksIEhlYWRlci0+Y29tbW9uLmF1dGhfbGVuKTsKICAgICAgICBpZiAoc3RhdHVzICE9IFJQQ19TX09LKQogICAgICAgIHsKICAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBrdCk7CiAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgIH0KICAgICAgfQogICAgfQoKd3JpdGU6CiAgICBjb3VudCA9IHJwY3J0NF9jb25uX3dyaXRlKENvbm5lY3Rpb24sIHBrdCwgSGVhZGVyLT5jb21tb24uZnJhZ19sZW4pOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcGt0KTsKICAgIGlmIChjb3VudDwwKSB7CiAgICAgIFdBUk4oInJwY3J0NF9jb25uX3dyaXRlIGZhaWxlZCAoYXV0aClcbiIpOwogICAgICByZXR1cm4gUlBDX1NfUFJPVE9DT0xfRVJST1I7CiAgICB9CgogICAgYnVmZmVyX3BvcyArPSBIZWFkZXItPmNvbW1vbi5mcmFnX2xlbiAtIGhkcl9zaXplIC0gYWxlbiAtIGF1dGhfcGFkX2xlbjsKICAgIEJ1ZmZlckxlbmd0aCAtPSBIZWFkZXItPmNvbW1vbi5mcmFnX2xlbiAtIGhkcl9zaXplIC0gYWxlbiAtIGF1dGhfcGFkX2xlbjsKICAgIEhlYWRlci0+Y29tbW9uLmZsYWdzICY9IH5SUENfRkxHX0ZJUlNUOwogIH0KCiAgcmV0dXJuIFJQQ19TX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFJQQ1JUNF9BdXRoTmVnb3RpYXRlIChpbnRlcm5hbCkKICovCnN0YXRpYyB2b2lkIFJQQ1JUNF9BdXRoTmVnb3RpYXRlKFJwY0Nvbm5lY3Rpb24gKmNvbm4sIFNlY0J1ZmZlciAqb3V0KQp7CiAgU0VDVVJJVFlfU1RBVFVTIHI7CiAgU2VjQnVmZmVyRGVzYyBvdXRfZGVzYzsKICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAgVUxPTkcgY29udGV4dF9yZXEgPSBJU0NfUkVRX0NPTk5FQ1RJT04gfCBJU0NfUkVRX1VTRV9EQ0VfU1RZTEUgfAogICAgICAgICAgICAgICAgICAgICAgSVNDX1JFUV9NVVRVQUxfQVVUSCB8IElTQ19SRVFfREVMRUdBVEU7CgogIGlmIChjb25uLT5BdXRoSW5mby0+QXV0aG5MZXZlbCA9PSBSUENfQ19BVVRITl9MRVZFTF9QS1RfSU5URUdSSVRZKQogICAgY29udGV4dF9yZXEgfD0gSVNDX1JFUV9JTlRFR1JJVFk7CiAgZWxzZSBpZiAoY29ubi0+QXV0aEluZm8tPkF1dGhuTGV2ZWwgPT0gUlBDX0NfQVVUSE5fTEVWRUxfUEtUX1BSSVZBQ1kpCiAgICBjb250ZXh0X3JlcSB8PSBJU0NfUkVRX0NPTkZJREVOVElBTElUWSB8IElTQ19SRVFfSU5URUdSSVRZOwoKICBidWZmZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgMHgxMDApOwoKICBvdXQtPkJ1ZmZlclR5cGUgPSBTRUNCVUZGRVJfVE9LRU47CiAgb3V0LT5jYkJ1ZmZlciA9IDB4MTAwOwogIG91dC0+cHZCdWZmZXIgPSBidWZmZXI7CgogIG91dF9kZXNjLnVsVmVyc2lvbiA9IDA7CiAgb3V0X2Rlc2MuY0J1ZmZlcnMgPSAxOwogIG91dF9kZXNjLnBCdWZmZXJzID0gb3V0OwoKICBjb25uLT5hdHRyID0gMDsKICBTZWNJbnZhbGlkYXRlSGFuZGxlKCZjb25uLT5jdHgpOwoKICByID0gSW5pdGlhbGl6ZVNlY3VyaXR5Q29udGV4dEEoJmNvbm4tPkF1dGhJbmZvLT5jcmVkLCBOVUxMLCBOVUxMLAogICAgICAgIGNvbnRleHRfcmVxLCAwLCBTRUNVUklUWV9ORVRXT1JLX0RSRVAsCiAgICAgICAgTlVMTCwgMCwgJmNvbm4tPmN0eCwgJm91dF9kZXNjLCAmY29ubi0+YXR0ciwgJmNvbm4tPmV4cCk7CgogIFRSQUNFKCJyID0gJTA4eCBjYkJ1ZmZlciA9ICVsZCBhdHRyID0gJTA4eFxuIiwgciwgb3V0LT5jYkJ1ZmZlciwgY29ubi0+YXR0cik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgUlBDUlQ0X0F1dGhvcml6ZUJpbmRpbmcgKGludGVybmFsKQogKi8Kc3RhdGljIFJQQ19TVEFUVVMgUlBDUlRfQXV0aG9yaXplQ29ubmVjdGlvbihScGNDb25uZWN0aW9uKiBjb25uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZVEUgKmNoYWxsZW5nZSwgVUxPTkcgY291bnQpCnsKICBTZWNCdWZmZXJEZXNjIGlucF9kZXNjLCBvdXRfZGVzYzsKICBTZWNCdWZmZXIgaW5wLCBvdXQ7CiAgU0VDVVJJVFlfU1RBVFVTIHI7CiAgdW5zaWduZWQgY2hhciBidWZmZXJbMHgxMDBdOwogIFJwY1BrdEhkciAqcmVzcF9oZHI7CiAgUlBDX1NUQVRVUyBzdGF0dXM7CiAgVUxPTkcgY29udGV4dF9yZXEgPSBJU0NfUkVRX0NPTk5FQ1RJT04gfCBJU0NfUkVRX1VTRV9EQ0VfU1RZTEUgfAogICAgICAgICAgICAgICAgICAgICAgSVNDX1JFUV9NVVRVQUxfQVVUSCB8IElTQ19SRVFfREVMRUdBVEU7CgogIFRSQUNFKCJjaGFsbGVuZ2UgJXMsICVkIGJ5dGVzXG4iLCBjaGFsbGVuZ2UsIGNvdW50KTsKCiAgaWYgKGNvbm4tPkF1dGhJbmZvLT5BdXRobkxldmVsID09IFJQQ19DX0FVVEhOX0xFVkVMX1BLVF9JTlRFR1JJVFkpCiAgICBjb250ZXh0X3JlcSB8PSBJU0NfUkVRX0lOVEVHUklUWTsKICBlbHNlIGlmIChjb25uLT5BdXRoSW5mby0+QXV0aG5MZXZlbCA9PSBSUENfQ19BVVRITl9MRVZFTF9QS1RfUFJJVkFDWSkKICAgIGNvbnRleHRfcmVxIHw9IElTQ19SRVFfQ09ORklERU5USUFMSVRZIHwgSVNDX1JFUV9JTlRFR1JJVFk7CgogIG91dC5CdWZmZXJUeXBlID0gU0VDQlVGRkVSX1RPS0VOOwogIG91dC5jYkJ1ZmZlciA9IHNpemVvZiBidWZmZXI7CiAgb3V0LnB2QnVmZmVyID0gYnVmZmVyOwoKICBvdXRfZGVzYy51bFZlcnNpb24gPSAwOwogIG91dF9kZXNjLmNCdWZmZXJzID0gMTsKICBvdXRfZGVzYy5wQnVmZmVycyA9ICZvdXQ7CgogIGlucC5CdWZmZXJUeXBlID0gU0VDQlVGRkVSX1RPS0VOOwogIGlucC5wdkJ1ZmZlciA9IGNoYWxsZW5nZTsKICBpbnAuY2JCdWZmZXIgPSBjb3VudDsKCiAgaW5wX2Rlc2MuY0J1ZmZlcnMgPSAxOwogIGlucF9kZXNjLnBCdWZmZXJzID0gJmlucDsKICBpbnBfZGVzYy51bFZlcnNpb24gPSAwOwoKICByID0gSW5pdGlhbGl6ZVNlY3VyaXR5Q29udGV4dEEoJmNvbm4tPkF1dGhJbmZvLT5jcmVkLCAmY29ubi0+Y3R4LCBOVUxMLAogICAgICAgIGNvbnRleHRfcmVxLCAwLCBTRUNVUklUWV9ORVRXT1JLX0RSRVAsCiAgICAgICAgJmlucF9kZXNjLCAwLCAmY29ubi0+Y3R4LCAmb3V0X2Rlc2MsICZjb25uLT5hdHRyLCAmY29ubi0+ZXhwKTsKICBpZiAocikKICB7CiAgICBXQVJOKCJJbml0aWFsaXplU2VjdXJpdHlDb250ZXh0IGZhaWxlZCB3aXRoIGVycm9yIDB4JTA4eFxuIiwgcik7CiAgICByZXR1cm4gRVJST1JfQUNDRVNTX0RFTklFRDsKICB9CgogIHJlc3BfaGRyID0gUlBDUlQ0X0J1aWxkQXV0aEhlYWRlcihORFJfTE9DQUxfREFUQV9SRVBSRVNFTlRBVElPTik7CiAgaWYgKCFyZXNwX2hkcikKICAgIHJldHVybiBFX09VVE9GTUVNT1JZOwoKICBzdGF0dXMgPSBSUENSVDRfU2VuZEF1dGgoY29ubiwgcmVzcF9oZHIsIE5VTEwsIDAsIG91dC5wdkJ1ZmZlciwgb3V0LmNiQnVmZmVyKTsKCiAgUlBDUlQ0X0ZyZWVIZWFkZXIocmVzcF9oZHIpOwoKICByZXR1cm4gc3RhdHVzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFJQQ1JUNF9TZW5kIChpbnRlcm5hbCkKICogCiAqIFRyYW5zbWl0IGEgcGFja2V0IG92ZXIgY29ubmVjdGlvbiBpbiBhY2NlcHRhYmxlIGZyYWdtZW50cy4KICovClJQQ19TVEFUVVMgUlBDUlQ0X1NlbmQoUnBjQ29ubmVjdGlvbiAqQ29ubmVjdGlvbiwgUnBjUGt0SGRyICpIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQnVmZmVyLCB1bnNpZ25lZCBpbnQgQnVmZmVyTGVuZ3RoKQp7CiAgUlBDX1NUQVRVUyByOwogIFNlY0J1ZmZlciBvdXQ7CgogIGlmICghQ29ubmVjdGlvbi0+QXV0aEluZm8gfHwgU2VjSXNWYWxpZEhhbmRsZSgmQ29ubmVjdGlvbi0+Y3R4KSkKICB7CiAgICByZXR1cm4gUlBDUlQ0X1NlbmRBdXRoKENvbm5lY3Rpb24sIEhlYWRlciwgQnVmZmVyLCBCdWZmZXJMZW5ndGgsIE5VTEwsIDApOwogIH0KCiAgb3V0LkJ1ZmZlclR5cGUgPSBTRUNCVUZGRVJfVE9LRU47CiAgb3V0LmNiQnVmZmVyID0gMDsKICBvdXQucHZCdWZmZXIgPSBOVUxMOwoKICAvKiB0YWNrIG9uIGEgbmVnb3RpYXRlIHBhY2tldCAqLwogIFJQQ1JUNF9BdXRoTmVnb3RpYXRlKENvbm5lY3Rpb24sICZvdXQpOwogIHIgPSBSUENSVDRfU2VuZEF1dGgoQ29ubmVjdGlvbiwgSGVhZGVyLCBCdWZmZXIsIEJ1ZmZlckxlbmd0aCwgb3V0LnB2QnVmZmVyLCBvdXQuY2JCdWZmZXIpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG91dC5wdkJ1ZmZlcik7CgogIHJldHVybiByOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFJQQ1JUNF9SZWNlaXZlIChpbnRlcm5hbCkKICogCiAqIFJlY2VpdmUgYSBwYWNrZXQgZnJvbSBjb25uZWN0aW9uIGFuZCBtZXJnZSB0aGUgZnJhZ21lbnRzLgogKi8KUlBDX1NUQVRVUyBSUENSVDRfUmVjZWl2ZShScGNDb25uZWN0aW9uICpDb25uZWN0aW9uLCBScGNQa3RIZHIgKipIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUFJQQ19NRVNTQUdFIHBNc2cpCnsKICBSUENfU1RBVFVTIHN0YXR1czsKICBEV09SRCBoZHJfbGVuZ3RoOwogIExPTkcgZHdSZWFkOwogIHVuc2lnbmVkIHNob3J0IGZpcnN0X2ZsYWc7CiAgdW5zaWduZWQgbG9uZyBkYXRhX2xlbmd0aDsKICB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9sZW5ndGg7CiAgdW5zaWduZWQgbG9uZyBhdXRoX2xlbmd0aDsKICB1bnNpZ25lZCBjaGFyICphdXRoX2RhdGEgPSBOVUxMOwogIFJwY1BrdENvbW1vbkhkciBjb21tb25faGRyOwoKICAqSGVhZGVyID0gTlVMTDsKCiAgVFJBQ0UoIiglcCwgJXAsICVwKVxuIiwgQ29ubmVjdGlvbiwgSGVhZGVyLCBwTXNnKTsKCiAgLyogcmVhZCBwYWNrZXQgY29tbW9uIGhlYWRlciAqLwogIGR3UmVhZCA9IHJwY3J0NF9jb25uX3JlYWQoQ29ubmVjdGlvbiwgJmNvbW1vbl9oZHIsIHNpemVvZihjb21tb25faGRyKSk7CiAgaWYgKGR3UmVhZCAhPSBzaXplb2YoY29tbW9uX2hkcikpIHsKICAgIFdBUk4oIlNob3J0IHJlYWQgb2YgaGVhZGVyLCAlZCBieXRlc1xuIiwgZHdSZWFkKTsKICAgIHN0YXR1cyA9IFJQQ19TX1BST1RPQ09MX0VSUk9SOwogICAgZ290byBmYWlsOwogIH0KCiAgLyogdmVyaWZ5IGlmIHRoZSBoZWFkZXIgcmVhbGx5IG1ha2VzIHNlbnNlICovCiAgaWYgKGNvbW1vbl9oZHIucnBjX3ZlciAhPSBSUENfVkVSX01BSk9SIHx8CiAgICAgIGNvbW1vbl9oZHIucnBjX3Zlcl9taW5vciAhPSBSUENfVkVSX01JTk9SKSB7CiAgICBXQVJOKCJ1bmhhbmRsZWQgcGFja2V0IHZlcnNpb25cbiIpOwogICAgc3RhdHVzID0gUlBDX1NfUFJPVE9DT0xfRVJST1I7CiAgICBnb3RvIGZhaWw7CiAgfQoKICBoZHJfbGVuZ3RoID0gUlBDUlQ0X0dldEhlYWRlclNpemUoKFJwY1BrdEhkciopJmNvbW1vbl9oZHIpOwogIGlmIChoZHJfbGVuZ3RoID09IDApIHsKICAgIFdBUk4oImhlYWRlciBsZW5ndGggPT0gMFxuIik7CiAgICBzdGF0dXMgPSBSUENfU19QUk9UT0NPTF9FUlJPUjsKICAgIGdvdG8gZmFpbDsKICB9CgogICpIZWFkZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgaGRyX2xlbmd0aCk7CiAgbWVtY3B5KCpIZWFkZXIsICZjb21tb25faGRyLCBzaXplb2YoY29tbW9uX2hkcikpOwoKICAvKiByZWFkIHRoZSByZXN0IG9mIHBhY2tldCBoZWFkZXIgKi8KICBkd1JlYWQgPSBycGNydDRfY29ubl9yZWFkKENvbm5lY3Rpb24sICYoKkhlYWRlciktPmNvbW1vbiArIDEsIGhkcl9sZW5ndGggLSBzaXplb2YoY29tbW9uX2hkcikpOwogIGlmIChkd1JlYWQgIT0gaGRyX2xlbmd0aCAtIHNpemVvZihjb21tb25faGRyKSkgewogICAgV0FSTigiYmFkIGhlYWRlciBsZW5ndGgsICVkIGJ5dGVzLCBoZHJfbGVuZ3RoICVkXG4iLCBkd1JlYWQsIGhkcl9sZW5ndGgpOwogICAgc3RhdHVzID0gUlBDX1NfUFJPVE9DT0xfRVJST1I7CiAgICBnb3RvIGZhaWw7CiAgfQoKICAvKiByZWFkIHBhY2tldCBib2R5ICovCiAgc3dpdGNoIChjb21tb25faGRyLnB0eXBlKSB7CiAgY2FzZSBQS1RfUkVTUE9OU0U6CiAgICBwTXNnLT5CdWZmZXJMZW5ndGggPSAoKkhlYWRlciktPnJlc3BvbnNlLmFsbG9jX2hpbnQ7CiAgICBicmVhazsKICBjYXNlIFBLVF9SRVFVRVNUOgogICAgcE1zZy0+QnVmZmVyTGVuZ3RoID0gKCpIZWFkZXIpLT5yZXF1ZXN0LmFsbG9jX2hpbnQ7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgcE1zZy0+QnVmZmVyTGVuZ3RoID0gY29tbW9uX2hkci5mcmFnX2xlbiAtIGhkcl9sZW5ndGggLSBSUENfQVVUSF9WRVJJRklFUl9MRU4oJmNvbW1vbl9oZHIpOwogIH0KCiAgVFJBQ0UoImJ1ZmZlciBsZW5ndGggPSAldVxuIiwgcE1zZy0+QnVmZmVyTGVuZ3RoKTsKCiAgc3RhdHVzID0gSV9ScGNHZXRCdWZmZXIocE1zZyk7CiAgaWYgKHN0YXR1cyAhPSBSUENfU19PSykgZ290byBmYWlsOwoKICBmaXJzdF9mbGFnID0gUlBDX0ZMR19GSVJTVDsKICBhdXRoX2xlbmd0aCA9IGNvbW1vbl9oZHIuYXV0aF9sZW47CiAgaWYgKGF1dGhfbGVuZ3RoKSB7CiAgICBhdXRoX2RhdGEgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgUlBDX0FVVEhfVkVSSUZJRVJfTEVOKCZjb21tb25faGRyKSk7CiAgICBpZiAoIWF1dGhfZGF0YSkgewogICAgICBzdGF0dXMgPSBSUENfU19QUk9UT0NPTF9FUlJPUjsKICAgICAgZ290byBmYWlsOwogICAgfQogIH0KICBidWZmZXJfbGVuZ3RoID0gMDsKICB3aGlsZSAoVFJVRSkKICB7CiAgICB1bnNpZ25lZCBpbnQgaGVhZGVyX2F1dGhfbGVuID0gUlBDX0FVVEhfVkVSSUZJRVJfTEVOKCYoKkhlYWRlciktPmNvbW1vbik7CgogICAgLyogdmVyaWZ5IGhlYWRlciBmaWVsZHMgKi8KCiAgICBpZiAoKCgqSGVhZGVyKS0+Y29tbW9uLmZyYWdfbGVuIDwgaGRyX2xlbmd0aCkgfHwKICAgICAgICAoKCpIZWFkZXIpLT5jb21tb24uZnJhZ19sZW4gLSBoZHJfbGVuZ3RoIDwgaGVhZGVyX2F1dGhfbGVuKSkgewogICAgICBXQVJOKCJmcmFnX2xlbiAlZCB0b28gc21hbGwgZm9yIGhkcl9sZW5ndGggJWQgYW5kIGF1dGhfbGVuICVkXG4iLAogICAgICAgIGNvbW1vbl9oZHIuZnJhZ19sZW4sIGhkcl9sZW5ndGgsIGNvbW1vbl9oZHIuYXV0aF9sZW4pOwogICAgICBzdGF0dXMgPSBSUENfU19QUk9UT0NPTF9FUlJPUjsKICAgICAgZ290byBmYWlsOwogICAgfQoKICAgIGlmICgoKkhlYWRlciktPmNvbW1vbi5hdXRoX2xlbiAhPSBhdXRoX2xlbmd0aCkgewogICAgICBXQVJOKCJhdXRoX2xlbiBoZWFkZXIgZmllbGQgY2hhbmdlZCBmcm9tICVsZCB0byAlZFxuIiwKICAgICAgICBhdXRoX2xlbmd0aCwgKCpIZWFkZXIpLT5jb21tb24uYXV0aF9sZW4pOwogICAgICBzdGF0dXMgPSBSUENfU19QUk9UT0NPTF9FUlJPUjsKICAgICAgZ290byBmYWlsOwogICAgfQoKICAgIGlmICgoKCpIZWFkZXIpLT5jb21tb24uZmxhZ3MgJiBSUENfRkxHX0ZJUlNUKSAhPSBmaXJzdF9mbGFnKSB7CiAgICAgIFRSQUNFKCJpbnZhbGlkIHBhY2tldCBmbGFnc1xuIik7CiAgICAgIHN0YXR1cyA9IFJQQ19TX1BST1RPQ09MX0VSUk9SOwogICAgICBnb3RvIGZhaWw7CiAgICB9CgogICAgZGF0YV9sZW5ndGggPSAoKkhlYWRlciktPmNvbW1vbi5mcmFnX2xlbiAtIGhkcl9sZW5ndGggLSBoZWFkZXJfYXV0aF9sZW47CiAgICBpZiAoZGF0YV9sZW5ndGggKyBidWZmZXJfbGVuZ3RoID4gcE1zZy0+QnVmZmVyTGVuZ3RoKSB7CiAgICAgIFRSQUNFKCJhbGxvY2F0aW9uIGhpbnQgZXhjZWVkZWQsIG5ldyBidWZmZXIgbGVuZ3RoID0gJWxkXG4iLAogICAgICAgIGRhdGFfbGVuZ3RoICsgYnVmZmVyX2xlbmd0aCk7CiAgICAgIHBNc2ctPkJ1ZmZlckxlbmd0aCA9IGRhdGFfbGVuZ3RoICsgYnVmZmVyX2xlbmd0aDsKICAgICAgc3RhdHVzID0gSV9ScGNSZUFsbG9jYXRlQnVmZmVyKHBNc2cpOwogICAgICBpZiAoc3RhdHVzICE9IFJQQ19TX09LKSBnb3RvIGZhaWw7CiAgICB9CgogICAgaWYgKGRhdGFfbGVuZ3RoID09IDApIGR3UmVhZCA9IDA7IGVsc2UKICAgIGR3UmVhZCA9IHJwY3J0NF9jb25uX3JlYWQoQ29ubmVjdGlvbiwKICAgICAgICAodW5zaWduZWQgY2hhciAqKXBNc2ctPkJ1ZmZlciArIGJ1ZmZlcl9sZW5ndGgsIGRhdGFfbGVuZ3RoKTsKICAgIGlmIChkd1JlYWQgIT0gZGF0YV9sZW5ndGgpIHsKICAgICAgV0FSTigiYmFkIGRhdGEgbGVuZ3RoLCAlZC8lbGRcbiIsIGR3UmVhZCwgZGF0YV9sZW5ndGgpOwogICAgICBzdGF0dXMgPSBSUENfU19QUk9UT0NPTF9FUlJPUjsKICAgICAgZ290byBmYWlsOwogICAgfQoKICAgIGlmIChoZWFkZXJfYXV0aF9sZW4pIHsKICAgICAgaWYgKGhlYWRlcl9hdXRoX2xlbiA8IHNpemVvZihScGNBdXRoVmVyaWZpZXIpKSB7CiAgICAgICAgV0FSTigiYmFkIGF1dGggdmVyaWZpZXIgbGVuZ3RoICVkXG4iLCBoZWFkZXJfYXV0aF9sZW4pOwogICAgICAgIHN0YXR1cyA9IFJQQ19TX1BST1RPQ09MX0VSUk9SOwogICAgICAgIGdvdG8gZmFpbDsKICAgICAgfQoKICAgICAgLyogRklYTUU6IHdlIHNob3VsZCBhY2N1bXVsYXRlIGF1dGhlbnRpY2F0aW9uIGRhdGEgZm9yIHRoZSBiaW5kLAogICAgICAgKiBiaW5kX2FjaywgYWx0ZXJfY29udGV4dCBhbmQgYWx0ZXJfY29udGV4dF9yZXNwb25zZSBpZiBuZWNlc3NhcnkuCiAgICAgICAqIGhvd2V2ZXIsIHRoZSBkZXRhaWxzIG9mIGhvdyB0aGlzIGlzIGRvbmUgaXMgdmVyeSBza2V0Y2h5IGluIHRoZQogICAgICAgKiBEQ0UvUlBDIHNwZWMuIGZvciBhbGwgb3RoZXIgcGFja2V0IHR5cGVzIHRoYXQgaGF2ZSBhdXRoZW50aWNhdGlvbgogICAgICAgKiB2ZXJpZmllciBkYXRhIHRoZW4gaXQgaXMganVzdCBkdXBsaWNhdGVkIGluIGFsbCB0aGUgZnJhZ21lbnRzICovCiAgICAgIGR3UmVhZCA9IHJwY3J0NF9jb25uX3JlYWQoQ29ubmVjdGlvbiwgYXV0aF9kYXRhLCBoZWFkZXJfYXV0aF9sZW4pOwogICAgICBpZiAoZHdSZWFkICE9IGhlYWRlcl9hdXRoX2xlbikgewogICAgICAgIFdBUk4oImJhZCBhdXRoZW50aWNhdGlvbiBkYXRhIGxlbmd0aCwgJWQvJWRcbiIsIGR3UmVhZCwKICAgICAgICAgIGhlYWRlcl9hdXRoX2xlbik7CiAgICAgICAgc3RhdHVzID0gUlBDX1NfUFJPVE9DT0xfRVJST1I7CiAgICAgICAgZ290byBmYWlsOwogICAgICB9CgogICAgICAvKiB0aGVzZSBwYWNrZXRzIGFyZSBoYW5kbGVkIHNwZWNpYWxseSwgbm90IGJ5IHRoZSBnZW5lcmljIFNlY3VyZVBhY2tldAogICAgICAgKiBmdW5jdGlvbiAqLwogICAgICBpZiAoKGNvbW1vbl9oZHIucHR5cGUgIT0gUEtUX0JJTkQpICYmCiAgICAgICAgICAoY29tbW9uX2hkci5wdHlwZSAhPSBQS1RfQklORF9BQ0spICYmCiAgICAgICAgICAoY29tbW9uX2hkci5wdHlwZSAhPSBQS1RfQVVUSDMpKQogICAgICAgIHN0YXR1cyA9IFJQQ1JUNF9TZWN1cmVQYWNrZXQoQ29ubmVjdGlvbiwgU0VDVVJFX1BBQ0tFVF9SRUNFSVZFLAogICAgICAgICAgICAqSGVhZGVyLCBoZHJfbGVuZ3RoLAogICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKXBNc2ctPkJ1ZmZlciArIGJ1ZmZlcl9sZW5ndGgsIGRhdGFfbGVuZ3RoLAogICAgICAgICAgICAoUnBjQXV0aFZlcmlmaWVyICopYXV0aF9kYXRhLAogICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWF1dGhfZGF0YSArIHNpemVvZihScGNBdXRoVmVyaWZpZXIpLAogICAgICAgICAgICBoZWFkZXJfYXV0aF9sZW4gLSBzaXplb2YoUnBjQXV0aFZlcmlmaWVyKSk7CiAgICB9CgogICAgYnVmZmVyX2xlbmd0aCArPSBkYXRhX2xlbmd0aDsKICAgIGlmICghKCgqSGVhZGVyKS0+Y29tbW9uLmZsYWdzICYgUlBDX0ZMR19MQVNUKSkgewogICAgICBUUkFDRSgibmV4dCBoZWFkZXJcbiIpOwoKICAgICAgLyogcmVhZCB0aGUgaGVhZGVyIG9mIG5leHQgcGFja2V0ICovCiAgICAgIGR3UmVhZCA9IHJwY3J0NF9jb25uX3JlYWQoQ29ubmVjdGlvbiwgKkhlYWRlciwgaGRyX2xlbmd0aCk7CiAgICAgIGlmIChkd1JlYWQgIT0gaGRyX2xlbmd0aCkgewogICAgICAgIFdBUk4oImludmFsaWQgcGFja2V0IGhlYWRlciBzaXplICglZClcbiIsIGR3UmVhZCk7CiAgICAgICAgc3RhdHVzID0gUlBDX1NfUFJPVE9DT0xfRVJST1I7CiAgICAgICAgZ290byBmYWlsOwogICAgICB9CgogICAgICBmaXJzdF9mbGFnID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBwTXNnLT5CdWZmZXJMZW5ndGggPSBidWZmZXJfbGVuZ3RoOwoKICAvKiByZXNwb25kIHRvIGF1dGhvcml6YXRpb24gcmVxdWVzdCAqLwogIGlmIChjb21tb25faGRyLnB0eXBlID09IFBLVF9CSU5EX0FDSyAmJiBhdXRoX2xlbmd0aCA+IHNpemVvZihScGNBdXRoVmVyaWZpZXIpKQogIHsKICAgIHN0YXR1cyA9IFJQQ1JUX0F1dGhvcml6ZUNvbm5lY3Rpb24oQ29ubmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9kYXRhICsgc2l6ZW9mKFJwY0F1dGhWZXJpZmllciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfbGVuZ3RoKTsKICAgIGlmIChzdGF0dXMpCiAgICAgICAgZ290byBmYWlsOwogIH0KCiAgLyogc3VjY2VzcyAqLwogIHN0YXR1cyA9IFJQQ19TX09LOwoKZmFpbDoKICBpZiAoc3RhdHVzICE9IFJQQ19TX09LKSB7CiAgICBSUENSVDRfRnJlZUhlYWRlcigqSGVhZGVyKTsKICAgICpIZWFkZXIgPSBOVUxMOwogIH0KICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBhdXRoX2RhdGEpOwogIHJldHVybiBzdGF0dXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgSV9ScGNHZXRCdWZmZXIgW1JQQ1JUNC5AXQogKgogKiBBbGxvY2F0ZXMgYSBidWZmZXIgZm9yIHVzZSBieSBJX1JwY1NlbmQgb3IgSV9ScGNTZW5kUmVjZWl2ZSBhbmQgYmluZHMgdG8gdGhlCiAqIHNlcnZlciBpbnRlcmZhY2UuCiAqCiAqIFBBUkFNUwogKiAgcE1zZyBbSS9PXSBSUEMgbWVzc2FnZSBpbmZvcm1hdGlvbi4KICoKICogUkVUVVJOUwogKiAgU3VjY2VzczogUlBDX1NfT0suCiAqICBGYWlsdXJlOiBSUENfU19JTlZBTElEX0JJTkRJTkcgaWYgcE1zZy0+SGFuZGxlIGlzIGludmFsaWQuCiAqICAgICAgICAgICBSUENfU19TRVJWRVJfVU5BVkFJTEFCTEUgaWYgdW5hYmxlIHRvIGNvbm5lY3QgdG8gc2VydmVyLgogKiAgICAgICAgICAgRVJST1JfT1VUT0ZNRU1PUlkgaWYgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkLgogKgogKiBOT1RFUwogKiAgVGhlIHBNc2ctPkJ1ZmZlckxlbmd0aCBmaWVsZCBkZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdG8gYWxsb2NhdGUsCiAqICBpbiBieXRlcy4KICoKICogIFVzZSBJX1JwY0ZyZWVCdWZmZXIoKSB0byB1bmJpbmQgZnJvbSB0aGUgc2VydmVyIGFuZCBmcmVlIHRoZSBtZXNzYWdlIGJ1ZmZlci4KICoKICogU0VFIEFMU08KICogIElfUnBjRnJlZUJ1ZmZlcigpLCBJX1JwY1NlbmQoKSwgSV9ScGNSZWNlaXZlKCksIElfUnBjU2VuZFJlY2VpdmUoKS4KICovClJQQ19TVEFUVVMgV0lOQVBJIElfUnBjR2V0QnVmZmVyKFBSUENfTUVTU0FHRSBwTXNnKQp7CiAgVFJBQ0UoIiglcCk6IEJ1ZmZlckxlbmd0aD0lZFxuIiwgcE1zZywgcE1zZy0+QnVmZmVyTGVuZ3RoKTsKICAvKiBGSVhNRTogcGZuQWxsb2NhdGU/ICovCiAgcE1zZy0+QnVmZmVyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHBNc2ctPkJ1ZmZlckxlbmd0aCk7CgogIFRSQUNFKCJCdWZmZXI9JXBcbiIsIHBNc2ctPkJ1ZmZlcik7CiAgLyogRklYTUU6IHdoaWNoIGVycm9ycyB0byByZXR1cm4/ICovCiAgcmV0dXJuIHBNc2ctPkJ1ZmZlciA/IFNfT0sgOiBFX09VVE9GTUVNT1JZOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIElfUnBjUmVBbGxvY2F0ZUJ1ZmZlciAoaW50ZXJuYWwpCiAqLwpzdGF0aWMgUlBDX1NUQVRVUyBJX1JwY1JlQWxsb2NhdGVCdWZmZXIoUFJQQ19NRVNTQUdFIHBNc2cpCnsKICBUUkFDRSgiKCVwKTogQnVmZmVyTGVuZ3RoPSVkXG4iLCBwTXNnLCBwTXNnLT5CdWZmZXJMZW5ndGgpOwogIHBNc2ctPkJ1ZmZlciA9IEhlYXBSZUFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHBNc2ctPkJ1ZmZlciwgcE1zZy0+QnVmZmVyTGVuZ3RoKTsKCiAgVFJBQ0UoIkJ1ZmZlcj0lcFxuIiwgcE1zZy0+QnVmZmVyKTsKICByZXR1cm4gcE1zZy0+QnVmZmVyID8gUlBDX1NfT0sgOiBSUENfU19PVVRfT0ZfUkVTT1VSQ0VTOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIElfUnBjRnJlZUJ1ZmZlciBbUlBDUlQ0LkBdCiAqCiAqIEZyZWVzIGEgYnVmZmVyIGFsbG9jYXRlZCBieSBJX1JwY0dldEJ1ZmZlciBvciBJX1JwY1JlY2VpdmUgYW5kIHVuYmluZHMgZnJvbQogKiB0aGUgc2VydmVyIGludGVyZmFjZS4KICoKICogUEFSQU1TCiAqICBwTXNnIFtJL09dIFJQQyBtZXNzYWdlIGluZm9ybWF0aW9uLgogKgogKiBSRVRVUk5TCiAqICBSUENfU19PSy4KICoKICogU0VFIEFMU08KICogIElfUnBjR2V0QnVmZmVyKCksIElfUnBjUmVjZWl2ZSgpLgogKi8KUlBDX1NUQVRVUyBXSU5BUEkgSV9ScGNGcmVlQnVmZmVyKFBSUENfTUVTU0FHRSBwTXNnKQp7CiAgVFJBQ0UoIiglcCkgQnVmZmVyPSVwXG4iLCBwTXNnLCBwTXNnLT5CdWZmZXIpOwogIC8qIEZJWE1FOiBwZm5GcmVlPyAqLwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBNc2ctPkJ1ZmZlcik7CiAgcE1zZy0+QnVmZmVyID0gTlVMTDsKICByZXR1cm4gU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBJX1JwY1NlbmQgW1JQQ1JUNC5AXQogKgogKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZlci4KICoKICogUEFSQU1TCiAqICBwTXNnIFtJL09dIFJQQyBtZXNzYWdlIGluZm9ybWF0aW9uLgogKgogKiBSRVRVUk5TCiAqICBVbmtub3duLgogKgogKiBOT1RFUwogKiAgVGhlIGJ1ZmZlciBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBJX1JwY0dldEJ1ZmZlcigpLgogKgogKiBTRUUgQUxTTwogKiAgSV9ScGNHZXRCdWZmZXIoKSwgSV9ScGNSZWNlaXZlKCksIElfUnBjU2VuZFJlY2VpdmUoKS4KICovClJQQ19TVEFUVVMgV0lOQVBJIElfUnBjU2VuZChQUlBDX01FU1NBR0UgcE1zZykKewogIFJwY0JpbmRpbmcqIGJpbmQgPSAoUnBjQmluZGluZyopcE1zZy0+SGFuZGxlOwogIFJwY0Nvbm5lY3Rpb24qIGNvbm47CiAgUlBDX0NMSUVOVF9JTlRFUkZBQ0UqIGNpZiA9IE5VTEw7CiAgUlBDX1NFUlZFUl9JTlRFUkZBQ0UqIHNpZiA9IE5VTEw7CiAgUlBDX1NUQVRVUyBzdGF0dXM7CiAgUnBjUGt0SGRyICpoZHI7CgogIFRSQUNFKCIoJXApXG4iLCBwTXNnKTsKICBpZiAoIWJpbmQpIHJldHVybiBSUENfU19JTlZBTElEX0JJTkRJTkc7CgogIGlmIChiaW5kLT5zZXJ2ZXIpIHsKICAgIHNpZiA9IHBNc2ctPlJwY0ludGVyZmFjZUluZm9ybWF0aW9uOwogICAgaWYgKCFzaWYpIHJldHVybiBSUENfU19JTlRFUkZBQ0VfTk9UX0ZPVU5EOyAvKiA/ICovCiAgICBzdGF0dXMgPSBSUENSVDRfT3BlbkJpbmRpbmcoYmluZCwgJmNvbm4sICZzaWYtPlRyYW5zZmVyU3ludGF4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWYtPkludGVyZmFjZUlkKTsKICB9IGVsc2UgewogICAgY2lmID0gcE1zZy0+UnBjSW50ZXJmYWNlSW5mb3JtYXRpb247CiAgICBpZiAoIWNpZikgcmV0dXJuIFJQQ19TX0lOVEVSRkFDRV9OT1RfRk9VTkQ7IC8qID8gKi8KCiAgICBpZiAoIWJpbmQtPkVuZHBvaW50IHx8ICFiaW5kLT5FbmRwb2ludFswXSkKICAgIHsKICAgICAgVFJBQ0UoImF1dG9tYXRpY2FsbHkgcmVzb2x2aW5nIHBhcnRpYWxseSBib3VuZCBiaW5kaW5nXG4iKTsKICAgICAgc3RhdHVzID0gUnBjRXBSZXNvbHZlQmluZGluZyhiaW5kLCBjaWYpOwogICAgICBpZiAoc3RhdHVzICE9IFJQQ19TX09LKSByZXR1cm4gc3RhdHVzOwogICAgfQoKICAgIHN0YXR1cyA9IFJQQ1JUNF9PcGVuQmluZGluZyhiaW5kLCAmY29ubiwgJmNpZi0+VHJhbnNmZXJTeW50YXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNpZi0+SW50ZXJmYWNlSWQpOwogIH0KCiAgaWYgKHN0YXR1cyAhPSBSUENfU19PSykgcmV0dXJuIHN0YXR1czsKCiAgaWYgKGJpbmQtPnNlcnZlcikgewogICAgaWYgKHBNc2ctPlJwY0ZsYWdzICYgV0lORV9SUENGTEFHX0VYQ0VQVElPTikgewogICAgICBoZHIgPSBSUENSVDRfQnVpbGRGYXVsdEhlYWRlcihwTXNnLT5EYXRhUmVwcmVzZW50YXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQQ19TX0NBTExfRkFJTEVEKTsKICAgIH0gZWxzZSB7CiAgICAgIGhkciA9IFJQQ1JUNF9CdWlsZFJlc3BvbnNlSGVhZGVyKHBNc2ctPkRhdGFSZXByZXNlbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1zZy0+QnVmZmVyTGVuZ3RoKTsKICAgIH0KICB9IGVsc2UgewogICAgaGRyID0gUlBDUlQ0X0J1aWxkUmVxdWVzdEhlYWRlcihwTXNnLT5EYXRhUmVwcmVzZW50YXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNc2ctPkJ1ZmZlckxlbmd0aCwgcE1zZy0+UHJvY051bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJpbmQtPk9iamVjdFV1aWQpOwogICAgaGRyLT5jb21tb24uY2FsbF9pZCA9IGNvbm4tPk5leHRDYWxsSWQrKzsKICB9CgogIHN0YXR1cyA9IFJQQ1JUNF9TZW5kKGNvbm4sIGhkciwgcE1zZy0+QnVmZmVyLCBwTXNnLT5CdWZmZXJMZW5ndGgpOwoKICBSUENSVDRfRnJlZUhlYWRlcihoZHIpOwoKICAvKiBzdWNjZXNzICovCiAgaWYgKCFiaW5kLT5zZXJ2ZXIpIHsKICAgIC8qIHNhdmUgdGhlIGNvbm5lY3Rpb24sIHNvIHRoZSByZXNwb25zZSBjYW4gYmUgcmVhZCBmcm9tIGl0ICovCiAgICBwTXNnLT5SZXNlcnZlZEZvclJ1bnRpbWUgPSBjb25uOwogICAgcmV0dXJuIHN0YXR1czsKICB9CiAgUlBDUlQ0X0Nsb3NlQmluZGluZyhiaW5kLCBjb25uKTsKCiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBJX1JwY1JlY2VpdmUgW1JQQ1JUNC5AXQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgSV9ScGNSZWNlaXZlKFBSUENfTUVTU0FHRSBwTXNnKQp7CiAgUnBjQmluZGluZyogYmluZCA9IChScGNCaW5kaW5nKilwTXNnLT5IYW5kbGU7CiAgUnBjQ29ubmVjdGlvbiogY29ubjsKICBSUENfQ0xJRU5UX0lOVEVSRkFDRSogY2lmID0gTlVMTDsKICBSUENfU0VSVkVSX0lOVEVSRkFDRSogc2lmID0gTlVMTDsKICBSUENfU1RBVFVTIHN0YXR1czsKICBScGNQa3RIZHIgKmhkciA9IE5VTEw7CgogIFRSQUNFKCIoJXApXG4iLCBwTXNnKTsKICBpZiAoIWJpbmQpIHJldHVybiBSUENfU19JTlZBTElEX0JJTkRJTkc7CgogIGlmIChwTXNnLT5SZXNlcnZlZEZvclJ1bnRpbWUpIHsKICAgIGNvbm4gPSBwTXNnLT5SZXNlcnZlZEZvclJ1bnRpbWU7CiAgICBwTXNnLT5SZXNlcnZlZEZvclJ1bnRpbWUgPSBOVUxMOwogIH0gZWxzZSB7CiAgICBpZiAoYmluZC0+c2VydmVyKSB7CiAgICAgIHNpZiA9IHBNc2ctPlJwY0ludGVyZmFjZUluZm9ybWF0aW9uOwogICAgICBpZiAoIXNpZikgcmV0dXJuIFJQQ19TX0lOVEVSRkFDRV9OT1RfRk9VTkQ7IC8qID8gKi8KICAgICAgc3RhdHVzID0gUlBDUlQ0X09wZW5CaW5kaW5nKGJpbmQsICZjb25uLCAmc2lmLT5UcmFuc2ZlclN5bnRheCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWYtPkludGVyZmFjZUlkKTsKICAgIH0gZWxzZSB7CiAgICAgIGNpZiA9IHBNc2ctPlJwY0ludGVyZmFjZUluZm9ybWF0aW9uOwogICAgICBpZiAoIWNpZikgcmV0dXJuIFJQQ19TX0lOVEVSRkFDRV9OT1RfRk9VTkQ7IC8qID8gKi8KCiAgICAgIGlmICghYmluZC0+RW5kcG9pbnQgfHwgIWJpbmQtPkVuZHBvaW50WzBdKQogICAgICB7CiAgICAgICAgVFJBQ0UoImF1dG9tYXRpY2FsbHkgcmVzb2x2aW5nIHBhcnRpYWxseSBib3VuZCBiaW5kaW5nXG4iKTsKICAgICAgICBzdGF0dXMgPSBScGNFcFJlc29sdmVCaW5kaW5nKGJpbmQsIGNpZik7CiAgICAgICAgaWYgKHN0YXR1cyAhPSBSUENfU19PSykgcmV0dXJuIHN0YXR1czsKICAgICAgfQoKICAgICAgc3RhdHVzID0gUlBDUlQ0X09wZW5CaW5kaW5nKGJpbmQsICZjb25uLCAmY2lmLT5UcmFuc2ZlclN5bnRheCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaWYtPkludGVyZmFjZUlkKTsKICAgIH0KICAgIGlmIChzdGF0dXMgIT0gUlBDX1NfT0spIHJldHVybiBzdGF0dXM7CiAgfQoKICBzdGF0dXMgPSBSUENSVDRfUmVjZWl2ZShjb25uLCAmaGRyLCBwTXNnKTsKICBpZiAoc3RhdHVzICE9IFJQQ19TX09LKSB7CiAgICBXQVJOKCJyZWNlaXZlIGZhaWxlZCB3aXRoIGVycm9yICVseFxuIiwgc3RhdHVzKTsKICAgIGdvdG8gZmFpbDsKICB9CgogIHN0YXR1cyA9IFJQQ19TX1BST1RPQ09MX0VSUk9SOwoKICBzd2l0Y2ggKGhkci0+Y29tbW9uLnB0eXBlKSB7CiAgY2FzZSBQS1RfUkVTUE9OU0U6CiAgICBpZiAoYmluZC0+c2VydmVyKSBnb3RvIGZhaWw7CiAgICBicmVhazsKICBjYXNlIFBLVF9SRVFVRVNUOgogICAgaWYgKCFiaW5kLT5zZXJ2ZXIpIGdvdG8gZmFpbDsKICAgIGJyZWFrOwogIGNhc2UgUEtUX0ZBVUxUOgogICAgcE1zZy0+UnBjRmxhZ3MgfD0gV0lORV9SUENGTEFHX0VYQ0VQVElPTjsKICAgIEVSUiAoIndlIGdvdCBmYXVsdCBwYWNrZXQgd2l0aCBzdGF0dXMgMHglbHhcbiIsIGhkci0+ZmF1bHQuc3RhdHVzKTsKICAgIHN0YXR1cyA9IGhkci0+ZmF1bHQuc3RhdHVzOyAvKiBGSVhNRTogZG8gdHJhbnNsYXRpb24gZnJvbSBuY2EgZXJyb3IgY29kZXMgKi8KICAgIGdvdG8gZmFpbDsKICBkZWZhdWx0OgogICAgV0FSTigiYmFkIHBhY2tldCB0eXBlICVkXG4iLCBoZHItPmNvbW1vbi5wdHlwZSk7CiAgICBnb3RvIGZhaWw7CiAgfQoKICAvKiBzdWNjZXNzICovCiAgc3RhdHVzID0gUlBDX1NfT0s7CgpmYWlsOgogIFJQQ1JUNF9GcmVlSGVhZGVyKGhkcik7CiAgUlBDUlQ0X0Nsb3NlQmluZGluZyhiaW5kLCBjb25uKTsKICByZXR1cm4gc3RhdHVzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIElfUnBjU2VuZFJlY2VpdmUgW1JQQ1JUNC5AXQogKgogKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZlciBhbmQgcmVjZWl2ZXMgdGhlIHJlc3BvbnNlLgogKgogKiBQQVJBTVMKICogIHBNc2cgW0kvT10gUlBDIG1lc3NhZ2UgaW5mb3JtYXRpb24uCiAqCiAqIFJFVFVSTlMKICogIFN1Y2Nlc3M6IFJQQ19TX09LLgogKiAgRmFpbHVyZTogQW55IGVycm9yIGNvZGUuCiAqCiAqIE5PVEVTCiAqICBUaGUgYnVmZmVyIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIElfUnBjR2V0QnVmZmVyKCkuCiAqCiAqIFNFRSBBTFNPCiAqICBJX1JwY0dldEJ1ZmZlcigpLCBJX1JwY1NlbmQoKSwgSV9ScGNSZWNlaXZlKCkuCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBJX1JwY1NlbmRSZWNlaXZlKFBSUENfTUVTU0FHRSBwTXNnKQp7CiAgUlBDX1NUQVRVUyBzdGF0dXM7CiAgUlBDX01FU1NBR0Ugb3JpZ2luYWxfbWVzc2FnZTsKCiAgVFJBQ0UoIiglcClcbiIsIHBNc2cpOwoKICBvcmlnaW5hbF9tZXNzYWdlID0gKnBNc2c7CiAgc3RhdHVzID0gSV9ScGNTZW5kKHBNc2cpOwogIGlmIChzdGF0dXMgPT0gUlBDX1NfT0spCiAgICBzdGF0dXMgPSBJX1JwY1JlY2VpdmUocE1zZyk7CiAgLyogZnJlZSB0aGUgYnVmZmVyIHJlcGxhY2VkIGJ5IGEgbmV3IGJ1ZmZlciBpbiBJX1JwY1JlY2VpdmUgKi8KICBpZiAoc3RhdHVzID09IFJQQ19TX09LKQogICAgSV9ScGNGcmVlQnVmZmVyKCZvcmlnaW5hbF9tZXNzYWdlKTsKICByZXR1cm4gc3RhdHVzOwp9Cg==