LyoKICogQ29weXJpZ2h0IKkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgogKiBJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCiAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICogQXV0aG9yczoKICogICAgWGlhbmcgSGFpaGFvIDxoYWloYW8ueGlhbmdAaW50ZWwuY29tPgogKiAgICBab3UgTmFuIGhhaSA8bmFuaGFpLnpvdUBpbnRlbC5jb20+CiAqCiAqLwoKI2lmbmRlZiBfSTk2NV9EUlZfVklERU9fSF8KI2RlZmluZSBfSTk2NV9EUlZfVklERU9fSF8KCiNpbmNsdWRlIDx2YS92YS5oPgojaW5jbHVkZSA8dmEvdmFfYmFja2VuZC5oPgoKI2luY2x1ZGUgIm9iamVjdF9oZWFwLmgiCgojaW5jbHVkZSAiaW50ZWxfZHJpdmVyLmgiCgojaW5jbHVkZSAiaTk2NV9tZWRpYS5oIgojaW5jbHVkZSAiaTk2NV9yZW5kZXIuaCIKCiNkZWZpbmUgSTk2NV9NQVhfUFJPRklMRVMgICAgICAgICAgICAgICAgICAgICAgIDExCiNkZWZpbmUgSTk2NV9NQVhfRU5UUllQT0lOVFMgICAgICAgICAgICAgICAgICAgIDUKI2RlZmluZSBJOTY1X01BWF9DT05GSUdfQVRUUklCVVRFUyAgICAgICAgICAgICAgMTAKI2RlZmluZSBJOTY1X01BWF9JTUFHRV9GT1JNQVRTICAgICAgICAgICAgICAgICAgMTAKI2RlZmluZSBJOTY1X01BWF9TVUJQSUNfRk9STUFUUyAgICAgICAgICAgICAgICAgMgojZGVmaW5lIEk5NjVfTUFYX0RJU1BMQVlfQVRUUklCVVRFUyAgICAgICAgICAgICA0CiNkZWZpbmUgSTk2NV9TVFJfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgICJpOTY1IERyaXZlciAwLjEiCgpzdHJ1Y3QgYnVmZmVyX3N0b3JlCnsKICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKICAgIGRyaV9ibyAqYm87CiAgICBpbnQgcmVmX2NvdW50Owp9OwogICAgCnN0cnVjdCBvYmplY3RfY29uZmlnIAp7CiAgICBzdHJ1Y3Qgb2JqZWN0X2Jhc2UgYmFzZTsKICAgIFZBUHJvZmlsZSBwcm9maWxlOwogICAgVkFFbnRyeXBvaW50IGVudHJ5cG9pbnQ7CiAgICBWQUNvbmZpZ0F0dHJpYiBhdHRyaWJfbGlzdFtJOTY1X01BWF9DT05GSUdfQVRUUklCVVRFU107CiAgICBpbnQgbnVtX2F0dHJpYnM7Cn07CgpzdHJ1Y3QgZGVjb2RlX3N0YXRlCnsKICAgIHN0cnVjdCBidWZmZXJfc3RvcmUgKnBpY19wYXJhbTsKICAgIHN0cnVjdCBidWZmZXJfc3RvcmUgKnNsaWNlX3BhcmFtOwogICAgc3RydWN0IGJ1ZmZlcl9zdG9yZSAqaXFfbWF0cml4OwogICAgc3RydWN0IGJ1ZmZlcl9zdG9yZSAqYml0X3BsYW5lOwogICAgc3RydWN0IGJ1ZmZlcl9zdG9yZSAqc2xpY2VfZGF0YTsKICAgIFZBU3VyZmFjZUlEIGN1cnJlbnRfcmVuZGVyX3RhcmdldDsKICAgIGludCBudW1fc2xpY2VzOwp9OwoKc3RydWN0IG9iamVjdF9jb250ZXh0IAp7CiAgICBzdHJ1Y3Qgb2JqZWN0X2Jhc2UgYmFzZTsKICAgIFZBQ29udGV4dElEIGNvbnRleHRfaWQ7CiAgICBWQUNvbmZpZ0lEIGNvbmZpZ19pZDsKICAgIFZBU3VyZmFjZUlEICpyZW5kZXJfdGFyZ2V0czsKICAgIGludCBudW1fcmVuZGVyX3RhcmdldHM7CiAgICBpbnQgcGljdHVyZV93aWR0aDsKICAgIGludCBwaWN0dXJlX2hlaWdodDsKICAgIGludCBmbGFnczsKICAgIHN0cnVjdCBkZWNvZGVfc3RhdGUgZGVjb2RlX3N0YXRlOwp9OwoKc3RydWN0IG9iamVjdF9zdXJmYWNlIAp7CiAgICBzdHJ1Y3Qgb2JqZWN0X2Jhc2UgYmFzZTsKICAgIFZBU3VyZmFjZVN0YXR1cyBzdGF0dXM7CiAgICBWQVN1YnBpY3R1cmVJRCBzdWJwaWM7CiAgICBpbnQgd2lkdGg7CiAgICBpbnQgaGVpZ2h0OwogICAgaW50IHNpemU7CiAgICBkcmlfYm8gKmJvOwp9OwoKc3RydWN0IG9iamVjdF9idWZmZXIgCnsKICAgIHN0cnVjdCBvYmplY3RfYmFzZSBiYXNlOwogICAgc3RydWN0IGJ1ZmZlcl9zdG9yZSAqYnVmZmVyX3N0b3JlOwogICAgaW50IG1heF9udW1fZWxlbWVudHM7CiAgICBpbnQgbnVtX2VsZW1lbnRzOwogICAgaW50IHNpemVfZWxlbWVudDsKICAgIFZBQnVmZmVyVHlwZSB0eXBlOwp9OwoKc3RydWN0IG9iamVjdF9pbWFnZSAKewogICAgc3RydWN0IG9iamVjdF9iYXNlIGJhc2U7CiAgICBWQUltYWdlIGltYWdlOwogICAgZHJpX2JvICpibzsKICAgIHVuc2lnbmVkIGludCAqcGFsZXR0ZTsKfTsKCnN0cnVjdCBvYmplY3Rfc3VicGljIAp7CiAgICBzdHJ1Y3Qgb2JqZWN0X2Jhc2UgYmFzZTsKICAgIFZBSW1hZ2VJRCBpbWFnZTsKICAgIFZBUmVjdGFuZ2xlIHNyY19yZWN0OwogICAgVkFSZWN0YW5nbGUgZHN0X3JlY3Q7CiAgICB1bnNpZ25lZCBpbnQgZm9ybWF0OwogICAgaW50IHdpZHRoOwogICAgaW50IGhlaWdodDsKICAgIGRyaV9ibyAqYm87Cn07CgoKCnN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhIAp7CiAgICBzdHJ1Y3QgaW50ZWxfZHJpdmVyX2RhdGEgaW50ZWw7CiAgICBzdHJ1Y3Qgb2JqZWN0X2hlYXAgY29uZmlnX2hlYXA7CiAgICBzdHJ1Y3Qgb2JqZWN0X2hlYXAgY29udGV4dF9oZWFwOwogICAgc3RydWN0IG9iamVjdF9oZWFwIHN1cmZhY2VfaGVhcDsKICAgIHN0cnVjdCBvYmplY3RfaGVhcCBidWZmZXJfaGVhcDsKICAgIHN0cnVjdCBvYmplY3RfaGVhcCBpbWFnZV9oZWFwOwogICAgc3RydWN0IG9iamVjdF9oZWFwIHN1YnBpY19oZWFwOwogICAgc3RydWN0IGk5NjVfbWVkaWFfc3RhdGUgbWVkaWFfc3RhdGU7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgcmVuZGVyX3N0YXRlOwp9OwoKI2RlZmluZSBORVdfQ09ORklHX0lEKCkgb2JqZWN0X2hlYXBfYWxsb2NhdGUoJmk5NjUtPmNvbmZpZ19oZWFwKTsKI2RlZmluZSBORVdfQ09OVEVYVF9JRCgpIG9iamVjdF9oZWFwX2FsbG9jYXRlKCZpOTY1LT5jb250ZXh0X2hlYXApOwojZGVmaW5lIE5FV19TVVJGQUNFX0lEKCkgb2JqZWN0X2hlYXBfYWxsb2NhdGUoJmk5NjUtPnN1cmZhY2VfaGVhcCk7CiNkZWZpbmUgTkVXX0JVRkZFUl9JRCgpIG9iamVjdF9oZWFwX2FsbG9jYXRlKCZpOTY1LT5idWZmZXJfaGVhcCk7CiNkZWZpbmUgTkVXX0lNQUdFX0lEKCkgb2JqZWN0X2hlYXBfYWxsb2NhdGUoJmk5NjUtPmltYWdlX2hlYXApOwojZGVmaW5lIE5FV19TVUJQSUNfSUQoKSBvYmplY3RfaGVhcF9hbGxvY2F0ZSgmaTk2NS0+c3VicGljX2hlYXApOwoKI2RlZmluZSBDT05GSUcoaWQpICgoc3RydWN0IG9iamVjdF9jb25maWcgKilvYmplY3RfaGVhcF9sb29rdXAoJmk5NjUtPmNvbmZpZ19oZWFwLCBpZCkpCiNkZWZpbmUgQ09OVEVYVChpZCkgKChzdHJ1Y3Qgb2JqZWN0X2NvbnRleHQgKilvYmplY3RfaGVhcF9sb29rdXAoJmk5NjUtPmNvbnRleHRfaGVhcCwgaWQpKQojZGVmaW5lIFNVUkZBQ0UoaWQpICgoc3RydWN0IG9iamVjdF9zdXJmYWNlICopb2JqZWN0X2hlYXBfbG9va3VwKCZpOTY1LT5zdXJmYWNlX2hlYXAsIGlkKSkKI2RlZmluZSBCVUZGRVIoaWQpICgoc3RydWN0IG9iamVjdF9idWZmZXIgKilvYmplY3RfaGVhcF9sb29rdXAoJmk5NjUtPmJ1ZmZlcl9oZWFwLCBpZCkpCiNkZWZpbmUgSU1BR0UoaWQpICgoc3RydWN0IG9iamVjdF9pbWFnZSAqKW9iamVjdF9oZWFwX2xvb2t1cCgmaTk2NS0+aW1hZ2VfaGVhcCwgaWQpKQojZGVmaW5lIFNVQlBJQyhpZCkgKChzdHJ1Y3Qgb2JqZWN0X3N1YnBpYyAqKW9iamVjdF9oZWFwX2xvb2t1cCgmaTk2NS0+c3VicGljX2hlYXAsIGlkKSkKCiNkZWZpbmUgRk9VUkNDX0lBNDQgMHgzNDM0NDE0OQojZGVmaW5lIEZPVVJDQ19BSTQ0IDB4MzQzNDQ5NDEKCiNkZWZpbmUgU1RSSURFKHcpICAgICAgICAgICAgICAgKCgodykgKyAweGYpICYgfjB4ZikKI2RlZmluZSBTSVpFX1lVVjQyMCh3LCBoKSAgICAgICAoaCAqIChTVFJJREUodykgKyBTVFJJREUodyA+PiAxKSkpCgpzdGF0aWMgSU5MSU5FIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICoKaTk2NV9kcml2ZXJfZGF0YShWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgcmV0dXJuIChzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqKShjdHgtPnBEcml2ZXJEYXRhKTsKfQoKI2VuZGlmIC8qIF9JOTY1X0RSVl9WSURFT19IXyAqLwo=