LyoKICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgogICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDkgU2FtIExhbnRpbmdhCgogICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoKICAgIFNhbSBMYW50aW5nYQogICAgc2xvdWtlbkBsaWJzZGwub3JnCiovCiNpbmNsdWRlICJTRExfY29uZmlnLmgiCgovKiAgCiAgICBOb3RlOiBUaGlzIGZpbGUgaGFzbid0IGJlZW4gbW9kaWZpZWQgc28gdGVjaG5pY2FsbHkgd2UgaGF2ZSB0byBrZWVwIHRoZSBkaXNjbGFpbWVyIDotKAoKCiAgICBDb3B5cmlnaHQ6ICCpIENvcHlyaWdodCAyMDAyIEFwcGxlIENvbXB1dGVyLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgRGlzY2xhaW1lcjogSU1QT1JUQU5UOiAgVGhpcyBBcHBsZSBzb2Z0d2FyZSBpcyBzdXBwbGllZCB0byB5b3UgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4KICAgICAgICAgICAgKCJBcHBsZSIpIGluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIKICAgICAgICAgICAgdXNlLCBpbnN0YWxsYXRpb24sIG1vZGlmaWNhdGlvbiBvciByZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIEFwcGxlIHNvZnR3YXJlCiAgICAgICAgICAgIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMsCiAgICAgICAgICAgIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IgcmVkaXN0cmlidXRlIHRoaXMgQXBwbGUgc29mdHdhcmUuCgogICAgICAgICAgICBJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCBzdWJqZWN0CiAgICAgICAgICAgIHRvIHRoZXNlIHRlcm1zLCBBcHBsZSBncmFudHMgeW91IGEgcGVyc29uYWwsIG5vbi1leGNsdXNpdmUgbGljZW5zZSwgdW5kZXIgQXBwbGXVcwogICAgICAgICAgICBjb3B5cmlnaHRzIGluIHRoaXMgb3JpZ2luYWwgQXBwbGUgc29mdHdhcmUgKHRoZSAiQXBwbGUgU29mdHdhcmUiKSwgdG8gdXNlLAogICAgICAgICAgICByZXByb2R1Y2UsIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0CiAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5IGZvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUKICAgICAgICAgICAgdGhlIEFwcGxlIFNvZnR3YXJlIGluIGl0cyBlbnRpcmV0eSBhbmQgd2l0aG91dCBtb2RpZmljYXRpb25zLCB5b3UgbXVzdCByZXRhaW4KICAgICAgICAgICAgdGhpcyBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgdGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mCiAgICAgICAgICAgIHRoZSBBcHBsZSBTb2Z0d2FyZS4gIE5laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3Mgb3IgbG9nb3Mgb2YKICAgICAgICAgICAgQXBwbGUgQ29tcHV0ZXIsIEluYy4gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGUKICAgICAgICAgICAgQXBwbGUgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBBcHBsZS4gIEV4Y2VwdCBhcwogICAgICAgICAgICBleHByZXNzbHkgc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwKICAgICAgICAgICAgYXJlIGdyYW50ZWQgYnkgQXBwbGUgaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQKICAgICAgICAgICAgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyIGRlcml2YXRpdmUgd29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIEFwcGxlCiAgICAgICAgICAgIFNvZnR3YXJlIG1heSBiZSBpbmNvcnBvcmF0ZWQuCgogICAgICAgICAgICBUaGUgQXBwbGUgU29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgQXBwbGUgb24gYW4gIkFTIElTIiBiYXNpcy4gIEFQUExFIE1BS0VTIE5PCiAgICAgICAgICAgIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRAogICAgICAgICAgICBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAgICAgICAgICAgIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgQVBQTEUgU09GVFdBUkUgT1IgSVRTIFVTRSBBTkQgT1BFUkFUSU9OIEFMT05FIE9SIElOCiAgICAgICAgICAgIENPTUJJTkFUSU9OIFdJVEggWU9VUiBQUk9EVUNUUy4KCiAgICAgICAgICAgIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SCiAgICAgICAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKICAgICAgICAgICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAgICAgICAgICAgIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSwgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTgogICAgICAgICAgICBPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwgVE9SVAogICAgICAgICAgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SIE9USEVSV0lTRSwgRVZFTiBJRiBBUFBMRSBIQVMgQkVFTgogICAgICAgICAgICBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKi8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgQ0FHdWFyZC5oCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiNpZiAhZGVmaW5lZChfX0NBR3VhcmRfaF9fKQojZGVmaW5lIF9fQ0FHdWFyZF9oX18KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIEluY2x1ZGVzCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2luY2x1ZGUgPENvcmVBdWRpby9Db3JlQXVkaW9UeXBlcy5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIENBR3VhcmQKICAKICAgIFRoaXMgaXMgeW91ciB0eXBpY2FsIG11dGV4IHdpdGggc2lnbmFsbGluZyBpbXBsZW1lbnRlZCB2aWEgcHRocmVhZHMuCiAgICBMb2NrKCkgd2lsbCByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ3VhcmQgaXMgbG9ja2VkIG9uIHRoYXQgY2FsbC4KICAgIEEgdGhyZWFkIHRoYXQgYWxyZWFkeSBoYXMgdGhlIGd1YXJkIHdpbGwgcmVjZWl2ZSAnZmFsc2UnIGlmIGl0IGxvY2tzIGl0CiAgICBhZ2Fpbi4gVXNlIG9mIHRoZSBzdGFjay1iYXNlZCBDQUd1YXJkOjpMb2NrZXIgY2xhc3MgaXMgaGlnaGx5IHJlY29tbWVuZGVkCiAgICB0byBwcm9wZXJseSBtYW5hZ2UgdGhlIHJlY3Vyc2l2ZSBuZXN0aW5nLiBUaGUgV2FpdCBjYWxscyB3aXRoIHRpbWVvdXRzCiAgICB3aWxsIHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB0aW1lb3V0IHBlcmlvZCBleHBpcmVkLiBUaGV5IHdpbGwKICAgIHJldHVybiBmYWxzZSBpZiB0aGV5IHJlY2VpdmUgbm90aWZpY2F0aW9uIGFueSBvdGhlciB3YXkuCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdHlwZWRlZiBzdHJ1Y3QgU19TRExPU1hDQUd1YXJkCnsKCi8qICBDb25zdHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24gKi8KLypwdWJsaWM6Ki8KLyogIEFjdGlvbnMgKi8KLypwdWJsaWM6Ki8KICAgIGludCAgICAgKCpMb2NrKShzdHJ1Y3QgU19TRExPU1hDQUd1YXJkICpjYWcpOwogICAgdm9pZCAgICAoKlVubG9jaykoc3RydWN0IFNfU0RMT1NYQ0FHdWFyZCAqY2FnKTsKICAgIGludCAgICAgKCpUcnkpKHN0cnVjdCBTX1NETE9TWENBR3VhcmQgKmNhZywgaW50ICpvdXRXYXNMb2NrZWQpOyAgICAvKiByZXR1cm5zIHRydWUgaWYgbG9jayBpcyBmcmVlLCBmYWxzZSBpZiBub3QgKi8KICAgIHZvaWQgICAgKCpXYWl0KShzdHJ1Y3QgU19TRExPU1hDQUd1YXJkICpjYWcpOwogICAgdm9pZCAgICAoKk5vdGlmeSkoc3RydWN0IFNfU0RMT1NYQ0FHdWFyZCAqY2FnKTsKCi8qICBJbXBsZW1lbnRhdGlvbiAqLwovKnByb3RlY3RlZDoqLwogICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKICAgIHB0aHJlYWRfY29uZF90ICBtQ29uZFZhcjsKICAgIHB0aHJlYWRfdCAgICAgICBtT3duZXI7Cn0gU0RMT1NYQ0FHdWFyZDsKClNETE9TWENBR3VhcmQgKm5ld19TRExPU1hDQUd1YXJkKHZvaWQpOwp2b2lkIGRlbGV0ZV9TRExPU1hDQUd1YXJkKFNETE9TWENBR3VhcmQgKmNhZyk7CgojZW5kaWYKCg==