LyoKICogQWxwaGEgcmVnaXN0ZXIgY29udGV4dCBzdXBwb3J0CiAqCiAqIENvcHlyaWdodCAoQykgMjAwNCBWaW5jZW50IELpcm9uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpZmRlZiBfX0FMUEhBX18KCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZmRlZiBIQVZFX1NZU19SRUdfSAojIGluY2x1ZGUgPHN5cy9yZWcuaD4KI2VuZGlmCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaWZkZWYgSEFWRV9TWVNfUFRSQUNFX0gKIyBpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CiNlbmRpZgoKI2luY2x1ZGUgImZpbGUuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAicmVxdWVzdC5oIgoKI2lmZGVmIEhBVkVfU1lTX1VTRVJfSAojIGluY2x1ZGUgPHN5cy91c2VyLmg+CiNlbmRpZgoKLyogdXNlciBkZWZpbml0aW9ucyBmcm9tIGFzbS91c2VyLmggKi8Kc3RydWN0IGtlcm5lbF91c2VyX3N0cnVjdAp7CiAgICB1bnNpZ25lZCBsb25nIHJlZ3NbRUZfU0laRS84KzMyXTsKICAgIHNpemVfdCB1X3RzaXplOwogICAgc2l6ZV90IHVfZHNpemU7CiAgICBzaXplX3QgdV9zc2l6ZTsKICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfY29kZTsKICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfZGF0YTsKICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfc3RhY2s7CiAgICBsb25nIGludCBzaWduYWw7CiAgICBzdHJ1Y3QgcmVncyAqIHVfYXIwOwogICAgdW5zaWduZWQgbG9uZyBtYWdpYzsKICAgIGNoYXIgdV9jb21tWzMyXTsKfTsKCi8qIGdldCB0aHJlYWQgY29udGV4dCAqLwpzdGF0aWMgdm9pZCBnZXRfdGhyZWFkX2NvbnRleHQoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgdW5zaWduZWQgaW50IGZsYWdzLCBDT05URVhUICpjb250ZXh0ICkKewogICAgaW50IHBpZCA9IGdldF9wdHJhY2VfcGlkKHRocmVhZCk7CiAgICBpZiAoZmxhZ3MgJiBDT05URVhUX0ZVTEwpCiAgICB7CiAgICAgICAgc3RydWN0IGtlcm5lbF91c2VyX3N0cnVjdCByZWdzOwogICAgICAgIGlmIChwdHJhY2UoIFBUUkFDRV9HRVRSRUdTLCBwaWQsIDAsICZyZWdzICkgPT0gLTEpIGdvdG8gZXJyb3I7CiAgICAgICAgaWYgKGZsYWdzICYgQ09OVEVYVF9JTlRFR0VSKQogICAgICAgIHsKICAgICAgICAgICAgY29udGV4dC0+SW50VjAgPSByZWdzLnJlZ3NbRUZfVjBdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUMCA9IHJlZ3MucmVnc1tFRl9UMF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQxID0gcmVncy5yZWdzW0VGX1QxXTsKICAgICAgICAgICAgY29udGV4dC0+SW50VDIgPSByZWdzLnJlZ3NbRUZfVDJdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUMyA9IHJlZ3MucmVnc1tFRl9UM107CiAgICAgICAgICAgIGNvbnRleHQtPkludFQ0ID0gcmVncy5yZWdzW0VGX1Q0XTsKICAgICAgICAgICAgY29udGV4dC0+SW50VDUgPSByZWdzLnJlZ3NbRUZfVDVdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUNiA9IHJlZ3MucmVnc1tFRl9UNl07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQ3ID0gcmVncy5yZWdzW0VGX1Q3XTsKICAgICAgICAgICAgY29udGV4dC0+SW50UzAgPSByZWdzLnJlZ3NbRUZfUzBdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRTMSA9IHJlZ3MucmVnc1tFRl9TMV07CiAgICAgICAgICAgIGNvbnRleHQtPkludFMyID0gcmVncy5yZWdzW0VGX1MyXTsKICAgICAgICAgICAgY29udGV4dC0+SW50UzMgPSByZWdzLnJlZ3NbRUZfUzNdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRTNCA9IHJlZ3MucmVnc1tFRl9TNF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFM1ID0gcmVncy5yZWdzW0VGX1M1XTsKICAgICAgICAgICAgY29udGV4dC0+SW50RnAgPSByZWdzLnJlZ3NbRUZfUzZdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRBMCA9IHJlZ3MucmVnc1tFRl9BMF07CiAgICAgICAgICAgIGNvbnRleHQtPkludEExID0gcmVncy5yZWdzW0VGX0ExXTsKICAgICAgICAgICAgY29udGV4dC0+SW50QTIgPSByZWdzLnJlZ3NbRUZfQTJdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRBMyA9IHJlZ3MucmVnc1tFRl9BM107CiAgICAgICAgICAgIGNvbnRleHQtPkludEE0ID0gcmVncy5yZWdzW0VGX0E0XTsKICAgICAgICAgICAgY29udGV4dC0+SW50QTUgPSByZWdzLnJlZ3NbRUZfQTVdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUOCA9IHJlZ3MucmVnc1tFRl9UOF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQ5ID0gcmVncy5yZWdzW0VGX1Q5XTsKICAgICAgICAgICAgY29udGV4dC0+SW50VDEwID0gcmVncy5yZWdzW0VGX1QxMF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFQxMSA9IHJlZ3MucmVnc1tFRl9UMTFdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRUMTIgPSByZWdzLnJlZ3NbRUZfVDEyXTsKICAgICAgICAgICAgY29udGV4dC0+SW50QXQgPSByZWdzLnJlZ3NbRUZfQVRdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRaZXJvID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGZsYWdzICYgQ09OVEVYVF9DT05UUk9MKQogICAgICAgIHsKICAgICAgICAgICAgY29udGV4dC0+SW50UmEgPSByZWdzLnJlZ3NbRUZfUkFdOwogICAgICAgICAgICBjb250ZXh0LT5JbnRHcCA9IHJlZ3MucmVnc1tFRl9HUF07CiAgICAgICAgICAgIGNvbnRleHQtPkludFNwID0gcmVncy5yZWdzW0VGX1NQXTsKICAgICAgICAgICAgY29udGV4dC0+RmlyID0gcmVncy5yZWdzW0VGX1BDXTsKICAgICAgICAgICAgY29udGV4dC0+UHNyID0gcmVncy5yZWdzW0VGX1BTXTsKICAgICAgICB9CiAgICAgICAgaWYgKGZsYWdzICYgQ09OVEVYVF9GTE9BVElOR19QT0lOVCkKICAgICAgICB7CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYwID0gcmVncy5yZWdzW0VGX1NJWkUvOCswXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjEgPSByZWdzLnJlZ3NbRUZfU0laRS84KzFdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMiA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMl07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYzID0gcmVncy5yZWdzW0VGX1NJWkUvOCszXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjQgPSByZWdzLnJlZ3NbRUZfU0laRS84KzRdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGNSA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrNV07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEY2ID0gcmVncy5yZWdzW0VGX1NJWkUvOCs2XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjcgPSByZWdzLnJlZ3NbRUZfU0laRS84KzddOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGOCA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrOF07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEY5ID0gcmVncy5yZWdzW0VGX1NJWkUvOCs5XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjEwID0gcmVncy5yZWdzW0VGX1NJWkUvOCsxMF07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYxMSA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMTFdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMTIgPSByZWdzLnJlZ3NbRUZfU0laRS84KzEyXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjEzID0gcmVncy5yZWdzW0VGX1NJWkUvOCsxM107CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYxNCA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMTRdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMTUgPSByZWdzLnJlZ3NbRUZfU0laRS84KzE1XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjE2ID0gcmVncy5yZWdzW0VGX1NJWkUvOCsxNl07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYxNyA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMTddOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMTggPSByZWdzLnJlZ3NbRUZfU0laRS84KzE4XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjE5ID0gcmVncy5yZWdzW0VGX1NJWkUvOCsxOV07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYyMCA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMjBdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMjEgPSByZWdzLnJlZ3NbRUZfU0laRS84KzIxXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjIyID0gcmVncy5yZWdzW0VGX1NJWkUvOCsyMl07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYyMyA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMjNdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMjQgPSByZWdzLnJlZ3NbRUZfU0laRS84KzI0XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjI1ID0gcmVncy5yZWdzW0VGX1NJWkUvOCsyNV07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYyNiA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMjZdOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMjcgPSByZWdzLnJlZ3NbRUZfU0laRS84KzI3XTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjI4ID0gcmVncy5yZWdzW0VGX1NJWkUvOCsyOF07CiAgICAgICAgICAgIGNvbnRleHQtPkZsdEYyOSA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMjldOwogICAgICAgICAgICBjb250ZXh0LT5GbHRGMzAgPSByZWdzLnJlZ3NbRUZfU0laRS84KzMwXTsKICAgICAgICAgICAgY29udGV4dC0+Rmx0RjMxID0gMDsKICAgICAgICAgICAgY29udGV4dC0+RnBjciA9IHJlZ3MucmVnc1tFRl9TSVpFLzgrMzFdOwogICAgICAgICAgICBjb250ZXh0LT5Tb2Z0RnBjciA9IDA7IC8qIEZJWE1FICovCiAgICAgICAgfQogICAgICAgIGNvbnRleHQtPkNvbnRleHRGbGFncyB8PSBmbGFncyAmIENPTlRFWFRfRlVMTDsKICAgIH0KICAgIHJldHVybjsKIGVycm9yOgogICAgZmlsZV9zZXRfZXJyb3IoKTsKfQoKLyogc2V0IGEgdGhyZWFkIGNvbnRleHQgKi8Kc3RhdGljIHZvaWQgc2V0X3RocmVhZF9jb250ZXh0KCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIHVuc2lnbmVkIGludCBmbGFncywgY29uc3QgQ09OVEVYVCAqY29udGV4dCApCnsKICAgIGludCBwaWQgPSBnZXRfcHRyYWNlX3BpZCh0aHJlYWQpOwogICAgaWYgKGZsYWdzICYgQ09OVEVYVF9GVUxMKQogICAgewogICAgICAgIHN0cnVjdCBrZXJuZWxfdXNlcl9zdHJ1Y3QgcmVnczsKICAgICAgICBpZiAocHRyYWNlKCBQVFJBQ0VfR0VUUkVHUywgcGlkLCAwLCAmcmVncyApID09IC0xKSBnb3RvIGVycm9yOwogICAgICAgIGlmIChmbGFncyAmIENPTlRFWFRfSU5URUdFUikKICAgICAgICB7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9WMF0gPSBjb250ZXh0LT5JbnRWMDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1QwXSA9IGNvbnRleHQtPkludFQwOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDFdID0gY29udGV4dC0+SW50VDE7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UMl0gPSBjb250ZXh0LT5JbnRUMjsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1QzXSA9IGNvbnRleHQtPkludFQzOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDRdID0gY29udGV4dC0+SW50VDQ7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UNV0gPSBjb250ZXh0LT5JbnRUNTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1Q2XSA9IGNvbnRleHQtPkludFQ2OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDddID0gY29udGV4dC0+SW50VDc7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TMF0gPSBjb250ZXh0LT5JbnRTMDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1MxXSA9IGNvbnRleHQtPkludFMxOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfUzJdID0gY29udGV4dC0+SW50UzI7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TM10gPSBjb250ZXh0LT5JbnRTMzsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1M0XSA9IGNvbnRleHQtPkludFM0OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfUzVdID0gY29udGV4dC0+SW50UzU7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TNl0gPSBjb250ZXh0LT5JbnRGcDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX0EwXSA9IGNvbnRleHQtPkludEEwOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfQTFdID0gY29udGV4dC0+SW50QTE7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9BMl0gPSBjb250ZXh0LT5JbnRBMjsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX0EzXSA9IGNvbnRleHQtPkludEEzOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfQTRdID0gY29udGV4dC0+SW50QTQ7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9BNV0gPSBjb250ZXh0LT5JbnRBNTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1Q4XSA9IGNvbnRleHQtPkludFQ4OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDldID0gY29udGV4dC0+SW50VDk7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9UMTBdID0gY29udGV4dC0+SW50VDEwOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfVDExXSA9IGNvbnRleHQtPkludFQxMTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1QxMl0gPSBjb250ZXh0LT5JbnRUMTI7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9BVF0gPSBjb250ZXh0LT5JbnRBdDsKICAgICAgICB9CiAgICAgICAgaWYgKGZsYWdzICYgQ09OVEVYVF9DT05UUk9MKQogICAgICAgIHsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1JBXSA9IGNvbnRleHQtPkludFJhOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfR1BdID0gY29udGV4dC0+SW50R3A7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TUF0gPSBjb250ZXh0LT5JbnRTcDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1BDXSA9IGNvbnRleHQtPkZpcjsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1BTXSA9IGNvbnRleHQtPlBzcjsKICAgICAgICB9CiAgICAgICAgaWYgKGZsYWdzICYgQ09OVEVYVF9GTE9BVElOR19QT0lOVCkKICAgICAgICB7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMF0gPSBjb250ZXh0LT5GbHRGMDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsxXSA9IGNvbnRleHQtPkZsdEYxOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzJdID0gY29udGV4dC0+Rmx0RjI7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrM10gPSBjb250ZXh0LT5GbHRGMzsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCs0XSA9IGNvbnRleHQtPkZsdEY0OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzVdID0gY29udGV4dC0+Rmx0RjU7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrNl0gPSBjb250ZXh0LT5GbHRGNjsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCs3XSA9IGNvbnRleHQtPkZsdEY3OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzhdID0gY29udGV4dC0+Rmx0Rjg7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrOV0gPSBjb250ZXh0LT5GbHRGOTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsxMF0gPSBjb250ZXh0LT5GbHRGMTA7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMTFdID0gY29udGV4dC0+Rmx0RjExOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzEyXSA9IGNvbnRleHQtPkZsdEYxMjsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsxM10gPSBjb250ZXh0LT5GbHRGMTM7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMTRdID0gY29udGV4dC0+Rmx0RjE0OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzE1XSA9IGNvbnRleHQtPkZsdEYxNTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsxNl0gPSBjb250ZXh0LT5GbHRGMTY7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMTddID0gY29udGV4dC0+Rmx0RjE3OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzE4XSA9IGNvbnRleHQtPkZsdEYxODsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsxOV0gPSBjb250ZXh0LT5GbHRGMTk7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMjBdID0gY29udGV4dC0+Rmx0RjIwOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzIxXSA9IGNvbnRleHQtPkZsdEYyMTsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsyMl0gPSBjb250ZXh0LT5GbHRGMjI7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMjNdID0gY29udGV4dC0+Rmx0RjIzOwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzI0XSA9IGNvbnRleHQtPkZsdEYyNDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsyNV0gPSBjb250ZXh0LT5GbHRGMjU7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMjZdID0gY29udGV4dC0+Rmx0RjI2OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzI3XSA9IGNvbnRleHQtPkZsdEYyNzsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCsyOF0gPSBjb250ZXh0LT5GbHRGMjg7CiAgICAgICAgICAgIHJlZ3MucmVnc1tFRl9TSVpFLzgrMjldID0gY29udGV4dC0+Rmx0RjI5OwogICAgICAgICAgICByZWdzLnJlZ3NbRUZfU0laRS84KzMwXSA9IGNvbnRleHQtPkZsdEYzMDsKICAgICAgICAgICAgcmVncy5yZWdzW0VGX1NJWkUvOCszMV0gPSBjb250ZXh0LT5GcGNyOwogICAgICAgIH0KICAgICAgICBpZiAocHRyYWNlKCBQVFJBQ0VfU0VUUkVHUywgcGlkLCAwLCAmcmVncyApID09IC0xKSBnb3RvIGVycm9yOwogICAgfQogICAgcmV0dXJuOwogZXJyb3I6CiAgICBmaWxlX3NldF9lcnJvcigpOwp9CgovKiBjb3B5IGEgY29udGV4dCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIHRoZSBmbGFncyAqLwpzdGF0aWMgdm9pZCBjb3B5X2NvbnRleHQoIENPTlRFWFQgKnRvLCBjb25zdCBDT05URVhUICpmcm9tLCB1bnNpZ25lZCBpbnQgZmxhZ3MgKQp7CiAgICBpZiAoZmxhZ3MgJiBDT05URVhUX0NPTlRST0wpCiAgICB7CiAgICAgICAgdG8tPkludFJhID0gZnJvbS0+SW50UmE7CiAgICAgICAgdG8tPkludEdwID0gZnJvbS0+SW50R3A7CiAgICAgICAgdG8tPkludFNwID0gZnJvbS0+SW50U3A7CiAgICAgICAgdG8tPkZpciA9IGZyb20tPkZpcjsKICAgICAgICB0by0+UHNyID0gZnJvbS0+UHNyOwogICAgfQogICAgaWYgKGZsYWdzICYgQ09OVEVYVF9JTlRFR0VSKQogICAgewogICAgICAgIHRvLT5JbnRWMCA9IGZyb20tPkludFYwOwogICAgICAgIHRvLT5JbnRUMCA9IGZyb20tPkludFQwOwogICAgICAgIHRvLT5JbnRUMSA9IGZyb20tPkludFQxOwogICAgICAgIHRvLT5JbnRUMiA9IGZyb20tPkludFQyOwogICAgICAgIHRvLT5JbnRUMyA9IGZyb20tPkludFQzOwogICAgICAgIHRvLT5JbnRUNCA9IGZyb20tPkludFQ0OwogICAgICAgIHRvLT5JbnRUNSA9IGZyb20tPkludFQ1OwogICAgICAgIHRvLT5JbnRUNiA9IGZyb20tPkludFQ2OwogICAgICAgIHRvLT5JbnRUNyA9IGZyb20tPkludFQ3OwogICAgICAgIHRvLT5JbnRTMCA9IGZyb20tPkludFMwOwogICAgICAgIHRvLT5JbnRTMSA9IGZyb20tPkludFMxOwogICAgICAgIHRvLT5JbnRTMiA9IGZyb20tPkludFMyOwogICAgICAgIHRvLT5JbnRTMyA9IGZyb20tPkludFMzOwogICAgICAgIHRvLT5JbnRTNCA9IGZyb20tPkludFM0OwogICAgICAgIHRvLT5JbnRTNSA9IGZyb20tPkludFM1OwogICAgICAgIHRvLT5JbnRGcCA9IGZyb20tPkludEZwOwogICAgICAgIHRvLT5JbnRBMCA9IGZyb20tPkludEEwOwogICAgICAgIHRvLT5JbnRBMSA9IGZyb20tPkludEExOwogICAgICAgIHRvLT5JbnRBMiA9IGZyb20tPkludEEyOwogICAgICAgIHRvLT5JbnRBMyA9IGZyb20tPkludEEzOwogICAgICAgIHRvLT5JbnRBNCA9IGZyb20tPkludEE0OwogICAgICAgIHRvLT5JbnRBNSA9IGZyb20tPkludEE1OwogICAgICAgIHRvLT5JbnRUOCA9IGZyb20tPkludFQ4OwogICAgICAgIHRvLT5JbnRUOSA9IGZyb20tPkludFQ5OwogICAgICAgIHRvLT5JbnRUMTAgPSBmcm9tLT5JbnRUMTA7CiAgICAgICAgdG8tPkludFQxMSA9IGZyb20tPkludFQxMTsKICAgICAgICB0by0+SW50VDEyID0gZnJvbS0+SW50VDEyOwogICAgICAgIHRvLT5JbnRBdCA9IGZyb20tPkludEF0OwogICAgICAgIHRvLT5JbnRaZXJvID0gZnJvbS0+SW50WmVybzsKICAgIH0KICAgIGlmIChmbGFncyAmIENPTlRFWFRfRkxPQVRJTkdfUE9JTlQpCiAgICB7CiAgICAgICAgdG8tPkZsdEYwID0gZnJvbS0+Rmx0RjA7CiAgICAgICAgdG8tPkZsdEYxID0gZnJvbS0+Rmx0RjE7CiAgICAgICAgdG8tPkZsdEYyID0gZnJvbS0+Rmx0RjI7CiAgICAgICAgdG8tPkZsdEYzID0gZnJvbS0+Rmx0RjM7CiAgICAgICAgdG8tPkZsdEY0ID0gZnJvbS0+Rmx0RjQ7CiAgICAgICAgdG8tPkZsdEY1ID0gZnJvbS0+Rmx0RjU7CiAgICAgICAgdG8tPkZsdEY2ID0gZnJvbS0+Rmx0RjY7CiAgICAgICAgdG8tPkZsdEY3ID0gZnJvbS0+Rmx0Rjc7CiAgICAgICAgdG8tPkZsdEY4ID0gZnJvbS0+Rmx0Rjg7CiAgICAgICAgdG8tPkZsdEY5ID0gZnJvbS0+Rmx0Rjk7CiAgICAgICAgdG8tPkZsdEYxMCA9IGZyb20tPkZsdEYxMDsKICAgICAgICB0by0+Rmx0RjExID0gZnJvbS0+Rmx0RjExOwogICAgICAgIHRvLT5GbHRGMTIgPSBmcm9tLT5GbHRGMTI7CiAgICAgICAgdG8tPkZsdEYxMyA9IGZyb20tPkZsdEYxMzsKICAgICAgICB0by0+Rmx0RjE0ID0gZnJvbS0+Rmx0RjE0OwogICAgICAgIHRvLT5GbHRGMTUgPSBmcm9tLT5GbHRGMTU7CiAgICAgICAgdG8tPkZsdEYxNiA9IGZyb20tPkZsdEYxNjsKICAgICAgICB0by0+Rmx0RjE3ID0gZnJvbS0+Rmx0RjE3OwogICAgICAgIHRvLT5GbHRGMTggPSBmcm9tLT5GbHRGMTg7CiAgICAgICAgdG8tPkZsdEYxOSA9IGZyb20tPkZsdEYxOTsKICAgICAgICB0by0+Rmx0RjIwID0gZnJvbS0+Rmx0RjIwOwogICAgICAgIHRvLT5GbHRGMjEgPSBmcm9tLT5GbHRGMjE7CiAgICAgICAgdG8tPkZsdEYyMiA9IGZyb20tPkZsdEYyMjsKICAgICAgICB0by0+Rmx0RjIzID0gZnJvbS0+Rmx0RjIzOwogICAgICAgIHRvLT5GbHRGMjQgPSBmcm9tLT5GbHRGMjQ7CiAgICAgICAgdG8tPkZsdEYyNSA9IGZyb20tPkZsdEYyNTsKICAgICAgICB0by0+Rmx0RjI2ID0gZnJvbS0+Rmx0RjI2OwogICAgICAgIHRvLT5GbHRGMjcgPSBmcm9tLT5GbHRGMjc7CiAgICAgICAgdG8tPkZsdEYyOCA9IGZyb20tPkZsdEYyODsKICAgICAgICB0by0+Rmx0RjI5ID0gZnJvbS0+Rmx0RjI5OwogICAgICAgIHRvLT5GbHRGMzAgPSBmcm9tLT5GbHRGMzA7CiAgICAgICAgdG8tPkZsdEYzMSA9IGZyb20tPkZsdEYzMTsKICAgICAgICB0by0+RnBjciA9IGZyb20tPkZwY3I7CiAgICAgICAgdG8tPlNvZnRGcGNyID0gZnJvbS0+U29mdEZwY3I7CiAgICB9CiAgICB0by0+Q29udGV4dEZsYWdzIHw9IGZsYWdzOwp9CgovKiByZXRyaWV2ZSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyIG9mIGEgdGhyZWFkICovCnZvaWQgKmdldF90aHJlYWRfaXAoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCnsKICAgIENPTlRFWFQgY29udGV4dDsKICAgIGNvbnRleHQuRmlyID0gMDsKICAgIGlmIChzdXNwZW5kX2Zvcl9wdHJhY2UoIHRocmVhZCApKQogICAgewogICAgICAgIGdldF90aHJlYWRfY29udGV4dCggdGhyZWFkLCBDT05URVhUX0NPTlRST0wsICZjb250ZXh0ICk7CiAgICAgICAgcmVzdW1lX2FmdGVyX3B0cmFjZSggdGhyZWFkICk7CiAgICB9CiAgICByZXR1cm4gKHZvaWQgKiljb250ZXh0LkZpcjsKfQoKLyogZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBjb250aW51ZSB0aGUgdGhyZWFkIGluIHNpbmdsZS1zdGVwIG1vZGUgKi8KaW50IGdldF90aHJlYWRfc2luZ2xlX3N0ZXAoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCnsKICAgIHJldHVybiAwOyAgLyogRklYTUUgKi8KfQoKLyogc2VuZCBhIHNpZ25hbCB0byBhIHNwZWNpZmljIHRocmVhZCAqLwppbnQgdGtpbGwoIGludCBwaWQsIGludCBzaWcgKQp7CiAgICAvKiBGSVhNRTogc2hvdWxkIGRvIHNvbWV0aGluZyBoZXJlICovCiAgICBlcnJubyA9IEVOT1NZUzsKICAgIHJldHVybiAtMTsKfQoKLyogcmV0cmlldmUgdGhlIHRocmVhZCBjb250ZXh0ICovCnZvaWQgZ2V0X3RocmVhZF9jb250ZXh0KCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIENPTlRFWFQgKmNvbnRleHQsIHVuc2lnbmVkIGludCBmbGFncyApCnsKICAgIGNvbnRleHQtPkNvbnRleHRGbGFncyB8PSBDT05URVhUX0FMUEhBOwogICAgZmxhZ3MgJj0gfkNPTlRFWFRfQUxQSEE7ICAvKiBnZXQgcmlkIG9mIENQVSBpZCAqLwoKICAgIGlmICh0aHJlYWQtPmNvbnRleHQpICAvKiB0aHJlYWQgaXMgaW5zaWRlIGFuIGV4Y2VwdGlvbiBldmVudCBvciBzdXNwZW5kZWQgKi8KICAgIHsKICAgICAgICBjb3B5X2NvbnRleHQoIGNvbnRleHQsIHRocmVhZC0+Y29udGV4dCwgZmxhZ3MgKTsKICAgIH0KICAgIGVsc2UgaWYgKGZsYWdzICYmIHN1c3BlbmRfZm9yX3B0cmFjZSggdGhyZWFkICkpCiAgICB7CiAgICAgICAgZ2V0X3RocmVhZF9jb250ZXh0X3B0cmFjZSggdGhyZWFkLCBmbGFncywgY29udGV4dCApOwogICAgICAgIHJlc3VtZV9hZnRlcl9wdHJhY2UoIHRocmVhZCApOwogICAgfQp9CgovKiBzZXQgdGhlIHRocmVhZCBjb250ZXh0ICovCnZvaWQgc2V0X3RocmVhZF9jb250ZXh0KCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIGNvbnN0IENPTlRFWFQgKmNvbnRleHQsIHVuc2lnbmVkIGludCBmbGFncyApCnsKICAgIGZsYWdzICY9IH5DT05URVhUX0FMUEhBOyAgLyogZ2V0IHJpZCBvZiBDUFUgaWQgKi8KCiAgICBpZiAodGhyZWFkLT5jb250ZXh0KSAgLyogdGhyZWFkIGlzIGluc2lkZSBhbiBleGNlcHRpb24gZXZlbnQgb3Igc3VzcGVuZGVkICovCiAgICB7CiAgICAgICAgY29weV9jb250ZXh0KCB0aHJlYWQtPmNvbnRleHQsIGNvbnRleHQsIGZsYWdzICk7CiAgICB9CiAgICBlbHNlIGlmIChmbGFncyAmJiBzdXNwZW5kX2Zvcl9wdHJhY2UoIHRocmVhZCApKQogICAgewogICAgICAgIHNldF90aHJlYWRfY29udGV4dF9wdHJhY2UoIHRocmVhZCwgZmxhZ3MsIGNvbnRleHQgKTsKICAgICAgICByZXN1bWVfYWZ0ZXJfcHRyYWNlKCB0aHJlYWQgKTsKICAgIH0KfQoKI2VuZGlmICAvKiBfX0FMUEhBX18gKi8K