LyogJFhGcmVlODYkICovIC8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogMyAtKi0gKi8KLyoKICogQ29weXJpZ2h0IDIwMDAgR2FyZXRoIEh1Z2hlcwogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIEdBUkVUSCBIVUdIRVMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCiAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCiAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqLwoKLyoKICogQXV0aG9yczoKICoJR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgogKglMZWlmIERlbGdhc3MgPGxkZWxnYXNzQHJldGluYWxidXJuLm5ldD4KICoJSm9z6SBGb25zZWNhIDxqX3JfZm9uc2VjYUB5YWhvby5jby51az4KICovCgojaW5jbHVkZSAibWFjaDY0X2NvbnRleHQuaCIKI2luY2x1ZGUgIm1hY2g2NF9pb2N0bC5oIgojaW5jbHVkZSAibWFjaDY0X3N0YXRlLmgiCiNpbmNsdWRlICJtYWNoNjRfdmIuaCIKI2luY2x1ZGUgIm1hY2g2NF9kZC5oIgoKI2luY2x1ZGUgImNvbnRleHQuaCIKI2luY2x1ZGUgInV0aWxzLmgiCiNpbmNsdWRlICJmcmFtZWJ1ZmZlci5oIgoKI2RlZmluZSBEUklWRVJfREFURQkiMjAwNTEwMTkiCgovKiBSZXR1cm4gdGhlIGN1cnJlbnQgY29sb3IgYnVmZmVyIHNpemUuCiAqLwpzdGF0aWMgdm9pZCBtYWNoNjREREdldEJ1ZmZlclNpemUoIEdMZnJhbWVidWZmZXIgKmJ1ZmZlciwKCQkJCSAgIEdMdWludCAqd2lkdGgsIEdMdWludCAqaGVpZ2h0ICkKewogICBHRVRfQ1VSUkVOVF9DT05URVhUKGN0eCk7CiAgIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgPSBNQUNINjRfQ09OVEVYVChjdHgpOwoKICAgTE9DS19IQVJEV0FSRSggbW1lc2EgKTsKICAgKndpZHRoICA9IG1tZXNhLT5kcmlEcmF3YWJsZS0+dzsKICAgKmhlaWdodCA9IG1tZXNhLT5kcmlEcmF3YWJsZS0+aDsKICAgVU5MT0NLX0hBUkRXQVJFKCBtbWVzYSApOwp9CgovKiBSZXR1cm4gdmFyaW91cyBzdHJpbmdzIGZvciBnbEdldFN0cmluZygpLgogKi8Kc3RhdGljIGNvbnN0IEdMdWJ5dGUgKm1hY2g2NERER2V0U3RyaW5nKCBHTGNvbnRleHQgKmN0eCwgR0xlbnVtIG5hbWUgKQp7CiAgIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgPSBNQUNINjRfQ09OVEVYVChjdHgpOwogICBzdGF0aWMgY2hhciBidWZmZXJbMTI4XTsKICAgdW5zaWduZWQgICBvZmZzZXQ7CiAgIGNvbnN0IGNoYXIgKiBjYXJkX25hbWUgPSAiTWFjaDY0IFtSYWdlIFByb10iOwogICBHTHVpbnQgYWdwX21vZGUgPSBtbWVzYS0+bWFjaDY0U2NyZWVuLT5Jc1BDSSA/IDAgOgogICAgICBtbWVzYS0+bWFjaDY0U2NyZWVuLT5BR1BNb2RlOwoKICAgc3dpdGNoICggbmFtZSApIHsKICAgY2FzZSBHTF9WRU5ET1I6CiAgICAgIHJldHVybiAoR0x1Ynl0ZSopIkdhcmV0aCBIdWdoZXMsIExlaWYgRGVsZ2FzcywgSm9z6SBGb25zZWNhIjsKCiAgIGNhc2UgR0xfUkVOREVSRVI6CiAKICAgICAgb2Zmc2V0ID0gZHJpR2V0UmVuZGVyZXJTdHJpbmcoIGJ1ZmZlciwgY2FyZF9uYW1lLCBEUklWRVJfREFURSwKCQkJCSAgICAgYWdwX21vZGUgKTsKICAgICAgcmV0dXJuIChHTHVieXRlICopYnVmZmVyOwoKICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIE5VTEw7CiAgIH0KfQoKLyogU2VuZCBhbGwgY29tbWFuZHMgdG8gdGhlIGhhcmR3YXJlLiAgSWYgdmVydGV4IGJ1ZmZlcnMgb3IgaW5kaXJlY3QKICogYnVmZmVycyBhcmUgaW4gdXNlLCB0aGVuIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHNlbnQgdG8gdGhlCiAqIGhhcmR3YXJlLiAgQWxsIGNvbW1hbmRzIHRoYXQgYXJlIG5vcm1hbGx5IHNlbnQgdG8gdGhlIHJpbmcgYXJlCiAqIGFscmVhZHkgY29uc2lkZXJlZCBgZmx1c2hlZCcuCiAqLwpzdGF0aWMgdm9pZCBtYWNoNjREREZsdXNoKCBHTGNvbnRleHQgKmN0eCApCnsKICAgbWFjaDY0Q29udGV4dFB0ciBtbWVzYSA9IE1BQ0g2NF9DT05URVhUKGN0eCk7CgogICBMT0NLX0hBUkRXQVJFKCBtbWVzYSApOwogICBGTFVTSF9ETUFfTE9DS0VEKCBtbWVzYSApOwogICBVTkxPQ0tfSEFSRFdBUkUoIG1tZXNhICk7CgojaWYgRU5BQkxFX1BFUkZfQk9YRVMKICAgaWYgKCBtbWVzYS0+Ym94ZXMgKSB7CiAgICAgIExPQ0tfSEFSRFdBUkUoIG1tZXNhICk7CiAgICAgIG1hY2g2NFBlcmZvcm1hbmNlQm94ZXNMb2NrZWQoIG1tZXNhICk7CiAgICAgIFVOTE9DS19IQVJEV0FSRSggbW1lc2EgKTsKICAgfQoKICAgLyogTG9nIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVycyBpZiBuZWNlc3NhcnkgKi8KICAgbWFjaDY0UGVyZm9ybWFuY2VDb3VudGVycyggbW1lc2EgKTsKI2VuZGlmCn0KCi8qIE1ha2Ugc3VyZSBhbGwgY29tbWFuZHMgaGF2ZSBiZWVuIHNlbnQgdG8gdGhlIGhhcmR3YXJlIGFuZCBoYXZlCiAqIGNvbXBsZXRlZCBwcm9jZXNzaW5nLgogKi8Kc3RhdGljIHZvaWQgbWFjaDY0RERGaW5pc2goIEdMY29udGV4dCAqY3R4ICkKewogICBtYWNoNjRDb250ZXh0UHRyIG1tZXNhID0gTUFDSDY0X0NPTlRFWFQoY3R4KTsKCiNpZiBFTkFCTEVfUEVSRl9CT1hFUwogICAvKiBCdW1wIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVyICovCiAgIG1tZXNhLT5jX2RyYXdXYWl0cysrOwojZW5kaWYKCiAgIG1hY2g2NERERmx1c2goIGN0eCApOwogICBtYWNoNjRXYWl0Rm9ySWRsZSggbW1lc2EgKTsKfQoKLyogSW5pdGlhbGl6ZSB0aGUgZHJpdmVyJ3MgbWlzYyBmdW5jdGlvbnMuCiAqLwp2b2lkIG1hY2g2NEluaXREcml2ZXJGdW5jcyggc3RydWN0IGRkX2Z1bmN0aW9uX3RhYmxlICpmdW5jdGlvbnMgKQp7CiAgIGZ1bmN0aW9ucy0+R2V0QnVmZmVyU2l6ZQk9IG1hY2g2NERER2V0QnVmZmVyU2l6ZTsKICAgZnVuY3Rpb25zLT5HZXRTdHJpbmcJPSBtYWNoNjREREdldFN0cmluZzsKICAgZnVuY3Rpb25zLT5GaW5pc2gJCT0gbWFjaDY0RERGaW5pc2g7CiAgIGZ1bmN0aW9ucy0+Rmx1c2gJCT0gbWFjaDY0RERGbHVzaDsKCn0K