LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qCiAqIHNubXB1c20uYwogKgogKiBSb3V0aW5lcyB0byBtYW5pcHVsYXRlIGEgaW5mb3JtYXRpb24gYWJvdXQgYSAidXNlciIgYXMKICogZGVmaW5lZCBieSB0aGUgU05NUC1VU0VSLUJBU0VELVNNLU1JQiBNSUIuCiAqCiAqIEFsbCBmdW5jdGlvbnMgdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV8qKCkgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEKICogb3RoZXJ3aXNlLgogKgogKiAhISBUYWIgc3RvcHMgc2V0IHRvIDQgaW4gc29tZSBwYXJ0cyBvZiB0aGlzIGZpbGUuICEhCiAqICAgIChEZXNpZ25hdGVkIG9uIGEgcGVyIGZ1bmN0aW9uLikKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaWZkZWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZiBIQVZFX0RNQUxMT0NfSAojaW5jbHVkZSA8ZG1hbGxvYy5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC90eXBlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvb3V0cHV0X2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvY29uZmlnX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvdXRpbGl0aWVzLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9hc24xLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2NhbGxiYWNrLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3Rvb2xzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2tleXRvb2xzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXB2My5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9sY2RfdGltZS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zY2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9jYWxsYmFjay5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX3NlY21vZC5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wdXNtLmg+CgpvaWQgICAgICAgICAgICAgdXNtTm9BdXRoUHJvdG9jb2xbMTBdID0geyAxLCAzLCA2LCAxLCA2LCAzLCAxMCwgMSwgMSwgMSB9OwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NRDUKb2lkICAgICAgICAgICAgIHVzbUhNQUNNRDVBdXRoUHJvdG9jb2xbMTBdID0KICAgIHsgMSwgMywgNiwgMSwgNiwgMywgMTAsIDEsIDEsIDIgfTsKI2VuZGlmCm9pZCAgICAgICAgICAgICB1c21ITUFDU0hBMUF1dGhQcm90b2NvbFsxMF0gPQogICAgeyAxLCAzLCA2LCAxLCA2LCAzLCAxMCwgMSwgMSwgMyB9OwpvaWQgICAgICAgICAgICAgdXNtTm9Qcml2UHJvdG9jb2xbMTBdID0geyAxLCAzLCA2LCAxLCA2LCAzLCAxMCwgMSwgMiwgMSB9OwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKb2lkICAgICAgICAgICAgIHVzbURFU1ByaXZQcm90b2NvbFsxMF0gPSB7IDEsIDMsIDYsIDEsIDYsIDMsIDEwLCAxLCAyLCAyIH07CiNlbmRpZgpvaWQgICAgICAgICAgICAgdXNtQUVTUHJpdlByb3RvY29sWzEwXSA9IHsgMSwgMywgNiwgMSwgNiwgMywgMTAsIDEsIDIsIDQgfTsKLyogYmFja3dhcmRzIGNvbXBhdCAqLwpvaWQgICAgICAgICAgICAgKnVzbUFFUzEyOFByaXZQcm90b2NvbCA9IHVzbUFFU1ByaXZQcm90b2NvbDsKCnN0YXRpYyB1X2ludCAgICBkdW1teV9ldGltZSwgZHVtbXlfZWJvb3Q7ICAgICAgIC8qIEZvciBJU0VOR0lORUtOT1dOKCkuICovCgovKgogKiBHbG9iYWxzLgogKi8Kc3RhdGljIHVfaW50ICAgIHNhbHRfaW50ZWdlcjsKI2lmZGVmIEhBVkVfQUVTCnN0YXRpYyB1X2ludCAgICBzYWx0X2ludGVnZXI2NF8xLCBzYWx0X2ludGVnZXI2NF8yOwojZW5kaWYKICAgICAgICAvKgogICAgICAgICAqIDEvMiBvZiBzZWVkIGZvciB0aGUgc2FsdC4gICBDZi4gUkZDMjI3NCwgU2VjdCA4LjEuMS4xLgogICAgICAgICAqLwoKc3RhdGljIHN0cnVjdCB1c21Vc2VyICpub05hbWVVc2VyID0gTlVMTDsKLyoKICogTG9jYWwgc3RvcmFnZSAoTENEKSBvZiB0aGUgZGVmYXVsdCB1c2VyIGxpc3QuCiAqLwpzdGF0aWMgc3RydWN0IHVzbVVzZXIgKnVzZXJMaXN0ID0gTlVMTDsKCi8qCiAqIFByb3RvdHlwZXMKICovCmludAogICAgICAgICAgICAgICAgdXNtX2NoZWNrX3NlY0xldmVsX3ZzX3Byb3RvY29scyhpbnQgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIGF1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQgYXV0aFByb3RvY29sTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBwcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50IHByaXZQcm90b2NvbExlbik7CmludAogICAgICAgICAgICAgICAgdXNtX2NhbGNfb2Zmc2V0cyhzaXplX3QgZ2xvYmFsRGF0YUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlY0xldmVsLCBzaXplX3Qgc2VjRW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzZWNOYW1lTGVuLCBzaXplX3Qgc2NvcGVkUGR1TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2xvbmcgZW5naW5lYm9vdHMsIGxvbmcgZW5naW5lX3RpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHRoZVRvdGFsTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBhdXRoUGFyYW1zT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBwcml2UGFyYW1zT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBkYXRhT2Zmc2V0LCBzaXplX3QgKiBkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBtc2dBdXRoUGFybUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogbXNnUHJpdlBhcm1MZW4sIHNpemVfdCAqIG90c3RsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNlcV9sZW4sIHNpemVfdCAqIG1zZ1NlY1Bhcm1MZW4pOwovKgogKiBTZXQgYSBnaXZlbiBmaWVsZCBvZiB0aGUgc2VjU3RhdGVSZWYuCiAqCiAqIEFsbG9jYXRlIDxsZW4+IGJ5dGVzIGZvciB0eXBlIDx0eXBlPiBwb2ludGVkIHRvIGJ5IHJlZi0+PGZpZWxkPi4KICogVGhlbiBjb3B5IGluIDxpdGVtPiBhbmQgcmVjb3JkIGl0cyBsZW5ndGggaW4gcmVmLT48ZmllbGRfbGVuPi4KICoKICogUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgogKi8KI2RlZmluZSBNQUtFX0VOVFJZKCB0eXBlLCBpdGVtLCBsZW4sIGZpZWxkLCBmaWVsZF9sZW4gKQkJCVwKewkJCQkJCQkJCVwKCWlmIChyZWYgPT0gTlVMTCkJCQkJCQlcCgkJcmV0dXJuIC0xOwkJCQkJCVwKCWlmIChyZWYtPmZpZWxkICE9IE5VTEwpCXsJCQkJCVwKCQlTTk1QX1pFUk8ocmVmLT5maWVsZCwgcmVmLT5maWVsZF9sZW4pOwkJCVwKCQlTTk1QX0ZSRUUocmVmLT5maWVsZCk7CQkJCQlcCgl9CQkJCQkJCQlcCglyZWYtPmZpZWxkX2xlbiA9IDA7CQkJCQkJXAogICAgICAgIGlmIChsZW4gPT0gMCB8fCBpdGVtID09IE5VTEwpIHsJCQkJCVwKCQlyZXR1cm4gMDsJCQkJCQlcCgl9CQkJCQkgCQkJXAoJaWYgKChyZWYtPmZpZWxkID0gKHR5cGUqKSBtYWxsb2MgKGxlbiAqIHNpemVvZih0eXBlKSkpID09IE5VTEwpCVwKCXsJCQkJCQkJCVwKCQlyZXR1cm4gLTE7CQkJCQkJXAoJfQkJCQkJCQkJXAoJCQkJCQkJCQlcCgltZW1jcHkgKHJlZi0+ZmllbGQsIGl0ZW0sIGxlbiAqIHNpemVvZih0eXBlKSk7CQkJXAoJcmVmLT5maWVsZF9sZW4gPSBsZW47CQkJCQkJXAoJCQkJCQkJCQlcCglyZXR1cm4gMDsJCQkJCQkJXAp9CgoKc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICoKdXNtX21hbGxvY191c21TdGF0ZVJlZmVyZW5jZSh2b2lkKQp7CiAgICBzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKnJldHZhbCA9IChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKikKICAgICAgICBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSkpOwoKICAgIHJldHVybiByZXR2YWw7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9tYWxsb2NfdXNtU3RhdGVSZWZlcmVuY2UoKSAqLwoKCnZvaWQKdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uodm9pZCAqb2xkKQp7CiAgICBzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKm9sZF9yZWYgPSAoc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICopIG9sZDsKCiAgICBpZiAob2xkX3JlZikgewoKICAgICAgICBTTk1QX0ZSRUUob2xkX3JlZi0+dXNyX25hbWUpOwogICAgICAgIFNOTVBfRlJFRShvbGRfcmVmLT51c3JfZW5naW5lX2lkKTsKICAgICAgICBTTk1QX0ZSRUUob2xkX3JlZi0+dXNyX2F1dGhfcHJvdG9jb2wpOwogICAgICAgIFNOTVBfRlJFRShvbGRfcmVmLT51c3JfcHJpdl9wcm90b2NvbCk7CgogICAgICAgIGlmIChvbGRfcmVmLT51c3JfYXV0aF9rZXkpIHsKICAgICAgICAgICAgU05NUF9aRVJPKG9sZF9yZWYtPnVzcl9hdXRoX2tleSwgb2xkX3JlZi0+dXNyX2F1dGhfa2V5X2xlbmd0aCk7CiAgICAgICAgICAgIFNOTVBfRlJFRShvbGRfcmVmLT51c3JfYXV0aF9rZXkpOwogICAgICAgIH0KICAgICAgICBpZiAob2xkX3JlZi0+dXNyX3ByaXZfa2V5KSB7CiAgICAgICAgICAgIFNOTVBfWkVSTyhvbGRfcmVmLT51c3JfcHJpdl9rZXksIG9sZF9yZWYtPnVzcl9wcml2X2tleV9sZW5ndGgpOwogICAgICAgICAgICBTTk1QX0ZSRUUob2xkX3JlZi0+dXNyX3ByaXZfa2V5KTsKICAgICAgICB9CgogICAgICAgIFNOTVBfWkVSTyhvbGRfcmVmLCBzaXplb2YoKm9sZF9yZWYpKTsKICAgICAgICBTTk1QX0ZSRUUob2xkX3JlZik7CgogICAgfQoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UoKSAqLwoKc3RydWN0IHVzbVVzZXIgKgp1c21fZ2V0X3VzZXJMaXN0KHZvaWQpCnsKICAgIHJldHVybiB1c2VyTGlzdDsKfQoKaW50CnVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfbmFtZShzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKnJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgTUFLRV9FTlRSWShjaGFyLCBuYW1lLCBuYW1lX2xlbiwgdXNyX25hbWUsIHVzcl9uYW1lX2xlbmd0aCk7Cn0KCmludAp1c21fc2V0X3VzbVN0YXRlUmVmZXJlbmNlX2VuZ2luZV9pZChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKnJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogZW5naW5lX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW5naW5lX2lkX2xlbikKewogICAgTUFLRV9FTlRSWSh1X2NoYXIsIGVuZ2luZV9pZCwgZW5naW5lX2lkX2xlbiwKICAgICAgICAgICAgICAgdXNyX2VuZ2luZV9pZCwgdXNyX2VuZ2luZV9pZF9sZW5ndGgpOwp9CgppbnQKdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9hdXRoX3Byb3RvY29sKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqcmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICogYXV0aF9wcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhdXRoX3Byb3RvY29sX2xlbikKewogICAgTUFLRV9FTlRSWShvaWQsIGF1dGhfcHJvdG9jb2wsIGF1dGhfcHJvdG9jb2xfbGVuLAogICAgICAgICAgICAgICB1c3JfYXV0aF9wcm90b2NvbCwgdXNyX2F1dGhfcHJvdG9jb2xfbGVuZ3RoKTsKfQoKaW50CnVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfYXV0aF9rZXkoc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICpyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogYXV0aF9rZXksIHNpemVfdCBhdXRoX2tleV9sZW4pCnsKICAgIE1BS0VfRU5UUlkodV9jaGFyLCBhdXRoX2tleSwgYXV0aF9rZXlfbGVuLAogICAgICAgICAgICAgICB1c3JfYXV0aF9rZXksIHVzcl9hdXRoX2tleV9sZW5ndGgpOwp9CgppbnQKdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9wcml2X3Byb3RvY29sKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqcmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICogcHJpdl9wcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwcml2X3Byb3RvY29sX2xlbikKewogICAgTUFLRV9FTlRSWShvaWQsIHByaXZfcHJvdG9jb2wsIHByaXZfcHJvdG9jb2xfbGVuLAogICAgICAgICAgICAgICB1c3JfcHJpdl9wcm90b2NvbCwgdXNyX3ByaXZfcHJvdG9jb2xfbGVuZ3RoKTsKfQoKaW50CnVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfcHJpdl9rZXkoc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICpyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogcHJpdl9rZXksIHNpemVfdCBwcml2X2tleV9sZW4pCnsKICAgIE1BS0VfRU5UUlkodV9jaGFyLCBwcml2X2tleSwgcHJpdl9rZXlfbGVuLAogICAgICAgICAgICAgICB1c3JfcHJpdl9rZXksIHVzcl9wcml2X2tleV9sZW5ndGgpOwp9CgppbnQKdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9zZWNfbGV2ZWwoc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICpyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWNfbGV2ZWwpCnsKICAgIGlmIChyZWYgPT0gTlVMTCkKICAgICAgICByZXR1cm4gLTE7CiAgICByZWYtPnVzcl9zZWNfbGV2ZWwgPSBzZWNfbGV2ZWw7CiAgICByZXR1cm4gMDsKfQoKaW50CnVzbV9jbG9uZV91c21TdGF0ZVJlZmVyZW5jZShzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKmZyb20sIHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqKnRvKQp7CiAgICBzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKmNsb25lZF91c21TdGF0ZVJlZjsKCiAgICBpZiAoZnJvbSA9PSBOVUxMIHx8IHRvID09IE5VTEwpCiAgICAgICAgcmV0dXJuIC0xOwoKICAgICp0byA9IHVzbV9tYWxsb2NfdXNtU3RhdGVSZWZlcmVuY2UoKTsKICAgIGNsb25lZF91c21TdGF0ZVJlZiA9ICp0bzsKCiAgICBpZiAodXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9uYW1lKGNsb25lZF91c21TdGF0ZVJlZiwgZnJvbS0+dXNyX25hbWUsIGZyb20tPnVzcl9uYW1lX2xlbmd0aCkgfHwKICAgICAgICB1c21fc2V0X3VzbVN0YXRlUmVmZXJlbmNlX2VuZ2luZV9pZChjbG9uZWRfdXNtU3RhdGVSZWYsIGZyb20tPnVzcl9lbmdpbmVfaWQsIGZyb20tPnVzcl9lbmdpbmVfaWRfbGVuZ3RoKSB8fAogICAgICAgIHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfYXV0aF9wcm90b2NvbChjbG9uZWRfdXNtU3RhdGVSZWYsIGZyb20tPnVzcl9hdXRoX3Byb3RvY29sLCBmcm9tLT51c3JfYXV0aF9wcm90b2NvbF9sZW5ndGgpIHx8CiAgICAgICAgdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9hdXRoX2tleShjbG9uZWRfdXNtU3RhdGVSZWYsIGZyb20tPnVzcl9hdXRoX2tleSwgZnJvbS0+dXNyX2F1dGhfa2V5X2xlbmd0aCkgfHwKICAgICAgICB1c21fc2V0X3VzbVN0YXRlUmVmZXJlbmNlX3ByaXZfcHJvdG9jb2woY2xvbmVkX3VzbVN0YXRlUmVmLCBmcm9tLT51c3JfcHJpdl9wcm90b2NvbCwgZnJvbS0+dXNyX3ByaXZfcHJvdG9jb2xfbGVuZ3RoKSB8fAogICAgICAgIHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfcHJpdl9rZXkoY2xvbmVkX3VzbVN0YXRlUmVmLCBmcm9tLT51c3JfcHJpdl9rZXksIGZyb20tPnVzcl9wcml2X2tleV9sZW5ndGgpIHx8CiAgICAgICAgdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9zZWNfbGV2ZWwoY2xvbmVkX3VzbVN0YXRlUmVmLCBmcm9tLT51c3Jfc2VjX2xldmVsKSkKICAgIHsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZSgqdG8pOwogICAgICAgICp0byA9IE5VTEw7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHJldHVybiAwOwoKfQoKI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBlbWVyZ2VuY3lfcHJpbnQKICoKICogUGFyYW1ldGVyczoKICoJKmZpZWxkCiAqCSBsZW5ndGgKICogICAgICAKICoJVGhpcyBpcyBhIHByaW50IHJvdXRpbmUgdGhhdCBpcyBzb2xlbHkgaW5jbHVkZWQgc28gdGhhdCBpdCBjYW4gYmUKICoJdXNlZCBpbiBnZGIuICBEb24ndCB1c2UgaXQgYXMgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBwdWxsZWQgYmVmb3JlCiAqCWEgcmVhbCByZWxlYXNlIG9mIHRoZSBjb2RlLgogKgogKgl0YWIgc3RvcCA0CiAqCiAqCVhYWCBmZmx1c2goKSBvbmx5IHdvcmtzIG9uIEZyZWVCU0Q7IGNvcmUgZHVtcHMgb24gU3VuIE9TJ3MKICovCnZvaWQKZW1lcmdlbmN5X3ByaW50KHVfY2hhciAqIGZpZWxkLCB1X2ludCBsZW5ndGgpCnsKICAgIGludCAgICAgICAgICAgICBpaW5kZXg7CiAgICBpbnQgICAgICAgICAgICAgc3RhcnQgPSAwOwogICAgaW50ICAgICAgICAgICAgIHN0b3AgPSAyNTsKCiAgICB3aGlsZSAoc3RhcnQgPCBzdG9wKSB7CiAgICAgICAgZm9yIChpaW5kZXggPSBzdGFydDsgaWluZGV4IDwgc3RvcDsgaWluZGV4KyspCiAgICAgICAgICAgIHByaW50ZigiJTAyWCAiLCBmaWVsZFtpaW5kZXhdKTsKCiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIHN0YXJ0ID0gc3RvcDsKICAgICAgICBzdG9wID0gc3RvcCArIDI1IDwgbGVuZ3RoID8gc3RvcCArIDI1IDogbGVuZ3RoOwogICAgfQogICAgZmZsdXNoKDApOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgZW1lcmdlbmN5X3ByaW50KCkgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBhc25fcHJlZGljdF9pbnRfbGVuZ3RoCiAqCiAqIFBhcmFtZXRlcnM6CiAqCXR5cGUJKFVOVVNFRCkKICoJbnVtYmVyCiAqCWxlbgogKiAgICAgIAogKiBSZXR1cm5zOgogKglOdW1iZXIgb2YgYnl0ZXMgbmVjZXNzYXJ5IHRvIHN0b3JlIHRoZSBBU04uMSBlbmNvZGVkIHZhbHVlIG9mICdudW1iZXInLgogKgogKgogKglUaGlzIGdpdmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB0aGUgQVNOLjEgZW5jb2RlciAoaW4gYXNuMS5jKSB3aWxsCiAqCXVzZSB0byBlbmNvZGUgYSBwYXJ0aWN1bGFyIGludGVnZXIgdmFsdWUuCiAqCiAqCVJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgaW50ZWdlciAtLSBOT1QgVEhFIEhFQURFUiEKICoKICoJRG8gdGhpcyB0aGUgc2FtZSB3YXkgYXMgYXNuX2J1aWxkX2ludCgpLi4uCiAqLwppbnQKYXNuX3ByZWRpY3RfaW50X2xlbmd0aChpbnQgdHlwZSwgbG9uZyBudW1iZXIsIHNpemVfdCBsZW4pCnsKICAgIHJlZ2lzdGVyIHVfbG9uZyBtYXNrOwoKCiAgICBpZiAobGVuICE9IHNpemVvZihsb25nKSkKICAgICAgICByZXR1cm4gLTE7CgogICAgbWFzayA9ICgodV9sb25nKSAweDFGRikgPDwgKCg4ICogKHNpemVvZihsb25nKSAtIDEpKSAtIDEpOwogICAgLyoKICAgICAqIG1hc2sgaXMgMHhGRjgwMDAwMCBvbiBhIGJpZy1lbmRpYW4gbWFjaGluZSAKICAgICAqLwoKICAgIHdoaWxlICgoKChudW1iZXIgJiBtYXNrKSA9PSAwKSB8fCAoKG51bWJlciAmIG1hc2spID09IG1hc2spKQogICAgICAgICAgICYmIGxlbiA+IDEpIHsKICAgICAgICBsZW4tLTsKICAgICAgICBudW1iZXIgPDw9IDg7CiAgICB9CgogICAgcmV0dXJuIGxlbjsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGFzbl9wcmVkaWN0X2xlbmd0aCgpICovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBhc25fcHJlZGljdF9sZW5ndGgKICoKICogUGFyYW1ldGVyczoKICoJIHR5cGUKICoJKnB0cgogKgkgdV9jaGFyX2xlbgogKiAgICAgIAogKiBSZXR1cm5zOgogKglMZW5ndGggaW4gYnl0ZXM6CTEgKyA8bj4gKyA8dV9jaGFyX2xlbj4sIHdoZXJlCiAqCiAqCQkxCQlGb3IgdGhlIEFTTi4xIHR5cGUuCiAqCQk8bj4JCSMgb2YgYnl0ZXMgdG8gc3RvcmUgbGVuZ3RoIG9mIGRhdGEuCiAqCQk8dV9jaGFyX2xlbj4JTGVuZ3RoIG9mIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEFTTi4xIHR5cGUuCiAqCiAqCVRoaXMgZ2l2ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBBU04uMSBlbmNvZGVyIChpbiBhc24xLmMpIHdpbGwKICoJdXNlIHRvIGVuY29kZSBhIHBhcnRpY3VsYXIgaW50ZWdlciB2YWx1ZS4gIFRoaXMgaXMgYXMgYnJva2VuIGFzIHRoZQogKgljdXJyZW50bHkgdXNlZCBlbmNvZGVyLgogKgogKiBYWFgJSG93IGlzIDxuPiBjaG9zZW4sIGV4YWN0bHk/PwogKi8KaW50CmFzbl9wcmVkaWN0X2xlbmd0aChpbnQgdHlwZSwgdV9jaGFyICogcHRyLCBzaXplX3QgdV9jaGFyX2xlbikKewoKICAgIGlmICh0eXBlICYgQVNOX1NFUVVFTkNFKQogICAgICAgIHJldHVybiAxICsgMyArIHVfY2hhcl9sZW47CgogICAgaWYgKHR5cGUgJiBBU05fSU5URUdFUikgewogICAgICAgIHVfbG9uZyAgICAgICAgICB2YWx1ZTsKICAgICAgICBtZW1jcHkoJnZhbHVlLCBwdHIsIHVfY2hhcl9sZW4pOwogICAgICAgIHVfY2hhcl9sZW4gPSBhc25fcHJlZGljdF9pbnRfbGVuZ3RoKHR5cGUsIHZhbHVlLCB1X2NoYXJfbGVuKTsKICAgIH0KCiAgICBpZiAodV9jaGFyX2xlbiA8IDB4ODApCiAgICAgICAgcmV0dXJuIDEgKyAxICsgdV9jaGFyX2xlbjsKICAgIGVsc2UgaWYgKHVfY2hhcl9sZW4gPCAweEZGKQogICAgICAgIHJldHVybiAxICsgMiArIHVfY2hhcl9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIDEgKyAzICsgdV9jaGFyX2xlbjsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGFzbl9wcmVkaWN0X2xlbmd0aCgpICovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiB1c21fY2FsY19vZmZzZXRzCiAqCiAqIFBhcmFtZXRlcnM6CiAqCShTZWUgbGlzdCBiZWxvdy4uLikKICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCiAqCiAqCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIHRoZSBvZmZzZXRzIGludG8gYW4gb3V0Z29pbmcgbWVzc2FnZSBidWZmZXIKICoJZm9yIHRoZSBuZWNlc3NhcnkgdmFsdWVzLiAgVGhlIG91dGdvaW5nIGJ1ZmZlciB3aWxsIGdlbmVyaWNhbGx5CiAqCWxvb2sgbGlrZSB0aGlzOgogKgogKglTTk1QdjMgTWVzc2FnZQogKglTRVEgbGVuWzExXQogKgkJSU5UIGxlbiB2ZXJzaW9uCiAqCUhlYWRlcgogKgkJU0VRIGxlbgogKgkJCUlOVCBsZW4gTXNnSUQKICoJCQlJTlQgbGVuIG1zZ01heFNpemUKICoJCQlPU1QgbGVuIG1zZ0ZsYWdzIChPU1QgPSBPQ1RFVCBTVFJJTkcpCiAqCQkJSU5UIGxlbiBtc2dTZWN1cml0eU1vZGVsCiAqCU1zZ1NlY3VyaXR5UGFyYW1ldGVycwogKgkJWzFdIE9TVCBsZW5bMl0KICoJCQlTRVEgbGVuWzNdCiAqCQkJCU9TVCBsZW4gbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlECiAqCQkJCUlOVCBsZW4gbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUJvb3RzCiAqCQkJCUlOVCBsZW4gbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZVRpbWUKICoJCQkJT1NUIGxlbiBtc2dVc2VyTmFtZQogKgkJCQlPU1QgbGVuWzRdIFs1XSBtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMKICoJCQkJT1NUIGxlbls2XSBbN10gbXNnUHJpdmFjeVBhcmFtZXRlcnMKICoJTXNnRGF0YQogKgkJWzhdIE9TVCBsZW5bOV0gWzEwXSBlbmNyeXB0ZWRQRFUKICoJCW9yCiAqCQlbOCwxMF0gU0VRVUVOQ0UgbGVuWzldIHNjb3BlZFBEVQogKglbMTJdCiAqCiAqCVRoZSBicmFja2V0ZWQgcG9pbnRzIHdpbGwgYmUgbmVlZGVkIHRvIGJlIGlkZW50aWZpZWQgKFt4XSBpcyBhbiBpbmRleAogKgl2YWx1ZSwgbGVuW3hdIG1lYW5zIGEgbGVuZ3RoIHZhbHVlKS4gIEhlcmUgaXMgYSBzZW1hbnRpYyBndWlkZSB0byB0aGVtOgogKgogKglbMV0gPSBnbG9iYWxEYXRhTGVuIChpbnB1dCkKICoJWzJdID0gb3RzdGxlbgogKglbM10gPSBzZXFfbGVuCiAqCVs0XSA9IG1zZ0F1dGhQYXJtTGVuIChtYXkgYmUgMCBvciAxMikKICoJWzVdID0gYXV0aFBhcmFtc09mZnNldAogKglbNl0gPSBtc2dQcml2UGFybUxlbiAobWF5IGJlIDAgb3IgOCkKICoJWzddID0gcHJpdlBhcmFtc09mZnNldAogKglbOF0gPSBnbG9iYWxEYXRhTGVuICsgbXNnU2VjUGFybUxlbgogKglbOV0gPSBkYXRhbGVuCiAqCVsxMF0gPSBkYXRhT2Zmc2V0CiAqCVsxMV0gPSB0aGVUb3RhbExlbmd0aCAtIHRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciBpdHNlbGYKICoJWzEyXSA9IHRoZVRvdGFsTGVuZ3RoCiAqLwppbnQKdXNtX2NhbGNfb2Zmc2V0cyhzaXplX3QgZ2xvYmFsRGF0YUxlbiwgIC8qIFNOTVB2M01lc3NhZ2UgKyBIZWFkZXJEYXRhICovCiAgICAgICAgICAgICAgICAgaW50IHNlY0xldmVsLCBzaXplX3Qgc2VjRW5naW5lSURMZW4sIHNpemVfdCBzZWNOYW1lTGVuLCBzaXplX3Qgc2NvcGVkUGR1TGVuLCAgIC8qIEFuIEJFUiBlbmNvZGVkIHNlcXVlbmNlLiAqLwogICAgICAgICAgICAgICAgIHVfbG9uZyBlbmdpbmVib290cywgICAgLyogWFhYIChhc24xLmMgd29ya3MgaW4gbG9uZywgbm90IGludC4pICovCiAgICAgICAgICAgICAgICAgbG9uZyBlbmdpbmVfdGltZSwgICAgICAvKiBYWFggKGFzbjEuYyB3b3JrcyBpbiBsb25nLCBub3QgaW50LikgKi8KICAgICAgICAgICAgICAgICBzaXplX3QgKiB0aGVUb3RhbExlbmd0aCwgICAgICAgLyogZ2xvYmFsRGF0YUxlbiArIG1zZ1NlY3VyaXR5UC4gKyBtc2dEYXRhICovCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogYXV0aFBhcmFtc09mZnNldCwgICAgIC8qIERpc3RhbmNlIHRvIGF1dGggYnl0ZXMuICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIHNpemVfdCAqIHByaXZQYXJhbXNPZmZzZXQsICAgICAvKiBEaXN0YW5jZSB0byBwcml2IGJ5dGVzLiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBzaXplX3QgKiBkYXRhT2Zmc2V0LCAgIC8qIERpc3RhbmNlIHRvIHNjb3BlZFBkdSBTRVEgIC1vci0gIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjcnlwdGVkIChkYXRhKSBwb3J0aW9uIG9mIG1zZ0RhdGEuICAgICovCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogZGF0YWxlbiwgICAgICAvKiBTaXplIG9mIG1zZ0RhdGEgT0NURVQgU1RSSU5HIGVuY29kaW5nLiAgKi8KICAgICAgICAgICAgICAgICBzaXplX3QgKiBtc2dBdXRoUGFybUxlbiwgICAgICAgLyogU2l6ZSBvZiBtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMuICAgICovCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogbXNnUHJpdlBhcm1MZW4sICAgICAgIC8qIFNpemUgb2YgbXNnUHJpdmFjeVBhcmFtZXRlcnMuICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIHNpemVfdCAqIG90c3RsZW4sICAgICAgLyogU2l6ZSBvZiBtc2dTZWN1cml0eVAuIE8uUy4gZW5jb2RpbmcuICAgICovCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogc2VxX2xlbiwgICAgICAvKiBTaXplIG9mIG1zZ1NlY3VyaXR5UC4gU0VRIGRhdGEuICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBzaXplX3QgKiBtc2dTZWNQYXJtTGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpemUgb2YgbXNnU2VjdXJpdHlQLiBTRVEuICAgICAgICAgICAgICAqLwogICAgaW50ICAgICAgICAgICAgIGVuZ0lEbGVuLCAgIC8qIFNpemVzIG9mIE9DVEVUIFNUUklORyBhbmQgU0VRIGVuY29kaW5ncyAqLwogICAgICAgICAgICAgICAgICAgIGVuZ0J0bGVuLCAgIC8qICAgZm9yIGZpZWxkcyB3aXRoaW4gICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGVuZ1RtbGVuLCAgIC8qICAgbXNnU2VjdXJpdHlQYXJhbWV0ZXJzIHBvcnRpb24gb2YgICAgICAqLwogICAgICAgICAgICAgICAgICAgIG5hbWVsZW4sICAgIC8qICAgU05NUHYzTWVzc2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGF1dGhsZW4sIHByaXZsZW4sIHJldDsKCiAgICAvKgogICAgICogSWYgZG9pbmcgYXV0aGVudGljYXRpb24sIG1zZ0F1dGhQYXJtTGVuID0gMTIgZWxzZSBtc2dBdXRoUGFybUxlbiA9IDAuCiAgICAgKiBJZiBkb2luZyBlbmNyeXB0aW9uLCAgICAgbXNnUHJpdlBhcm1MZW4gPSA4ICBlbHNlIG1zZ1ByaXZQYXJtTGVuID0gMC4KICAgICAqLwogICAgKm1zZ0F1dGhQYXJtTGVuID0gKHNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhOT1BSSVYKICAgICAgICAgICAgICAgICAgICAgICB8fCBzZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVikgPyAxMiA6IDA7CgogICAgKm1zZ1ByaXZQYXJtTGVuID0gKHNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSA/IDggOiAwOwoKCiAgICAvKgogICAgICogQ2FsY3VsYXRlIGxlbmd0aHMuCiAgICAgKi8KICAgIGlmICgoZW5nSURsZW4gPSBhc25fcHJlZGljdF9sZW5ndGgoQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgc2VjRW5naW5lSURMZW4pKSA9PSAtMSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAoKGVuZ0J0bGVuID0gYXNuX3ByZWRpY3RfbGVuZ3RoKEFTTl9JTlRFR0VSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopICYgZW5naW5lYm9vdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsb25nKSkpID09IC0xKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmICgoZW5nVG1sZW4gPSBhc25fcHJlZGljdF9sZW5ndGgoQVNOX0lOVEVHRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgJiBlbmdpbmVfdGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpKSkgPT0gLTEpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaWYgKChuYW1lbGVuID0gYXNuX3ByZWRpY3RfbGVuZ3RoKEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgc2VjTmFtZUxlbikpID09IC0xKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmICgoYXV0aGxlbiA9IGFzbl9wcmVkaWN0X2xlbmd0aChBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICptc2dBdXRoUGFybUxlbikpID09IC0xKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmICgocHJpdmxlbiA9IGFzbl9wcmVkaWN0X2xlbmd0aChBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICptc2dQcml2UGFybUxlbikpID09IC0xKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgICpzZXFfbGVuID0KICAgICAgICBlbmdJRGxlbiArIGVuZ0J0bGVuICsgZW5nVG1sZW4gKyBuYW1lbGVuICsgYXV0aGxlbiArIHByaXZsZW47CgogICAgaWYgKChyZXQgPSBhc25fcHJlZGljdF9sZW5ndGgoQVNOX1NFUVVFTkNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICpzZXFfbGVuKSkgPT0gLTEpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICAqb3RzdGxlbiA9IChzaXplX3QpcmV0OwoKICAgIGlmICgocmV0ID0gYXNuX3ByZWRpY3RfbGVuZ3RoKEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgKm90c3RsZW4pKSA9PSAtMSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgICptc2dTZWNQYXJtTGVuID0gKHNpemVfdClyZXQ7CgogICAgKmF1dGhQYXJhbXNPZmZzZXQgPSBnbG9iYWxEYXRhTGVuICsgKygqbXNnU2VjUGFybUxlbiAtICpzZXFfbGVuKQogICAgICAgICsgZW5nSURsZW4gKyBlbmdCdGxlbiArIGVuZ1RtbGVuICsgbmFtZWxlbgogICAgICAgICsgKGF1dGhsZW4gLSAqbXNnQXV0aFBhcm1MZW4pOwoKICAgICpwcml2UGFyYW1zT2Zmc2V0ID0gKmF1dGhQYXJhbXNPZmZzZXQgKyAqbXNnQXV0aFBhcm1MZW4KICAgICAgICArIChwcml2bGVuIC0gKm1zZ1ByaXZQYXJtTGVuKTsKCgogICAgLyoKICAgICAqIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHBsYWludGV4dC4gIFJvdW5kIHVwIHRvIGFjY291bnQgZm9yIGNpcGhlcgogICAgICogYmxvY2sgc2l6ZSwgaWYgbmVjZXNzYXJ5LgogICAgICoKICAgICAqIFhYWCAgVGhpcyBpcyBoYXJkd2lyZWQgZm9yIDFERVMuLi4gSWYgc2NvcGVkUGR1TGVuIGlzIGFscmVhZHkKICAgICAqICAgICAgYSBtdWx0aXBsZSBvZiA4LCB0aGVuICphZGQqIDggbW9yZTsgb3RoZXJ3aXNlLCByb3VuZCB1cAogICAgICogICAgICB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiA4LgogICAgICoKICAgICAqIEZJWCAgQ2FsY3VsYXRpb24gb2YgZW5jcnlwdGVkIHBvcnRpb24gb2YgbXNnRGF0YSBhbmQgY29uc2VxdWVudAogICAgICogICAgICBzZXR0aW5nIGFuZCBzYW5pdHkgY2hlY2tpbmcgb2YgdGhlVG90YWxMZW5ndGgsIGV0IGFsLiBzaG91bGQKICAgICAqICAgICAgb2NjdXIgKmFmdGVyKiBlbmNyeXB0aW9uIGhhcyB0YWtlbiBwbGFjZS4KICAgICAqLwogICAgaWYgKHNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSB7CiAgICAgICAgc2NvcGVkUGR1TGVuID0gUk9VTkRVUDgoc2NvcGVkUGR1TGVuKTsKCiAgICAgICAgaWYgKChyZXQgPSBhc25fcHJlZGljdF9sZW5ndGgoQVNOX09DVEVUX1NUUiwgTlVMTCwgc2NvcGVkUGR1TGVuKSkgPT0gLTEpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICAqZGF0YWxlbiA9IChzaXplX3QpcmV0OwogICAgfSBlbHNlIHsKICAgICAgICAqZGF0YWxlbiA9IHNjb3BlZFBkdUxlbjsKICAgIH0KCiAgICAqZGF0YU9mZnNldCA9IGdsb2JhbERhdGFMZW4gKyAqbXNnU2VjUGFybUxlbiArCiAgICAgICAgKCpkYXRhbGVuIC0gc2NvcGVkUGR1TGVuKTsKICAgICp0aGVUb3RhbExlbmd0aCA9IGdsb2JhbERhdGFMZW4gKyAqbXNnU2VjUGFybUxlbiArICpkYXRhbGVuOwoKICAgIHJldHVybiAwOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2NhbGNfb2Zmc2V0cygpICovCgoKCgoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9zZXRfc2FsdAogKgogKiBQYXJhbWV0ZXJzOgogKgkqaXYJCSAgKE8pICAgQnVmZmVyIHRvIGNvbnRhaW4gSVYuCiAqCSppdl9sZW5ndGgJICAoTykgICBMZW5ndGggb2YgaXYuCiAqCSpwcml2X3NhbHQJICAoSSkgICBTYWx0IHBvcnRpb24gb2YgcHJpdmF0ZSBrZXkuCiAqCSBwcml2X3NhbHRfbGVuZ3RoIChJKSAgIExlbmd0aCBvZiBwcml2X3NhbHQuCiAqCSptc2dTYWx0CSAgKEkvTykgUG9pbnRlciBzYWx0IHBvcnRpb24gb2Ygb3V0Z29pbmcgbXNnIGJ1ZmZlci4KICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCiAqCURldGVybWluZSB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGZvciB0aGUgREVTLUNCQyBlbmNyeXB0aW9uLgogKgkoQ2YuIFJGQyAyMjc0LCA4LjEuMS4xLikKICoKICoJaXYgaXMgZGVmaW5lZCBhcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBlbmdpbmVCb290cyBhbmQgdGhlCiAqCQlzYWx0IGludGVnZXIuCiAqCVRoZSBzYWx0IGludGVnZXIgaXMgaW5jcmVtZW50ZWQuCiAqCVRoZSByZXN1bHRpbmcgc2FsdCBpcyBjb3BpZWQgaW50byB0aGUgbXNnU2FsdCBidWZmZXIuCiAqCVRoZSByZXN1bHQgb2YgdGhlIGNvbmNhdGVuYXRpb24gaXMgdGhlbiBYT1JlZCB3aXRoIHRoZSBzYWx0CiAqCQlwb3J0aW9uIG9mIHRoZSBwcml2YXRlIGtleSAobGFzdCA4IGJ5dGVzKS4KICoJVGhlIElWIHJlc3VsdCBpcyByZXR1cm5lZCBpbmRpdmlkdWFsbHkgZm9yIGZ1cnRoZXIgdXNlLgogKi8KaW50CnVzbV9zZXRfc2FsdCh1X2NoYXIgKiBpdiwKICAgICAgICAgICAgIHNpemVfdCAqIGl2X2xlbmd0aCwKICAgICAgICAgICAgIHVfY2hhciAqIHByaXZfc2FsdCwgc2l6ZV90IHByaXZfc2FsdF9sZW5ndGgsIHVfY2hhciAqIG1zZ1NhbHQpCnsKICAgIHNpemVfdCAgICAgICAgICBwcm9wZXJzaXplX3NhbHQgPSBCWVRFU0laRShVU01fREVTX1NBTFRfTEVOR1RIKTsKICAgIGludCAgICAgICAgICAgICBuZXRfYm9vdHM7CiAgICBpbnQgICAgICAgICAgICAgbmV0X3NhbHRfaW50OwogICAgLyoKICAgICAqIG5ldF8qIHNob3VsZCBiZSBlbmNvZGVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gIFhYWCAgV2h5PwogICAgICovCiAgICBpbnQgICAgICAgICAgICAgaWluZGV4OwoKCiAgICAvKgogICAgICogU2FuaXR5IGNoZWNrLgogICAgICovCiAgICBpZiAoIWl2IHx8ICFpdl9sZW5ndGggfHwgIXByaXZfc2FsdCB8fCAoKml2X2xlbmd0aCAhPSBwcm9wZXJzaXplX3NhbHQpCiAgICAgICAgfHwgKHByaXZfc2FsdF9sZW5ndGggPCBwcm9wZXJzaXplX3NhbHQpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKCiAgICBuZXRfYm9vdHMgPSBodG9ubChzbm1wdjNfbG9jYWxfc25tcEVuZ2luZUJvb3RzKCkpOwogICAgbmV0X3NhbHRfaW50ID0gaHRvbmwoc2FsdF9pbnRlZ2VyKTsKCiAgICBzYWx0X2ludGVnZXIgKz0gMTsKCiAgICBtZW1jcHkoaXYsICZuZXRfYm9vdHMsIHByb3BlcnNpemVfc2FsdCAvIDIpOwogICAgbWVtY3B5KGl2ICsgKHByb3BlcnNpemVfc2FsdCAvIDIpLCAmbmV0X3NhbHRfaW50LCBwcm9wZXJzaXplX3NhbHQgLyAyKTsKCiAgICBpZiAobXNnU2FsdCkKICAgICAgICBtZW1jcHkobXNnU2FsdCwgaXYsIHByb3BlcnNpemVfc2FsdCk7CgoKICAgIC8qCiAgICAgKiBUdXJuIHRoZSBzYWx0IGludG8gYW4gSVY6IFhPUiA8Ym9vdHMsIHNhbHRfaW50PiB3aXRoIHNhbHQKICAgICAqIHBvcnRpb24gb2YgcHJpdl9rZXkuCiAgICAgKi8KICAgIGZvciAoaWluZGV4ID0gMDsgaWluZGV4IDwgKGludCkgcHJvcGVyc2l6ZV9zYWx0OyBpaW5kZXgrKykKICAgICAgICBpdltpaW5kZXhdIF49IHByaXZfc2FsdFtpaW5kZXhdOwoKCiAgICByZXR1cm4gMDsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9zZXRfc2FsdCgpICovCiNlbmRpZgoKI2lmZGVmIEhBVkVfQUVTCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9zZXRfYWVzX2l2CiAqCiAqIFBhcmFtZXRlcnM6CiAqCSppdgkJICAoTykgICBCdWZmZXIgdG8gY29udGFpbiBJVi4KICoJKml2X2xlbmd0aAkgIChPKSAgIExlbmd0aCBvZiBpdi4KICogICAgICBuZXRfYm9vdHMgICAgICAgICAoSSkgICB0aGUgbmV0d29yayBieXRlIG9yZGVyIG9mIHRoZSBhdXRoRW5nIGJvb3RzIHZhbAogKiAgICAgIG5ldF90aW1lICAgICAgICAgKEkpICAgdGhlIG5ldHdvcmsgYnl0ZSBvcmRlciBvZiB0aGUgYXV0aEVuZyB0aW1lIHZhbAogKiAgICAgICpzYWx0ICAgICAgICAgICAgIChPKSAgIEEgYnVmZmVyIGZvciB0aGUgb3V0Z29pbmcgc2FsdCAoPSA4IGJ5dGVzIG9mIGl2KQogKiAgICAgIAogKiBSZXR1cm5zOgogKgkwCU9uIHN1Y2Nlc3MsCiAqCS0xCU90aGVyd2lzZS4KICoKICoJRGV0ZXJtaW5lIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgZm9yIEFFUyBlbmNyeXB0aW9uLgogKgkoZHJhZnQtYmx1bWVudGhhbC1hZXMtdXNtLTAzLnR4dCwgMy4xLjIuMikKICoKICoJaXYgaXMgZGVmaW5lZCBhcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBlbmdpbmVCb290cywgZW5naW5lVGltZQogIAlhbmQgYSA2NCBiaXQgc2FsdC1pbnRlZ2VyLgogKglUaGUgNjQgYml0IHNhbHQgaW50ZWdlciBpcyBpbmNyZW1lbnRlZC4KICoJVGhlIHJlc3VsdGluZyBzYWx0IGlzIGNvcGllZCBpbnRvIHRoZSBzYWx0IGJ1ZmZlci4KICoJVGhlIElWIHJlc3VsdCBpcyByZXR1cm5lZCBpbmRpdmlkdWFsbHkgZm9yIGZ1cnRoZXIgdXNlLgogKi8KaW50CnVzbV9zZXRfYWVzX2l2KHVfY2hhciAqIGl2LAogICAgICAgICAgICAgICBzaXplX3QgKiBpdl9sZW5ndGgsCiAgICAgICAgICAgICAgIHVfaW50IG5ldF9ib290cywKICAgICAgICAgICAgICAgdV9pbnQgbmV0X3RpbWUsCiAgICAgICAgICAgICAgIHVfY2hhciAqIHNhbHQpCnsKICAgIC8qCiAgICAgKiBuZXRfKiBzaG91bGQgYmUgZW5jb2RlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCiAgICAgKi8KICAgIGludCAgICAgICAgICAgICBuZXRfc2FsdF9pbnQxLCBuZXRfc2FsdF9pbnQyOwojZGVmaW5lIFBST1BFUl9BRVNfSVZfU0laRSA2NAoKICAgIC8qCiAgICAgKiBTYW5pdHkgY2hlY2suCiAgICAgKi8KICAgIGlmICghaXYgfHwgIWl2X2xlbmd0aCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBuZXRfc2FsdF9pbnQxID0gaHRvbmwoc2FsdF9pbnRlZ2VyNjRfMSk7CiAgICBuZXRfc2FsdF9pbnQyID0gaHRvbmwoc2FsdF9pbnRlZ2VyNjRfMik7CgogICAgaWYgKChzYWx0X2ludGVnZXI2NF8yICs9IDEpID09IDApCiAgICAgICAgc2FsdF9pbnRlZ2VyNjRfMiArPSAxOwogICAgCiAgICAvKiBYWFg6IHdhcm5pbmc6IGhhcmQgY29kZWQgcHJvcGVyIGxlbmd0aHMgKi8KICAgIG1lbWNweShpdiwgJm5ldF9ib290cywgNCk7CiAgICBtZW1jcHkoaXYrNCwgJm5ldF90aW1lLCA0KTsKICAgIG1lbWNweShpdis4LCAmbmV0X3NhbHRfaW50MSwgNCk7CiAgICBtZW1jcHkoaXYrMTIsICZuZXRfc2FsdF9pbnQyLCA0KTsKCiAgICBtZW1jcHkoc2FsdCwgaXYrOCwgOCk7IC8qIG9ubHkgY29weSB0aGUgbmVlZGVkIHBvcnRpb24gKi8KICAgIHJldHVybiAwOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB1c21fc2V0X3NhbHQoKSAqLwojZW5kaWYgLyogSEFWRV9BRVMgKi8KCmludAp1c21fc2VjbW9kX2dlbmVyYXRlX291dF9tc2coc3RydWN0IHNubXBfc2VjbW9kX291dGdvaW5nX3BhcmFtcyAqcGFybXMpCnsKICAgIGlmICghcGFybXMpCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgIHJldHVybiB1c21fZ2VuZXJhdGVfb3V0X21zZyhwYXJtcy0+bXNnUHJvY01vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5nbG9iYWxEYXRhLCBwYXJtcy0+Z2xvYmFsRGF0YUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+bWF4TXNnU2l6ZSwgcGFybXMtPnNlY01vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNFbmdpbmVJRCwgcGFybXMtPnNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNOYW1lLCBwYXJtcy0+c2VjTmFtZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjTGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNjb3BlZFBkdSwgcGFybXMtPnNjb3BlZFBkdUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjU3RhdGVSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY1BhcmFtcywgcGFybXMtPnNlY1BhcmFtc0xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+d2hvbGVNc2csIHBhcm1zLT53aG9sZU1zZ0xlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9nZW5lcmF0ZV9vdXRfbXNnCiAqCiAqIFBhcmFtZXRlcnM6CiAqCShTZWUgbGlzdCBiZWxvdy4uLikKICogICAgICAKICogUmV0dXJuczoKICoJU05NUEVSUl9TVUNDRVNTCQkJT24gc3VjY2Vzcy4KICoJU05NUEVSUl9VU01fQVVUSEVOVElDQVRJT05GQUlMVVJFCiAqCVNOTVBFUlJfVVNNX0VOQ1JZUFRJT05FUlJPUgogKglTTk1QRVJSX1VTTV9HRU5FUklDRVJST1IKICoJU05NUEVSUl9VU01fVU5LTk9XTlNFQ1VSSVRZTkFNRQogKglTTk1QRVJSX1VTTV9HRU5FUklDRVJST1IKICoJU05NUEVSUl9VU01fVU5TVVBQT1JURURTRUNVUklUWUxFVkVMCiAqCQogKgogKiBHZW5lcmF0ZXMgYW4gb3V0Z29pbmcgbWVzc2FnZS4KICoKICogWFhYCUJld2FyZSBvZiBtaXNub21lcnMhCiAqLwppbnQKdXNtX2dlbmVyYXRlX291dF9tc2coaW50IG1zZ1Byb2NNb2RlbCwgIC8qIChVTlVTRUQpICovCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIGdsb2JhbERhdGEsICAgICAgIC8qIElOICovCiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqIFBvaW50ZXIgdG8gbXNnIGhlYWRlciBkYXRhIHdpbGwgcG9pbnQgdG8gdGhlIGJlZ2lubmluZwogICAgICAgICAgICAgICAgICAgICAgKiAqIG9mIHRoZSBlbnRpcmUgcGFja2V0IGJ1ZmZlciB0byBiZSB0cmFuc21pdHRlZCBvbiB3aXJlLAogICAgICAgICAgICAgICAgICAgICAgKiAqIG1lbW9yeSB3aWxsIGJlIGNvbnRpZ3VvdXMgd2l0aCBzZWNQYXJhbXMsIHR5cGljYWxseQogICAgICAgICAgICAgICAgICAgICAgKiAqIHRoaXMgcG9pbnRlciB3aWxsIGJlIHBhc3NlZCBiYWNrIGFzIGJlZ2lubmluZyBvZgogICAgICAgICAgICAgICAgICAgICAgKiAqIHdob2xlTXNnIGJlbG93LiAgYXNuIHNlcS4gbGVuZ3RoIGlzIHVwZGF0ZWQgdy8gbmV3IGxlbmd0aC4KICAgICAgICAgICAgICAgICAgICAgICogKgogICAgICAgICAgICAgICAgICAgICAgKiAqIFdoaWxlIHRoaXMgcG9pbnRzIHRvIGEgYnVmZmVyIHRoYXQgc2hvdWxkIGJlIGJpZyBlbm91Z2gKICAgICAgICAgICAgICAgICAgICAgICogKiBmb3IgdGhlIHdob2xlIG1lc3NhZ2UsIG9ubHkgdGhlIGZpcnN0IHR3byBwYXJ0cwogICAgICAgICAgICAgICAgICAgICAgKiAqIG9mIHRoZSBtZXNzYWdlIGFyZSBjb21wbGV0ZWQsIG5hbWVseSBTTk1QdjNNZXNzYWdlIGFuZAogICAgICAgICAgICAgICAgICAgICAgKiAqIEhlYWRlckRhdGEuICBnbG9iYWxEYXRhTGVuIChuZXh0IHBhcmFtZXRlcikgcmVwcmVzZW50cwogICAgICAgICAgICAgICAgICAgICAgKiAqIHRoZSBsZW5ndGggb2YgdGhlc2UgdHdvIGNvbXBsZXRlZCBwYXJ0cy4KICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBnbG9iYWxEYXRhTGVuLCAgICAgIC8qIElOIC0gTGVuZ3RoIG9mIG1zZyBoZWFkZXIgZGF0YS4gICAgICAqLwogICAgICAgICAgICAgICAgICAgICBpbnQgbWF4TXNnU2l6ZSwgICAgLyogKFVOVVNFRCkgKi8KICAgICAgICAgICAgICAgICAgICAgaW50IHNlY01vZGVsLCAgICAgIC8qIChVTlVTRUQpICovCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHNlY0VuZ2luZUlELCAgICAgIC8qIElOIC0gUG9pbnRlciBzbm1wRW5naW5lSUQuICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2VjRW5naW5lSURMZW4sICAgICAvKiBJTiAtIFNubXBFbmdpbmVJRCBsZW5ndGguICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgY2hhciAqc2VjTmFtZSwgICAgIC8qIElOIC0gUG9pbnRlciB0byBzZWN1cml0eU5hbWUuICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2VjTmFtZUxlbiwgLyogSU4gLSBTZWN1cml0eU5hbWUgbGVuZ3RoLiAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIGludCBzZWNMZXZlbCwgICAgICAvKiBJTiAtIEF1dGhOb1ByaXYsIGF1dGhQcml2IGV0Yy4gICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc2NvcGVkUGR1LCAgICAgICAgLyogSU4gKi8KICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogUG9pbnRlciB0byBzY29wZWRQZHUgd2lsbCBiZSBlbmNyeXB0ZWQgYnkgVVNNIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgICAgICAgKiAqIGFuZCB3cml0dGVuIHRvIHBhY2tldCBidWZmZXIgaW1tZWRpYXRlbHkgZm9sbG93aW5nCiAgICAgICAgICAgICAgICAgICAgICAqICogc2VjdXJpdHlQYXJhbWV0ZXJzLCBlbnRpcmUgbXNnIHdpbGwgYmUgYXV0aGVudGljYXRlZCBieQogICAgICAgICAgICAgICAgICAgICAgKiAqIFVTTSBpZiBuZWVkZWQuCiAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2NvcGVkUGR1TGVuLCAgICAgICAvKiBJTiAtIHNjb3BlZFBkdSBsZW5ndGguICovCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNlY1N0YXRlUmVmLCAvKiBJTiAqLwogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiBzZWNTdGF0ZVJlZiwgcG9pbnRlciB0byBjYWNoZWQgaW5mbyBwcm92aWRlZCBvbmx5IGZvcgogICAgICAgICAgICAgICAgICAgICAgKiAqIFJlc3BvbnNlLCBvdGhlcndpc2UgTlVMTC4KICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHNlY1BhcmFtcywgICAgICAgIC8qIE9VVCAqLwogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiBCRVIgZW5jb2RlZCBzZWN1cml0eVBhcmFtZXRlcnMgcG9pbnRlciB0byBvZmZzZXQgd2l0aGluCiAgICAgICAgICAgICAgICAgICAgICAqICogcGFja2V0IGJ1ZmZlciB3aGVyZSBzZWNQYXJhbXMgc2hvdWxkIGJlIHdyaXR0ZW4sIHRoZQogICAgICAgICAgICAgICAgICAgICAgKiAqIGVudGlyZSBCRVIgZW5jb2RlZCBPQ1RFVCBTVFJJTkcgKGluY2x1ZGluZyBoZWFkZXIpIGlzCiAgICAgICAgICAgICAgICAgICAgICAqICogd3JpdHRlbiBoZXJlIGJ5IFVTTSBzZWNQYXJhbXMgPSBnbG9iYWxEYXRhICsKICAgICAgICAgICAgICAgICAgICAgICogKiBnbG9iYWxEYXRhTGVuLgogICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogc2VjUGFyYW1zTGVuLCAgICAgLyogSU4vT1VUIC0gTGVuIGF2YWlsYWJsZSwgbGVuIHJldHVybmVkLiAqLwogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogd2hvbGVNc2csICAgICAgICAvKiBPVVQgKi8KICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogQ29tcGxldGUgYXV0aGVudGljYXRlZC9lbmNyeXB0ZWQgbWVzc2FnZSAtIHR5cGljYWxseQogICAgICAgICAgICAgICAgICAgICAgKiAqIHRoZSBwb2ludGVyIHRvIHN0YXJ0IG9mIHBhY2tldCBidWZmZXIgcHJvdmlkZWQgaW4KICAgICAgICAgICAgICAgICAgICAgICogKiBnbG9iYWxEYXRhIGlzIHJldHVybmVkIGhlcmUsIGNvdWxkIGFsc28gYmUgYSBzZXBhcmF0ZQogICAgICAgICAgICAgICAgICAgICAgKiAqIGJ1ZmZlci4KICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHdob2xlTXNnTGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOL09VVCAtIExlbiBhdmFpbGFibGUsIGxlbiByZXR1cm5lZC4gKi8KICAgIHNpemVfdCAgICAgICAgICBvdHN0bGVuOwogICAgc2l6ZV90ICAgICAgICAgIHNlcV9sZW47CiAgICBzaXplX3QgICAgICAgICAgbXNnQXV0aFBhcm1MZW47CiAgICBzaXplX3QgICAgICAgICAgbXNnUHJpdlBhcm1MZW47CiAgICBzaXplX3QgICAgICAgICAgbXNnU2VjUGFybUxlbjsKICAgIHNpemVfdCAgICAgICAgICBhdXRoUGFyYW1zT2Zmc2V0OwogICAgc2l6ZV90ICAgICAgICAgIHByaXZQYXJhbXNPZmZzZXQ7CiAgICBzaXplX3QgICAgICAgICAgZGF0YWxlbjsKICAgIHNpemVfdCAgICAgICAgICBkYXRhT2Zmc2V0OwogICAgc2l6ZV90ICAgICAgICAgIHRoZVRvdGFsTGVuZ3RoOwoKICAgIHVfY2hhciAgICAgICAgICpwdHI7CiAgICBzaXplX3QgICAgICAgICAgcHRyX2xlbjsKICAgIHNpemVfdCAgICAgICAgICByZW1haW5pbmc7CiAgICBzaXplX3QgICAgICAgICAgb2ZmU2V0OwogICAgdV9pbnQgICAgICAgICAgIGJvb3RzX3VpbnQ7CiAgICB1X2ludCAgICAgICAgICAgdGltZV91aW50OwogICAgbG9uZyAgICAgICAgICAgIGJvb3RzX2xvbmc7CiAgICBsb25nICAgICAgICAgICAgdGltZV9sb25nOwoKICAgIC8qCiAgICAgKiBJbmRpcmVjdGlvbiBiZWNhdXNlIHNlY1N0YXRlUmVmIHZhbHVlcyBvdmVycmlkZSBwYXJhbWV0ZXJzLgogICAgICogCiAgICAgKiBOb25lIG9mIHRoZXNlIGFyZSB0byBiZSBmcmVlJ2QgLSB0aGV5IGFyZSBlaXRoZXIgcG9pbnRpbmcgdG8KICAgICAqIHdoYXQncyBpbiB0aGUgc2VjU3RhdGVSZWYgb3IgdG8gc29tZXRoaW5nIGVpdGhlciBpbiB0aGUKICAgICAqIGFjdHVhbCBwcmFybWV0ZXIgbGlzdCBvciB0aGUgdXNlciBsaXN0LgogICAgICovCgogICAgY2hhciAgICAgICAgICAgKnRoZU5hbWUgPSBOVUxMOwogICAgdV9pbnQgICAgICAgICAgIHRoZU5hbWVMZW5ndGggPSAwOwogICAgdV9jaGFyICAgICAgICAgKnRoZUVuZ2luZUlEID0gTlVMTDsKICAgIHVfaW50ICAgICAgICAgICB0aGVFbmdpbmVJRExlbmd0aCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAqdGhlQXV0aEtleSA9IE5VTEw7CiAgICB1X2ludCAgICAgICAgICAgdGhlQXV0aEtleUxlbmd0aCA9IDA7CiAgICBjb25zdCBvaWQgICAgICAqdGhlQXV0aFByb3RvY29sID0gTlVMTDsKICAgIHVfaW50ICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGggPSAwOwogICAgdV9jaGFyICAgICAgICAgKnRoZVByaXZLZXkgPSBOVUxMOwogICAgdV9pbnQgICAgICAgICAgIHRoZVByaXZLZXlMZW5ndGggPSAwOwogICAgY29uc3Qgb2lkICAgICAgKnRoZVByaXZQcm90b2NvbCA9IE5VTEw7CiAgICB1X2ludCAgICAgICAgICAgdGhlUHJpdlByb3RvY29sTGVuZ3RoID0gMDsKICAgIGludCAgICAgICAgICAgICB0aGVTZWNMZXZlbCA9IDA7ICAgIC8qIE5vIGRlZmluZWQgY29uc3QgZm9yIGJhZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdmFsdWUgKG90aGVyIHRoZW4gZXJyKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVVNNIHByb2Nlc3NpbmcgaGFzIGJlZ3VuLlxuIikpOwoKICAgIGlmIChzZWNTdGF0ZVJlZiAhPSBOVUxMKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBUbyBodXNoIHRoZSBjb21waWxlciBmb3Igbm93LiAgWFhYIAogICAgICAgICAqLwogICAgICAgIHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqcmVmCiAgICAgICAgICAgID0gKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqKSBzZWNTdGF0ZVJlZjsKCiAgICAgICAgdGhlTmFtZSA9IHJlZi0+dXNyX25hbWU7CiAgICAgICAgdGhlTmFtZUxlbmd0aCA9IHJlZi0+dXNyX25hbWVfbGVuZ3RoOwogICAgICAgIHRoZUVuZ2luZUlEID0gcmVmLT51c3JfZW5naW5lX2lkOwogICAgICAgIHRoZUVuZ2luZUlETGVuZ3RoID0gcmVmLT51c3JfZW5naW5lX2lkX2xlbmd0aDsKCiAgICAgICAgaWYgKCF0aGVFbmdpbmVJRExlbmd0aCkgewogICAgICAgICAgICB0aGVFbmdpbmVJRCA9IHNlY0VuZ2luZUlEOwogICAgICAgICAgICB0aGVFbmdpbmVJRExlbmd0aCA9IHNlY0VuZ2luZUlETGVuOwogICAgICAgIH0KCiAgICAgICAgdGhlQXV0aFByb3RvY29sID0gcmVmLT51c3JfYXV0aF9wcm90b2NvbDsKICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGggPSByZWYtPnVzcl9hdXRoX3Byb3RvY29sX2xlbmd0aDsKICAgICAgICB0aGVBdXRoS2V5ID0gcmVmLT51c3JfYXV0aF9rZXk7CiAgICAgICAgdGhlQXV0aEtleUxlbmd0aCA9IHJlZi0+dXNyX2F1dGhfa2V5X2xlbmd0aDsKICAgICAgICB0aGVQcml2UHJvdG9jb2wgPSByZWYtPnVzcl9wcml2X3Byb3RvY29sOwogICAgICAgIHRoZVByaXZQcm90b2NvbExlbmd0aCA9IHJlZi0+dXNyX3ByaXZfcHJvdG9jb2xfbGVuZ3RoOwogICAgICAgIHRoZVByaXZLZXkgPSByZWYtPnVzcl9wcml2X2tleTsKICAgICAgICB0aGVQcml2S2V5TGVuZ3RoID0gcmVmLT51c3JfcHJpdl9rZXlfbGVuZ3RoOwogICAgICAgIHRoZVNlY0xldmVsID0gcmVmLT51c3Jfc2VjX2xldmVsOwogICAgfQoKICAgIC8qCiAgICAgKiBJZGVudGlmeSB0aGUgdXNlciByZWNvcmQuCiAgICAgKi8KICAgIGVsc2UgewogICAgICAgIHN0cnVjdCB1c21Vc2VyICp1c2VyOwoKICAgICAgICAvKgogICAgICAgICAqIHdlIGRvIGFsbG93IGFuIHVua25vd24gdXNlciBuYW1lIGZvcgogICAgICAgICAqIHVuYXV0aGVudGljYXRlZCByZXF1ZXN0cy4gCiAgICAgICAgICovCiAgICAgICAgaWYgKCh1c2VyID0gdXNtX2dldF91c2VyKHNlY0VuZ2luZUlELCBzZWNFbmdpbmVJRExlbiwgc2VjTmFtZSkpCiAgICAgICAgICAgID09IE5VTEwgJiYgc2VjTGV2ZWwgIT0gU05NUF9TRUNfTEVWRUxfTk9BVVRIKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVW5rbm93biBVc2VyKCVzKVxuIiwgc2VjTmFtZSkpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9VTktOT1dOU0VDVVJJVFlOQU1FOwogICAgICAgIH0KCiAgICAgICAgdGhlTmFtZSA9IHNlY05hbWU7CiAgICAgICAgdGhlTmFtZUxlbmd0aCA9IHNlY05hbWVMZW47CiAgICAgICAgdGhlRW5naW5lSUQgPSBzZWNFbmdpbmVJRDsKICAgICAgICB0aGVTZWNMZXZlbCA9IHNlY0xldmVsOwogICAgICAgIHRoZUVuZ2luZUlETGVuZ3RoID0gc2VjRW5naW5lSURMZW47CiAgICAgICAgaWYgKHVzZXIpIHsKICAgICAgICAgICAgdGhlQXV0aFByb3RvY29sID0gdXNlci0+YXV0aFByb3RvY29sOwogICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGggPSB1c2VyLT5hdXRoUHJvdG9jb2xMZW47CiAgICAgICAgICAgIHRoZUF1dGhLZXkgPSB1c2VyLT5hdXRoS2V5OwogICAgICAgICAgICB0aGVBdXRoS2V5TGVuZ3RoID0gdXNlci0+YXV0aEtleUxlbjsKICAgICAgICAgICAgdGhlUHJpdlByb3RvY29sID0gdXNlci0+cHJpdlByb3RvY29sOwogICAgICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGggPSB1c2VyLT5wcml2UHJvdG9jb2xMZW47CiAgICAgICAgICAgIHRoZVByaXZLZXkgPSB1c2VyLT5wcml2S2V5OwogICAgICAgICAgICB0aGVQcml2S2V5TGVuZ3RoID0gdXNlci0+cHJpdktleUxlbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB1bmtub3duIHVzZXJzIGNhbiBub3QgZG8gYXV0aGVudGljYXRpb24gKG9idmlvdXNseSkgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2wgPSB1c21Ob0F1dGhQcm90b2NvbDsKICAgICAgICAgICAgdGhlQXV0aFByb3RvY29sTGVuZ3RoID0KICAgICAgICAgICAgICAgIHNpemVvZih1c21Ob0F1dGhQcm90b2NvbCkgLyBzaXplb2Yob2lkKTsKICAgICAgICAgICAgdGhlQXV0aEtleSA9IE5VTEw7CiAgICAgICAgICAgIHRoZUF1dGhLZXlMZW5ndGggPSAwOwogICAgICAgICAgICB0aGVQcml2UHJvdG9jb2wgPSB1c21Ob1ByaXZQcm90b2NvbDsKICAgICAgICAgICAgdGhlUHJpdlByb3RvY29sTGVuZ3RoID0KICAgICAgICAgICAgICAgIHNpemVvZih1c21Ob1ByaXZQcm90b2NvbCkgLyBzaXplb2Yob2lkKTsKICAgICAgICAgICAgdGhlUHJpdktleSA9IE5VTEw7CiAgICAgICAgICAgIHRoZVByaXZLZXlMZW5ndGggPSAwOwogICAgICAgIH0KICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmRpZiAtLSBzZWNTdGF0ZVJlZj09TlVMTCAqLwoKCiAgICAvKgogICAgICogRnJvbSBoZXJlIHRvIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCBhdm9pZCByZWZlcmVuY2UgdG8KICAgICAqIHNlY05hbWUsIHNlY0VuZ2luZUlELCBzZWNMZXZlbCwgYW5kIGFzc29jaWF0ZWQgbGVuZ3Rocy4KICAgICAqLwoKCiAgICAvKgogICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSB1c2VyIGNhbiB1c2UgdGhlIHJlcXVlc3RlZCBzZWMgc2VydmljZXMuCiAgICAgKi8KICAgIGlmICh1c21fY2hlY2tfc2VjTGV2ZWxfdnNfcHJvdG9jb2xzKHRoZVNlY0xldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXV0aFByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXV0aFByb3RvY29sTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHJpdlByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHJpdlByb3RvY29sTGVuZ3RoKSA9PSAxKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJVbnN1cHBvcnRlZCBTZWN1cml0eSBMZXZlbCAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgIHRoZVNlY0xldmVsKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9VTlNVUFBPUlRFRFNFQ1VSSVRZTEVWRUw7CiAgICB9CgoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgZW5naW5lIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIFhYWCAgTm8gZXJyb3IgaXMgZGVjbGFyZWQgaW4gdGhlIEVvUCB3aGVuIHNlbmRpbmcgbWVzc2FnZXMgdG8KICAgICAqICAgICAgdW5rbm93biBlbmdpbmVzLCBwcm9jZXNzaW5nIGNvbnRpbnVlcyB3LyBib290cy90aW1lID09ICgwLDApLgogICAgICovCiAgICBpZiAoZ2V0X2VuZ2luZXRpbWUodGhlRW5naW5lSUQsIHRoZUVuZ2luZUlETGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICZib290c191aW50LCAmdGltZV91aW50LCBGQUxTRSkgPT0gLTEpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiRmFpbGVkIHRvIGZpbmQgZW5naW5lIGRhdGEuIikpOwogICAgfQoKICAgIGJvb3RzX2xvbmcgPSBib290c191aW50OwogICAgdGltZV9sb25nID0gdGltZV91aW50OwoKCiAgICAvKgogICAgICogU2V0IHVwIHRoZSBPZmZzZXRzLgogICAgICovCiAgICBpZiAodXNtX2NhbGNfb2Zmc2V0cyhnbG9iYWxEYXRhTGVuLCB0aGVTZWNMZXZlbCwgdGhlRW5naW5lSURMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVOYW1lTGVuZ3RoLCBzY29wZWRQZHVMZW4sIGJvb3RzX2xvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2xvbmcsICZ0aGVUb3RhbExlbmd0aCwgJmF1dGhQYXJhbXNPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpdlBhcmFtc09mZnNldCwgJmRhdGFPZmZzZXQsICZkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgJm1zZ0F1dGhQYXJtTGVuLCAmbXNnUHJpdlBhcm1MZW4sICZvdHN0bGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgJnNlcV9sZW4sICZtc2dTZWNQYXJtTGVuKSA9PSAtMSkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiRmFpbGVkIGNhbGN1bGF0aW5nIG9mZnNldHMuXG4iKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICB9CgogICAgLyoKICAgICAqIFNvLCB3ZSBoYXZlIHRoZSBvZmZzZXRzIGZvciB0aGUgdGhyZWUgcGFydHMgdGhhdCBuZWVkIHRvIGJlCiAgICAgKiBkZXRlcm1pbmVkLCBhbmQgYW4gb3ZlcmFsbCBsZW5ndGguICBOb3cgd2UgbmVlZCB0byBtYWtlCiAgICAgKiBzdXJlIGFsbCBvZiB0aGlzIHdvdWxkIGZpdCBpbiB0aGUgb3V0Z29pbmcgYnVmZmVyLCBhbmQKICAgICAqIHdoZXRoZXIgb3Igbm90IHdlIG5lZWQgdG8gbWFrZSBhIG5ldyBidWZmZXIsIGV0Yy4KICAgICAqLwoKCiAgICAvKgogICAgICogU2V0IHdob2xlTXNnIGFzIGEgcG9pbnRlciB0byBnbG9iYWxEYXRhLiAgU2FuaXR5IGNoZWNrIGZvcgogICAgICogdGhlIHByb3BlciBzaXplLgogICAgICogCiAgICAgKiBNYXJrIHdvcmtzcGFjZSBpbiB0aGUgbWVzc2FnZSB3aXRoIGJ5dGVzIG9mIGFsbCAxJ3MgdG8gbWFrZSBpdAogICAgICogZWFzaWVyIHRvIGZpbmQgbWlzdGFrZXMgaW4gcmF3IG1lc3NhZ2UgZHVtcHMuCiAgICAgKi8KICAgIHB0ciA9ICp3aG9sZU1zZyA9IGdsb2JhbERhdGE7CiAgICBpZiAodGhlVG90YWxMZW5ndGggPiAqd2hvbGVNc2dMZW4pIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIk1lc3NhZ2Ugd29uJ3QgZml0IGluIGJ1ZmZlci5cbiIpKTsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgIH0KCiAgICBwdHJfbGVuID0gKndob2xlTXNnTGVuID0gdGhlVG90YWxMZW5ndGg7CgojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICBtZW1zZXQoJnB0cltnbG9iYWxEYXRhTGVuXSwgMHhGRiwgdGhlVG90YWxMZW5ndGggLSBnbG9iYWxEYXRhTGVuKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KCiAgICAvKgogICAgICogRG8gdGhlIGVuY3J5cHRpb24uCiAgICAgKi8KICAgIGlmICh0aGVTZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVikgewogICAgICAgIHNpemVfdCAgICAgICAgICBlbmNyeXB0ZWRfbGVuZ3RoID0gdGhlVG90YWxMZW5ndGggLSBkYXRhT2Zmc2V0OwogICAgICAgIHNpemVfdCAgICAgICAgICBzYWx0X2xlbmd0aCA9IEJZVEVTSVpFKFVTTV9NQVhfU0FMVF9MRU5HVEgpOwogICAgICAgIHVfY2hhciAgICAgICAgICBzYWx0W0JZVEVTSVpFKFVTTV9NQVhfU0FMVF9MRU5HVEgpXTsKCiAgICAgICAgLyoKICAgICAgICAgKiBYWFggIEhhcmR3aXJlZCB0byBzZWVrIGludG8gYSAxREVTIHByaXZhdGUga2V5IQogICAgICAgICAqLwojaWZkZWYgSEFWRV9BRVMKICAgICAgICBpZiAoSVNUUkFOU0ZPUk0odGhlUHJpdlByb3RvY29sLCBBRVNQcml2KSkgewogICAgICAgICAgICBpZiAoIXRoZVByaXZLZXkgfHwKICAgICAgICAgICAgICAgIHVzbV9zZXRfYWVzX2l2KHNhbHQsICZzYWx0X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0b25sKGJvb3RzX3VpbnQpLCBodG9ubCh0aW1lX3VpbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0cltwcml2UGFyYW1zT2Zmc2V0XSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiQ2FuJ3Qgc2V0IEFFUyBpdi5cbiIpKTsKICAgICAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICB9IAojZW5kaWYKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiAgICAgICAgaWYgKElTVFJBTlNGT1JNKHRoZVByaXZQcm90b2NvbCwgREVTUHJpdikpIHsKICAgICAgICAgICAgaWYgKCF0aGVQcml2S2V5IHx8CiAgICAgICAgICAgICAgICAodXNtX3NldF9zYWx0KHNhbHQsICZzYWx0X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHJpdktleSArIDgsIHRoZVByaXZLZXlMZW5ndGggLSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyW3ByaXZQYXJhbXNPZmZzZXRdKQogICAgICAgICAgICAgICAgID09IC0xKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJDYW4ndCBzZXQgREVTLUNCQyBzYWx0LlxuIikpOwogICAgICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmCgogICAgICAgIGlmIChzY19lbmNyeXB0KHRoZVByaXZQcm90b2NvbCwgdGhlUHJpdlByb3RvY29sTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgIHRoZVByaXZLZXksIHRoZVByaXZLZXlMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUGR1LCBzY29wZWRQZHVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgJnB0cltkYXRhT2Zmc2V0XSwgJmVuY3J5cHRlZF9sZW5ndGgpCiAgICAgICAgICAgICE9IFNOTVBfRVJSX05PRVJST1IpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJlbmNyeXB0aW9uIGVycm9yLlxuIikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9FTkNSWVBUSU9ORVJST1I7CiAgICAgICAgfQojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgaWYgKGRlYnVnX2lzX3Rva2VuX3JlZ2lzdGVyZWQoInVzbS9kdW1wIikgPT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIGR1bXBfY2h1bmsoInVzbS9kdW1wIiwgIlRoaXMgZGF0YSB3YXMgZW5jcnlwdGVkOiIsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUGR1LCBzY29wZWRQZHVMZW4pOwogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJzYWx0ICsgRW5jcnlwdGVkIGZvcm06IiwKICAgICAgICAgICAgICAgICAgICAgICBzYWx0LCBzYWx0X2xlbmd0aCk7CiAgICAgICAgICAgIGR1bXBfY2h1bmsoInVzbS9kdW1wIiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAmcHRyW2RhdGFPZmZzZXRdLCBlbmNyeXB0ZWRfbGVuZ3RoKTsKICAgICAgICAgICAgZHVtcF9jaHVuaygidXNtL2R1bXAiLCAiKndob2xlTXNnOiIsCiAgICAgICAgICAgICAgICAgICAgICAgKndob2xlTXNnLCB0aGVUb3RhbExlbmd0aCk7CiAgICAgICAgfQojZW5kaWYKCgogICAgICAgIHB0ciA9ICp3aG9sZU1zZzsKICAgICAgICBwdHJfbGVuID0gKndob2xlTXNnTGVuID0gdGhlVG90YWxMZW5ndGg7CgoKICAgICAgICAvKgogICAgICAgICAqIFhYWCAgU2FuaXR5IGNoZWNrIGZvciBzYWx0IGxlbmd0aCBzaG91bGQgYmUgbW92ZWQgdXAKICAgICAgICAgKiAgICAgIHVuZGVyIHVzbV9jYWxjX29mZnNldHMoKSBvciB0b3NzZWQuCiAgICAgICAgICovCiAgICAgICAgaWYgKChlbmNyeXB0ZWRfbGVuZ3RoICE9ICh0aGVUb3RhbExlbmd0aCAtIGRhdGFPZmZzZXQpKQogICAgICAgICAgICB8fCAoc2FsdF9sZW5ndGggIT0gbXNnUHJpdlBhcm1MZW4pKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiZW5jcnlwdGlvbiBsZW5ndGggZXJyb3IuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0VOQ1JZUFRJT05FUlJPUjsKICAgICAgICB9CgogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiRW5jcnlwdGlvbiBzdWNjZXNzZnVsLlxuIikpOwogICAgfQoKICAgIC8qCiAgICAgKiBObyBlbmNyeXB0aW9uIGZvciB5b3UhCiAgICAgKi8KICAgIGVsc2UgewogICAgICAgIG1lbWNweSgmcHRyW2RhdGFPZmZzZXRdLCBzY29wZWRQZHUsIHNjb3BlZFBkdUxlbik7CiAgICB9CgoKCiAgICAvKgogICAgICogU3RhcnQgZmlsbGluZyBpbiB0aGUgb3RoZXIgZmllbGRzIChpbiBwcmVwIGZvciBhdXRoZW50aWNhdGlvbikuCiAgICAgKiAKICAgICAqIG9mZlNldCBpcyBhbiBvY3RldCBzdHJpbmcgaGVhZGVyLCB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSBhbGwKICAgICAqIHRoZSBvdGhlciBoZWFkZXJzLgogICAgICovCiAgICByZW1haW5pbmcgPSBwdHJfbGVuIC0gZ2xvYmFsRGF0YUxlbjsKCiAgICBvZmZTZXQgPSBwdHJfbGVuIC0gcmVtYWluaW5nOwogICAgYXNuX2J1aWxkX2hlYWRlcigmcHRyW29mZlNldF0sICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSKSwgb3RzdGxlbik7CgogICAgb2ZmU2V0ID0gcHRyX2xlbiAtIHJlbWFpbmluZzsKICAgIGFzbl9idWlsZF9zZXF1ZW5jZSgmcHRyW29mZlNldF0sICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9TRVFVRU5DRSB8IEFTTl9DT05TVFJVQ1RPUiksIHNlcV9sZW4pOwoKICAgIG9mZlNldCA9IHB0cl9sZW4gLSByZW1haW5pbmc7CiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlEIik7CiAgICBhc25fYnVpbGRfc3RyaW5nKCZwdHJbb2ZmU2V0XSwgJnJlbWFpbmluZywKICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9PQ1RFVF9TVFIpLCB0aGVFbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICAgdGhlRW5naW5lSURMZW5ndGgpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgb2ZmU2V0ID0gcHRyX2xlbiAtIHJlbWFpbmluZzsKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJtc2dBdXRob3JpdGF0aXZlRW5naW5lQm9vdHMiKTsKICAgIGFzbl9idWlsZF9pbnQoJnB0cltvZmZTZXRdLCAmcmVtYWluaW5nLAogICAgICAgICAgICAgICAgICAodV9jaGFyKSAoQVNOX1VOSVZFUlNBTCB8IEFTTl9QUklNSVRJVkUgfCBBU05fSU5URUdFUiksCiAgICAgICAgICAgICAgICAgICZib290c19sb25nLCBzaXplb2YobG9uZykpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgb2ZmU2V0ID0gcHRyX2xlbiAtIHJlbWFpbmluZzsKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJtc2dBdXRob3JpdGF0aXZlRW5naW5lVGltZSIpOwogICAgYXNuX2J1aWxkX2ludCgmcHRyW29mZlNldF0sICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8IEFTTl9JTlRFR0VSKSwKICAgICAgICAgICAgICAgICAgJnRpbWVfbG9uZywgc2l6ZW9mKGxvbmcpKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIG9mZlNldCA9IHB0cl9sZW4gLSByZW1haW5pbmc7CiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnVXNlck5hbWUiKTsKICAgIGFzbl9idWlsZF9zdHJpbmcoJnB0cltvZmZTZXRdLCAmcmVtYWluaW5nLAogICAgICAgICAgICAgICAgICAgICAodV9jaGFyKSAoQVNOX1VOSVZFUlNBTCB8IEFTTl9QUklNSVRJVkUgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiksICh1X2NoYXIgKikgdGhlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgdGhlTmFtZUxlbmd0aCk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKCgogICAgLyoKICAgICAqIE5vdGU6IGlmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uIGJlaW5nIGRvbmUsCiAgICAgKiBtc2dBdXRoUGFybUxlbiBpcyAwLCBhbmQgdGhlcmUgaXMgbm8gZWZmZWN0IChvdGhlciB0aGFuCiAgICAgKiBpbnNlcnRpbmcgYSB6ZXJvLWxlbmd0aCBoZWFkZXIpIG9mIHRoZSBmb2xsb3dpbmcKICAgICAqIHN0YXRlbWVudHMuCiAgICAgKi8KCiAgICBvZmZTZXQgPSBwdHJfbGVuIC0gcmVtYWluaW5nOwogICAgYXNuX2J1aWxkX2hlYWRlcigmcHRyW29mZlNldF0sCiAgICAgICAgICAgICAgICAgICAgICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSKSwgbXNnQXV0aFBhcm1MZW4pOwoKICAgIGlmICh0aGVTZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWCiAgICAgICAgfHwgdGhlU2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBvZmZTZXQgPSBwdHJfbGVuIC0gcmVtYWluaW5nOwogICAgICAgIG1lbXNldCgmcHRyW29mZlNldF0sIDAsIG1zZ0F1dGhQYXJtTGVuKTsKICAgIH0KCiAgICByZW1haW5pbmcgLT0gbXNnQXV0aFBhcm1MZW47CgoKICAgIC8qCiAgICAgKiBOb3RlOiBpZiB0aGVyZSBpcyBubyBlbmNyeXB0aW9uIGJlaW5nIGRvbmUsIG1zZ1ByaXZQYXJtTGVuCiAgICAgKiBpcyAwLCBhbmQgdGhlcmUgaXMgbm8gZWZmZWN0IChvdGhlciB0aGFuIGluc2VydGluZyBhCiAgICAgKiB6ZXJvLWxlbmd0aCBoZWFkZXIpIG9mIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cy4KICAgICAqLwoKICAgIG9mZlNldCA9IHB0cl9sZW4gLSByZW1haW5pbmc7CiAgICBhc25fYnVpbGRfaGVhZGVyKCZwdHJbb2ZmU2V0XSwKICAgICAgICAgICAgICAgICAgICAgJnJlbWFpbmluZywKICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9PQ1RFVF9TVFIpLCBtc2dQcml2UGFybUxlbik7CgogICAgcmVtYWluaW5nIC09IG1zZ1ByaXZQYXJtTGVuOyAgICAgICAgLyogU2tpcHBpbmcgdGhlIElWIGFscmVhZHkgdGhlcmUuICovCgoKICAgIC8qCiAgICAgKiBGb3IgcHJpdmFjeSwgbmVlZCB0byBhZGQgdGhlIG9jdGV0IHN0cmluZyBoZWFkZXIgZm9yIGl0LgogICAgICovCiAgICBpZiAodGhlU2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBvZmZTZXQgPSBwdHJfbGVuIC0gcmVtYWluaW5nOwogICAgICAgIGFzbl9idWlsZF9oZWFkZXIoJnB0cltvZmZTZXRdLAogICAgICAgICAgICAgICAgICAgICAgICAgJnJlbWFpbmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiksCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUb3RhbExlbmd0aCAtIGRhdGFPZmZzZXQpOwogICAgfQoKCiAgICAvKgogICAgICogQWRqdXN0IG92ZXJhbGwgbGVuZ3RoIGFuZCBzdG9yZSBpdCBhcyB0aGUgZmlyc3QgU0VRIGxlbmd0aAogICAgICogb2YgdGhlIFNOTVB2M01lc3NhZ2UuCiAgICAgKgogICAgICogRklYICA0IGlzIGEgbWFnaWMgbnVtYmVyIQogICAgICovCiAgICByZW1haW5pbmcgPSB0aGVUb3RhbExlbmd0aDsKICAgIGFzbl9idWlsZF9zZXF1ZW5jZShwdHIsICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9TRVFVRU5DRSB8IEFTTl9DT05TVFJVQ1RPUiksCiAgICAgICAgICAgICAgICAgICAgICAgdGhlVG90YWxMZW5ndGggLSA0KTsKCgogICAgLyoKICAgICAqIE5vdywgdGltZSB0byBjb25zaWRlciAvIGRvIGF1dGhlbnRpY2F0aW9uLgogICAgICovCiAgICBpZiAodGhlU2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSE5PUFJJVgogICAgICAgIHx8IHRoZVNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSB7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIHRlbXBfc2lnX2xlbiA9IG1zZ0F1dGhQYXJtTGVuOwogICAgICAgIHVfY2hhciAgICAgICAgICp0ZW1wX3NpZyA9ICh1X2NoYXIgKikgbWFsbG9jKHRlbXBfc2lnX2xlbik7CgogICAgICAgIGlmICh0ZW1wX3NpZyA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiT3V0IG9mIG1lbW9yeS5cbiIpKTsKICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNjX2dlbmVyYXRlX2tleWVkX2hhc2godGhlQXV0aFByb3RvY29sLCB0aGVBdXRoUHJvdG9jb2xMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXV0aEtleSwgdGhlQXV0aEtleUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIsIHB0cl9sZW4sIHRlbXBfc2lnLCAmdGVtcF9zaWdfbGVuKQogICAgICAgICAgICAhPSBTTk1QX0VSUl9OT0VSUk9SKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEZJWCB0ZW1wX3NpZ19sZW4gZGVmaW5lZD8hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBTTk1QX1pFUk8odGVtcF9zaWcsIHRlbXBfc2lnX2xlbik7CiAgICAgICAgICAgIFNOTVBfRlJFRSh0ZW1wX3NpZyk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiU2lnbmluZyBmYWlsZWQuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0FVVEhFTlRJQ0FUSU9ORkFJTFVSRTsKICAgICAgICB9CgogICAgICAgIGlmICh0ZW1wX3NpZ19sZW4gIT0gbXNnQXV0aFBhcm1MZW4pIHsKICAgICAgICAgICAgU05NUF9aRVJPKHRlbXBfc2lnLCB0ZW1wX3NpZ19sZW4pOwogICAgICAgICAgICBTTk1QX0ZSRUUodGVtcF9zaWcpOwogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIlNpZ25pbmcgbGVuZ3RocyBmYWlsZWQuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0FVVEhFTlRJQ0FUSU9ORkFJTFVSRTsKICAgICAgICB9CgogICAgICAgIG1lbWNweSgmcHRyW2F1dGhQYXJhbXNPZmZzZXRdLCB0ZW1wX3NpZywgbXNnQXV0aFBhcm1MZW4pOwoKICAgICAgICBTTk1QX1pFUk8odGVtcF9zaWcsIHRlbXBfc2lnX2xlbik7CiAgICAgICAgU05NUF9GUkVFKHRlbXBfc2lnKTsKCiAgICB9CgogICAgLyoKICAgICAqIGVuZGlmIC0tIGNyZWF0ZSBrZXllZCBoYXNoIAogICAgICovCiAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CgogICAgREVCVUdNU0dUTCgoInVzbSIsICJVU00gcHJvY2Vzc2luZyBjb21wbGV0ZWQuXG4iKSk7CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9nZW5lcmF0ZV9vdXRfbXNnKCkgKi8KCiNpZmRlZiBORVRTTk1QX1VTRV9SRVZFUlNFX0FTTkVOQ09ESU5HCmludAp1c21fc2VjbW9kX3JnZW5lcmF0ZV9vdXRfbXNnKHN0cnVjdCBzbm1wX3NlY21vZF9vdXRnb2luZ19wYXJhbXMgKnBhcm1zKQp7CiAgICBpZiAoIXBhcm1zKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICByZXR1cm4gdXNtX3JnZW5lcmF0ZV9vdXRfbXNnKHBhcm1zLT5tc2dQcm9jTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5nbG9iYWxEYXRhLCBwYXJtcy0+Z2xvYmFsRGF0YUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPm1heE1zZ1NpemUsIHBhcm1zLT5zZWNNb2RlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY0VuZ2luZUlELCBwYXJtcy0+c2VjRW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNOYW1lLCBwYXJtcy0+c2VjTmFtZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY0xldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2NvcGVkUGR1LCBwYXJtcy0+c2NvcGVkUGR1TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjU3RhdGVSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT53aG9sZU1zZywgcGFybXMtPndob2xlTXNnTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+d2hvbGVNc2dPZmZzZXQpOwp9CgppbnQKdXNtX3JnZW5lcmF0ZV9vdXRfbXNnKGludCBtc2dQcm9jTW9kZWwsIC8qIChVTlVTRUQpICovCiAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBnbG9iYWxEYXRhLCAgICAgIC8qIElOICovCiAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICogcG9pbnRzIGF0IHRoZSBtc2dHbG9iYWxEYXRhLCB3aGljaCBpcyBvZiBsZW5ndGggZ2l2ZW4gYnkgbmV4dCAKICAgICAgICAgICAgICAgICAgICAgICAqIHBhcmFtZXRlci4gIAogICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZ2xvYmFsRGF0YUxlbiwgICAgIC8qIElOIC0gTGVuZ3RoIG9mIG1zZyBoZWFkZXIgZGF0YS4gICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgaW50IG1heE1zZ1NpemUsICAgLyogKFVOVVNFRCkgKi8KICAgICAgICAgICAgICAgICAgICAgIGludCBzZWNNb2RlbCwgICAgIC8qIChVTlVTRUQpICovCiAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzZWNFbmdpbmVJRCwgICAgIC8qIElOIC0gUG9pbnRlciBzbm1wRW5naW5lSUQuICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlY0VuZ2luZUlETGVuLCAgICAvKiBJTiAtIFNubXBFbmdpbmVJRCBsZW5ndGguICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnNlY05hbWUsICAgIC8qIElOIC0gUG9pbnRlciB0byBzZWN1cml0eU5hbWUuICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlY05hbWVMZW4sICAgICAgICAvKiBJTiAtIFNlY3VyaXR5TmFtZSBsZW5ndGguICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgIGludCBzZWNMZXZlbCwgICAgIC8qIElOIC0gQXV0aE5vUHJpdiwgYXV0aFByaXYgZXRjLiAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc2NvcGVkUGR1LCAgICAgICAvKiBJTiAqLwogICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAqIFBvaW50ZXIgdG8gc2NvcGVkUGR1IHdpbGwgYmUgZW5jcnlwdGVkIGJ5IFVTTSBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgICAqICogYW5kIHdyaXR0ZW4gdG8gcGFja2V0IGJ1ZmZlciBpbW1lZGlhdGVseSBmb2xsb3dpbmcKICAgICAgICAgICAgICAgICAgICAgICAqICogc2VjdXJpdHlQYXJhbWV0ZXJzLCBlbnRpcmUgbXNnIHdpbGwgYmUgYXV0aGVudGljYXRlZCBieQogICAgICAgICAgICAgICAgICAgICAgICogKiBVU00gaWYgbmVlZGVkLgogICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2NvcGVkUGR1TGVuLCAgICAgIC8qIElOIC0gc2NvcGVkUGR1IGxlbmd0aC4gKi8KICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNlY1N0YXRlUmVmLCAgICAgICAgLyogSU4gKi8KICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgKiBzZWNTdGF0ZVJlZiwgcG9pbnRlciB0byBjYWNoZWQgaW5mbyBwcm92aWRlZCBvbmx5IGZvcgogICAgICAgICAgICAgICAgICAgICAgICogKiBSZXNwb25zZSwgb3RoZXJ3aXNlIE5VTEwuCiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiB3aG9sZU1zZywgICAgICAgLyogIElOL09VVCAgKi8KICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgKiBQb2ludHMgYXQgdGhlIHBvaW50ZXIgdG8gdGhlIHBhY2tldCBidWZmZXIsIHdoaWNoIG1pZ2h0IGdldCBleHRlbmRlZAogICAgICAgICAgICAgICAgICAgICAgICogaWYgbmVjZXNzYXJ5IHZpYSByZWFsbG9jKCkuICAKICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogd2hvbGVNc2dMZW4sICAgICAvKiAgSU4vT1VUICAqLwogICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAqIExlbmd0aCBvZiB0aGUgZW50aXJlIHBhY2tldCBidWZmZXIsICoqbm90KiogdGhlIGxlbmd0aCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAqIHBhY2tldC4gIAogICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvZmZzZXQgICAvKiAgSU4vT1VUICAqLwogICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAqIE9mZnNldCBmcm9tIHRoZSBlbmQgb2YgdGhlIHBhY2tldCBidWZmZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgKiBhbHNvIGtub3duIGFzIHRoZSBwYWNrZXQgbGVuZ3RoLiAgCiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICkKewogICAgc2l6ZV90ICAgICAgICAgIG1zZ0F1dGhQYXJtTGVuID0gMDsKI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgc2l6ZV90ICAgICAgICAgIHRoZVRvdGFsTGVuZ3RoOwojZW5kaWYKCiAgICB1X2ludCAgICAgICAgICAgYm9vdHNfdWludDsKICAgIHVfaW50ICAgICAgICAgICB0aW1lX3VpbnQ7CiAgICBsb25nICAgICAgICAgICAgYm9vdHNfbG9uZzsKICAgIGxvbmcgICAgICAgICAgICB0aW1lX2xvbmc7CgogICAgLyoKICAgICAqIEluZGlyZWN0aW9uIGJlY2F1c2Ugc2VjU3RhdGVSZWYgdmFsdWVzIG92ZXJyaWRlIHBhcmFtZXRlcnMuCiAgICAgKiAKICAgICAqIE5vbmUgb2YgdGhlc2UgYXJlIHRvIGJlIGZyZWUnZCAtIHRoZXkgYXJlIGVpdGhlciBwb2ludGluZyB0bwogICAgICogd2hhdCdzIGluIHRoZSBzZWNTdGF0ZVJlZiBvciB0byBzb21ldGhpbmcgZWl0aGVyIGluIHRoZQogICAgICogYWN0dWFsIHBhcmFtZXRlciBsaXN0IG9yIHRoZSB1c2VyIGxpc3QuCiAgICAgKi8KCiAgICBjaGFyICAgICAgICAgICAqdGhlTmFtZSA9IE5VTEw7CiAgICB1X2ludCAgICAgICAgICAgdGhlTmFtZUxlbmd0aCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAqdGhlRW5naW5lSUQgPSBOVUxMOwogICAgdV9pbnQgICAgICAgICAgIHRoZUVuZ2luZUlETGVuZ3RoID0gMDsKICAgIHVfY2hhciAgICAgICAgICp0aGVBdXRoS2V5ID0gTlVMTDsKICAgIHVfaW50ICAgICAgICAgICB0aGVBdXRoS2V5TGVuZ3RoID0gMDsKICAgIGNvbnN0IG9pZCAgICAgICp0aGVBdXRoUHJvdG9jb2wgPSBOVUxMOwogICAgdV9pbnQgICAgICAgICAgIHRoZUF1dGhQcm90b2NvbExlbmd0aCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAqdGhlUHJpdktleSA9IE5VTEw7CiAgICB1X2ludCAgICAgICAgICAgdGhlUHJpdktleUxlbmd0aCA9IDA7CiAgICBjb25zdCBvaWQgICAgICAqdGhlUHJpdlByb3RvY29sID0gTlVMTDsKICAgIHVfaW50ICAgICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGggPSAwOwogICAgaW50ICAgICAgICAgICAgIHRoZVNlY0xldmVsID0gMDsgICAgLyogTm8gZGVmaW5lZCBjb25zdCBmb3IgYmFkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2YWx1ZSAob3RoZXIgdGhlbiBlcnIpLiAqLwogICAgc2l6ZV90ICAgICAgICAgIHNhbHRfbGVuZ3RoID0gMCwgc2F2ZV9zYWx0X2xlbmd0aCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAgc2FsdFtCWVRFU0laRShVU01fTUFYX1NBTFRfTEVOR1RIKV07CiAgICB1X2NoYXIgICAgICAgICAgYXV0aFBhcmFtc1tVU01fTUFYX0FVVEhTSVpFXTsKICAgIHVfY2hhciAgICAgICAgICBpdltCWVRFU0laRShVU01fTUFYX1NBTFRfTEVOR1RIKV07CiAgICBzaXplX3QgICAgICAgICAgc3Bfb2Zmc2V0ID0gMCwgbWFjX29mZnNldCA9IDA7CiAgICBpbnQgICAgICAgICAgICAgcmMgPSAwOwoKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVVNNIHByb2Nlc3NpbmcgaGFzIGJlZ3VuIChvZmZzZXQgJWQpXG4iLCAoaW50KSpvZmZzZXQpKTsKCiAgICBpZiAoc2VjU3RhdGVSZWYgIT0gTlVMTCkgewogICAgICAgIC8qCiAgICAgICAgICogVG8gaHVzaCB0aGUgY29tcGlsZXIgZm9yIG5vdy4gIFhYWCAKICAgICAgICAgKi8KICAgICAgICBzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKnJlZgogICAgICAgICAgICA9IChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKikgc2VjU3RhdGVSZWY7CgogICAgICAgIHRoZU5hbWUgPSByZWYtPnVzcl9uYW1lOwogICAgICAgIHRoZU5hbWVMZW5ndGggPSByZWYtPnVzcl9uYW1lX2xlbmd0aDsKICAgICAgICB0aGVFbmdpbmVJRCA9IHJlZi0+dXNyX2VuZ2luZV9pZDsKICAgICAgICB0aGVFbmdpbmVJRExlbmd0aCA9IHJlZi0+dXNyX2VuZ2luZV9pZF9sZW5ndGg7CgogICAgICAgIGlmICghdGhlRW5naW5lSURMZW5ndGgpIHsKICAgICAgICAgICAgdGhlRW5naW5lSUQgPSBzZWNFbmdpbmVJRDsKICAgICAgICAgICAgdGhlRW5naW5lSURMZW5ndGggPSBzZWNFbmdpbmVJRExlbjsKICAgICAgICB9CgogICAgICAgIHRoZUF1dGhQcm90b2NvbCA9IHJlZi0+dXNyX2F1dGhfcHJvdG9jb2w7CiAgICAgICAgdGhlQXV0aFByb3RvY29sTGVuZ3RoID0gcmVmLT51c3JfYXV0aF9wcm90b2NvbF9sZW5ndGg7CiAgICAgICAgdGhlQXV0aEtleSA9IHJlZi0+dXNyX2F1dGhfa2V5OwogICAgICAgIHRoZUF1dGhLZXlMZW5ndGggPSByZWYtPnVzcl9hdXRoX2tleV9sZW5ndGg7CiAgICAgICAgdGhlUHJpdlByb3RvY29sID0gcmVmLT51c3JfcHJpdl9wcm90b2NvbDsKICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGggPSByZWYtPnVzcl9wcml2X3Byb3RvY29sX2xlbmd0aDsKICAgICAgICB0aGVQcml2S2V5ID0gcmVmLT51c3JfcHJpdl9rZXk7CiAgICAgICAgdGhlUHJpdktleUxlbmd0aCA9IHJlZi0+dXNyX3ByaXZfa2V5X2xlbmd0aDsKICAgICAgICB0aGVTZWNMZXZlbCA9IHJlZi0+dXNyX3NlY19sZXZlbDsKICAgIH0KCiAgICAvKgogICAgICogKiBJZGVudGlmeSB0aGUgdXNlciByZWNvcmQuCiAgICAgKi8KICAgIGVsc2UgewogICAgICAgIHN0cnVjdCB1c21Vc2VyICp1c2VyOwoKICAgICAgICAvKgogICAgICAgICAqIHdlIGRvIGFsbG93IGFuIHVua25vd24gdXNlciBuYW1lIGZvcgogICAgICAgICAqIHVuYXV0aGVudGljYXRlZCByZXF1ZXN0cy4gCiAgICAgICAgICovCiAgICAgICAgaWYgKCh1c2VyID0gdXNtX2dldF91c2VyKHNlY0VuZ2luZUlELCBzZWNFbmdpbmVJRExlbiwgc2VjTmFtZSkpCiAgICAgICAgICAgID09IE5VTEwgJiYgc2VjTGV2ZWwgIT0gU05NUF9TRUNfTEVWRUxfTk9BVVRIKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVW5rbm93biBVc2VyXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1VOS05PV05TRUNVUklUWU5BTUU7CiAgICAgICAgfQoKICAgICAgICB0aGVOYW1lID0gc2VjTmFtZTsKICAgICAgICB0aGVOYW1lTGVuZ3RoID0gc2VjTmFtZUxlbjsKICAgICAgICB0aGVFbmdpbmVJRCA9IHNlY0VuZ2luZUlEOwogICAgICAgIHRoZVNlY0xldmVsID0gc2VjTGV2ZWw7CiAgICAgICAgdGhlRW5naW5lSURMZW5ndGggPSBzZWNFbmdpbmVJRExlbjsKICAgICAgICBpZiAodXNlcikgewogICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2wgPSB1c2VyLT5hdXRoUHJvdG9jb2w7CiAgICAgICAgICAgIHRoZUF1dGhQcm90b2NvbExlbmd0aCA9IHVzZXItPmF1dGhQcm90b2NvbExlbjsKICAgICAgICAgICAgdGhlQXV0aEtleSA9IHVzZXItPmF1dGhLZXk7CiAgICAgICAgICAgIHRoZUF1dGhLZXlMZW5ndGggPSB1c2VyLT5hdXRoS2V5TGVuOwogICAgICAgICAgICB0aGVQcml2UHJvdG9jb2wgPSB1c2VyLT5wcml2UHJvdG9jb2w7CiAgICAgICAgICAgIHRoZVByaXZQcm90b2NvbExlbmd0aCA9IHVzZXItPnByaXZQcm90b2NvbExlbjsKICAgICAgICAgICAgdGhlUHJpdktleSA9IHVzZXItPnByaXZLZXk7CiAgICAgICAgICAgIHRoZVByaXZLZXlMZW5ndGggPSB1c2VyLT5wcml2S2V5TGVuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHVua25vd24gdXNlcnMgY2FuIG5vdCBkbyBhdXRoZW50aWNhdGlvbiAob2J2aW91c2x5KSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoZUF1dGhQcm90b2NvbCA9IHVzbU5vQXV0aFByb3RvY29sOwogICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGggPQogICAgICAgICAgICAgICAgc2l6ZW9mKHVzbU5vQXV0aFByb3RvY29sKSAvIHNpemVvZihvaWQpOwogICAgICAgICAgICB0aGVBdXRoS2V5ID0gTlVMTDsKICAgICAgICAgICAgdGhlQXV0aEtleUxlbmd0aCA9IDA7CiAgICAgICAgICAgIHRoZVByaXZQcm90b2NvbCA9IHVzbU5vUHJpdlByb3RvY29sOwogICAgICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGggPQogICAgICAgICAgICAgICAgc2l6ZW9mKHVzbU5vUHJpdlByb3RvY29sKSAvIHNpemVvZihvaWQpOwogICAgICAgICAgICB0aGVQcml2S2V5ID0gTlVMTDsKICAgICAgICAgICAgdGhlUHJpdktleUxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZGlmIC0tIHNlY1N0YXRlUmVmPT1OVUxMICovCgoKICAgIC8qCiAgICAgKiBGcm9tIGhlcmUgdG8gdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIGF2b2lkIHJlZmVyZW5jZSB0bwogICAgICogc2VjTmFtZSwgc2VjRW5naW5lSUQsIHNlY0xldmVsLCBhbmQgYXNzb2NpYXRlZCBsZW5ndGhzLgogICAgICovCgoKICAgIC8qCiAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHVzZXIgY2FuIHVzZSB0aGUgcmVxdWVzdGVkIHNlYyBzZXJ2aWNlcy4KICAgICAqLwogICAgaWYgKHVzbV9jaGVja19zZWNMZXZlbF92c19wcm90b2NvbHModGhlU2VjTGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGgpID09IDEpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIlVuc3VwcG9ydGVkIFNlY3VyaXR5IExldmVsIG9yIHR5cGUgKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICB0aGVTZWNMZXZlbCkpOwoKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1VOU1VQUE9SVEVEU0VDVVJJVFlMRVZFTDsKICAgIH0KCgogICAgLyoKICAgICAqICogUmV0cmlldmUgdGhlIGVuZ2luZSBpbmZvcm1hdGlvbi4KICAgICAqICoKICAgICAqICogWFhYICAgIE5vIGVycm9yIGlzIGRlY2xhcmVkIGluIHRoZSBFb1Agd2hlbiBzZW5kaW5nIG1lc3NhZ2VzIHRvCiAgICAgKiAqICAgICAgICB1bmtub3duIGVuZ2luZXMsIHByb2Nlc3NpbmcgY29udGludWVzIHcvIGJvb3RzL3RpbWUgPT0gKDAsMCkuCiAgICAgKi8KICAgIGlmIChnZXRfZW5naW5ldGltZSh0aGVFbmdpbmVJRCwgdGhlRW5naW5lSURMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgJmJvb3RzX3VpbnQsICZ0aW1lX3VpbnQsIEZBTFNFKSA9PSAtMSkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgdG8gZmluZCBlbmdpbmUgZGF0YS4iKSk7CiAgICB9CgogICAgYm9vdHNfbG9uZyA9IGJvb3RzX3VpbnQ7CiAgICB0aW1lX2xvbmcgPSB0aW1lX3VpbnQ7CgogICAgaWYgKHRoZVNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBJbml0aWFsbHkgYXNzdW1lIHRoYXQgdGhlIGNpcGhlcnRleHQgd2lsbCBlbmQgdXAgdGhlIHNhbWUgc2l6ZSBhcwogICAgICAgICAqIHRoZSBwbGFpbnRleHQgcGx1cyBzb21lIHBhZGRpbmcuICBSZWFsbHkgc2NfZW5jcnlwdCBvdWdodCB0byBiZSBhYmxlCiAgICAgICAgICogdG8gZ3JvdyB0aGlzIGZvciB1cywgYSBsYSBhc25fcmVhbGxvY19yYnVpbGRfPHR5cGU+IGZ1bmN0aW9ucywgYnV0CiAgICAgICAgICogdGhpcyB3aWxsIGRvIGZvciBub3cuICAKICAgICAgICAgKi8KICAgICAgICB1X2NoYXIgICAgICAgICAqY2lwaGVydGV4dCA9IE5VTEw7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIGNpcGhlcnRleHRsZW4gPSBzY29wZWRQZHVMZW4gKyA2NDsKCiAgICAgICAgaWYgKChjaXBoZXJ0ZXh0ID0gKHVfY2hhciAqKSBtYWxsb2MoY2lwaGVydGV4dGxlbikpID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZG4ndCBtYWxsb2MgJWQgYnl0ZXMgZm9yIGVuY3J5cHRlZCBQRFVcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpY2lwaGVydGV4dGxlbikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX01BTExPQzsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogWFhYIEhhcmR3aXJlZCB0byBzZWVrIGludG8gYSAxREVTIHByaXZhdGUga2V5ISAgCiAgICAgICAgICovCiNpZmRlZiBIQVZFX0FFUwogICAgICAgIGlmIChJU1RSQU5TRk9STSh0aGVQcml2UHJvdG9jb2wsIEFFU1ByaXYpKSB7CiAgICAgICAgICAgIHNhbHRfbGVuZ3RoID0gQllURVNJWkUoVVNNX0FFU19TQUxUX0xFTkdUSCk7CiAgICAgICAgICAgIHNhdmVfc2FsdF9sZW5ndGggPSBCWVRFU0laRShVU01fQUVTX1NBTFRfTEVOR1RIKS8yOwogICAgICAgICAgICBpZiAoIXRoZVByaXZLZXkgfHwKICAgICAgICAgICAgICAgIHVzbV9zZXRfYWVzX2l2KHNhbHQsICZzYWx0X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0b25sKGJvb3RzX3VpbnQpLCBodG9ubCh0aW1lX3VpbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYpID09IC0xKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkNhbid0IHNldCBBRVMgaXYuXG4iKSk7CiAgICAgICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoY2lwaGVydGV4dCk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgfSAKI2VuZGlmCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwogICAgICAgIGlmIChJU1RSQU5TRk9STSh0aGVQcml2UHJvdG9jb2wsIERFU1ByaXYpKSB7CiAgICAgICAgICAgIHNhbHRfbGVuZ3RoID0gQllURVNJWkUoVVNNX0RFU19TQUxUX0xFTkdUSCk7CiAgICAgICAgICAgIHNhdmVfc2FsdF9sZW5ndGggPSBCWVRFU0laRShVU01fREVTX1NBTFRfTEVOR1RIKTsKICAgICAgICAgICAgaWYgKCF0aGVQcml2S2V5IHx8ICh1c21fc2V0X3NhbHQoc2FsdCwgJnNhbHRfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQcml2S2V5ICsgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHJpdktleUxlbmd0aCAtIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2KSA9PSAtMSkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiQ2FuJ3Qgc2V0IERFUy1DQkMgc2FsdC5cbiIpKTsKICAgICAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgICAgIFNOTVBfRlJFRShjaXBoZXJ0ZXh0KTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgaWYgKGRlYnVnX2lzX3Rva2VuX3JlZ2lzdGVyZWQoInVzbS9kdW1wIikgPT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIGR1bXBfY2h1bmsoInVzbS9kdW1wIiwgIlRoaXMgZGF0YSB3YXMgZW5jcnlwdGVkOiIsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUGR1LCBzY29wZWRQZHVMZW4pOwogICAgICAgIH0KI2VuZGlmCgogICAgICAgIGlmIChzY19lbmNyeXB0KHRoZVByaXZQcm90b2NvbCwgdGhlUHJpdlByb3RvY29sTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgIHRoZVByaXZLZXksIHRoZVByaXZLZXlMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUGR1LCBzY29wZWRQZHVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dCwgJmNpcGhlcnRleHRsZW4pICE9IFNOTVBfRVJSX05PRVJST1IpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJlbmNyeXB0aW9uIGVycm9yLlxuIikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIFNOTVBfRlJFRShjaXBoZXJ0ZXh0KTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0VOQ1JZUFRJT05FUlJPUjsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogV3JpdGUgdGhlIGVuY3J5cHRlZCBzY29wZWRQZHUgYmFjayBpbnRvIHRoZSBwYWNrZXQgYnVmZmVyLiAgCiAgICAgICAgICovCgojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgdGhlVG90YWxMZW5ndGggPSAqd2hvbGVNc2dMZW47CiNlbmRpZgogICAgICAgICpvZmZzZXQgPSAwOwogICAgICAgIHJjID0gYXNuX3JlYWxsb2NfcmJ1aWxkX3N0cmluZyh3aG9sZU1zZywgd2hvbGVNc2dMZW4sIG9mZnNldCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dCwgY2lwaGVydGV4dGxlbik7CiAgICAgICAgaWYgKHJjID09IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJFbmNyeXB0aW9uIGZhaWxlZC5cbiIpKTsKICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgICAgICBTTk1QX0ZSRUUoY2lwaGVydGV4dCk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9FTkNSWVBUSU9ORVJST1I7CiAgICAgICAgfQoKI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgICAgIGlmIChkZWJ1Z19pc190b2tlbl9yZWdpc3RlcmVkKCJ1c20vZHVtcCIpID09IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJzYWx0ICsgRW5jcnlwdGVkIGZvcm06ICIsIHNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgc2FsdF9sZW5ndGgpOwogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJ3aG9sZU1zZzoiLAogICAgICAgICAgICAgICAgICAgICAgICgqd2hvbGVNc2cgKyAqd2hvbGVNc2dMZW4gLSAqb2Zmc2V0KSwgKm9mZnNldCk7CiAgICAgICAgfQojZW5kaWYKCiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJFbmNyeXB0aW9uIHN1Y2Nlc3NmdWwuXG4iKSk7CiAgICAgICAgU05NUF9GUkVFKGNpcGhlcnRleHQpOwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIHRoZVNlY0xldmVsICE9IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWICAKICAgICAgICAgKi8KICAgIH0KCiAgICAvKgogICAgICogU3RhcnQgZW5jb2RpbmcgdGhlIG1zZ1NlY3VyaXR5UGFyYW1ldGVycy4gIAogICAgICovCgogICAgc3Bfb2Zmc2V0ID0gKm9mZnNldDsKCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnUHJpdmFjeVBhcmFtZXRlcnMiKTsKICAgIC8qCiAgICAgKiBtc2dQcml2YWN5UGFyYW1ldGVycyAod2FybmluZzogYXNzdW1lcyBERVMgc2FsdCkuICAKICAgICAqLwogICAgcmMgPSBhc25fcmVhbGxvY19yYnVpbGRfc3RyaW5nKHdob2xlTXNnLCB3aG9sZU1zZ0xlbiwgb2Zmc2V0LCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFTTl9PQ1RFVF9TVFIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVfc2FsdF9sZW5ndGgpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBpZiAocmMgPT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiYnVpbGRpbmcgcHJpdlBhcmFtcyBmYWlsZWQuXG4iKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1RPT19MT05HOwogICAgfQoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMiKTsKICAgIC8qCiAgICAgKiBtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMgKHdhcm5pbmdzIGFzc3VtZXMgMHgwMCBieSAxMikuICAKICAgICAqLwogICAgaWYgKHRoZVNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhOT1BSSVYKICAgICAgICB8fCB0aGVTZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVikgewogICAgICAgIG1lbXNldChhdXRoUGFyYW1zLCAwLCBVU01fTUQ1X0FORF9TSEFfQVVUSF9MRU4pOwogICAgICAgIG1zZ0F1dGhQYXJtTGVuID0gVVNNX01ENV9BTkRfU0hBX0FVVEhfTEVOOwogICAgfQoKICAgIHJjID0gYXNuX3JlYWxsb2NfcmJ1aWxkX3N0cmluZyh3aG9sZU1zZywgd2hvbGVNc2dMZW4sIG9mZnNldCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyKSAoQVNOX1VOSVZFUlNBTCB8IEFTTl9QUklNSVRJVkUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBU05fT0NURVRfU1RSKSwgYXV0aFBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dBdXRoUGFybUxlbik7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGlmIChyYyA9PSAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJidWlsZGluZyBhdXRoUGFyYW1zIGZhaWxlZC5cbiIpKTsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVE9PX0xPTkc7CiAgICB9CgogICAgLyoKICAgICAqIFJlbWVtYmVyIHdoZXJlIHRvIHB1dCB0aGUgYWN0dWFsIEhNQUMgd2UgY2FsY3VsYXRlIGxhdGVyIG9uLiAgQW4KICAgICAqIGVuY29kZWQgT0NURVQgU1RSSU5HIG9mIGxlbmd0aCBVU01fTUQ1X0FORF9TSEFfQVVUSF9MRU4gaGFzIGFuIEFTTi4xCiAgICAgKiBoZWFkZXIgb2YgbGVuZ3RoIDIsIGhlbmNlIHRoZSBmdWRnZSBmYWN0b3IuICAKICAgICAqLwoKICAgIG1hY19vZmZzZXQgPSAqb2Zmc2V0IC0gMjsKCiAgICAvKgogICAgICogbXNnVXNlck5hbWUuICAKICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIm1zZ1VzZXJOYW1lIik7CiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9zdHJpbmcod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVNOX09DVEVUX1NUUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSB0aGVOYW1lLCB0aGVOYW1lTGVuZ3RoKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIGF1dGhQYXJhbXMgZmFpbGVkLlxuIikpOwogICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9UT09fTE9ORzsKICAgIH0KCiAgICAvKgogICAgICogbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZVRpbWUuICAKICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIm1zZ0F1dGhvcml0YXRpdmVFbmdpbmVUaW1lIik7CiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9pbnQod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX0lOVEVHRVIpLCAmdGltZV9sb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsb25nKSk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGlmIChyYyA9PSAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsCiAgICAgICAgICAgICAgICAgICAgImJ1aWxkaW5nIG1zZ0F1dGhvcml0YXRpdmVFbmdpbmVUaW1lIGZhaWxlZC5cbiIpKTsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVE9PX0xPTkc7CiAgICB9CgogICAgLyoKICAgICAqIG1zZ0F1dGhvcml0YXRpdmVFbmdpbmVCb290cy4gIAogICAgICovCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUJvb3RzIik7CiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9pbnQod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX0lOVEVHRVIpLCAmYm9vdHNfbG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobG9uZykpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBpZiAocmMgPT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLAogICAgICAgICAgICAgICAgICAgICJidWlsZGluZyBtc2dBdXRob3JpdGF0aXZlRW5naW5lQm9vdHMgZmFpbGVkLlxuIikpOwogICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9UT09fTE9ORzsKICAgIH0KCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlEIik7CiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9zdHJpbmcod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVNOX09DVEVUX1NUUiksIHRoZUVuZ2luZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUVuZ2luZUlETGVuZ3RoKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIG1zZ0F1dGhvcml0YXRpdmVFbmdpbmVJRCBmYWlsZWQuXG4iKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1RPT19MT05HOwogICAgfQoKICAgIC8qCiAgICAgKiBVU00gbXNnU2VjdXJpdHlQYXJhbWV0ZXJzIHNlcXVlbmNlIGhlYWRlciAgCiAgICAgKi8KICAgIHJjID0gYXNuX3JlYWxsb2NfcmJ1aWxkX3NlcXVlbmNlKHdob2xlTXNnLCB3aG9sZU1zZ0xlbiwgb2Zmc2V0LCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9TRVFVRU5DRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX0NPTlNUUlVDVE9SKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvZmZzZXQgLSBzcF9vZmZzZXQpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIHVzbSBzZWN1cml0eSBwYXJhbWV0ZXJzIGZhaWxlZC5cbiIpKTsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVE9PX0xPTkc7CiAgICB9CgogICAgLyoKICAgICAqIG1zZ1NlY3VyaXR5UGFyYW1ldGVycyBPQ1RFVCBTVFJJTkcgd3JhcHBlci4gIAogICAgICovCiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9oZWFkZXIod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVNOX09DVEVUX1NUUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCAtIHNwX29mZnNldCk7CgogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIG1zZ1NlY3VyaXR5UGFyYW1ldGVycyBmYWlsZWQuXG4iKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1RPT19MT05HOwogICAgfQoKICAgIC8qCiAgICAgKiBDb3B5IGluIHRoZSBtc2dHbG9iYWxEYXRhIGFuZCBtc2dWZXJzaW9uLiAgCiAgICAgKi8KICAgIHdoaWxlICgoKndob2xlTXNnTGVuIC0gKm9mZnNldCkgPCBnbG9iYWxEYXRhTGVuKSB7CiAgICAgICAgaWYgKCFhc25fcmVhbGxvYyh3aG9sZU1zZywgd2hvbGVNc2dMZW4pKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiYnVpbGRpbmcgZ2xvYmFsIGRhdGEgZmFpbGVkLlxuIikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1RPT19MT05HOwogICAgICAgIH0KICAgIH0KCiAgICAqb2Zmc2V0ICs9IGdsb2JhbERhdGFMZW47CiAgICBtZW1jcHkoKndob2xlTXNnICsgKndob2xlTXNnTGVuIC0gKm9mZnNldCwgZ2xvYmFsRGF0YSwgZ2xvYmFsRGF0YUxlbik7CgogICAgLyoKICAgICAqIFRvdGFsIHBhY2tldCBzZXF1ZW5jZS4gIAogICAgICovCiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9zZXF1ZW5jZSh3aG9sZU1zZywgd2hvbGVNc2dMZW4sIG9mZnNldCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fU0VRVUVOQ0UgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9DT05TVFJVQ1RPUiksICpvZmZzZXQpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIG1hc3RlciBwYWNrZXQgc2VxdWVuY2UgZmFpbGVkLlxuIikpOwogICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9UT09fTE9ORzsKICAgIH0KCiAgICAvKgogICAgICogTm93IGNvbnNpZGVyIC8gZG8gYXV0aGVudGljYXRpb24uICAKICAgICAqLwoKICAgIGlmICh0aGVTZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWIHx8CiAgICAgICAgdGhlU2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBzaXplX3QgICAgICAgICAgdGVtcF9zaWdfbGVuID0gbXNnQXV0aFBhcm1MZW47CiAgICAgICAgdV9jaGFyICAgICAgICAgKnRlbXBfc2lnID0gKHVfY2hhciAqKSBtYWxsb2ModGVtcF9zaWdfbGVuKTsKICAgICAgICB1X2NoYXIgICAgICAgICAqcHJvdG9fbXNnID0gKndob2xlTXNnICsgKndob2xlTXNnTGVuIC0gKm9mZnNldDsKICAgICAgICBzaXplX3QgICAgICAgICAgcHJvdG9fbXNnX2xlbiA9ICpvZmZzZXQ7CgoKICAgICAgICBpZiAodGVtcF9zaWcgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIk91dCBvZiBtZW1vcnkuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CgogICAgICAgIGlmIChzY19nZW5lcmF0ZV9rZXllZF9oYXNoKHRoZUF1dGhQcm90b2NvbCwgdGhlQXV0aFByb3RvY29sTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUF1dGhLZXksIHRoZUF1dGhLZXlMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9fbXNnLCBwcm90b19tc2dfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfc2lnLCAmdGVtcF9zaWdfbGVuKQogICAgICAgICAgICAhPSBTTk1QX0VSUl9OT0VSUk9SKSB7CiAgICAgICAgICAgIFNOTVBfRlJFRSh0ZW1wX3NpZyk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiU2lnbmluZyBmYWlsZWQuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0FVVEhFTlRJQ0FUSU9ORkFJTFVSRTsKICAgICAgICB9CgogICAgICAgIGlmICh0ZW1wX3NpZ19sZW4gIT0gbXNnQXV0aFBhcm1MZW4pIHsKICAgICAgICAgICAgU05NUF9GUkVFKHRlbXBfc2lnKTsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJTaWduaW5nIGxlbmd0aHMgZmFpbGVkLlxuIikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9BVVRIRU5USUNBVElPTkZBSUxVUkU7CiAgICAgICAgfQoKICAgICAgICBtZW1jcHkoKndob2xlTXNnICsgKndob2xlTXNnTGVuIC0gbWFjX29mZnNldCwgdGVtcF9zaWcsCiAgICAgICAgICAgICAgIG1zZ0F1dGhQYXJtTGVuKTsKICAgICAgICBTTk1QX0ZSRUUodGVtcF9zaWcpOwogICAgfQogICAgLyoKICAgICAqIGVuZGlmIC0tIGNyZWF0ZSBrZXllZCBoYXNoIAogICAgICovCiAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICBERUJVR01TR1RMKCgidXNtIiwgIlVTTSBwcm9jZXNzaW5nIGNvbXBsZXRlZC5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9yZ2VuZXJhdGVfb3V0X21zZygpICovCgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICovCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9wYXJzZV9zZWN1cml0eV9wYXJhbWV0ZXJzCiAqCiAqIFBhcmFtZXRlcnM6CiAqCShTZWUgbGlzdCBiZWxvdy4uLikKICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCiAqCXRhYiBzdG9wIDQKICoKICoJRXh0cmFjdHMgdmFsdWVzIGZyb20gdGhlIHNlY3VyaXR5IGhlYWRlciBhbmQgZGF0YSBwb3J0aW9ucyBvZiB0aGUKICoJaW5jb21pbmcgYnVmZmVyLgogKi8KaW50CnVzbV9wYXJzZV9zZWN1cml0eV9wYXJhbWV0ZXJzKHVfY2hhciAqIHNlY1BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlbWFpbmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc2VjRW5naW5lSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCAqIGJvb3RzX3VpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50ICogdGltZV91aW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzZWNOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBzZWNOYW1lTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzaWduYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNpZ25hdHVyZV9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNhbHRfbGVuZ3RoLCB1X2NoYXIgKiogZGF0YV9wdHIpCnsKICAgIHVfY2hhciAgICAgICAgICpwYXJzZV9wdHIgPSBzZWNQYXJhbXM7CiAgICB1X2NoYXIgICAgICAgICAqdmFsdWVfcHRyOwogICAgdV9jaGFyICAgICAgICAgKm5leHRfcHRyOwogICAgdV9jaGFyICAgICAgICAgIHR5cGVfdmFsdWU7CgogICAgc2l6ZV90ICAgICAgICAgIG9jdGV0X3N0cmluZ19sZW5ndGggPSByZW1haW5pbmc7CiAgICBzaXplX3QgICAgICAgICAgc2VxdWVuY2VfbGVuZ3RoOwogICAgc2l6ZV90ICAgICAgICAgIHJlbWFpbmluZ19ieXRlczsKCiAgICBsb25nICAgICAgICAgICAgYm9vdHNfbG9uZzsKICAgIGxvbmcgICAgICAgICAgICB0aW1lX2xvbmc7CgogICAgdV9pbnQgICAgICAgICAgIG9yaWdOYW1lTGVuOwoKCiAgICAvKgogICAgICogRWF0IHRoZSBmaXJzdCBvY3RldCBoZWFkZXIuCiAgICAgKi8KICAgIGlmICgodmFsdWVfcHRyID0gYXNuX3BhcnNlX3NlcXVlbmNlKHBhcnNlX3B0ciwgJm9jdGV0X3N0cmluZ19sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNtIGZpcnN0IG9jdGV0IikpID09IE5VTEwpIHsKICAgICAgICAvKgogICAgICAgICAqIFJFVFVSTiBwYXJzZSBlcnJvciAKICAgICAgICAgKi8gcmV0dXJuIC0xOwogICAgfQoKCiAgICAvKgogICAgICogRWF0IHRoZSBzZXF1ZW5jZSBoZWFkZXIuCiAgICAgKi8KICAgIHBhcnNlX3B0ciA9IHZhbHVlX3B0cjsKICAgIHNlcXVlbmNlX2xlbmd0aCA9IG9jdGV0X3N0cmluZ19sZW5ndGg7CgogICAgaWYgKCh2YWx1ZV9wdHIgPSBhc25fcGFyc2Vfc2VxdWVuY2UocGFyc2VfcHRyLCAmc2VxdWVuY2VfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVNOX1NFUVVFTkNFIHwgQVNOX0NPTlNUUlVDVE9SKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c20gc2VxdWVuY2UiKSkgPT0gTlVMTCkgewogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CgoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgZW5naW5lSUQuCiAgICAgKi8KICAgIHBhcnNlX3B0ciA9IHZhbHVlX3B0cjsKICAgIHJlbWFpbmluZ19ieXRlcyA9IHNlcXVlbmNlX2xlbmd0aDsKCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlEIik7CiAgICBpZiAoKG5leHRfcHRyCiAgICAgICAgID0gYXNuX3BhcnNlX3N0cmluZyhwYXJzZV9wdHIsICZyZW1haW5pbmdfYnl0ZXMsICZ0eXBlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjRW5naW5lSUQsIHNlY0VuZ2luZUlETGVuKSkgPT0gTlVMTCkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBpZiAodHlwZV92YWx1ZSAhPQogICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8IEFTTl9PQ1RFVF9TVFIpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KCgogICAgLyoKICAgICAqIFJldHJpZXZlIHRoZSBlbmdpbmUgYm9vdHMsIG5vdGljZSBzd2l0Y2ggaW4gdGhlIHdheSBuZXh0X3B0ciBhbmQKICAgICAqIHJlbWFpbmluZ19ieXRlcyBhcmUgdXNlZCAodG8gYWNjb21vZGF0ZSB0aGUgYXNuIGNvZGUpLgogICAgICovCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUJvb3RzIik7CiAgICBpZiAoKG5leHRfcHRyID0gYXNuX3BhcnNlX2ludChuZXh0X3B0ciwgJnJlbWFpbmluZ19ieXRlcywgJnR5cGVfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9vdHNfbG9uZywgc2l6ZW9mKGxvbmcpKSkgPT0gTlVMTCkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBpZiAodHlwZV92YWx1ZSAhPQogICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8IEFTTl9JTlRFR0VSKSkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CgogICAgKmJvb3RzX3VpbnQgPSAodV9pbnQpIGJvb3RzX2xvbmc7CgoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgdGltZSB2YWx1ZS4KICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIm1zZ0F1dGhvcml0YXRpdmVFbmdpbmVUaW1lIik7CiAgICBpZiAoKG5leHRfcHRyID0gYXNuX3BhcnNlX2ludChuZXh0X3B0ciwgJnJlbWFpbmluZ19ieXRlcywgJnR5cGVfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZV9sb25nLCBzaXplb2YobG9uZykpKSA9PSBOVUxMKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIGlmICh0eXBlX3ZhbHVlICE9CiAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwgQVNOX0lOVEVHRVIpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KCiAgICAqdGltZV91aW50ID0gKHVfaW50KSB0aW1lX2xvbmc7CgogICAgaWYgKCpib290c191aW50ID4gRU5HSU5FQk9PVF9NQVggfHwgKnRpbWVfdWludCA+IEVOR0lORVRJTUVfTUFYKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgc2VjTmFtZS4KICAgICAqLwogICAgb3JpZ05hbWVMZW4gPSAqc2VjTmFtZUxlbjsKCgogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIm1zZ1VzZXJOYW1lIik7CiAgICBpZiAoKG5leHRfcHRyCiAgICAgICAgID0gYXNuX3BhcnNlX3N0cmluZyhuZXh0X3B0ciwgJnJlbWFpbmluZ19ieXRlcywgJnR5cGVfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopIHNlY05hbWUsIHNlY05hbWVMZW4pKSA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIC8qCiAgICAgKiBGSVggLS0gZG9lc24ndCB0aGlzIGFsc28gaW5kaWNhdGUgYSBidWZmZXIgb3ZlcnJ1bj8KICAgICAqLwogICAgaWYgKG9yaWdOYW1lTGVuIDwgKnNlY05hbWVMZW4gKyAxKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IsIGJ1dCBpdCdzIHJlYWxseSBhIHBhcmFtZXRlciBlcnJvciAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaWYgKCpzZWNOYW1lTGVuID4gMzIpIHsKICAgICAgICAvKgogICAgICAgICAqIFRoaXMgaXMgYSBVU00tc3BlY2lmaWMgbGltaXRhdGlvbiBvdmVyIGFuZCBhYm92ZSB0aGUgYWJvdmUKICAgICAgICAgKiBsaW1pdGF0aW9uICh3aGljaCB3aWxsIHByb2JhYmx5IGRlZmF1bHQgdG8gdGhlIGxlbmd0aCBvZiBhbgogICAgICAgICAqIFNubXBBZG1pblN0cmluZywgaS5lLiAyNTUpLiAgU2VlIFJGQyAyNTc0LCBzZWMuIDIuNC4gIAogICAgICAgICAqLwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzZWNOYW1lWypzZWNOYW1lTGVuXSA9ICdcMCc7CgogICAgaWYgKHR5cGVfdmFsdWUgIT0KICAgICAgICAodV9jaGFyKSAoQVNOX1VOSVZFUlNBTCB8IEFTTl9QUklNSVRJVkUgfCBBU05fT0NURVRfU1RSKSkgewogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CgoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgc2lnbmF0dXJlIGFuZCBibGFuayBpdCBpZiB0aGVyZS4KICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIm1zZ0F1dGhlbnRpY2F0aW9uUGFyYW1ldGVycyIpOwogICAgaWYgKChuZXh0X3B0cgogICAgICAgICA9IGFzbl9wYXJzZV9zdHJpbmcobmV4dF9wdHIsICZyZW1haW5pbmdfYnl0ZXMsICZ0eXBlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCBzaWduYXR1cmVfbGVuZ3RoKSkgPT0gTlVMTCkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBpZiAodHlwZV92YWx1ZSAhPQogICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8IEFTTl9PQ1RFVF9TVFIpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAoKnNpZ25hdHVyZV9sZW5ndGggIT0gMCkgeyAgICAgICAvKiBCbGFua2luZyBmb3IgYXV0aGVudGljYXRpb24gc3RlcCBsYXRlciAqLwogICAgICAgIG1lbXNldChuZXh0X3B0ciAtICh1X2xvbmcpICogc2lnbmF0dXJlX2xlbmd0aCwKICAgICAgICAgICAgICAgMCwgKnNpZ25hdHVyZV9sZW5ndGgpOwogICAgfQoKCiAgICAvKgogICAgICogUmV0cmlldmUgdGhlIHNhbHQuCiAgICAgKgogICAgICogTm90ZSB0aGF0IHRoZSBuZXh0IHB0ciBpcyB3aGVyZSB0aGUgZGF0YSBzZWN0aW9uIHN0YXJ0cy4KICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIm1zZ1ByaXZhY3lQYXJhbWV0ZXJzIik7CiAgICBpZiAoKCpkYXRhX3B0cgogICAgICAgICA9IGFzbl9wYXJzZV9zdHJpbmcobmV4dF9wdHIsICZyZW1haW5pbmdfYnl0ZXMsICZ0eXBlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW5ndGgpKSA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMjsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIGlmICh0eXBlX3ZhbHVlICE9CiAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwgQVNOX09DVEVUX1NUUikpIHsKICAgICAgICAvKgogICAgICAgICAqIFJFVFVSTiBwYXJzZSBlcnJvciAKICAgICAgICAgKi8gcmV0dXJuIC0yOwogICAgfQoKICAgIHJldHVybiAwOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX3BhcnNlX3NlY3VyaXR5X3BhcmFtZXRlcnMoKSAqLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogdXNtX2NoZWNrX2FuZF91cGRhdGVfdGltZWxpbmVzcwogKgogKiBQYXJhbWV0ZXJzOgogKgkqc2VjRW5naW5lSUQKICoJIHNlY0VuZ2luZUlEZW4KICoJIGJvb3RzX3VpbnQKICoJIHRpbWVfdWludAogKgkqZXJyb3IKICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCQogKgogKiBQZXJmb3JtcyB0aGUgaW5jb21pbmcgdGltZWxpbmVzcyBjaGVja2luZyBhbmQgc2V0dGluZy4KICovCmludAp1c21fY2hlY2tfYW5kX3VwZGF0ZV90aW1lbGluZXNzKHVfY2hhciAqIHNlY0VuZ2luZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzZWNFbmdpbmVJRExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCBib290c191aW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50IHRpbWVfdWludCwgaW50ICplcnJvcikKewogICAgdV9jaGFyICAgICAgICAgIG15SURbVVNNX01BWF9JRF9MRU5HVEhdOwogICAgdV9sb25nICAgICAgICAgIG15SURMZW5ndGggPQogICAgICAgIHNubXB2M19nZXRfZW5naW5lSUQobXlJRCwgVVNNX01BWF9JRF9MRU5HVEgpOwogICAgdV9pbnQgICAgICAgICAgIG15Qm9vdHM7CiAgICB1X2ludCAgICAgICAgICAgbXlUaW1lOwoKCgogICAgaWYgKChteUlETGVuZ3RoID4gVVNNX01BWF9JRF9MRU5HVEgpIHx8IChteUlETGVuZ3RoID09IDApKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBXZSdyZSBwcm9iYWJseSBhbHJlYWR5IHNjcmV3ZWQuLi5idWZmZXIgb3ZlcndyaXRlLiAgWFhYPyAKICAgICAgICAgKi8KICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkJ1ZmZlciBvdmVyZmxvdy5cbiIpKTsKICAgICAgICAqZXJyb3IgPSBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIG15Qm9vdHMgPSBzbm1wdjNfbG9jYWxfc25tcEVuZ2luZUJvb3RzKCk7CiAgICBteVRpbWUgPSBzbm1wdjNfbG9jYWxfc25tcEVuZ2luZVRpbWUoKTsKCgogICAgLyoKICAgICAqIElGIHRoZSB0aW1lIGludm9sdmVkIGlzIGxvY2FsCiAgICAgKiAgICAgTWFrZSBzdXJlICBtZXNzYWdlIGlzIGluc2lkZSB0aGUgdGltZSB3aW5kb3cgCiAgICAgKiBFTFNFIAogICAgICogICAgICBJRiBib290cyBpcyBoaWdoZXIgb3IgYm9vdHMgaXMgdGhlIHNhbWUgYW5kIHRpbWUgaXMgaGlnaGVyCiAgICAgKiAgICAgICAgICAgICAgcmVtZW1iZXIgdGhpcyBuZXcgZGF0YQogICAgICogICAgICBFTFNFCiAgICAgKiAgICAgICAgICAgICAgSUYgIShib290cyBzYW1lIGFuZCB0aW1lIHdpdGhpbiBVU01fVElNRV9XSU5ET1cgc2VjcykKICAgICAqICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgaXMgdG9vIG9sZCAKICAgICAqICAgICAgICAgICAgICBFTFNFICAgIAogICAgICogICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBpcyBvaywgYnV0IGRvbid0IHRha2UgdGltZQogICAgICogICAgICAgICAgICAgIEVORElGCiAgICAgKiAgICAgIEVORElGCiAgICAgKiBFTkRJRgogICAgICovCgogICAgLyoKICAgICAqIFRoaXMgaXMgYSBsb2NhbCByZWZlcmVuY2UuCiAgICAgKi8KICAgIGlmIChzZWNFbmdpbmVJRExlbiA9PSBteUlETGVuZ3RoCiAgICAgICAgJiYgbWVtY21wKHNlY0VuZ2luZUlELCBteUlELCBteUlETGVuZ3RoKSA9PSAwKSB7CiAgICAgICAgdV9pbnQgICAgICAgICAgIHRpbWVfZGlmZmVyZW5jZSA9IG15VGltZSA+IHRpbWVfdWludCA/CiAgICAgICAgICAgIG15VGltZSAtIHRpbWVfdWludCA6IHRpbWVfdWludCAtIG15VGltZTsKCiAgICAgICAgaWYgKGJvb3RzX3VpbnQgPT0gRU5HSU5FQk9PVF9NQVgKICAgICAgICAgICAgfHwgYm9vdHNfdWludCAhPSBteUJvb3RzCiAgICAgICAgICAgIHx8IHRpbWVfZGlmZmVyZW5jZSA+IFVTTV9USU1FX1dJTkRPVykgewogICAgICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfVVNNU1RBVFNOT1RJTlRJTUVXSU5ET1dTKSA9PQogICAgICAgICAgICAgICAgMCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gaW5jcmVtZW50IHN0YXRpc3RpYy4iKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLAogICAgICAgICAgICAgICAgICAgICAgICAiYm9vdF91aW50ICV1IG15Qm9vdHMgJXUgdGltZV9kaWZmICV1ID0+IG5vdCBpbiB0aW1lIHdpbmRvd1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHNfdWludCwgbXlCb290cywgdGltZV9kaWZmZXJlbmNlKSk7CiAgICAgICAgICAgICplcnJvciA9IFNOTVBFUlJfVVNNX05PVElOVElNRVdJTkRPVzsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KCiAgICAgICAgKmVycm9yID0gU05NUEVSUl9TVUNDRVNTOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qCiAgICAgKiBUaGlzIGlzIGEgcmVtb3RlIHJlZmVyZW5jZS4KICAgICAqLwogICAgZWxzZSB7CiAgICAgICAgdV9pbnQgICAgICAgICAgIHRoZWlyQm9vdHMsIHRoZWlyVGltZSwgdGhlaXJMYXN0VGltZTsKICAgICAgICB1X2ludCAgICAgICAgICAgdGltZV9kaWZmZXJlbmNlOwoKICAgICAgICBpZiAoZ2V0X2VuZ2luZXRpbWVfZXgoc2VjRW5naW5lSUQsIHNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlaXJCb290cywgJnRoZWlyVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZWlyTGFzdFRpbWUsIFRSVUUpCiAgICAgICAgICAgICE9IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCByZW1vdGUgZW5naW5lJ3MgdGltZXMuIikpOwoKICAgICAgICAgICAgKmVycm9yID0gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQoKICAgICAgICB0aW1lX2RpZmZlcmVuY2UgPSB0aGVpclRpbWUgPiB0aW1lX3VpbnQgPwogICAgICAgICAgICB0aGVpclRpbWUgLSB0aW1lX3VpbnQgOiB0aW1lX3VpbnQgLSB0aGVpclRpbWU7CgoKICAgICAgICAvKgogICAgICAgICAqIFhYWCAgQ29udHJhcnkgdG8gdGhlIHBzZXVkb2NvZGU6CiAgICAgICAgICogICAgICBTZWUgaWYgYm9vdHMgaXMgaW52YWxpZCBmaXJzdC4KICAgICAgICAgKi8KICAgICAgICBpZiAodGhlaXJCb290cyA9PSBFTkdJTkVCT09UX01BWCB8fCB0aGVpckJvb3RzID4gYm9vdHNfdWludCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiUmVtb3RlIGJvb3QgY291bnQgaW52YWxpZC4iKSk7CgogICAgICAgICAgICAqZXJyb3IgPSBTTk1QRVJSX1VTTV9OT1RJTlRJTUVXSU5ET1c7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgoKICAgICAgICAvKgogICAgICAgICAqIEJvb3RzIGlzIG9rLCBzZWUgaWYgdGhlIGJvb3RzIGlzIHRoZSBzYW1lIGJ1dCB0aGUgdGltZQogICAgICAgICAqIGlzIG9sZC4KICAgICAgICAgKi8KICAgICAgICBpZiAodGhlaXJCb290cyA9PSBib290c191aW50ICYmIHRpbWVfdWludCA8IHRoZWlyTGFzdFRpbWUpIHsKICAgICAgICAgICAgaWYgKHRpbWVfZGlmZmVyZW5jZSA+IFVTTV9USU1FX1dJTkRPVykgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIk1lc3NhZ2UgdG9vIG9sZC4iKSk7CiAgICAgICAgICAgICAgICAqZXJyb3IgPSBTTk1QRVJSX1VTTV9OT1RJTlRJTUVXSU5ET1c7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgLyogT2xkLCBidXQgYWNjZXB0YWJsZSAqLwoKICAgICAgICAgICAgICAgICplcnJvciA9IFNOTVBFUlJfU1VDQ0VTUzsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKCiAgICAgICAgLyoKICAgICAgICAgKiBNZXNzYWdlIGlzIG9rLCBlaXRoZXIgYm9vdHMgaGFzIGJlZW4gYWR2YW5jZWQsIG9yCiAgICAgICAgICogdGltZSBpcyBncmVhdGVyIHRoYW4gYmVmb3JlIHdpdGggdGhlIHNhbWUgYm9vdHMuCiAgICAgICAgICovCgogICAgICAgIGlmIChzZXRfZW5naW5ldGltZShzZWNFbmdpbmVJRCwgc2VjRW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzX3VpbnQsIHRpbWVfdWludCwgVFJVRSkKICAgICAgICAgICAgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdXBkYXRpbmcgcmVtb3RlIGJvb3QvdGltZS4iKSk7CiAgICAgICAgICAgICplcnJvciA9IFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KCiAgICAgICAgKmVycm9yID0gU05NUEVSUl9TVUNDRVNTOwogICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgIC8qIEZyZXNoIG1lc3NhZ2UgYW5kIHRpbWUgdXBkYXRlZCAqLwoKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmRpZiAtLSBsb2NhbCBvciByZW1vdGUgdGltZSByZWZlcmVuY2UuICovCgoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2NoZWNrX2FuZF91cGRhdGVfdGltZWxpbmVzcygpICovCgoKCmludAp1c21fc2VjbW9kX3Byb2Nlc3NfaW5fbXNnKHN0cnVjdCBzbm1wX3NlY21vZF9pbmNvbWluZ19wYXJhbXMgKnBhcm1zKQp7CiAgICBpZiAoIXBhcm1zKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICByZXR1cm4gdXNtX3Byb2Nlc3NfaW5fbXNnKHBhcm1zLT5tc2dQcm9jTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5tYXhNc2dTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNMZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPndob2xlTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+d2hvbGVNc2dMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNFbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY05hbWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zY29wZWRQZHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zY29wZWRQZHVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5tYXhTaXplUmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNTdGF0ZVJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlc3MsIHBhcm1zLT5tc2dfZmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiB1c21fcHJvY2Vzc19pbl9tc2cKICoKICogUGFyYW1ldGVyczoKICoJKFNlZSBsaXN0IGJlbG93Li4uKQogKiAgICAgIAogKiBSZXR1cm5zOgogKglTTk1QRVJSX1NVQ0NFU1MJCQlPbiBzdWNjZXNzLgogKglTTk1QRVJSX1VTTV9BVVRIRU5USUNBVElPTkZBSUxVUkUKICoJU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SCiAqCVNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUgogKglTTk1QRVJSX1VTTV9QQVJTRUVSUk9SCiAqCVNOTVBFUlJfVVNNX1VOS05PV05FTkdJTkVJRAogKglTTk1QRVJSX1VTTV9QQVJTRUVSUk9SCiAqCVNOTVBFUlJfVVNNX1VOS05PV05TRUNVUklUWU5BTUUKICoJU05NUEVSUl9VU01fVU5TVVBQT1JURURTRUNVUklUWUxFVkVMCiAqCiAqCiAqIEFTU1VNRVMgc2l6ZSBvZiBkZWNyeXB0X2J1ZiB3aWxsIGFsd2F5cyBiZSA+PSBzaXplIG9mIGVuY3J5cHRlZCBzUERVLgogKgogKiBGSVggIE1lbW9yeSBsZWFrcyBpZiBzZWNTdGF0ZVJlZiBpcyBhbGxvY2F0ZWQgYW5kIGEgcmV0dXJuIG9jY3VycwogKgl3aXRob3V0IGNsZWFuaW5nIHVwLiAgTWF5IGNvbnRhaW4gc2VjcmV0cy4uLgogKi8KaW50CnVzbV9wcm9jZXNzX2luX21zZyhpbnQgbXNnUHJvY01vZGVsLCAgICAvKiAoVU5VU0VEKSAqLwogICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heE1zZ1NpemUsICAgLyogSU4gICAgIC0gVXNlZCB0byBjYWxjIG1heFNpemVSZXNwb25zZS4gICovCiAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzZWNQYXJhbXMsICAvKiBJTiAgICAgLSBCRVIgZW5jb2RlZCBzZWN1cml0eVBhcmFtZXRlcnMuICovCiAgICAgICAgICAgICAgICAgICBpbnQgc2VjTW9kZWwsICAgICAgICAvKiAoVU5VU0VEKSAqLwogICAgICAgICAgICAgICAgICAgaW50IHNlY0xldmVsLCAgICAgICAgLyogSU4gICAgIC0gQXV0aE5vUHJpdiwgYXV0aFByaXYgZXRjLiAgICAgICovCiAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB3aG9sZU1zZywgICAvKiBJTiAgICAgLSBPcmlnaW5hbCB2MyBtZXNzYWdlLiAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgIHNpemVfdCB3aG9sZU1zZ0xlbiwgIC8qIElOICAgICAtIE1zZyBsZW5ndGguICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgdV9jaGFyICogc2VjRW5naW5lSUQsICAgICAgICAvKiBPVVQgICAgLSBQb2ludGVyIHNubXBFbmdpbmVJRC4gICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNlY0VuZ2luZUlETGVuLCAgICAgLyogSU4vT1VUIC0gTGVuIGF2YWlsYWJsZSwgbGVuIHJldHVybmVkLiAgICovCiAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICogTk9URTogTWVtb3J5IHByb3ZpZGVkIGJ5IGNhbGxlci4gICAgICAKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgY2hhciAqc2VjTmFtZSwgICAgICAgLyogT1VUICAgIC0gUG9pbnRlciB0byBzZWN1cml0eU5hbWUuICAgICAgICovCiAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBzZWNOYW1lTGVuLCAvKiBJTi9PVVQgLSBMZW4gYXZhaWxhYmxlLCBsZW4gcmV0dXJuZWQuICAgKi8KICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBzY29wZWRQZHUsIC8qIE9VVCAgICAtIFBvaW50ZXIgdG8gcGxhaW50ZXh0IHNjb3BlZFBkdS4gKi8KICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNjb3BlZFBkdUxlbiwgICAgICAgLyogSU4vT1VUIC0gTGVuIGF2YWlsYWJsZSwgbGVuIHJldHVybmVkLiAgICovCiAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBtYXhTaXplUmVzcG9uc2UsICAgIC8qIE9VVCAgICAtIE1heCBzaXplIG9mIFJlc3BvbnNlIFBEVS4gICAgICAqLwogICAgICAgICAgICAgICAgICAgdm9pZCAqKnNlY1N0YXRlUmYsICAgLyogT1VUICAgIC0gUmVmIHRvIHNlY3VyaXR5IHN0YXRlLiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzZXNzLCAgICAgIC8qIElOICAgICAtIHNlc3Npb24gd2hpY2ggZ290IHRoZSBtZXNzYWdlICAqLwogICAgICAgICAgICAgICAgICAgdV9jaGFyIG1zZ19mbGFncykKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJTiAgICAgLSB2MyBNZXNzYWdlIGZsYWdzLiAgICAgICAgICAgICAgKi8KICAgIHNpemVfdCAgICAgICAgICByZW1haW5pbmcgPSB3aG9sZU1zZ0xlbiAtICh1X2ludCkKICAgICAgICAoKHVfbG9uZykgKiBzZWNQYXJhbXMgLSAodV9sb25nKSAqIHdob2xlTXNnKTsKICAgIHVfaW50ICAgICAgICAgICBib290c191aW50OwogICAgdV9pbnQgICAgICAgICAgIHRpbWVfdWludDsKI2lmZGVmIEhBVkVfQUVTCiAgICB1X2ludCAgICAgICAgICAgbmV0X2Jvb3RzLCBuZXRfdGltZTsKI2VuZGlmCiAgICB1X2NoYXIgICAgICAgICAgc2lnbmF0dXJlW0JZVEVTSVpFKFVTTV9NQVhfS0VZRURIQVNIX0xFTkdUSCldOwogICAgc2l6ZV90ICAgICAgICAgIHNpZ25hdHVyZV9sZW5ndGggPSBCWVRFU0laRShVU01fTUFYX0tFWUVESEFTSF9MRU5HVEgpOwogICAgdV9jaGFyICAgICAgICAgIHNhbHRbQllURVNJWkUoVVNNX01BWF9TQUxUX0xFTkdUSCldOwogICAgc2l6ZV90ICAgICAgICAgIHNhbHRfbGVuZ3RoID0gQllURVNJWkUoVVNNX01BWF9TQUxUX0xFTkdUSCk7CiAgICB1X2NoYXIgICAgICAgICAgaXZbQllURVNJWkUoVVNNX01BWF9TQUxUX0xFTkdUSCldOwogICAgdV9pbnQgICAgICAgICAgIGl2X2xlbmd0aCA9IEJZVEVTSVpFKFVTTV9NQVhfU0FMVF9MRU5HVEgpOwogICAgdV9jaGFyICAgICAgICAgKmRhdGFfcHRyOwogICAgdV9jaGFyICAgICAgICAgKnZhbHVlX3B0cjsKICAgIHVfY2hhciAgICAgICAgICB0eXBlX3ZhbHVlOwogICAgdV9jaGFyICAgICAgICAgKmVuZF9vZl9vdmVyaGVhZCA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgZXJyb3I7CiAgICBpbnQgICAgICAgICAgICAgaSwgcmMgPSAwOwogICAgc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICoqc2VjU3RhdGVSZWYgPQogICAgICAgIChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKiopIHNlY1N0YXRlUmY7CgogICAgc3RydWN0IHVzbVVzZXIgKnVzZXI7CgoKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVVNNIHByb2Nlc3NpbmcgYmVndW4uLi5cbiIpKTsKCgogICAgaWYgKHNlY1N0YXRlUmVmKSB7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UoKnNlY1N0YXRlUmVmKTsKICAgICAgICAqc2VjU3RhdGVSZWYgPSB1c21fbWFsbG9jX3VzbVN0YXRlUmVmZXJlbmNlKCk7CiAgICAgICAgaWYgKCpzZWNTdGF0ZVJlZiA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiT3V0IG9mIG1lbW9yeS5cbiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBNYWtlIHN1cmUgdGhlICpzZWNQYXJtcyBpcyBhbiBPQ1RFVCBTVFJJTkcuCiAgICAgKiBFeHRyYWN0IHRoZSB1c2VyIG5hbWUsIGVuZ2luZSBJRCwgYW5kIHNlY3VyaXR5IGxldmVsLgogICAgICovCiAgICBpZiAoKHJjID0gdXNtX3BhcnNlX3NlY3VyaXR5X3BhcmFtZXRlcnMoc2VjUGFyYW1zLCByZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjRW5naW5lSUQsIHNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib290c191aW50LCAmdGltZV91aW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY05hbWUsIHNlY05hbWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCAmc2lnbmF0dXJlX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWx0LCAmc2FsdF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFfcHRyKSkgPCAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJQYXJzaW5nIGZhaWxlZCAocmMgJWQpLlxuIiwgcmMpKTsKICAgICAgICBpZiAocmMgPT0gLTIpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogVGhpcyBpbmRpY2F0ZXMgYSBkZWNyeXB0aW9uRXJyb3IuICAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMoU1RBVF9VU01TVEFUU0RFQ1JZUFRJT05FUlJPUlMpID09CiAgICAgICAgICAgICAgICAwKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbmNyZW1lbnQgc3RhdGlzdGljLiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOwogICAgICAgIH0KICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfU05NUElOQVNOUEFSU0VFUlJTKSA9PSAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgdG8gaW5jcmVtZW50IHN0YXRpc3RpYy4iKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9QQVJTRUVSUk9SOwogICAgfQoKICAgIC8qCiAgICAgKiBSRkMgMjU3NCBzZWN0aW9uIDguMy4yCiAgICAgKiAxKSAgSWYgdGhlIHByaXZQYXJhbWV0ZXJzIGZpZWxkIGlzIG5vdCBhbiA4LW9jdGV0IE9DVEVUIFNUUklORywKICAgICAqIHRoZW4gYW4gZXJyb3IgaW5kaWNhdGlvbiAoZGVjcnlwdGlvbkVycm9yKSBpcyByZXR1cm5lZCB0byB0aGUKICAgICAqIGNhbGxpbmcgbW9kdWxlLgogICAgICovCiAgICBpZiAoKHNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSAmJiAoc2FsdF9sZW5ndGggIT0gOCkpIHsKICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfVVNNU1RBVFNERUNSWVBUSU9ORVJST1JTKSA9PSAKICAgICAgICAgICAgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiRmFpbGVkIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOwogICAgfQoKICAgIGlmIChzZWNMZXZlbCAhPSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVikgewogICAgICAgIC8qCiAgICAgICAgICogcHVsbCB0aGVzZSBvdXQgbm93IHNvIHJlcG9ydHMgY2FuIHVzZSB0aGVtIAogICAgICAgICAqLwogICAgICAgICpzY29wZWRQZHUgPSBkYXRhX3B0cjsKICAgICAgICAqc2NvcGVkUGR1TGVuID0gd2hvbGVNc2dMZW4gLSAoZGF0YV9wdHIgLSB3aG9sZU1zZyk7CiAgICAgICAgZW5kX29mX292ZXJoZWFkID0gZGF0YV9wdHI7CiAgICB9CgogICAgaWYgKHNlY1N0YXRlUmVmKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBDYWNoZSB0aGUgbmFtZSwgZW5naW5lIElELCBhbmQgc2VjdXJpdHkgbGV2ZWwsCiAgICAgICAgICogKiBwZXIgc3RlcCAyIChzZWN0aW9uIDMuMikKICAgICAgICAgKi8KICAgICAgICBpZiAodXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9uYW1lCiAgICAgICAgICAgICgqc2VjU3RhdGVSZWYsIHNlY05hbWUsICpzZWNOYW1lTGVuKSA9PSAtMSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiQ291bGRuJ3QgY2FjaGUgbmFtZS4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgfQoKICAgICAgICBpZiAodXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9lbmdpbmVfaWQKICAgICAgICAgICAgKCpzZWNTdGF0ZVJlZiwgc2VjRW5naW5lSUQsICpzZWNFbmdpbmVJRExlbikgPT0gLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkNvdWxkbid0IGNhY2hlIGVuZ2luZSBpZC4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgfQoKICAgICAgICBpZiAodXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9zZWNfbGV2ZWwoKnNlY1N0YXRlUmVmLCBzZWNMZXZlbCkgPT0KICAgICAgICAgICAgLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkNvdWxkbid0IGNhY2hlIHNlY3VyaXR5IGxldmVsLiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBMb2NhdGUgdGhlIGVuZ2luZSBJRCByZWNvcmQuCiAgICAgKiBJZiBpdCBpcyB1bmtub3duLCB0aGVuIGVpdGhlciBjcmVhdGUgb25lIG9yIG5vdGUgdGhpcyBhcyBhbiBlcnJvci4KICAgICAqLwogICAgaWYgKChzZXNzICYmIChzZXNzLT5pc0F1dGhvcml0YXRpdmUgPT0gU05NUF9TRVNTX0FVVEhPUklUQVRJVkUgfHwKICAgICAgICAgICAgICAgICAgKHNlc3MtPmlzQXV0aG9yaXRhdGl2ZSA9PSBTTk1QX1NFU1NfVU5LTk9XTkFVVEggJiYKICAgICAgICAgICAgICAgICAgIChtc2dfZmxhZ3MgJiBTTk1QX01TR19GTEFHX1JQUlRfQklUKSkpKSB8fAogICAgICAgICghc2VzcyAmJiAobXNnX2ZsYWdzICYgU05NUF9NU0dfRkxBR19SUFJUX0JJVCkpKSB7CiAgICAgICAgaWYgKElTRU5HSU5FS05PV04oc2VjRW5naW5lSUQsICpzZWNFbmdpbmVJRExlbikgPT0gRkFMU0UpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJVbmtub3duIEVuZ2luZSBJRC5cbiIpKTsKICAgICAgICAgICAgaWYgKHNubXBfaW5jcmVtZW50X3N0YXRpc3RpYyhTVEFUX1VTTVNUQVRTVU5LTk9XTkVOR0lORUlEUykgPT0KICAgICAgICAgICAgICAgIDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9VTktOT1dORU5HSU5FSUQ7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoRU5TVVJFX0VOR0lORV9SRUNPUkQoc2VjRW5naW5lSUQsICpzZWNFbmdpbmVJRExlbikKICAgICAgICAgICAgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJDb3VsZG4ndCBlbnN1cmUgZW5naW5lIHJlY29yZC4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgfQoKICAgIH0KCgogICAgLyoKICAgICAqIExvY2F0ZSB0aGUgVXNlciByZWNvcmQuCiAgICAgKiBJZiB0aGUgdXNlci9lbmdpbmUgSUQgaXMgdW5rbm93biwgcmVwb3J0IHRoaXMgYXMgYW4gZXJyb3IuCiAgICAgKi8KICAgIGlmICgodXNlciA9IHVzbV9nZXRfdXNlcl9mcm9tX2xpc3Qoc2VjRW5naW5lSUQsICpzZWNFbmdpbmVJRExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjTmFtZSwgdXNlckxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHNlc3MgJiYgc2Vzcy0+aXNBdXRob3JpdGF0aXZlID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBfU0VTU19BVVRIT1JJVEFUSVZFKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghc2VzcykpID8gMCA6IDEpKSkKICAgICAgICA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJVbmtub3duIFVzZXIoJXMpXG4iLCBzZWNOYW1lKSk7CiAgICAgICAgaWYgKHNubXBfaW5jcmVtZW50X3N0YXRpc3RpYyhTVEFUX1VTTVNUQVRTVU5LTk9XTlVTRVJOQU1FUykgPT0gMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiRmFpbGVkIHRvIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fVU5LTk9XTlNFQ1VSSVRZTkFNRTsKICAgIH0KCiAgICAvKiBlbnN1cmUgdGhlIHVzZXIgaXMgYWN0aXZlICovCiAgICBpZiAodXNlci0+dXNlclN0YXR1cyAhPSBSU19BQ1RJVkUpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkF0dGVtcHQgdG8gdXNlIGFuIGluYWN0aXZlIHVzZXIuXG4iKSk7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1VOS05PV05TRUNVUklUWU5BTUU7CiAgICB9CgogICAgLyoKICAgICAqIE1ha2Ugc3VyZSB0aGUgc2VjdXJpdHkgbGV2ZWwgaXMgYXBwcm9wcmlhdGUuCiAgICAgKi8KCiAgICByYyA9IHVzbV9jaGVja19zZWNMZXZlbChzZWNMZXZlbCwgdXNlcik7CiAgICBpZiAoMSA9PSByYykgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVW5zdXBwb3J0ZWQgU2VjdXJpdHkgTGV2ZWwgKCVkKS5cbiIsCiAgICAgICAgICAgICAgICAgICAgc2VjTGV2ZWwpKTsKICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljCiAgICAgICAgICAgIChTVEFUX1VTTVNUQVRTVU5TVVBQT1JURURTRUNMRVZFTFMpID09IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkZhaWxlZCB0byBpbmNyZW1lbnQgc3RhdGlzdGljLiIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1VOU1VQUE9SVEVEU0VDVVJJVFlMRVZFTDsKICAgIH0gZWxzZSBpZiAocmMgIT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVW5rbm93biBpc3N1ZS5cbiIpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgfQoKICAgIC8qCiAgICAgKiBDaGVjayB0aGUgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKi8KICAgIGlmIChzZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWCiAgICAgICAgfHwgc2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBpZiAoc2NfY2hlY2tfa2V5ZWRfaGFzaCh1c2VyLT5hdXRoUHJvdG9jb2wsIHVzZXItPmF1dGhQcm90b2NvbExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5hdXRoS2V5LCB1c2VyLT5hdXRoS2V5TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob2xlTXNnLCB3aG9sZU1zZ0xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsIHNpZ25hdHVyZV9sZW5ndGgpCiAgICAgICAgICAgICE9IFNOTVBfRVJSX05PRVJST1IpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJWZXJpZmljYXRpb24gZmFpbGVkLlxuIikpOwogICAgICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfVVNNU1RBVFNXUk9OR0RJR0VTVFMpID09IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgICAgICB9CgkgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsICJBdXRoZW50aWNhdGlvbiBmYWlsZWQgZm9yICVzXG4iLAoJCQkJdXNlci0+bmFtZSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9BVVRIRU5USUNBVElPTkZBSUxVUkU7CiAgICAgICAgfQoKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIlZlcmlmaWNhdGlvbiBzdWNjZWVkZWQuXG4iKSk7CiAgICB9CgoKICAgIC8qCiAgICAgKiBTdGVwcyAxMC0xMSAgdXNlciBpcyBhbHJlYWR5IHNldCAtIHJlbG9jYXRlZCBiZWZvcmUgdGltZWxpbmVzcyAKICAgICAqIGNoZWNrIGluIGNhc2UgaXQgZmFpbHMgLSBzdGlsbCBzYXZlIHVzZXIgZGF0YSBmb3IgcmVzcG9uc2UuCiAgICAgKgogICAgICogQ2FjaGUgdGhlIGtleXMgYW5kIHByb3RvY29sIG9pZHMsIHBlciBzdGVwIDExIChzMy4yKS4KICAgICAqLwogICAgaWYgKHNlY1N0YXRlUmVmKSB7CiAgICAgICAgaWYgKHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfYXV0aF9wcm90b2NvbCgqc2VjU3RhdGVSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5hdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhQcm90b2NvbExlbikgPT0KICAgICAgICAgICAgLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNhY2hlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sLiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CgogICAgICAgIGlmICh1c21fc2V0X3VzbVN0YXRlUmVmZXJlbmNlX2F1dGhfa2V5KCpzZWNTdGF0ZVJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5hdXRoS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPmF1dGhLZXlMZW4pID09IC0xKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBjYWNoZSBhdXRoZW50aWNhdGlvbiBrZXkuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgIH0KCiAgICAgICAgaWYgKHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfcHJpdl9wcm90b2NvbCgqc2VjU3RhdGVSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5wcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZQcm90b2NvbExlbikgPT0KICAgICAgICAgICAgLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNhY2hlIHByaXZhY3kgcHJvdG9jb2wuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgIH0KCiAgICAgICAgaWYgKHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfcHJpdl9rZXkoKnNlY1N0YXRlUmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPnByaXZLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+cHJpdktleUxlbikgPT0gLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkNvdWxkbid0IGNhY2hlIHByaXZhY3kga2V5LiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBQZXJmb3JtIHRoZSB0aW1lbGluZXNzL3RpbWUgbWFuYWdlciBmdW5jdGlvbnMuCiAgICAgKi8KICAgIGlmIChzZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWCiAgICAgICAgfHwgc2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBpZiAodXNtX2NoZWNrX2FuZF91cGRhdGVfdGltZWxpbmVzcyhzZWNFbmdpbmVJRCwgKnNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzX3VpbnQsIHRpbWVfdWludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpID09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICAgICB9CiAgICB9CiNpZmRlZgkJCQkJCQlMQ0RfVElNRV9TWU5DX09QVAogICAgLyoKICAgICAqIENhY2hlIHRoZSB1bmF1dGhlbnRpY2F0ZWQgdGltZSB0byB1c2UgaW4gY2FzZSB3ZSBkb24ndCBoYXZlCiAgICAgKiBhbnl0aGluZyBiZXR0ZXIgLSB0aGlzIGd1ZXNzIHdpbGwgYmUgbm8gd29yc2UgdGhhbiAoMCwwKQogICAgICogdGhhdCB3ZSBub3JtYWxseSB1c2UuCiAgICAgKi8KICAgIGVsc2UgewogICAgICAgIHNldF9lbmdpbmV0aW1lKHNlY0VuZ2luZUlELCAqc2VjRW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgYm9vdHNfdWludCwgdGltZV91aW50LCBGQUxTRSk7CiAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTENEX1RJTUVfU1lOQ19PUFQgKi8KCgogICAgLyoKICAgICAqIElmIG5lZWRlZCwgZGVjcnlwdCB0aGUgc2NvcGVkIFBEVS4KICAgICAqLwogICAgaWYgKHNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSB7CiAgICAgICAgcmVtYWluaW5nID0gd2hvbGVNc2dMZW4gLSAoZGF0YV9wdHIgLSB3aG9sZU1zZyk7CgogICAgICAgIGlmICgodmFsdWVfcHRyID0gYXNuX3BhcnNlX3NlcXVlbmNlKGRhdGFfcHRyLCAmcmVtYWluaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFTTl9PQ1RFVF9TVFIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNyeXB0ZWQgc1BEVSIpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgd2hpbGUgcGFyc2luZyBlbmNyeXB0ZWQgc1BEVS4iKSk7CiAgICAgICAgICAgIGlmIChzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMoU1RBVF9TTk1QSU5BU05QQVJTRUVSUlMpID09IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgaW5jcmVtZW50IHN0YXRpc3RpYy4iKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UoKnNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgKnNlY1N0YXRlUmVmID0gTlVMTDsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1BBUlNFRVJST1I7CiAgICAgICAgfQoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiAgICAgICAgaWYgKElTVFJBTlNGT1JNKHVzZXItPnByaXZQcm90b2NvbCwgREVTUHJpdikpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRnJvbSBSRkMyNTc0OgogICAgICAgICAgICAgKiAKICAgICAgICAgICAgICogIkJlZm9yZSBkZWNyeXB0aW9uLCB0aGUgZW5jcnlwdGVkIGRhdGEgbGVuZ3RoIGlzIHZlcmlmaWVkLgogICAgICAgICAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBPQ1RFVCBTVFJJTkcgdG8gYmUgZGVjcnlwdGVkIGlzIG5vdAogICAgICAgICAgICAgKiBhbiBpbnRlZ3JhbCBtdWx0aXBsZSBvZiA4IG9jdGV0cywgdGhlIGRlY3J5cHRpb24gcHJvY2VzcwogICAgICAgICAgICAgKiBpcyBoYWx0ZWQgYW5kIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBub3RlZC4iICAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAocmVtYWluaW5nICUgOCAhPSAwKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaXBoZXJ0ZXh0IGlzICVsdSBieXRlcywgbm90IGFuIGludGVnZXIgbXVsdGlwbGUgb2YgOCAocmVtICVsdSlcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylyZW1haW5pbmcsICh1bnNpZ25lZCBsb25nKXJlbWFpbmluZyAlIDgpKTsKICAgICAgICAgICAgICAgIGlmIChzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMoU1RBVF9VU01TVEFUU0RFQ1JZUFRJT05FUlJPUlMpID09CiAgICAgICAgICAgICAgICAgICAgMCkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgaW5jcmVtZW50IHN0YXRpc3RpYy4iKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZSgqc2VjU3RhdGVSZWYpOwogICAgICAgICAgICAgICAgKnNlY1N0YXRlUmVmID0gTlVMTDsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9ERUNSWVBUSU9ORVJST1I7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVuZF9vZl9vdmVyaGVhZCA9IHZhbHVlX3B0cjsKCiAgICAgICAgICAgIGlmICggIXVzZXItPnByaXZLZXkgKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIk5vIHByaXZhY3kgcGFzcyBwaHJhc2UgZm9yICVzXG4iLCB1c2VyLT5zZWNOYW1lKSk7CiAgICAgICAgICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfVVNNU1RBVFNERUNSWVBUSU9ORVJST1JTKSA9PQogICAgICAgICAgICAgICAgICAgIDApIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiRmFpbGVkIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UoKnNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgICAgICpzZWNTdGF0ZVJlZiA9IE5VTEw7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYT1IgdGhlIHNhbHQgd2l0aCB0aGUgbGFzdCAoaXZfbGVuZ3RoKSBieXRlcwogICAgICAgICAgICAgKiBvZiB0aGUgcHJpdl9rZXkgdG8gb2J0YWluIHRoZSBJVi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGl2X2xlbmd0aCA9IEJZVEVTSVpFKFVTTV9ERVNfU0FMVF9MRU5HVEgpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgaXZfbGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICBpdltpXSA9IHNhbHRbaV0gXiB1c2VyLT5wcml2S2V5W2l2X2xlbmd0aCArIGldOwogICAgICAgIH0KI2VuZGlmCiNpZmRlZiBIQVZFX0FFUwogICAgICAgIGlmIChJU1RSQU5TRk9STSh1c2VyLT5wcml2UHJvdG9jb2wsIEFFU1ByaXYpKSB7CiAgICAgICAgICAgIGl2X2xlbmd0aCA9IEJZVEVTSVpFKFVTTV9BRVNfU0FMVF9MRU5HVEgpOwogICAgICAgICAgICBuZXRfYm9vdHMgPSBudG9obChib290c191aW50KTsKICAgICAgICAgICAgbmV0X3RpbWUgPSBudG9obCh0aW1lX3VpbnQpOwogICAgICAgICAgICBtZW1jcHkoaXYsICZuZXRfYm9vdHMsIDQpOwogICAgICAgICAgICBtZW1jcHkoaXYrNCwgJm5ldF90aW1lLCA0KTsKICAgICAgICAgICAgbWVtY3B5KGl2KzgsIHNhbHQsIHNhbHRfbGVuZ3RoKTsKICAgICAgICB9CiNlbmRpZgogICAgICAgIAogICAgICAgIGlmIChzY19kZWNyeXB0KHVzZXItPnByaXZQcm90b2NvbCwgdXNlci0+cHJpdlByb3RvY29sTGVuLAogICAgICAgICAgICAgICAgICAgICAgIHVzZXItPnByaXZLZXksIHVzZXItPnByaXZLZXlMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaXYsIGl2X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wdHIsIHJlbWFpbmluZywgKnNjb3BlZFBkdSwgc2NvcGVkUGR1TGVuKQogICAgICAgICAgICAhPSBTTk1QX0VSUl9OT0VSUk9SKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgZGVjcnlwdGlvbi4iKSk7CiAgICAgICAgICAgIGlmIChzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMKICAgICAgICAgICAgICAgIChTVEFUX1VTTVNUQVRTREVDUllQVElPTkVSUk9SUykgPT0gMCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkZhaWxlZCBpbmNyZW1lbnQgc3RhdGlzdGljLiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOwogICAgICAgIH0KI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgICAgIGlmIChkZWJ1Z19pc190b2tlbl9yZWdpc3RlcmVkKCJ1c20vZHVtcCIpID09IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJDeXBoZXIgVGV4dCIsIHZhbHVlX3B0ciwgcmVtYWluaW5nKTsKICAgICAgICAgICAgZHVtcF9jaHVuaygidXNtL2R1bXAiLCAic2FsdCArIEVuY3J5cHRlZCBmb3JtOiIsCiAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW5ndGgpOwogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJJViArIEVuY3J5cHRlZCBmb3JtOiIsIGl2LCBpdl9sZW5ndGgpOwogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJEZWNyeXB0ZWQgY2h1bms6IiwKICAgICAgICAgICAgICAgICAgICAgICAqc2NvcGVkUGR1LCAqc2NvcGVkUGR1TGVuKTsKICAgICAgICB9CiNlbmRpZgogICAgfQogICAgLyoKICAgICAqIHNQRFUgaXMgcGxhaW50ZXh0LgogICAgICovCiAgICBlbHNlIHsKICAgICAgICAqc2NvcGVkUGR1ID0gZGF0YV9wdHI7CiAgICAgICAgKnNjb3BlZFBkdUxlbiA9IHdob2xlTXNnTGVuIC0gKGRhdGFfcHRyIC0gd2hvbGVNc2cpOwogICAgICAgIGVuZF9vZl9vdmVyaGVhZCA9IGRhdGFfcHRyOwoKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmRpZiAtLSBQRFUgZGVjcnlwdGlvbiAqLwoKCiAgICAvKgogICAgICogQ2FsY3VsYXRlIHRoZSBiaWdnZXN0IHNQRFUgZm9yIHRoZSByZXNwb25zZSAoaS5lLiwgd2hvbGUgLSBvdnJoZCkuCiAgICAgKgogICAgICogRklYICBDb3JyZWN0PyAKICAgICAqLwogICAgKm1heFNpemVSZXNwb25zZSA9IG1heE1zZ1NpemUgLSAoZW5kX29mX292ZXJoZWFkIC0gd2hvbGVNc2cpOwoKCiAgICBERUJVR01TR1RMKCgidXNtIiwgIlVTTSBwcm9jZXNzaW5nIGNvbXBsZXRlZC5cbiIpKTsKCiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX3Byb2Nlc3NfaW5fbXNnKCkgKi8KCnZvaWQKdXNtX2hhbmRsZV9yZXBvcnQodm9pZCAqc2Vzc3AsCiAgICAgICAgICAgICAgICAgIG5ldHNubXBfdHJhbnNwb3J0ICp0cmFuc3BvcnQsIG5ldHNubXBfc2Vzc2lvbiAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCwgbmV0c25tcF9wZHUgKnBkdSkKewogICAgLyoKICAgICAqIGhhbmRsZSByZXBvcnRhYmxlIGVycm9ycyAKICAgICAqLwoKICAgIC8qIHRoaXMgd2lsbCBnZXQgaW4gb3VyIHdheSAqLwogICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UocGR1LT5zZWN1cml0eVN0YXRlUmVmKTsKICAgIHBkdS0+c2VjdXJpdHlTdGF0ZVJlZiA9IE5VTEw7CgogICAgc3dpdGNoIChyZXN1bHQpIHsKICAgIGNhc2UgU05NUEVSUl9VU01fQVVUSEVOVElDQVRJT05GQUlMVVJFOgogICAgewogICAgICAgIGludCByZXMgPSBzZXNzaW9uLT5zX3NubXBfZXJybm87CiAgICAgICAgc2Vzc2lvbi0+c19zbm1wX2Vycm5vID0gcmVzdWx0OwogICAgICAgIGlmIChzZXNzaW9uLT5jYWxsYmFjaykgewogICAgICAgICAgICBzZXNzaW9uLT5jYWxsYmFjayhORVRTTk1QX0NBTExCQUNLX09QX1JFQ0VJVkVEX01FU1NBR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24sIHBkdS0+cmVxaWQsIHBkdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2FsbGJhY2tfbWFnaWMpOwogICAgICAgIH0KICAgICAgICBzZXNzaW9uLT5zX3NubXBfZXJybm8gPSByZXM7CiAgICB9ICAKICAgIC8qIGZhbGx0aHJvdWdoICovCiAgICBjYXNlIFNOTVBFUlJfVVNNX1VOS05PV05FTkdJTkVJRDoKICAgIGNhc2UgU05NUEVSUl9VU01fVU5LTk9XTlNFQ1VSSVRZTkFNRToKICAgIGNhc2UgU05NUEVSUl9VU01fVU5TVVBQT1JURURTRUNVUklUWUxFVkVMOgogICAgY2FzZSBTTk1QRVJSX1VTTV9OT1RJTlRJTUVXSU5ET1c6CiAgICBjYXNlIFNOTVBFUlJfVVNNX0RFQ1JZUFRJT05FUlJPUjoKCiAgICAgICAgaWYgKFNOTVBfQ01EX0NPTkZJUk1FRChwZHUtPmNvbW1hbmQpIHx8CiAgICAgICAgICAgIChwZHUtPmNvbW1hbmQgPT0gMAogICAgICAgICAgICAgJiYgKHBkdS0+ZmxhZ3MgJiBTTk1QX01TR19GTEFHX1JQUlRfQklUKSkpIHsKICAgICAgICAgICAgbmV0c25tcF9wZHUgICAgKnBkdTI7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmbGFncyA9IHBkdS0+ZmxhZ3M7CgogICAgICAgICAgICBwZHUtPmZsYWdzIHw9IFVDRF9NU0dfRkxBR19GT1JDRV9QRFVfQ09QWTsKICAgICAgICAgICAgcGR1MiA9IHNubXBfY2xvbmVfcGR1KHBkdSk7CiAgICAgICAgICAgIHBkdS0+ZmxhZ3MgPSBwZHUyLT5mbGFncyA9IGZsYWdzOwogICAgICAgICAgICBzbm1wdjNfbWFrZV9yZXBvcnQocGR1MiwgcmVzdWx0KTsKICAgICAgICAgICAgaWYgKDAgPT0gc25tcF9zZXNzX3NlbmQoc2Vzc3AsIHBkdTIpKSB7CiAgICAgICAgICAgICAgICBzbm1wX2ZyZWVfcGR1KHBkdTIpOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFRPRE86IGluZGljYXRlIGVycm9yIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9ICAgICAgIAp9CgovKiBzZXRzIHVwIGluaXRpYWwgZGVmYXVsdCBzZXNzaW9uIHBhcmFtZXRlcnMgKi8KaW50CnVzbV9zZXNzaW9uX2luaXQobmV0c25tcF9zZXNzaW9uICppbl9zZXNzaW9uLCBuZXRzbm1wX3Nlc3Npb24gKnNlc3Npb24pCnsKICAgIGNoYXIgKmNwOwogICAgc2l6ZV90IGk7CiAgICAKICAgIGlmIChpbl9zZXNzaW9uLT5zZWN1cml0eUF1dGhQcm90b0xlbiA+IDApIHsKICAgICAgICBzZXNzaW9uLT5zZWN1cml0eUF1dGhQcm90byA9CiAgICAgICAgICAgIHNubXBfZHVwbGljYXRlX29iamlkKGluX3Nlc3Npb24tPnNlY3VyaXR5QXV0aFByb3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9zZXNzaW9uLT5zZWN1cml0eUF1dGhQcm90b0xlbik7CiAgICAgICAgaWYgKHNlc3Npb24tPnNlY3VyaXR5QXV0aFByb3RvID09IE5VTEwpIHsKICAgICAgICAgICAgaW5fc2Vzc2lvbi0+c19zbm1wX2Vycm5vID0gU05NUEVSUl9NQUxMT0M7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX01BTExPQzsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGdldF9kZWZhdWx0X2F1dGh0eXBlKCZpKSAhPSBOVUxMKSB7CiAgICAgICAgc2Vzc2lvbi0+c2VjdXJpdHlBdXRoUHJvdG8gPQogICAgICAgICAgICBzbm1wX2R1cGxpY2F0ZV9vYmppZChnZXRfZGVmYXVsdF9hdXRodHlwZShOVUxMKSwgaSk7CiAgICAgICAgc2Vzc2lvbi0+c2VjdXJpdHlBdXRoUHJvdG9MZW4gPSBpOwogICAgfQoKICAgIGlmIChpbl9zZXNzaW9uLT5zZWN1cml0eVByaXZQcm90b0xlbiA+IDApIHsKICAgICAgICBzZXNzaW9uLT5zZWN1cml0eVByaXZQcm90byA9CiAgICAgICAgICAgIHNubXBfZHVwbGljYXRlX29iamlkKGluX3Nlc3Npb24tPnNlY3VyaXR5UHJpdlByb3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9zZXNzaW9uLT5zZWN1cml0eVByaXZQcm90b0xlbik7CiAgICAgICAgaWYgKHNlc3Npb24tPnNlY3VyaXR5UHJpdlByb3RvID09IE5VTEwpIHsKICAgICAgICAgICAgaW5fc2Vzc2lvbi0+c19zbm1wX2Vycm5vID0gU05NUEVSUl9NQUxMT0M7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX01BTExPQzsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGdldF9kZWZhdWx0X3ByaXZ0eXBlKCZpKSAhPSBOVUxMKSB7CiAgICAgICAgc2Vzc2lvbi0+c2VjdXJpdHlQcml2UHJvdG8gPQogICAgICAgICAgICBzbm1wX2R1cGxpY2F0ZV9vYmppZChnZXRfZGVmYXVsdF9wcml2dHlwZShOVUxMKSwgaSk7CiAgICAgICAgc2Vzc2lvbi0+c2VjdXJpdHlQcml2UHJvdG9MZW4gPSBpOwogICAgfQoKICAgIGlmICgoaW5fc2Vzc2lvbi0+c2VjdXJpdHlBdXRoS2V5TGVuIDw9IDApICYmCiAgICAgICAgKChjcCA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICBORVRTTk1QX0RTX0xJQl9BVVRITUFTVEVSS0VZKSkpKSB7CiAgICAgICAgc2l6ZV90IGJ1ZmxlbiA9IHNpemVvZihzZXNzaW9uLT5zZWN1cml0eUF1dGhLZXkpOwogICAgICAgIHVfY2hhciAqdG1wcCA9IHNlc3Npb24tPnNlY3VyaXR5QXV0aEtleTsKICAgICAgICBzZXNzaW9uLT5zZWN1cml0eUF1dGhLZXlMZW4gPSAwOwogICAgICAgIC8qIGl0IHdpbGwgYmUgYSBoZXggc3RyaW5nICovCiAgICAgICAgaWYgKCFzbm1wX2hleF90b19iaW5hcnkoJnRtcHAsICZidWZsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlc3Npb24tPnNlY3VyaXR5QXV0aEtleUxlbiwgMCwgY3ApKSB7CiAgICAgICAgICAgIHNubXBfc2V0X2RldGFpbCgiZXJyb3IgcGFyc2luZyBhdXRoZW50aWNhdGlvbiBtYXN0ZXIga2V5Iik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgfQogICAgfSBlbHNlIGlmICgoaW5fc2Vzc2lvbi0+c2VjdXJpdHlBdXRoS2V5TGVuIDw9IDApICYmCiAgICAgICAgICAgICAgICgoY3AgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9BVVRIUEFTU1BIUkFTRSkpIHx8CiAgICAgICAgICAgICAgICAoY3AgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9QQVNTUEhSQVNFKSkpKSB7CiAgICAgICAgc2Vzc2lvbi0+c2VjdXJpdHlBdXRoS2V5TGVuID0gVVNNX0FVVEhfS1VfTEVOOwogICAgICAgIGlmIChnZW5lcmF0ZV9LdShzZXNzaW9uLT5zZWN1cml0eUF1dGhQcm90bywKICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+c2VjdXJpdHlBdXRoUHJvdG9MZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgY3AsIHN0cmxlbihjcCksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnNlY3VyaXR5QXV0aEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgJnNlc3Npb24tPnNlY3VyaXR5QXV0aEtleUxlbikgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIHNubXBfc2V0X2RldGFpbAogICAgICAgICAgICAgICAgKCJFcnJvciBnZW5lcmF0aW5nIGEga2V5IChLdSkgZnJvbSB0aGUgc3VwcGxpZWQgYXV0aGVudGljYXRpb24gcGFzcyBwaHJhc2UuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgfQogICAgfQoKICAgIAogICAgaWYgKChpbl9zZXNzaW9uLT5zZWN1cml0eVByaXZLZXlMZW4gPD0gMCkgJiYKICAgICAgICAoKGNwID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICAgIE5FVFNOTVBfRFNfTElCX1BSSVZNQVNURVJLRVkpKSkpIHsKICAgICAgICBzaXplX3QgYnVmbGVuID0gc2l6ZW9mKHNlc3Npb24tPnNlY3VyaXR5UHJpdktleSk7CiAgICAgICAgdV9jaGFyICp0bXBwID0gc2Vzc2lvbi0+c2VjdXJpdHlQcml2S2V5OwogICAgICAgIHNlc3Npb24tPnNlY3VyaXR5UHJpdktleUxlbiA9IDA7CiAgICAgICAgLyogaXQgd2lsbCBiZSBhIGhleCBzdHJpbmcgKi8KICAgICAgICBpZiAoIXNubXBfaGV4X3RvX2JpbmFyeSgmdG1wcCwgJmJ1ZmxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vzc2lvbi0+c2VjdXJpdHlQcml2S2V5TGVuLCAwLCBjcCkpIHsKICAgICAgICAgICAgc25tcF9zZXRfZGV0YWlsKCJlcnJvciBwYXJzaW5nIGVuY3J5cHRpb24gbWFzdGVyIGtleSIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoKGluX3Nlc3Npb24tPnNlY3VyaXR5UHJpdktleUxlbiA8PSAwKSAmJgogICAgICAgICAgICAgICAoKGNwID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfUFJJVlBBU1NQSFJBU0UpKSB8fAogICAgICAgICAgICAgICAgKGNwID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfUEFTU1BIUkFTRSkpKSkgewogICAgICAgIHNlc3Npb24tPnNlY3VyaXR5UHJpdktleUxlbiA9IFVTTV9QUklWX0tVX0xFTjsKICAgICAgICBpZiAoZ2VuZXJhdGVfS3Uoc2Vzc2lvbi0+c2VjdXJpdHlBdXRoUHJvdG8sCiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnNlY3VyaXR5QXV0aFByb3RvTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopIGNwLCBzdHJsZW4oY3ApLAogICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5zZWN1cml0eVByaXZLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICZzZXNzaW9uLT5zZWN1cml0eVByaXZLZXlMZW4pICE9IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBzbm1wX3NldF9kZXRhaWwKICAgICAgICAgICAgICAgICgiRXJyb3IgZ2VuZXJhdGluZyBhIGtleSAoS3UpIGZyb20gdGhlIHN1cHBsaWVkIHByaXZhY3kgcGFzcyBwaHJhc2UuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCnZvaWQKaW5pdF91c20odm9pZCkKewogICAgc3RydWN0IHNubXBfc2VjbW9kX2RlZiAqZGVmOwoKICAgIERFQlVHTVNHVEwoKCJpbml0X3VzbSIsICJ1bml0X3VzbTogJSIgTkVUU05NUF9QUklvICJ1ICUiIE5FVFNOTVBfUFJJbyAidVxuIiwKICAgICAgICAgICAgICAgIHVzbU5vUHJpdlByb3RvY29sWzBdLCB1c21Ob1ByaXZQcm90b2NvbFsxXSkpOwoKICAgIHNjX2luaXQoKTsgICAgICAgICAgICAgICAgICAvKiBpbml0YWxpemUgc2NhcGkgY29kZSAqLwoKICAgIC8qCiAgICAgKiByZWdpc3RlciBvdXJzZWx2ZXMgYXMgYSBzZWN1cml0eSBzZXJ2aWNlIAogICAgICovCiAgICBkZWYgPSBTTk1QX01BTExPQ19TVFJVQ1Qoc25tcF9zZWNtb2RfZGVmKTsKICAgIGlmIChkZWYgPT0gTlVMTCkKICAgICAgICByZXR1cm47CiAgICAvKgogICAgICogWFhYOiBkZWYtPmluaXRfc2Vzc19zZWNtb2QgbW92ZSBzdHVmZiBmcm9tIHNubXBfYXBpLmMgCiAgICAgKi8KICAgIGRlZi0+ZW5jb2RlX3JldmVyc2UgPSB1c21fc2VjbW9kX3JnZW5lcmF0ZV9vdXRfbXNnOwogICAgZGVmLT5lbmNvZGVfZm9yd2FyZCA9IHVzbV9zZWNtb2RfZ2VuZXJhdGVfb3V0X21zZzsKICAgIGRlZi0+ZGVjb2RlID0gdXNtX3NlY21vZF9wcm9jZXNzX2luX21zZzsKICAgIGRlZi0+cGR1X2ZyZWVfc3RhdGVfcmVmID0gdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2U7CiAgICBkZWYtPnNlc3Npb25fc2V0dXAgPSB1c21fc2Vzc2lvbl9pbml0OwogICAgZGVmLT5oYW5kbGVfcmVwb3J0ID0gdXNtX2hhbmRsZV9yZXBvcnQ7CiAgICByZWdpc3Rlcl9zZWNfbW9kKFVTTV9TRUNfTU9ERUxfTlVNQkVSLCAidXNtIiwgZGVmKTsKCiAgICBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrKFNOTVBfQ0FMTEJBQ0tfTElCUkFSWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUF9DQUxMQkFDS19QT1NUX1BSRU1JQl9SRUFEX0NPTkZJRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF91c21fcG9zdF9jb25maWcsIE5VTEwpOwoKICAgIHNubXBfcmVnaXN0ZXJfY2FsbGJhY2soU05NUF9DQUxMQkFDS19MSUJSQVJZLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QX0NBTExCQUNLX1NIVVRET1dOLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWluaXRfdXNtX3Bvc3RfY29uZmlnLCBOVUxMKTsKCiAgICBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrKFNOTVBfQ0FMTEJBQ0tfTElCUkFSWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUF9DQUxMQkFDS19TSFVURE9XTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9lbmdpbmVJRCwgTlVMTCk7Cgp9Cgp2b2lkCmluaXRfdXNtX2NvbmYoY29uc3QgY2hhciAqYXBwKQp7CiAgICByZWdpc3Rlcl9jb25maWdfaGFuZGxlcihhcHAsICJ1c21Vc2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbV9wYXJzZV9jb25maWdfdXNtVXNlciwgTlVMTCwgTlVMTCk7CiAgICByZWdpc3Rlcl9jb25maWdfaGFuZGxlcihhcHAsICJjcmVhdGVVc2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbV9wYXJzZV9jcmVhdGVfdXNtVXNlciwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VybmFtZSBbLWUgRU5HSU5FSURdIChNRDV8U0hBKSBhdXRocGFzc3BocmFzZSBbREVTIFtwcml2cGFzc3BocmFzZV1dIik7CgogICAgLyoKICAgICAqIHdlIG5lZWQgdG8gYmUgY2FsbGVkIGJhY2sgbGF0ZXIgCiAgICAgKi8KICAgIHNubXBfcmVnaXN0ZXJfY2FsbGJhY2soU05NUF9DQUxMQkFDS19MSUJSQVJZLCBTTk1QX0NBTExCQUNLX1NUT1JFX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbV9zdG9yZV91c2VycywgTlVMTCk7Cn0KCi8qCiAqIGluaXRpYWxpemF0aW9ucyBmb3IgdGhlIFVTTS4KICoKICogU2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aGUgKGVuZ2luZWlkKSBjb25maWd1cmF0aW9uIGZpbGVzIGhhdmUgYmVlbiByZWFkLgogKgogKiBTZXQgImFyYml0cmFyeSIgcG9ydGlvbiBvZiBzYWx0IHRvIGEgcmFuZG9tIG51bWJlci4KICovCmludAppbml0X3VzbV9wb3N0X2NvbmZpZyhpbnQgbWFqb3JpZCwgaW50IG1pbm9yaWQsIHZvaWQgKnNlcnZlcmFyZywKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xpZW50YXJnKQp7CiAgICBzaXplX3QgICAgICAgICAgc2FsdF9pbnRlZ2VyX2xlbiA9IHNpemVvZihzYWx0X2ludGVnZXIpOwoKICAgIGlmIChzY19yYW5kb20oKHVfY2hhciAqKSAmIHNhbHRfaW50ZWdlciwgJnNhbHRfaW50ZWdlcl9sZW4pICE9CiAgICAgICAgU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJzY19yYW5kb20oKSBmYWlsZWQ6IHVzaW5nIHRpbWUoKSBhcyBzYWx0LlxuIikpOwogICAgICAgIHNhbHRfaW50ZWdlciA9ICh1X2ludCkgdGltZShOVUxMKTsKICAgIH0KCiNpZmRlZiBIQVZFX0FFUwogICAgc2FsdF9pbnRlZ2VyX2xlbiA9IHNpemVvZiAoc2FsdF9pbnRlZ2VyNjRfMSk7CiAgICBpZiAoc2NfcmFuZG9tKCh1X2NoYXIgKikgJiBzYWx0X2ludGVnZXI2NF8xLCAmc2FsdF9pbnRlZ2VyX2xlbikgIT0KICAgICAgICBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgInNjX3JhbmRvbSgpIGZhaWxlZDogdXNpbmcgdGltZSgpIGFzIGFlczEgc2FsdC5cbiIpKTsKICAgICAgICBzYWx0X2ludGVnZXI2NF8xID0gKHVfaW50KSB0aW1lKE5VTEwpOwogICAgfQogICAgc2FsdF9pbnRlZ2VyX2xlbiA9IHNpemVvZiAoc2FsdF9pbnRlZ2VyNjRfMSk7CiAgICBpZiAoc2NfcmFuZG9tKCh1X2NoYXIgKikgJiBzYWx0X2ludGVnZXI2NF8yLCAmc2FsdF9pbnRlZ2VyX2xlbikgIT0KICAgICAgICBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgInNjX3JhbmRvbSgpIGZhaWxlZDogdXNpbmcgdGltZSgpIGFzIGFlczIgc2FsdC5cbiIpKTsKICAgICAgICBzYWx0X2ludGVnZXI2NF8yID0gKHVfaW50KSB0aW1lKE5VTEwpOwogICAgfQojZW5kaWYKICAgIAojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NRDUKICAgIG5vTmFtZVVzZXIgPSB1c21fY3JlYXRlX2luaXRpYWxfdXNlcigiIiwgdXNtSE1BQ01ENUF1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU01fTEVOR1RIX09JRF9UUkFOU0ZPUk0sCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbURFU1ByaXZQcm90b2NvbCwKI2Vsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c21BRVNQcml2UHJvdG9jb2wsCiNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTTV9MRU5HVEhfT0lEX1RSQU5TRk9STSk7CiNlbHNlCiAgICBub05hbWVVc2VyID0gdXNtX2NyZWF0ZV9pbml0aWFsX3VzZXIoIiIsIHVzbUhNQUNTSEExQXV0aFByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTTV9MRU5HVEhfT0lEX1RSQU5TRk9STSwKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNtREVTUHJpdlByb3RvY29sLAojZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbUFFU1ByaXZQcm90b2NvbCwKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNNX0xFTkdUSF9PSURfVFJBTlNGT1JNKTsKI2VuZGlmCgogICAgaWYgKCBub05hbWVVc2VyICkgewogICAgICAgIFNOTVBfRlJFRShub05hbWVVc2VyLT5lbmdpbmVJRCk7CiAgICAgICAgbm9OYW1lVXNlci0+ZW5naW5lSURMZW4gPSAwOwogICAgfQoKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGluaXRfdXNtX3Bvc3RfY29uZmlnKCkgKi8KCmludApkZWluaXRfdXNtX3Bvc3RfY29uZmlnKGludCBtYWpvcmlkLCBpbnQgbWlub3JpZCwgdm9pZCAqc2VydmVyYXJnLAoJCSAgICAgICB2b2lkICpjbGllbnRhcmcpCnsKICAgIGlmICh1c21fZnJlZV91c2VyKG5vTmFtZVVzZXIpICE9IE5VTEwpIHsKCURFQlVHTVNHVEwoKCJkZWluaXRfdXNtX3Bvc3RfY29uZmlnIiwgImNvdWxkIG5vdCBmcmVlIGluaXRpYWwgdXNlclxuIikpOwoJcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgfQogICAgbm9OYW1lVXNlciA9IE5VTEw7CgogICAgREVCVUdNU0dUTCgoImRlaW5pdF91c21fcG9zdF9jb25maWciLCAiaW5pdGlhbCB1c2VyIHJlbW92ZWRcbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGRlaW5pdF91c21fcG9zdF9jb25maWcoKSAqLwoKdm9pZApjbGVhcl91c2VyX2xpc3Qodm9pZCkKewogICAgc3RydWN0IHVzbVVzZXIgKnRtcCA9IHVzZXJMaXN0LCAqbmV4dCA9IE5VTEw7CgogICAgd2hpbGUgKHRtcCAhPSBOVUxMKSB7CgluZXh0ID0gdG1wLT5uZXh0OwoJdXNtX2ZyZWVfdXNlcih0bXApOwoJdG1wID0gbmV4dDsKICAgIH0KICAgIHVzZXJMaXN0ID0gTlVMTDsKCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9jaGVja19zZWNMZXZlbAogKgogKiBQYXJhbWV0ZXJzOgogKgkgbGV2ZWwKICoJKnVzZXIKICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCiAqIENoZWNrcyB0aGF0IGEgZ2l2ZW4gc2VjdXJpdHkgbGV2ZWwgaXMgdmFsaWQgZm9yIGEgZ2l2ZW4gdXNlci4KICovCmludAp1c21fY2hlY2tfc2VjTGV2ZWwoaW50IGxldmVsLCBzdHJ1Y3QgdXNtVXNlciAqdXNlcikKewoKICAgIGlmICh1c2VyLT51c2VyU3RhdHVzICE9IFJTX0FDVElWRSkKICAgICAgICByZXR1cm4gLTE7CgogICAgREVCVUdNU0dUTCgoImNvbXBhcmV4IiwgIkNvbXBhcmluZzogJSIgTkVUU05NUF9QUklvICJ1ICUiIE5FVFNOTVBfUFJJbyAidSAiLAogICAgICAgICAgICAgICAgdXNtTm9Qcml2UHJvdG9jb2xbMF0sIHVzbU5vUHJpdlByb3RvY29sWzFdKSk7CiAgICBERUJVR01TR09JRCgoImNvbXBhcmV4IiwgdXNtTm9Qcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKHVzbU5vUHJpdlByb3RvY29sKSAvIHNpemVvZihvaWQpKSk7CiAgICBERUJVR01TRygoImNvbXBhcmV4IiwgIlxuIikpOwogICAgaWYgKGxldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWCiAgICAgICAgJiYgKG5ldHNubXBfb2lkX2VxdWFscyh1c2VyLT5wcml2UHJvdG9jb2wsIHVzZXItPnByaXZQcm90b2NvbExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c21Ob1ByaXZQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodXNtTm9Qcml2UHJvdG9jb2wpIC8gc2l6ZW9mKG9pZCkpID09CiAgICAgICAgICAgIDApKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJMZXZlbDogJWRcbiIsIGxldmVsKSk7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJVc2VyICglcykgQXV0aCBQcm90b2NvbDogIiwgdXNlci0+bmFtZSkpOwogICAgICAgIERFQlVHTVNHT0lEKCgidXNtIiwgdXNlci0+YXV0aFByb3RvY29sLCB1c2VyLT5hdXRoUHJvdG9jb2xMZW4pKTsKICAgICAgICBERUJVR01TRygoInVzbSIsICIsIFVzZXIgUHJpdiBQcm90b2NvbDogIikpOwogICAgICAgIERFQlVHTVNHT0lEKCgidXNtIiwgdXNlci0+cHJpdlByb3RvY29sLCB1c2VyLT5wcml2UHJvdG9jb2xMZW4pKTsKICAgICAgICBERUJVR01TRygoInVzbSIsICJcbiIpKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmICgobGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYKICAgICAgICAgfHwgbGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSE5PUFJJVikKICAgICAgICAmJgogICAgICAgIChuZXRzbm1wX29pZF9lcXVhbHMKICAgICAgICAgKHVzZXItPmF1dGhQcm90b2NvbCwgdXNlci0+YXV0aFByb3RvY29sTGVuLCB1c21Ob0F1dGhQcm90b2NvbCwKICAgICAgICAgIHNpemVvZih1c21Ob0F1dGhQcm90b2NvbCkgLyBzaXplb2Yob2lkKSkgPT0gMCkpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkxldmVsOiAlZFxuIiwgbGV2ZWwpKTsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIlVzZXIgKCVzKSBBdXRoIFByb3RvY29sOiAiLCB1c2VyLT5uYW1lKSk7CiAgICAgICAgREVCVUdNU0dPSUQoKCJ1c20iLCB1c2VyLT5hdXRoUHJvdG9jb2wsIHVzZXItPmF1dGhQcm90b2NvbExlbikpOwogICAgICAgIERFQlVHTVNHKCgidXNtIiwgIiwgVXNlciBQcml2IFByb3RvY29sOiAiKSk7CiAgICAgICAgREVCVUdNU0dPSUQoKCJ1c20iLCB1c2VyLT5wcml2UHJvdG9jb2wsIHVzZXItPnByaXZQcm90b2NvbExlbikpOwogICAgICAgIERFQlVHTVNHKCgidXNtIiwgIlxuIikpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAwOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2NoZWNrX3NlY0xldmVsKCkgKi8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9jaGVja19zZWNMZXZlbF92c19wcm90b2NvbHMKICoKICogUGFyYW1ldGVyczoKICoJIGxldmVsCiAqCSphdXRoUHJvdG9jb2wKICoJIGF1dGhQcm90b2NvbExlbgogKgkqcHJpdlByb3RvY29sCiAqCSBwcml2UHJvdG9jb2xMZW4KICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgkxCU90aGVyd2lzZS4KICoKICogU2FtZSBhcyBhYm92ZSBidXQgd2l0aCBleHBsaWNpdGx5IG5hbWVkIHRyYW5zZm9ybSB0eXBlcyBpbnN0ZWFkIG9mIHRha2luZwogKiBmcm9tIHRoZSB1c21Vc2VyIHN0cnVjdHVyZS4KICovCmludAp1c21fY2hlY2tfc2VjTGV2ZWxfdnNfcHJvdG9jb2xzKGludCBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBhdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQgYXV0aFByb3RvY29sTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIHByaXZQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCBwcml2UHJvdG9jb2xMZW4pCnsKCiAgICBpZiAobGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYKICAgICAgICAmJgogICAgICAgIChuZXRzbm1wX29pZF9lcXVhbHMKICAgICAgICAgKHByaXZQcm90b2NvbCwgcHJpdlByb3RvY29sTGVuLCB1c21Ob1ByaXZQcm90b2NvbCwKICAgICAgICAgIHNpemVvZih1c21Ob1ByaXZQcm90b2NvbCkgLyBzaXplb2Yob2lkKSkgPT0gMCkpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkxldmVsOiAlZFxuIiwgbGV2ZWwpKTsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkF1dGggUHJvdG9jb2w6ICIpKTsKICAgICAgICBERUJVR01TR09JRCgoInVzbSIsIGF1dGhQcm90b2NvbCwgYXV0aFByb3RvY29sTGVuKSk7CiAgICAgICAgREVCVUdNU0coKCJ1c20iLCAiLCBQcml2IFByb3RvY29sOiAiKSk7CiAgICAgICAgREVCVUdNU0dPSUQoKCJ1c20iLCBwcml2UHJvdG9jb2wsIHByaXZQcm90b2NvbExlbikpOwogICAgICAgIERFQlVHTVNHKCgidXNtIiwgIlxuIikpOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgaWYgKChsZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVgogICAgICAgICB8fCBsZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWKQogICAgICAgICYmCiAgICAgICAgKG5ldHNubXBfb2lkX2VxdWFscwogICAgICAgICAoYXV0aFByb3RvY29sLCBhdXRoUHJvdG9jb2xMZW4sIHVzbU5vQXV0aFByb3RvY29sLAogICAgICAgICAgc2l6ZW9mKHVzbU5vQXV0aFByb3RvY29sKSAvIHNpemVvZihvaWQpKSA9PSAwKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiTGV2ZWw6ICVkXG4iLCBsZXZlbCkpOwogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiQXV0aCBQcm90b2NvbDogIikpOwogICAgICAgIERFQlVHTVNHT0lEKCgidXNtIiwgYXV0aFByb3RvY29sLCBhdXRoUHJvdG9jb2xMZW4pKTsKICAgICAgICBERUJVR01TRygoInVzbSIsICIsIFByaXYgUHJvdG9jb2w6ICIpKTsKICAgICAgICBERUJVR01TR09JRCgoInVzbSIsIHByaXZQcm90b2NvbCwgcHJpdlByb3RvY29sTGVuKSk7CiAgICAgICAgREVCVUdNU0coKCJ1c20iLCAiXG4iKSk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuIDA7Cgp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB1c21fY2hlY2tfc2VjTGV2ZWxfdnNfcHJvdG9jb2xzKCkgKi8KCgoKCi8qCiAqIHVzbV9nZXRfdXNlcigpOiBSZXR1cm5zIGEgdXNlciBmcm9tIHVzZXJMaXN0IGJhc2VkIG9uIHRoZSBlbmdpbmVJRCwKICogZW5naW5lSURMZW4gYW5kIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCB1c2VyLiAKICovCgpzdHJ1Y3QgdXNtVXNlciAqCnVzbV9nZXRfdXNlcih1X2NoYXIgKiBlbmdpbmVJRCwgc2l6ZV90IGVuZ2luZUlETGVuLCBjaGFyICpuYW1lKQp7CiAgICBERUJVR01TR1RMKCgidXNtIiwgImdldHRpbmcgdXNlciAlc1xuIiwgbmFtZSkpOwogICAgcmV0dXJuIHVzbV9nZXRfdXNlcl9mcm9tX2xpc3QoZW5naW5lSUQsIGVuZ2luZUlETGVuLCBuYW1lLCB1c2VyTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwp9CgpzdHJ1Y3QgdXNtVXNlciAqCnVzbV9nZXRfdXNlcl9mcm9tX2xpc3QodV9jaGFyICogZW5naW5lSUQsIHNpemVfdCBlbmdpbmVJRExlbiwKICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpuYW1lLCBzdHJ1Y3QgdXNtVXNlciAqcHVzZXJMaXN0LAogICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfZGVmYXVsdCkKewogICAgc3RydWN0IHVzbVVzZXIgKnB0cjsKICAgIGNoYXIgICAgICAgICAgICBub05hbWVbXSA9ICIiOwogICAgaWYgKG5hbWUgPT0gTlVMTCkKICAgICAgICBuYW1lID0gbm9OYW1lOwogICAgZm9yIChwdHIgPSBwdXNlckxpc3Q7IHB0ciAhPSBOVUxMOyBwdHIgPSBwdHItPm5leHQpIHsKICAgICAgICBpZiAocHRyLT5uYW1lICYmICFzdHJjbXAocHRyLT5uYW1lLCBuYW1lKSkgewogICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJtYXRjaCBvbiB1c2VyICVzXG4iLCBwdHItPm5hbWUpKTsKICAgICAgICAgIGlmIChwdHItPmVuZ2luZUlETGVuID09IGVuZ2luZUlETGVuICYmCiAgICAgICAgICAgICgocHRyLT5lbmdpbmVJRCA9PSBOVUxMICYmIGVuZ2luZUlEID09IE5VTEwpIHx8CiAgICAgICAgICAgICAocHRyLT5lbmdpbmVJRCAhPSBOVUxMICYmIGVuZ2luZUlEICE9IE5VTEwgJiYKICAgICAgICAgICAgICBtZW1jbXAocHRyLT5lbmdpbmVJRCwgZW5naW5lSUQsIGVuZ2luZUlETGVuKSA9PSAwKSkpCiAgICAgICAgICAgIHJldHVybiBwdHI7CiAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIm5vIG1hdGNoIG9uIGVuZ2luZUlEICgiKSk7CiAgICAgICAgICBpZiAoZW5naW5lSUQpIHsKICAgICAgICAgICAgICBERUJVR01TR0hFWCgoInVzbSIsIGVuZ2luZUlELCBlbmdpbmVJRExlbikpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkVtcHR5IEVuZ2luZUlEIikpOwogICAgICAgICAgfQogICAgICAgICAgREVCVUdNU0coKCJ1c20iLCAiKVxuIikpOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogcmV0dXJuICIiIHVzZXIgdXNlZCB0byBmYWNpbGl0YXRlIGVuZ2luZUlEIGRpc2NvdmVyeSAKICAgICAqLwogICAgaWYgKHVzZV9kZWZhdWx0ICYmICFzdHJjbXAobmFtZSwgIiIpKQogICAgICAgIHJldHVybiBub05hbWVVc2VyOwogICAgcmV0dXJuIE5VTEw7Cn0KCi8qCiAqIHVzbV9hZGRfdXNlcigpOiBBZGQncyBhIHVzZXIgdG8gdGhlIHVzZXJMaXN0LCBzb3J0ZWQgYnkgdGhlCiAqIGVuZ2luZUlETGVuZ3RoIHRoZW4gdGhlIGVuZ2luZUlEIHRoZW4gdGhlIG5hbWUgbGVuZ3RoIHRoZW4gdGhlIG5hbWUKICogdG8gZmFjaWxpdGF0ZSBnZXROZXh0IGNhbGxzIG9uIGEgdXNtVXNlciB0YWJsZSB3aGljaCBpcyBpbmRleGVkIGJ5CiAqIHRoZXNlIHZhbHVlcy4KICogCiAqIHJldHVybnMgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKHdoaWNoIGNvdWxkIGNoYW5nZSBkdWUgdG8gdGhpcyBhZGQpLgogKi8KCnN0cnVjdCB1c21Vc2VyICoKdXNtX2FkZF91c2VyKHN0cnVjdCB1c21Vc2VyICp1c2VyKQp7CiAgICBzdHJ1Y3QgdXNtVXNlciAqdXB0cjsKICAgIHVwdHIgPSB1c21fYWRkX3VzZXJfdG9fbGlzdCh1c2VyLCB1c2VyTGlzdCk7CiAgICBpZiAodXB0ciAhPSBOVUxMKQogICAgICAgIHVzZXJMaXN0ID0gdXB0cjsKICAgIHJldHVybiB1cHRyOwp9CgpzdHJ1Y3QgdXNtVXNlciAqCnVzbV9hZGRfdXNlcl90b19saXN0KHN0cnVjdCB1c21Vc2VyICp1c2VyLCBzdHJ1Y3QgdXNtVXNlciAqcHVzZXJMaXN0KQp7CiAgICBzdHJ1Y3QgdXNtVXNlciAqbnB0ciwgKnBwdHIsICpvcHRyOwoKICAgIC8qCiAgICAgKiBsb29wIHRocm91Z2ggcHVzZXJMaXN0IHRpbGwgd2UgZmluZCB0aGUgcHJvcGVyLCBzb3J0ZWQgcGxhY2UgdG8KICAgICAqIGluc2VydCB0aGUgbmV3IHVzZXIgCiAgICAgKi8KICAgIC8qIFhYWCAtIGhvdyB0byBoYW5kbGUgYSBOVUxMIHVzZXItPm5hbWUgPz8gKi8KICAgIC8qIFhYWCAtIHNpbWlsYXJseSBmb3IgYSBOVUxMIG5wdHItPm5hbWUgPz8gKi8KICAgIGZvciAobnB0ciA9IHB1c2VyTGlzdCwgcHB0ciA9IE5VTEw7IG5wdHIgIT0gTlVMTDsKICAgICAgICAgcHB0ciA9IG5wdHIsIG5wdHIgPSBucHRyLT5uZXh0KSB7CiAgICAgICAgaWYgKG5wdHItPmVuZ2luZUlETGVuID4gdXNlci0+ZW5naW5lSURMZW4pCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBpZiAodXNlci0+ZW5naW5lSUQgPT0gTlVMTCAmJiBucHRyLT5lbmdpbmVJRCAhPSBOVUxMKQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgaWYgKG5wdHItPmVuZ2luZUlETGVuID09IHVzZXItPmVuZ2luZUlETGVuICYmCiAgICAgICAgICAgIChucHRyLT5lbmdpbmVJRCAhPSBOVUxMICYmIHVzZXItPmVuZ2luZUlEICE9IE5VTEwgJiYKICAgICAgICAgICAgIG1lbWNtcChucHRyLT5lbmdpbmVJRCwgdXNlci0+ZW5naW5lSUQsCiAgICAgICAgICAgICAgICAgICAgdXNlci0+ZW5naW5lSURMZW4pID4gMCkpCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBpZiAoIShucHRyLT5lbmdpbmVJRCA9PSBOVUxMICYmIHVzZXItPmVuZ2luZUlEICE9IE5VTEwpKSB7CiAgICAgICAgICAgIGlmIChucHRyLT5lbmdpbmVJRExlbiA9PSB1c2VyLT5lbmdpbmVJRExlbiAmJgogICAgICAgICAgICAgICAgKChucHRyLT5lbmdpbmVJRCA9PSBOVUxMICYmIHVzZXItPmVuZ2luZUlEID09IE5VTEwpIHx8CiAgICAgICAgICAgICAgICAgbWVtY21wKG5wdHItPmVuZ2luZUlELCB1c2VyLT5lbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+ZW5naW5lSURMZW4pID09IDApCiAgICAgICAgICAgICAgICAmJiBzdHJsZW4obnB0ci0+bmFtZSkgPiBzdHJsZW4odXNlci0+bmFtZSkpCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGlmIChucHRyLT5lbmdpbmVJRExlbiA9PSB1c2VyLT5lbmdpbmVJRExlbiAmJgogICAgICAgICAgICAgICAgKChucHRyLT5lbmdpbmVJRCA9PSBOVUxMICYmIHVzZXItPmVuZ2luZUlEID09IE5VTEwpIHx8CiAgICAgICAgICAgICAgICAgbWVtY21wKG5wdHItPmVuZ2luZUlELCB1c2VyLT5lbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+ZW5naW5lSURMZW4pID09IDApCiAgICAgICAgICAgICAgICAmJiBzdHJsZW4obnB0ci0+bmFtZSkgPT0gc3RybGVuKHVzZXItPm5hbWUpCiAgICAgICAgICAgICAgICAmJiBzdHJjbXAobnB0ci0+bmFtZSwgdXNlci0+bmFtZSkgPiAwKQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBpZiAobnB0ci0+ZW5naW5lSURMZW4gPT0gdXNlci0+ZW5naW5lSURMZW4gJiYKICAgICAgICAgICAgICAgICgobnB0ci0+ZW5naW5lSUQgPT0gTlVMTCAmJiB1c2VyLT5lbmdpbmVJRCA9PSBOVUxMKSB8fAogICAgICAgICAgICAgICAgIG1lbWNtcChucHRyLT5lbmdpbmVJRCwgdXNlci0+ZW5naW5lSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPmVuZ2luZUlETGVuKSA9PSAwKQogICAgICAgICAgICAgICAgJiYgc3RybGVuKG5wdHItPm5hbWUpID09IHN0cmxlbih1c2VyLT5uYW1lKQogICAgICAgICAgICAgICAgJiYgc3RyY21wKG5wdHItPm5hbWUsIHVzZXItPm5hbWUpID09IDApIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB0aGUgdXNlciBpcyBhbiBleGFjdCBtYXRjaCBvZiBhIHByZXZpb3VzIGVudHJ5LgogICAgICAgICAgICAgICAgICogQ3JlZGVudGlhbHMgbWF5IGJlIGRpZmZlcmVudCwgdGhvdWdoLCBzbyByZW1vdmUKICAgICAgICAgICAgICAgICAqIHRoZSBvbGQgZW50cnkgKGFuZCBhZGQgdGhlIG5ldyBvbmUpIQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAocHB0cikgeyAvKiBjaGFuZ2UgcHJldidzIG5leHQgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgICBwcHRyLT5uZXh0ID0gbnB0ci0+bmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChucHRyLT5uZXh0KSB7IC8qIGNoYW5nZSBuZXh0J3MgcHJldiBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgIG5wdHItPm5leHQtPnByZXYgPSBwcHRyOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIG9wdHIgPSBucHRyOwogICAgICAgICAgICAgICAgbnB0ciA9IG9wdHItPm5leHQ7IC8qIGFkZCBuZXcgdXNlciBhdCB0aGlzIHBvc2l0aW9uICovCiAgICAgICAgICAgICAgICAvKiBmcmVlIHRoZSBvbGQgdXNlciAqLwogICAgICAgICAgICAgICAgb3B0ci0+bmV4dD1OVUxMOwogICAgICAgICAgICAgICAgb3B0ci0+cHJldj1OVUxMOwogICAgICAgICAgICAgICAgdXNtX2ZyZWVfdXNlcihvcHRyKTsgCiAgICAgICAgICAgICAgICBicmVhazsgLyogbmV3IHVzZXIgd2lsbCBiZSBhZGRlZCBiZWxvdyAqLwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBucHRyIHNob3VsZCBub3cgcG9pbnQgdG8gdGhlIHVzZXIgdGhhdCB3ZSBuZWVkIHRvIGFkZCBvdXJzZWx2ZXMKICAgICAqIGluIGZyb250IG9mLCBhbmQgcHB0ciBzaG91bGQgYmUgb3VyIG5ldyAncHJldicuIAogICAgICovCgogICAgLyoKICAgICAqIGNoYW5nZSBvdXIgcG9pbnRlcnMgCiAgICAgKi8KICAgIHVzZXItPnByZXYgPSBwcHRyOwogICAgdXNlci0+bmV4dCA9IG5wdHI7CgogICAgLyoKICAgICAqIGNoYW5nZSB0aGUgbmV4dCdzIHByZXYgcG9pbnRlciAKICAgICAqLwogICAgaWYgKHVzZXItPm5leHQpCiAgICAgICAgdXNlci0+bmV4dC0+cHJldiA9IHVzZXI7CgogICAgLyoKICAgICAqIGNoYW5nZSB0aGUgcHJldidzIG5leHQgcG9pbnRlciAKICAgICAqLwogICAgaWYgKHVzZXItPnByZXYpCiAgICAgICAgdXNlci0+cHJldi0+bmV4dCA9IHVzZXI7CgogICAgLyoKICAgICAqIHJld2luZCB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCBhbmQgcmV0dXJuIGl0IChzaW5jZSB0aGUgbmV3IGhlYWQKICAgICAqIGNvdWxkIGJlIHVzLCB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgYWJvdmUgcm91dGluZSB3aG8gdGhlIGhlYWQgbm93IGlzLiAKICAgICAqLwogICAgZm9yIChwcHRyID0gdXNlcjsgcHB0ci0+cHJldiAhPSBOVUxMOyBwcHRyID0gcHB0ci0+cHJldik7CiAgICByZXR1cm4gcHB0cjsKfQoKLyoKICogdXNtX3JlbW92ZV91c2VyKCk6IGZpbmRzIGFuZCByZW1vdmVzIGEgdXNlciBmcm9tIGEgbGlzdCAKICovCnN0cnVjdCB1c21Vc2VyICoKdXNtX3JlbW92ZV91c2VyKHN0cnVjdCB1c21Vc2VyICp1c2VyKQp7CiAgICByZXR1cm4gdXNtX3JlbW92ZV91c2VyX2Zyb21fbGlzdCh1c2VyLCAmdXNlckxpc3QpOwp9CgpzdHJ1Y3QgdXNtVXNlciAqCnVzbV9yZW1vdmVfdXNlcl9mcm9tX2xpc3Qoc3RydWN0IHVzbVVzZXIgKnVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzbVVzZXIgKipwcHVzZXJMaXN0KQp7CiAgICBzdHJ1Y3QgdXNtVXNlciAqbnB0ciwgKnBwdHI7CgogICAgLyoKICAgICAqIE5VTEwgcG9pbnRlcnMgYXJlbid0IGFsbG93ZWQgCiAgICAgKi8KICAgIGlmIChwcHVzZXJMaXN0ID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKCpwcHVzZXJMaXN0ID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyoKICAgICAqIGZpbmQgdGhlIHVzZXIgaW4gdGhlIGxpc3QgCiAgICAgKi8KICAgIGZvciAobnB0ciA9ICpwcHVzZXJMaXN0LCBwcHRyID0gTlVMTDsgbnB0ciAhPSBOVUxMOwogICAgICAgICBwcHRyID0gbnB0ciwgbnB0ciA9IG5wdHItPm5leHQpIHsKICAgICAgICBpZiAobnB0ciA9PSB1c2VyKQogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAobnB0cikgewogICAgICAgIC8qCiAgICAgICAgICogcmVtb3ZlIHRoZSB1c2VyIGZyb20gdGhlIGxpbmtlZCBsaXN0IAogICAgICAgICAqLwogICAgICAgIGlmIChwcHRyKSB7CiAgICAgICAgICAgIHBwdHItPm5leHQgPSBucHRyLT5uZXh0OwogICAgICAgIH0KICAgICAgICBpZiAobnB0ci0+bmV4dCkgewogICAgICAgICAgICBucHRyLT5uZXh0LT5wcmV2ID0gcHB0cjsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIC8qCiAgICAgICAgICogdXNlciBkaWRuJ3QgZXhpc3QgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBpZiAobnB0ciA9PSAqcHB1c2VyTGlzdCkgICAgLyogd2UncmUgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG5lZWQgdG8gY2hhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKiB0aGUgaGVhZCB0byB0aGUgbmV4dCB1c2VyICovCiAgICAgICAgKnBwdXNlckxpc3QgPSBucHRyLT5uZXh0OwogICAgcmV0dXJuICpwcHVzZXJMaXN0Owp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB1c21fcmVtb3ZlX3VzZXJfZnJvbV9saXN0KCkgKi8KCgoKCi8qCiAqIHVzbV9mcmVlX3VzZXIoKTogIGNhbGxzIGZyZWUoKSBvbiBhbGwgbmVlZGVkIHBhcnRzIG9mIHN0cnVjdCB1c21Vc2VyIGFuZAogKiB0aGUgdXNlciBoaW1zZWxmLgogKiAKICogTm90ZTogVGhpcyBzaG91bGQgKm5vdCogYmUgY2FsbGVkIG9uIGFuIG9iamVjdCBpbiBhIGxpc3QgKElFLAogKiByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCBmaXJzdCwgYW5kIHNldCBuZXh0IGFuZCBwcmV2IHRvIE5VTEwpLCBidXQKICogd2lsbCB0cnkgdG8gcmVjb25uZWN0IHRoZSBsaXN0IHBpZWNlcyBhZ2FpbiBpZiBpdCBpcyBjYWxsZWQgdGhpcwogKiB3YXkuICBJZiBjYWxsZWQgb24gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHRoZSBlbnRpcmUgbGlzdCB3aWxsIGJlCiAqIGxvc3QuIAogKi8Kc3RydWN0IHVzbVVzZXIgKgp1c21fZnJlZV91c2VyKHN0cnVjdCB1c21Vc2VyICp1c2VyKQp7CiAgICBpZiAodXNlciA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIFNOTVBfRlJFRSh1c2VyLT5lbmdpbmVJRCk7CiAgICBTTk1QX0ZSRUUodXNlci0+bmFtZSk7CiAgICBTTk1QX0ZSRUUodXNlci0+c2VjTmFtZSk7CiAgICBTTk1QX0ZSRUUodXNlci0+Y2xvbmVGcm9tKTsKICAgIFNOTVBfRlJFRSh1c2VyLT51c2VyUHVibGljU3RyaW5nKTsKICAgIFNOTVBfRlJFRSh1c2VyLT5hdXRoUHJvdG9jb2wpOwogICAgU05NUF9GUkVFKHVzZXItPnByaXZQcm90b2NvbCk7CgogICAgaWYgKHVzZXItPmF1dGhLZXkgIT0gTlVMTCkgewogICAgICAgIFNOTVBfWkVSTyh1c2VyLT5hdXRoS2V5LCB1c2VyLT5hdXRoS2V5TGVuKTsKICAgICAgICBTTk1QX0ZSRUUodXNlci0+YXV0aEtleSk7CiAgICB9CgogICAgaWYgKHVzZXItPnByaXZLZXkgIT0gTlVMTCkgewogICAgICAgIFNOTVBfWkVSTyh1c2VyLT5wcml2S2V5LCB1c2VyLT5wcml2S2V5TGVuKTsKICAgICAgICBTTk1QX0ZSRUUodXNlci0+cHJpdktleSk7CiAgICB9CgoKICAgIC8qCiAgICAgKiBGSVggIFdoeSBub3QgcHV0IHRoaXMgY2hlY2sgKmZpcnN0PyoKICAgICAqLwogICAgaWYgKHVzZXItPnByZXYgIT0gTlVMTCkgeyAgIC8qIGFjaywgdGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCiAgICAgICAgdXNlci0+cHJldi0+bmV4dCA9IHVzZXItPm5leHQ7CiAgICB9CiAgICBpZiAodXNlci0+bmV4dCAhPSBOVUxMKSB7CiAgICAgICAgdXNlci0+bmV4dC0+cHJldiA9IHVzZXItPnByZXY7CiAgICAgICAgaWYgKHVzZXItPnByZXYgIT0gTlVMTCkgLyogYWNrIHRoaXMgaXMgcmVhbGx5IGJhZCwgYmVjYXVzZSBpdCBtZWFucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICogd2UnbGwgbG9vc2UgdGhlIGhlYWQgb2Ygc29tZSBzdHJ1Y3R1cmUgdHJlZSAqLwogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlNldmVyZTogQXNrZWQgdG8gZnJlZSB0aGUgaGVhZCBvZiBhIHVzbVVzZXIgdHJlZSBzb21ld2hlcmUuIikpOwogICAgfQoKCiAgICBTTk1QX1pFUk8odXNlciwgc2l6ZW9mKCp1c2VyKSk7CiAgICBTTk1QX0ZSRUUodXNlcik7CgogICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIGZvciBjb252ZW5pZW5jZSB0byByZXR1cm5zIGZyb20gY2FsbGluZyBmdW5jdGlvbnMgKi8KCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9mcmVlX3VzZXIoKSAqLwoKCgoKLyoKICogdGFrZSBhIGdpdmVuIHVzZXIgYW5kIGNsb25lIHRoZSBzZWN1cml0eSBpbmZvIGludG8gYW5vdGhlciAKICovCnN0cnVjdCB1c21Vc2VyICoKdXNtX2Nsb25lRnJvbV91c2VyKHN0cnVjdCB1c21Vc2VyICpmcm9tLCBzdHJ1Y3QgdXNtVXNlciAqdG8pCnsKICAgIC8qCiAgICAgKiBjb3B5IHRoZSBhdXRoUHJvdG9jb2wgb2lkIHJvdyBwb2ludGVyIAogICAgICovCiAgICBTTk1QX0ZSRUUodG8tPmF1dGhQcm90b2NvbCk7CgogICAgaWYgKCh0by0+YXV0aFByb3RvY29sID0KICAgICAgICAgc25tcF9kdXBsaWNhdGVfb2JqaWQoZnJvbS0+YXV0aFByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tLT5hdXRoUHJvdG9jb2xMZW4pKSAhPSBOVUxMKQogICAgICAgIHRvLT5hdXRoUHJvdG9jb2xMZW4gPSBmcm9tLT5hdXRoUHJvdG9jb2xMZW47CiAgICBlbHNlCiAgICAgICAgdG8tPmF1dGhQcm90b2NvbExlbiA9IDA7CgoKICAgIC8qCiAgICAgKiBjb3B5IHRoZSBhdXRoS2V5IAogICAgICovCiAgICBTTk1QX0ZSRUUodG8tPmF1dGhLZXkpOwoKICAgIGlmIChmcm9tLT5hdXRoS2V5TGVuID4gMCAmJgogICAgICAgICh0by0+YXV0aEtleSA9ICh1X2NoYXIgKikgbWFsbG9jKGZyb20tPmF1dGhLZXlMZW4pKQogICAgICAgICE9IE5VTEwpIHsKICAgICAgICB0by0+YXV0aEtleUxlbiA9IGZyb20tPmF1dGhLZXlMZW47CiAgICAgICAgbWVtY3B5KHRvLT5hdXRoS2V5LCBmcm9tLT5hdXRoS2V5LCB0by0+YXV0aEtleUxlbik7CiAgICB9IGVsc2UgewogICAgICAgIHRvLT5hdXRoS2V5ID0gTlVMTDsKICAgICAgICB0by0+YXV0aEtleUxlbiA9IDA7CiAgICB9CgoKICAgIC8qCiAgICAgKiBjb3B5IHRoZSBwcml2UHJvdG9jb2wgb2lkIHJvdyBwb2ludGVyIAogICAgICovCiAgICBTTk1QX0ZSRUUodG8tPnByaXZQcm90b2NvbCk7CgogICAgaWYgKCh0by0+cHJpdlByb3RvY29sID0KICAgICAgICAgc25tcF9kdXBsaWNhdGVfb2JqaWQoZnJvbS0+cHJpdlByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tLT5wcml2UHJvdG9jb2xMZW4pKSAhPSBOVUxMKQogICAgICAgIHRvLT5wcml2UHJvdG9jb2xMZW4gPSBmcm9tLT5wcml2UHJvdG9jb2xMZW47CiAgICBlbHNlCiAgICAgICAgdG8tPnByaXZQcm90b2NvbExlbiA9IDA7CgogICAgLyoKICAgICAqIGNvcHkgdGhlIHByaXZLZXkgCiAgICAgKi8KICAgIFNOTVBfRlJFRSh0by0+cHJpdktleSk7CgogICAgaWYgKGZyb20tPnByaXZLZXlMZW4gPiAwICYmCiAgICAgICAgKHRvLT5wcml2S2V5ID0gKHVfY2hhciAqKSBtYWxsb2MoZnJvbS0+cHJpdktleUxlbikpCiAgICAgICAgIT0gTlVMTCkgewogICAgICAgIHRvLT5wcml2S2V5TGVuID0gZnJvbS0+cHJpdktleUxlbjsKICAgICAgICBtZW1jcHkodG8tPnByaXZLZXksIGZyb20tPnByaXZLZXksIHRvLT5wcml2S2V5TGVuKTsKICAgIH0gZWxzZSB7CiAgICAgICAgdG8tPnByaXZLZXkgPSBOVUxMOwogICAgICAgIHRvLT5wcml2S2V5TGVuID0gMDsKICAgIH0KICAgIHJldHVybiB0bzsKfQoKLyoKICogdXNtX2NyZWF0ZV91c2VyKHZvaWQpOgogKiBjcmVhdGUgYSBkZWZhdWx0IGVtcHR5IHVzZXIsIGluc3RhbnRpYXRpbmcgb25seSB0aGUgYXV0aC9wcml2CiAqIHByb3RvY29scyB0byBub0F1dGggYW5kIG5vUHJpdiBPSUQgcG9pbnRlcnMKICovCnN0cnVjdCB1c21Vc2VyICoKdXNtX2NyZWF0ZV91c2VyKHZvaWQpCnsKICAgIHN0cnVjdCB1c21Vc2VyICpuZXdVc2VyOwoKICAgIC8qCiAgICAgKiBjcmVhdGUgdGhlIG5ldyB1c2VyIAogICAgICovCiAgICBuZXdVc2VyID0gKHN0cnVjdCB1c21Vc2VyICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHVzbVVzZXIpKTsKICAgIGlmIChuZXdVc2VyID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyoKICAgICAqIGZpbGwgdGhlIGF1dGgvcHJpdiBwcm90b2NvbHMgCiAgICAgKi8KICAgIGlmICgobmV3VXNlci0+YXV0aFByb3RvY29sID0KICAgICAgICAgc25tcF9kdXBsaWNhdGVfb2JqaWQodXNtTm9BdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1c21Ob0F1dGhQcm90b2NvbCkgLyBzaXplb2Yob2lkKSkpID09CiAgICAgICAgTlVMTCkKICAgICAgICByZXR1cm4gdXNtX2ZyZWVfdXNlcihuZXdVc2VyKTsKICAgIG5ld1VzZXItPmF1dGhQcm90b2NvbExlbiA9IHNpemVvZih1c21Ob0F1dGhQcm90b2NvbCkgLyBzaXplb2Yob2lkKTsKCiAgICBpZiAoKG5ld1VzZXItPnByaXZQcm90b2NvbCA9CiAgICAgICAgIHNubXBfZHVwbGljYXRlX29iamlkKHVzbU5vUHJpdlByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodXNtTm9Qcml2UHJvdG9jb2wpIC8gc2l6ZW9mKG9pZCkpKSA9PQogICAgICAgIE5VTEwpCiAgICAgICAgcmV0dXJuIHVzbV9mcmVlX3VzZXIobmV3VXNlcik7CiAgICBuZXdVc2VyLT5wcml2UHJvdG9jb2xMZW4gPSBzaXplb2YodXNtTm9Qcml2UHJvdG9jb2wpIC8gc2l6ZW9mKG9pZCk7CgogICAgLyoKICAgICAqIHNldCB0aGUgc3RvcmFnZSB0eXBlIHRvIG5vbnZvbGF0aWxlLCBhbmQgdGhlIHN0YXR1cyB0byBBQ1RJVkUgCiAgICAgKi8KICAgIG5ld1VzZXItPnVzZXJTdG9yYWdlVHlwZSA9IFNUX05PTlZPTEFUSUxFOwogICAgbmV3VXNlci0+dXNlclN0YXR1cyA9IFJTX0FDVElWRTsKICAgIHJldHVybiBuZXdVc2VyOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2Nsb25lX3VzZXIoKSAqLwoKCgoKLyoKICogdXNtX2NyZWF0ZV9pbml0aWFsX3VzZXIodm9pZCk6CiAqIGNyZWF0ZXMgYW4gaW5pdGlhbCB1c2VyLCBmaWxsZWQgd2l0aCB0aGUgZGVmYXVsdHMgZGVmaW5lZCBpbiB0aGUKICogVVNNIGRvY3VtZW50LgogKi8Kc3RydWN0IHVzbVVzZXIgKgp1c21fY3JlYXRlX2luaXRpYWxfdXNlcihjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBhdXRoUHJvdG9jb2wsIHNpemVfdCBhdXRoUHJvdG9jb2xMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIHByaXZQcm90b2NvbCwgc2l6ZV90IHByaXZQcm90b2NvbExlbikKewogICAgc3RydWN0IHVzbVVzZXIgKm5ld1VzZXIgPSB1c21fY3JlYXRlX3VzZXIoKTsKICAgIGlmIChuZXdVc2VyID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKChuZXdVc2VyLT5uYW1lID0gc3RyZHVwKG5hbWUpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiB1c21fZnJlZV91c2VyKG5ld1VzZXIpOwoKICAgIGlmICgobmV3VXNlci0+c2VjTmFtZSA9IHN0cmR1cChuYW1lKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gdXNtX2ZyZWVfdXNlcihuZXdVc2VyKTsKCiAgICBpZiAoKG5ld1VzZXItPmVuZ2luZUlEID0KICAgICAgICAgc25tcHYzX2dlbmVyYXRlX2VuZ2luZUlEKCZuZXdVc2VyLT5lbmdpbmVJRExlbikpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIHVzbV9mcmVlX3VzZXIobmV3VXNlcik7CgogICAgaWYgKChuZXdVc2VyLT5jbG9uZUZyb20gPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqIDIpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiB1c21fZnJlZV91c2VyKG5ld1VzZXIpOwogICAgbmV3VXNlci0+Y2xvbmVGcm9tWzBdID0gMDsKICAgIG5ld1VzZXItPmNsb25lRnJvbVsxXSA9IDA7CiAgICBuZXdVc2VyLT5jbG9uZUZyb21MZW4gPSAyOwoKICAgIFNOTVBfRlJFRShuZXdVc2VyLT5wcml2UHJvdG9jb2wpOwogICAgaWYgKChuZXdVc2VyLT5wcml2UHJvdG9jb2wgPSBzbm1wX2R1cGxpY2F0ZV9vYmppZChwcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZQcm90b2NvbExlbikpID09CiAgICAgICAgTlVMTCkgewogICAgICAgIHJldHVybiB1c21fZnJlZV91c2VyKG5ld1VzZXIpOwogICAgfQogICAgbmV3VXNlci0+cHJpdlByb3RvY29sTGVuID0gcHJpdlByb3RvY29sTGVuOwoKICAgIFNOTVBfRlJFRShuZXdVc2VyLT5hdXRoUHJvdG9jb2wpOwogICAgaWYgKChuZXdVc2VyLT5hdXRoUHJvdG9jb2wgPSBzbm1wX2R1cGxpY2F0ZV9vYmppZChhdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhQcm90b2NvbExlbikpID09CiAgICAgICAgTlVMTCkgewogICAgICAgIHJldHVybiB1c21fZnJlZV91c2VyKG5ld1VzZXIpOwogICAgfQogICAgbmV3VXNlci0+YXV0aFByb3RvY29sTGVuID0gYXV0aFByb3RvY29sTGVuOwoKICAgIG5ld1VzZXItPnVzZXJTdGF0dXMgPSBSU19BQ1RJVkU7CiAgICBuZXdVc2VyLT51c2VyU3RvcmFnZVR5cGUgPSBTVF9SRUFET05MWTsKCiAgICByZXR1cm4gbmV3VXNlcjsKfQoKLyoKICogdGhpcyBpcyBhIGNhbGxiYWNrIHRoYXQgY2FuIHN0b3JlIGFsbCBrbm93biB1c2VycyBiYXNlZCBvbiBhCiAqIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBhcHBsaWNhdGlvbiBJRCAKICovCmludAp1c21fc3RvcmVfdXNlcnMoaW50IG1ham9ySUQsIGludCBtaW5vcklELCB2b2lkICpzZXJ2ZXJhcmcsIHZvaWQgKmNsaWVudGFyZykKewogICAgLyoKICAgICAqIGZpZ3VyZSBvdXQgb3VyIGFwcGxpY2F0aW9uIG5hbWUgCiAgICAgKi8KICAgIGNoYXIgICAgICAgICAgICphcHBuYW1lID0gKGNoYXIgKikgY2xpZW50YXJnOwogICAgaWYgKGFwcG5hbWUgPT0gTlVMTCkgewogICAgICAgIGFwcG5hbWUgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCQlORVRTTk1QX0RTX0xJQl9BUFBUWVBFKTsKICAgIH0KCiAgICAvKgogICAgICogc2F2ZSB0aGUgdXNlciBiYXNlIAogICAgICovCiAgICB1c21fc2F2ZV91c2VycygidXNtVXNlciIsIGFwcG5hbWUpOwoKICAgIC8qCiAgICAgKiBuZXZlciBmYWlscyAKICAgICAqLwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCi8qCiAqIHVzbV9zYXZlX3VzZXJzKCk6IHNhdmVzIGEgbGlzdCBvZiB1c2VycyB0byB0aGUgcGVyc2lzdGVudCBjYWNoZSAKICovCnZvaWQKdXNtX3NhdmVfdXNlcnMoY29uc3QgY2hhciAqdG9rZW4sIGNvbnN0IGNoYXIgKnR5cGUpCnsKICAgIHVzbV9zYXZlX3VzZXJzX2Zyb21fbGlzdCh1c2VyTGlzdCwgdG9rZW4sIHR5cGUpOwp9Cgp2b2lkCnVzbV9zYXZlX3VzZXJzX2Zyb21fbGlzdChzdHJ1Y3QgdXNtVXNlciAqcHVzZXJMaXN0LCBjb25zdCBjaGFyICp0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUpCnsKICAgIHN0cnVjdCB1c21Vc2VyICp1cHRyOwogICAgZm9yICh1cHRyID0gcHVzZXJMaXN0OyB1cHRyICE9IE5VTEw7IHVwdHIgPSB1cHRyLT5uZXh0KSB7CiAgICAgICAgaWYgKHVwdHItPnVzZXJTdG9yYWdlVHlwZSA9PSBTVF9OT05WT0xBVElMRSkKICAgICAgICAgICAgdXNtX3NhdmVfdXNlcih1cHRyLCB0b2tlbiwgdHlwZSk7CiAgICB9Cn0KCi8qCiAqIHVzbV9zYXZlX3VzZXIoKTogc2F2ZXMgYSB1c2VyIHRvIHRoZSBwZXJzaXN0ZW50IGNhY2hlIAogKi8Kdm9pZAp1c21fc2F2ZV91c2VyKHN0cnVjdCB1c21Vc2VyICp1c2VyLCBjb25zdCBjaGFyICp0b2tlbiwgY29uc3QgY2hhciAqdHlwZSkKewogICAgY2hhciAgICAgICAgICAgIGxpbmVbNDA5Nl07CiAgICBjaGFyICAgICAgICAgICAqY3B0cjsKCiAgICBtZW1zZXQobGluZSwgMCwgc2l6ZW9mKGxpbmUpKTsKCiAgICBzcHJpbnRmKGxpbmUsICIlcyAlZCAlZCAiLCB0b2tlbiwgdXNlci0+dXNlclN0YXR1cywKICAgICAgICAgICAgdXNlci0+dXNlclN0b3JhZ2VUeXBlKTsKICAgIGNwdHIgPSAmbGluZVtzdHJsZW4obGluZSldOyAvKiB0aGUgTlVMTCAqLwogICAgY3B0ciA9CiAgICAgICAgcmVhZF9jb25maWdfc2F2ZV9vY3RldF9zdHJpbmcoY3B0ciwgdXNlci0+ZW5naW5lSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+ZW5naW5lSURMZW4pOwogICAgKmNwdHIrKyA9ICcgJzsKICAgIGNwdHIgPSByZWFkX2NvbmZpZ19zYXZlX29jdGV0X3N0cmluZyhjcHRyLCAodV9jaGFyICopIHVzZXItPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZXItPm5hbWUgPT0gTlVMTCkgPyAwIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4odXNlci0+bmFtZSkpOwogICAgKmNwdHIrKyA9ICcgJzsKICAgIGNwdHIgPSByZWFkX2NvbmZpZ19zYXZlX29jdGV0X3N0cmluZyhjcHRyLCAodV9jaGFyICopIHVzZXItPnNlY05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZXItPnNlY05hbWUgPT0gTlVMTCkgPyAwIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4odXNlci0+c2VjTmFtZSkpOwogICAgKmNwdHIrKyA9ICcgJzsKICAgIGNwdHIgPQogICAgICAgIHJlYWRfY29uZmlnX3NhdmVfb2JqaWQoY3B0ciwgdXNlci0+Y2xvbmVGcm9tLCB1c2VyLT5jbG9uZUZyb21MZW4pOwogICAgKmNwdHIrKyA9ICcgJzsKICAgIGNwdHIgPSByZWFkX2NvbmZpZ19zYXZlX29iamlkKGNwdHIsIHVzZXItPmF1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPmF1dGhQcm90b2NvbExlbik7CiAgICAqY3B0cisrID0gJyAnOwogICAgY3B0ciA9CiAgICAgICAgcmVhZF9jb25maWdfc2F2ZV9vY3RldF9zdHJpbmcoY3B0ciwgdXNlci0+YXV0aEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5hdXRoS2V5TGVuKTsKICAgICpjcHRyKysgPSAnICc7CiAgICBjcHRyID0gcmVhZF9jb25maWdfc2F2ZV9vYmppZChjcHRyLCB1c2VyLT5wcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5wcml2UHJvdG9jb2xMZW4pOwogICAgKmNwdHIrKyA9ICcgJzsKICAgIGNwdHIgPQogICAgICAgIHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsIHVzZXItPnByaXZLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+cHJpdktleUxlbik7CiAgICAqY3B0cisrID0gJyAnOwogICAgY3B0ciA9IHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsIHVzZXItPnVzZXJQdWJsaWNTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+dXNlclB1YmxpY1N0cmluZ0xlbik7CgogICAgcmVhZF9jb25maWdfc3RvcmUodHlwZSwgbGluZSk7Cn0KCi8qCiAqIHVzbV9wYXJzZV91c2VyKCk6IHJlYWRzIGluIGEgbGluZSBjb250YWluaW5nIGEgc2F2ZWQgdXNlciBwcm9maWxlCiAqIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5IGNyZWF0ZWQgc3RydWN0IHVzbVVzZXIuIAogKi8Kc3RydWN0IHVzbVVzZXIgKgp1c21fcmVhZF91c2VyKGNvbnN0IGNoYXIgKmxpbmUpCnsKICAgIHN0cnVjdCB1c21Vc2VyICp1c2VyOwogICAgc2l6ZV90ICAgICAgICAgIGxlbjsKICAgIHNpemVfdCBleHBlY3RlZF9wcml2S2V5TGVuID0gMDsKCiAgICB1c2VyID0gdXNtX2NyZWF0ZV91c2VyKCk7CiAgICBpZiAodXNlciA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIHVzZXItPnVzZXJTdGF0dXMgPSBhdG9pKGxpbmUpOwogICAgbGluZSA9IHNraXBfdG9rZW5fY29uc3QobGluZSk7CiAgICB1c2VyLT51c2VyU3RvcmFnZVR5cGUgPSBhdG9pKGxpbmUpOwogICAgbGluZSA9IHNraXBfdG9rZW5fY29uc3QobGluZSk7CiAgICBsaW5lID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmdfY29uc3QobGluZSwgJnVzZXItPmVuZ2luZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5lbmdpbmVJRExlbik7CgogICAgLyoKICAgICAqIHNldCB0aGUgbGNkIGVudHJ5IGZvciB0aGlzIGVuZ2luZUlEIHRvIHRoZSBtaW5pbXVtIGJvb3RzL3RpbWUKICAgICAqIHZhbHVlcyBzbyB0aGF0IGl0cyBhIGtub3duIGVuZ2luZWlkIGFuZCB3b24ndCByZXR1cm4gYSByZXBvcnQgcGR1LgogICAgICogVGhpcyBpcyBtb3N0bHkgaW1wb3J0YW50IHdoZW4gcmVjZWl2aW5nIHYzIHRyYXBzIHNvIHRoYXQgdGhlIHVzbQogICAgICogd2lsbCBhdCBsZWFzdCBjb250aW51ZSBwcm9jZXNzaW5nIHRoZW0uIAogICAgICovCiAgICBzZXRfZW5naW5ldGltZSh1c2VyLT5lbmdpbmVJRCwgdXNlci0+ZW5naW5lSURMZW4sIDEsIDAsIDApOwoKICAgIGxpbmUgPSByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhsaW5lLCAodV9jaGFyICoqKSAmIHVzZXItPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbik7CiAgICBsaW5lID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcobGluZSwgKHVfY2hhciAqKikgJiB1c2VyLT5zZWNOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pOwogICAgU05NUF9GUkVFKHVzZXItPmNsb25lRnJvbSk7CiAgICB1c2VyLT5jbG9uZUZyb21MZW4gPSAwOwoKICAgIGxpbmUgPSByZWFkX2NvbmZpZ19yZWFkX29iamlkX2NvbnN0KGxpbmUsICZ1c2VyLT5jbG9uZUZyb20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+Y2xvbmVGcm9tTGVuKTsKCiAgICBTTk1QX0ZSRUUodXNlci0+YXV0aFByb3RvY29sKTsKICAgIHVzZXItPmF1dGhQcm90b2NvbExlbiA9IDA7CgogICAgbGluZSA9IHJlYWRfY29uZmlnX3JlYWRfb2JqaWRfY29uc3QobGluZSwgJnVzZXItPmF1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5hdXRoUHJvdG9jb2xMZW4pOwogICAgbGluZSA9IHJlYWRfY29uZmlnX3JlYWRfb2N0ZXRfc3RyaW5nX2NvbnN0KGxpbmUsICZ1c2VyLT5hdXRoS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5hdXRoS2V5TGVuKTsKICAgIFNOTVBfRlJFRSh1c2VyLT5wcml2UHJvdG9jb2wpOwogICAgdXNlci0+cHJpdlByb3RvY29sTGVuID0gMDsKCiAgICBsaW5lID0gcmVhZF9jb25maWdfcmVhZF9vYmppZF9jb25zdChsaW5lLCAmdXNlci0+cHJpdlByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPnByaXZQcm90b2NvbExlbik7CiAgICBsaW5lID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcobGluZSwgJnVzZXItPnByaXZLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPnByaXZLZXlMZW4pOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKICAgIGlmIChJU1RSQU5TRk9STSh1c2VyLT5wcml2UHJvdG9jb2wsIERFU1ByaXYpKSB7CiAgICAgICAgLyogREVTIHVzZXMgYSAxMjggYml0IGtleSwgNjQgYml0cyBvZiB3aGljaCBpcyBhIHNhbHQgKi8KICAgICAgICBleHBlY3RlZF9wcml2S2V5TGVuID0gMTY7CiAgICB9CiNlbmRpZgojaWZkZWYgSEFWRV9BRVMKICAgIGlmIChJU1RSQU5TRk9STSh1c2VyLT5wcml2UHJvdG9jb2wsIEFFU1ByaXYpKSB7CiAgICAgICAgZXhwZWN0ZWRfcHJpdktleUxlbiA9IDE2OwogICAgfQojZW5kaWYKICAgIC8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwogICAgaWYgKHVzZXItPnByaXZLZXlMZW4gPiBleHBlY3RlZF9wcml2S2V5TGVuKSB7CgkgIHVzZXItPnByaXZLZXlMZW4gPSBleHBlY3RlZF9wcml2S2V5TGVuOwogICAgfQoKICAgIGxpbmUgPSByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhsaW5lLCAmdXNlci0+dXNlclB1YmxpY1N0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+dXNlclB1YmxpY1N0cmluZ0xlbik7CiAgICByZXR1cm4gdXNlcjsKfQoKLyoKICogc25tcGQuY29uZiBwYXJzaW5nIHJvdXRpbmVzIAogKi8Kdm9pZAp1c21fcGFyc2VfY29uZmlnX3VzbVVzZXIoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIHN0cnVjdCB1c21Vc2VyICp1cHRyOwoKICAgIHVwdHIgPSB1c21fcmVhZF91c2VyKGxpbmUpOwogICAgaWYgKCB1cHRyKQogICAgICAgIHVzbV9hZGRfdXNlcih1cHRyKTsKfQoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogdXNtX3NldF9wYXNzd29yZAogKgogKiBQYXJhbWV0ZXJzOgogKgkqdG9rZW4KICoJKmxpbmUKICogICAgICAKICoKICogZm9ybWF0OiB1c2VyU2V0QXV0aFBhc3MgICAgIHNlY25hbWUgZW5naW5lSURMZW4gZW5naW5lSUQgcGFzcwogKiAgICAgb3I6IHVzZXJTZXRQcml2UGFzcyAgICAgc2VjbmFtZSBlbmdpbmVJRExlbiBlbmdpbmVJRCBwYXNzIAogKiAgICAgb3I6IHVzZXJTZXRBdXRoS2V5ICAgICAgc2VjbmFtZSBlbmdpbmVJRExlbiBlbmdpbmVJRCBLdUxlbiBLdQogKiAgICAgb3I6IHVzZXJTZXRQcml2S2V5ICAgICAgc2VjbmFtZSBlbmdpbmVJRExlbiBlbmdpbmVJRCBLdUxlbiBLdSAKICogICAgIG9yOiB1c2VyU2V0QXV0aExvY2FsS2V5IHNlY25hbWUgZW5naW5lSURMZW4gZW5naW5lSUQgS3VsTGVuIEt1bAogKiAgICAgb3I6IHVzZXJTZXRQcml2TG9jYWxLZXkgc2VjbmFtZSBlbmdpbmVJRExlbiBlbmdpbmVJRCBLdWxMZW4gS3VsIAogKgogKiB0eXBlIGlzOgkxPXBhc3NwaHJhc2U7IDI9S3U7IDM9S3VsLgogKgogKgogKiBBU1NVTUVTICBQYXNzd29yZHMgYXJlIG51bGwtdGVybWluYXRlZCBwcmludGFibGUgc3RyaW5ncy4KICovCnZvaWQKdXNtX3NldF9wYXNzd29yZChjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgY2hhciAgICAgICAgICAgIG5hbWVCdWZbU05NUF9NQVhCVUZdOwogICAgdV9jaGFyICAgICAgICAgKmVuZ2luZUlEID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBlbmdpbmVJRExlbiA9IDA7CiAgICBzdHJ1Y3QgdXNtVXNlciAqdXNlcjsKCiAgICBjcCA9IGNvcHlfbndvcmQobGluZSwgbmFtZUJ1Ziwgc2l6ZW9mKG5hbWVCdWYpKTsKICAgIGlmIChjcCA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBuYW1lIHNwZWNpZmllciIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBERUJVR01TR1RMKCgidXNtIiwgImNvbXBhcmluZzogJXMgYW5kICVzXG4iLCBjcCwgV0lMRENBUkRTVFJJTkcpKTsKICAgIGlmIChzdHJuY21wKGNwLCBXSUxEQ0FSRFNUUklORywgc3RybGVuKFdJTERDQVJEU1RSSU5HKSkgPT0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogbWF0Y2ggYWdhaW5zdCBhbGwgZW5naW5lSURzIHdlIGtub3cgYWJvdXQgCiAgICAgICAgICovCiAgICAgICAgY3AgPSBza2lwX3Rva2VuKGNwKTsKICAgICAgICBmb3IgKHVzZXIgPSB1c2VyTGlzdDsgdXNlciAhPSBOVUxMOyB1c2VyID0gdXNlci0+bmV4dCkgewogICAgICAgICAgICBpZiAodXNlci0+c2VjTmFtZSAmJiBzdHJjbXAodXNlci0+c2VjTmFtZSwgbmFtZUJ1ZikgPT0gMCkgewogICAgICAgICAgICAgICAgdXNtX3NldF91c2VyX3Bhc3N3b3JkKHVzZXIsIHRva2VuLCBjcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNwID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcoY3AsICZlbmdpbmVJRCwgJmVuZ2luZUlETGVuKTsKICAgICAgICBpZiAoY3AgPT0gTlVMTCkgewogICAgICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIGVuZ2luZUlEIHNwZWNpZmllciIpOwogICAgICAgICAgICBTTk1QX0ZSRUUoZW5naW5lSUQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB1c2VyID0gdXNtX2dldF91c2VyKGVuZ2luZUlELCBlbmdpbmVJRExlbiwgbmFtZUJ1Zik7CiAgICAgICAgaWYgKHVzZXIgPT0gTlVMTCkgewogICAgICAgICAgICBjb25maWdfcGVycm9yKCJub3QgYSB2YWxpZCB1c2VyL2VuZ2luZUlEIHBhaXIiKTsKICAgICAgICAgICAgU05NUF9GUkVFKGVuZ2luZUlEKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB1c21fc2V0X3VzZXJfcGFzc3dvcmQodXNlciwgdG9rZW4sIGNwKTsKICAgICAgICBTTk1QX0ZSRUUoZW5naW5lSUQpOwogICAgfQp9CgovKgogKiB1c2VzIHRoZSByZXN0IG9mIExJTkUgdG8gY29uZmlndXJlIFVTRVIncyBwYXNzd29yZCBvZiB0eXBlIFRPS0VOIAogKi8Kdm9pZAp1c21fc2V0X3VzZXJfcGFzc3dvcmQoc3RydWN0IHVzbVVzZXIgKnVzZXIsIGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBjaGFyICAgICAgICAgICAqY3AgPSBsaW5lOwogICAgdV9jaGFyICAgICAgICAgKmVuZ2luZUlEID0gdXNlci0+ZW5naW5lSUQ7CiAgICBzaXplX3QgICAgICAgICAgZW5naW5lSURMZW4gPSB1c2VyLT5lbmdpbmVJRExlbjsKCiAgICB1X2NoYXIgICAgICAgICoqa2V5OwogICAgc2l6ZV90ICAgICAgICAgKmtleUxlbjsKICAgIHVfY2hhciAgICAgICAgICB1c2VyS2V5W1NOTVBfTUFYQlVGX1NNQUxMXTsKICAgIHNpemVfdCAgICAgICAgICB1c2VyS2V5TGVuID0gU05NUF9NQVhCVUZfU01BTEw7CiAgICB1X2NoYXIgICAgICAgICAqdXNlcktleVAgPSB1c2VyS2V5OwogICAgaW50ICAgICAgICAgICAgIHR5cGUsIHJldDsKCiAgICAvKgogICAgICogUmV0cmlldmUgdGhlICJvbGQiIGtleSBhbmQgc2V0IHRoZSBrZXkgdHlwZS4KICAgICAqLwogICAgaWYgKCF0b2tlbikgewogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoc3RyY21wKHRva2VuLCAidXNlclNldEF1dGhQYXNzIikgPT0gMCkgewogICAgICAgIGtleSA9ICZ1c2VyLT5hdXRoS2V5OwogICAgICAgIGtleUxlbiA9ICZ1c2VyLT5hdXRoS2V5TGVuOwogICAgICAgIHR5cGUgPSAwOwogICAgfSBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJ1c2VyU2V0UHJpdlBhc3MiKSA9PSAwKSB7CiAgICAgICAga2V5ID0gJnVzZXItPnByaXZLZXk7CiAgICAgICAga2V5TGVuID0gJnVzZXItPnByaXZLZXlMZW47CiAgICAgICAgdHlwZSA9IDA7CiAgICB9IGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgInVzZXJTZXRBdXRoS2V5IikgPT0gMCkgewogICAgICAgIGtleSA9ICZ1c2VyLT5hdXRoS2V5OwogICAgICAgIGtleUxlbiA9ICZ1c2VyLT5hdXRoS2V5TGVuOwogICAgICAgIHR5cGUgPSAxOwogICAgfSBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJ1c2VyU2V0UHJpdktleSIpID09IDApIHsKICAgICAgICBrZXkgPSAmdXNlci0+cHJpdktleTsKICAgICAgICBrZXlMZW4gPSAmdXNlci0+cHJpdktleUxlbjsKICAgICAgICB0eXBlID0gMTsKICAgIH0gZWxzZSBpZiAoc3RyY21wKHRva2VuLCAidXNlclNldEF1dGhMb2NhbEtleSIpID09IDApIHsKICAgICAgICBrZXkgPSAmdXNlci0+YXV0aEtleTsKICAgICAgICBrZXlMZW4gPSAmdXNlci0+YXV0aEtleUxlbjsKICAgICAgICB0eXBlID0gMjsKICAgIH0gZWxzZSBpZiAoc3RyY21wKHRva2VuLCAidXNlclNldFByaXZMb2NhbEtleSIpID09IDApIHsKICAgICAgICBrZXkgPSAmdXNlci0+cHJpdktleTsKICAgICAgICBrZXlMZW4gPSAmdXNlci0+cHJpdktleUxlbjsKICAgICAgICB0eXBlID0gMjsKICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBubyBvbGQga2V5LCBvciB0b2tlbiB3YXMgbm90IHJlY29nbml6ZWQgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICgqa2V5KSB7CiAgICAgICAgLyoKICAgICAgICAgKiAoZGVzdHJveSBhbmQpIGZyZWUgdGhlIG9sZCBrZXkgCiAgICAgICAgICovCiAgICAgICAgbWVtc2V0KCprZXksIDAsICprZXlMZW4pOwogICAgICAgIFNOTVBfRlJFRSgqa2V5KTsKICAgIH0KCiAgICBpZiAodHlwZSA9PSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBjb252ZXJ0IHRoZSBwYXNzd29yZCBpbnRvIGEga2V5IAogICAgICAgICAqLwogICAgICAgIGlmIChjcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIGNvbmZpZ19wZXJyb3IoIm1pc3NpbmcgdXNlciBwYXNzd29yZCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHJldCA9IGdlbmVyYXRlX0t1KHVzZXItPmF1dGhQcm90b2NvbCwgdXNlci0+YXV0aFByb3RvY29sTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgY3AsIHN0cmxlbihjcCksIHVzZXJLZXksICZ1c2VyS2V5TGVuKTsKCiAgICAgICAgaWYgKHJldCAhPSBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICAgICAgY29uZmlnX3BlcnJvcigic2V0dGluZyBrZXkgZmFpbGVkIChpbiBzY19nZW5LdSgpKSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlID09IDEpIHsKICAgICAgICBjcCA9IHJlYWRfY29uZmlnX3JlYWRfb2N0ZXRfc3RyaW5nKGNwLCAmdXNlcktleVAsICZ1c2VyS2V5TGVuKTsKCiAgICAgICAgaWYgKGNwID09IE5VTEwpIHsKICAgICAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCB1c2VyIGtleSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICh0eXBlIDwgMikgewogICAgICAgICprZXkgPSAodV9jaGFyICopIG1hbGxvYyhTTk1QX01BWEJVRl9TTUFMTCk7CiAgICAgICAgKmtleUxlbiA9IFNOTVBfTUFYQlVGX1NNQUxMOwogICAgICAgIHJldCA9IGdlbmVyYXRlX2t1bCh1c2VyLT5hdXRoUHJvdG9jb2wsIHVzZXItPmF1dGhQcm90b2NvbExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lSUQsIGVuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyS2V5LCB1c2VyS2V5TGVuLCAqa2V5LCBrZXlMZW4pOwogICAgICAgIGlmIChyZXQgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIGNvbmZpZ19wZXJyb3IoInNldHRpbmcga2V5IGZhaWxlZCAoaW4gZ2VuZXJhdGVfa3VsKCkpIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogKGRlc3Ryb3kgYW5kKSBmcmVlIHRoZSBvbGQga2V5IAogICAgICAgICAqLwogICAgICAgIG1lbXNldCh1c2VyS2V5LCAwLCBzaXplb2YodXNlcktleSkpOwoKICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiB0aGUga2V5IGlzIGdpdmVuLCBjb3B5IGl0IGluIAogICAgICAgICAqLwogICAgICAgIGNwID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcoY3AsIGtleSwga2V5TGVuKTsKCiAgICAgICAgaWYgKGNwID09IE5VTEwpIHsKICAgICAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBsb2NhbGl6ZWQgdXNlciBrZXkiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX3NldF9wYXNzd29yZCgpICovCg==